@lmctl-ai/lmctl 0.1.156 → 0.1.157

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli/index.js CHANGED
@@ -1,8 +1,8 @@
1
- var pk=Object.defineProperty;var T=(e,t)=>()=>(e&&(t=e(e=0)),t);var we=(e,t)=>{for(var r in t)pk(e,r,{get:t[r],enumerable:!0})};import{existsSync as Hs,readdirSync as $H,readFileSync as _k}from"node:fs";import{homedir as hk,platform as Ff}from"node:os";import{join as Ct}from"node:path";function Tr(){let e=process.env.LMCTL_HOME;return e!==void 0&&e.length>0?e:Ct(hk(),gk)}function Js(){return Ct(Tr(),Uf)}function Xr(){return Ct(Tr(),yk)}function Mt(e){return Ct(Xr(),e)}function Er(e){return Ct(Mt(e),Uf)}function Ja(e){return Ct(Mt(e),"projects")}function Xs(){return Ct(Tr(),wk)}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=_k(e,"utf8").trim();return t.length===0||!ze(t)?null:t}catch{return null}}function jt(){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=jt();if(t!==null)return Er(t);let r=Js();return Hs(r)||!Hs(Xr())?r:Er(Wf)}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 bk(e,t=Ff()){return t!=="linux"?!1:e.startsWith("/mnt/c/")||e==="/mnt/c"}function Bf(e,t=process.stderr,r=Ff()){bk(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 pk=Object.defineProperty;var T=(e,t)=>()=>(e&&(t=e(e=0)),t);var we=(e,t)=>{for(var r in t)pk(e,r,{get:t[r],enumerable:!0})};import{existsSync as Hs,readdirSync as OH,readFileSync as _k}from"node:fs";import{homedir as hk,platform as Ff}from"node:os";import{join as Ct}from"node:path";function Tr(){let e=process.env.LMCTL_HOME;return e!==void 0&&e.length>0?e:Ct(hk(),gk)}function Js(){return Ct(Tr(),Uf)}function Xr(){return Ct(Tr(),yk)}function Mt(e){return Ct(Xr(),e)}function Er(e){return Ct(Mt(e),Uf)}function Ja(e){return Ct(Mt(e),"projects")}function Xs(){return Ct(Tr(),wk)}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=_k(e,"utf8").trim();return t.length===0||!ze(t)?null:t}catch{return null}}function jt(){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=jt();if(t!==null)return Er(t);let r=Js();return Hs(r)||!Hs(Xr())?r:Er(Wf)}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 bk(e,t=Ff()){return t!=="linux"?!1:e.startsWith("/mnt/c/")||e==="/mnt/c"}function Bf(e,t=process.stderr,r=Ff()){bk(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 Xa(){return Ct(Tr(),Ek)}function qf(){return Ct(Tr(),Tk)}function Sk(){try{return Hs(Xa())}catch{return!1}}function Hf(e=process.stderr){Sk()&&e.write(`note: legacy ~/.lmctl/profiles/ detected \u2014 run 'lmctl workspace migrate' to move it to ~/.lmctl/workspaces/
3
3
  `)}var gk,Uf,yk,wk,Wf,Ek,Tk,br,Je=T(()=>{"use strict";gk=".lmctl",Uf="state.db",yk="workspaces",wk="active-workspace",Wf="default",Ek="profiles",Tk="active-profile";br={default:Wf}});function Nk(e){for(let t of Ik)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 xk(e){let t=e.toLowerCase();return!!(t==="::1"||t==="::"||t.startsWith("fe80:")||t.startsWith("fe80::"))}function Lk(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 jn(e){let t=e;for(let{re:r,replacement:n}of kk)t=t.replace(r,n);return t=t.replace(Ak,r=>!Lk(r)||Nk(r)?r:Jf),t=t.replace(Rk,r=>xk(r)?r:Jf),t}function Dn(e){return e.split(`
4
4
  `).map(t=>jn(t)).join(`
5
- `)}function Gf(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:nt}:{key:e,value:jn(t)}}function zt(e){if(typeof e=="string")return jn(e);if(Array.isArray(e))return e.map(t=>zt(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"?nt:zt(n):t[r]=zt(n)}return t}return e}function Vf(e,t){for(let{name:r,re:n}of $k){let s=t.match(n);if(s!==null&&!s[0].includes(nt))throw new Sr(e,r)}}var nt,vk,Jf,Xf,kk,Ik,Ak,Rk,$k,Sr,Ks=T(()=>{"use strict";nt="[REDACTED]",vk="[REDACTED_EMAIL]",Jf="[REDACTED_IP]",Xf="[USER]",kk=[{re:/(authorization\s*[:=]\s*)(bearer\s+[^\s,;"']+)/gi,replacement:`$1Bearer ${nt}`},{re:/(authorization\s*[:=]\s*)(basic\s+[^\s,;"']+)/gi,replacement:`$1Basic ${nt}`},{re:/\b(Bearer\s+)[A-Za-z0-9_\-./+=]{8,}/g,replacement:`$1${nt}`},{re:/\bsk-ant-[A-Za-z0-9_\-]{8,}/g,replacement:nt},{re:/\bsk-[A-Za-z0-9_\-]{16,}/g,replacement:nt},{re:/\bgh[pousr]_[A-Za-z0-9]{30,}/g,replacement:nt},{re:/\bAKIA[0-9A-Z]{16}\b/g,replacement:nt},{re:/\b(api[_-]?key|token|secret|password|passwd)(\s*[:=]\s*"?)([A-Za-z0-9_\-./+=]{8,})("?)/gi,replacement:`$1$2${nt}$4`},{re:/(\/home\/)[^/\s"'`]+/g,replacement:`$1${Xf}`},{re:/(\/Users\/)[^/\s"'`]+/g,replacement:`$1${Xf}`},{re:/\b[A-Za-z0-9._%+\-]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,}\b/g,replacement:vk}],Ik=["127.","10.","192.168.","0.0.0.0"];Ak=/\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/g,Rk=/\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;$k=[{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"'`]+/}],Sr=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 Ga}from"node:child_process";import{readFileSync as Ok}from"node:fs";import{readFile as Ka,stat as Kf}from"node:fs/promises";import{homedir as Ck}from"node:os";import{join as Mk}from"node:path";import{fileURLToPath as jk}from"node:url";function yt(){try{let e=new URL("../../package.json",import.meta.url),t=JSON.parse(Ok(jk(e),"utf8"));if(typeof t.version=="string")return t.version}catch{}return"0.0.0"}async function Yf(e){let t=new Set(e.include??Ys),r={};return t.has("serve")&&(r.serve=await Pk(e)),t.has("db")&&(r.db=Fk(e)),t.has("runs")&&(r.runs=Uk(e)),t.has("jobs")&&(r.jobs=Wk(e)),t.has("attentions")&&(r.attentions=Bk(e)),t.has("env")&&(r.env=await qk(e)),t.has("intents")&&(r.intents=await Jk(e)),r}async function Pk(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 Ka(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 Ka(r,"utf8")).split(`
5
+ `)}function Gf(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:nt}:{key:e,value:jn(t)}}function zt(e){if(typeof e=="string")return jn(e);if(Array.isArray(e))return e.map(t=>zt(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"?nt:zt(n):t[r]=zt(n)}return t}return e}function Vf(e,t){for(let{name:r,re:n}of Ok){let s=t.match(n);if(s!==null&&!s[0].includes(nt))throw new Sr(e,r)}}var nt,vk,Jf,Xf,kk,Ik,Ak,Rk,Ok,Sr,Ks=T(()=>{"use strict";nt="[REDACTED]",vk="[REDACTED_EMAIL]",Jf="[REDACTED_IP]",Xf="[USER]",kk=[{re:/(authorization\s*[:=]\s*)(bearer\s+[^\s,;"']+)/gi,replacement:`$1Bearer ${nt}`},{re:/(authorization\s*[:=]\s*)(basic\s+[^\s,;"']+)/gi,replacement:`$1Basic ${nt}`},{re:/\b(Bearer\s+)[A-Za-z0-9_\-./+=]{8,}/g,replacement:`$1${nt}`},{re:/\bsk-ant-[A-Za-z0-9_\-]{8,}/g,replacement:nt},{re:/\bsk-[A-Za-z0-9_\-]{16,}/g,replacement:nt},{re:/\bgh[pousr]_[A-Za-z0-9]{30,}/g,replacement:nt},{re:/\bAKIA[0-9A-Z]{16}\b/g,replacement:nt},{re:/\b(api[_-]?key|token|secret|password|passwd)(\s*[:=]\s*"?)([A-Za-z0-9_\-./+=]{8,})("?)/gi,replacement:`$1$2${nt}$4`},{re:/(\/home\/)[^/\s"'`]+/g,replacement:`$1${Xf}`},{re:/(\/Users\/)[^/\s"'`]+/g,replacement:`$1${Xf}`},{re:/\b[A-Za-z0-9._%+\-]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,}\b/g,replacement:vk}],Ik=["127.","10.","192.168.","0.0.0.0"];Ak=/\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/g,Rk=/\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;Ok=[{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"'`]+/}],Sr=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 Ga}from"node:child_process";import{readFileSync as $k}from"node:fs";import{readFile as Ka,stat as Kf}from"node:fs/promises";import{homedir as Ck}from"node:os";import{join as Mk}from"node:path";import{fileURLToPath as jk}from"node:url";function yt(){try{let e=new URL("../../package.json",import.meta.url),t=JSON.parse($k(jk(e),"utf8"));if(typeof t.version=="string")return t.version}catch{}return"0.0.0"}async function Yf(e){let t=new Set(e.include??Ys),r={};return t.has("serve")&&(r.serve=await Pk(e)),t.has("db")&&(r.db=Fk(e)),t.has("runs")&&(r.runs=Uk(e)),t.has("jobs")&&(r.jobs=Wk(e)),t.has("attentions")&&(r.attentions=Bk(e)),t.has("env")&&(r.env=await qk(e)),t.has("intents")&&(r.intents=await Jk(e)),r}async function Pk(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 Ka(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 Ka(r,"utf8")).split(`
6
6
  `),f=u.slice(Math.max(0,u.length-n));c=f.length,a=Dn(f.join(`
7
7
  `))}catch(d){l=`serve log unreadable: ${d instanceof Error?d.message:String(d)}`}return{pid:s,pid_source:i,pid_alive:o,log_tail_lines:c,log_tail:a,log_note:l}}function Fk(e){let{dal:t}=e,r="unknown";try{r=t.query("PRAGMA integrity_check;").map(o=>o.integrity_check??JSON.stringify(o)).join(`
8
8
  `)}catch(i){r=`integrity_check failed: ${i instanceof Error?i.message:String(i)}`}let n=0;try{n=t.query("PRAGMA user_version;")[0]?.user_version??0}catch{n=0}let s={};try{let i=t.query("SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' ORDER BY name");for(let{name:o}of i)try{let a=t.query(`SELECT COUNT(*) AS c FROM "${o.replace(/"/g,'""')}"`);s[o]=a[0]?.c??0}catch{s[o]=-1}}catch{}return{integrity_check:r,schema_version:n,table_counts:s}}function Uk(e){let{dal:t}=e,r=(e.now??new Date).toISOString(),n=(e.staleThresholdMin??60)*6e4,s=new Date(Date.parse(r)-n).toISOString(),i=t.query(`SELECT ${Va} FROM run ORDER BY id DESC LIMIT 50`),o=t.query(`SELECT ${Va} FROM run WHERE paused_at IS NOT NULL AND terminal_state IS NULL ORDER BY paused_at DESC LIMIT 50`),a=t.query(`SELECT ${Va} FROM run
@@ -13,8 +13,8 @@ var pk=Object.defineProperty;var T=(e,t)=>()=>(e&&(t=e(e=0)),t);var we=(e,t)=>{f
13
13
  `)),c=[];for(let d of Dk){let u=process.env[d];if(u===void 0){c.push({key:d,value:"(unset)"});continue}c.push(Gf(d,u))}return{lmctl_next_version:t,node_version:r,os_info:s,disk_usage:l,env_keys_present:c}}function Hk(){return process.env.LMCTL_INTENT_LOG??Mk(Ck(),".lmctl","recent-intents.log")}async function Jk(e){let t=e.intentLog??Hk(),r=e.intentLogTailLines??500;try{let s=(await Ka(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:Dn(i.join(`
15
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,Dk,Va,Pn=T(()=>{"use strict";Ks();Ys=["serve","db","runs","jobs","attentions","env","intents"];Dk=["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"];Va=["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 Qf,appendFileSync as Xk,mkdirSync as Gk,existsSync as XH,readdirSync as GH,unlinkSync as VH}from"node:fs";import{join as Zs,dirname as Vk}from"node:path";import{homedir as Kk}from"node:os";function Ya(){return Zs(Kk(),".lmctl")}function em(){Gr=!0,process.env.LMCTL_DEBUG="1"}function tm(){return{cliDebug:Gr,lmctlDebugEnv:process.env.LMCTL_DEBUG}}function rm(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-Zf>=Yk&&(zf=Qk(),Zf=e),zf}function nm(){return Gr||process.env.LMCTL_DEBUG==="1"}function zk(){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 Ae(e,t){if(t?.verbose){if(!Gr)return}else if(!t?.always&&!ce())return;try{Zk();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};Xk(zs,JSON.stringify(r)+`
16
- `)}catch{}}function Zk(){if(!zs){let t=zk().slice(0,13).replace("T","-");zs=Zs(Ya(),`debug-${t}.log`)}Gk(Vk(zs),{recursive:!0})}function $e(...e){Ae({event:"legacy",msg:e.join(" ")})}function wt(...e){Ae({event:"legacy",msg:e.join(" ")},{verbose:!0})}function H(e){Ae(e,{always:!0})}function Qk(){return eI()||tI()}function eI(){try{let e=Qf(Zs(Ya(),"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 tI(){try{let e=Qf(Zs(Ya(),"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,Zf,Yk,zs,he=T(()=>{"use strict";Gr=!1,zf=!1,Zf=0,Yk=5e3;zs=null});import{existsSync as EI}from"node:fs";import{createRequire as TI}from"node:module";function bI(){return Za===null&&(Za=TI(import.meta.url)("node:sqlite").DatabaseSync),Za}function Qa(e){return e.length===1&&SI(e[0])?[e[0]]:e}function SI(e){if(!rl(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function rl(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var Za,el,lm,tl,cm=T(()=>{"use strict";Za=null;el=class{name;handle;transactionDepth=0;savepointId=0;constructor(t,r={}){if(r.fileMustExist===!0&&t!==":memory:"&&!EI(t))throw new Error("unable to open database file");this.name=t,this.handle=new(bI())(t,{readOnly:r.readonly===!0}),this.exec("PRAGMA busy_timeout = 5000")}prepare(t){return new tl(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)}}},lm=el,tl=class{handle;rawMode=!1;constructor(t){this.handle=t,this.handle.setAllowBareNamedParameters(!0)}get(...t){let r=this.handle.get(...Qa(t));return this.normalizeRow(r)}all(...t){return this.handle.all(...Qa(t)).map(r=>this.normalizeRow(r))}run(...t){let r=this.handle.run(...Qa(t));return{changes:Number(r.changes),lastInsertRowid:Number(r.lastInsertRowid)}}raw(){return this.rawMode=!0,this}normalizeRow(t){return t==null?t:this.rawMode&&rl(t)?Object.values(t):rl(t)?{...t}:t}}});import{existsSync as vI,mkdirSync as kI,readFileSync as um}from"node:fs";import{homedir as II}from"node:os";import{dirname as fm,join as NI,resolve as mm}from"node:path";import{fileURLToPath as xI,pathToFileURL as AI}from"node:url";function nl(e){e.dbPath!==":memory:"&&kI(fm(e.dbPath),{recursive:!0});let t=new lm(e.dbPath);t.pragma("journal_mode = WAL"),t.pragma("synchronous = NORMAL"),t.pragma("foreign_keys = ON");let r=hm(t);return r===0&&(t.exec(um(_m,"utf8")),t.pragma(`user_version = ${LI}`)),$I(t,r),t}function $I(e,t){let r=t;if(r<2&&r!==0&&(e.exec(`
16
+ `)}catch{}}function Zk(){if(!zs){let t=zk().slice(0,13).replace("T","-");zs=Zs(Ya(),`debug-${t}.log`)}Gk(Vk(zs),{recursive:!0})}function Oe(...e){Ae({event:"legacy",msg:e.join(" ")})}function wt(...e){Ae({event:"legacy",msg:e.join(" ")},{verbose:!0})}function H(e){Ae(e,{always:!0})}function Qk(){return eI()||tI()}function eI(){try{let e=Qf(Zs(Ya(),"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 tI(){try{let e=Qf(Zs(Ya(),"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,Zf,Yk,zs,he=T(()=>{"use strict";Gr=!1,zf=!1,Zf=0,Yk=5e3;zs=null});import{existsSync as EI}from"node:fs";import{createRequire as TI}from"node:module";function bI(){return Za===null&&(Za=TI(import.meta.url)("node:sqlite").DatabaseSync),Za}function Qa(e){return e.length===1&&SI(e[0])?[e[0]]:e}function SI(e){if(!rl(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function rl(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var Za,el,lm,tl,cm=T(()=>{"use strict";Za=null;el=class{name;handle;transactionDepth=0;savepointId=0;constructor(t,r={}){if(r.fileMustExist===!0&&t!==":memory:"&&!EI(t))throw new Error("unable to open database file");this.name=t,this.handle=new(bI())(t,{readOnly:r.readonly===!0}),this.exec("PRAGMA busy_timeout = 5000")}prepare(t){return new tl(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)}}},lm=el,tl=class{handle;rawMode=!1;constructor(t){this.handle=t,this.handle.setAllowBareNamedParameters(!0)}get(...t){let r=this.handle.get(...Qa(t));return this.normalizeRow(r)}all(...t){return this.handle.all(...Qa(t)).map(r=>this.normalizeRow(r))}run(...t){let r=this.handle.run(...Qa(t));return{changes:Number(r.changes),lastInsertRowid:Number(r.lastInsertRowid)}}raw(){return this.rawMode=!0,this}normalizeRow(t){return t==null?t:this.rawMode&&rl(t)?Object.values(t):rl(t)?{...t}:t}}});import{existsSync as vI,mkdirSync as kI,readFileSync as um}from"node:fs";import{homedir as II}from"node:os";import{dirname as fm,join as NI,resolve as mm}from"node:path";import{fileURLToPath as xI,pathToFileURL as AI}from"node:url";function nl(e){e.dbPath!==":memory:"&&kI(fm(e.dbPath),{recursive:!0});let t=new lm(e.dbPath);t.pragma("journal_mode = WAL"),t.pragma("synchronous = NORMAL"),t.pragma("foreign_keys = ON");let r=hm(t);return r===0&&(t.exec(um(_m,"utf8")),t.pragma(`user_version = ${LI}`)),OI(t,r),t}function OI(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,
@@ -628,7 +628,7 @@ var pk=Object.defineProperty;var T=(e,t)=>()=>(e&&(t=e(e=0)),t);var we=(e,t)=>{f
628
628
  FROM team_chat_log;
629
629
  DROP TABLE team_chat_log;
630
630
  ALTER TABLE team_chat_log_v46 RENAME TO team_chat_log;
631
- `)}finally{e.pragma("foreign_keys = ON")}}function hm(e){let t=e.pragma("user_version",{simple:!0});return typeof t=="number"?t:0}function OI(){return process.env.LMCTL_DB??NI(II(),".lmctl","state.db")}var pm,_m,RI,LI,gm=T(()=>{"use strict";cm();pm=fm(xI(import.meta.url)),_m=mm(pm,"schema.sql"),RI=mm(pm,"migrations"),LI=52;if(process.argv[1]&&import.meta.url===AI(process.argv[1]).href){let e=nl({dbPath:process.argv[2]??OI()});try{process.stdout.write(`migrated user_version=${hm(e)}
631
+ `)}finally{e.pragma("foreign_keys = ON")}}function hm(e){let t=e.pragma("user_version",{simple:!0});return typeof t=="number"?t:0}function $I(){return process.env.LMCTL_DB??NI(II(),".lmctl","state.db")}var pm,_m,RI,LI,gm=T(()=>{"use strict";cm();pm=fm(xI(import.meta.url)),_m=mm(pm,"schema.sql"),RI=mm(pm,"migrations"),LI=52;if(process.argv[1]&&import.meta.url===AI(process.argv[1]).href){let e=nl({dbPath:process.argv[2]??$I()});try{process.stdout.write(`migrated user_version=${hm(e)}
632
632
  `)}finally{e.close()}}});function ym(e){return{getAgentInflight:e.prepare("SELECT * FROM agent_inflight WHERE receiver_teamfile = ? AND receiver_alias = ?"),listAgentInflight:e.prepare("SELECT * FROM agent_inflight ORDER BY started_at ASC, receiver_teamfile ASC, receiver_alias ASC"),acquireAgentInflight:e.prepare(`
633
633
  INSERT INTO agent_inflight (receiver_teamfile, receiver_alias, sender_teamfile, sender_alias, started_at, active_count, holder_pid)
634
634
  VALUES (@receiver_teamfile, @receiver_alias, @sender_teamfile, @sender_alias, @started_at, 1, @holder_pid)
@@ -955,7 +955,7 @@ var pk=Object.defineProperty;var T=(e,t)=>()=>(e&&(t=e(e=0)),t);var we=(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 Un(e){if(Buffer.byteLength(e,"utf8")<=65536)return e;let r=Buffer.byteLength(Sm,"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")}${Sm}`}var Sm,sl=T(()=>{"use strict";Sm=`
957
957
  ...[truncated]`});function qn(e,t){return JSON.stringify([e,t])}function km(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 Wn,Bn,Im=T(()=>{"use strict";Wn="terminal_lock",Bn="member"});function Zt(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 il=T(()=>{"use strict"});function Vr(e){return typeof e=="string"&&CI.has(e)}function Am(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: ${Qs[0]}`,` STANCE: ${Qs[1]}`,` STANCE: ${Qs[2]}`,` STANCE: ${Nm}: <one short sentence: why no declared outcome fits>`,"Never invent a different outcome; never leave the STANCE line out."].join(`
958
- `)}var Nm,Qs,CI,Hn,xm,ol,ei,Jn=T(()=>{"use strict";Nm="other",Qs=["not_enough_information","dont_know","other_work"],CI=new Set([Nm,...Qs]),Hn="@abort",xm="invalid_decision",ol="escalation_aborted",ei="workflow_escalation"});import{randomUUID as Rm}from"node:crypto";import{hostname as Xn}from"node:os";function Ue(e){return e.provider_resolved??e.provider}function $(){return new Date().toISOString()}function Ie(e){return new al(nl({dbPath:e.path}))}function Lm(e,t,r){let n=$m(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 $m(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 $m(e){let t=MI(e),r=t===null?null:jI(t,"states");if(r===null)return[];let n=[];for(let s of Object.values(r))ti(s)&&s.type==="Subflow"&&typeof s.workflow_name=="string"&&s.workflow_name.length>0&&n.push(s.workflow_name);return n}function MI(e){try{let t=JSON.parse(e);return ti(t)?t:null}catch{return null}}function jI(e,t){let r=e[t];return ti(r)?r:null}function ti(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function DI(e){try{let t=JSON.parse(e);return!ti(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 PI(e,t){return e===null?!0:e.holder_host===Xn()?!Zt(e.holder_pid):e.last_heartbeat<t}function FI(e,t){return e.delivering_at===null?!1:e.delivery_holder_host===Xn()&&UI(e.delivery_holder_pid)?!Zt(e.delivery_holder_pid):e.delivering_at<t}function UI(e){return Number.isInteger(e)&&(e??0)>0}function WI(e){return{...vm(e),getRuntimeState:e.prepare("SELECT * FROM runtime_state WHERE scope = ? AND key = ? AND kind = ?"),upsertRuntimeState:e.prepare(`
958
+ `)}var Nm,Qs,CI,Hn,xm,ol,ei,Jn=T(()=>{"use strict";Nm="other",Qs=["not_enough_information","dont_know","other_work"],CI=new Set([Nm,...Qs]),Hn="@abort",xm="invalid_decision",ol="escalation_aborted",ei="workflow_escalation"});import{randomUUID as Rm}from"node:crypto";import{hostname as Xn}from"node:os";function Ue(e){return e.provider_resolved??e.provider}function O(){return new Date().toISOString()}function Ie(e){return new al(nl({dbPath:e.path}))}function Lm(e,t,r){let n=Om(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 Om(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 Om(e){let t=MI(e),r=t===null?null:jI(t,"states");if(r===null)return[];let n=[];for(let s of Object.values(r))ti(s)&&s.type==="Subflow"&&typeof s.workflow_name=="string"&&s.workflow_name.length>0&&n.push(s.workflow_name);return n}function MI(e){try{let t=JSON.parse(e);return ti(t)?t:null}catch{return null}}function jI(e,t){let r=e[t];return ti(r)?r:null}function ti(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function DI(e){try{let t=JSON.parse(e);return!ti(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 PI(e,t){return e===null?!0:e.holder_host===Xn()?!Zt(e.holder_pid):e.last_heartbeat<t}function FI(e,t){return e.delivering_at===null?!1:e.delivery_holder_host===Xn()&&UI(e.delivery_holder_pid)?!Zt(e.delivery_holder_pid):e.delivering_at<t}function UI(e){return Number.isInteger(e)&&(e??0)>0}function WI(e){return{...vm(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,54 +1355,54 @@ var pk=Object.defineProperty;var T=(e,t)=>()=>(e&&(t=e(e=0)),t);var we=(e,t)=>{f
1355
1355
  error_detail = ?,
1356
1356
  truncated = ?
1357
1357
  WHERE id = ?
1358
- `),...Tm(e),...ym(e)}}function BI(e,t){return t===void 0?{resumed:!1,reason:e}:{resumed:!1,reason:e,valid:t}}var al,Ze=T(()=>{"use strict";gm();wm();bm();sl();Im();il();Jn();al=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;tryAcquireAgentInflightTxn;recvMailboxMessagesTxn;constructor(t){t.pragma("foreign_keys = ON"),this.db=t,this.stmts=WI(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)=>BI("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!==ei)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!==Hn&&!a.includes(n))return{resumed:!1,reason:xm};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){Lm(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,$()),n=this.getWorkflow(Number(r.lastInsertRowid)),s=this.stmts.insertWorkflowVersion.run(n.id,n.version,t.definition,t.author??null,$());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){Lm(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,$());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,$())}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,$());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,$()),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,$(),t),this.stmts.getTriggerInstance.get(t)??null}setTriggerFailure(t,r){return this.stmts.setTriggerFailure.run($(),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,$());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,$());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,$(),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,$());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",$());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,$());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=$(),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,$(),t)??null}claimIssue(t,r){return this.stmts.claimIssue.get(r,$(),t)??null}closeIssue(t,r,n){let s=$(),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,$(),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,$(),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=$();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,$(),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,$(),t).changes===0)throw new Error(`webui_session not found: ${t}`);return this.stmts.getWebuiSession.get(t)}createChatbotSession(t,r){let n=Rm(),s=$();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=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,$())}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??$(),t.dedupe_key??null,t.concurrency_key??null,$());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=$(),n=new Date(Date.now()+t.lease_ms).toISOString();return this.claimTxn(t.worker_id,n,r)}claimNextJobWithConcurrency(t){let r=$(),n=new Date(Date.now()+t.lease_ms).toISOString();return this.claimWithConcurrencyTxn(t.worker_id,n,r,t.evaluator)}claimJobByIdWithConcurrency(t){let r=$(),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:$();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,$()),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,$()),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??$(),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,$());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=$(),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,$(),t.id),this.getWebProject(t.id))}softDeleteWebProject(t){return this.stmts.softDeleteWebProject.run($(),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??$(),n=t.holder_host??Xn(),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,Dt(t.command),r,t.holder_pid??null,n,s,Dt(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??$();return this.stmts.finishTrackedInvocation.run(r.status,n,r.exit_code??null,r.signal??null,Dt(r.result_summary),Dt(r.error),r.team_chat_log_id??null,Dt(r.meta),n,t).changes!==1?null:this.getTrackedInvocation(t)}reclaimTrackedInvocationIfUnchanged(t,r,n){let s=n.ended_at??$();return this.stmts.reclaimTrackedInvocationIfUnchanged.run(n.status,s,n.exit_code??null,n.signal??null,Dt(n.result_summary),Dt(n.error),n.team_chat_log_id??null,Dt(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=$()){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=$()){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,Un(t.payload),t.created_at??$(),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=Un(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=Un(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=Un(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=Xn()){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(!FI(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(Wn,qn(t,r),Bn);return n===void 0?null:km(n.data)}setTerminalLock(t){this.stmts.upsertRuntimeState.run(Wn,qn(t.teamfile,t.alias),Bn,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(Wn,qn(t,r),Bn,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(Wn,qn(t,r),Bn);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:DI(s.data)}tryAcquireRuntimeProcessLock(t,r,n,s,i=$()){this.db.exec("BEGIN IMMEDIATE");try{let o=this.getRuntimeProcessLock(t,r,n);if(o!==null&&!PI(o,s))return this.db.exec("COMMIT"),{acquired:!1,current:o};let a={lock_id:Rm(),holder_pid:process.pid,holder_host:Xn(),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,$(),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,$())}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,$());return this.stmts.getStep.get(r.lastInsertRowid)}finishStep(t,r,n){return this.stmts.finishStep.run(r??null,n??null,$(),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??$(),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,$());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,$()).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,$()),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,$());return this.stmts.getAttention.get(r.lastInsertRowid)}acknowledgeAttention(t){return this.stmts.ackAttention.run($(),t),this.stmts.getAttention.get(t)??null}upsertDurableMemory(t){let r=$();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??$());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,$())}resumeEscalation(t,r){return this.resumeEscalationTxn(t,r,$())}}});import{realpathSync as qI}from"node:fs";import{resolve as HI}from"node:path";function ll(e){let t=HI(e);try{return qI(t)}catch{return t}}var Om=T(()=>{"use strict"});import{platform as Cm}from"node:os";function Et(e){let t=new Gn;for(let r of e)t.registerAdapter(r);return t}var Gn,cl=T(()=>{"use strict";Om();Gn=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=ll(t.workspace);i=i.filter(a=>ll(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=Cm()==="darwin"||Cm()==="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 Mm}from"node:fs";import{createInterface as jm}from"node:readline";import{stat as JI}from"node:fs/promises";import{homedir as XI}from"node:os";async function*We(e){let t=Mm(e,{encoding:"utf-8"}),r=jm({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=Mm(e,{encoding:"utf-8"}),s=jm({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 JI(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 J(e,t){return e.length<=t?e:e.slice(0,t-3)+"..."}var be,Qt=T(()=>{"use strict";be=XI()});import{readdir as ri,stat as Dm,unlink as GI}from"node:fs/promises";import{join as Kr,basename as Pm}from"node:path";function VI(e){return e==="file-history-snapshot"||e==="progress"||e==="system"||e==="queue-operation"}function KI(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 Fm(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 h=u+f+m;h&&(o=h),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 ni,Um=T(()=>{"use strict";Qt();ni=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 ri(this.projectsDir)}catch{return t}for(let n of r){let s=Kr(this.projectsDir,n);if(!(await Dm(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await ri(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=Pm(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(!VI(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=J(p.trim(),80)),d=J(p.trim(),80)}}if(!i)return null;let f=await Fm(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 h of We(r))if(h.type!=="file-history-snapshot"&&!h.isSidechain){if(!i&&h.cwd&&(i=h.cwd),!o&&h.slug&&(o=h.slug),!a&&h.version&&(a=h.version),!c&&h.gitBranch&&(c=h.gitBranch),!f&&h.timestamp&&(f=new Date(h.timestamp)),h.sessionId&&(m=h.sessionId),h.type==="system"||h.type==="progress"||h.type==="queue-operation"){s.push({role:"system",timestamp:new Date(h.timestamp||0),content:KI(h)});continue}if(h.type==="user"&&h.message){if(h.isMeta)continue;let g=new Date(h.timestamp||0),_=h.message.content;if(typeof _=="string"){if(_.includes("<command-name>")||_.includes("<local-command-"))continue;d||(d=J(_.trim(),80)),u=J(_.trim(),80),s.push({role:"user",timestamp:g,content:fe(_.trim())})}else if(Array.isArray(_)){for(let S of _)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(h.type==="assistant"&&h.message){h.message.model&&(l=h.message.model);let g=new Date(h.timestamp||0),_=h.message.content;if(Array.isArray(_))for(let S of _)S.type==="text"&&S.text?s.push({role:"assistant",timestamp:g,content:fe(S.text),model:h.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:h.message.model}):S.type==="thinking"&&S.thinking&&s.push({role:"thinking",timestamp:g,content:S.thinking})}}if(!i)return null;let p=await Fm(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 GI(r),!0):!1}async resolveSessionFile(t){let r;try{r=await ri(this.projectsDir)}catch{return null}let n=[];for(let o of r){let a=Kr(this.projectsDir,o);if(!(await Dm(a).catch(()=>null))?.isDirectory())continue;let c;try{c=await ri(a)}catch{continue}for(let d of c){if(!d.endsWith(".jsonl"))continue;let u=Pm(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 si(e){return"'"+e.replace(/'/g,"'\\''")+"'"}function zI(e,t,r){if(!r)return"";let n=e.tools[t]??dl[t],s=n?.profiles?.[r]?.flags??dl[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 Wm(e,t){return!!e.tools[t]}function Bm(e,t,r,n,s){let i=e.tools[t]??dl[t],o;if(i?.agent){let l=si(n);o=i.agent.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,l)}else{let l=YI[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(si).join(" ");o=`printf '%s\\n' ${si(n)} | ${d}`}else o=c.map(si).join(" ")}let a=zI(e,t,s);return a&&(o+=" "+a),o}var dl,YI,qm=T(()=>{"use strict";dl={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:""}}}},YI={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 Hm(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 Jm=T(()=>{"use strict"});var ZI,ge,ii,Tt=T(()=>{"use strict";ZI="ACK: waiting for explicit lmctl task.",ge=`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: ${ZI}`,ii=`send this exact lmctl seed instruction: "${ge}"`});function er(e,t){let r={...e??process.env,PWD:t};return delete r.OLDPWD,r}function e0(e,t){return t===void 0||t.length===0?e:{...e??process.env,[Vn]:t}}function Be(e,t,r,n="chat"){return{...e0(er(e,t),r),[QI]:n}}var Vn,QI,st=T(()=>{"use strict";Vn="LMCTL_SELF_SESSIONID",QI="LMCTL_LAUNCH_SOURCE"});import{spawn as Xm}from"node:child_process";import{mkdirSync as t0}from"node:fs";var ul,xe,Pt=T(()=>{"use strict";qm();Jm();Tt();st();ul=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===ge?r:n)}seed(t,r){return t0(t,{recursive:!0}),new Promise(n=>{let s;try{s=Xm(this.binary,this.seedArgsFor(r),{cwd:t,env:er(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:ii,lsCommand:`lmctl ls --provider ${this.name} --sessiondir ${t}`}}static DEFAULT_IDLE_TIMEOUT_MS=8*60*60*1e3;sendTurn(t,r){if(r.userConfig&&Wm(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 ul("Turn cancelled","external"):p}),m=new Promise(p=>{l=p});return Promise.race([f,m])}runOneShotAgent(t,r,n){let s=Bm(r.userConfig,this.name,r.sessionId,t,r.profile),i=Date.now();return new Promise((o,a)=>{let l=Hm(r.env),c=Xm(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",h=>{let g=h.toString();m+=g,r.onDelta?.(g)}),c.stderr?.on("data",h=>{p+=h.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",h=>{if(d)return;d=!0,clearTimeout(f);let g=Date.now()-i;u?a(new Error(`Agent command timed out after ${l}ms`)):h===0||h===null?o({text:m.trim(),sessionId:r.sessionId,durationMs:g}):a(new Error(p.trim().slice(0,200)||`Agent command exited with code ${h}`))}),c.on("error",h=>{d||(d=!0,clearTimeout(f),a(h))})})}}});function ai(e,t){let r;if(t&&typeof t=="object"){let n=t.code;typeof n=="number"&&(r=n)}return new Ut(e,r,t)}var Qe,Se,Ft,oi,Ut,Yr=T(()=>{"use strict";Qe=class extends Error{constructor(t,r){super(t,r),this.name=this.constructor.name}},Se=class extends Qe{},Ft=class extends Qe{exitCode;signal;stderr;constructor(t,r,n=null,s){super(t),this.exitCode=r,this.signal=n,this.stderr=s}},oi=class extends Qe{line;constructor(t,r,n){super(t,{cause:n}),this.line=r}},Ut=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 ml from"node:child_process";function n0(e){if(typeof ml.spawnSync=="function")try{ml.spawnSync("taskkill",["/T","/F","/PID",String(e)],{windowsHide:!0})}catch{}}function Gm(e){return e.exitCode!==null||e.signalCode!==null}function fl(e,t){return Gm(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 it(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??n0;if(Gm(e))return{signal:"natural",elapsedMs:Date.now()-r};if(n&&e.stdin&&!e.stdin.destroyed)try{e.stdin.end()}catch{}if(await fl(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 fl(e,i))return{signal:"SIGTERM",elapsedMs:Date.now()-r};if(o!=="win32")try{e.kill("SIGKILL")}catch{}return await fl(e,r0)?{signal:"SIGKILL",elapsedMs:Date.now()-r}:{signal:"abandoned",elapsedMs:Date.now()-r}}var r0,li=T(()=>{"use strict";r0=1e3});function Vm(e){ce()&&Ae({event:"legacy",msg:`[debug] ${e}`},{always:!0})}function tr(e,t){let r=i0[e];if(r)return r[t]??r.yolo}function a0(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 ot(e,t,r="yolo"){if(o0.has(e)){Vm(`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"?tr(e,"plan"):s0[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 H({event:"yolo_assert_failed",provider:e,reason:"unconfigured_provider",args:t.join(" "),message:s}),new Se(s)}if(!a0(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 H({event:"yolo_assert_failed",provider:e,reason:"flag_missing",required_flag:s,mode:r,args:t.join(" "),message:i}),new Se(i)}Vm(`YOLO ${e} [mode=${r}]: argv flag '${n.join(" ")}'`)}var s0,i0,o0,zr=T(()=>{"use strict";Yr();he();s0={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"],gemini:["-y"],copilot:["--yolo"],agy:["--dangerously-skip-permissions"],lmplayer:["--dangerously-skip-permissions"]},i0={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"]}};o0=new Set(["codex","opencode"])});function Km(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
+ `),...Tm(e),...ym(e)}}function BI(e,t){return t===void 0?{resumed:!1,reason:e}:{resumed:!1,reason:e,valid:t}}var al,Ze=T(()=>{"use strict";gm();wm();bm();sl();Im();il();Jn();al=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;tryAcquireAgentInflightTxn;recvMailboxMessagesTxn;constructor(t){t.pragma("foreign_keys = ON"),this.db=t,this.stmts=WI(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)=>BI("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!==ei)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!==Hn&&!a.includes(n))return{resumed:!1,reason:xm};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){Lm(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){Lm(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=Rm(),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??Xn(),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,Dt(t.command),r,t.holder_pid??null,n,s,Dt(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,Dt(r.result_summary),Dt(r.error),r.team_chat_log_id??null,Dt(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,Dt(n.result_summary),Dt(n.error),n.team_chat_log_id??null,Dt(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,Un(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=Un(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=Un(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=Un(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=Xn()){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(!FI(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(Wn,qn(t,r),Bn);return n===void 0?null:km(n.data)}setTerminalLock(t){this.stmts.upsertRuntimeState.run(Wn,qn(t.teamfile,t.alias),Bn,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(Wn,qn(t,r),Bn,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(Wn,qn(t,r),Bn);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:DI(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&&!PI(o,s))return this.db.exec("COMMIT"),{acquired:!1,current:o};let a={lock_id:Rm(),holder_pid:process.pid,holder_host:Xn(),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 qI}from"node:fs";import{resolve as HI}from"node:path";function ll(e){let t=HI(e);try{return qI(t)}catch{return t}}var $m=T(()=>{"use strict"});import{platform as Cm}from"node:os";function Et(e){let t=new Gn;for(let r of e)t.registerAdapter(r);return t}var Gn,cl=T(()=>{"use strict";$m();Gn=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=ll(t.workspace);i=i.filter(a=>ll(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=Cm()==="darwin"||Cm()==="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 Mm}from"node:fs";import{createInterface as jm}from"node:readline";import{stat as JI}from"node:fs/promises";import{homedir as XI}from"node:os";async function*We(e){let t=Mm(e,{encoding:"utf-8"}),r=jm({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=Mm(e,{encoding:"utf-8"}),s=jm({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 JI(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 J(e,t){return e.length<=t?e:e.slice(0,t-3)+"..."}var be,Qt=T(()=>{"use strict";be=XI()});import{readdir as ri,stat as Dm,unlink as GI}from"node:fs/promises";import{join as Kr,basename as Pm}from"node:path";function VI(e){return e==="file-history-snapshot"||e==="progress"||e==="system"||e==="queue-operation"}function KI(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 Fm(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 h=u+f+m;h&&(o=h),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 ni,Um=T(()=>{"use strict";Qt();ni=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 ri(this.projectsDir)}catch{return t}for(let n of r){let s=Kr(this.projectsDir,n);if(!(await Dm(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await ri(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=Pm(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(!VI(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=J(p.trim(),80)),d=J(p.trim(),80)}}if(!i)return null;let f=await Fm(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 h of We(r))if(h.type!=="file-history-snapshot"&&!h.isSidechain){if(!i&&h.cwd&&(i=h.cwd),!o&&h.slug&&(o=h.slug),!a&&h.version&&(a=h.version),!c&&h.gitBranch&&(c=h.gitBranch),!f&&h.timestamp&&(f=new Date(h.timestamp)),h.sessionId&&(m=h.sessionId),h.type==="system"||h.type==="progress"||h.type==="queue-operation"){s.push({role:"system",timestamp:new Date(h.timestamp||0),content:KI(h)});continue}if(h.type==="user"&&h.message){if(h.isMeta)continue;let g=new Date(h.timestamp||0),_=h.message.content;if(typeof _=="string"){if(_.includes("<command-name>")||_.includes("<local-command-"))continue;d||(d=J(_.trim(),80)),u=J(_.trim(),80),s.push({role:"user",timestamp:g,content:fe(_.trim())})}else if(Array.isArray(_)){for(let S of _)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(h.type==="assistant"&&h.message){h.message.model&&(l=h.message.model);let g=new Date(h.timestamp||0),_=h.message.content;if(Array.isArray(_))for(let S of _)S.type==="text"&&S.text?s.push({role:"assistant",timestamp:g,content:fe(S.text),model:h.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:h.message.model}):S.type==="thinking"&&S.thinking&&s.push({role:"thinking",timestamp:g,content:S.thinking})}}if(!i)return null;let p=await Fm(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 GI(r),!0):!1}async resolveSessionFile(t){let r;try{r=await ri(this.projectsDir)}catch{return null}let n=[];for(let o of r){let a=Kr(this.projectsDir,o);if(!(await Dm(a).catch(()=>null))?.isDirectory())continue;let c;try{c=await ri(a)}catch{continue}for(let d of c){if(!d.endsWith(".jsonl"))continue;let u=Pm(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 si(e){return"'"+e.replace(/'/g,"'\\''")+"'"}function zI(e,t,r){if(!r)return"";let n=e.tools[t]??dl[t],s=n?.profiles?.[r]?.flags??dl[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 Wm(e,t){return!!e.tools[t]}function Bm(e,t,r,n,s){let i=e.tools[t]??dl[t],o;if(i?.agent){let l=si(n);o=i.agent.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,l)}else{let l=YI[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(si).join(" ");o=`printf '%s\\n' ${si(n)} | ${d}`}else o=c.map(si).join(" ")}let a=zI(e,t,s);return a&&(o+=" "+a),o}var dl,YI,qm=T(()=>{"use strict";dl={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:""}}}},YI={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 Hm(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 Jm=T(()=>{"use strict"});var ZI,ge,ii,Tt=T(()=>{"use strict";ZI="ACK: waiting for explicit lmctl task.",ge=`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: ${ZI}`,ii=`send this exact lmctl seed instruction: "${ge}"`});function er(e,t){let r={...e??process.env,PWD:t};return delete r.OLDPWD,r}function eN(e,t){return t===void 0||t.length===0?e:{...e??process.env,[Vn]:t}}function Be(e,t,r,n="chat"){return{...eN(er(e,t),r),[QI]:n}}var Vn,QI,st=T(()=>{"use strict";Vn="LMCTL_SELF_SESSIONID",QI="LMCTL_LAUNCH_SOURCE"});import{spawn as Xm}from"node:child_process";import{mkdirSync as tN}from"node:fs";var ul,xe,Pt=T(()=>{"use strict";qm();Jm();Tt();st();ul=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===ge?r:n)}seed(t,r){return tN(t,{recursive:!0}),new Promise(n=>{let s;try{s=Xm(this.binary,this.seedArgsFor(r),{cwd:t,env:er(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:ii,lsCommand:`lmctl ls --provider ${this.name} --sessiondir ${t}`}}static DEFAULT_IDLE_TIMEOUT_MS=8*60*60*1e3;sendTurn(t,r){if(r.userConfig&&Wm(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 ul("Turn cancelled","external"):p}),m=new Promise(p=>{l=p});return Promise.race([f,m])}runOneShotAgent(t,r,n){let s=Bm(r.userConfig,this.name,r.sessionId,t,r.profile),i=Date.now();return new Promise((o,a)=>{let l=Hm(r.env),c=Xm(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",h=>{let g=h.toString();m+=g,r.onDelta?.(g)}),c.stderr?.on("data",h=>{p+=h.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",h=>{if(d)return;d=!0,clearTimeout(f);let g=Date.now()-i;u?a(new Error(`Agent command timed out after ${l}ms`)):h===0||h===null?o({text:m.trim(),sessionId:r.sessionId,durationMs:g}):a(new Error(p.trim().slice(0,200)||`Agent command exited with code ${h}`))}),c.on("error",h=>{d||(d=!0,clearTimeout(f),a(h))})})}}});function ai(e,t){let r;if(t&&typeof t=="object"){let n=t.code;typeof n=="number"&&(r=n)}return new Ut(e,r,t)}var Qe,Se,Ft,oi,Ut,Yr=T(()=>{"use strict";Qe=class extends Error{constructor(t,r){super(t,r),this.name=this.constructor.name}},Se=class extends Qe{},Ft=class extends Qe{exitCode;signal;stderr;constructor(t,r,n=null,s){super(t),this.exitCode=r,this.signal=n,this.stderr=s}},oi=class extends Qe{line;constructor(t,r,n){super(t,{cause:n}),this.line=r}},Ut=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 ml from"node:child_process";function nN(e){if(typeof ml.spawnSync=="function")try{ml.spawnSync("taskkill",["/T","/F","/PID",String(e)],{windowsHide:!0})}catch{}}function Gm(e){return e.exitCode!==null||e.signalCode!==null}function fl(e,t){return Gm(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 it(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??nN;if(Gm(e))return{signal:"natural",elapsedMs:Date.now()-r};if(n&&e.stdin&&!e.stdin.destroyed)try{e.stdin.end()}catch{}if(await fl(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 fl(e,i))return{signal:"SIGTERM",elapsedMs:Date.now()-r};if(o!=="win32")try{e.kill("SIGKILL")}catch{}return await fl(e,rN)?{signal:"SIGKILL",elapsedMs:Date.now()-r}:{signal:"abandoned",elapsedMs:Date.now()-r}}var rN,li=T(()=>{"use strict";rN=1e3});function Vm(e){ce()&&Ae({event:"legacy",msg:`[debug] ${e}`},{always:!0})}function tr(e,t){let r=iN[e];if(r)return r[t]??r.yolo}function aN(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 ot(e,t,r="yolo"){if(oN.has(e)){Vm(`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"?tr(e,"plan"):sN[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 H({event:"yolo_assert_failed",provider:e,reason:"unconfigured_provider",args:t.join(" "),message:s}),new Se(s)}if(!aN(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 H({event:"yolo_assert_failed",provider:e,reason:"flag_missing",required_flag:s,mode:r,args:t.join(" "),message:i}),new Se(i)}Vm(`YOLO ${e} [mode=${r}]: argv flag '${n.join(" ")}'`)}var sN,iN,oN,zr=T(()=>{"use strict";Yr();he();sN={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"],gemini:["-y"],copilot:["--yolo"],agy:["--dangerously-skip-permissions"],lmplayer:["--dangerously-skip-permissions"]},iN={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"]}};oN=new Set(["codex","opencode"])});function Km(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
 
1364
- `+e[r]);return t.join("")}function pl(e={}){let t=[],r="",n=!1;return{processLine(s){if(!s.trim())return;let i;try{i=JSON.parse(s)}catch{return}e.onEvent?.(i);let o=i.type;if(o==="system"&&i.subtype==="init"&&(r=i.session_id||r),o==="assistant"){let l=i.message?.content;if(Array.isArray(l))for(let c of l)c.type==="text"&&c.text&&e.onText?.(c.text)}o==="result"&&(n=!0,t.push(i))},sawResult(){return n},finalize(){if(!n)return null;let s=Ym(t);return{result:Km(s.resultTexts),sessionId:s.sessionId||r,durationMs:s.durationMs,numTurns:s.numTurns}}}}function Ym(e){let t=[],r=0,n=0,s="";for(let i of e){t.push(i.result||"");let o=i.duration_ms;typeof o=="number"&&Number.isFinite(o)&&(r+=o);let a=i.num_turns;typeof a=="number"&&Number.isFinite(a)&&(n=a);let l=i.session_id;typeof l=="string"&&l&&(s=l)}return{resultTexts:t,durationMs:r,numTurns:n,sessionId:s}}var _l=T(()=>{"use strict"});import{spawn as l0}from"node:child_process";import{existsSync as c0}from"node:fs";function u0(e){let t=e.stderr.trim().slice(0,500),r=`lmctl: ${e.tool} exited with code ${e.exitCode} before returning a final result event.
1364
+ `+e[r]);return t.join("")}function pl(e={}){let t=[],r="",n=!1;return{processLine(s){if(!s.trim())return;let i;try{i=JSON.parse(s)}catch{return}e.onEvent?.(i);let o=i.type;if(o==="system"&&i.subtype==="init"&&(r=i.session_id||r),o==="assistant"){let l=i.message?.content;if(Array.isArray(l))for(let c of l)c.type==="text"&&c.text&&e.onText?.(c.text)}o==="result"&&(n=!0,t.push(i))},sawResult(){return n},finalize(){if(!n)return null;let s=Ym(t);return{result:Km(s.resultTexts),sessionId:s.sessionId||r,durationMs:s.durationMs,numTurns:s.numTurns}}}}function Ym(e){let t=[],r=0,n=0,s="";for(let i of e){t.push(i.result||"");let o=i.duration_ms;typeof o=="number"&&Number.isFinite(o)&&(r+=o);let a=i.num_turns;typeof a=="number"&&Number.isFinite(a)&&(n=a);let l=i.session_id;typeof l=="string"&&l&&(s=l)}return{resultTexts:t,durationMs:r,numTurns:n,sessionId:s}}var _l=T(()=>{"use strict"});import{spawn as lN}from"node:child_process";import{existsSync as cN}from"node:fs";function uN(e){let t=e.stderr.trim().slice(0,500),r=`lmctl: ${e.tool} exited with code ${e.exitCode} before returning a final result event.
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 zm(e,t){return new Promise((r,n)=>{let s=t.tool||"claude",i=t.binaryPath||d0[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=tr(s,a)??f0[s]??["--dangerously-skip-permissions"];o.push(...l);try{ot(s,o,a)}catch(g){return n(g)}if(t.cwd&&!c0(t.cwd))return H({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=l0(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,H({event:"transport_abort",provider:s,phase:"pre_spawn"}),it(c).catch(()=>{}),n(new Error("Aborted"));t.signal.addEventListener("abort",()=>{d=!0,H({event:"transport_abort",provider:s}),it(c).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let u=pl({onEvent:t.onEvent,onText:t.onText}),f="";function m(g){let _=u.sawResult();u.processLine(g),!_&&u.sawResult()&&c.stdin?.end()}c.stdout?.on("data",g=>{f+=g.toString();let _=f.split(`
1369
- `);f=_.pop()||"";for(let S of _)m(S)});let p="";c.stderr?.on("data",g=>{p+=g.toString()}),c.on("error",g=>{H({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 _=u.finalize();_?(wt(`stream-json: result ${_.result.slice(0,80)}${_.result.length>80?"...":""} (${_.durationMs}ms)`),r({..._,exitCode:g})):(H({event:"transport_error",provider:s,error_class:"Error",reason:"provider_no_result",exit_code:g,stderr_tail:p.slice(0,500)}),n(new Error(u0({tool:s,exitCode:g,stderr:p}))))});let h=JSON.stringify({type:"user",message:{role:"user",content:e}});c.stdin?.write(h+`
1370
- `),wt(`stream-json: prompt sent (${e.length} chars)`)})}var d0,f0,Zm=T(()=>{"use strict";Yr();li();zr();he();st();_l();_l();d0={claude:"claude",qwen:"qwen"};f0={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"]}});function ci(e={}){return[]}var hl=T(()=>{"use strict"});function gl(e){return e==="plan"?"read-only":"danger-full-access"}function Qm(e="0.0.0"){return{clientInfo:{name:"lmctl",title:"lmctl",version:e},capabilities:{experimentalApi:!1}}}function yl(){return{agentItems:new Map,resultText:""}}function di(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 wl(e){for(let[,t]of e.agentItems.entries())t.phase!=="commentary"&&t.buffer&&(e.resultText+=t.buffer);e.agentItems.clear()}function ep(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 El(){return{pendingCodexError:null}}function Tl(e,t){let r=ep(e);return r.willRetry||(t.pendingCodexError=r.turnError),r}function bl(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 Sl=T(()=>{"use strict"});import{spawn as m0}from"node:child_process";import{createInterface as p0}from"node:readline";import{existsSync as _0,readFileSync as h0}from"node:fs";import{fileURLToPath as g0}from"node:url";function w0(){return Qm(y0)}function rr(e,t){wt(`[codex:${e}] ${JSON.stringify(t)}`)}function E0(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 zm(e,t){return new Promise((r,n)=>{let s=t.tool||"claude",i=t.binaryPath||dN[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=tr(s,a)??fN[s]??["--dangerously-skip-permissions"];o.push(...l);try{ot(s,o,a)}catch(g){return n(g)}if(t.cwd&&!cN(t.cwd))return H({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=lN(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,H({event:"transport_abort",provider:s,phase:"pre_spawn"}),it(c).catch(()=>{}),n(new Error("Aborted"));t.signal.addEventListener("abort",()=>{d=!0,H({event:"transport_abort",provider:s}),it(c).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let u=pl({onEvent:t.onEvent,onText:t.onText}),f="";function m(g){let _=u.sawResult();u.processLine(g),!_&&u.sawResult()&&c.stdin?.end()}c.stdout?.on("data",g=>{f+=g.toString();let _=f.split(`
1369
+ `);f=_.pop()||"";for(let S of _)m(S)});let p="";c.stderr?.on("data",g=>{p+=g.toString()}),c.on("error",g=>{H({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 _=u.finalize();_?(wt(`stream-json: result ${_.result.slice(0,80)}${_.result.length>80?"...":""} (${_.durationMs}ms)`),r({..._,exitCode:g})):(H({event:"transport_error",provider:s,error_class:"Error",reason:"provider_no_result",exit_code:g,stderr_tail:p.slice(0,500)}),n(new Error(uN({tool:s,exitCode:g,stderr:p}))))});let h=JSON.stringify({type:"user",message:{role:"user",content:e}});c.stdin?.write(h+`
1370
+ `),wt(`stream-json: prompt sent (${e.length} chars)`)})}var dN,fN,Zm=T(()=>{"use strict";Yr();li();zr();he();st();_l();_l();dN={claude:"claude",qwen:"qwen"};fN={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"]}});function ci(e={}){return[]}var hl=T(()=>{"use strict"});function gl(e){return e==="plan"?"read-only":"danger-full-access"}function Qm(e="0.0.0"){return{clientInfo:{name:"lmctl",title:"lmctl",version:e},capabilities:{experimentalApi:!1}}}function yl(){return{agentItems:new Map,resultText:""}}function di(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 wl(e){for(let[,t]of e.agentItems.entries())t.phase!=="commentary"&&t.buffer&&(e.resultText+=t.buffer);e.agentItems.clear()}function ep(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 El(){return{pendingCodexError:null}}function Tl(e,t){let r=ep(e);return r.willRetry||(t.pendingCodexError=r.turnError),r}function bl(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 Sl=T(()=>{"use strict"});import{spawn as mN}from"node:child_process";import{createInterface as pN}from"node:readline";import{existsSync as _N,readFileSync as hN}from"node:fs";import{fileURLToPath as gN}from"node:url";function wN(){return Qm(yN)}function rr(e,t){wt(`[codex:${e}] ${JSON.stringify(t)}`)}function EN(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 tp(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?ci():[];i.push(...a),ce()&&$e(JSON.stringify({event:"codex_mcp_inject",alias:t.alias??null,isLead:o,injected:a.length>0}));let l=t.permissionMode??"yolo",c=gl(l);try{ot("codex",i,l)}catch(W){return n(W)}if(t.cwd&&!_0(t.cwd))return H({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=m0(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,H({event:"transport_abort",provider:"codex",phase:"pre_spawn"}),it(d).catch(()=>{}),n(new Error("Aborted"));t.signal.addEventListener("abort",()=>{u=!0,H({event:"transport_abort",provider:"codex"}),it(d).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let f=p0({input:d.stdout}),m=new Map,p=1,h=t.threadId||"",g="",_=!1,S=!1,y=Date.now(),w=yl(),I=El();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 tp(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?ci():[];i.push(...a),ce()&&Oe(JSON.stringify({event:"codex_mcp_inject",alias:t.alias??null,isLead:o,injected:a.length>0}));let l=t.permissionMode??"yolo",c=gl(l);try{ot("codex",i,l)}catch(W){return n(W)}if(t.cwd&&!_N(t.cwd))return H({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=mN(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,H({event:"transport_abort",provider:"codex",phase:"pre_spawn"}),it(d).catch(()=>{}),n(new Error("Aborted"));t.signal.addEventListener("abort",()=>{u=!0,H({event:"transport_abort",provider:"codex"}),it(d).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let f=pN({input:d.stdout}),m=new Map,p=1,h=t.threadId||"",g="",_=!1,S=!1,y=Date.now(),w=yl(),I=El();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(ai(`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&&(h=k.id)}let Q=ce()?B=>{rr("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),di(M,w,t.onDelta,Q),ce()&&rr("turn/started",{params:B??null})}if(ce()&&(A==="item/started"||A==="item/completed")){let B=M.params;B?.item?.type==="agentMessage"&&rr(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()&&rr("agentMessage/delta",{params:B??null})}di(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&&rr("turn/completed/unflushed-item",{itemId:N,phase:L.phase,bufferLen:L.buffer.length});wl(w),ce()&&rr("turn/completed",{params:B??null});let k=bl(M,I);k.shouldReject?(ce()&&rr("turn/completed/terminal-reject",{message:k.turnError.message}),S=!0,_=!0,d.stdin?.end(),n(k.turnError)):(_=!0,d.stdin?.end())}if(A==="error"){let B=Tl(M,I);if(ce()){let k=M.params,N=k?.error,L=typeof N?.message=="string"?N.message:"(no message)";rr(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=>{H({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(_){r({result:w.resultText,threadId:h,turnId:g,durationMs:Date.now()-y,exitCode:W});return}if(I.pendingCodexError){n(I.pendingCodexError);return}H({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:W,stderr_tail:ue.slice(0,500)}),n(new Error(E0({exitCode:W,stderr:ue})))}}),(async()=>{try{if(await x("initialize",w0()),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]),h=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&&(h=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&&(h=M.id)}await x("turn/start",{threadId:h,input:[{type:"text",text:e}],...t.model?{model:t.model}:{}})}catch(W){it(d).catch(()=>{}),n(W instanceof Error?W:new Error(String(W)))}})()})}var y0,rp=T(()=>{"use strict";he();he();Yr();li();zr();hl();he();st();Sl();Sl();y0=(()=>{try{let e=new URL("../../../package.json",import.meta.url),t=JSON.parse(h0(g0(e),"utf8"));return typeof t.version=="string"?t.version:"0.0.0"}catch{return"0.0.0"}})()});import{existsSync as ip,mkdirSync as T0,readFileSync as op,writeFileSync as np}from"node:fs";import{join as Kn,resolve as b0}from"node:path";function ap(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 vl(e,t,r={existsSync:ip,readFileSync:op}){let n=[];for(let s of e){if(s.provider.trim().toLowerCase()!=="opencode")continue;let i=b0(t,s.sessiondir??t);for(let o of S0(i)){let a=v0(o,r);a!==void 0&&Object.prototype.hasOwnProperty.call(a,"permission")&&(ap(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 S0(e){return[Kn(e,".opencode","opencode.jsonc"),Kn(e,"opencode.jsonc"),Kn(e,"opencode.json")]}function v0(e,t){try{if(!t.existsSync(e))return;let r=t.readFileSync(e,"utf-8"),n=JSON.parse(k0(r));return n===null||typeof n!="object"||Array.isArray(n)?void 0:n}catch{return}}function k0(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
- `;)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 ui(e,t={}){let r=Kn(e,".opencode"),n=Kn(r,"opencode.json");if(!ip(n)){T0(r,{recursive:!0});let o=JSON.stringify({permission:"allow"},null,2);return np(n,o+`
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(ai(`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&&(h=k.id)}let Q=ce()?B=>{rr("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),di(M,w,t.onDelta,Q),ce()&&rr("turn/started",{params:B??null})}if(ce()&&(A==="item/started"||A==="item/completed")){let B=M.params;B?.item?.type==="agentMessage"&&rr(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()&&rr("agentMessage/delta",{params:B??null})}di(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&&rr("turn/completed/unflushed-item",{itemId:N,phase:L.phase,bufferLen:L.buffer.length});wl(w),ce()&&rr("turn/completed",{params:B??null});let k=bl(M,I);k.shouldReject?(ce()&&rr("turn/completed/terminal-reject",{message:k.turnError.message}),S=!0,_=!0,d.stdin?.end(),n(k.turnError)):(_=!0,d.stdin?.end())}if(A==="error"){let B=Tl(M,I);if(ce()){let k=M.params,N=k?.error,L=typeof N?.message=="string"?N.message:"(no message)";rr(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=>{H({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(_){r({result:w.resultText,threadId:h,turnId:g,durationMs:Date.now()-y,exitCode:W});return}if(I.pendingCodexError){n(I.pendingCodexError);return}H({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:W,stderr_tail:ue.slice(0,500)}),n(new Error(EN({exitCode:W,stderr:ue})))}}),(async()=>{try{if(await x("initialize",wN()),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]),h=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&&(h=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&&(h=M.id)}await x("turn/start",{threadId:h,input:[{type:"text",text:e}],...t.model?{model:t.model}:{}})}catch(W){it(d).catch(()=>{}),n(W instanceof Error?W:new Error(String(W)))}})()})}var yN,rp=T(()=>{"use strict";he();he();Yr();li();zr();hl();he();st();Sl();Sl();yN=(()=>{try{let e=new URL("../../../package.json",import.meta.url),t=JSON.parse(hN(gN(e),"utf8"));return typeof t.version=="string"?t.version:"0.0.0"}catch{return"0.0.0"}})()});import{existsSync as ip,mkdirSync as TN,readFileSync as op,writeFileSync as np}from"node:fs";import{join as Kn,resolve as bN}from"node:path";function ap(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 vl(e,t,r={existsSync:ip,readFileSync:op}){let n=[];for(let s of e){if(s.provider.trim().toLowerCase()!=="opencode")continue;let i=bN(t,s.sessiondir??t);for(let o of SN(i)){let a=vN(o,r);a!==void 0&&Object.prototype.hasOwnProperty.call(a,"permission")&&(ap(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 SN(e){return[Kn(e,".opencode","opencode.jsonc"),Kn(e,"opencode.jsonc"),Kn(e,"opencode.json")]}function vN(e,t){try{if(!t.existsSync(e))return;let r=t.readFileSync(e,"utf-8"),n=JSON.parse(kN(r));return n===null||typeof n!="object"||Array.isArray(n)?void 0:n}catch{return}}function kN(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
+ `;)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 ui(e,t={}){let r=Kn(e,".opencode"),n=Kn(r,"opencode.json");if(!ip(n)){TN(r,{recursive:!0});let o=JSON.stringify({permission:"allow"},null,2);return np(n,o+`
1379
1379
  `,"utf-8"),!0}let s;try{s=JSON.parse(op(n,"utf-8"))}catch{return console.log(sp.yellow(` .opencode/opencode.json at ${n} is malformed \u2014 skipping opencode config install.`)),!1}if(typeof s!="object"||s===null)return console.log(sp.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),ap(s.permission)||H({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&&np(n,JSON.stringify(s,null,2)+`
1380
- `,"utf-8"),i}var sp,fi=T(()=>{"use strict";he();sp={yellow:e=>e}});function dp(e){let t=[...e.matchAll(I0)];if(t.length>0){let r=t[t.length-1],n=(r.index??0)+r[0].length;return lp(e.slice(n).trimStart())}return lp(L0(e.replace(N0,"")))}function L0(e){let t=x0.exec(e);if(t===null)return e;let r=e.slice(t[0].length),n=[...r.matchAll(A0)];if(n.length<2)return e;let s=n[0],i=(s.index??0)+s[0].length;return r.slice(i).trimStart()}function lp(e){let t=[...e.matchAll(R0)];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 Yn(e,t=""){let r=e.result;return typeof r?.sessionId=="string"&&r.sessionId.length>0?r.sessionId:t}function up(e){let t=e.result;return typeof t?.stopReason=="string"?t.stopReason:""}function kl(e={}){let t="",r="",n="",s=!1,i=!1,o=()=>({result:e.tool==="gemini"?dp(r):r,sessionId:t,stopReason:n});return{setSessionId(a){t=a},beginTurn(){r="",n="",s=!1,i=!0},completeTurn(a){return n=up(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 cp,I0,N0,x0,A0,R0,Il=T(()=>{"use strict";cp="(?:png|jpe?g|webp|heic|pdf)",I0=new RegExp(`\\bSTANCE:\\s*\\S+_\\d{6,}\\.${cp}\\s*`,"gi"),N0=new RegExp(`^ACK:\\s*waiting for explicit lmctl task\\.\\d{6,}\\.${cp}\\s*`,"i"),x0=/^ACK:\s*waiting for explicit lmctl task[._]?\s*/i,A0=/^STANCE:\s+\S+\s*$/gim,R0=/\[Thought:\s*true\]\s*/gi});import{spawn as $0}from"node:child_process";import{existsSync as O0}from"node:fs";import{createInterface as C0}from"node:readline";function M0(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 sp,fi=T(()=>{"use strict";he();sp={yellow:e=>e}});function dp(e){let t=[...e.matchAll(IN)];if(t.length>0){let r=t[t.length-1],n=(r.index??0)+r[0].length;return lp(e.slice(n).trimStart())}return lp(LN(e.replace(NN,"")))}function LN(e){let t=xN.exec(e);if(t===null)return e;let r=e.slice(t[0].length),n=[...r.matchAll(AN)];if(n.length<2)return e;let s=n[0],i=(s.index??0)+s[0].length;return r.slice(i).trimStart()}function lp(e){let t=[...e.matchAll(RN)];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 Yn(e,t=""){let r=e.result;return typeof r?.sessionId=="string"&&r.sessionId.length>0?r.sessionId:t}function up(e){let t=e.result;return typeof t?.stopReason=="string"?t.stopReason:""}function kl(e={}){let t="",r="",n="",s=!1,i=!1,o=()=>({result:e.tool==="gemini"?dp(r):r,sessionId:t,stopReason:n});return{setSessionId(a){t=a},beginTurn(){r="",n="",s=!1,i=!0},completeTurn(a){return n=up(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 cp,IN,NN,xN,AN,RN,Il=T(()=>{"use strict";cp="(?:png|jpe?g|webp|heic|pdf)",IN=new RegExp(`\\bSTANCE:\\s*\\S+_\\d{6,}\\.${cp}\\s*`,"gi"),NN=new RegExp(`^ACK:\\s*waiting for explicit lmctl task\\.\\d{6,}\\.${cp}\\s*`,"i"),xN=/^ACK:\s*waiting for explicit lmctl task[._]?\s*/i,AN=/^STANCE:\s+\S+\s*$/gim,RN=/\[Thought:\s*true\]\s*/gi});import{spawn as ON}from"node:child_process";import{existsSync as $N}from"node:fs";import{createInterface as CN}from"node:readline";function MN(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
- ${r}`:r}function fp(e,t){let r=j0[t.tool];return r?new Promise((n,s)=>{let i=t.binaryPath||r.binary;if(t.tool==="opencode")try{ui(t.cwd)}catch(y){H({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=tr("gemini","plan"),w=tr("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.
1384
+ ${r}`:r}function fp(e,t){let r=jN[t.tool];return r?new Promise((n,s)=>{let i=t.binaryPath||r.binary;if(t.tool==="opencode")try{ui(t.cwd)}catch(y){H({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=tr("gemini","plan"),w=tr("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{ot(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&&!O0(t.cwd))return H({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=$0(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,H({event:"transport_abort",provider:t.tool,phase:"pre_spawn"}),it(c).catch(()=>{}),s(new Error("Aborted"));t.signal.addEventListener("abort",()=>{u=!0,H({event:"transport_abort",provider:t.tool,elapsed_ms:Date.now()-d}),it(c).catch(()=>{}),s(new Error("Aborted"))},{once:!0})}let f=C0({input:c.stdout}),m=new Map,p=t.sessionId||"",h=kl({tool:t.tool,onDelta:t.onDelta});h.setSessionId(p);function g(y,w={}){return new Promise((I,x)=>{let U=D0++;m.set(U,{resolve:I,reject:x});let ue=JSON.stringify({jsonrpc:"2.0",id:U,method:y,params:w});Ae({event:"acp_send",direction:"SEND",provider:t.tool,method:y,id:U,params:w}),c.stdin?.write(ue+`
1386
+ `),t.cwd&&!$N(t.cwd))return H({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=ON(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,H({event:"transport_abort",provider:t.tool,phase:"pre_spawn"}),it(c).catch(()=>{}),s(new Error("Aborted"));t.signal.addEventListener("abort",()=>{u=!0,H({event:"transport_abort",provider:t.tool,elapsed_ms:Date.now()-d}),it(c).catch(()=>{}),s(new Error("Aborted"))},{once:!0})}let f=CN({input:c.stdout}),m=new Map,p=t.sessionId||"",h=kl({tool:t.tool,onDelta:t.onDelta});h.setSessionId(p);function g(y,w={}){return new Promise((I,x)=>{let U=DN++;m.set(U,{resolve:I,reject:x});let ue=JSON.stringify({jsonrpc:"2.0",id:U,method:y,params:w});Ae({event:"acp_send",direction:"SEND",provider:t.tool,method:y,id:U,params:w}),c.stdin?.write(ue+`
1387
1387
  `)})}f.on("line",y=>{let w;try{w=JSON.parse(y)}catch{return}if(Ae({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(ai(`ACP RPC error: ${ue}`,U))}else x.resolve(w);return}let I=w.method;if(I){if(typeof w.id=="number"){H({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)`}});Ae({event:"acp_send",direction:"SEND",provider:t.tool,replyTo:w.id,error:"method not found"}),c.stdin?.write(x+`
1388
- `);return}h.processMessage(w)}});let _="";c.stderr?.on("data",y=>{_+=y.toString()}),c.on("error",y=>{H({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=h.finalize();w!==null?n({result:w.result,sessionId:w.sessionId,durationMs:Date.now()-d,stopReason:w.stopReason,exitCode:y}):(H({event:"transport_error",provider:t.tool,error_class:"Error",reason:"provider_no_result",exit_code:y,stderr_tail:_.slice(0,500),elapsed_ms:Date.now()-d}),s(new Error(M0({tool:t.tool,exitCode:y,stderr:_}))))});function S(y,w={}){let I=JSON.stringify({jsonrpc:"2.0",method:y,params:w});c.stdin?.write(I+`
1388
+ `);return}h.processMessage(w)}});let _="";c.stderr?.on("data",y=>{_+=y.toString()}),c.on("error",y=>{H({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=h.finalize();w!==null?n({result:w.result,sessionId:w.sessionId,durationMs:Date.now()-d,stopReason:w.stopReason,exitCode:y}):(H({event:"transport_error",provider:t.tool,error_class:"Error",reason:"provider_no_result",exit_code:y,stderr_tail:_.slice(0,500),elapsed_ms:Date.now()-d}),s(new Error(MN({tool:t.tool,exitCode:y,stderr:_}))))});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=Yn(I,t.sessionId),h.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=Yn(x),h.setSessionId(p)}else{let I=await g("session/new",{cwd:t.cwd,mcpServers:[]});p=Yn(I),h.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
- `)}h.beginTurn(),wt(`acp: prompt sent (${e.length} chars)`);let y=await g("session/prompt",{sessionId:p,prompt:[{type:"text",text:e}]}),w=h.completeTurn(y);wt(`acp: result received (${w.result.length} chars, stopReason=${w.stopReason})`),c.stdin?.end()}catch(y){it(c).catch(()=>{}),s(y instanceof Error?y:new Error(String(y)))}})()}):Promise.reject(new Error(`No ACP config for tool "${t.tool}"`))}var j0,D0,mp=T(()=>{"use strict";he();Yr();li();zr();fi();he();st();Il();Il();j0={gemini:{binary:"gemini",args:["--acp","-y","--skip-trust"]},copilot:{binary:"copilot",args:["--acp","--yolo"]},opencode:{binary:"opencode",args:["acp"]}},D0=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 pp(e,t){return r=>{if(r.kind==="tool_use"&&typeof r.id=="string"){if(e.size>=P0){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 F0(){let e=new Map;return(t,r)=>{U0(t,pp(e,r))}}function U0(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
+ `)}h.beginTurn(),wt(`acp: prompt sent (${e.length} chars)`);let y=await g("session/prompt",{sessionId:p,prompt:[{type:"text",text:e}]}),w=h.completeTurn(y);wt(`acp: result received (${w.result.length} chars, stopReason=${w.stopReason})`),c.stdin?.end()}catch(y){it(c).catch(()=>{}),s(y instanceof Error?y:new Error(String(y)))}})()}):Promise.reject(new Error(`No ACP config for tool "${t.tool}"`))}var jN,DN,mp=T(()=>{"use strict";he();Yr();li();zr();fi();he();st();Il();Il();jN={gemini:{binary:"gemini",args:["--acp","-y","--skip-trust"]},copilot:{binary:"copilot",args:["--acp","--yolo"]},opencode:{binary:"opencode",args:["acp"]}},DN=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 pp(e,t){return r=>{if(r.kind==="tool_use"&&typeof r.id=="string"){if(e.size>=PN){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 FN(){let e=new Map;return(t,r)=>{UN(t,pp(e,r))}}function UN(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 mi(e,t){let r=t.binary==="qwen"?"qwen":"claude",n=t.onProgress?F0():void 0,s=await zm(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 W0(){let e=new Map;return(t,r)=>{B0(t,pp(e,r))}}function B0(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"&&Ae({event:"model_ignored",provider:r,model:t.model,reason:"copilot --acp does not implement per-session model selection"});let n=t.onProgress?W0():void 0,s=await fp(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 q0(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 mi(e,t){let r=t.binary==="qwen"?"qwen":"claude",n=t.onProgress?FN():void 0,s=await zm(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 WN(){let e=new Map;return(t,r)=>{BN(t,pp(e,r))}}function BN(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"&&Ae({event:"model_ignored",provider:r,model:t.model,reason:"copilot --acp does not implement per-session model selection"});let n=t.onProgress?WN():void 0,s=await fp(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 qN(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 _p(e,t){let r=await tp(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=>q0(n,t.onProgress):void 0,signal:t.signal});return{text:r.result,sessionId:r.threadId,durationMs:r.durationMs}}var P0,kr=T(()=>{"use strict";Zm();rp();mp();he();P0=256});function xl(e){return new Nl(e)}var Nl,Al=T(()=>{"use strict";Um();Pt();kr();Tt();Nl=class extends xe{constructor(t){super({provider:new ni(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"claude",seedArgs:["-p",ge,"--dangerously-skip-permissions"],resumeTemplate:"claude --resume {{session_id}}",startTemplate:"claude",transport:mi})}seedArgsFor(t){let r=super.seedArgsFor(t);return t?.model?[...r,"--model",t.model]:r}}});import{readdir as H0,stat as hp,unlink as J0}from"node:fs/promises";import{join as zn,basename as X0}from"node:path";function G0(e,t,r){return`${e}|${t.toISOString()}|${r}`}function Zn(e,t,r){let n=G0(r.role,r.timestamp,r.content);t.has(n)||(t.add(n),e.push(r))}function gp(e,t){return t==="exec"||e==="codex_exec"?"codex exec":"codex"}function V0(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 pi(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 pi(r)}).filter(r=>r.length>0).join(`
1397
- `);try{return JSON.stringify(e)}catch{return String(e)}}async function yp(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=V0(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 _i,wp=T(()=>{"use strict";Qt();_i=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 hp(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 H0(t)}catch{return r}for(let s of n){let i=zn(t,s),o=await hp(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=X0(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 h=p.payload.message||p.payload.text;h&&(c||(c=J(h.trim(),80)),d=J(h.trim(),80))}if(p.type==="response_item"&&p.payload?.type==="message"&&p.payload.role==="user"&&p.payload.content){let h=p.payload.content.find(g=>g.type==="input_text"&&typeof g.text=="string"&&g.text);typeof h?.text=="string"&&(c||(c=J(h.text.trim(),80)),d=J(h.text.trim(),80))}}if(!i)return null;let m=await yp(t);return{provider:"codex",sessionId:s,cwd:i,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:o,startCommand:gp(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 h of We(r)){let g=h.timestamp?new Date(h.timestamp):new Date;if(h.type==="session_meta"&&h.payload){h.payload.id&&(u=h.payload.id),h.payload.cwd&&(i=h.payload.cwd),h.payload.cli_version&&(o=h.payload.cli_version),h.payload.timestamp&&(l=new Date(h.payload.timestamp)),f=gp(h.payload.originator,h.payload.source);continue}if(h.type==="turn_context"&&h.payload){h.payload.model&&(a=h.payload.model),!i&&h.payload.cwd&&(i=h.payload.cwd);continue}if(h.type==="response_item"&&h.payload){let _=h.payload;if(_.type==="message"){if(_.role==="user"&&_.content){for(let S of _.content)if(S.type==="input_text"&&typeof S.text=="string"&&S.text){let y=S.text.trim();c||(c=J(y,80)),d=J(y,80),Zn(s,m,{role:"user",timestamp:g,content:fe(y)})}continue}if(_.role==="assistant"&&_.content){for(let S of _.content)S.type==="output_text"&&typeof S.text=="string"&&S.text&&Zn(s,m,{role:"assistant",timestamp:g,content:fe(S.text),model:a});continue}if(_.role!=="user"&&_.role!=="assistant"&&_.content){for(let S of _.content)(S.type==="input_text"||S.type==="output_text")&&typeof S.text=="string"&&S.text&&Zn(s,m,{role:"system",timestamp:g,content:fe(S.text.trim())});continue}}if(_.type==="function_call"){s.push({role:"tool_use",timestamp:g,content:_.name||"unknown tool",toolName:_.name,toolInput:_.arguments!==void 0?fe(pi(_.arguments)):void 0,toolCallId:_.call_id});continue}if(_.type==="function_call_output"){s.push({role:"tool_result",timestamp:g,content:fe(pi(_.output)),toolCallId:_.call_id});continue}if(_.type==="reasoning"&&_.summary){let S=_.summary.map(y=>pi(y.text)).join(`
1398
- `);S.trim()&&Zn(s,m,{role:"thinking",timestamp:g,content:fe(S)});continue}}if(h.type==="event_msg"&&h.payload&&h.payload.type==="agent_reasoning"){let _=h.payload.message||h.payload.text;_&&Zn(s,m,{role:"thinking",timestamp:g,content:fe(_)})}}if(!i)return null;let p=await yp(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 J0(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 Ll(e){return new Rl(e)}var Rl,$l=T(()=>{"use strict";wp();Pt();kr();Tt();Rl=class extends xe{constructor(t){super({provider:new _i(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:`${ge}
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 _p(e,t){let r=await tp(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=>qN(n,t.onProgress):void 0,signal:t.signal});return{text:r.result,sessionId:r.threadId,durationMs:r.durationMs}}var PN,kr=T(()=>{"use strict";Zm();rp();mp();he();PN=256});function xl(e){return new Nl(e)}var Nl,Al=T(()=>{"use strict";Um();Pt();kr();Tt();Nl=class extends xe{constructor(t){super({provider:new ni(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"claude",seedArgs:["-p",ge,"--dangerously-skip-permissions"],resumeTemplate:"claude --resume {{session_id}}",startTemplate:"claude",transport:mi})}seedArgsFor(t){let r=super.seedArgsFor(t);return t?.model?[...r,"--model",t.model]:r}}});import{readdir as HN,stat as hp,unlink as JN}from"node:fs/promises";import{join as zn,basename as XN}from"node:path";function GN(e,t,r){return`${e}|${t.toISOString()}|${r}`}function Zn(e,t,r){let n=GN(r.role,r.timestamp,r.content);t.has(n)||(t.add(n),e.push(r))}function gp(e,t){return t==="exec"||e==="codex_exec"?"codex exec":"codex"}function VN(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 pi(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 pi(r)}).filter(r=>r.length>0).join(`
1397
+ `);try{return JSON.stringify(e)}catch{return String(e)}}async function yp(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=VN(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 _i,wp=T(()=>{"use strict";Qt();_i=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 hp(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 HN(t)}catch{return r}for(let s of n){let i=zn(t,s),o=await hp(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=XN(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 h=p.payload.message||p.payload.text;h&&(c||(c=J(h.trim(),80)),d=J(h.trim(),80))}if(p.type==="response_item"&&p.payload?.type==="message"&&p.payload.role==="user"&&p.payload.content){let h=p.payload.content.find(g=>g.type==="input_text"&&typeof g.text=="string"&&g.text);typeof h?.text=="string"&&(c||(c=J(h.text.trim(),80)),d=J(h.text.trim(),80))}}if(!i)return null;let m=await yp(t);return{provider:"codex",sessionId:s,cwd:i,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:o,startCommand:gp(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 h of We(r)){let g=h.timestamp?new Date(h.timestamp):new Date;if(h.type==="session_meta"&&h.payload){h.payload.id&&(u=h.payload.id),h.payload.cwd&&(i=h.payload.cwd),h.payload.cli_version&&(o=h.payload.cli_version),h.payload.timestamp&&(l=new Date(h.payload.timestamp)),f=gp(h.payload.originator,h.payload.source);continue}if(h.type==="turn_context"&&h.payload){h.payload.model&&(a=h.payload.model),!i&&h.payload.cwd&&(i=h.payload.cwd);continue}if(h.type==="response_item"&&h.payload){let _=h.payload;if(_.type==="message"){if(_.role==="user"&&_.content){for(let S of _.content)if(S.type==="input_text"&&typeof S.text=="string"&&S.text){let y=S.text.trim();c||(c=J(y,80)),d=J(y,80),Zn(s,m,{role:"user",timestamp:g,content:fe(y)})}continue}if(_.role==="assistant"&&_.content){for(let S of _.content)S.type==="output_text"&&typeof S.text=="string"&&S.text&&Zn(s,m,{role:"assistant",timestamp:g,content:fe(S.text),model:a});continue}if(_.role!=="user"&&_.role!=="assistant"&&_.content){for(let S of _.content)(S.type==="input_text"||S.type==="output_text")&&typeof S.text=="string"&&S.text&&Zn(s,m,{role:"system",timestamp:g,content:fe(S.text.trim())});continue}}if(_.type==="function_call"){s.push({role:"tool_use",timestamp:g,content:_.name||"unknown tool",toolName:_.name,toolInput:_.arguments!==void 0?fe(pi(_.arguments)):void 0,toolCallId:_.call_id});continue}if(_.type==="function_call_output"){s.push({role:"tool_result",timestamp:g,content:fe(pi(_.output)),toolCallId:_.call_id});continue}if(_.type==="reasoning"&&_.summary){let S=_.summary.map(y=>pi(y.text)).join(`
1398
+ `);S.trim()&&Zn(s,m,{role:"thinking",timestamp:g,content:fe(S)});continue}}if(h.type==="event_msg"&&h.payload&&h.payload.type==="agent_reasoning"){let _=h.payload.message||h.payload.text;_&&Zn(s,m,{role:"thinking",timestamp:g,content:fe(_)})}}if(!i)return null;let p=await yp(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 JN(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 Ll(e){return new Rl(e)}var Rl,Ol=T(()=>{"use strict";wp();Pt();kr();Tt();Rl=class extends xe{constructor(t){super({provider:new _i(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:`${ge}
1399
1399
  `,resumeTemplate:"codex resume {{session_id}}",startTemplate:"codex",transport:_p})}seedArgsFor(t){let r=super.seedArgsFor(t);return t?.model?[...r.slice(0,-1),"--model",t.model,r[r.length-1]]:r}}});function Qn(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 hi(e){let t=Qn(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
- `).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?K0(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 K0(e,t){for(let[r,n]of Object.entries(t))if(n!==void 0){if(r==="tokens"&&Ep(e.tokens)&&Ep(n)){e.tokens={...e.tokens,...n};continue}e[r]=n}}function Ep(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Tp(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(`
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?KN(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 KN(e,t){for(let[r,n]of Object.entries(t))if(n!==void 0){if(r==="tokens"&&Ep(e.tokens)&&Ep(n)){e.tokens={...e.tokens,...n};continue}e[r]=n}}function Ep(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Tp(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 Y0}from"node:crypto";import{readdir as es,readFile as bp,stat as gi,unlink as z0}from"node:fs/promises";import{join as Xe,basename as Z0,dirname as Q0}from"node:path";import{cwd as eN}from"node:process";function Sp(e){return e?typeof e=="string"?e:Array.isArray(e)?e.map(t=>t.text||"").join(""):"":""}function vp(e){return e==="user"}function Cl(e){return e==="gemini"||e==="assistant"}function Ir(e,t=new Date(0)){if(!e)return t;let r=new Date(e);return Number.isNaN(r.getTime())?t:r}function tN(e){return`${e.sessionId}\0${e.cwd}`}function rN(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 yi(e){let t=Number(e??0);return Number.isFinite(t)?Math.max(0,Math.round(t)):0}function kp(e){let t=0,r=0,n=0,s=0,i=0,o;for(let a of e){if(!Cl(a.type)||!a.tokens)continue;let l=yi(a.tokens.input),c=yi(a.tokens.cached),d=Math.max(l-c,0),u=yi(a.tokens.output),f=yi(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 nN(e){return Y0("sha256").update(e).digest("hex")}function ts(e,t){let r=t;for(;r&&!e.has(r);){e.add(r);let n=Q0(r);if(n===r)break;r=n}}var wi,Ip=T(()=>{"use strict";Qt();Ol();he();wi=class{name="gemini";workspaceHashMap;geminiProjectsFile;geminiTmpDir;claudeProjectsDir;codexSessionDirs;extraWorkspacePaths;constructor(t={}){let r=t.geminiDir||Xe(be,".gemini");this.geminiProjectsFile=Xe(r,"projects.json"),this.geminiTmpDir=Xe(r,"tmp");let n=t.claudeDir||Xe(be,".claude");this.claudeProjectsDir=Xe(n,"projects");let s=[Xe(be,".codex"),Xe(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=>Xe(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=tN(s),o=r.get(i);r.set(i,o?rN(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 _=Ir(g.timestamp),S=g.type,y=fe(Sp(g.content));if(vp(S)){let I=y.trim();I&&(d||(d=J(I,80)),u=J(I,80)),i.push({role:"user",timestamp:_,content:I||y});continue}if(Cl(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:Ir(I.timestamp,_),content:fe(x)})}i.push({role:"assistant",timestamp:_,content:y,model:g.model});continue}let w=S?`[${S}] `:"";i.push({role:"system",timestamp:_,content:`${w}${y}`.trim()})}let m=Ir(n.startTime,s.createdAt),p=Ir(n.lastUpdated,s.modifiedAt),h=kp(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:h.totalInputTokens||void 0,totalCachedInputTokens:h.totalCachedInputTokens||void 0,totalOutputTokens:h.totalOutputTokens||void 0,totalReasoningOutputTokens:h.totalReasoningOutputTokens||void 0,lastInputTokens:h.lastInputTokens||void 0,lastTokenUsage:h.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(vp(m.type)){u++;let p=Sp(m.content).trim();p&&(l||(l=J(fe(p),80)),c=J(fe(p),80))}else Cl(m.type)&&(u++,m.model&&(d=m.model));let f=kp(s);return{provider:"gemini",sessionId:i,cwd:a,createdAt:Ir(r.startTime,n.createdAt),modifiedAt:Ir(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 bp(t,"utf-8");if(Qn(r)==="unknown")return H({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 hi(r)}catch{return null}}extractSessionIdFromFilename(t){let r=Z0(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 es(this.geminiTmpDir)}catch{return t}for(let n of r){let s=Xe(this.geminiTmpDir,n,"chats");if(!(await gi(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await es(s)}catch{continue}for(let a of o)a.startsWith("session-")&&(!a.endsWith(".json")&&!a.endsWith(".jsonl")||t.push(Xe(s,a)))}return t}async resolveSessionPath(t){return this.resolveSessionFile(t)}async deleteSession(t){let r=await this.resolveSessionFile(t);return r?(await z0(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:Ir(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;ts(t,eN());for(let n of this.extraWorkspacePaths)ts(t,n);for(let n of await this.collectGeminiProjectPaths())ts(t,n);for(let n of await this.collectCodexCwds())ts(t,n);for(let n of await this.collectClaudeCwds())ts(t,n);let r=new Map;for(let n of t)r.set(nN(n),n);return this.workspaceHashMap=r,r}async collectGeminiProjectPaths(){let t;try{t=await bp(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 es(this.claudeProjectsDir)}catch{return[]}for(let n of r){let s=Xe(this.claudeProjectsDir,n);if(!(await gi(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await es(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=Xe(s,a),d=(await Ce(l,1).catch(()=>[]))[0]?.cwd;d&&t.add(d)}}return[...t]}async findJsonlFiles(t){let r=[];if(!(await gi(t).catch(()=>null))?.isDirectory())return r;let s;try{s=await es(t)}catch{return r}for(let i of s){let o=Xe(t,i),a=await gi(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 sN,writeFileSync as iN,mkdirSync as oN}from"node:fs";import{join as aN,dirname as lN}from"node:path";import{randomUUID as cN}from"node:crypto";function jl(e){return new Ml(e)}var Ml,Dl=T(()=>{"use strict";Ip();Pt();kr();Tt();Ol();Ml=class extends xe{constructor(t){super({provider:new wi(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",ge,"-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
- `)}seedArgsFor(t){let r=super.seedArgsFor(t);return t?.model?[...r,"--model",t.model]:r}manualSeedHint(t){return{launchCommand:`cd ${t} && gemini --skip-trust`,postLaunchNote:ii,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=sN(n,"utf-8"),i=Qn(s),o=hi(s),a=cN();o.sessionId=a,o.kind="main";let l=lN(n),c=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),d=i==="jsonl"?".jsonl":".json",u=`session-${c}-${a.slice(0,8)}${d}`,f=aN(l,u);return oN(l,{recursive:!0}),iN(f,Tp(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 Np,readFile as dN,rm as uN,stat as Qr}from"node:fs/promises";import{basename as fN,join as at}from"node:path";function mN(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 Nr(e){if(!e)return;let t=new Date(e);return Number.isNaN(t.getTime())?void 0:t}async function pN(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 Ei,xp=T(()=>{"use strict";Qt();Ei=class{name="copilot";sessionStateDir;constructor(t={}){let r=t.copilotDir||at(be,".copilot");this.sessionStateDir=at(r,"session-state")}getWatchPaths(){return[{directory:this.sessionStateDir,filePattern:/events\.jsonl$/}]}async discoverSessions(){let t=[],r;try{r=await Np(this.sessionStateDir)}catch{return t}for(let n of r){let s=at(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=at(r,"events.jsonl"),i=await Qr(s).catch(()=>null),o=i?s:at(r,"workspace.yaml"),a=await Ne(i?s:r),l=[],c=n?.cwd||"(unknown workspace)",d,u,f,m,p,h,g=n?.id||fN(r)||t;if(i)for await(let _ of We(s)){let S=Nr(_.timestamp)||a.modifiedAt;if(_.type==="session.start"&&_.data){_.data.sessionId&&(g=_.data.sessionId),_.data.copilotVersion&&(u=_.data.copilotVersion),_.data.startTime&&(h=Nr(_.data.startTime)),_.data.selectedModel&&(d=_.data.selectedModel),_.data.context&&(_.data.context.cwd&&(c=_.data.context.cwd),_.data.context.branch&&(f=_.data.context.branch));continue}if(_.type==="session.model_change"&&_.data?.newModel){d=_.data.newModel;continue}if(_.type==="user.message"&&_.data){let y=_.data.content||"",w=y.trim();w&&(m||(m=J(w,80)),p=J(w,80)),l.push({role:"user",timestamp:S,content:fe(w||y)});continue}if(_.type==="assistant.message"&&_.data){let y=(_.data.content||"").trim();if(y&&l.push({role:"assistant",timestamp:S,content:fe(y),model:d}),_.data.toolRequests)for(let w of _.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(_.type==="tool.execution_complete"&&_.data){let y=_.data.result?.content||"",w=_.data.result?.detailedContent||"";l.push({role:"tool_result",timestamp:S,content:fe(y),toolDetailedContent:w?fe(w):void 0,toolCallId:_.data.toolCallId});continue}if(_.type==="assistant.reasoning"&&_.data?.content){l.push({role:"thinking",timestamp:S,content:fe(_.data.content)});continue}if(_.type==="session.error"||_.type==="session.warning"||_.type==="session.info"||_.type==="system.message"){let y=_.data?.message||"";y.trim()&&l.push({role:"system",timestamp:S,content:fe(y)});continue}}if(!m){let _=(n?.summary||"").trim();_&&(m=J(_,80))}return{provider:"copilot",sessionId:g,cwd:c,createdAt:h??Nr(n?.created_at)??a.createdAt,modifiedAt:Nr(n?.updated_at)??a.modifiedAt,model:d,cliVersion:u,startCommand:"copilot",gitBranch:f,firstUserMessage:m,lastUserMessage:p,messageCount:l.filter(_=>_.role==="user"||_.role==="assistant").length,filePath:o,messages:l}}async extractSummary(t,r){let n=await this.readWorkspaceYaml(t),s=at(t,"events.jsonl"),i=await Qr(s).catch(()=>null),o=i?s:at(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,h;for(let _ of l)if(_.type==="session.start"&&_.data&&(_.data.sessionId&&(c=_.data.sessionId),_.data.copilotVersion&&(f=_.data.copilotVersion),_.data.startTime&&(m=Nr(_.data.startTime)),_.data.selectedModel&&(u=_.data.selectedModel),_.data.context?.cwd&&(d=_.data.context.cwd)),_.type==="session.model_change"&&_.data?.newModel&&(u||(u=_.data.newModel)),_.type==="user.message"&&_.data){let S=(_.data.content||"").trim();S&&(p||(p=J(S,80)),h=J(S,80))}if(!p){let _=(n?.summary||"").trim();_&&(p=J(_,80))}let g=i?await pN(s):0;return{provider:"copilot",sessionId:c,cwd:d,createdAt:m??Nr(n?.created_at)??a.createdAt,modifiedAt:Nr(n?.updated_at)??a.modifiedAt,model:u,cliVersion:f,startCommand:"copilot",firstUserMessage:p,lastUserMessage:h,messageCount:g,filePath:o}}async readWorkspaceYaml(t){let r=at(t,"workspace.yaml");try{let n=await dN(r,"utf-8");return mN(n)}catch{return null}}async resolveSessionPath(t){return this.resolveSessionDir(t)}async deleteSession(t){let r=await this.resolveSessionDir(t);return r?(await uN(r,{recursive:!0}),!0):!1}async resolveSessionDir(t){let r;try{r=await Np(this.sessionStateDir)}catch{return null}if(r.includes(t)){let s=at(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=at(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=at(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 Fl(e){return new Pl(e)}var Pl,Ul=T(()=>{"use strict";xp();Pt();kr();he();Tt();Pl=class extends xe{constructor(t){super({provider:new Ei(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"copilot",seedArgs:["-p",ge,"--yolo"],resumeTemplate:"copilot --resume={{session_id}}",startTemplate:"copilot",transport:(r,n)=>Zr(r,{...n,acpTool:"copilot"})})}async seed(t,r){let n=await super.seed(t,r);if(r?.model===void 0||r.model.trim().length===0)return n;let s="copilot seed does not implement per-session model selection";return Ae({event:"model_ignored",provider:"copilot",model:r.model,reason:s}),{...n,warnings:[...n.warnings??[],`copilot seed ignored model=${r.model}: ${s}`]}}}});import{existsSync as Ap,readdirSync as _N,statSync as Rp}from"node:fs";import{join as nr}from"node:path";import{createRequire as hN}from"node:module";function Lp(){return Wl===null&&(Wl=hN(import.meta.url)("node:sqlite").DatabaseSync),Wl}function gN(){let e=process.env.XDG_DATA_HOME||nr(be,".local","share"),t=process.env.XDG_CONFIG_HOME||nr(be,".config");return[nr(e,"opencode","opencode.db"),nr(t,"opencode","opencode.db")]}function yN(){if(process.env.OPENCODE_DB)return[process.env.OPENCODE_DB];let e=process.env.XDG_DATA_HOME||nr(be,".local","share"),t=nr(e,"lmplayer"),r=nr(t,"opencode-local.db"),n=[r];try{let s=_N(t).filter(i=>/^opencode.*\.db$/u.test(i)).map(i=>nr(t,i)).filter(i=>i!==r).sort((i,o)=>{try{return Rp(o).mtimeMs-Rp(i).mtimeMs}catch{return 0}});n.push(...s)}catch{}return n}function wN(e){return e==="lmplayer"?yN():gN()}var Wl,en,Bl=T(()=>{"use strict";Qt();Wl=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=wN(this.name)}existingDbPaths(){return this.dbPaths.filter(t=>Ap(t))}openDb(t){return Ap(t)?new(Lp())(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,
1402
+ `}var $l=T(()=>{"use strict"});import{createHash as YN}from"node:crypto";import{readdir as es,readFile as bp,stat as gi,unlink as zN}from"node:fs/promises";import{join as Xe,basename as ZN,dirname as QN}from"node:path";import{cwd as e0}from"node:process";function Sp(e){return e?typeof e=="string"?e:Array.isArray(e)?e.map(t=>t.text||"").join(""):"":""}function vp(e){return e==="user"}function Cl(e){return e==="gemini"||e==="assistant"}function Ir(e,t=new Date(0)){if(!e)return t;let r=new Date(e);return Number.isNaN(r.getTime())?t:r}function t0(e){return`${e.sessionId}\0${e.cwd}`}function r0(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 yi(e){let t=Number(e??0);return Number.isFinite(t)?Math.max(0,Math.round(t)):0}function kp(e){let t=0,r=0,n=0,s=0,i=0,o;for(let a of e){if(!Cl(a.type)||!a.tokens)continue;let l=yi(a.tokens.input),c=yi(a.tokens.cached),d=Math.max(l-c,0),u=yi(a.tokens.output),f=yi(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 n0(e){return YN("sha256").update(e).digest("hex")}function ts(e,t){let r=t;for(;r&&!e.has(r);){e.add(r);let n=QN(r);if(n===r)break;r=n}}var wi,Ip=T(()=>{"use strict";Qt();$l();he();wi=class{name="gemini";workspaceHashMap;geminiProjectsFile;geminiTmpDir;claudeProjectsDir;codexSessionDirs;extraWorkspacePaths;constructor(t={}){let r=t.geminiDir||Xe(be,".gemini");this.geminiProjectsFile=Xe(r,"projects.json"),this.geminiTmpDir=Xe(r,"tmp");let n=t.claudeDir||Xe(be,".claude");this.claudeProjectsDir=Xe(n,"projects");let s=[Xe(be,".codex"),Xe(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=>Xe(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=t0(s),o=r.get(i);r.set(i,o?r0(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 _=Ir(g.timestamp),S=g.type,y=fe(Sp(g.content));if(vp(S)){let I=y.trim();I&&(d||(d=J(I,80)),u=J(I,80)),i.push({role:"user",timestamp:_,content:I||y});continue}if(Cl(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:Ir(I.timestamp,_),content:fe(x)})}i.push({role:"assistant",timestamp:_,content:y,model:g.model});continue}let w=S?`[${S}] `:"";i.push({role:"system",timestamp:_,content:`${w}${y}`.trim()})}let m=Ir(n.startTime,s.createdAt),p=Ir(n.lastUpdated,s.modifiedAt),h=kp(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:h.totalInputTokens||void 0,totalCachedInputTokens:h.totalCachedInputTokens||void 0,totalOutputTokens:h.totalOutputTokens||void 0,totalReasoningOutputTokens:h.totalReasoningOutputTokens||void 0,lastInputTokens:h.lastInputTokens||void 0,lastTokenUsage:h.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(vp(m.type)){u++;let p=Sp(m.content).trim();p&&(l||(l=J(fe(p),80)),c=J(fe(p),80))}else Cl(m.type)&&(u++,m.model&&(d=m.model));let f=kp(s);return{provider:"gemini",sessionId:i,cwd:a,createdAt:Ir(r.startTime,n.createdAt),modifiedAt:Ir(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 bp(t,"utf-8");if(Qn(r)==="unknown")return H({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 hi(r)}catch{return null}}extractSessionIdFromFilename(t){let r=ZN(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 es(this.geminiTmpDir)}catch{return t}for(let n of r){let s=Xe(this.geminiTmpDir,n,"chats");if(!(await gi(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await es(s)}catch{continue}for(let a of o)a.startsWith("session-")&&(!a.endsWith(".json")&&!a.endsWith(".jsonl")||t.push(Xe(s,a)))}return t}async resolveSessionPath(t){return this.resolveSessionFile(t)}async deleteSession(t){let r=await this.resolveSessionFile(t);return r?(await zN(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:Ir(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;ts(t,e0());for(let n of this.extraWorkspacePaths)ts(t,n);for(let n of await this.collectGeminiProjectPaths())ts(t,n);for(let n of await this.collectCodexCwds())ts(t,n);for(let n of await this.collectClaudeCwds())ts(t,n);let r=new Map;for(let n of t)r.set(n0(n),n);return this.workspaceHashMap=r,r}async collectGeminiProjectPaths(){let t;try{t=await bp(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 es(this.claudeProjectsDir)}catch{return[]}for(let n of r){let s=Xe(this.claudeProjectsDir,n);if(!(await gi(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await es(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=Xe(s,a),d=(await Ce(l,1).catch(()=>[]))[0]?.cwd;d&&t.add(d)}}return[...t]}async findJsonlFiles(t){let r=[];if(!(await gi(t).catch(()=>null))?.isDirectory())return r;let s;try{s=await es(t)}catch{return r}for(let i of s){let o=Xe(t,i),a=await gi(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 s0,writeFileSync as i0,mkdirSync as o0}from"node:fs";import{join as a0,dirname as l0}from"node:path";import{randomUUID as c0}from"node:crypto";function jl(e){return new Ml(e)}var Ml,Dl=T(()=>{"use strict";Ip();Pt();kr();Tt();$l();Ml=class extends xe{constructor(t){super({provider:new wi(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",ge,"-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
+ `)}seedArgsFor(t){let r=super.seedArgsFor(t);return t?.model?[...r,"--model",t.model]:r}manualSeedHint(t){return{launchCommand:`cd ${t} && gemini --skip-trust`,postLaunchNote:ii,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=s0(n,"utf-8"),i=Qn(s),o=hi(s),a=c0();o.sessionId=a,o.kind="main";let l=l0(n),c=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),d=i==="jsonl"?".jsonl":".json",u=`session-${c}-${a.slice(0,8)}${d}`,f=a0(l,u);return o0(l,{recursive:!0}),i0(f,Tp(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 Np,readFile as d0,rm as u0,stat as Qr}from"node:fs/promises";import{basename as f0,join as at}from"node:path";function m0(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 Nr(e){if(!e)return;let t=new Date(e);return Number.isNaN(t.getTime())?void 0:t}async function p0(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 Ei,xp=T(()=>{"use strict";Qt();Ei=class{name="copilot";sessionStateDir;constructor(t={}){let r=t.copilotDir||at(be,".copilot");this.sessionStateDir=at(r,"session-state")}getWatchPaths(){return[{directory:this.sessionStateDir,filePattern:/events\.jsonl$/}]}async discoverSessions(){let t=[],r;try{r=await Np(this.sessionStateDir)}catch{return t}for(let n of r){let s=at(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=at(r,"events.jsonl"),i=await Qr(s).catch(()=>null),o=i?s:at(r,"workspace.yaml"),a=await Ne(i?s:r),l=[],c=n?.cwd||"(unknown workspace)",d,u,f,m,p,h,g=n?.id||f0(r)||t;if(i)for await(let _ of We(s)){let S=Nr(_.timestamp)||a.modifiedAt;if(_.type==="session.start"&&_.data){_.data.sessionId&&(g=_.data.sessionId),_.data.copilotVersion&&(u=_.data.copilotVersion),_.data.startTime&&(h=Nr(_.data.startTime)),_.data.selectedModel&&(d=_.data.selectedModel),_.data.context&&(_.data.context.cwd&&(c=_.data.context.cwd),_.data.context.branch&&(f=_.data.context.branch));continue}if(_.type==="session.model_change"&&_.data?.newModel){d=_.data.newModel;continue}if(_.type==="user.message"&&_.data){let y=_.data.content||"",w=y.trim();w&&(m||(m=J(w,80)),p=J(w,80)),l.push({role:"user",timestamp:S,content:fe(w||y)});continue}if(_.type==="assistant.message"&&_.data){let y=(_.data.content||"").trim();if(y&&l.push({role:"assistant",timestamp:S,content:fe(y),model:d}),_.data.toolRequests)for(let w of _.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(_.type==="tool.execution_complete"&&_.data){let y=_.data.result?.content||"",w=_.data.result?.detailedContent||"";l.push({role:"tool_result",timestamp:S,content:fe(y),toolDetailedContent:w?fe(w):void 0,toolCallId:_.data.toolCallId});continue}if(_.type==="assistant.reasoning"&&_.data?.content){l.push({role:"thinking",timestamp:S,content:fe(_.data.content)});continue}if(_.type==="session.error"||_.type==="session.warning"||_.type==="session.info"||_.type==="system.message"){let y=_.data?.message||"";y.trim()&&l.push({role:"system",timestamp:S,content:fe(y)});continue}}if(!m){let _=(n?.summary||"").trim();_&&(m=J(_,80))}return{provider:"copilot",sessionId:g,cwd:c,createdAt:h??Nr(n?.created_at)??a.createdAt,modifiedAt:Nr(n?.updated_at)??a.modifiedAt,model:d,cliVersion:u,startCommand:"copilot",gitBranch:f,firstUserMessage:m,lastUserMessage:p,messageCount:l.filter(_=>_.role==="user"||_.role==="assistant").length,filePath:o,messages:l}}async extractSummary(t,r){let n=await this.readWorkspaceYaml(t),s=at(t,"events.jsonl"),i=await Qr(s).catch(()=>null),o=i?s:at(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,h;for(let _ of l)if(_.type==="session.start"&&_.data&&(_.data.sessionId&&(c=_.data.sessionId),_.data.copilotVersion&&(f=_.data.copilotVersion),_.data.startTime&&(m=Nr(_.data.startTime)),_.data.selectedModel&&(u=_.data.selectedModel),_.data.context?.cwd&&(d=_.data.context.cwd)),_.type==="session.model_change"&&_.data?.newModel&&(u||(u=_.data.newModel)),_.type==="user.message"&&_.data){let S=(_.data.content||"").trim();S&&(p||(p=J(S,80)),h=J(S,80))}if(!p){let _=(n?.summary||"").trim();_&&(p=J(_,80))}let g=i?await p0(s):0;return{provider:"copilot",sessionId:c,cwd:d,createdAt:m??Nr(n?.created_at)??a.createdAt,modifiedAt:Nr(n?.updated_at)??a.modifiedAt,model:u,cliVersion:f,startCommand:"copilot",firstUserMessage:p,lastUserMessage:h,messageCount:g,filePath:o}}async readWorkspaceYaml(t){let r=at(t,"workspace.yaml");try{let n=await d0(r,"utf-8");return m0(n)}catch{return null}}async resolveSessionPath(t){return this.resolveSessionDir(t)}async deleteSession(t){let r=await this.resolveSessionDir(t);return r?(await u0(r,{recursive:!0}),!0):!1}async resolveSessionDir(t){let r;try{r=await Np(this.sessionStateDir)}catch{return null}if(r.includes(t)){let s=at(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=at(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=at(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 Fl(e){return new Pl(e)}var Pl,Ul=T(()=>{"use strict";xp();Pt();kr();he();Tt();Pl=class extends xe{constructor(t){super({provider:new Ei(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"copilot",seedArgs:["-p",ge,"--yolo"],resumeTemplate:"copilot --resume={{session_id}}",startTemplate:"copilot",transport:(r,n)=>Zr(r,{...n,acpTool:"copilot"})})}async seed(t,r){let n=await super.seed(t,r);if(r?.model===void 0||r.model.trim().length===0)return n;let s="copilot seed does not implement per-session model selection";return Ae({event:"model_ignored",provider:"copilot",model:r.model,reason:s}),{...n,warnings:[...n.warnings??[],`copilot seed ignored model=${r.model}: ${s}`]}}}});import{existsSync as Ap,readdirSync as _0,statSync as Rp}from"node:fs";import{join as nr}from"node:path";import{createRequire as h0}from"node:module";function Lp(){return Wl===null&&(Wl=h0(import.meta.url)("node:sqlite").DatabaseSync),Wl}function g0(){let e=process.env.XDG_DATA_HOME||nr(be,".local","share"),t=process.env.XDG_CONFIG_HOME||nr(be,".config");return[nr(e,"opencode","opencode.db"),nr(t,"opencode","opencode.db")]}function y0(){if(process.env.OPENCODE_DB)return[process.env.OPENCODE_DB];let e=process.env.XDG_DATA_HOME||nr(be,".local","share"),t=nr(e,"lmplayer"),r=nr(t,"opencode-local.db"),n=[r];try{let s=_0(t).filter(i=>/^opencode.*\.db$/u.test(i)).map(i=>nr(t,i)).filter(i=>i!==r).sort((i,o)=>{try{return Rp(o).mtimeMs-Rp(i).mtimeMs}catch{return 0}});n.push(...s)}catch{}return n}function w0(e){return e==="lmplayer"?y0():g0()}var Wl,en,Bl=T(()=>{"use strict";Qt();Wl=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=w0(this.name)}existingDbPaths(){return this.dbPaths.filter(t=>Ap(t))}openDb(t){return Ap(t)?new(Lp())(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 fp(e,t){let r=j0[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 Hl(){return new ql}var ql,Jl=T(()=>{"use strict";Bl();Pt();kr();Tt();ql=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",ge],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??ge),r}}});import{spawn as EN}from"node:child_process";import{mkdirSync as TN}from"node:fs";function Gl(e){return new Xl(e)}async function bN(e,t){let r=Date.now(),n=$p({prompt:e,sessionId:t.sessionId,model:t.model,effort:t.effort,formatJson:!0,permissionMode:t.permissionMode??"yolo"});ot("lmplayer",n,t.permissionMode??"yolo");let s=await Op(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 $p(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(...tr("lmplayer",e.permissionMode)??[]),t.push(e.prompt),t}function Op(e,t,r){return new Promise((n,s)=>{let i;try{i=EN(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)},h=g=>{let _=g.trim();if(!_)return;let S;try{S=JSON.parse(_)}catch{u.push(g),r.onText?.(g);return}if(!bi(S))return;let y=Ti(S,!1);c===void 0&&y!==void 0&&(c=y),d=Ti(S,!0)??d;let w=Cp(S);w&&(u.push(w),r.onText?.(w))};i.stdout?.on("data",g=>{let _=g.toString("utf8");o+=_,l+=_;let S=l.indexOf(`
1418
+ LIMIT 2`).all(`${r}%`);return s.length!==1?null:s[0]}}});function Hl(){return new ql}var ql,Jl=T(()=>{"use strict";Bl();Pt();kr();Tt();ql=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",ge],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??ge),r}}});import{spawn as E0}from"node:child_process";import{mkdirSync as T0}from"node:fs";function Gl(e){return new Xl(e)}async function b0(e,t){let r=Date.now(),n=Op({prompt:e,sessionId:t.sessionId,model:t.model,effort:t.effort,formatJson:!0,permissionMode:t.permissionMode??"yolo"});ot("lmplayer",n,t.permissionMode??"yolo");let s=await $p(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 Op(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(...tr("lmplayer",e.permissionMode)??[]),t.push(e.prompt),t}function $p(e,t,r){return new Promise((n,s)=>{let i;try{i=E0(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)},h=g=>{let _=g.trim();if(!_)return;let S;try{S=JSON.parse(_)}catch{u.push(g),r.onText?.(g);return}if(!bi(S))return;let y=Ti(S,!1);c===void 0&&y!==void 0&&(c=y),d=Ti(S,!0)??d;let w=Cp(S);w&&(u.push(w),r.onText?.(w))};i.stdout?.on("data",g=>{let _=g.toString("utf8");o+=_,l+=_;let S=l.indexOf(`
1419
1419
  `);for(;S>=0;){let y=l.slice(0,S);l=l.slice(S+1),h(y),S=l.indexOf(`
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&&h(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 Cp(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(bi(r)){let n=Cp(r);if(n)return n}}}function Ti(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(bi(r)){let n=Ti(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(bi(s)){let i=Ti(s,t);if(i!==void 0)return i}}}function bi(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var Xl,Vl=T(()=>{"use strict";Bl();Pt();Tt();zr();st();Xl=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",ge],resumeTemplate:"lmplayer run --session {{session_id}} --dangerously-skip-permissions",startTemplate:"lmplayer run --dangerously-skip-permissions",transport:bN})}seedArgsFor(t){return $p({prompt:t?.prompt??ge,model:t?.model,effort:t?.effort,formatJson:!0,permissionMode:"yolo"})}async seed(t,r){TN(t,{recursive:!0});let n=this.seedArgsFor(r);ot("lmplayer",n);try{let s=await Op(this.binary,n,{cwd:t,env:er(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 "${ge}"`,postLaunchNote:"Copy the sessionID reported by lmplayer into this member's sessionid= field.",lsCommand:`lmctl ls --provider lmplayer --sessiondir ${t}`}}}});import{readdir as Si,readFile as SN,rm as vN}from"node:fs/promises";import{basename as Mp,join as sr}from"node:path";function jp(e){return e.type==="user"||e.message?.role==="user"}function Dp(e){return e.type==="assistant"||e.message?.role==="assistant"||e.message?.role==="model"}function Pp(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(`
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&&h(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 Cp(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(bi(r)){let n=Cp(r);if(n)return n}}}function Ti(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(bi(r)){let n=Ti(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(bi(s)){let i=Ti(s,t);if(i!==void 0)return i}}}function bi(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var Xl,Vl=T(()=>{"use strict";Bl();Pt();Tt();zr();st();Xl=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",ge],resumeTemplate:"lmplayer run --session {{session_id}} --dangerously-skip-permissions",startTemplate:"lmplayer run --dangerously-skip-permissions",transport:b0})}seedArgsFor(t){return Op({prompt:t?.prompt??ge,model:t?.model,effort:t?.effort,formatJson:!0,permissionMode:"yolo"})}async seed(t,r){T0(t,{recursive:!0});let n=this.seedArgsFor(r);ot("lmplayer",n);try{let s=await $p(this.binary,n,{cwd:t,env:er(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 "${ge}"`,postLaunchNote:"Copy the sessionID reported by lmplayer into this member's sessionid= field.",lsCommand:`lmctl ls --provider lmplayer --sessiondir ${t}`}}}});import{readdir as Si,readFile as S0,rm as v0}from"node:fs/promises";import{basename as Mp,join as sr}from"node:path";function jp(e){return e.type==="user"||e.message?.role==="user"}function Dp(e){return e.type==="assistant"||e.message?.role==="assistant"||e.message?.role==="model"}function Pp(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 Fp(e){return e.model||e.message?.model}var vi,Up=T(()=>{"use strict";Qt();vi=class{name="qwen";baseDir;constructor(t){this.baseDir=t?.qwenDir||sr(be,".qwen")}async discoverSessions(){let t=sr(this.baseDir,"projects"),r;try{r=await Si(t)}catch{return[]}let n=[];for(let s of r){let i=sr(t,s,"chats"),o;try{o=await Si(i)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),c=sr(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)),jp(u)){let f=Pp(u).trim();f&&(l||(l=J(f,80)),c=J(f,80)),d++}if(Dp(u)){let f=Fp(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=Mp(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(jp(f)){let h=Pp(f);h.trim()&&(c||(c=J(h.trim(),80)),d=J(h.trim(),80)),u.push({role:"user",timestamp:p,content:h})}else if(Dp(f)){let h=Fp(f);if(h&&(i=h),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:h}):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:h});else if(Array.isArray(m.parts))for(let g of m.parts)if(g.thought||g.type==="thinking"){let _=g.thinking||g.text;_&&u.push({role:"thinking",timestamp:p,content:_})}else g.text&&u.push({role:"assistant",timestamp:p,content:g.text,model:h})}}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=sr(this.baseDir,"projects");try{let n=await Si(r),s=[];for(let i of n){let o=sr(r,i,"chats",`${t}.jsonl`);try{return await SN(o,{flag:"r"}),o}catch{continue}}for(let i of n){let o=sr(r,i,"chats"),a;try{a=await Si(o)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;Mp(l,".jsonl").startsWith(t)&&s.push(sr(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 vN(r),!0}catch{return!1}}}});function Yl(){return new Kl}var Kl,zl=T(()=>{"use strict";Up();Pt();kr();Tt();Kl=class extends xe{constructor(){super({provider:new vi,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"qwen",seedArgs:["-p",ge,"--approval-mode","yolo"],resumeTemplate:"qwen --resume {{session_id}}",startTemplate:"qwen",transport:mi})}seedArgsFor(t){let r=super.seedArgsFor(t);return t?.model?[...r,"--model",t.model]:r}}});import{readdir as Wp,readFile as kN,rm as Bp,stat as qp}from"node:fs/promises";import{basename as Zl,join as Wt}from"node:path";async function IN(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 NN(e,t){if(!e)return t;let r=new Date(e);return Number.isNaN(r.getTime())?t:r}function Hp(e){return e.type==="USER_INPUT"}function Jp(e){return e.source==="MODEL"&&e.type==="PLANNER_RESPONSE"}function xN(e){return e.source==="MODEL"&&e.type!=="PLANNER_RESPONSE"}function Xp(e){if(!e)return"";let t=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(e);return t?t[1]:e}function Gp(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 AN(e){if(e===void 0)return"";try{return JSON.stringify(e)}catch{return String(e)}}async function RN(e){for await(let t of We(e)){let r=t.tool_calls?.map(s=>s.args)??[];for(let s of r){let i=LN(s);if(i)return i}let n=$N(t.content);if(n)return n}return null}function LN(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 $N(e){return e?/"Cwd":"([^"]+)"/.exec(e)?.[1]??null:null}function Vp(e){if(e.endsWith(".db"))return Zl(e,".db");let t="/brain/",r=e.indexOf(t);return r===-1?null:e.slice(r+t.length).split("/")[0]||null}var ki,Kp=T(()=>{"use strict";Qt();ki=class{name="agy";baseDir;constructor(t={}){this.baseDir=t.agyDir||Wt(be,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:Wt(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let t=Wt(this.baseDir,"conversations"),r;try{r=await Wp(t)}catch{return[]}let n=[];for(let s of r){if(!s.endsWith(".db"))continue;let i=Zl(s,".db");try{let o=await this.extractSummary(i);o&&n.push(o)}catch{}}return n}conversationPath(t){return Wt(this.baseDir,"conversations",`${t}.db`)}transcriptPath(t){return Wt(this.baseDir,"brain",t,".system_generated","logs","transcript.jsonl")}async existingTranscriptPath(t){let r=this.transcriptPath(t);try{return await qp(r),r}catch{return null}}async extractSummary(t){let r=this.conversationPath(t),n=await this.existingTranscriptPath(t),s=n??r,i=await IN([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=Gp(f.content);if(m&&(a=m),Hp(f)){let p=Xp(f.content).trim();p&&(l||(l=J(p,80)),c=J(p,80)),d++}else Jp(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=Vp(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=NN(d.created_at,s.modifiedAt),f=Gp(d.content);if(f&&(a=f),Hp(d)){let m=Xp(d.content),p=m.trim();p&&(l||(l=J(p,80)),c=J(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:AN(m.args),toolName:m.name||"tool"});Jp(d)&&d.content?o.push({role:"assistant",timestamp:u,content:d.content,model:a}):xN(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 qp(r),r}catch{}let n=Wt(this.baseDir,"conversations");try{let s=[];for(let i of await Wp(n)){if(!i.endsWith(".db"))continue;Zl(i,".db").startsWith(t)&&s.push(Wt(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=Vp(r);return n?(await Bp(this.conversationPath(n),{force:!0}),await Bp(Wt(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 RN(r);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(t){let r=Wt(this.baseDir,"cache","last_conversations.json");try{let n=JSON.parse(await kN(r,"utf8"));for(let[s,i]of Object.entries(n))if(i===t)return s}catch{}return null}}});import{spawn as ON}from"node:child_process";function ec(e){return new Ql(e)}async function CN(e,t){let r=Date.now(),n=["--conversation",t.sessionId,"-p",e,"--dangerously-skip-permissions","--print-timeout",jN(t.timeoutMs)];t.model&&n.push("--model",t.model),ot("agy",n,t.permissionMode??"yolo"),t.onProgress?.({kind:"system",summary:"agy -p one-shot started (no streaming events)"});let{stdout:s}=await MN(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 MN(e,t,r){return new Promise((n,s)=>{let i;try{i=ON(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 jN(e){return!e||e<=0?"8h":`${Math.max(1,Math.ceil(e/1e3))}s`}var Ql,tc=T(()=>{"use strict";Kp();Pt();Tt();st();zr();Ql=class extends xe{constructor(t){super({provider:new ki(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",ge,"--dangerously-skip-permissions","--print-timeout","2m"],resumeTemplate:"agy --conversation {{session_id}} --dangerously-skip-permissions",startTemplate:"agy --dangerously-skip-permissions",transport:CN})}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 DN}from"node:crypto";import{existsSync as PN,mkdirSync as FN,readFileSync as UN,renameSync as WN,writeFileSync as BN}from"node:fs";import{dirname as e_,join as Yp,resolve as rc}from"node:path";function qN(e){return DN("sha256").update(e).digest("hex").slice(0,8)}function HN(e){let t=e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return t.length>0?t:"session"}function JN(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 t_(e){return e.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function Ii(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 rc(t);let r=process.env.LMCTL_DB;return r!==void 0&&r.trim().length>0?Yp(e_(rc(r)),".lmctl-claude-mock","sessions.json"):Yp(rc(e),".lmctl-claude-mock","sessions.json")}function zp(){return{schemaVersion:1,sessions:{}}}function rs(e){if(!PN(e))return zp();try{let t=JSON.parse(UN(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 zp()}}function r_(e,t){FN(e_(e),{recursive:!0});let r=`${e}.${process.pid}.${Date.now()}.tmp`;BN(r,`${JSON.stringify(t,null,2)}
1423
- `,"utf8"),WN(r,e)}function XN(e){return{...e,timestamp:e.timestamp.toISOString()}}function GN(e){return{...e,timestamp:new Date(e.timestamp)}}function VN(e){return{...e,createdAt:e.createdAt.toISOString(),modifiedAt:e.modifiedAt.toISOString(),messages:e.messages.map(XN)}}function n_(e){return{...e,createdAt:new Date(e.createdAt),modifiedAt:new Date(e.modifiedAt),messages:e.messages.map(GN)}}function Ni(e,t=process.cwd()){let r=tn.get(e);if(r!==void 0)return r;let s=rs(rn(t)).sessions[e];if(s===void 0)return;let i=n_(s);return tn.set(i.sessionId,i),i}function Zp(e){tn.set(e.sessionId,e);let t=rn(e.cwd),r=rs(t);r.sessions[e.sessionId]=VN({...e,filePath:t}),r_(t,r)}function KN(){let e=rs(rn()),t=Object.values(e.sessions).map(n_);for(let r of t)tn.set(r.sessionId,r);return t}function YN(e,t){let r=t.script;if(r===void 0)return;let n=r[e],s=r[t_(e)],i=n??s;if(typeof i=="string")return i;if(i!==void 0&&typeof i.text=="string")return i.text}function Qp(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 ic(){return new sc}var tn,nc,sc,oc=T(()=>{"use strict";tn=new Map;nc=class{name="ClaudeMock";async discoverSessions(){let t=new Map;for(let r of KN())t.set(r.sessionId,r);for(let r of tn.values())t.set(r.sessionId,r);return[...t.values()].map(Qp)}async loadSession(t){let r=Ni(t);return r===void 0?null:{...Qp(r),messages:r.messages.slice()}}async resolveSessionPath(t){return Ni(t)?.filePath??null}async deleteSession(t){let r=tn.delete(t),n=rn(),s=rs(n),i=s.sessions[t]!==void 0;return delete s.sessions[t],i&&r_(n,s),r||i}},sc=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new nc;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=HN(JN(t,r)),s=`mock-${n}-${qN(`${t}:${n}`)}`,i=new Date,o=rn(t),a=Ni(s,t),l=r?.prompt??"ClaudeMock seed",c=Ii(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+=Ii("ACK: ClaudeMock seeded"),Zp(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=Ni(r.sessionId,r.cwd);if(s===void 0)throw new Error(`ClaudeMock session not found: ${r.sessionId}`);let i=new Date,o=rs(rn(r.cwd)),a=YN(t,o)??`ClaudeMock ack: ${t_(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+=Ii(t),s.totalOutputTokens+=Ii(a),Zp(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=[xl({claudeDir:e?.claudeDir}),Ll({codexDir:e?.codexDir,codeDir:e?.codeDir}),jl({geminiDir:e?.geminiDir,claudeDir:e?.claudeDir,codexDir:e?.codexDir,codeDir:e?.codeDir}),Fl({copilotDir:e?.copilotDir}),Hl(),Gl({lmplayerDbPath:e?.lmplayerDbPath}),Yl(),ec({agyDir:e?.agyDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&t.push(ic()),t}var ac=T(()=>{"use strict";Al();$l();Dl();Ul();Jl();Vl();zl();tc();oc();Al();$l();Dl();Ul();Jl();Vl();zl();tc();oc()});var uc={};we(uc,{ProviderRegistry:()=>Gn,TransportConnectionError:()=>Se,TransportError:()=>Qe,TransportJsonError:()=>oi,TransportProcessError:()=>Ft,TransportRpcError:()=>Ut,_resetDefaultRegistryForTests:()=>zN,chat:()=>St,countTokens:()=>dc,createAdapterRegistry:()=>Et,createAllAdapters:()=>bt,listSessions:()=>cc,seed:()=>lc});function Ai(){return xi===null&&(xi=Et(bt())),xi}function zN(){xi=null}function i_(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??Ai(),r=i_(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 lc(e){let t=e.registry??Ai(),r=i_(t,e.provider),n=await s_(t,e.provider,e.cwd),s=await r.seed(e.cwd,{model:e.model,effort:e.effort,prompt:e.prompt}),i=s.warnings!==void 0&&s.warnings.length>0?{warnings:s.warnings}:{};if(!s.success)return{success:!1,error:s.error,...i};if(s.sessionId)return{success:!0,sessionId:s.sessionId,...i};let o=await s_(t,e.provider,e.cwd),a=ZN(n,o);return a?{success:!0,sessionId:a,...i}:{success:!0,...i}}async function s_(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 ZN(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 cc(e={}){return(e.registry??Ai()).listAll({provider:e.provider,workspace:e.workspace,limit:e.limit,from:e.from,to:e.to})}async function dc(e){let r=await(e.registry??Ai()).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 xi,vt=T(()=>{"use strict";cl();ac();cl();ac();Yr();xi=null});function QN(){return fc===null&&(fc=Et(bt())),fc}async function Ri(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 tx(e)}catch(o){throw s=!0,i=o,o}finally{if(n)if(!s)nn.delete(r),t.setMemberState(r,"idle");else{let o=ex(i,r);t.setMemberState(r,o!==null?"attention_needed":"idle",o)}}}function ex(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 tx(e){let t=e.timeoutMs,r=typeof t=="number"&&t>0,n=QN(),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`,mc(e.sessionid,e.sessiondir,"unresolved")));s=d.provider.name}catch(d){return Promise.reject(new ve("other",null,`library: session resolution failed: ${o_(d)}`,mc(e.sessionid,e.sessiondir,"unresolved")))}let i=mc(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):rx(d,i)}finally{a!==null&&clearTimeout(a)}}function mc(e,t,r){return["<library>","chat",e,t,"--provider",r]}function o_(e){return e instanceof Error?e.message:String(e)}function rx(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 Ft?new ve("nonzero_exit",e.exitCode??null,e.stderr??e.message,t):e instanceof Ut?new ve("nonzero_exit",e.rpcCode??null,e.message,t):e instanceof Qe?new ve("other",null,e.message,t):new ve("other",null,o_(e),t)}var ve,fc,nn,Li=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"}},fc=null;nn=new Map});function a_(){return pc===null&&(pc=Et(bt())),pc}function sx(e,t){if(!nx.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=sx(e.member.provider,e.dal),r=t===e.member.provider?e.member:{...e.member,provider:t},n=await ix({member:r});return e.dal.setMemberProviderResolved(e.member.id,t),{sessionid:n.sessionid,provider_resolved:t}}async function ix(e){let t=e.member.provider,r=e.member.sessiondir,n=_c("seed",r,t);try{let s=await lc({provider:t,cwd:r,registry:a_()});if(!s.success)throw ax(s.error,n);if(!s.sessionId)throw new ke("parse",0,"",n);return{sessionid:s.sessionId}}catch(s){throw s instanceof ke?s:hc(s,n)}}async function l_(e){return ox(e)}async function ox(e){let t=a_(),r=_c("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:hc(i,r)}let s=_c("tokens",e.sessionid,n);try{let i=await dc({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:hc(i,s)}}function _c(e,t,r){return["<library>",e,t,"--provider",r]}function ax(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 hc(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 Ft?new ke("nonzero_exit",e.exitCode??null,e.stderr??e.message,t):e instanceof Ut?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,pc,nx,gc=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"}},pc=null;nx=/^provider[123]$/});function Oi(e){return Buffer.from(e,"utf8").toString("base64url")}function ss(e){return Buffer.from(e,"base64url").toString("utf8")}async function c_(e,t=r=>l_({sessionid:r})){if(process.env.LMCTL_SESSION_SIZE_DISABLED==="1")return{recorded:0,failed:0};let r=0,n=0;for(let s of lx(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 d_(e,t,r){let n=u_(e,t,r);if(n===null||n.member.sessionid===null)throw new Error("session member not found");if(n.member.state!=="idle")throw new ns(r,n.member.state);e.setMemberState(n.member.id,"in_chat","compacting");try{return await Ri({sessionid:n.member.sessionid,sessiondir:n.member.sessiondir,prompt:"/compact"}),e.setMemberState(n.member.id,"idle",null),{ok:!0,row:f_(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 yc(e,t,r){let n=u_(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:f_(e,t,r)}}function lx(e){return e.listTeams().flatMap(t=>e.listTeamMembers(t.id).filter(r=>r.sessionid!==null).map(r=>({team_name:t.name,member:r})))}function u_(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 f_(e,t,r){return e.sessionSizeHistory(t,r,1)[0]??null}var ns,Ci=T(()=>{"use strict";Li();gc();ns=class extends Error{constructor(t,r){super(`member ${t} is currently ${r}; cannot compact while busy`),this.name="MemberBusyError"}}});async function wc(e){let t=e.dal,r=e.nowMs??Date.now(),n=e.thresholdMs??dx(t),s=r-n,i=t.query(`
1422
+ `):"":""}function Fp(e){return e.model||e.message?.model}var vi,Up=T(()=>{"use strict";Qt();vi=class{name="qwen";baseDir;constructor(t){this.baseDir=t?.qwenDir||sr(be,".qwen")}async discoverSessions(){let t=sr(this.baseDir,"projects"),r;try{r=await Si(t)}catch{return[]}let n=[];for(let s of r){let i=sr(t,s,"chats"),o;try{o=await Si(i)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),c=sr(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)),jp(u)){let f=Pp(u).trim();f&&(l||(l=J(f,80)),c=J(f,80)),d++}if(Dp(u)){let f=Fp(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=Mp(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(jp(f)){let h=Pp(f);h.trim()&&(c||(c=J(h.trim(),80)),d=J(h.trim(),80)),u.push({role:"user",timestamp:p,content:h})}else if(Dp(f)){let h=Fp(f);if(h&&(i=h),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:h}):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:h});else if(Array.isArray(m.parts))for(let g of m.parts)if(g.thought||g.type==="thinking"){let _=g.thinking||g.text;_&&u.push({role:"thinking",timestamp:p,content:_})}else g.text&&u.push({role:"assistant",timestamp:p,content:g.text,model:h})}}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=sr(this.baseDir,"projects");try{let n=await Si(r),s=[];for(let i of n){let o=sr(r,i,"chats",`${t}.jsonl`);try{return await S0(o,{flag:"r"}),o}catch{continue}}for(let i of n){let o=sr(r,i,"chats"),a;try{a=await Si(o)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;Mp(l,".jsonl").startsWith(t)&&s.push(sr(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 v0(r),!0}catch{return!1}}}});function Yl(){return new Kl}var Kl,zl=T(()=>{"use strict";Up();Pt();kr();Tt();Kl=class extends xe{constructor(){super({provider:new vi,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"qwen",seedArgs:["-p",ge,"--approval-mode","yolo"],resumeTemplate:"qwen --resume {{session_id}}",startTemplate:"qwen",transport:mi})}seedArgsFor(t){let r=super.seedArgsFor(t);return t?.model?[...r,"--model",t.model]:r}}});import{readdir as Wp,readFile as k0,rm as Bp,stat as qp}from"node:fs/promises";import{basename as Zl,join as Wt}from"node:path";async function I0(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 N0(e,t){if(!e)return t;let r=new Date(e);return Number.isNaN(r.getTime())?t:r}function Hp(e){return e.type==="USER_INPUT"}function Jp(e){return e.source==="MODEL"&&e.type==="PLANNER_RESPONSE"}function x0(e){return e.source==="MODEL"&&e.type!=="PLANNER_RESPONSE"}function Xp(e){if(!e)return"";let t=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(e);return t?t[1]:e}function Gp(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 A0(e){if(e===void 0)return"";try{return JSON.stringify(e)}catch{return String(e)}}async function R0(e){for await(let t of We(e)){let r=t.tool_calls?.map(s=>s.args)??[];for(let s of r){let i=L0(s);if(i)return i}let n=O0(t.content);if(n)return n}return null}function L0(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 O0(e){return e?/"Cwd":"([^"]+)"/.exec(e)?.[1]??null:null}function Vp(e){if(e.endsWith(".db"))return Zl(e,".db");let t="/brain/",r=e.indexOf(t);return r===-1?null:e.slice(r+t.length).split("/")[0]||null}var ki,Kp=T(()=>{"use strict";Qt();ki=class{name="agy";baseDir;constructor(t={}){this.baseDir=t.agyDir||Wt(be,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:Wt(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let t=Wt(this.baseDir,"conversations"),r;try{r=await Wp(t)}catch{return[]}let n=[];for(let s of r){if(!s.endsWith(".db"))continue;let i=Zl(s,".db");try{let o=await this.extractSummary(i);o&&n.push(o)}catch{}}return n}conversationPath(t){return Wt(this.baseDir,"conversations",`${t}.db`)}transcriptPath(t){return Wt(this.baseDir,"brain",t,".system_generated","logs","transcript.jsonl")}async existingTranscriptPath(t){let r=this.transcriptPath(t);try{return await qp(r),r}catch{return null}}async extractSummary(t){let r=this.conversationPath(t),n=await this.existingTranscriptPath(t),s=n??r,i=await I0([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=Gp(f.content);if(m&&(a=m),Hp(f)){let p=Xp(f.content).trim();p&&(l||(l=J(p,80)),c=J(p,80)),d++}else Jp(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=Vp(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=N0(d.created_at,s.modifiedAt),f=Gp(d.content);if(f&&(a=f),Hp(d)){let m=Xp(d.content),p=m.trim();p&&(l||(l=J(p,80)),c=J(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:A0(m.args),toolName:m.name||"tool"});Jp(d)&&d.content?o.push({role:"assistant",timestamp:u,content:d.content,model:a}):x0(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 qp(r),r}catch{}let n=Wt(this.baseDir,"conversations");try{let s=[];for(let i of await Wp(n)){if(!i.endsWith(".db"))continue;Zl(i,".db").startsWith(t)&&s.push(Wt(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=Vp(r);return n?(await Bp(this.conversationPath(n),{force:!0}),await Bp(Wt(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 R0(r);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(t){let r=Wt(this.baseDir,"cache","last_conversations.json");try{let n=JSON.parse(await k0(r,"utf8"));for(let[s,i]of Object.entries(n))if(i===t)return s}catch{}return null}}});import{spawn as $0}from"node:child_process";function ec(e){return new Ql(e)}async function C0(e,t){let r=Date.now(),n=["--conversation",t.sessionId,"-p",e,"--dangerously-skip-permissions","--print-timeout",j0(t.timeoutMs)];t.model&&n.push("--model",t.model),ot("agy",n,t.permissionMode??"yolo"),t.onProgress?.({kind:"system",summary:"agy -p one-shot started (no streaming events)"});let{stdout:s}=await M0(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 M0(e,t,r){return new Promise((n,s)=>{let i;try{i=$0(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 j0(e){return!e||e<=0?"8h":`${Math.max(1,Math.ceil(e/1e3))}s`}var Ql,tc=T(()=>{"use strict";Kp();Pt();Tt();st();zr();Ql=class extends xe{constructor(t){super({provider:new ki(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",ge,"--dangerously-skip-permissions","--print-timeout","2m"],resumeTemplate:"agy --conversation {{session_id}} --dangerously-skip-permissions",startTemplate:"agy --dangerously-skip-permissions",transport:C0})}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 D0}from"node:crypto";import{existsSync as P0,mkdirSync as F0,readFileSync as U0,renameSync as W0,writeFileSync as B0}from"node:fs";import{dirname as e_,join as Yp,resolve as rc}from"node:path";function q0(e){return D0("sha256").update(e).digest("hex").slice(0,8)}function H0(e){let t=e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return t.length>0?t:"session"}function J0(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 t_(e){return e.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function Ii(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 rc(t);let r=process.env.LMCTL_DB;return r!==void 0&&r.trim().length>0?Yp(e_(rc(r)),".lmctl-claude-mock","sessions.json"):Yp(rc(e),".lmctl-claude-mock","sessions.json")}function zp(){return{schemaVersion:1,sessions:{}}}function rs(e){if(!P0(e))return zp();try{let t=JSON.parse(U0(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 zp()}}function r_(e,t){F0(e_(e),{recursive:!0});let r=`${e}.${process.pid}.${Date.now()}.tmp`;B0(r,`${JSON.stringify(t,null,2)}
1423
+ `,"utf8"),W0(r,e)}function X0(e){return{...e,timestamp:e.timestamp.toISOString()}}function G0(e){return{...e,timestamp:new Date(e.timestamp)}}function V0(e){return{...e,createdAt:e.createdAt.toISOString(),modifiedAt:e.modifiedAt.toISOString(),messages:e.messages.map(X0)}}function n_(e){return{...e,createdAt:new Date(e.createdAt),modifiedAt:new Date(e.modifiedAt),messages:e.messages.map(G0)}}function Ni(e,t=process.cwd()){let r=tn.get(e);if(r!==void 0)return r;let s=rs(rn(t)).sessions[e];if(s===void 0)return;let i=n_(s);return tn.set(i.sessionId,i),i}function Zp(e){tn.set(e.sessionId,e);let t=rn(e.cwd),r=rs(t);r.sessions[e.sessionId]=V0({...e,filePath:t}),r_(t,r)}function K0(){let e=rs(rn()),t=Object.values(e.sessions).map(n_);for(let r of t)tn.set(r.sessionId,r);return t}function Y0(e,t){let r=t.script;if(r===void 0)return;let n=r[e],s=r[t_(e)],i=n??s;if(typeof i=="string")return i;if(i!==void 0&&typeof i.text=="string")return i.text}function Qp(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 ic(){return new sc}var tn,nc,sc,oc=T(()=>{"use strict";tn=new Map;nc=class{name="ClaudeMock";async discoverSessions(){let t=new Map;for(let r of K0())t.set(r.sessionId,r);for(let r of tn.values())t.set(r.sessionId,r);return[...t.values()].map(Qp)}async loadSession(t){let r=Ni(t);return r===void 0?null:{...Qp(r),messages:r.messages.slice()}}async resolveSessionPath(t){return Ni(t)?.filePath??null}async deleteSession(t){let r=tn.delete(t),n=rn(),s=rs(n),i=s.sessions[t]!==void 0;return delete s.sessions[t],i&&r_(n,s),r||i}},sc=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new nc;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=H0(J0(t,r)),s=`mock-${n}-${q0(`${t}:${n}`)}`,i=new Date,o=rn(t),a=Ni(s,t),l=r?.prompt??"ClaudeMock seed",c=Ii(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+=Ii("ACK: ClaudeMock seeded"),Zp(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=Ni(r.sessionId,r.cwd);if(s===void 0)throw new Error(`ClaudeMock session not found: ${r.sessionId}`);let i=new Date,o=rs(rn(r.cwd)),a=Y0(t,o)??`ClaudeMock ack: ${t_(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+=Ii(t),s.totalOutputTokens+=Ii(a),Zp(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=[xl({claudeDir:e?.claudeDir}),Ll({codexDir:e?.codexDir,codeDir:e?.codeDir}),jl({geminiDir:e?.geminiDir,claudeDir:e?.claudeDir,codexDir:e?.codexDir,codeDir:e?.codeDir}),Fl({copilotDir:e?.copilotDir}),Hl(),Gl({lmplayerDbPath:e?.lmplayerDbPath}),Yl(),ec({agyDir:e?.agyDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&t.push(ic()),t}var ac=T(()=>{"use strict";Al();Ol();Dl();Ul();Jl();Vl();zl();tc();oc();Al();Ol();Dl();Ul();Jl();Vl();zl();tc();oc()});var uc={};we(uc,{ProviderRegistry:()=>Gn,TransportConnectionError:()=>Se,TransportError:()=>Qe,TransportJsonError:()=>oi,TransportProcessError:()=>Ft,TransportRpcError:()=>Ut,_resetDefaultRegistryForTests:()=>z0,chat:()=>St,countTokens:()=>dc,createAdapterRegistry:()=>Et,createAllAdapters:()=>bt,listSessions:()=>cc,seed:()=>lc});function Ai(){return xi===null&&(xi=Et(bt())),xi}function z0(){xi=null}function i_(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??Ai(),r=i_(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 lc(e){let t=e.registry??Ai(),r=i_(t,e.provider),n=await s_(t,e.provider,e.cwd),s=await r.seed(e.cwd,{model:e.model,effort:e.effort,prompt:e.prompt}),i=s.warnings!==void 0&&s.warnings.length>0?{warnings:s.warnings}:{};if(!s.success)return{success:!1,error:s.error,...i};if(s.sessionId)return{success:!0,sessionId:s.sessionId,...i};let o=await s_(t,e.provider,e.cwd),a=Z0(n,o);return a?{success:!0,sessionId:a,...i}:{success:!0,...i}}async function s_(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 Z0(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 cc(e={}){return(e.registry??Ai()).listAll({provider:e.provider,workspace:e.workspace,limit:e.limit,from:e.from,to:e.to})}async function dc(e){let r=await(e.registry??Ai()).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 xi,vt=T(()=>{"use strict";cl();ac();cl();ac();Yr();xi=null});function Q0(){return fc===null&&(fc=Et(bt())),fc}async function Ri(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 tx(e)}catch(o){throw s=!0,i=o,o}finally{if(n)if(!s)nn.delete(r),t.setMemberState(r,"idle");else{let o=ex(i,r);t.setMemberState(r,o!==null?"attention_needed":"idle",o)}}}function ex(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 tx(e){let t=e.timeoutMs,r=typeof t=="number"&&t>0,n=Q0(),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`,mc(e.sessionid,e.sessiondir,"unresolved")));s=d.provider.name}catch(d){return Promise.reject(new ve("other",null,`library: session resolution failed: ${o_(d)}`,mc(e.sessionid,e.sessiondir,"unresolved")))}let i=mc(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):rx(d,i)}finally{a!==null&&clearTimeout(a)}}function mc(e,t,r){return["<library>","chat",e,t,"--provider",r]}function o_(e){return e instanceof Error?e.message:String(e)}function rx(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 Ft?new ve("nonzero_exit",e.exitCode??null,e.stderr??e.message,t):e instanceof Ut?new ve("nonzero_exit",e.rpcCode??null,e.message,t):e instanceof Qe?new ve("other",null,e.message,t):new ve("other",null,o_(e),t)}var ve,fc,nn,Li=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"}},fc=null;nn=new Map});function a_(){return pc===null&&(pc=Et(bt())),pc}function sx(e,t){if(!nx.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 Oi(e){let t=sx(e.member.provider,e.dal),r=t===e.member.provider?e.member:{...e.member,provider:t},n=await ix({member:r});return e.dal.setMemberProviderResolved(e.member.id,t),{sessionid:n.sessionid,provider_resolved:t}}async function ix(e){let t=e.member.provider,r=e.member.sessiondir,n=_c("seed",r,t);try{let s=await lc({provider:t,cwd:r,registry:a_()});if(!s.success)throw ax(s.error,n);if(!s.sessionId)throw new ke("parse",0,"",n);return{sessionid:s.sessionId}}catch(s){throw s instanceof ke?s:hc(s,n)}}async function l_(e){return ox(e)}async function ox(e){let t=a_(),r=_c("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:hc(i,r)}let s=_c("tokens",e.sessionid,n);try{let i=await dc({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:hc(i,s)}}function _c(e,t,r){return["<library>",e,t,"--provider",r]}function ax(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 hc(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 Ft?new ke("nonzero_exit",e.exitCode??null,e.stderr??e.message,t):e instanceof Ut?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,pc,nx,gc=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"}},pc=null;nx=/^provider[123]$/});function $i(e){return Buffer.from(e,"utf8").toString("base64url")}function ss(e){return Buffer.from(e,"base64url").toString("utf8")}async function c_(e,t=r=>l_({sessionid:r})){if(process.env.LMCTL_SESSION_SIZE_DISABLED==="1")return{recorded:0,failed:0};let r=0,n=0;for(let s of lx(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 d_(e,t,r){let n=u_(e,t,r);if(n===null||n.member.sessionid===null)throw new Error("session member not found");if(n.member.state!=="idle")throw new ns(r,n.member.state);e.setMemberState(n.member.id,"in_chat","compacting");try{return await Ri({sessionid:n.member.sessionid,sessiondir:n.member.sessiondir,prompt:"/compact"}),e.setMemberState(n.member.id,"idle",null),{ok:!0,row:f_(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 yc(e,t,r){let n=u_(e,t,r);if(n===null)throw new Error("session member not found");let s=await Oi({member:n.member,dal:e});return e.updateTeamMemberSession(n.member.id,s.sessionid),{ok:!0,sessionid:s.sessionid,row:f_(e,t,r)}}function lx(e){return e.listTeams().flatMap(t=>e.listTeamMembers(t.id).filter(r=>r.sessionid!==null).map(r=>({team_name:t.name,member:r})))}function u_(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 f_(e,t,r){return e.sessionSizeHistory(t,r,1)[0]??null}var ns,Ci=T(()=>{"use strict";Li();gc();ns=class extends Error{constructor(t,r){super(`member ${t} is currently ${r}; cannot compact while busy`),this.name="MemberBusyError"}}});async function wc(e){let t=e.dal,r=e.nowMs??Date.now(),n=e.thresholdMs??dx(t),s=r-n,i=t.query(`
1424
1424
  SELECT
1425
1425
  isess.id AS interactive_session_id,
1426
1426
  isess.run_id,
@@ -1574,11 +1574,11 @@ ${r}`:r}function fp(e,t){let r=j0[t.tool];return r?new Promise((n,s)=>{let i=t.b
1574
1574
  ON isess.run_id = a.run_id
1575
1575
  AND isess.id = (
1576
1576
  SELECT MAX(id) FROM interactive_session WHERE run_id = a.run_id
1577
- )`});var H_={};we(H_,{parseApiArgs:()=>O_,readApiClientConfig:()=>Nc,runApi:()=>jx});import{readFileSync as Lx}from"node:fs";import{basename as $x,extname as Ox}from"node:path";async function jx(e,t={stdout:process.stdout,stderr:process.stderr}){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(Mx),0;if(e[0]==="config")return Px(e.slice(1),t);let r=B_(e,"--direct");if(r.rest[0]==="escalations")return Fx(r.rest.slice(1),t,r.present);if(r.rest[0]==="workflows"&&r.rest[1]==="verify"&&Ki(r.rest.slice(2)))return t.stdout.write(`${qx}
1577
+ )`});var H_={};we(H_,{parseApiArgs:()=>$_,readApiClientConfig:()=>Nc,runApi:()=>jx});import{readFileSync as Lx}from"node:fs";import{basename as Ox,extname as $x}from"node:path";async function jx(e,t={stdout:process.stdout,stderr:process.stderr}){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(Mx),0;if(e[0]==="config")return Px(e.slice(1),t);let r=B_(e,"--direct");if(r.rest[0]==="escalations")return Fx(r.rest.slice(1),t,r.present);if(r.rest[0]==="workflows"&&r.rest[1]==="verify"&&Ki(r.rest.slice(2)))return t.stdout.write(`${qx}
1578
1578
  `),0;if(r.rest[0]==="workflows"&&r.rest[1]==="verify")return r.present?(t.stderr.write(`error: --direct is not supported for workflows verify; use the HTTP api route
1579
1579
  `),2):DA(r.rest.slice(2),t);if(r.rest[0]==="run"&&r.rest[1]==="where"&&Ki(r.rest.slice(2)))return t.stdout.write(`${Wx}
1580
1580
  `),0;if(r.rest[0]==="run"&&r.rest[1]==="timeline"&&Ki(r.rest.slice(2)))return t.stdout.write(`${Bx}
1581
- `),0;if(r.rest[0]==="run"&&r.rest[1]==="where")return r.present?OA(r.rest.slice(2),t):CA(r.rest.slice(2),t);if(r.rest[0]==="run"&&r.rest[1]==="timeline")return r.present?MA(r.rest.slice(2),t):jA(r.rest.slice(2),t);if(r.present)return yA(r.rest,t);let n=O_(e);if(typeof n=="string")return t.stderr.write(`error: ${n}
1581
+ `),0;if(r.rest[0]==="run"&&r.rest[1]==="where")return r.present?$A(r.rest.slice(2),t):CA(r.rest.slice(2),t);if(r.rest[0]==="run"&&r.rest[1]==="timeline")return r.present?MA(r.rest.slice(2),t):jA(r.rest.slice(2),t);if(r.present)return yA(r.rest,t);let n=$_(e);if(typeof n=="string")return t.stderr.write(`error: ${n}
1582
1582
  `),2;let s=Lr(t),i=s.baseUrl,o=ar(n.accept,s.token),a=n.body;if(n.upload!==void 0)try{a=zx(n.upload.filePath,n.upload.project)}catch(c){return t.stderr.write(`error: upload failed: ${c instanceof Error?c.message:String(c)}
1583
1583
  `),2}else n.body!==void 0&&n.contentType!==void 0?o["Content-Type"]=n.contentType:n.body!==void 0&&(o["Content-Type"]="application/json");let l;try{l=await fetch(new URL(n.path,i),{method:n.method,headers:o,body:a})}catch(c){return t.stderr.write(`error: network failure: ${c instanceof Error?c.message:String(c)}
1584
1584
  `),2}if(!l.ok)return t.stderr.write(`error: HTTP ${l.status}: ${await l.text()}
@@ -1589,7 +1589,7 @@ ${r}`:r}function fp(e,t){let r=j0[t.tool];return r?new Promise((n,s)=>{let i=t.b
1589
1589
  `):t.stdout.write(`${JSON.stringify(f)}
1590
1590
  `)}else n.json?t.stdout.write(`${JSON.stringify(await l.json(),null,2)}
1591
1591
  `):(t.stdout.write(await l.text()),t.stdout.write(`
1592
- `));return 0}function O_(e){let t=j_(e);if(typeof t=="string")return t;let r=t.args,n=t.format!=="text",[s,...i]=r;return s===void 0?"usage: lmctl api <subcommand>":s==="status"?Vi(i,"/api/status",n):s==="projects"?Vi(i,"/api/projects",n):s==="teams"?Vi(i,"/api/teams",n):s==="workflows"?i[0]==="verify"?aA(i.slice(1),t.format):Vi(i,"/api/workflows",n):s==="workflow"?oA(i,n):s==="upload"?sA(i,n):s==="submit-job"?iA(i,n):s==="issues"?nA(i,n):s==="jobs"?is(i,"--status","/api/jobs","status",n):s==="job"?rA(i,n):s==="project"?lA(i,n):s==="artifact"?uA(i,n):s==="runs"?is(i,"--limit","/api/runs","limit",n,!0):s==="external-objects"?is(i,"--type","/api/external-objects","type",n):s==="external-signals"?R_(i,"--unhandled","/api/external-signals","unhandled",n):s==="attentions"||s==="attention"?i[0]==="ack"?fA(i,n):R_(i,"--unacked","/api/attentions","unacked",n):s==="stats"?mA(i,n):s==="daemon"?pA(i,n):s==="intake"?_A(i,n):s==="session"?hA(i,n):s==="run"?gA(i,t.format):s==="prs"?is(i,"--status","/api/submitted-prs","status",n):s==="pr"?eA(i,n):`unknown subcommand: ${s}`}function ar(e,t){let r={Accept:e};return t!==null&&t.length>0&&(r.Authorization=`Bearer ${t}`),r}function Lr(e){if(e.dal!==void 0)return Nc(e.dal,process.env,e);let t=Ie({path:le()});try{return Nc(t,process.env,e)}finally{t.close()}}function Nc(e,t,r){let n=[],s=e.getConfig("api.url"),i;s!==null?i=s:t.LMCTL_API_URL!==void 0&&t.LMCTL_API_URL.length>0?(i=t.LMCTL_API_URL,n.push("api.url")):i=Cx;let o=e.getConfig("api.token"),a;t.LMCTL_API_TOKEN!==void 0&&t.LMCTL_API_TOKEN.length>0?(a=t.LMCTL_API_TOKEN,o===null?n.push("api.token"):o!==a&&r.stderr.write(`note: LMCTL_API_TOKEN env var overrides lmctl_config api.token for this API request.
1592
+ `));return 0}function $_(e){let t=j_(e);if(typeof t=="string")return t;let r=t.args,n=t.format!=="text",[s,...i]=r;return s===void 0?"usage: lmctl api <subcommand>":s==="status"?Vi(i,"/api/status",n):s==="projects"?Vi(i,"/api/projects",n):s==="teams"?Vi(i,"/api/teams",n):s==="workflows"?i[0]==="verify"?aA(i.slice(1),t.format):Vi(i,"/api/workflows",n):s==="workflow"?oA(i,n):s==="upload"?sA(i,n):s==="submit-job"?iA(i,n):s==="issues"?nA(i,n):s==="jobs"?is(i,"--status","/api/jobs","status",n):s==="job"?rA(i,n):s==="project"?lA(i,n):s==="artifact"?uA(i,n):s==="runs"?is(i,"--limit","/api/runs","limit",n,!0):s==="external-objects"?is(i,"--type","/api/external-objects","type",n):s==="external-signals"?R_(i,"--unhandled","/api/external-signals","unhandled",n):s==="attentions"||s==="attention"?i[0]==="ack"?fA(i,n):R_(i,"--unacked","/api/attentions","unacked",n):s==="stats"?mA(i,n):s==="daemon"?pA(i,n):s==="intake"?_A(i,n):s==="session"?hA(i,n):s==="run"?gA(i,t.format):s==="prs"?is(i,"--status","/api/submitted-prs","status",n):s==="pr"?eA(i,n):`unknown subcommand: ${s}`}function ar(e,t){let r={Accept:e};return t!==null&&t.length>0&&(r.Authorization=`Bearer ${t}`),r}function Lr(e){if(e.dal!==void 0)return Nc(e.dal,process.env,e);let t=Ie({path:le()});try{return Nc(t,process.env,e)}finally{t.close()}}function Nc(e,t,r){let n=[],s=e.getConfig("api.url"),i;s!==null?i=s:t.LMCTL_API_URL!==void 0&&t.LMCTL_API_URL.length>0?(i=t.LMCTL_API_URL,n.push("api.url")):i=Cx;let o=e.getConfig("api.token"),a;t.LMCTL_API_TOKEN!==void 0&&t.LMCTL_API_TOKEN.length>0?(a=t.LMCTL_API_TOKEN,o===null?n.push("api.token"):o!==a&&r.stderr.write(`note: LMCTL_API_TOKEN env var overrides lmctl_config api.token for this API request.
1593
1593
  `)):o!==null?a=o:a=null;for(let l of n)r.stderr.write(`note: ${Dx(l)} env var read; consider \`lmctl api config set ${l} ...\` to make this DB-canonical.
1594
1594
  `);return{baseUrl:i,token:a}}function Dx(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 Px(e,t){let[r,...n]=e;if(r===void 0)return t.stderr.write(`usage: lmctl api config <get|set|list>
1595
1595
  `),2;let s=t.dal===void 0,i=t.dal??Ie({path:le()});try{if(r==="get"){if(n.length!==1)return t.stderr.write(`usage: lmctl api config get <key>
@@ -1633,11 +1633,11 @@ ${r}`:r}function fp(e,t){let r=j0[t.tool];return r?new Promise((n,s)=>{let i=t.b
1633
1633
  `),1;if(!d.ok){let f=await d.text();return t.stderr.write(`error: HTTP ${d.status}: ${f}
1634
1634
  `),d.status===400?2:1}let u=await d.json();return r?t.stdout.write(`${JSON.stringify(u,null,2)}
1635
1635
  `):t.stdout.write(`ok: attention ${i} acknowledged; step ${u.step_id} resumed (session_status=${String(u.session_status)})
1636
- `),0}function A_(e,t,r){return e!=="api.token"||r?t:t.length<=8?"***":`${t.slice(0,8)}\u2026(masked; use --show-secrets to reveal)`}function Yx(e,t){if(t.length===0)return`${e} value must be non-empty`;if(e==="api.port"){let r=Number(t);if(!Number.isInteger(r)||r<=0||r>65535)return`invalid api.port: ${t}`}if(e==="api.url")try{new URL(t)}catch{return`invalid api.url: ${t}`}if(e===Mi||e===ji){let r=Number(t);if(!Number.isInteger(r)||r<=0)return`invalid ${e}: ${t}`}return null}function zx(e,t){let r=Lx(e),n=r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength),s=new FormData;return s.append("image",new Blob([n],{type:Zx(e)}),$x(e)),t!==void 0&&s.append("project",t),s}function Zx(e){switch(Ox(e).toLowerCase()){case".png":return"image/png";case".jpg":case".jpeg":return"image/jpeg";case".webp":return"image/webp";case".heic":return"image/heic";case".pdf":return"application/pdf";default:return"application/octet-stream"}}function Qx(e){if(e!==null&&typeof e=="object"&&!Array.isArray(e)){let t=e.id;return typeof t=="number"&&Number.isInteger(t)?t:null}return null}function eA(e,t){let[r,...n]=e;if(r===void 0)return"usage: lmctl api pr <id|list|get>";if(r==="list")return is(n,"--status","/api/submitted-prs","status",t);if(r==="get"){let[s]=n;return s===void 0?"usage: api pr get <id-or-url>":/^\d+$/.test(s)?{method:"GET",path:`/api/submitted-prs/${s}`,accept:"application/json",json:t}:{method:"GET",path:`/api/submitted-prs?pr_url=${encodeURIComponent(s)}`,accept:"application/json",json:t}}return/^\d+$/.test(r)?{method:"GET",path:`/api/submitted-prs/${r}`,accept:"application/json",json:t}:`usage: lmctl api pr <id|list|get>; got: ${r}`}function j_(e){let t=[],r="json";for(let n of e)n==="--json"?r="json":n==="--text"?r="text":t.push(n);return{args:t,format:r}}function Vi(e,t,r){return e.length>0?re(e[0]):{method:"GET",path:t,accept:r?"application/json":"text/html",json:r}}function is(e,t,r,n,s,i=!1){let o;for(let l=0;l<e.length;l+=1){let c=e[l];if(c!==t)return re(c);let d=e[++l];if(d===void 0||d.startsWith("--"))return`missing value for ${t}`;if(i&&(!/^\d+$/.test(d)||Number(d)<=0))return`invalid ${t}: ${d}`;o=d}let a=o===void 0?"":`?${n}=${encodeURIComponent(o)}`;return{method:"GET",path:`${r}${a}`,accept:s?"application/json":"text/html",json:s}}function R_(e,t,r,n,s){let i=!1;for(let o of e){if(o!==t)return re(o);i=!0}return{method:"GET",path:`${r}${i?`?${n}=true`:""}`,accept:s?"application/json":"text/html",json:s}}function tA(e,t,r){if(e.length!==1)return`usage: lmctl api ${r} <id>`;let n=ne(e[0],"id");return typeof n=="string"?n:{method:"GET",path:`${t}/${n}`,accept:"application/json",json:!0}}function rA(e,t){let[r,...n]=e;if(r!==void 0&&n.length===0&&r!=="enqueue"&&r!=="run")return tA([r],"/api/jobs","job");if(r==="enqueue"){let s,i,o="manual",a,l,c;for(let u=0;u<n.length;u+=1){let f=n[u],m=n[++u];if(m===void 0||m.startsWith("--"))return`missing value for ${f}`;if(f==="--project")s=m;else if(f==="--project-id"){let p=Number(m);if(!Number.isInteger(p))return`invalid --project-id: ${m}`;i=p}else if(f==="--source")o=m;else if(f==="--payload")a=m;else if(f==="--dedupe-key")l=m;else if(f==="--priority"){let p=Number(m);if(!Number.isInteger(p))return`invalid --priority: ${m}`;c=p}else return re(f)}if(s===void 0&&i===void 0)return"usage: lmctl api job enqueue (--project NAME | --project-id ID) [--source S] [--payload JSON] [--dedupe-key K] [--priority N]";let d={source:o};return s!==void 0&&(d.project=s),i!==void 0&&(d.project_id=i),a!==void 0&&(d.payload=xc(a)),l!==void 0&&(d.dedupe_key=l),c!==void 0&&(d.priority=c),{method:"POST",path:"/api/jobs",accept:"application/json",json:t,body:JSON.stringify(d)}}if(r==="run"){if(n.length!==1)return"usage: lmctl api job run <id>";let s=ne(n[0],"id");return typeof s=="string"?s:{method:"POST",path:`/api/jobs/${s}/run`,accept:"application/json",json:t}}return"usage: lmctl api job <id|enqueue|run>"}function nA(e,t){let[r,...n]=e;if(r==="list"){let[s,...i]=n;if(s===void 0||s.startsWith("--"))return"usage: lmctl api issues list <project> [--status STATUS] [--severity SEVERITY] [--ai-test-path P]";let o=new URLSearchParams;for(let l=0;l<i.length;l+=1){let c=i[l],d=i[++l];if(d===void 0||d.startsWith("--"))return`missing value for ${c}`;if(c==="--status")o.set("status",d);else if(c==="--severity")o.set("severity",d);else if(c==="--ai-test-path")o.set("ai_test_path",d);else return re(c)}let a=o.toString();return{method:"GET",path:`/api/projects/${encodeURIComponent(s)}/issues${a.length>0?`?${a}`:""}`,accept:t?"application/json":"text/html",json:t}}if(r==="show"){if(n.length!==1)return"usage: lmctl api issues show <id>";let s=ne(n[0],"id");return typeof s=="string"?s:{method:"GET",path:`/api/issues/${s}`,accept:"application/json",json:t}}return r==="create"?D_(n,t):r==="claim"?P_(n,t):r==="claim-next"?F_(n,t):r==="close"?U_(n,t):r==="reopen"?W_(n,t):"usage: lmctl api issues <list|show|create|claim|claim-next|close|reopen>"}function D_(e,t){let[r,...n]=e;if(r===void 0||r.startsWith("--"))return"usage: lmctl api issues create <project> --title T --body B [--severity S] [--labels JSON] [--ai-test-path P]";let s=new Set(["--title","--body"]),i={};for(let o=0;o<n.length;o+=1){let a=n[o],l=n[++o];if(l===void 0)return`missing value for ${a}`;if(!s.has(a)&&l.startsWith("--"))return`missing value for ${a}`;if(a==="--title")i.title=l;else if(a==="--body")i.body=l;else if(a==="--severity")i.severity=l;else if(a==="--labels")i.labels=xc(l);else if(a==="--ai-test-path")i.ai_test_path=l;else if(a==="--source-run-id"){let c=ne(l,"--source-run-id");if(typeof c=="string")return c;i.source_run_id=c}else return re(a)}return typeof i.title!="string"?"missing value for --title":typeof i.body!="string"?"missing value for --body":{method:"POST",path:`/api/projects/${encodeURIComponent(r)}/issues`,accept:"application/json",json:t,body:JSON.stringify(i)}}function P_(e,t){let[r,...n]=e;if(r===void 0)return"usage: lmctl api issues claim <id> --assigned-run-id RUN";let s=ne(r,"id");if(typeof s=="string")return s;let i={};for(let o=0;o<n.length;o+=1){let a=n[o],l=n[++o];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--assigned-run-id"){let c=ne(l,"--assigned-run-id");if(typeof c=="string")return c;i.assigned_run_id=c}else return re(a)}return typeof i.assigned_run_id!="number"?"missing value for --assigned-run-id":{method:"POST",path:`/api/issues/${s}/claim`,accept:"application/json",json:t,body:JSON.stringify(i)}}function F_(e,t){let[r,...n]=e;if(r===void 0||r.startsWith("--"))return"usage: lmctl api issues claim-next <project> --assigned-run-id RUN";let s={};for(let i=0;i<n.length;i+=1){let o=n[i],a=n[++i];if(a===void 0||a.startsWith("--"))return`missing value for ${o}`;if(o==="--assigned-run-id"){let l=ne(a,"--assigned-run-id");if(typeof l=="string")return l;s.assigned_run_id=l}else return re(o)}return typeof s.assigned_run_id!="number"?"missing value for --assigned-run-id":{method:"POST",path:`/api/projects/${encodeURIComponent(r)}/issues/claim-next`,accept:"application/json",json:t,body:JSON.stringify(s)}}function U_(e,t){let[r,...n]=e;if(r===void 0)return"usage: lmctl api issues close <id> [--commit-hash SHA] [--closed-run-id RUN]";let s=ne(r,"id");if(typeof s=="string")return s;let i={};for(let o=0;o<n.length;o+=1){let a=n[o],l=n[++o];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--commit-hash")i.commit_hash=l;else if(a==="--closed-run-id"){let c=ne(l,"--closed-run-id");if(typeof c=="string")return c;i.closed_run_id=c}else return re(a)}return{method:"POST",path:`/api/issues/${s}/close`,accept:"application/json",json:t,body:JSON.stringify(i)}}function W_(e,t){let[r,...n]=e;if(r===void 0)return"usage: lmctl api issues reopen <id> [--source-run-id RUN]";let s=ne(r,"id");if(typeof s=="string")return s;let i={};for(let o=0;o<n.length;o+=1){let a=n[o],l=n[++o];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--source-run-id"){let c=ne(l,"--source-run-id");if(typeof c=="string")return c;i.source_run_id=c}else return re(a)}return{method:"POST",path:`/api/issues/${s}/reopen`,accept:"application/json",json:t,body:JSON.stringify(i)}}function sA(e,t){let[r,...n]=e;if(r===void 0||r.startsWith("--"))return"usage: lmctl api upload <file> [--project NAME] [--json]";let s;for(let i=0;i<n.length;i+=1){let o=n[i];if(o!=="--project")return re(o);let a=n[++i];if(a===void 0||a.startsWith("--"))return"missing value for --project";s=a}return{method:"POST",path:"/api/uploads",accept:"application/json",json:t,upload:{filePath:r,project:s}}}function iA(e,t){let r,n,s,i;for(let a=0;a<e.length;a+=1){let l=e[a],c=e[++a];if(c===void 0||c.startsWith("--"))return`missing value for ${l}`;if(l==="--workflow")r=c;else if(l==="--workflow-id-override"){let d=Number(c);if(!Number.isInteger(d)||d<=0)return`invalid --workflow-id-override: ${c}`;n=d}else if(l==="--project")s=c;else if(l==="--inputs")try{let d=JSON.parse(c);if(d===null||typeof d!="object"||Array.isArray(d))return"--inputs must be a JSON object";i=d}catch{return"invalid --inputs JSON"}else return re(l)}if(r===void 0&&n===void 0)return"missing value for --workflow";if(i===void 0)return"missing value for --inputs";let o={source:"api-submit-job",payload:i};return r!==void 0&&(o.workflow=r),n!==void 0&&(o.workflow_id_override=n),s!==void 0&&(o.project=s),{method:"POST",path:"/api/jobs",accept:"application/json",json:t,body:JSON.stringify(o),runAfterSubmit:!0}}function xc(e){try{return JSON.parse(e)}catch{return e}}function oA(e,t){let[r,n]=e;return r!=="show"||n===void 0||e.length!==2?"usage: lmctl api workflow show <name>":{method:"GET",path:`/api/workflows/${encodeURIComponent(n)}`,accept:"application/json",json:t}}function aA(e,t){for(let r of e)if(!(r==="--json"||r==="--text"))return re(r);return{method:"GET",path:"/api/workflows/verify",accept:t==="text"?"text/plain":"application/json",json:t!=="text"}}function lA(e,t){let[r,n,...s]=e;return r==="workflow"?cA([n,...s].filter(i=>i!==void 0),t):r!=="show"||n===void 0||e.length!==2?"usage: lmctl api project <show|workflow>":{method:"GET",path:`/api/projects/${encodeURIComponent(n)}`,accept:"application/json",json:t}}function cA(e,t){let[r,...n]=e;if(r==="list")return n.length!==1?"usage: lmctl api project workflow list <project>":{method:"GET",path:`/api/projects/${encodeURIComponent(n[0])}/workflows`,accept:t?"application/json":"text/html",json:t};if(r==="show"){if(n.length!==1)return"usage: lmctl api project workflow show <id>";let s=ne(n[0],"id");return typeof s=="string"?s:{method:"GET",path:`/api/projects/workflows/${s}`,accept:t?"application/json":"text/html",json:t}}if(r==="remove"||r==="enable"||r==="disable"){if(n.length!==1)return`usage: lmctl api project workflow ${r} <id>`;let s=ne(n[0],"id");if(typeof s=="string")return s;let i=r==="remove"?"DELETE":"POST",o=r==="remove"?"":`/${r}`;return{method:i,path:`/api/projects/workflows/${s}${o}`,accept:"application/json",json:t}}if(r==="add"){let s=dA(n);return typeof s=="string"?s:{method:"POST",path:`/api/projects/${encodeURIComponent(s.project)}/workflows`,accept:"application/json",json:t,body:JSON.stringify(s.body)}}return"usage: lmctl api project workflow <add|list|show|remove|enable|disable>"}function dA(e){let[t,r,...n]=e;if(t===void 0||r===void 0)return"usage: lmctl api project workflow add <project> <workflow> [--condition JEXL] [--params JSON] [--priority N]";let s={workflow:r};for(let i=0;i<n.length;i+=1){let o=n[i],a=n[++i];if(a===void 0||a.startsWith("--"))return`missing value for ${o}`;if(o==="--condition")s.condition=a;else if(o==="--params")s.params=xc(a);else if(o==="--priority"){let l=Number(a);if(!Number.isInteger(l))return`invalid --priority: ${a}`;s.priority=l}else return re(o)}return{project:t,body:s}}function uA(e,t){if(e[0]!=="get")return"usage: lmctl api artifact get --run R --kind K [--raw]";let r,n,s=!1;for(let o=1;o<e.length;o+=1){let a=e[o];if(a==="--raw"){s=!0;continue}let l=e[++o];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--run"){let c=ne(l,"run");if(typeof c=="string")return c;r=c}else if(a==="--kind")n=l;else return re(a)}return r===void 0||n===void 0?"usage: lmctl api artifact get --run R --kind K [--raw]":{method:"GET",path:`/api/runs/${r}/artifacts/${encodeURIComponent(n)}${s?"?raw=true":""}`,accept:s?"text/plain":"application/json",json:!s&&t}}function fA(e,t){if(e[0]!=="ack"||e.length!==2)return"usage: lmctl api attention ack <id>";let r=ne(e[1],"id");return typeof r=="string"?r:{method:"POST",path:`/api/attentions/${r}/ack`,accept:t?"application/json":"text/html",json:t}}function mA(e,t){return e.length!==1||e[0]!=="run-throughput"?"usage: lmctl api stats run-throughput":{method:"GET",path:"/api/stats/run-throughput",accept:t?"application/json":"text/html",json:t}}function pA(e,t){return e.length!==1||e[0]!=="state"&&e[0]!=="cycle"?"usage: lmctl api daemon <state|cycle>":{method:e[0]==="cycle"?"POST":"GET",path:e[0]==="cycle"?"/api/daemon/cycle":"/api/daemon/state",accept:t?"application/json":"text/html",json:t}}function _A(e,t){return e.length!==1||e[0]!=="state"&&e[0]!=="scan"?"usage: lmctl api intake <state|scan>":{method:e[0]==="scan"?"POST":"GET",path:e[0]==="scan"?"/api/intake/scan":"/api/intake/state",accept:t?"application/json":"text/html",json:t}}function hA(e,t){let r=e[0];if(r==="list")return e.length!==1?"usage: lmctl api session list":{method:"GET",path:"/api/sessions",accept:t?"application/json":"text/html",json:t};if(r==="history"||r==="compact"||r==="refresh"){if(e.length!==3)return`usage: lmctl api session ${r} <team_name> <alias>`;let n=Oi(e[1]),s=encodeURIComponent(e[2]);return{method:r==="history"?"GET":"POST",path:`/api/sessions/${n}/${s}/${r}`,accept:t?"application/json":"text/html",json:t}}return"usage: lmctl api session <list|history|compact|refresh>"}function gA(e,t){let[r,n,s,i]=e;if(r!==void 0&&/^\d+$/.test(r)&&n===void 0){let o=ne(r,"run_id");return typeof o=="string"?o:{method:"GET",path:`/api/runs/${o}`,accept:"application/json",json:t!=="text"}}if(r==="resume"){if(n===void 0)return"usage: lmctl api run resume <run_id> --outcome <value>";let o=ne(n,"run_id");if(typeof o=="string")return o;let a;for(let l=2;l<e.length;l+=1){let c=e[l];if(c!=="--outcome")return re(c);let d=e[++l];if(d===void 0||d.startsWith("--"))return"missing value for --outcome";a=d}return a===void 0?"missing value for --outcome":{method:"POST",path:`/api/runs/${o}/resume?outcome=${encodeURIComponent(a)}`,accept:t==="text"?"text/html":"application/json",json:t!=="text"}}if(r==="get"){if(n===void 0||s!==void 0)return"usage: lmctl api run get <run_id>";let o=ne(n,"run_id");return typeof o=="string"?o:{method:"GET",path:`/api/runs/${o}`,accept:"application/json",json:t!=="text"}}if(r==="step"||r==="transcript"||r==="messages"){if(n===void 0||s===void 0||i!==void 0)return`usage: lmctl api run ${r} <run_id> <step_id>`;let o=ne(n,"run_id");if(typeof o=="string")return o;let a=ne(s,"step_id");if(typeof a=="string")return a;let l=r==="step"?"":`/${r}`,c=r==="transcript"&&t==="text";return{method:"GET",path:`/api/runs/${o}/steps/${a}${l}`,accept:c?"text/plain":"application/json",json:!c}}if(r==="artifacts"){if(n===void 0)return"usage: lmctl api run artifacts <run_id> [--kind K]";let o=ne(n,"run_id");if(typeof o=="string")return o;let a;for(let c=2;c<e.length;c+=1){let d=e[c];if(d!=="--kind")return re(d);let u=e[++c];if(u===void 0)return"missing value for --kind";a=u}let l=a===void 0?"":`?kind=${encodeURIComponent(a)}`;return{method:"GET",path:`/api/runs/${o}/artifacts${l}`,accept:"application/json",json:t!=="text"}}if(r==="where"){if(n===void 0||s!==void 0)return"usage: lmctl api run where <run_id>";let o=ne(n,"run_id");return typeof o=="string"?o:{method:"GET",path:`/api/runs/${o}/where`,accept:t==="text"?"text/plain":"application/json",json:t!=="text"}}if(r==="timeline"){if(n===void 0||s!==void 0)return"usage: lmctl api run timeline <run_id>";let o=ne(n,"run_id");return typeof o=="string"?o:{method:"GET",path:`/api/runs/${o}/timeline`,accept:t==="text"?"text/plain":"application/json",json:t!=="text"}}return"usage: lmctl api run <id|get|step|transcript|messages|resume|artifacts|where|timeline>"}function ne(e,t){return e===void 0||e.startsWith("--")?`missing value for ${t}`:!/^\d+$/.test(e)||Number(e)<=0?`invalid ${t}: ${e}`:Number(e)}function re(e){return e.startsWith("--")?`unknown flag: ${e}`:`unknown argument: ${e}`}function B_(e,t){let r=[],n=!1;for(let s of e){if(s===t){n=!0;continue}r.push(s)}return{rest:r,present:n}}async function yA(e,t){let r=j_(e);if(typeof r=="string")return t.stderr.write(`error: ${r}
1636
+ `),0}function A_(e,t,r){return e!=="api.token"||r?t:t.length<=8?"***":`${t.slice(0,8)}\u2026(masked; use --show-secrets to reveal)`}function Yx(e,t){if(t.length===0)return`${e} value must be non-empty`;if(e==="api.port"){let r=Number(t);if(!Number.isInteger(r)||r<=0||r>65535)return`invalid api.port: ${t}`}if(e==="api.url")try{new URL(t)}catch{return`invalid api.url: ${t}`}if(e===Mi||e===ji){let r=Number(t);if(!Number.isInteger(r)||r<=0)return`invalid ${e}: ${t}`}return null}function zx(e,t){let r=Lx(e),n=r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength),s=new FormData;return s.append("image",new Blob([n],{type:Zx(e)}),Ox(e)),t!==void 0&&s.append("project",t),s}function Zx(e){switch($x(e).toLowerCase()){case".png":return"image/png";case".jpg":case".jpeg":return"image/jpeg";case".webp":return"image/webp";case".heic":return"image/heic";case".pdf":return"application/pdf";default:return"application/octet-stream"}}function Qx(e){if(e!==null&&typeof e=="object"&&!Array.isArray(e)){let t=e.id;return typeof t=="number"&&Number.isInteger(t)?t:null}return null}function eA(e,t){let[r,...n]=e;if(r===void 0)return"usage: lmctl api pr <id|list|get>";if(r==="list")return is(n,"--status","/api/submitted-prs","status",t);if(r==="get"){let[s]=n;return s===void 0?"usage: api pr get <id-or-url>":/^\d+$/.test(s)?{method:"GET",path:`/api/submitted-prs/${s}`,accept:"application/json",json:t}:{method:"GET",path:`/api/submitted-prs?pr_url=${encodeURIComponent(s)}`,accept:"application/json",json:t}}return/^\d+$/.test(r)?{method:"GET",path:`/api/submitted-prs/${r}`,accept:"application/json",json:t}:`usage: lmctl api pr <id|list|get>; got: ${r}`}function j_(e){let t=[],r="json";for(let n of e)n==="--json"?r="json":n==="--text"?r="text":t.push(n);return{args:t,format:r}}function Vi(e,t,r){return e.length>0?re(e[0]):{method:"GET",path:t,accept:r?"application/json":"text/html",json:r}}function is(e,t,r,n,s,i=!1){let o;for(let l=0;l<e.length;l+=1){let c=e[l];if(c!==t)return re(c);let d=e[++l];if(d===void 0||d.startsWith("--"))return`missing value for ${t}`;if(i&&(!/^\d+$/.test(d)||Number(d)<=0))return`invalid ${t}: ${d}`;o=d}let a=o===void 0?"":`?${n}=${encodeURIComponent(o)}`;return{method:"GET",path:`${r}${a}`,accept:s?"application/json":"text/html",json:s}}function R_(e,t,r,n,s){let i=!1;for(let o of e){if(o!==t)return re(o);i=!0}return{method:"GET",path:`${r}${i?`?${n}=true`:""}`,accept:s?"application/json":"text/html",json:s}}function tA(e,t,r){if(e.length!==1)return`usage: lmctl api ${r} <id>`;let n=ne(e[0],"id");return typeof n=="string"?n:{method:"GET",path:`${t}/${n}`,accept:"application/json",json:!0}}function rA(e,t){let[r,...n]=e;if(r!==void 0&&n.length===0&&r!=="enqueue"&&r!=="run")return tA([r],"/api/jobs","job");if(r==="enqueue"){let s,i,o="manual",a,l,c;for(let u=0;u<n.length;u+=1){let f=n[u],m=n[++u];if(m===void 0||m.startsWith("--"))return`missing value for ${f}`;if(f==="--project")s=m;else if(f==="--project-id"){let p=Number(m);if(!Number.isInteger(p))return`invalid --project-id: ${m}`;i=p}else if(f==="--source")o=m;else if(f==="--payload")a=m;else if(f==="--dedupe-key")l=m;else if(f==="--priority"){let p=Number(m);if(!Number.isInteger(p))return`invalid --priority: ${m}`;c=p}else return re(f)}if(s===void 0&&i===void 0)return"usage: lmctl api job enqueue (--project NAME | --project-id ID) [--source S] [--payload JSON] [--dedupe-key K] [--priority N]";let d={source:o};return s!==void 0&&(d.project=s),i!==void 0&&(d.project_id=i),a!==void 0&&(d.payload=xc(a)),l!==void 0&&(d.dedupe_key=l),c!==void 0&&(d.priority=c),{method:"POST",path:"/api/jobs",accept:"application/json",json:t,body:JSON.stringify(d)}}if(r==="run"){if(n.length!==1)return"usage: lmctl api job run <id>";let s=ne(n[0],"id");return typeof s=="string"?s:{method:"POST",path:`/api/jobs/${s}/run`,accept:"application/json",json:t}}return"usage: lmctl api job <id|enqueue|run>"}function nA(e,t){let[r,...n]=e;if(r==="list"){let[s,...i]=n;if(s===void 0||s.startsWith("--"))return"usage: lmctl api issues list <project> [--status STATUS] [--severity SEVERITY] [--ai-test-path P]";let o=new URLSearchParams;for(let l=0;l<i.length;l+=1){let c=i[l],d=i[++l];if(d===void 0||d.startsWith("--"))return`missing value for ${c}`;if(c==="--status")o.set("status",d);else if(c==="--severity")o.set("severity",d);else if(c==="--ai-test-path")o.set("ai_test_path",d);else return re(c)}let a=o.toString();return{method:"GET",path:`/api/projects/${encodeURIComponent(s)}/issues${a.length>0?`?${a}`:""}`,accept:t?"application/json":"text/html",json:t}}if(r==="show"){if(n.length!==1)return"usage: lmctl api issues show <id>";let s=ne(n[0],"id");return typeof s=="string"?s:{method:"GET",path:`/api/issues/${s}`,accept:"application/json",json:t}}return r==="create"?D_(n,t):r==="claim"?P_(n,t):r==="claim-next"?F_(n,t):r==="close"?U_(n,t):r==="reopen"?W_(n,t):"usage: lmctl api issues <list|show|create|claim|claim-next|close|reopen>"}function D_(e,t){let[r,...n]=e;if(r===void 0||r.startsWith("--"))return"usage: lmctl api issues create <project> --title T --body B [--severity S] [--labels JSON] [--ai-test-path P]";let s=new Set(["--title","--body"]),i={};for(let o=0;o<n.length;o+=1){let a=n[o],l=n[++o];if(l===void 0)return`missing value for ${a}`;if(!s.has(a)&&l.startsWith("--"))return`missing value for ${a}`;if(a==="--title")i.title=l;else if(a==="--body")i.body=l;else if(a==="--severity")i.severity=l;else if(a==="--labels")i.labels=xc(l);else if(a==="--ai-test-path")i.ai_test_path=l;else if(a==="--source-run-id"){let c=ne(l,"--source-run-id");if(typeof c=="string")return c;i.source_run_id=c}else return re(a)}return typeof i.title!="string"?"missing value for --title":typeof i.body!="string"?"missing value for --body":{method:"POST",path:`/api/projects/${encodeURIComponent(r)}/issues`,accept:"application/json",json:t,body:JSON.stringify(i)}}function P_(e,t){let[r,...n]=e;if(r===void 0)return"usage: lmctl api issues claim <id> --assigned-run-id RUN";let s=ne(r,"id");if(typeof s=="string")return s;let i={};for(let o=0;o<n.length;o+=1){let a=n[o],l=n[++o];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--assigned-run-id"){let c=ne(l,"--assigned-run-id");if(typeof c=="string")return c;i.assigned_run_id=c}else return re(a)}return typeof i.assigned_run_id!="number"?"missing value for --assigned-run-id":{method:"POST",path:`/api/issues/${s}/claim`,accept:"application/json",json:t,body:JSON.stringify(i)}}function F_(e,t){let[r,...n]=e;if(r===void 0||r.startsWith("--"))return"usage: lmctl api issues claim-next <project> --assigned-run-id RUN";let s={};for(let i=0;i<n.length;i+=1){let o=n[i],a=n[++i];if(a===void 0||a.startsWith("--"))return`missing value for ${o}`;if(o==="--assigned-run-id"){let l=ne(a,"--assigned-run-id");if(typeof l=="string")return l;s.assigned_run_id=l}else return re(o)}return typeof s.assigned_run_id!="number"?"missing value for --assigned-run-id":{method:"POST",path:`/api/projects/${encodeURIComponent(r)}/issues/claim-next`,accept:"application/json",json:t,body:JSON.stringify(s)}}function U_(e,t){let[r,...n]=e;if(r===void 0)return"usage: lmctl api issues close <id> [--commit-hash SHA] [--closed-run-id RUN]";let s=ne(r,"id");if(typeof s=="string")return s;let i={};for(let o=0;o<n.length;o+=1){let a=n[o],l=n[++o];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--commit-hash")i.commit_hash=l;else if(a==="--closed-run-id"){let c=ne(l,"--closed-run-id");if(typeof c=="string")return c;i.closed_run_id=c}else return re(a)}return{method:"POST",path:`/api/issues/${s}/close`,accept:"application/json",json:t,body:JSON.stringify(i)}}function W_(e,t){let[r,...n]=e;if(r===void 0)return"usage: lmctl api issues reopen <id> [--source-run-id RUN]";let s=ne(r,"id");if(typeof s=="string")return s;let i={};for(let o=0;o<n.length;o+=1){let a=n[o],l=n[++o];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--source-run-id"){let c=ne(l,"--source-run-id");if(typeof c=="string")return c;i.source_run_id=c}else return re(a)}return{method:"POST",path:`/api/issues/${s}/reopen`,accept:"application/json",json:t,body:JSON.stringify(i)}}function sA(e,t){let[r,...n]=e;if(r===void 0||r.startsWith("--"))return"usage: lmctl api upload <file> [--project NAME] [--json]";let s;for(let i=0;i<n.length;i+=1){let o=n[i];if(o!=="--project")return re(o);let a=n[++i];if(a===void 0||a.startsWith("--"))return"missing value for --project";s=a}return{method:"POST",path:"/api/uploads",accept:"application/json",json:t,upload:{filePath:r,project:s}}}function iA(e,t){let r,n,s,i;for(let a=0;a<e.length;a+=1){let l=e[a],c=e[++a];if(c===void 0||c.startsWith("--"))return`missing value for ${l}`;if(l==="--workflow")r=c;else if(l==="--workflow-id-override"){let d=Number(c);if(!Number.isInteger(d)||d<=0)return`invalid --workflow-id-override: ${c}`;n=d}else if(l==="--project")s=c;else if(l==="--inputs")try{let d=JSON.parse(c);if(d===null||typeof d!="object"||Array.isArray(d))return"--inputs must be a JSON object";i=d}catch{return"invalid --inputs JSON"}else return re(l)}if(r===void 0&&n===void 0)return"missing value for --workflow";if(i===void 0)return"missing value for --inputs";let o={source:"api-submit-job",payload:i};return r!==void 0&&(o.workflow=r),n!==void 0&&(o.workflow_id_override=n),s!==void 0&&(o.project=s),{method:"POST",path:"/api/jobs",accept:"application/json",json:t,body:JSON.stringify(o),runAfterSubmit:!0}}function xc(e){try{return JSON.parse(e)}catch{return e}}function oA(e,t){let[r,n]=e;return r!=="show"||n===void 0||e.length!==2?"usage: lmctl api workflow show <name>":{method:"GET",path:`/api/workflows/${encodeURIComponent(n)}`,accept:"application/json",json:t}}function aA(e,t){for(let r of e)if(!(r==="--json"||r==="--text"))return re(r);return{method:"GET",path:"/api/workflows/verify",accept:t==="text"?"text/plain":"application/json",json:t!=="text"}}function lA(e,t){let[r,n,...s]=e;return r==="workflow"?cA([n,...s].filter(i=>i!==void 0),t):r!=="show"||n===void 0||e.length!==2?"usage: lmctl api project <show|workflow>":{method:"GET",path:`/api/projects/${encodeURIComponent(n)}`,accept:"application/json",json:t}}function cA(e,t){let[r,...n]=e;if(r==="list")return n.length!==1?"usage: lmctl api project workflow list <project>":{method:"GET",path:`/api/projects/${encodeURIComponent(n[0])}/workflows`,accept:t?"application/json":"text/html",json:t};if(r==="show"){if(n.length!==1)return"usage: lmctl api project workflow show <id>";let s=ne(n[0],"id");return typeof s=="string"?s:{method:"GET",path:`/api/projects/workflows/${s}`,accept:t?"application/json":"text/html",json:t}}if(r==="remove"||r==="enable"||r==="disable"){if(n.length!==1)return`usage: lmctl api project workflow ${r} <id>`;let s=ne(n[0],"id");if(typeof s=="string")return s;let i=r==="remove"?"DELETE":"POST",o=r==="remove"?"":`/${r}`;return{method:i,path:`/api/projects/workflows/${s}${o}`,accept:"application/json",json:t}}if(r==="add"){let s=dA(n);return typeof s=="string"?s:{method:"POST",path:`/api/projects/${encodeURIComponent(s.project)}/workflows`,accept:"application/json",json:t,body:JSON.stringify(s.body)}}return"usage: lmctl api project workflow <add|list|show|remove|enable|disable>"}function dA(e){let[t,r,...n]=e;if(t===void 0||r===void 0)return"usage: lmctl api project workflow add <project> <workflow> [--condition JEXL] [--params JSON] [--priority N]";let s={workflow:r};for(let i=0;i<n.length;i+=1){let o=n[i],a=n[++i];if(a===void 0||a.startsWith("--"))return`missing value for ${o}`;if(o==="--condition")s.condition=a;else if(o==="--params")s.params=xc(a);else if(o==="--priority"){let l=Number(a);if(!Number.isInteger(l))return`invalid --priority: ${a}`;s.priority=l}else return re(o)}return{project:t,body:s}}function uA(e,t){if(e[0]!=="get")return"usage: lmctl api artifact get --run R --kind K [--raw]";let r,n,s=!1;for(let o=1;o<e.length;o+=1){let a=e[o];if(a==="--raw"){s=!0;continue}let l=e[++o];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--run"){let c=ne(l,"run");if(typeof c=="string")return c;r=c}else if(a==="--kind")n=l;else return re(a)}return r===void 0||n===void 0?"usage: lmctl api artifact get --run R --kind K [--raw]":{method:"GET",path:`/api/runs/${r}/artifacts/${encodeURIComponent(n)}${s?"?raw=true":""}`,accept:s?"text/plain":"application/json",json:!s&&t}}function fA(e,t){if(e[0]!=="ack"||e.length!==2)return"usage: lmctl api attention ack <id>";let r=ne(e[1],"id");return typeof r=="string"?r:{method:"POST",path:`/api/attentions/${r}/ack`,accept:t?"application/json":"text/html",json:t}}function mA(e,t){return e.length!==1||e[0]!=="run-throughput"?"usage: lmctl api stats run-throughput":{method:"GET",path:"/api/stats/run-throughput",accept:t?"application/json":"text/html",json:t}}function pA(e,t){return e.length!==1||e[0]!=="state"&&e[0]!=="cycle"?"usage: lmctl api daemon <state|cycle>":{method:e[0]==="cycle"?"POST":"GET",path:e[0]==="cycle"?"/api/daemon/cycle":"/api/daemon/state",accept:t?"application/json":"text/html",json:t}}function _A(e,t){return e.length!==1||e[0]!=="state"&&e[0]!=="scan"?"usage: lmctl api intake <state|scan>":{method:e[0]==="scan"?"POST":"GET",path:e[0]==="scan"?"/api/intake/scan":"/api/intake/state",accept:t?"application/json":"text/html",json:t}}function hA(e,t){let r=e[0];if(r==="list")return e.length!==1?"usage: lmctl api session list":{method:"GET",path:"/api/sessions",accept:t?"application/json":"text/html",json:t};if(r==="history"||r==="compact"||r==="refresh"){if(e.length!==3)return`usage: lmctl api session ${r} <team_name> <alias>`;let n=$i(e[1]),s=encodeURIComponent(e[2]);return{method:r==="history"?"GET":"POST",path:`/api/sessions/${n}/${s}/${r}`,accept:t?"application/json":"text/html",json:t}}return"usage: lmctl api session <list|history|compact|refresh>"}function gA(e,t){let[r,n,s,i]=e;if(r!==void 0&&/^\d+$/.test(r)&&n===void 0){let o=ne(r,"run_id");return typeof o=="string"?o:{method:"GET",path:`/api/runs/${o}`,accept:"application/json",json:t!=="text"}}if(r==="resume"){if(n===void 0)return"usage: lmctl api run resume <run_id> --outcome <value>";let o=ne(n,"run_id");if(typeof o=="string")return o;let a;for(let l=2;l<e.length;l+=1){let c=e[l];if(c!=="--outcome")return re(c);let d=e[++l];if(d===void 0||d.startsWith("--"))return"missing value for --outcome";a=d}return a===void 0?"missing value for --outcome":{method:"POST",path:`/api/runs/${o}/resume?outcome=${encodeURIComponent(a)}`,accept:t==="text"?"text/html":"application/json",json:t!=="text"}}if(r==="get"){if(n===void 0||s!==void 0)return"usage: lmctl api run get <run_id>";let o=ne(n,"run_id");return typeof o=="string"?o:{method:"GET",path:`/api/runs/${o}`,accept:"application/json",json:t!=="text"}}if(r==="step"||r==="transcript"||r==="messages"){if(n===void 0||s===void 0||i!==void 0)return`usage: lmctl api run ${r} <run_id> <step_id>`;let o=ne(n,"run_id");if(typeof o=="string")return o;let a=ne(s,"step_id");if(typeof a=="string")return a;let l=r==="step"?"":`/${r}`,c=r==="transcript"&&t==="text";return{method:"GET",path:`/api/runs/${o}/steps/${a}${l}`,accept:c?"text/plain":"application/json",json:!c}}if(r==="artifacts"){if(n===void 0)return"usage: lmctl api run artifacts <run_id> [--kind K]";let o=ne(n,"run_id");if(typeof o=="string")return o;let a;for(let c=2;c<e.length;c+=1){let d=e[c];if(d!=="--kind")return re(d);let u=e[++c];if(u===void 0)return"missing value for --kind";a=u}let l=a===void 0?"":`?kind=${encodeURIComponent(a)}`;return{method:"GET",path:`/api/runs/${o}/artifacts${l}`,accept:"application/json",json:t!=="text"}}if(r==="where"){if(n===void 0||s!==void 0)return"usage: lmctl api run where <run_id>";let o=ne(n,"run_id");return typeof o=="string"?o:{method:"GET",path:`/api/runs/${o}/where`,accept:t==="text"?"text/plain":"application/json",json:t!=="text"}}if(r==="timeline"){if(n===void 0||s!==void 0)return"usage: lmctl api run timeline <run_id>";let o=ne(n,"run_id");return typeof o=="string"?o:{method:"GET",path:`/api/runs/${o}/timeline`,accept:t==="text"?"text/plain":"application/json",json:t!=="text"}}return"usage: lmctl api run <id|get|step|transcript|messages|resume|artifacts|where|timeline>"}function ne(e,t){return e===void 0||e.startsWith("--")?`missing value for ${t}`:!/^\d+$/.test(e)||Number(e)<=0?`invalid ${t}: ${e}`:Number(e)}function re(e){return e.startsWith("--")?`unknown flag: ${e}`:`unknown argument: ${e}`}function B_(e,t){let r=[],n=!1;for(let s of e){if(s===t){n=!0;continue}r.push(s)}return{rest:r,present:n}}async function yA(e,t){let r=j_(e);if(typeof r=="string")return t.stderr.write(`error: ${r}
1637
1637
  `),2;let n=r.args,s=r.format!=="text",[i,...o]=n;if(i===void 0)return t.stderr.write(`error: --direct requires a subcommand (issues|status|projects|workflows|runs|attentions)
1638
1638
  `),2;let a=t.dal===void 0,l=t.dal??Ie({path:le()});try{if(i==="issues"){let[c,...d]=o;return c===void 0?(t.stderr.write(`error: --direct issues requires a subcommand (list|show|create|claim|claim-next|close|reopen)
1639
1639
  `),2):c==="create"?wA(l,d,t,s):c==="claim"?EA(l,d,t,s):c==="claim-next"?TA(l,d,t,s):c==="close"?bA(l,d,t,s):c==="reopen"?SA(l,d,t,s):c==="list"?NA(l,d,t,s):c==="show"?xA(l,d,t,s):(t.stderr.write(`error: --direct does not support: issues ${c} (supported: list, show, create, claim, claim-next, close, reopen)
1640
- `),2)}return i==="status"?AA(l,o,t,s):i==="projects"?RA(l,o,t,s):i==="workflows"?LA(l,o,t,s):i==="runs"?$A(l,o,t,s):i==="attentions"||i==="attention"?PA(l,o,t,s):i==="escalations"?q_(l,o,t):(t.stderr.write(`error: --direct is not supported for: ${i} (supported: issues, status, projects, workflows, runs, attentions, escalations, run where, run timeline)
1640
+ `),2)}return i==="status"?AA(l,o,t,s):i==="projects"?RA(l,o,t,s):i==="workflows"?LA(l,o,t,s):i==="runs"?OA(l,o,t,s):i==="attentions"||i==="attention"?PA(l,o,t,s):i==="escalations"?q_(l,o,t):(t.stderr.write(`error: --direct is not supported for: ${i} (supported: issues, status, projects, workflows, runs, attentions, escalations, run where, run timeline)
1641
1641
  `),2)}catch(c){return t.stderr.write(`error: ${c instanceof Error?c.message:String(c)}
1642
1642
  `),1}finally{a&&l.close()}}function Ge(e,t,r){e.stdout.write(`${r?JSON.stringify(t,null,2):JSON.stringify(t)}
1643
1643
  `)}function wA(e,t,r,n){let s=D_(t,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
@@ -1655,10 +1655,10 @@ ${r}`:r}function fp(e,t){let r=j0[t.tool];return r?new Promise((n,s)=>{let i=t.b
1655
1655
  `),2;let c=e.closeIssue(i,l,typeof o.commit_hash=="string"?o.commit_hash:null);return Ge(r,c,n),0}function SA(e,t,r,n){let s=W_(t,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
1656
1656
  `),2;let i=Number(s.path.match(/\/api\/issues\/(\d+)\/reopen$/)[1]),o=JSON.parse(s.body),a=e.getIssue(i);if(a===null)return r.stderr.write(`error: issue not found: ${i}
1657
1657
  `),1;let l=typeof o.source_run_id=="number"?o.source_run_id:a.closed_run_id??a.source_run_id;if(l===null)return r.stderr.write(`error: missing source_run_id
1658
- `),2;let c=e.reopenIssue(i,l);return Ge(r,c,n),0}function vA(e){if(e!=null)return typeof e=="string"&&$_.includes(e)?e:{error:`invalid severity: ${String(e)}`}}function kA(e){if(e==null)return null;if(typeof e=="string")try{let t=JSON.parse(e);return Array.isArray(t)&&t.every(r=>typeof r=="string")?JSON.stringify(t):"error:labels must be a JSON string array"}catch{return"error:invalid labels JSON"}return Array.isArray(e)&&e.every(t=>typeof t=="string")?JSON.stringify(e):"error:labels must be a JSON string array"}function NA(e,t,r,n){let[s,...i]=t;if(s===void 0||s.startsWith("--"))return r.stderr.write(`error: usage: lmctl api --direct issues list <project> [--status STATUS] [--severity SEVERITY] [--ai-test-path P]
1658
+ `),2;let c=e.reopenIssue(i,l);return Ge(r,c,n),0}function vA(e){if(e!=null)return typeof e=="string"&&O_.includes(e)?e:{error:`invalid severity: ${String(e)}`}}function kA(e){if(e==null)return null;if(typeof e=="string")try{let t=JSON.parse(e);return Array.isArray(t)&&t.every(r=>typeof r=="string")?JSON.stringify(t):"error:labels must be a JSON string array"}catch{return"error:invalid labels JSON"}return Array.isArray(e)&&e.every(t=>typeof t=="string")?JSON.stringify(e):"error:labels must be a JSON string array"}function NA(e,t,r,n){let[s,...i]=t;if(s===void 0||s.startsWith("--"))return r.stderr.write(`error: usage: lmctl api --direct issues list <project> [--status STATUS] [--severity SEVERITY] [--ai-test-path P]
1659
1659
  `),2;let o,a,l;for(let u=0;u<i.length;u+=1){let f=i[u],m=i[++u];if(m===void 0||m.startsWith("--"))return r.stderr.write(`error: missing value for ${f}
1660
1660
  `),2;if(f==="--status"){let p=L_(m,IA);if(typeof p=="string")return r.stderr.write(`error: ${p}
1661
- `),2;o=p}else if(f==="--severity"){let p=L_(m,$_);if(typeof p=="string")return r.stderr.write(`error: ${p}
1661
+ `),2;o=p}else if(f==="--severity"){let p=L_(m,O_);if(typeof p=="string")return r.stderr.write(`error: ${p}
1662
1662
  `),2;a=p}else if(f==="--ai-test-path")l=m;else return r.stderr.write(`error: ${re(f)}
1663
1663
  `),2}let c=e.findProjectByName(s);if(c===null)return r.stderr.write(`error: project not found: ${s}
1664
1664
  `),1;let d=e.listIssues(c.id,{...o!==void 0?{status:o}:{},...a!==void 0?{severity:a}:{},...l!==void 0?{ai_test_path:l}:{}});return Ge(r,d,n),0}function xA(e,t,r,n){if(t.length!==1)return r.stderr.write(`error: usage: lmctl api --direct issues show <id>
@@ -1667,10 +1667,10 @@ ${r}`:r}function fp(e,t){let r=j0[t.tool];return r?new Promise((n,s)=>{let i=t.b
1667
1667
  `),1):(Ge(r,i,n),0)}function AA(e,t,r,n){return t.length>0?(r.stderr.write(`error: ${re(t[0])}
1668
1668
  `),2):(Ge(r,Pi(e),n),0)}function RA(e,t,r,n){return t.length>0?(r.stderr.write(`error: ${re(t[0])}
1669
1669
  `),2):(Ge(r,Fi(e),n),0)}function LA(e,t,r,n){return t.length>0?(r.stderr.write(`error: ${re(t[0])}
1670
- `),2):(Ge(r,Ui(e),n),0)}function $A(e,t,r,n){let s;for(let i=0;i<t.length;i+=1){let o=t[i],a=t[++i];if(a===void 0||a.startsWith("--"))return r.stderr.write(`error: missing value for ${o}
1670
+ `),2):(Ge(r,Ui(e),n),0)}function OA(e,t,r,n){let s;for(let i=0;i<t.length;i+=1){let o=t[i],a=t[++i];if(a===void 0||a.startsWith("--"))return r.stderr.write(`error: missing value for ${o}
1671
1671
  `),2;if(o==="--limit"){if(!/^\d+$/.test(a)||Number(a)<=0)return r.stderr.write(`error: invalid --limit: ${a}
1672
1672
  `),2;s=Number(a)}else return r.stderr.write(`error: ${re(o)}
1673
- `),2}return Ge(r,sn(e,s!==void 0?{limit:s}:{}),n),0}function OA(e,t){let[r,...n]=e;if(r===void 0)return t.stderr.write(`error: usage: lmctl api --direct run where <run_id> [--json]
1673
+ `),2}return Ge(r,sn(e,s!==void 0?{limit:s}:{}),n),0}function $A(e,t){let[r,...n]=e;if(r===void 0)return t.stderr.write(`error: usage: lmctl api --direct run where <run_id> [--json]
1674
1674
  `),2;if(!/^\d+$/.test(r)||Number(r)<=0)return t.stderr.write(`error: invalid run_id: ${r}
1675
1675
  `),2;let s=!1;for(let a of n){if(a==="--json"){s=!0;continue}return t.stderr.write(`error: ${re(a)}
1676
1676
  `),2}let i=t.dal===void 0,o=t.dal??Ie({path:le()});try{let a=on(o,Number(r));return a===null?(t.stderr.write(`error: run not found: ${r}
@@ -1720,12 +1720,12 @@ ${r}`:r}function fp(e,t){let r=j0[t.tool];return r?new Promise((n,s)=>{let i=t.b
1720
1720
  `),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})
1721
1721
  `),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)}
1722
1722
  `):r.stdout.write(`ok: attention ${o} acknowledged; step ${l.step_id} resumed (session_status=${f.session_status})
1723
- `),0}function L_(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 Cx,Mx,$_,Gi,Ux,Wx,Bx,qx,IA,J_=T(()=>{"use strict";Ze();Je();Ci();Tc();Bt();Cx="http://127.0.0.1:8787",Mx=`usage: lmctl api [--direct] <subcommand> ...
1723
+ `),0}function L_(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 Cx,Mx,O_,Gi,Ux,Wx,Bx,qx,IA,J_=T(()=>{"use strict";Ze();Je();Ci();Tc();Bt();Cx="http://127.0.0.1:8787",Mx=`usage: lmctl api [--direct] <subcommand> ...
1724
1724
 
1725
1725
  Call the lmctl HTTP API using the configured daemon URL/token. Some
1726
1726
  workflow shellstep-safe commands also support --direct to use the local DAL
1727
1727
  without an HTTP round trip.
1728
- `,$_=["low","medium","high","critical"];Gi=new Set(["api.url","api.port","api.token","project.docroot",Mi,ji]);Ux=`usage: lmctl api escalations <list|show|respond>
1728
+ `,O_=["low","medium","high","critical"];Gi=new Set(["api.url","api.port","api.token","project.docroot",Mi,ji]);Ux=`usage: lmctl api escalations <list|show|respond>
1729
1729
 
1730
1730
  list [--project P] [--all] [--since DURATION] [--json]
1731
1731
  Print pending operator escalations (interactive_waiting_operator
@@ -1750,27 +1750,27 @@ without an HTTP round trip.
1750
1750
 
1751
1751
  Verify every workflows/*.compound.json file: load/validate the workflow graph
1752
1752
  and report the first step that would be started. Default output is the TTY
1753
- table; --json emits the structured WorkflowVerifyReport payload.`;IA=["open","assigned","closed","reopened"]});import X_ from"jexl";function an(e){X_.compile(G_(e))}async function $r(e,t){return X_.eval(G_(e),t)}function G_(e){return e.replace(/([A-Za-z_$][\w$.[\]]*)\.includes\(([^()]+)\)/g,"($2 in $1)")}var os=T(()=>{"use strict"});import{z as E}from"zod";function Mc(e){let t=e.trim();return t.startsWith("={{")&&t.endsWith("}}")?t.slice(3,-2).trim():e}var UA,V_,Ac,Rc,Lc,$c,Oc,Cc,K_,WA,BA,qA,as,HA,Yi,zi,Zi,Qi,eo,Y_,JA,XA,GA,VA,to,ln=T(()=>{"use strict";os();UA=E.object({kind:E.enum(["success","neutral","failure"])}),V_=E.enum(["string","number","boolean","object","array"]),Ac=E.object({name:E.string().min(1),type:V_,required:E.boolean().optional(),default:E.unknown().optional(),description:E.string().optional()}),Rc=E.object({name:E.string().min(1),type:V_,source_step_id:E.string().min(1),source_field:E.string().min(1),description:E.string().optional()}),Lc=E.object({id:E.string().min(1),type:E.string().min(1),parameters:E.record(E.string(),E.unknown()).default({})}),$c="__failure__",Oc=E.object({tools:E.array(E.string().min(1)).optional(),auth:E.array(E.string().min(1)).optional()}).strict().optional(),Cc=E.object({on_unhandled_failure:E.object({attention_kind:E.string().min(1).default("workflow_failed"),severity:E.enum(["warn","error","critical"]).default("warn"),capture_evidence:E.boolean().default(!0),recommend_recovery:E.string().min(1).optional()}).optional(),on_unhandled_failure_state:E.string().min(1).optional()}).optional(),K_=E.object({type:E.literal("AssertRepoClean"),fail_message:E.string().min(1).optional(),next:E.string().min(1)}),WA=E.object({name:E.string().min(1),command:E.string().min(1).optional(),args:E.array(E.string()).optional(),env:E.record(E.string(),E.string()).optional(),type:E.enum(["stdio","http","sse"]).optional(),url:E.string().min(1).optional(),headers:E.record(E.string(),E.string()).optional()}).strict(),BA=E.union([E.string().min(1),WA]),qA=E.union([E.string().min(1),E.object({name:E.string().min(1),content:E.string().min(1)}).strict()]),as=E.object({team:E.string().min(1),alias:E.string().min(1),prompt_template:E.string().optional(),mcp:E.array(BA).optional(),skills:E.array(qA).optional()}),HA=E.object({kind:E.literal("shell"),command:E.string().min(1),description:E.string().optional()}),Yi=E.object({type:E.literal("Review"),state_name:E.string().min(1),coder:as,pre_checks:E.array(HA).optional(),reviewers:E.array(as.extend({rubric_artifact:E.string().optional()})).optional(),outcomes:E.object({approve:E.string().min(1),request_changes:E.string().optional(),fail_pre_check:E.string().optional(),max_loops_exceeded:E.string().optional()}),writes_to_project_path:E.boolean().optional(),durable_memory_tags:E.array(E.string().min(1)).optional(),write_back_durable_memory:E.union([E.boolean(),E.string().min(1)]).optional(),max_loops:E.number().int().positive().default(5),loop_feedback_artifact:E.string().optional(),outcomes_from_stance:E.record(E.string(),E.string().min(1)).optional()}).superRefine((e,t)=>{(e.reviewers??[]).length>0&&e.outcomes_from_stance!==void 0&&t.addIssue({code:"custom",path:["outcomes_from_stance"],message:"outcomes_from_stance cannot be used when reviewers is non-empty"})}),zi=E.object({type:E.literal("Consolidate"),state_name:E.string().min(1),researchers:E.array(as.extend({topic:E.string().min(1)})).optional(),consolidator:as,outcomes:E.object({ok:E.string().min(1),error:E.string().optional()}),research_artifact_prefix:E.string().optional(),durable_memory_tags:E.array(E.string().min(1)).optional(),write_back_durable_memory:E.union([E.boolean(),E.string().min(1)]).optional()}),Zi=E.object({type:E.literal("Interactive"),state_name:E.string().min(1),agent:as.extend({initial_prompt_template:E.string().min(1)}),termination:E.object({operator_signal:E.boolean().default(!0),agent_signal:E.string().optional(),max_turns:E.number().int().positive().default(20),timeout_seconds:E.number().int().positive().optional()}),outcomes:E.object({done:E.string().min(1),timeout:E.string().optional()}),artifact_name:E.string().optional(),durable_memory_tags:E.array(E.string().min(1)).optional(),write_back_durable_memory:E.union([E.boolean(),E.string().min(1)]).optional()}),Qi=E.object({type:E.literal("Loop"),state_name:E.string().min(1),over:E.string().min(1),item_var:E.string().min(1),body:E.string().min(1),outcomes:E.object({ok:E.string().min(1),error:E.string().optional()}),stop_on_error:E.boolean().default(!0),max_items:E.number().int().positive().default(1e3)}),eo=E.object({type:E.literal("ShellStep"),state_name:E.string().min(1),command:E.string().min(1),outcomes_from_exit:E.record(E.string(),E.string().min(1)),timeout_ms:E.number().int().nonnegative().optional(),capture_output_to:E.string().optional(),writes_to_project_path:E.boolean().optional()}),Y_=E.object({type:E.literal("Choice"),state_name:E.string().min(1),branches:E.array(E.object({when:E.string().min(1),next:E.string().min(1)})).default([]),default_next:E.string().min(1).optional()}).superRefine((e,t)=>{for(let[r,n]of e.branches.entries())try{an(Mc(n.when))}catch(s){let i=s instanceof Error?s.message:"invalid expression";t.addIssue({code:"custom",path:["branches",r,"when"],message:`invalid jexl expression: ${i}`})}}),JA=E.discriminatedUnion("type",[K_,Yi,zi,Zi,Qi,eo,Y_]),XA=E.object({type:E.literal("ForEach"),state_name:E.string().min(1),items_from:E.string().min(1),mode:E.enum(["sequential","parallel"]).default("sequential"),max_concurrency:E.number().int().positive().default(1),on_item_failure:E.enum(["continue","stop"]).default("stop"),body:JA,outcomes:E.object({all_ok:E.string().min(1),any_failed:E.string().optional()})}).superRefine((e,t)=>{try{an(Mc(e.items_from))}catch(r){let n=r instanceof Error?r.message:"invalid expression";t.addIssue({code:"custom",path:["items_from"],message:`invalid jexl expression: ${n}`})}}),GA=E.object({type:E.literal("Subflow"),state_name:E.string().min(1),workflow_name:E.string().min(1),inputs:E.record(E.string(),E.string().min(1)).optional(),outcomes:E.record(E.string(),E.string().min(1))}).superRefine((e,t)=>{for(let[r,n]of Object.entries(e.inputs??{}))try{an(Mc(n))}catch(s){let i=s instanceof Error?s.message:"invalid expression";t.addIssue({code:"custom",path:["inputs",r],message:`invalid jexl expression: ${i}`})}}),VA=E.discriminatedUnion("type",[K_,Yi,zi,Zi,Qi,eo,Y_,XA,GA]),to=E.object({name:E.string().min(1),version:E.number().int().positive(),definition_schema_version:E.union([E.literal(1),E.literal(2)]),description:E.string().optional(),estimated_duration_ms:E.number().int().nonnegative().optional(),primitive_version:E.union([E.literal(1),E.literal(2)]).default(1),start_at:E.string().min(1),states:E.record(E.string().min(1),VA),terminals:E.record(E.string().min(1),UA),errors:Cc,concurrency_key:E.string().min(1).optional(),concurrent_limit:E.number().int().positive().optional(),default_task_timeout_ms:E.number().int().positive().max(216e5).optional(),inputs:E.array(Ac).optional(),outputs:E.array(Rc).optional(),triggers:E.array(Lc).optional(),read_only:E.boolean().optional(),requires:Oc}).superRefine((e,t)=>{e.definition_schema_version===1&&e.errors!==void 0&&t.addIssue({code:"custom",path:["errors"],message:"errors block requires definition_schema_version: 2"}),e.definition_schema_version===1&&e.concurrency_key!==void 0&&t.addIssue({code:"custom",path:["concurrency_key"],message:"concurrency_key requires definition_schema_version: 2"}),e.definition_schema_version===1&&e.default_task_timeout_ms!==void 0&&t.addIssue({code:"custom",path:["default_task_timeout_ms"],message:"default_task_timeout_ms requires definition_schema_version: 2"})})});import{z as K}from"zod";var KA,ro,YA,zA,ZA,It,cn=T(()=>{"use strict";ln();KA=/^s-[a-z0-9-]+-[a-f0-9]{4}$/,ro=K.string().regex(KA),YA=K.object({step_id:ro,type:K.literal("main"),index:K.number().int().min(0)}),zA=K.record(ro,K.record(K.string().min(1),K.array(K.array(YA)))),ZA=K.object({id:ro,name:K.string().min(1),type:K.string().min(1),typeVersion:K.number().int().positive().default(1),parameters:K.record(K.string(),K.unknown()).default({}),members:K.record(K.string(),K.unknown()).optional(),estimated_duration_ms:K.number().int().nonnegative().optional()}),It=K.object({schema_version:K.literal("lmctl/v3"),definition_schema_version:K.literal(3),name:K.string().min(1),version:K.number().int().positive(),description:K.string().optional(),estimated_duration_ms:K.number().int().nonnegative().optional(),default_task_timeout_ms:K.number().int().positive().max(216e5).optional(),concurrency_key:K.string().min(1).optional(),concurrent_limit:K.number().int().positive().optional(),errors:Cc,inputs:K.array(Ac).optional(),outputs:K.array(Rc).optional(),steps:K.array(ZA).min(1),connections:zA.default({}),entry_step_id:ro,triggers:K.array(Lc).optional(),read_only:K.boolean().optional(),requires:Oc}).superRefine((e,t)=>{let r=new Set;for(let[n,s]of e.steps.entries())r.has(s.id)&&t.addIssue({code:"custom",path:["steps",n,"id"],message:`duplicate step id: ${s.id}`}),r.add(s.id);r.has(e.entry_step_id)||t.addIssue({code:"custom",path:["entry_step_id"],message:`entry_step_id does not reference an existing step: ${e.entry_step_id}`});for(let[n,s]of Object.entries(e.connections)){r.has(n)||t.addIssue({code:"custom",path:["connections",n],message:`connection source does not reference an existing step: ${n}`});for(let[i,o]of Object.entries(s))for(let[a,l]of o.entries())for(let[c,d]of l.entries())r.has(d.step_id)||t.addIssue({code:"custom",path:["connections",n,i,a,c,"step_id"],message:`connection target does not reference an existing step: ${d.step_id}`})}})});function no(e){return Dc(e)}function Dc(e){if(Array.isArray(e))return e.map(Dc);if(e===null||typeof e!="object")return e;let t=e,r={};for(let n of Object.keys(t))r[n]=Dc(t[n]);if(typeof r.type=="string"){let n=eR[r.type];n!==void 0&&(r.type=n)}return r}var jc,QA,eR,Pc=T(()=>{"use strict";jc="lmctl.builtin.",QA={Review:`${jc}Review`,Research:`${jc}Research`,Consolidate:`${jc}Consolidate`},eR=Object.fromEntries(Object.entries(QA).map(([e,t])=>[t,e]))});import{readFileSync as tR}from"node:fs";function Q_(e){return rR(e)}function rR(e){let t=no(iR(e));if(sR(t),eh(t)===3)return nR(t);let r=to.safeParse(t);if(!r.success)throw new qt({errors:r.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message}))});let n=oR(r.data);if(n.errors.length>0||n.unresolvedRefs.length>0)throw new qt(n);return r.data}function nR(e){let t=It.safeParse(e);if(!t.success)throw new qt({errors:t.error.issues.map(r=>({path:r.path.length===0?"$":r.path.map(String).join("."),message:r.message}))});return t.data}function sR(e){if(typeof e!="object"||e===null||!("definition_schema_version"in e))return;let t=eh(e);if(!(t===null||z_.includes(t)))throw new qt({errors:[{path:"definition_schema_version",message:`unsupported definition_schema_version ${t}; supported versions: ${z_.join(", ")}`}]})}function eh(e){if(typeof e!="object"||e===null||!("definition_schema_version"in e))return null;let t=e.definition_schema_version;return typeof t=="number"?t:null}function iR(e){if(typeof e!="string")return e;let t=e.trim();return e.includes(`
1753
+ table; --json emits the structured WorkflowVerifyReport payload.`;IA=["open","assigned","closed","reopened"]});import X_ from"jexl";function an(e){X_.compile(G_(e))}async function Or(e,t){return X_.eval(G_(e),t)}function G_(e){return e.replace(/([A-Za-z_$][\w$.[\]]*)\.includes\(([^()]+)\)/g,"($2 in $1)")}var os=T(()=>{"use strict"});import{z as E}from"zod";function Mc(e){let t=e.trim();return t.startsWith("={{")&&t.endsWith("}}")?t.slice(3,-2).trim():e}var UA,V_,Ac,Rc,Lc,Oc,$c,Cc,K_,WA,BA,qA,as,HA,Yi,zi,Zi,Qi,eo,Y_,JA,XA,GA,VA,to,ln=T(()=>{"use strict";os();UA=E.object({kind:E.enum(["success","neutral","failure"])}),V_=E.enum(["string","number","boolean","object","array"]),Ac=E.object({name:E.string().min(1),type:V_,required:E.boolean().optional(),default:E.unknown().optional(),description:E.string().optional()}),Rc=E.object({name:E.string().min(1),type:V_,source_step_id:E.string().min(1),source_field:E.string().min(1),description:E.string().optional()}),Lc=E.object({id:E.string().min(1),type:E.string().min(1),parameters:E.record(E.string(),E.unknown()).default({})}),Oc="__failure__",$c=E.object({tools:E.array(E.string().min(1)).optional(),auth:E.array(E.string().min(1)).optional()}).strict().optional(),Cc=E.object({on_unhandled_failure:E.object({attention_kind:E.string().min(1).default("workflow_failed"),severity:E.enum(["warn","error","critical"]).default("warn"),capture_evidence:E.boolean().default(!0),recommend_recovery:E.string().min(1).optional()}).optional(),on_unhandled_failure_state:E.string().min(1).optional()}).optional(),K_=E.object({type:E.literal("AssertRepoClean"),fail_message:E.string().min(1).optional(),next:E.string().min(1)}),WA=E.object({name:E.string().min(1),command:E.string().min(1).optional(),args:E.array(E.string()).optional(),env:E.record(E.string(),E.string()).optional(),type:E.enum(["stdio","http","sse"]).optional(),url:E.string().min(1).optional(),headers:E.record(E.string(),E.string()).optional()}).strict(),BA=E.union([E.string().min(1),WA]),qA=E.union([E.string().min(1),E.object({name:E.string().min(1),content:E.string().min(1)}).strict()]),as=E.object({team:E.string().min(1),alias:E.string().min(1),prompt_template:E.string().optional(),mcp:E.array(BA).optional(),skills:E.array(qA).optional()}),HA=E.object({kind:E.literal("shell"),command:E.string().min(1),description:E.string().optional()}),Yi=E.object({type:E.literal("Review"),state_name:E.string().min(1),coder:as,pre_checks:E.array(HA).optional(),reviewers:E.array(as.extend({rubric_artifact:E.string().optional()})).optional(),outcomes:E.object({approve:E.string().min(1),request_changes:E.string().optional(),fail_pre_check:E.string().optional(),max_loops_exceeded:E.string().optional()}),writes_to_project_path:E.boolean().optional(),durable_memory_tags:E.array(E.string().min(1)).optional(),write_back_durable_memory:E.union([E.boolean(),E.string().min(1)]).optional(),max_loops:E.number().int().positive().default(5),loop_feedback_artifact:E.string().optional(),outcomes_from_stance:E.record(E.string(),E.string().min(1)).optional()}).superRefine((e,t)=>{(e.reviewers??[]).length>0&&e.outcomes_from_stance!==void 0&&t.addIssue({code:"custom",path:["outcomes_from_stance"],message:"outcomes_from_stance cannot be used when reviewers is non-empty"})}),zi=E.object({type:E.literal("Consolidate"),state_name:E.string().min(1),researchers:E.array(as.extend({topic:E.string().min(1)})).optional(),consolidator:as,outcomes:E.object({ok:E.string().min(1),error:E.string().optional()}),research_artifact_prefix:E.string().optional(),durable_memory_tags:E.array(E.string().min(1)).optional(),write_back_durable_memory:E.union([E.boolean(),E.string().min(1)]).optional()}),Zi=E.object({type:E.literal("Interactive"),state_name:E.string().min(1),agent:as.extend({initial_prompt_template:E.string().min(1)}),termination:E.object({operator_signal:E.boolean().default(!0),agent_signal:E.string().optional(),max_turns:E.number().int().positive().default(20),timeout_seconds:E.number().int().positive().optional()}),outcomes:E.object({done:E.string().min(1),timeout:E.string().optional()}),artifact_name:E.string().optional(),durable_memory_tags:E.array(E.string().min(1)).optional(),write_back_durable_memory:E.union([E.boolean(),E.string().min(1)]).optional()}),Qi=E.object({type:E.literal("Loop"),state_name:E.string().min(1),over:E.string().min(1),item_var:E.string().min(1),body:E.string().min(1),outcomes:E.object({ok:E.string().min(1),error:E.string().optional()}),stop_on_error:E.boolean().default(!0),max_items:E.number().int().positive().default(1e3)}),eo=E.object({type:E.literal("ShellStep"),state_name:E.string().min(1),command:E.string().min(1),outcomes_from_exit:E.record(E.string(),E.string().min(1)),timeout_ms:E.number().int().nonnegative().optional(),capture_output_to:E.string().optional(),writes_to_project_path:E.boolean().optional()}),Y_=E.object({type:E.literal("Choice"),state_name:E.string().min(1),branches:E.array(E.object({when:E.string().min(1),next:E.string().min(1)})).default([]),default_next:E.string().min(1).optional()}).superRefine((e,t)=>{for(let[r,n]of e.branches.entries())try{an(Mc(n.when))}catch(s){let i=s instanceof Error?s.message:"invalid expression";t.addIssue({code:"custom",path:["branches",r,"when"],message:`invalid jexl expression: ${i}`})}}),JA=E.discriminatedUnion("type",[K_,Yi,zi,Zi,Qi,eo,Y_]),XA=E.object({type:E.literal("ForEach"),state_name:E.string().min(1),items_from:E.string().min(1),mode:E.enum(["sequential","parallel"]).default("sequential"),max_concurrency:E.number().int().positive().default(1),on_item_failure:E.enum(["continue","stop"]).default("stop"),body:JA,outcomes:E.object({all_ok:E.string().min(1),any_failed:E.string().optional()})}).superRefine((e,t)=>{try{an(Mc(e.items_from))}catch(r){let n=r instanceof Error?r.message:"invalid expression";t.addIssue({code:"custom",path:["items_from"],message:`invalid jexl expression: ${n}`})}}),GA=E.object({type:E.literal("Subflow"),state_name:E.string().min(1),workflow_name:E.string().min(1),inputs:E.record(E.string(),E.string().min(1)).optional(),outcomes:E.record(E.string(),E.string().min(1))}).superRefine((e,t)=>{for(let[r,n]of Object.entries(e.inputs??{}))try{an(Mc(n))}catch(s){let i=s instanceof Error?s.message:"invalid expression";t.addIssue({code:"custom",path:["inputs",r],message:`invalid jexl expression: ${i}`})}}),VA=E.discriminatedUnion("type",[K_,Yi,zi,Zi,Qi,eo,Y_,XA,GA]),to=E.object({name:E.string().min(1),version:E.number().int().positive(),definition_schema_version:E.union([E.literal(1),E.literal(2)]),description:E.string().optional(),estimated_duration_ms:E.number().int().nonnegative().optional(),primitive_version:E.union([E.literal(1),E.literal(2)]).default(1),start_at:E.string().min(1),states:E.record(E.string().min(1),VA),terminals:E.record(E.string().min(1),UA),errors:Cc,concurrency_key:E.string().min(1).optional(),concurrent_limit:E.number().int().positive().optional(),default_task_timeout_ms:E.number().int().positive().max(216e5).optional(),inputs:E.array(Ac).optional(),outputs:E.array(Rc).optional(),triggers:E.array(Lc).optional(),read_only:E.boolean().optional(),requires:$c}).superRefine((e,t)=>{e.definition_schema_version===1&&e.errors!==void 0&&t.addIssue({code:"custom",path:["errors"],message:"errors block requires definition_schema_version: 2"}),e.definition_schema_version===1&&e.concurrency_key!==void 0&&t.addIssue({code:"custom",path:["concurrency_key"],message:"concurrency_key requires definition_schema_version: 2"}),e.definition_schema_version===1&&e.default_task_timeout_ms!==void 0&&t.addIssue({code:"custom",path:["default_task_timeout_ms"],message:"default_task_timeout_ms requires definition_schema_version: 2"})})});import{z as K}from"zod";var KA,ro,YA,zA,ZA,It,cn=T(()=>{"use strict";ln();KA=/^s-[a-z0-9-]+-[a-f0-9]{4}$/,ro=K.string().regex(KA),YA=K.object({step_id:ro,type:K.literal("main"),index:K.number().int().min(0)}),zA=K.record(ro,K.record(K.string().min(1),K.array(K.array(YA)))),ZA=K.object({id:ro,name:K.string().min(1),type:K.string().min(1),typeVersion:K.number().int().positive().default(1),parameters:K.record(K.string(),K.unknown()).default({}),members:K.record(K.string(),K.unknown()).optional(),estimated_duration_ms:K.number().int().nonnegative().optional()}),It=K.object({schema_version:K.literal("lmctl/v3"),definition_schema_version:K.literal(3),name:K.string().min(1),version:K.number().int().positive(),description:K.string().optional(),estimated_duration_ms:K.number().int().nonnegative().optional(),default_task_timeout_ms:K.number().int().positive().max(216e5).optional(),concurrency_key:K.string().min(1).optional(),concurrent_limit:K.number().int().positive().optional(),errors:Cc,inputs:K.array(Ac).optional(),outputs:K.array(Rc).optional(),steps:K.array(ZA).min(1),connections:zA.default({}),entry_step_id:ro,triggers:K.array(Lc).optional(),read_only:K.boolean().optional(),requires:$c}).superRefine((e,t)=>{let r=new Set;for(let[n,s]of e.steps.entries())r.has(s.id)&&t.addIssue({code:"custom",path:["steps",n,"id"],message:`duplicate step id: ${s.id}`}),r.add(s.id);r.has(e.entry_step_id)||t.addIssue({code:"custom",path:["entry_step_id"],message:`entry_step_id does not reference an existing step: ${e.entry_step_id}`});for(let[n,s]of Object.entries(e.connections)){r.has(n)||t.addIssue({code:"custom",path:["connections",n],message:`connection source does not reference an existing step: ${n}`});for(let[i,o]of Object.entries(s))for(let[a,l]of o.entries())for(let[c,d]of l.entries())r.has(d.step_id)||t.addIssue({code:"custom",path:["connections",n,i,a,c,"step_id"],message:`connection target does not reference an existing step: ${d.step_id}`})}})});function no(e){return Dc(e)}function Dc(e){if(Array.isArray(e))return e.map(Dc);if(e===null||typeof e!="object")return e;let t=e,r={};for(let n of Object.keys(t))r[n]=Dc(t[n]);if(typeof r.type=="string"){let n=eR[r.type];n!==void 0&&(r.type=n)}return r}var jc,QA,eR,Pc=T(()=>{"use strict";jc="lmctl.builtin.",QA={Review:`${jc}Review`,Research:`${jc}Research`,Consolidate:`${jc}Consolidate`},eR=Object.fromEntries(Object.entries(QA).map(([e,t])=>[t,e]))});import{readFileSync as tR}from"node:fs";function Q_(e){return rR(e)}function rR(e){let t=no(iR(e));if(sR(t),eh(t)===3)return nR(t);let r=to.safeParse(t);if(!r.success)throw new qt({errors:r.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message}))});let n=oR(r.data);if(n.errors.length>0||n.unresolvedRefs.length>0)throw new qt(n);return r.data}function nR(e){let t=It.safeParse(e);if(!t.success)throw new qt({errors:t.error.issues.map(r=>({path:r.path.length===0?"$":r.path.map(String).join("."),message:r.message}))});return t.data}function sR(e){if(typeof e!="object"||e===null||!("definition_schema_version"in e))return;let t=eh(e);if(!(t===null||z_.includes(t)))throw new qt({errors:[{path:"definition_schema_version",message:`unsupported definition_schema_version ${t}; supported versions: ${z_.join(", ")}`}]})}function eh(e){if(typeof e!="object"||e===null||!("definition_schema_version"in e))return null;let t=e.definition_schema_version;return typeof t=="number"?t:null}function iR(e){if(typeof e!="string")return e;let t=e.trim();return e.includes(`
1754
1754
  `)||t.startsWith("{")||t.startsWith("[")?Z_(e,"$"):t.endsWith(".json")?Z_(tR(t,"utf8"),t):e}function Z_(e,t){try{return JSON.parse(e)}catch(r){let n=r instanceof Error?r.message:"invalid JSON";throw new qt({errors:[{path:t,message:`invalid JSON: ${n}`}]})}}function oR(e){let t=[],r=[],n=new Set(Object.keys(e.states));n.has(e.start_at)||r.push({state:"$",ref:e.start_at,kind:"next"}),aR(e,n,r);for(let[s,i]of Object.entries(e.states))new Set(Object.keys(e.terminals));return{errors:t,unresolvedRefs:r}}function aR(e,t,r){let n=e.errors?.on_unhandled_failure_state;n!==void 0&&(t.has(n)||r.push({state:"$",ref:n,kind:"next"}))}var z_,qt,th=T(()=>{"use strict";ln();cn();Pc();z_=[1,2,3],qt=class extends Error{errors;unresolvedRefs;constructor(t){super(t.message??"workflow validation failed"),this.name="WorkflowValidationError",this.errors=t.errors??[],this.unresolvedRefs=t.unresolvedRefs??[]}}});import{createHash as lR}from"node:crypto";function rh(e,t){let r=cR(t),n=lR("sha1").update(`${e}:${t}`).digest("hex").slice(0,4);return`s-${r}-${n}`}function cR(e){let t=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return t.length>0?t:"step"}var nh=T(()=>{"use strict";cn()});function fR(e,t){let r=uR[e]??[],n={},s={};for(let[i,o]of Object.entries(t))r.includes(i)?s[i]=o:n[i]=o;return{params:n,members:s}}function ah(e){let t=[],r=(k,N)=>{throw new dn([{line:k,message:N}])},n=e.split(`
1755
- `),s=[];for(let k=0;k<n.length;k+=1){let L=_R(n[k]).trim();L.length>0&&s.push({n:k+1,text:L})}s.length===0&&r(1,"empty composition: expected a `workflow <name> v<version>` header");let i=/^workflow\s+(\S+)\s+v(\d+)$/.exec(s[0].text)??r(s[0].n,`expected header \`workflow <name> v<version>\`, got: ${s[0].text}`),o=i[1],a=Number.parseInt(i[2],10),l=new Map,c=[],d=[],u=[],f,m={},p=new Map,h=new Map,g=new Map,_=(k,N,L,F,j,C)=>{l.has(k)&&r(F,`duplicate step/terminal id: ${k}`),/^[A-Za-z][\w-]*$/.test(k)||r(F,`invalid id (must start with a letter): ${k}`),l.set(k,{declId:k,type:N,params:L,line:F,isTerminal:j,...C?{members:C}:{}}),d.push(k)},S=k=>{let N=[],L=k+1;for(;L<s.length;L+=1){let F=/^([A-Za-z][\w-]*|default)\s*->\s*([A-Za-z][\w-]*)$/.exec(s[L].text);if(F===null)break;N.push({label:F[1],dst:F[2]})}return{branches:N,nextIdx:L-1}};for(let k=1;k<s.length;k+=1){let{n:N,text:L}=s[k],F=L.split(/\s+/,1)[0];if(/^meta\s*\(/.test(L)){k!==1&&r(N,"`meta(...)` must be the preamble \u2014 the FIRST line after the `workflow` header (at most one, before any construct)");let j=/^meta\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`meta\` (expected \`meta({ "requires"?:\u2026, "default_task_timeout_ms"?:\u2026, "errors"?:\u2026, "concurrency_key"?:\u2026, "concurrent_limit"?:\u2026 })\`): ${L}`),C=lr(j[1],N,r);for(let z of Object.keys(C))ih.has(z)||r(N,`unknown \`meta\` key \`${z}\` \u2014 only workflow-level runtime metadata is allowed: ${[...ih].join(", ")} (no grammar inflation; bounded)`);m=C;continue}if(F==="step"){let j=/^step\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`step\` (expected \`step <id> = <archetype>(k=v, ...)\`): ${L}`),C=j[1],z=j[2],_e=j[3],ie=sh[z];ie===void 0&&r(N,`unknown step type: ${z} (supported \`step\` archetypes: ${Object.keys(sh).join(", ")}; choice/terminal/loop/foreach/call/decide have their own constructs)`);let{params:Te,members:Ot}=fR(ie,lr(_e,N,r));_(C,ie,Te,N,!1,Object.keys(Ot).length>0?Ot:void 0);continue}if(F==="trigger"){let j=/^trigger\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`trigger\` (expected \`trigger <id> = <trigger-type>({ ...json... })\`): ${L}`),C=j[1],z=j[2],_e=j[3],ie=oh[z];ie===void 0&&r(N,`unknown trigger type: ${z} (registered trigger archetypes: ${Object.keys(oh).join(", ")})`),p.has(C)&&r(N,`duplicate trigger id: ${C}`),p.set(C,{id:C,type:ie,parameters:lr(_e,N,r)});continue}if(F==="mcp"||F==="skill"){let j=new RegExp(`^${F}\\s+([A-Za-z][\\w-]*)\\s*=\\s*(.+)$`).exec(L)??r(N,`malformed \`${F}\` decl (expected \`${F} <name> = {json} | ${F} <name> = "<file|url>"\`): ${L}`),C=j[1],z=j[2].trim(),_e=F==="mcp"?h:g;_e.has(C)&&r(N,`duplicate ${F} declaration: ${C}`);let ie;if(z.startsWith("{")){let Te=lr(z,N,r);F==="mcp"?ie={...Te,name:C}:((typeof Te.content!="string"||Te.content.length===0)&&r(N,`\`skill ${C}\`: inline form requires a non-empty string \`content\` (a SKILL.md body)`),ie={name:C,content:Te.content})}else{let Te=lh(z);(typeof Te!="string"||Te.length===0)&&r(N,`\`${F} ${C}\`: string form must be a non-empty file path or http(s) URL`),ie=Te}_e.set(C,ie);continue}if(F==="terminal"){let j=/^terminal\s+([A-Za-z][\w-]*)\s*=\s*([A-Za-z][\w-]*)(?:\s+(success|failure|neutral))?\s*$/.exec(L)??r(N,`malformed \`terminal\` (expected \`terminal <id> = <name> [success|failure|neutral]\`): ${L}`);_(j[1],"lmctl/terminal",{name:j[2],kind:j[3]??"neutral"},N,!0);continue}if(F==="seq"){let C=L.slice(3).trim().split(/\s*(->|-[a-z0-9_]+->)\s*/).map(z=>z.trim()).filter(z=>z.length>0);(C.length<3||C.length%2===0)&&r(N,`malformed \`seq\` (expected \`<id> -> <id> [ -> <id> ... ]\`, optional \`-<port>->\`): ${L}`);for(let z=0;z+2<C.length+1&&!(z+2>C.length-1);z+=2){let _e=C[z],ie=C[z+1],Te=C[z+2],Ot=ie==="->"?"main":ie.slice(1,-2);c.push({srcDeclId:_e,port:Ot,dstDeclId:Te,line:N})}continue}if(F==="choice"){let C=(/^choice\s+([A-Za-z][\w-]*)\s*:$/.exec(L)??r(N,`malformed \`choice\` (expected \`choice <id>:\` then \`when <predicate> -<port>-> <id>\` lines): ${L}`))[1],z=[],_e,ie=k+1;for(;ie<s.length;ie+=1){let Te=s[ie].text,Ot=/^when\s+(.+)\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(Te);if(Ot!==null){_e!==void 0&&r(s[ie].n,`\`choice ${C}\`: a \`when\` branch may not follow \`default\` (branches are ordered, default is the fallback)`);let Mn=Ot[2];z.push({when:Ot[1].trim(),next:`@terminal:${Mn}`}),c.push({srcDeclId:C,port:Mn,dstDeclId:Ot[3],line:s[ie].n});continue}let Ha=/^default\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(Te);if(Ha!==null){_e!==void 0&&r(s[ie].n,`\`choice ${C}\` has more than one \`default\``);let Mn=Ha[1];_e=`@terminal:${Mn}`,c.push({srcDeclId:C,port:Mn,dstDeclId:Ha[2],line:s[ie].n});continue}break}z.length===0&&r(N,`\`choice ${C}\` has no \`when\` branches (need \u22651 \`when <jexl-predicate> -<port>-> <id>\`)`),_(C,"lmctl/choice",{branches:z,..._e!==void 0?{default_next:_e}:{}},N,!1),k=ie-1;continue}if(F==="loop"){let j=/^loop\s+([A-Za-z][\w-]*)\s*=\s*loop\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`loop\` (expected \`loop <id> = loop(k=v, ...)\`): ${L}`);_(j[1],"lmctl/loop",lr(j[2],N,r),N,!1);continue}if(F==="foreach"){let j=/^foreach\s+([A-Za-z][\w-]*)\s*=\s*foreach\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`foreach\` (expected \`foreach <id> = foreach(items=<expr>, ...)\`): ${L}`),C=lr(j[2],N,r);"mode"in C&&r(N,"foreach is SEQUENTIAL-ONLY: `mode` is not permitted (single-thread; durable-memory/composition-language-design.md \xA7Execution model)"),_(j[1],"lmctl/foreach",C,N,!1);continue}if(F==="call"){let j=/^call\s+([A-Za-z][\w-]*)\s*=\s*call\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`call\` (expected \`call <id> = call(workflow=<name>, ...)\`): ${L}`),C=j[1],z=lr(j[2],N,r),_e=z.workflow;(typeof _e!="string"||_e.length===0)&&r(N,`\`call ${C}\` requires a \`workflow=<name>\` argument`);let{workflow:ie,...Te}=z;_(C,"lmctl/subflow",{workflow_name:_e,...Te},N,!1),u.push({declId:C,target:_e,line:N});continue}if(F==="decide"){let j=/^decide\s+([A-Za-z][\w-]*)\s+by\s+agent\s*\((.*)\)\s*:$/.exec(L)??r(N,`malformed \`decide\` (expected \`decide <id> by agent(k=v, ...):\`): ${L}`),C=j[1],z=lr(j[2],N,r),{branches:_e,nextIdx:ie}=S(k);_e.length===0&&r(N,`\`decide ${C}\` has no outcomes (need at least one \`<outcome> -> <id>\`)`),_(C,"lmctl/interactive",{termination:{operator_signal:!0}},N,!1,{agent:z});for(let Te of _e)c.push({srcDeclId:C,port:Te.label,dstDeclId:Te.dst,line:N});k=ie;continue}if(F==="entry"){let j=/^entry\s+([A-Za-z][\w-]*)$/.exec(L)??r(N,`malformed \`entry\` (expected \`entry <id>\`): ${L}`);f!==void 0&&r(N,`duplicate \`entry\` (already set to ${f})`),f=j[1];continue}r(N,`unknown statement \`${F}\` (grammar: workflow / meta / trigger / mcp / skill / step / terminal / seq / choice / loop / foreach / call / decide / entry)`)}d.length===0&&r(s[0].n,"composition declares no steps"),f===void 0&&(f=d[0]),l.has(f)||r(s[0].n,`entry references undeclared step: ${f}`);let y=k=>{if(Array.isArray(k)){for(let L of k)y(L);return}if(typeof k!="object"||k===null)return;let N=k;if(typeof N.alias=="string")for(let[L,F]of[["mcp",h],["skills",g]]){let j=N[L];Array.isArray(j)&&(N[L]=j.map(C=>typeof C=="string"&&F.has(C)?structuredClone(F.get(C)):C))}for(let L of Object.values(N))y(L)};for(let k of d){let N=l.get(k);N.members!==void 0&&y(N.members)}let w=k=>rh(o,k),I=d.map(k=>{let N=l.get(k);return{id:w(k),name:k,type:N.type,typeVersion:1,parameters:N.params,...N.members?{members:N.members}:{}}}),x={};for(let k of c){l.has(k.srcDeclId)||r(k.line,`edge source references undeclared step: ${k.srcDeclId}`),l.has(k.dstDeclId)||r(k.line,`dangling edge target: ${k.dstDeclId} is not declared`),l.get(k.srcDeclId).isTerminal&&r(k.line,`terminal \`${k.srcDeclId}\` cannot have an outgoing edge`);let N=w(k.srcDeclId);x[N]??={},x[N][k.port]!==void 0&&r(k.line,`duplicate edge port \`${k.port}\` on step \`${k.srcDeclId}\``),x[N][k.port]=[[{step_id:w(k.dstDeclId),type:"main",index:0}]]}for(let k of d){let N=l.get(k);mR.has(N.type)||r(N.line,`unknown archetype \`${N.type}\` for step \`${k}\` \u2014 not a registered builtin (src/engine/archetypes/index.ts:17-32)`)}for(let k of u)k.target===o&&r(k.line,`subflow cycle: \`call ${k.declId}\` invokes this workflow (\`${o}\`) \u2014 direct recursion is not allowed (cross-workflow A\u2192B\u2192A cycle detection is deferred to the M3 compile.ts seam)`);let U=new Map;for(let k of c){let N=U.get(k.srcDeclId);N===void 0?U.set(k.srcDeclId,[k.dstDeclId]):N.push(k.dstDeclId)}for(let k of d){let N=l.get(k);if(N.type!=="lmctl/loop")continue;let L=N.params.body;if(typeof L=="string"&&l.has(L)){let F=U.get(k);F===void 0?U.set(k,[L]):F.push(L)}}let ue=new Set([f]),W=[f];for(;W.length>0;){let k=W.shift();for(let N of U.get(k)??[])ue.has(N)||(ue.add(N),W.push(N))}for(let k of d)ue.has(k)||r(l.get(k).line,`step \`${k}\` is unreachable from entry \`${f}\``);let M=new Map;for(let k of c){let N=M.get(k.srcDeclId);N===void 0&&(N=new Set,M.set(k.srcDeclId,N)),N.add(k.port)}let A=new Set(["approve","request_changes","fail_pre_check","max_loops_exceeded"]);for(let k of d){let N=l.get(k);if(N.isTerminal)continue;let L=M.get(k)??new Set;if(N.type==="lmctl/review"){let j=[...L].some(C=>!A.has(C));!L.has("approve")&&!j&&r(N.line,`uncovered outcome: review step \`${k}\` wires neither \`approve\` nor any stance outcome \u2014 route \`approve\` (\`seq ${k} -approve-> <target>\`) or a stance port (run.ts:423-438 synthesizes outcomes_from_stance; review.ts:88-102 routes a stance before default approve)`);continue}let F=pR[N.type];if(F!==void 0)for(let j of F)L.has(j)||r(N.line,`uncovered outcome: required outcome \`${j}\` of step \`${k}\` (\`${N.type}\`) has no connection \u2014 route it (\`seq ${k} -${j}-> <target|terminal>\`)`);else L.size===0&&r(N.line,`uncovered outcome: non-terminal step \`${k}\` (\`${N.type}\`) has no outgoing connection \u2014 wire it with \`seq\` or route to a \`terminal\``)}for(let k of d){let N=l.get(k),L=dR[N.type];if(L===void 0)continue;let F={...N.params,...N.members??{},type:L.v2type,state_name:k,...Object.keys(L.outcomes).length>0?{outcomes:L.outcomes}:{}},j=L.schema.safeParse(F);if(!j.success){let C=j.error.issues[0],z=C.path.length===0?"$":C.path.map(String).join(".");r(N.line,`step \`${k}\` (\`${N.type}\`) has invalid params for archetype \`${L.v2type}\` at \`${z}\`: ${C.message} \u2014 this would crash the engine (it derefs this field unguarded). Provide it via the structured form: \`step ${k} = ${N.type.replace("lmctl/","")}({ ... })\``)}}let Q={schema_version:"lmctl/v3",definition_schema_version:3,name:o,version:a,...m,...p.size>0?{triggers:[...p.values()]}:{},steps:I,connections:x,entry_step_id:w(f)},B=It.safeParse(Q);if(!B.success)throw new dn(B.error.issues.map(k=>({line:s[0].n,message:`emitted V3 invalid at ${k.path.length===0?"$":k.path.map(String).join(".")}: ${k.message}`})));return B.data}function _R(e){let t=null;for(let r=0;r<e.length;r+=1){let n=e[r];if(t!==null){if(n==="\\"){r+=1;continue}n===t&&(t=null);continue}if(n==='"'||n==="'"){t=n;continue}if(n==="#")return e.slice(0,r)}return e}function lr(e,t,r){let n=e.trim();if(n.length===0)return{};if(n.startsWith("{")){let i;try{i=JSON.parse(n)}catch(o){r(t,`malformed structured args (expected a single-line JSON object): ${o.message}`)}return(i===null||typeof i!="object"||Array.isArray(i))&&r(t,"structured args must be a JSON object"),i}let s={};for(let i of hR(n)){let o=i.indexOf("=");o===-1&&r(t,`malformed arg (expected k=v): ${i}`);let a=i.slice(0,o).trim(),l=i.slice(o+1).trim();/^[A-Za-z_][\w-]*$/.test(a)||r(t,`invalid arg name: ${a}`),s[a]=lh(l)}return s}function hR(e){return e.split(",").map(t=>t.trim()).filter(t=>t.length>0)}function lh(e){return e.startsWith('"')&&e.endsWith('"')||e.startsWith("'")&&e.endsWith("'")?e.slice(1,-1):e==="true"?!0:e==="false"?!1:/^-?\d+$/.test(e)?Number.parseInt(e,10):/^-?\d*\.\d+$/.test(e)?Number.parseFloat(e):e}var dR,uR,sh,dn,mR,pR,ih,oh,ch=T(()=>{"use strict";cn();nh();ln();dR={"lmctl/review":{v2type:"Review",outcomes:{approve:"_"},schema:Yi},"lmctl/consolidate":{v2type:"Consolidate",outcomes:{ok:"_"},schema:zi},"lmctl/interactive":{v2type:"Interactive",outcomes:{done:"_"},schema:Zi},"lmctl/loop":{v2type:"Loop",outcomes:{ok:"_"},schema:Qi},"lmctl/shell-step":{v2type:"ShellStep",outcomes:{},schema:eo}},uR={"lmctl/review":["coder","reviewers"],"lmctl/consolidate":["researchers","consolidator"],"lmctl/interactive":["agent"]};sh={review:"lmctl/review",consolidate:"lmctl/consolidate",interactive:"lmctl/interactive","shell-step":"lmctl/shell-step","assert-repo-clean":"lmctl/assert-repo-clean","render-docx":"lmctl/render-docx","render-xlsx":"lmctl/render-xlsx"},dn=class extends Error{issues;constructor(t){super(`composition DSL compile failed:
1755
+ `),s=[];for(let k=0;k<n.length;k+=1){let L=_R(n[k]).trim();L.length>0&&s.push({n:k+1,text:L})}s.length===0&&r(1,"empty composition: expected a `workflow <name> v<version>` header");let i=/^workflow\s+(\S+)\s+v(\d+)$/.exec(s[0].text)??r(s[0].n,`expected header \`workflow <name> v<version>\`, got: ${s[0].text}`),o=i[1],a=Number.parseInt(i[2],10),l=new Map,c=[],d=[],u=[],f,m={},p=new Map,h=new Map,g=new Map,_=(k,N,L,F,j,C)=>{l.has(k)&&r(F,`duplicate step/terminal id: ${k}`),/^[A-Za-z][\w-]*$/.test(k)||r(F,`invalid id (must start with a letter): ${k}`),l.set(k,{declId:k,type:N,params:L,line:F,isTerminal:j,...C?{members:C}:{}}),d.push(k)},S=k=>{let N=[],L=k+1;for(;L<s.length;L+=1){let F=/^([A-Za-z][\w-]*|default)\s*->\s*([A-Za-z][\w-]*)$/.exec(s[L].text);if(F===null)break;N.push({label:F[1],dst:F[2]})}return{branches:N,nextIdx:L-1}};for(let k=1;k<s.length;k+=1){let{n:N,text:L}=s[k],F=L.split(/\s+/,1)[0];if(/^meta\s*\(/.test(L)){k!==1&&r(N,"`meta(...)` must be the preamble \u2014 the FIRST line after the `workflow` header (at most one, before any construct)");let j=/^meta\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`meta\` (expected \`meta({ "requires"?:\u2026, "default_task_timeout_ms"?:\u2026, "errors"?:\u2026, "concurrency_key"?:\u2026, "concurrent_limit"?:\u2026 })\`): ${L}`),C=lr(j[1],N,r);for(let z of Object.keys(C))ih.has(z)||r(N,`unknown \`meta\` key \`${z}\` \u2014 only workflow-level runtime metadata is allowed: ${[...ih].join(", ")} (no grammar inflation; bounded)`);m=C;continue}if(F==="step"){let j=/^step\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`step\` (expected \`step <id> = <archetype>(k=v, ...)\`): ${L}`),C=j[1],z=j[2],_e=j[3],ie=sh[z];ie===void 0&&r(N,`unknown step type: ${z} (supported \`step\` archetypes: ${Object.keys(sh).join(", ")}; choice/terminal/loop/foreach/call/decide have their own constructs)`);let{params:Te,members:$t}=fR(ie,lr(_e,N,r));_(C,ie,Te,N,!1,Object.keys($t).length>0?$t:void 0);continue}if(F==="trigger"){let j=/^trigger\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`trigger\` (expected \`trigger <id> = <trigger-type>({ ...json... })\`): ${L}`),C=j[1],z=j[2],_e=j[3],ie=oh[z];ie===void 0&&r(N,`unknown trigger type: ${z} (registered trigger archetypes: ${Object.keys(oh).join(", ")})`),p.has(C)&&r(N,`duplicate trigger id: ${C}`),p.set(C,{id:C,type:ie,parameters:lr(_e,N,r)});continue}if(F==="mcp"||F==="skill"){let j=new RegExp(`^${F}\\s+([A-Za-z][\\w-]*)\\s*=\\s*(.+)$`).exec(L)??r(N,`malformed \`${F}\` decl (expected \`${F} <name> = {json} | ${F} <name> = "<file|url>"\`): ${L}`),C=j[1],z=j[2].trim(),_e=F==="mcp"?h:g;_e.has(C)&&r(N,`duplicate ${F} declaration: ${C}`);let ie;if(z.startsWith("{")){let Te=lr(z,N,r);F==="mcp"?ie={...Te,name:C}:((typeof Te.content!="string"||Te.content.length===0)&&r(N,`\`skill ${C}\`: inline form requires a non-empty string \`content\` (a SKILL.md body)`),ie={name:C,content:Te.content})}else{let Te=lh(z);(typeof Te!="string"||Te.length===0)&&r(N,`\`${F} ${C}\`: string form must be a non-empty file path or http(s) URL`),ie=Te}_e.set(C,ie);continue}if(F==="terminal"){let j=/^terminal\s+([A-Za-z][\w-]*)\s*=\s*([A-Za-z][\w-]*)(?:\s+(success|failure|neutral))?\s*$/.exec(L)??r(N,`malformed \`terminal\` (expected \`terminal <id> = <name> [success|failure|neutral]\`): ${L}`);_(j[1],"lmctl/terminal",{name:j[2],kind:j[3]??"neutral"},N,!0);continue}if(F==="seq"){let C=L.slice(3).trim().split(/\s*(->|-[a-z0-9_]+->)\s*/).map(z=>z.trim()).filter(z=>z.length>0);(C.length<3||C.length%2===0)&&r(N,`malformed \`seq\` (expected \`<id> -> <id> [ -> <id> ... ]\`, optional \`-<port>->\`): ${L}`);for(let z=0;z+2<C.length+1&&!(z+2>C.length-1);z+=2){let _e=C[z],ie=C[z+1],Te=C[z+2],$t=ie==="->"?"main":ie.slice(1,-2);c.push({srcDeclId:_e,port:$t,dstDeclId:Te,line:N})}continue}if(F==="choice"){let C=(/^choice\s+([A-Za-z][\w-]*)\s*:$/.exec(L)??r(N,`malformed \`choice\` (expected \`choice <id>:\` then \`when <predicate> -<port>-> <id>\` lines): ${L}`))[1],z=[],_e,ie=k+1;for(;ie<s.length;ie+=1){let Te=s[ie].text,$t=/^when\s+(.+)\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(Te);if($t!==null){_e!==void 0&&r(s[ie].n,`\`choice ${C}\`: a \`when\` branch may not follow \`default\` (branches are ordered, default is the fallback)`);let Mn=$t[2];z.push({when:$t[1].trim(),next:`@terminal:${Mn}`}),c.push({srcDeclId:C,port:Mn,dstDeclId:$t[3],line:s[ie].n});continue}let Ha=/^default\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(Te);if(Ha!==null){_e!==void 0&&r(s[ie].n,`\`choice ${C}\` has more than one \`default\``);let Mn=Ha[1];_e=`@terminal:${Mn}`,c.push({srcDeclId:C,port:Mn,dstDeclId:Ha[2],line:s[ie].n});continue}break}z.length===0&&r(N,`\`choice ${C}\` has no \`when\` branches (need \u22651 \`when <jexl-predicate> -<port>-> <id>\`)`),_(C,"lmctl/choice",{branches:z,..._e!==void 0?{default_next:_e}:{}},N,!1),k=ie-1;continue}if(F==="loop"){let j=/^loop\s+([A-Za-z][\w-]*)\s*=\s*loop\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`loop\` (expected \`loop <id> = loop(k=v, ...)\`): ${L}`);_(j[1],"lmctl/loop",lr(j[2],N,r),N,!1);continue}if(F==="foreach"){let j=/^foreach\s+([A-Za-z][\w-]*)\s*=\s*foreach\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`foreach\` (expected \`foreach <id> = foreach(items=<expr>, ...)\`): ${L}`),C=lr(j[2],N,r);"mode"in C&&r(N,"foreach is SEQUENTIAL-ONLY: `mode` is not permitted (single-thread; durable-memory/composition-language-design.md \xA7Execution model)"),_(j[1],"lmctl/foreach",C,N,!1);continue}if(F==="call"){let j=/^call\s+([A-Za-z][\w-]*)\s*=\s*call\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`call\` (expected \`call <id> = call(workflow=<name>, ...)\`): ${L}`),C=j[1],z=lr(j[2],N,r),_e=z.workflow;(typeof _e!="string"||_e.length===0)&&r(N,`\`call ${C}\` requires a \`workflow=<name>\` argument`);let{workflow:ie,...Te}=z;_(C,"lmctl/subflow",{workflow_name:_e,...Te},N,!1),u.push({declId:C,target:_e,line:N});continue}if(F==="decide"){let j=/^decide\s+([A-Za-z][\w-]*)\s+by\s+agent\s*\((.*)\)\s*:$/.exec(L)??r(N,`malformed \`decide\` (expected \`decide <id> by agent(k=v, ...):\`): ${L}`),C=j[1],z=lr(j[2],N,r),{branches:_e,nextIdx:ie}=S(k);_e.length===0&&r(N,`\`decide ${C}\` has no outcomes (need at least one \`<outcome> -> <id>\`)`),_(C,"lmctl/interactive",{termination:{operator_signal:!0}},N,!1,{agent:z});for(let Te of _e)c.push({srcDeclId:C,port:Te.label,dstDeclId:Te.dst,line:N});k=ie;continue}if(F==="entry"){let j=/^entry\s+([A-Za-z][\w-]*)$/.exec(L)??r(N,`malformed \`entry\` (expected \`entry <id>\`): ${L}`);f!==void 0&&r(N,`duplicate \`entry\` (already set to ${f})`),f=j[1];continue}r(N,`unknown statement \`${F}\` (grammar: workflow / meta / trigger / mcp / skill / step / terminal / seq / choice / loop / foreach / call / decide / entry)`)}d.length===0&&r(s[0].n,"composition declares no steps"),f===void 0&&(f=d[0]),l.has(f)||r(s[0].n,`entry references undeclared step: ${f}`);let y=k=>{if(Array.isArray(k)){for(let L of k)y(L);return}if(typeof k!="object"||k===null)return;let N=k;if(typeof N.alias=="string")for(let[L,F]of[["mcp",h],["skills",g]]){let j=N[L];Array.isArray(j)&&(N[L]=j.map(C=>typeof C=="string"&&F.has(C)?structuredClone(F.get(C)):C))}for(let L of Object.values(N))y(L)};for(let k of d){let N=l.get(k);N.members!==void 0&&y(N.members)}let w=k=>rh(o,k),I=d.map(k=>{let N=l.get(k);return{id:w(k),name:k,type:N.type,typeVersion:1,parameters:N.params,...N.members?{members:N.members}:{}}}),x={};for(let k of c){l.has(k.srcDeclId)||r(k.line,`edge source references undeclared step: ${k.srcDeclId}`),l.has(k.dstDeclId)||r(k.line,`dangling edge target: ${k.dstDeclId} is not declared`),l.get(k.srcDeclId).isTerminal&&r(k.line,`terminal \`${k.srcDeclId}\` cannot have an outgoing edge`);let N=w(k.srcDeclId);x[N]??={},x[N][k.port]!==void 0&&r(k.line,`duplicate edge port \`${k.port}\` on step \`${k.srcDeclId}\``),x[N][k.port]=[[{step_id:w(k.dstDeclId),type:"main",index:0}]]}for(let k of d){let N=l.get(k);mR.has(N.type)||r(N.line,`unknown archetype \`${N.type}\` for step \`${k}\` \u2014 not a registered builtin (src/engine/archetypes/index.ts:17-32)`)}for(let k of u)k.target===o&&r(k.line,`subflow cycle: \`call ${k.declId}\` invokes this workflow (\`${o}\`) \u2014 direct recursion is not allowed (cross-workflow A\u2192B\u2192A cycle detection is deferred to the M3 compile.ts seam)`);let U=new Map;for(let k of c){let N=U.get(k.srcDeclId);N===void 0?U.set(k.srcDeclId,[k.dstDeclId]):N.push(k.dstDeclId)}for(let k of d){let N=l.get(k);if(N.type!=="lmctl/loop")continue;let L=N.params.body;if(typeof L=="string"&&l.has(L)){let F=U.get(k);F===void 0?U.set(k,[L]):F.push(L)}}let ue=new Set([f]),W=[f];for(;W.length>0;){let k=W.shift();for(let N of U.get(k)??[])ue.has(N)||(ue.add(N),W.push(N))}for(let k of d)ue.has(k)||r(l.get(k).line,`step \`${k}\` is unreachable from entry \`${f}\``);let M=new Map;for(let k of c){let N=M.get(k.srcDeclId);N===void 0&&(N=new Set,M.set(k.srcDeclId,N)),N.add(k.port)}let A=new Set(["approve","request_changes","fail_pre_check","max_loops_exceeded"]);for(let k of d){let N=l.get(k);if(N.isTerminal)continue;let L=M.get(k)??new Set;if(N.type==="lmctl/review"){let j=[...L].some(C=>!A.has(C));!L.has("approve")&&!j&&r(N.line,`uncovered outcome: review step \`${k}\` wires neither \`approve\` nor any stance outcome \u2014 route \`approve\` (\`seq ${k} -approve-> <target>\`) or a stance port (run.ts:423-438 synthesizes outcomes_from_stance; review.ts:88-102 routes a stance before default approve)`);continue}let F=pR[N.type];if(F!==void 0)for(let j of F)L.has(j)||r(N.line,`uncovered outcome: required outcome \`${j}\` of step \`${k}\` (\`${N.type}\`) has no connection \u2014 route it (\`seq ${k} -${j}-> <target|terminal>\`)`);else L.size===0&&r(N.line,`uncovered outcome: non-terminal step \`${k}\` (\`${N.type}\`) has no outgoing connection \u2014 wire it with \`seq\` or route to a \`terminal\``)}for(let k of d){let N=l.get(k),L=dR[N.type];if(L===void 0)continue;let F={...N.params,...N.members??{},type:L.v2type,state_name:k,...Object.keys(L.outcomes).length>0?{outcomes:L.outcomes}:{}},j=L.schema.safeParse(F);if(!j.success){let C=j.error.issues[0],z=C.path.length===0?"$":C.path.map(String).join(".");r(N.line,`step \`${k}\` (\`${N.type}\`) has invalid params for archetype \`${L.v2type}\` at \`${z}\`: ${C.message} \u2014 this would crash the engine (it derefs this field unguarded). Provide it via the structured form: \`step ${k} = ${N.type.replace("lmctl/","")}({ ... })\``)}}let Q={schema_version:"lmctl/v3",definition_schema_version:3,name:o,version:a,...m,...p.size>0?{triggers:[...p.values()]}:{},steps:I,connections:x,entry_step_id:w(f)},B=It.safeParse(Q);if(!B.success)throw new dn(B.error.issues.map(k=>({line:s[0].n,message:`emitted V3 invalid at ${k.path.length===0?"$":k.path.map(String).join(".")}: ${k.message}`})));return B.data}function _R(e){let t=null;for(let r=0;r<e.length;r+=1){let n=e[r];if(t!==null){if(n==="\\"){r+=1;continue}n===t&&(t=null);continue}if(n==='"'||n==="'"){t=n;continue}if(n==="#")return e.slice(0,r)}return e}function lr(e,t,r){let n=e.trim();if(n.length===0)return{};if(n.startsWith("{")){let i;try{i=JSON.parse(n)}catch(o){r(t,`malformed structured args (expected a single-line JSON object): ${o.message}`)}return(i===null||typeof i!="object"||Array.isArray(i))&&r(t,"structured args must be a JSON object"),i}let s={};for(let i of hR(n)){let o=i.indexOf("=");o===-1&&r(t,`malformed arg (expected k=v): ${i}`);let a=i.slice(0,o).trim(),l=i.slice(o+1).trim();/^[A-Za-z_][\w-]*$/.test(a)||r(t,`invalid arg name: ${a}`),s[a]=lh(l)}return s}function hR(e){return e.split(",").map(t=>t.trim()).filter(t=>t.length>0)}function lh(e){return e.startsWith('"')&&e.endsWith('"')||e.startsWith("'")&&e.endsWith("'")?e.slice(1,-1):e==="true"?!0:e==="false"?!1:/^-?\d+$/.test(e)?Number.parseInt(e,10):/^-?\d*\.\d+$/.test(e)?Number.parseFloat(e):e}var dR,uR,sh,dn,mR,pR,ih,oh,ch=T(()=>{"use strict";cn();nh();ln();dR={"lmctl/review":{v2type:"Review",outcomes:{approve:"_"},schema:Yi},"lmctl/consolidate":{v2type:"Consolidate",outcomes:{ok:"_"},schema:zi},"lmctl/interactive":{v2type:"Interactive",outcomes:{done:"_"},schema:Zi},"lmctl/loop":{v2type:"Loop",outcomes:{ok:"_"},schema:Qi},"lmctl/shell-step":{v2type:"ShellStep",outcomes:{},schema:eo}},uR={"lmctl/review":["coder","reviewers"],"lmctl/consolidate":["researchers","consolidator"],"lmctl/interactive":["agent"]};sh={review:"lmctl/review",consolidate:"lmctl/consolidate",interactive:"lmctl/interactive","shell-step":"lmctl/shell-step","assert-repo-clean":"lmctl/assert-repo-clean","render-docx":"lmctl/render-docx","render-xlsx":"lmctl/render-xlsx"},dn=class extends Error{issues;constructor(t){super(`composition DSL compile failed:
1756
1756
  ${t.map(r=>` line ${r.line}: ${r.message}`).join(`
1757
1757
  `)}`),this.issues=t,this.name="DslCompileError"}},mR=new Set(["lmctl/assert-repo-clean","lmctl/review","lmctl/consolidate","lmctl/interactive","lmctl/loop","lmctl/render-docx","lmctl/render-xlsx","lmctl/shell-step","lmctl/choice","lmctl/foreach","lmctl/subflow","lmctl/terminal","lmctl/trigger-schedule","lmctl/trigger-gh-issue"]),pR={"lmctl/consolidate":["ok"],"lmctl/interactive":["done"],"lmctl/loop":["ok"],"lmctl/foreach":["all_ok"]},ih=new Set(["requires","default_task_timeout_ms","errors","concurrency_key","concurrent_limit"]),oh={"trigger-schedule":"lmctl/trigger-schedule","trigger-gh-issue":"lmctl/trigger-gh-issue"}});import{readFileSync as gR}from"node:fs";function yR(){let e=process.env.LMCTL_DSL;return e===void 0?!0:!["0","false","off"].includes(e.trim().toLowerCase())}function wR(e){for(let t of e.split(`
1758
1758
  `)){let r=t.replace(/#.*/,"").trim();if(r.length!==0)return/^workflow\s+\S+\s+v\d+\s*$/.test(r)}return!1}function lt(e){if(typeof e=="string"&&yR()&&wR(e)){let r;try{r=ah(e)}catch(s){throw s instanceof dn?new Ht(s.issues.map(i=>({path:`dsl:${i.line}`,message:i.message}))):s}let n=It.safeParse(r);if(!n.success)throw new Ht(n.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));return n.data}let t=no(TR(e));if(bR(t)&&t.definition_schema_version===3){let r=It.safeParse(t);if(!r.success)throw new Ht(r.error.issues.map(n=>({path:n.path.length===0?"$":n.path.map(String).join("."),message:n.message})));return r.data}return ER(t)}function ER(e){let t=to.safeParse(e);if(!t.success)throw new Ht(t.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));let r=t.data,n=new Set(["Task","Pause","Parallel","LoopUntil","Pass","Fail","Succeed"]);for(let[s,i]of Object.entries(r.states))if(n.has(i.type))throw new Ht([{path:`states.${s}`,message:`v2 workflows (primitive_version: 2) may not use v1 primitive type: ${i.type}`}]);try{return Q_(r)}catch(s){throw s instanceof qt?new Fc(s):s}}function TR(e){if(typeof e!="string")return e;let t=e.trim();return e.includes(`
1759
- `)||t.startsWith("{")||t.startsWith("[")?dh(e):t.endsWith(".json")?dh(gR(t,"utf8")):e}function dh(e){return JSON.parse(e)}function bR(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var Fc,Ht,ls=T(()=>{"use strict";ln();th();Pc();cn();ch();Fc=class extends Error{causeError;constructor(t){super("compiler emitted invalid atomic workflow"),this.causeError=t,this.name="CompilerInvariantError"}},Ht=class extends Error{issues;constructor(t){super("compound workflow validation failed"),this.issues=t,this.name="CompilerValidationError"}}});function so(e){let t=e.workflow?.concurrent_limit??1,r=e.job.concurrency_key_resolved??e.workflow?.concurrency_key??null;return r===null||r.trim().length===0?{concurrency_key:null,concurrent_limit:t}:{concurrency_key:SR(r,{job:{id:e.job.id,kind:e.job.source,source:e.job.source,source_ref:e.job.source_ref,payload:kR(e.job.payload)},project:e.project===null?null:{id:e.project.id,name:e.project.name}}),concurrent_limit:t}}function SR(e,t){return e.replace(/\{\{\s*([^}]+?)\s*\}\}/g,(r,n)=>{let s=vR(t,n.trim());return s==null?"":typeof s=="string"?s:typeof s=="number"||typeof s=="boolean"?String(s):JSON.stringify(s)})}function vR(e,t){let r=e;for(let n of t.split(".")){if(typeof r!="object"||r===null||!Object.prototype.hasOwnProperty.call(r,n))return;r=r[n]}return r}function kR(e){if(e===null||e.trim().length===0)return null;try{return JSON.parse(e)}catch{return e}}var Uc=T(()=>{"use strict"});var uh={};we(uh,{enqueueFromAgentOutput:()=>NR,enqueueFromGitHubIssue:()=>Wc,enqueueManual:()=>IR,enqueueScheduled:()=>xR});function Wc(e,t){return oo(e,{project_id:t.project_id,workflow_id_override:t.workflow_id_override??null,source:"gh_issue",source_ref:t.issue_url,dedupe_key:t.dedupe_key??t.issue_url,payload:io(t.payload),concurrency_key:t.concurrency_key,priority:t.priority})}function IR(e,t){return oo(e,{project_id:t.project_id,workflow_id_override:null,source:"manual",source_ref:t.source_ref??null,dedupe_key:t.source_ref??null,payload:io(t.payload),concurrency_key:t.concurrency_key})}function NR(e,t){let r=t.sequence===void 0?`run:${t.parent_run_id}`:`run:${t.parent_run_id}:${t.sequence}`;return oo(e,{project_id:t.project_id,workflow_id_override:null,source:"agent_output",source_ref:r,dedupe_key:r,available_at:t.available_at,payload:io(t.payload),concurrency_key:t.concurrency_key})}function xR(e,t){return oo(e,{project_id:t.project_id,workflow_id_override:null,source:"schedule",source_ref:t.source_ref,dedupe_key:t.source_ref,available_at:t.available_at,payload:io(t.payload),concurrency_key:t.concurrency_key})}function io(e){return e==null?null:typeof e=="string"?e:JSON.stringify(e)}function oo(e,t){let r=t.concurrency_key;if(r!==void 0)return e.enqueueJob({...t,concurrency_key:r});let n=e.getProject(t.project_id),s=n===null?null:t.workflow_id_override!==void 0&&t.workflow_id_override!==null?e.getWorkflow(t.workflow_id_override):e.getWorkflowByName(n.workflow_name);if(n===null||s===null)return e.enqueueJob(t);try{let i=lt(s.definition),o={id:-1,project_id:t.project_id,workflow_id_override:t.workflow_id_override??null,source:t.source,source_ref:t.source_ref??null,payload:t.payload??null,status:"queued",priority:t.priority??0,available_at:t.available_at??new Date().toISOString(),locked_by:null,locked_until:null,attempt_count:0,last_error:null,dedupe_key:t.dedupe_key??null,concurrency_key_resolved:null,enqueued_at:new Date().toISOString(),started_at:null,ended_at:null,run_id:null},a=so({workflow:i,job:o,project:n});return e.enqueueJob({...t,concurrency_key:a.concurrency_key})}catch{return e.enqueueJob(t)}}var Bc=T(()=>{"use strict";ls();Uc()});async function mh(e){let t=e.dal.listProjectWorkflows(e.project.id,{enabled_only:!0});if(t.length===0)return fh(e.dal,e.project.id,e.issue,e.issue.url,null,e.issue,void 0);let r={event:{kind:"github_issue",issue:e.issue}},n=[],s=0;for(let i of t){if(!await AR(i.condition,r))continue;let o=`${e.issue.url}#workflow:${i.workflow_id}`,a={issue:e.issue,...RR(i.parameters_override)},l=fh(e.dal,e.project.id,e.issue,o,i.workflow_id,a,-i.priority);n.push(...l.jobs),s+=l.new_jobs}return{jobs:n,new_jobs:s}}function fh(e,t,r,n,s,i,o){let a=e.findJobBySourceAndDedupe("gh_issue",n);return{jobs:[Wc(e,{project_id:t,issue_url:r.url,payload:i,workflow_id_override:s,dedupe_key:n,priority:o})],new_jobs:a===null?1:0}}async function AR(e,t){if(e===null||e.trim().length===0)return!0;try{return await $r(e,t)===!0}catch{return!1}}function RR(e){if(e===null||e.trim().length===0)return{};try{let t=JSON.parse(e);if(t!==null&&typeof t=="object"&&!Array.isArray(t))return t}catch{return{}}return{}}var ph=T(()=>{"use strict";os();Bc()});import{spawnSync as LR}from"node:child_process";async function $R(e){let t=e.labels??["bug"],r=e.state??"open",n=["issue","list","--repo",e.project.name,"--state",r,"--json","number,title,url,body,state,labels","--limit","100"];t.length>0&&n.splice(4,0,"--label",t.join(","));let s=LR(e.binary??"gh",n,{encoding:"utf8",timeout:e.timeoutMs??6e4,maxBuffer:10*1024*1024});if(s.error!==void 0)throw s.error;if(s.status!==0)throw new Error(`gh issue list failed: ${s.stderr??""}`.trim());let i;try{i=JSON.parse(s.stdout??"[]")}catch{throw new Error("gh issue list returned malformed JSON")}if(!CR(i))throw new Error("gh issue list returned unexpected JSON shape");let o=0;for(let a of i){let l=await mh({dal:e.dal,project:e.project,issue:MR(a)});o+=l.new_jobs}return{scanned:i.length,new_jobs:o}}async function ao(e){if(process.env.LMCTL_INTAKE_DISABLED==="1")return[];let t=[];for(let r of e.listProjectsWithIntakeEnabled()){let n=OR(r.intake_config);try{let s=await $R({dal:e,project:r,labels:n.labels,state:n.state});t.push({project_id:r.id,project_name:r.name,...s})}catch(s){let i=s instanceof Error?s.message:String(s);t.push({project_id:r.id,project_name:r.name,scanned:0,new_jobs:0,error:i});try{e.raiseAttention({kind:"daemon_intake_scan_failed",severity:"warn",project_id:r.id,payload:JSON.stringify({project_id:r.id,project_name:r.name,error:i})})}catch{}}}return t}function OR(e){if(e===null)return{};try{let t=JSON.parse(e);if(!qc(t))return{};let r=t.state==="open"||t.state==="closed"||t.state==="all"?t.state:void 0,n=Array.isArray(t.labels)?t.labels.filter(s=>typeof s=="string"&&s.length>0):void 0;return{scan_github_issues:t.scan_github_issues===!0,labels:n,state:r}}catch{return{}}}function CR(e){return Array.isArray(e)&&e.every(t=>{if(!qc(t))return!1;let r=t.labels;return typeof t.number=="number"&&typeof t.title=="string"&&typeof t.url=="string"&&(typeof t.body=="string"||t.body===null||t.body===void 0)&&(t.state===void 0||typeof t.state=="string")&&(r===void 0||Array.isArray(r)&&r.every(n=>typeof n=="string"?!0:qc(n)&&typeof n.name=="string"))})}function MR(e){let t=e.labels?.map(s=>typeof s=="string"?s:s.name),{labels:r,...n}=e;return t===void 0?n:{...n,labels:t}}function qc(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}var Hc=T(()=>{"use strict";ph()});function hh(e){return async t=>DR(e.app,t,e.log!==void 0?{log:e.log}:{})}async function DR(e,t,r={}){let n=PR(t.path),s={"content-type":"application/json",...t.headers??{},[lo]:Jc},i={method:t.method,headers:s};t.body!==void 0&&t.method!=="GET"&&t.method!=="DELETE"&&(i.body=typeof t.body=="string"?t.body:JSON.stringify(t.body));let o=new Request(n,i),a=Date.now();try{let l=await e.fetch(o),c=await FR(l);if(r.log!==void 0){let d=Date.now()-a;r.log(`[mailbox-dispatch] ${t.method} ${_h(t.path)} \u2192 ${c.status} (${d}ms)`)}return c}catch(l){if(r.log!==void 0){let c=Date.now()-a;r.log(`[mailbox-dispatch] ${t.method} ${_h(t.path)} \u2192 ERR (${c}ms)`)}throw l}}function _h(e){let t=e.startsWith("/")?e:`/${e}`,r=t.search(/[?#]/);return r===-1?t:t.slice(0,r)}function PR(e){let t=e.startsWith("/")?e:`/${e}`;return`${jR}${t}`}async function FR(e){let t=await e.text(),r;if(t==="")r=void 0;else try{r=JSON.parse(t)}catch{r=t}let n={};e.headers.forEach((i,o)=>{o.toLowerCase()!==lo&&(n[o]=i)});let s={status:e.status};return Object.keys(n).length>0&&(s.headers=n),r!==void 0&&(s.body=r),s}var lo,Jc,jR,Xc=T(()=>{"use strict";lo="x-mailbox-channel",Jc="1",jR="http://mailbox.local"});import{createHash as gh,createHmac as UR,timingSafeEqual as WR}from"node:crypto";function yh(e={}){return async(t,r)=>{if(e.disabled===!0){await r();return}let n=wh();if(n===null||XR(t.req.path)){await r();return}if(t.req.path.startsWith("/mailbox/")&&t.req.header(lo)===Jc){await r();return}let s=t.req.query("token");if(s!==void 0&&co(s,n)){Vc(t,n),await r();return}if(JR(t,n)){await r();return}return t.req.path.startsWith("/api/")||t.req.path.startsWith("/mailbox/")?t.json({error:"API requires auth; set LMCTL_API_TOKEN"},401):t.redirect("/login",302)}}function wh(){let e=process.env.LMCTL_API_TOKEN;return e&&e.length>0?e:null}function Eh(e){let t=wh();return t!==null&&co(e,t)}function Vc(e,t,r=new Date){e.header("Set-Cookie",`${Gc}=${qR(t,r)}; Path=/; HttpOnly; SameSite=Lax`)}function Th(e){e.header("Set-Cookie",`${Gc}=; Path=/; HttpOnly; SameSite=Lax; Max-Age=0`)}function qR(e,t=new Date){let n=`auth=ok|${new Date(t.getTime()+BR*24*60*60*1e3).toISOString()}`;return Buffer.from(`${n}|${bh(e,n)}`,"utf8").toString("base64url")}function HR(e,t,r=new Date){let n;try{n=Buffer.from(e,"base64url").toString("utf8")}catch{return!1}let s=n.split("|");if(s.length!==3||s[0]!=="auth=ok")return!1;let i=new Date(s[1]);return Number.isNaN(i.getTime())||i.getTime()<=r.getTime()?!1:co(s[2],bh(t,`${s[0]}|${s[1]}`))}function co(e,t){return WR(gh("sha256").update(e).digest(),gh("sha256").update(t).digest())}function JR(e,t){let r=/^Bearer\s+(.+)$/i.exec(e.req.header("authorization")??"")?.[1];if(r!==void 0&&co(r,t))return!0;let n=GR(e.req.header("cookie")??"")[Gc];return n!==void 0&&HR(n,t)}function XR(e){return e==="/login"||e==="/logout"}function GR(e){let t={};for(let r of e.split(";")){let[n,...s]=r.trim().split("=");n===void 0||n.length===0||s.length===0||(t[n]=s.join("="))}return t}function bh(e,t){return UR("sha256",e).update(t).digest("hex")}var Gc,BR,Sh=T(()=>{"use strict";Xc();Gc="lmctl_next_session",BR=30});import{existsSync as un,mkdirSync as VR,readdirSync as KR,readFileSync as uo,unlinkSync as YR,writeFileSync as zc}from"node:fs";import{join as Or}from"node:path";function et(e){if(!zR.test(e))throw new Error(`invalid memory name "${e}": only alphanumeric characters, underscores, and hyphens are allowed`)}function kh(e,t){let r=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(r===null)return null;let n=r[1],s=r[2].trimStart(),i=n.match(/^type:\s*(.+)$/m),o=n.match(/^description:\s*(.+)$/m),a=i?.[1]?.trim()??"";return tL(a)?{name:e,type:a,description:o?.[1]?.trim()??null,body:s,created_at:vh,updated_at:vh}:null}function ZR(e,t,r,n){let s=r!==null?`
1759
+ `)||t.startsWith("{")||t.startsWith("[")?dh(e):t.endsWith(".json")?dh(gR(t,"utf8")):e}function dh(e){return JSON.parse(e)}function bR(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var Fc,Ht,ls=T(()=>{"use strict";ln();th();Pc();cn();ch();Fc=class extends Error{causeError;constructor(t){super("compiler emitted invalid atomic workflow"),this.causeError=t,this.name="CompilerInvariantError"}},Ht=class extends Error{issues;constructor(t){super("compound workflow validation failed"),this.issues=t,this.name="CompilerValidationError"}}});function so(e){let t=e.workflow?.concurrent_limit??1,r=e.job.concurrency_key_resolved??e.workflow?.concurrency_key??null;return r===null||r.trim().length===0?{concurrency_key:null,concurrent_limit:t}:{concurrency_key:SR(r,{job:{id:e.job.id,kind:e.job.source,source:e.job.source,source_ref:e.job.source_ref,payload:kR(e.job.payload)},project:e.project===null?null:{id:e.project.id,name:e.project.name}}),concurrent_limit:t}}function SR(e,t){return e.replace(/\{\{\s*([^}]+?)\s*\}\}/g,(r,n)=>{let s=vR(t,n.trim());return s==null?"":typeof s=="string"?s:typeof s=="number"||typeof s=="boolean"?String(s):JSON.stringify(s)})}function vR(e,t){let r=e;for(let n of t.split(".")){if(typeof r!="object"||r===null||!Object.prototype.hasOwnProperty.call(r,n))return;r=r[n]}return r}function kR(e){if(e===null||e.trim().length===0)return null;try{return JSON.parse(e)}catch{return e}}var Uc=T(()=>{"use strict"});var uh={};we(uh,{enqueueFromAgentOutput:()=>NR,enqueueFromGitHubIssue:()=>Wc,enqueueManual:()=>IR,enqueueScheduled:()=>xR});function Wc(e,t){return oo(e,{project_id:t.project_id,workflow_id_override:t.workflow_id_override??null,source:"gh_issue",source_ref:t.issue_url,dedupe_key:t.dedupe_key??t.issue_url,payload:io(t.payload),concurrency_key:t.concurrency_key,priority:t.priority})}function IR(e,t){return oo(e,{project_id:t.project_id,workflow_id_override:null,source:"manual",source_ref:t.source_ref??null,dedupe_key:t.source_ref??null,payload:io(t.payload),concurrency_key:t.concurrency_key})}function NR(e,t){let r=t.sequence===void 0?`run:${t.parent_run_id}`:`run:${t.parent_run_id}:${t.sequence}`;return oo(e,{project_id:t.project_id,workflow_id_override:null,source:"agent_output",source_ref:r,dedupe_key:r,available_at:t.available_at,payload:io(t.payload),concurrency_key:t.concurrency_key})}function xR(e,t){return oo(e,{project_id:t.project_id,workflow_id_override:null,source:"schedule",source_ref:t.source_ref,dedupe_key:t.source_ref,available_at:t.available_at,payload:io(t.payload),concurrency_key:t.concurrency_key})}function io(e){return e==null?null:typeof e=="string"?e:JSON.stringify(e)}function oo(e,t){let r=t.concurrency_key;if(r!==void 0)return e.enqueueJob({...t,concurrency_key:r});let n=e.getProject(t.project_id),s=n===null?null:t.workflow_id_override!==void 0&&t.workflow_id_override!==null?e.getWorkflow(t.workflow_id_override):e.getWorkflowByName(n.workflow_name);if(n===null||s===null)return e.enqueueJob(t);try{let i=lt(s.definition),o={id:-1,project_id:t.project_id,workflow_id_override:t.workflow_id_override??null,source:t.source,source_ref:t.source_ref??null,payload:t.payload??null,status:"queued",priority:t.priority??0,available_at:t.available_at??new Date().toISOString(),locked_by:null,locked_until:null,attempt_count:0,last_error:null,dedupe_key:t.dedupe_key??null,concurrency_key_resolved:null,enqueued_at:new Date().toISOString(),started_at:null,ended_at:null,run_id:null},a=so({workflow:i,job:o,project:n});return e.enqueueJob({...t,concurrency_key:a.concurrency_key})}catch{return e.enqueueJob(t)}}var Bc=T(()=>{"use strict";ls();Uc()});async function mh(e){let t=e.dal.listProjectWorkflows(e.project.id,{enabled_only:!0});if(t.length===0)return fh(e.dal,e.project.id,e.issue,e.issue.url,null,e.issue,void 0);let r={event:{kind:"github_issue",issue:e.issue}},n=[],s=0;for(let i of t){if(!await AR(i.condition,r))continue;let o=`${e.issue.url}#workflow:${i.workflow_id}`,a={issue:e.issue,...RR(i.parameters_override)},l=fh(e.dal,e.project.id,e.issue,o,i.workflow_id,a,-i.priority);n.push(...l.jobs),s+=l.new_jobs}return{jobs:n,new_jobs:s}}function fh(e,t,r,n,s,i,o){let a=e.findJobBySourceAndDedupe("gh_issue",n);return{jobs:[Wc(e,{project_id:t,issue_url:r.url,payload:i,workflow_id_override:s,dedupe_key:n,priority:o})],new_jobs:a===null?1:0}}async function AR(e,t){if(e===null||e.trim().length===0)return!0;try{return await Or(e,t)===!0}catch{return!1}}function RR(e){if(e===null||e.trim().length===0)return{};try{let t=JSON.parse(e);if(t!==null&&typeof t=="object"&&!Array.isArray(t))return t}catch{return{}}return{}}var ph=T(()=>{"use strict";os();Bc()});import{spawnSync as LR}from"node:child_process";async function OR(e){let t=e.labels??["bug"],r=e.state??"open",n=["issue","list","--repo",e.project.name,"--state",r,"--json","number,title,url,body,state,labels","--limit","100"];t.length>0&&n.splice(4,0,"--label",t.join(","));let s=LR(e.binary??"gh",n,{encoding:"utf8",timeout:e.timeoutMs??6e4,maxBuffer:10*1024*1024});if(s.error!==void 0)throw s.error;if(s.status!==0)throw new Error(`gh issue list failed: ${s.stderr??""}`.trim());let i;try{i=JSON.parse(s.stdout??"[]")}catch{throw new Error("gh issue list returned malformed JSON")}if(!CR(i))throw new Error("gh issue list returned unexpected JSON shape");let o=0;for(let a of i){let l=await mh({dal:e.dal,project:e.project,issue:MR(a)});o+=l.new_jobs}return{scanned:i.length,new_jobs:o}}async function ao(e){if(process.env.LMCTL_INTAKE_DISABLED==="1")return[];let t=[];for(let r of e.listProjectsWithIntakeEnabled()){let n=$R(r.intake_config);try{let s=await OR({dal:e,project:r,labels:n.labels,state:n.state});t.push({project_id:r.id,project_name:r.name,...s})}catch(s){let i=s instanceof Error?s.message:String(s);t.push({project_id:r.id,project_name:r.name,scanned:0,new_jobs:0,error:i});try{e.raiseAttention({kind:"daemon_intake_scan_failed",severity:"warn",project_id:r.id,payload:JSON.stringify({project_id:r.id,project_name:r.name,error:i})})}catch{}}}return t}function $R(e){if(e===null)return{};try{let t=JSON.parse(e);if(!qc(t))return{};let r=t.state==="open"||t.state==="closed"||t.state==="all"?t.state:void 0,n=Array.isArray(t.labels)?t.labels.filter(s=>typeof s=="string"&&s.length>0):void 0;return{scan_github_issues:t.scan_github_issues===!0,labels:n,state:r}}catch{return{}}}function CR(e){return Array.isArray(e)&&e.every(t=>{if(!qc(t))return!1;let r=t.labels;return typeof t.number=="number"&&typeof t.title=="string"&&typeof t.url=="string"&&(typeof t.body=="string"||t.body===null||t.body===void 0)&&(t.state===void 0||typeof t.state=="string")&&(r===void 0||Array.isArray(r)&&r.every(n=>typeof n=="string"?!0:qc(n)&&typeof n.name=="string"))})}function MR(e){let t=e.labels?.map(s=>typeof s=="string"?s:s.name),{labels:r,...n}=e;return t===void 0?n:{...n,labels:t}}function qc(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}var Hc=T(()=>{"use strict";ph()});function hh(e){return async t=>DR(e.app,t,e.log!==void 0?{log:e.log}:{})}async function DR(e,t,r={}){let n=PR(t.path),s={"content-type":"application/json",...t.headers??{},[lo]:Jc},i={method:t.method,headers:s};t.body!==void 0&&t.method!=="GET"&&t.method!=="DELETE"&&(i.body=typeof t.body=="string"?t.body:JSON.stringify(t.body));let o=new Request(n,i),a=Date.now();try{let l=await e.fetch(o),c=await FR(l);if(r.log!==void 0){let d=Date.now()-a;r.log(`[mailbox-dispatch] ${t.method} ${_h(t.path)} \u2192 ${c.status} (${d}ms)`)}return c}catch(l){if(r.log!==void 0){let c=Date.now()-a;r.log(`[mailbox-dispatch] ${t.method} ${_h(t.path)} \u2192 ERR (${c}ms)`)}throw l}}function _h(e){let t=e.startsWith("/")?e:`/${e}`,r=t.search(/[?#]/);return r===-1?t:t.slice(0,r)}function PR(e){let t=e.startsWith("/")?e:`/${e}`;return`${jR}${t}`}async function FR(e){let t=await e.text(),r;if(t==="")r=void 0;else try{r=JSON.parse(t)}catch{r=t}let n={};e.headers.forEach((i,o)=>{o.toLowerCase()!==lo&&(n[o]=i)});let s={status:e.status};return Object.keys(n).length>0&&(s.headers=n),r!==void 0&&(s.body=r),s}var lo,Jc,jR,Xc=T(()=>{"use strict";lo="x-mailbox-channel",Jc="1",jR="http://mailbox.local"});import{createHash as gh,createHmac as UR,timingSafeEqual as WR}from"node:crypto";function yh(e={}){return async(t,r)=>{if(e.disabled===!0){await r();return}let n=wh();if(n===null||XR(t.req.path)){await r();return}if(t.req.path.startsWith("/mailbox/")&&t.req.header(lo)===Jc){await r();return}let s=t.req.query("token");if(s!==void 0&&co(s,n)){Vc(t,n),await r();return}if(JR(t,n)){await r();return}return t.req.path.startsWith("/api/")||t.req.path.startsWith("/mailbox/")?t.json({error:"API requires auth; set LMCTL_API_TOKEN"},401):t.redirect("/login",302)}}function wh(){let e=process.env.LMCTL_API_TOKEN;return e&&e.length>0?e:null}function Eh(e){let t=wh();return t!==null&&co(e,t)}function Vc(e,t,r=new Date){e.header("Set-Cookie",`${Gc}=${qR(t,r)}; Path=/; HttpOnly; SameSite=Lax`)}function Th(e){e.header("Set-Cookie",`${Gc}=; Path=/; HttpOnly; SameSite=Lax; Max-Age=0`)}function qR(e,t=new Date){let n=`auth=ok|${new Date(t.getTime()+BR*24*60*60*1e3).toISOString()}`;return Buffer.from(`${n}|${bh(e,n)}`,"utf8").toString("base64url")}function HR(e,t,r=new Date){let n;try{n=Buffer.from(e,"base64url").toString("utf8")}catch{return!1}let s=n.split("|");if(s.length!==3||s[0]!=="auth=ok")return!1;let i=new Date(s[1]);return Number.isNaN(i.getTime())||i.getTime()<=r.getTime()?!1:co(s[2],bh(t,`${s[0]}|${s[1]}`))}function co(e,t){return WR(gh("sha256").update(e).digest(),gh("sha256").update(t).digest())}function JR(e,t){let r=/^Bearer\s+(.+)$/i.exec(e.req.header("authorization")??"")?.[1];if(r!==void 0&&co(r,t))return!0;let n=GR(e.req.header("cookie")??"")[Gc];return n!==void 0&&HR(n,t)}function XR(e){return e==="/login"||e==="/logout"}function GR(e){let t={};for(let r of e.split(";")){let[n,...s]=r.trim().split("=");n===void 0||n.length===0||s.length===0||(t[n]=s.join("="))}return t}function bh(e,t){return UR("sha256",e).update(t).digest("hex")}var Gc,BR,Sh=T(()=>{"use strict";Xc();Gc="lmctl_next_session",BR=30});import{existsSync as un,mkdirSync as VR,readdirSync as KR,readFileSync as uo,unlinkSync as YR,writeFileSync as zc}from"node:fs";import{join as $r}from"node:path";function et(e){if(!zR.test(e))throw new Error(`invalid memory name "${e}": only alphanumeric characters, underscores, and hyphens are allowed`)}function kh(e,t){let r=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(r===null)return null;let n=r[1],s=r[2].trimStart(),i=n.match(/^type:\s*(.+)$/m),o=n.match(/^description:\s*(.+)$/m),a=i?.[1]?.trim()??"";return tL(a)?{name:e,type:a,description:o?.[1]?.trim()??null,body:s,created_at:vh,updated_at:vh}:null}function ZR(e,t,r,n){let s=r!==null?`
1760
1760
  description: ${r}`:"";return`---
1761
1761
  name: ${e}${s}
1762
1762
  type: ${t}
1763
1763
  ---
1764
- ${n}`}function QR(e,t,r,n){let s=Or(e,Zc),i=`- [${t}.md](${t}.md)${n!==null?` \u2014 ${n}`:""} (${r})`,o=un(s)?uo(s,"utf8"):"",a=new RegExp(`^- \\[${Ih(t)}\\.md\\].*$`,"m");a.test(o)?o=o.replace(a,i):o=o.length>0&&!o.endsWith(`
1764
+ ${n}`}function QR(e,t,r,n){let s=$r(e,Zc),i=`- [${t}.md](${t}.md)${n!==null?` \u2014 ${n}`:""} (${r})`,o=un(s)?uo(s,"utf8"):"",a=new RegExp(`^- \\[${Ih(t)}\\.md\\].*$`,"m");a.test(o)?o=o.replace(a,i):o=o.length>0&&!o.endsWith(`
1765
1765
  `)?`${o}
1766
1766
  ${i}
1767
1767
  `:`${o}${i}
1768
- `,zc(s,o,"utf8")}function eL(e,t){let r=Or(e,Zc);if(!un(r))return;let n=uo(r,"utf8"),s=new RegExp(`^- \\[${Ih(t)}\\.md\\].*$\\r?\\n?`,"m");s.test(n)&&zc(r,n.replace(s,""),"utf8")}function Ih(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function tL(e){return e==="user"||e==="feedback"||e==="project"||e==="reference"}function ct(e,t){return e.durable_memory_mode==="db"?new Yc(t,e.id):new Kc(e.local_path)}var zR,Zc,vh,Kc,Yc,Qc=T(()=>{"use strict";zR=/^[a-zA-Z0-9_-]+$/;Zc="MEMORY.md",vh="1970-01-01T00:00:00.000Z",Kc=class{dir;constructor(t){this.dir=Or(t,"durable-memory")}read(t){et(t);let r=Or(this.dir,`${t}.md`);if(!un(r))return null;let n=uo(r,"utf8");return kh(t,n)}write(t){et(t.name),VR(this.dir,{recursive:!0});let r=Or(this.dir,`${t.name}.md`),n=!un(r),s=ZR(t.name,t.type,t.description??null,t.body);return zc(r,s,"utf8"),QR(this.dir,t.name,t.type,t.description??null),{created:n}}index(t){return this.listFiles().filter(r=>t===void 0||t.length===0||t.includes(r.type)).map(({name:r,type:n,description:s,updated_at:i})=>({name:r,type:n,description:s,updated_at:i}))}list(t){return this.listFiles().filter(r=>t===void 0||r.type===t).map(({name:r,type:n,updated_at:s})=>({name:r,type:n,updated_at:s}))}delete(t){et(t);let r=Or(this.dir,`${t}.md`);return un(r)?(YR(r),eL(this.dir,t),!0):!1}listFiles(){if(!un(this.dir))return[];let t=KR(this.dir).filter(n=>n.endsWith(".md")&&n!==Zc),r=[];for(let n of t){let s=n.slice(0,-3),i=uo(Or(this.dir,n),"utf8"),o=kh(s,i);o!==null&&r.push(o)}return r.sort((n,s)=>n.name.localeCompare(s.name))}};Yc=class{dal;projectId;constructor(t,r){this.dal=t,this.projectId=r}read(t){et(t);let r=this.dal.getDurableMemoryByName(this.projectId,t);return r===null?null:{name:r.name,type:r.type,description:r.description,body:r.body,created_at:r.created_at,updated_at:r.updated_at}}write(t){et(t.name);let r=this.dal.getDurableMemoryByName(this.projectId,t.name);return this.dal.upsertDurableMemory({project_id:this.projectId,type:t.type,name:t.name,description:t.description??null,body:t.body}),{created:r===null}}index(t){return this.dal.indexDurableMemory(this.projectId,t).map(n=>({name:n.name,type:n.type,description:n.description,updated_at:n.updated_at}))}list(t){return this.dal.listDurableMemory(this.projectId,t).map(n=>({name:n.name,type:n.type,updated_at:n.updated_at}))}delete(t){return et(t),this.dal.deleteDurableMemory(this.projectId,t)}}});function xh(e,t){let{dal:r}=t;e.get("/api/durable-memory/index/:project_id",n=>{let s=Number(n.req.param("project_id")),i=r.getProject(s);if(i===null)return n.json({error:"project not found"},404);let o=ct(i,r),a=n.req.query("types"),l=a!==void 0&&a.length>0?a.split(",").map(c=>c.trim()).filter(Boolean):void 0;return n.json(o.index(l))}),e.get("/api/durable-memory/read/:project_id/:name",n=>{let s=Number(n.req.param("project_id")),i=n.req.param("name"),o=r.getProject(s);if(o===null)return n.json({error:"project not found"},404);let a=ct(o,r),l;try{l=a.read(i)}catch(c){return n.json({error:c.message},400)}return l===null?n.json({error:`memory entry not found: ${i}`},404):n.json(l)}),e.post("/api/durable-memory/write/:project_id",async n=>{let s=Number(n.req.param("project_id")),i=r.getProject(s);if(i===null)return n.json({error:"project not found"},404);let o;try{o=await n.req.json()}catch{return n.json({error:"invalid JSON body"},400)}let a=typeof o.type=="string"?o.type:null,l=typeof o.name=="string"?o.name:null,c=typeof o.body=="string"?o.body:null,d=typeof o.description=="string"?o.description:null;if(a===null||!Nh.has(a))return n.json({error:`invalid type: must be one of ${[...Nh].join("|")}`},400);if(l===null)return n.json({error:"missing name"},400);if(c===null)return n.json({error:"missing body"},400);let u=ct(i,r),f;try{({created:f}=u.write({type:a,name:l,description:d,body:c}))}catch(m){return n.json({error:m.message},400)}return n.json({success:!0,created_or_updated:f?"created":"updated"})}),e.get("/api/durable-memory/list/:project_id",n=>{let s=Number(n.req.param("project_id")),i=r.getProject(s);if(i===null)return n.json({error:"project not found"},404);let o=ct(i,r),a=n.req.query("type");return n.json(o.list(a))})}var Nh,Ah=T(()=>{"use strict";Qc();Nh=new Set(["user","feedback","project","reference"])});function nL(e){let t=4294967295;for(let r=0;r<e.length;r+=1)t=(rL[(t^e[r])&255]^t>>>8)>>>0;return(t^4294967295)>>>0}function sL(e){let t=Math.max(1980,e.getFullYear()),r=(e.getHours()&31)<<11|(e.getMinutes()&63)<<5|Math.floor(e.getSeconds()/2)&31,n=(t-1980&127)<<9|(e.getMonth()+1&15)<<5|e.getDate()&31;return{time:r,date:n}}function Rh(e,t=new Date){let{time:r,date:n}=sL(t),s=[],i=[],o=0,a=new TextEncoder;for(let h of e){let g=a.encode(h.name),_=nL(h.data),S=h.data.length,y=new Uint8Array(30+g.length),w=new DataView(y.buffer);w.setUint32(0,67324752,!0),w.setUint16(4,20,!0),w.setUint16(6,0,!0),w.setUint16(8,0,!0),w.setUint16(10,r,!0),w.setUint16(12,n,!0),w.setUint32(14,_,!0),w.setUint32(18,S,!0),w.setUint32(22,S,!0),w.setUint16(26,g.length,!0),w.setUint16(28,0,!0),y.set(g,30),s.push(y,h.data);let I=new Uint8Array(46+g.length),x=new DataView(I.buffer);x.setUint32(0,33639248,!0),x.setUint16(4,20,!0),x.setUint16(6,20,!0),x.setUint16(8,0,!0),x.setUint16(10,0,!0),x.setUint16(12,r,!0),x.setUint16(14,n,!0),x.setUint32(16,_,!0),x.setUint32(20,S,!0),x.setUint32(24,S,!0),x.setUint16(28,g.length,!0),x.setUint16(30,0,!0),x.setUint16(32,0,!0),x.setUint16(34,0,!0),x.setUint16(36,0,!0),x.setUint32(38,0,!0),x.setUint32(42,o,!0),I.set(g,46),i.push(I),o+=y.length+h.data.length}let l=o,c=0;for(let h of i)c+=h.length;let d=new Uint8Array(22),u=new DataView(d.buffer);u.setUint32(0,101010256,!0),u.setUint16(4,0,!0),u.setUint16(6,0,!0),u.setUint16(8,e.length,!0),u.setUint16(10,e.length,!0),u.setUint32(12,c,!0),u.setUint32(16,l,!0),u.setUint16(20,0,!0);let f=l+c+d.length,m=new Uint8Array(f),p=0;for(let h of s)m.set(h,p),p+=h.length;for(let h of i)m.set(h,p),p+=h.length;return m.set(d,p),m}var rL,Lh=T(()=>{"use strict";rL=(()=>{let e=new Uint32Array(256);for(let t=0;t<256;t+=1){let r=t;for(let n=0;n<8;n+=1)r=r&1?3988292384^r>>>1:r>>>1;e[t]=r>>>0}return e})()});import{existsSync as po,mkdirSync as iL,readdirSync as oL,readFileSync as Ch,statSync as aL,unlinkSync as lL,writeFileSync as cL}from"node:fs";import{join as us}from"node:path";function Mh(e,t){let{dal:r}=t;e.post("/api/projects",async n=>{let s=await dt(n);if(typeof s=="string")return R(n,s,400);let i=oe(s,"name"),o=oe(s,"local_path");if(i===null||i.length===0)return R(n,"missing or empty name",400);if(o===null||o.length===0)return R(n,"missing or empty local_path",400);if(r.findProjectByName(i)!==null)return R(n,`project already exists: ${i}`,409);let a=oe(s,"workflow_name")??"bugfix",l,c=oe(s,"team_name");if(c!==null&&c.length>0){let u=r.findTeamByName(c);if(u===null)return R(n,`team not found: ${c}`,404);l=u.id}else{let u=r.listTeams();if(u.length===0)return R(n,"no teams exist; create a team first",400);l=u[0].id}let d=r.insertProject({name:i,local_path:o,workflow_name:a,team_id:l,default_branch:oe(s,"default_branch")});return n.json(d,201)}),e.patch("/api/projects/:name",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=await dt(n);if(typeof i=="string")return R(n,i,400);let o={};if(Object.prototype.hasOwnProperty.call(i,"local_path")){let l=i.local_path;if(typeof l!="string"||l.length===0)return R(n,"local_path must be a non-empty string",400);o.local_path=l}if(Object.prototype.hasOwnProperty.call(i,"durable_memory_mode")){let l=i.durable_memory_mode;if(l!=="folder"&&l!=="db")return R(n,'durable_memory_mode must be "folder" or "db"',400);o.durable_memory_mode=l}if(Object.prototype.hasOwnProperty.call(i,"default_branch")){let l=i.default_branch;if(l!==null&&typeof l!="string")return R(n,"default_branch must be string or null",400);o.default_branch=l}if(Object.prototype.hasOwnProperty.call(i,"intake_config")){let l=i.intake_config;if(l===null)o.intake_config=null;else if(typeof l=="string")o.intake_config=l;else if(typeof l=="object"&&!Array.isArray(l))o.intake_config=JSON.stringify(l);else return R(n,"intake_config must be a JSON object, string, or null",400)}let a=r.updateProjectSettings(s.id,o);return a===null?R(n,"project not found",404):n.json(a)}),e.post("/api/teams",async n=>{let s=await dt(n);if(typeof s=="string")return R(n,s,400);let i=oe(s,"name");if(i===null||i.length===0)return R(n,"missing or empty name",400);if(r.findTeamByName(i)!==null)return R(n,`team already exists: ${i}`,409);let o=r.insertTeam({name:i});return n.json(o,201)}),e.post("/api/teams/:name/members",async n=>{let s=r.findTeamByName(n.req.param("name"));if(s===null)return R(n,"team not found",404);let i=await dt(n);if(typeof i=="string")return R(n,i,400);let o=oe(i,"alias"),a=oe(i,"provider");if(o===null||o.length===0)return R(n,"missing or empty alias",400);if(a===null||a.length===0)return R(n,"missing or empty provider",400);if(r.findTeamMemberByAlias(s.id,o)!==null)return R(n,`member already exists: ${o}`,409);let l=oe(i,"model"),c=r.insertTeamMember({team_id:s.id,alias:o,provider:a,model:l,sessiondir:`.lmctl/sessions/${s.name}/${o}`}),d=oe(i,"role_prompt");d!==null&&r.setMemberRolePrompt(c.id,d);let u=r.findTeamMemberByAlias(s.id,o);return n.json(u??c,201)}),e.put("/api/teams/:name/members/:alias",async n=>{let s=r.findTeamByName(n.req.param("name"));if(s===null)return R(n,"team not found",404);let i=r.findTeamMemberByAlias(s.id,n.req.param("alias"));if(i===null)return R(n,"member not found",404);let o=await dt(n);if(typeof o=="string")return R(n,o,400);let a={};if(Object.prototype.hasOwnProperty.call(o,"role_prompt")){let c=o.role_prompt;if(c!==null&&typeof c!="string")return R(n,"role_prompt must be string or null",400);a.role_prompt=c}if(Object.prototype.hasOwnProperty.call(o,"model")){let c=o.model;if(c!==null&&typeof c!="string")return R(n,"model must be string or null",400);a.model=c}if(Object.prototype.hasOwnProperty.call(o,"provider")){let c=o.provider;if(typeof c!="string"||c.length===0)return R(n,"provider must be a non-empty string",400);a.provider=c}if(Object.keys(a).length===0)return R(n,"no updatable fields provided",400);let l=r.updateTeamMemberMeta(i.id,a);return l===null?R(n,"member not found",404):n.json(l)}),e.get("/api/projects/:name/durable-memory",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=ct(s,r);return n.json(i.index())}),e.post("/api/projects/:name/durable-memory",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=await dt(n);if(typeof i=="string")return R(n,i,400);let o=oe(i,"name"),a=oe(i,"body"),l=oe(i,"type");if(o===null||o.length===0)return R(n,"missing or empty name",400);if(a===null)return R(n,"missing body",400);if(l===null||!fo.includes(l))return R(n,`invalid type: must be one of ${fo.join("|")}`,400);try{et(o)}catch(u){return R(n,u.message,400)}let c=ct(s,r);try{if(c.read(o)!==null)return R(n,`chapter already exists: ${o}`,409)}catch(u){return R(n,u.message,400)}try{c.write({type:l,name:o,description:oe(i,"description"),body:a})}catch(u){return R(n,u.message,400)}let d=c.read(o);return d===null?R(n,"chapter created but unreadable",500):n.json(d,201)}),e.get("/api/projects/:name/durable-memory/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=ct(s,r),o;try{o=i.read(n.req.param("chapter"))}catch(a){return R(n,a.message,400)}return o===null?R(n,"chapter not found",404):n.json(o)}),e.put("/api/projects/:name/durable-memory/:chapter",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=n.req.param("chapter"),o=await dt(n);if(typeof o=="string")return R(n,o,400);let a=ct(s,r),l;try{l=a.read(i)}catch(m){return R(n,m.message,400)}if(l===null)return R(n,"chapter not found",404);let c=oe(o,"body")??l.body,d=Object.prototype.hasOwnProperty.call(o,"description")?oe(o,"description"):l.description,u=oe(o,"type")??l.type;if(!fo.includes(u))return R(n,`invalid type: must be one of ${fo.join("|")}`,400);try{a.write({type:u,name:i,description:d,body:c})}catch(m){return R(n,m.message,400)}let f=a.read(i);return f===null?R(n,"chapter updated but unreadable",500):n.json(f)}),e.delete("/api/projects/:name/durable-memory/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=ct(s,r),o;try{o=i.delete(n.req.param("chapter"))}catch(a){return R(n,a.message,400)}return o?n.json({removed:!0}):R(n,"chapter not found",404)}),e.get("/api/projects/:name/ai-test",n=>{let s=r.findProjectByName(n.req.param("name"));return s===null?R(n,"project not found",404):n.json(uL(s.local_path))}),e.post("/api/projects/:name/ai-test",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=await dt(n);if(typeof i=="string")return R(n,i,400);let o=oe(i,"name"),a=oe(i,"body"),l=oe(i,"type");if(o===null||o.length===0)return R(n,"missing or empty name",400);if(a===null)return R(n,"missing body",400);if(l===null||!mo.has(l))return R(n,`invalid type: must be one of ${[...mo].join("|")}`,400);try{et(o)}catch(f){return R(n,f.message,400)}let c=cs(s.local_path),d=us(c,`${o}.md`);if(po(d))return R(n,`chapter already exists: ${o}`,409);iL(c,{recursive:!0}),Oh(d,o,l,oe(i,"description"),a);let u=ds(c,o);return u===null?R(n,"chapter created but unreadable",500):n.json(u,201)}),e.get("/api/projects/:name/ai-test/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);try{et(n.req.param("chapter"))}catch(o){return R(n,o.message,400)}let i=ds(cs(s.local_path),n.req.param("chapter"));return i===null?R(n,"chapter not found",404):n.json(i)}),e.put("/api/projects/:name/ai-test/:chapter",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=n.req.param("chapter");try{et(i)}catch(m){return R(n,m.message,400)}let o=cs(s.local_path),a=ds(o,i);if(a===null)return R(n,"chapter not found",404);let l=await dt(n);if(typeof l=="string")return R(n,l,400);let c=oe(l,"body")??a.body,d=Object.prototype.hasOwnProperty.call(l,"description")?oe(l,"description"):a.description,u=oe(l,"type")??a.type;if(!mo.has(u))return R(n,`invalid type: must be one of ${[...mo].join("|")}`,400);Oh(us(o,`${i}.md`),i,u,d,c);let f=ds(o,i);return f===null?R(n,"chapter updated but unreadable",500):n.json(f)}),e.delete("/api/projects/:name/ai-test/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=n.req.param("chapter");try{et(i)}catch(a){return R(n,a.message,400)}let o=us(cs(s.local_path),`${i}.md`);return po(o)?(lL(o),n.json({removed:!0})):R(n,"chapter not found",404)}),e.get("/api/tokens",n=>n.json([])),e.post("/api/tokens",n=>R(n,"scoped-tokens table not yet migrated; see briefs/scoped-tokens-design.md",501)),e.get("/api/settings",n=>n.json({})),e.patch("/api/settings",async n=>{let s=await dt(n);return typeof s=="string"?R(n,s,400):n.json({accepted:s,note:"settings persistence not yet implemented"})}),e.get("/api/chat/sessions",n=>n.json(r.listChatbotSessions($h))),e.post("/api/chat/sessions",async n=>{let s=await dL(n);if(typeof s=="string")return R(n,s,400);let i=s!==null?oe(s,"title"):null,o=r.createChatbotSession($h,i);return n.json(o,201)}),e.get("/api/chat/sessions/:id/messages",n=>{let s=n.req.param("id");return r.getChatbotSession(s)===null?R(n,"chat session not found",404):n.json(r.listChatbotMessages(s))}),e.post("/api/chat/sessions/:id/messages",async n=>{let s=n.req.param("id");if(r.getChatbotSession(s)===null)return R(n,"chat session not found",404);let i=await dt(n);if(typeof i=="string")return R(n,i,400);let o=oe(i,"role"),a=oe(i,"content");if(o===null||o!=="user"&&o!=="assistant"&&o!=="tool")return R(n,"role must be one of user|assistant|tool",400);if(a===null)return R(n,"missing content",400);let l=r.appendChatbotMessage(s,o,a);return n.json(l,201)}),e.get("/api/runs/:id/artifacts.zip",n=>{let s=Number(n.req.param("id"));if(!Number.isInteger(s))return R(n,"invalid run id",400);if(r.getRun(s)===null)return R(n,"run not found",404);let o=Rr(r,s),a=[];for(let c of o){let d=mL(c),u=null;if(c.content!==null&&c.content!==void 0)u=new TextEncoder().encode(c.content);else if(c.path!==null&&c.path!==void 0)try{let f=Ch(c.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);u=new Uint8Array(m)}catch{u=new Uint8Array(0)}u!==null&&a.push({name:d,data:u})}let l=Rh(a);return new Response(l,{status:200,headers:{"Content-Type":"application/zip","Content-Disposition":`attachment; filename="run-${s}-artifacts.zip"`,"Content-Length":String(l.byteLength)}})})}function R(e,t,r){return e.json({error:t},r)}async function dt(e){try{let t=await e.req.json();return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:"invalid JSON body"}catch{return"invalid JSON body"}}async function dL(e){let t=await e.req.text().catch(()=>"");if(t.trim().length===0)return null;try{let r=JSON.parse(t);return r!==null&&typeof r=="object"&&!Array.isArray(r)?r:"invalid JSON body"}catch{return"invalid JSON body"}}function oe(e,t){let r=e[t];return typeof r!="string"?null:r}function cs(e){return us(e,"ai-test")}function ds(e,t){let r=us(e,`${t}.md`);if(!po(r))return null;let n=Ch(r,"utf8"),s=fL(n),i=aL(r).mtime.toISOString();return{name:t,type:s.type,description:s.description,body:s.body,updated_at:i}}function uL(e){let t=cs(e);return po(t)?oL(t).filter(r=>r.endsWith(".md")&&r!=="index.md").map(r=>r.slice(0,-3)).sort().map(r=>{let n=ds(t,r);if(n===null)return null;let{name:s,type:i,description:o,updated_at:a}=n;return{name:s,type:i,description:o,updated_at:a}}).filter(r=>r!==null):[]}function Oh(e,t,r,n,s){let i=n!==null&&n.length>0?`
1768
+ `,zc(s,o,"utf8")}function eL(e,t){let r=$r(e,Zc);if(!un(r))return;let n=uo(r,"utf8"),s=new RegExp(`^- \\[${Ih(t)}\\.md\\].*$\\r?\\n?`,"m");s.test(n)&&zc(r,n.replace(s,""),"utf8")}function Ih(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function tL(e){return e==="user"||e==="feedback"||e==="project"||e==="reference"}function ct(e,t){return e.durable_memory_mode==="db"?new Yc(t,e.id):new Kc(e.local_path)}var zR,Zc,vh,Kc,Yc,Qc=T(()=>{"use strict";zR=/^[a-zA-Z0-9_-]+$/;Zc="MEMORY.md",vh="1970-01-01T00:00:00.000Z",Kc=class{dir;constructor(t){this.dir=$r(t,"durable-memory")}read(t){et(t);let r=$r(this.dir,`${t}.md`);if(!un(r))return null;let n=uo(r,"utf8");return kh(t,n)}write(t){et(t.name),VR(this.dir,{recursive:!0});let r=$r(this.dir,`${t.name}.md`),n=!un(r),s=ZR(t.name,t.type,t.description??null,t.body);return zc(r,s,"utf8"),QR(this.dir,t.name,t.type,t.description??null),{created:n}}index(t){return this.listFiles().filter(r=>t===void 0||t.length===0||t.includes(r.type)).map(({name:r,type:n,description:s,updated_at:i})=>({name:r,type:n,description:s,updated_at:i}))}list(t){return this.listFiles().filter(r=>t===void 0||r.type===t).map(({name:r,type:n,updated_at:s})=>({name:r,type:n,updated_at:s}))}delete(t){et(t);let r=$r(this.dir,`${t}.md`);return un(r)?(YR(r),eL(this.dir,t),!0):!1}listFiles(){if(!un(this.dir))return[];let t=KR(this.dir).filter(n=>n.endsWith(".md")&&n!==Zc),r=[];for(let n of t){let s=n.slice(0,-3),i=uo($r(this.dir,n),"utf8"),o=kh(s,i);o!==null&&r.push(o)}return r.sort((n,s)=>n.name.localeCompare(s.name))}};Yc=class{dal;projectId;constructor(t,r){this.dal=t,this.projectId=r}read(t){et(t);let r=this.dal.getDurableMemoryByName(this.projectId,t);return r===null?null:{name:r.name,type:r.type,description:r.description,body:r.body,created_at:r.created_at,updated_at:r.updated_at}}write(t){et(t.name);let r=this.dal.getDurableMemoryByName(this.projectId,t.name);return this.dal.upsertDurableMemory({project_id:this.projectId,type:t.type,name:t.name,description:t.description??null,body:t.body}),{created:r===null}}index(t){return this.dal.indexDurableMemory(this.projectId,t).map(n=>({name:n.name,type:n.type,description:n.description,updated_at:n.updated_at}))}list(t){return this.dal.listDurableMemory(this.projectId,t).map(n=>({name:n.name,type:n.type,updated_at:n.updated_at}))}delete(t){return et(t),this.dal.deleteDurableMemory(this.projectId,t)}}});function xh(e,t){let{dal:r}=t;e.get("/api/durable-memory/index/:project_id",n=>{let s=Number(n.req.param("project_id")),i=r.getProject(s);if(i===null)return n.json({error:"project not found"},404);let o=ct(i,r),a=n.req.query("types"),l=a!==void 0&&a.length>0?a.split(",").map(c=>c.trim()).filter(Boolean):void 0;return n.json(o.index(l))}),e.get("/api/durable-memory/read/:project_id/:name",n=>{let s=Number(n.req.param("project_id")),i=n.req.param("name"),o=r.getProject(s);if(o===null)return n.json({error:"project not found"},404);let a=ct(o,r),l;try{l=a.read(i)}catch(c){return n.json({error:c.message},400)}return l===null?n.json({error:`memory entry not found: ${i}`},404):n.json(l)}),e.post("/api/durable-memory/write/:project_id",async n=>{let s=Number(n.req.param("project_id")),i=r.getProject(s);if(i===null)return n.json({error:"project not found"},404);let o;try{o=await n.req.json()}catch{return n.json({error:"invalid JSON body"},400)}let a=typeof o.type=="string"?o.type:null,l=typeof o.name=="string"?o.name:null,c=typeof o.body=="string"?o.body:null,d=typeof o.description=="string"?o.description:null;if(a===null||!Nh.has(a))return n.json({error:`invalid type: must be one of ${[...Nh].join("|")}`},400);if(l===null)return n.json({error:"missing name"},400);if(c===null)return n.json({error:"missing body"},400);let u=ct(i,r),f;try{({created:f}=u.write({type:a,name:l,description:d,body:c}))}catch(m){return n.json({error:m.message},400)}return n.json({success:!0,created_or_updated:f?"created":"updated"})}),e.get("/api/durable-memory/list/:project_id",n=>{let s=Number(n.req.param("project_id")),i=r.getProject(s);if(i===null)return n.json({error:"project not found"},404);let o=ct(i,r),a=n.req.query("type");return n.json(o.list(a))})}var Nh,Ah=T(()=>{"use strict";Qc();Nh=new Set(["user","feedback","project","reference"])});function nL(e){let t=4294967295;for(let r=0;r<e.length;r+=1)t=(rL[(t^e[r])&255]^t>>>8)>>>0;return(t^4294967295)>>>0}function sL(e){let t=Math.max(1980,e.getFullYear()),r=(e.getHours()&31)<<11|(e.getMinutes()&63)<<5|Math.floor(e.getSeconds()/2)&31,n=(t-1980&127)<<9|(e.getMonth()+1&15)<<5|e.getDate()&31;return{time:r,date:n}}function Rh(e,t=new Date){let{time:r,date:n}=sL(t),s=[],i=[],o=0,a=new TextEncoder;for(let h of e){let g=a.encode(h.name),_=nL(h.data),S=h.data.length,y=new Uint8Array(30+g.length),w=new DataView(y.buffer);w.setUint32(0,67324752,!0),w.setUint16(4,20,!0),w.setUint16(6,0,!0),w.setUint16(8,0,!0),w.setUint16(10,r,!0),w.setUint16(12,n,!0),w.setUint32(14,_,!0),w.setUint32(18,S,!0),w.setUint32(22,S,!0),w.setUint16(26,g.length,!0),w.setUint16(28,0,!0),y.set(g,30),s.push(y,h.data);let I=new Uint8Array(46+g.length),x=new DataView(I.buffer);x.setUint32(0,33639248,!0),x.setUint16(4,20,!0),x.setUint16(6,20,!0),x.setUint16(8,0,!0),x.setUint16(10,0,!0),x.setUint16(12,r,!0),x.setUint16(14,n,!0),x.setUint32(16,_,!0),x.setUint32(20,S,!0),x.setUint32(24,S,!0),x.setUint16(28,g.length,!0),x.setUint16(30,0,!0),x.setUint16(32,0,!0),x.setUint16(34,0,!0),x.setUint16(36,0,!0),x.setUint32(38,0,!0),x.setUint32(42,o,!0),I.set(g,46),i.push(I),o+=y.length+h.data.length}let l=o,c=0;for(let h of i)c+=h.length;let d=new Uint8Array(22),u=new DataView(d.buffer);u.setUint32(0,101010256,!0),u.setUint16(4,0,!0),u.setUint16(6,0,!0),u.setUint16(8,e.length,!0),u.setUint16(10,e.length,!0),u.setUint32(12,c,!0),u.setUint32(16,l,!0),u.setUint16(20,0,!0);let f=l+c+d.length,m=new Uint8Array(f),p=0;for(let h of s)m.set(h,p),p+=h.length;for(let h of i)m.set(h,p),p+=h.length;return m.set(d,p),m}var rL,Lh=T(()=>{"use strict";rL=(()=>{let e=new Uint32Array(256);for(let t=0;t<256;t+=1){let r=t;for(let n=0;n<8;n+=1)r=r&1?3988292384^r>>>1:r>>>1;e[t]=r>>>0}return e})()});import{existsSync as po,mkdirSync as iL,readdirSync as oL,readFileSync as Ch,statSync as aL,unlinkSync as lL,writeFileSync as cL}from"node:fs";import{join as us}from"node:path";function Mh(e,t){let{dal:r}=t;e.post("/api/projects",async n=>{let s=await dt(n);if(typeof s=="string")return R(n,s,400);let i=oe(s,"name"),o=oe(s,"local_path");if(i===null||i.length===0)return R(n,"missing or empty name",400);if(o===null||o.length===0)return R(n,"missing or empty local_path",400);if(r.findProjectByName(i)!==null)return R(n,`project already exists: ${i}`,409);let a=oe(s,"workflow_name")??"bugfix",l,c=oe(s,"team_name");if(c!==null&&c.length>0){let u=r.findTeamByName(c);if(u===null)return R(n,`team not found: ${c}`,404);l=u.id}else{let u=r.listTeams();if(u.length===0)return R(n,"no teams exist; create a team first",400);l=u[0].id}let d=r.insertProject({name:i,local_path:o,workflow_name:a,team_id:l,default_branch:oe(s,"default_branch")});return n.json(d,201)}),e.patch("/api/projects/:name",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=await dt(n);if(typeof i=="string")return R(n,i,400);let o={};if(Object.prototype.hasOwnProperty.call(i,"local_path")){let l=i.local_path;if(typeof l!="string"||l.length===0)return R(n,"local_path must be a non-empty string",400);o.local_path=l}if(Object.prototype.hasOwnProperty.call(i,"durable_memory_mode")){let l=i.durable_memory_mode;if(l!=="folder"&&l!=="db")return R(n,'durable_memory_mode must be "folder" or "db"',400);o.durable_memory_mode=l}if(Object.prototype.hasOwnProperty.call(i,"default_branch")){let l=i.default_branch;if(l!==null&&typeof l!="string")return R(n,"default_branch must be string or null",400);o.default_branch=l}if(Object.prototype.hasOwnProperty.call(i,"intake_config")){let l=i.intake_config;if(l===null)o.intake_config=null;else if(typeof l=="string")o.intake_config=l;else if(typeof l=="object"&&!Array.isArray(l))o.intake_config=JSON.stringify(l);else return R(n,"intake_config must be a JSON object, string, or null",400)}let a=r.updateProjectSettings(s.id,o);return a===null?R(n,"project not found",404):n.json(a)}),e.post("/api/teams",async n=>{let s=await dt(n);if(typeof s=="string")return R(n,s,400);let i=oe(s,"name");if(i===null||i.length===0)return R(n,"missing or empty name",400);if(r.findTeamByName(i)!==null)return R(n,`team already exists: ${i}`,409);let o=r.insertTeam({name:i});return n.json(o,201)}),e.post("/api/teams/:name/members",async n=>{let s=r.findTeamByName(n.req.param("name"));if(s===null)return R(n,"team not found",404);let i=await dt(n);if(typeof i=="string")return R(n,i,400);let o=oe(i,"alias"),a=oe(i,"provider");if(o===null||o.length===0)return R(n,"missing or empty alias",400);if(a===null||a.length===0)return R(n,"missing or empty provider",400);if(r.findTeamMemberByAlias(s.id,o)!==null)return R(n,`member already exists: ${o}`,409);let l=oe(i,"model"),c=r.insertTeamMember({team_id:s.id,alias:o,provider:a,model:l,sessiondir:`.lmctl/sessions/${s.name}/${o}`}),d=oe(i,"role_prompt");d!==null&&r.setMemberRolePrompt(c.id,d);let u=r.findTeamMemberByAlias(s.id,o);return n.json(u??c,201)}),e.put("/api/teams/:name/members/:alias",async n=>{let s=r.findTeamByName(n.req.param("name"));if(s===null)return R(n,"team not found",404);let i=r.findTeamMemberByAlias(s.id,n.req.param("alias"));if(i===null)return R(n,"member not found",404);let o=await dt(n);if(typeof o=="string")return R(n,o,400);let a={};if(Object.prototype.hasOwnProperty.call(o,"role_prompt")){let c=o.role_prompt;if(c!==null&&typeof c!="string")return R(n,"role_prompt must be string or null",400);a.role_prompt=c}if(Object.prototype.hasOwnProperty.call(o,"model")){let c=o.model;if(c!==null&&typeof c!="string")return R(n,"model must be string or null",400);a.model=c}if(Object.prototype.hasOwnProperty.call(o,"provider")){let c=o.provider;if(typeof c!="string"||c.length===0)return R(n,"provider must be a non-empty string",400);a.provider=c}if(Object.keys(a).length===0)return R(n,"no updatable fields provided",400);let l=r.updateTeamMemberMeta(i.id,a);return l===null?R(n,"member not found",404):n.json(l)}),e.get("/api/projects/:name/durable-memory",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=ct(s,r);return n.json(i.index())}),e.post("/api/projects/:name/durable-memory",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=await dt(n);if(typeof i=="string")return R(n,i,400);let o=oe(i,"name"),a=oe(i,"body"),l=oe(i,"type");if(o===null||o.length===0)return R(n,"missing or empty name",400);if(a===null)return R(n,"missing body",400);if(l===null||!fo.includes(l))return R(n,`invalid type: must be one of ${fo.join("|")}`,400);try{et(o)}catch(u){return R(n,u.message,400)}let c=ct(s,r);try{if(c.read(o)!==null)return R(n,`chapter already exists: ${o}`,409)}catch(u){return R(n,u.message,400)}try{c.write({type:l,name:o,description:oe(i,"description"),body:a})}catch(u){return R(n,u.message,400)}let d=c.read(o);return d===null?R(n,"chapter created but unreadable",500):n.json(d,201)}),e.get("/api/projects/:name/durable-memory/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=ct(s,r),o;try{o=i.read(n.req.param("chapter"))}catch(a){return R(n,a.message,400)}return o===null?R(n,"chapter not found",404):n.json(o)}),e.put("/api/projects/:name/durable-memory/:chapter",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=n.req.param("chapter"),o=await dt(n);if(typeof o=="string")return R(n,o,400);let a=ct(s,r),l;try{l=a.read(i)}catch(m){return R(n,m.message,400)}if(l===null)return R(n,"chapter not found",404);let c=oe(o,"body")??l.body,d=Object.prototype.hasOwnProperty.call(o,"description")?oe(o,"description"):l.description,u=oe(o,"type")??l.type;if(!fo.includes(u))return R(n,`invalid type: must be one of ${fo.join("|")}`,400);try{a.write({type:u,name:i,description:d,body:c})}catch(m){return R(n,m.message,400)}let f=a.read(i);return f===null?R(n,"chapter updated but unreadable",500):n.json(f)}),e.delete("/api/projects/:name/durable-memory/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=ct(s,r),o;try{o=i.delete(n.req.param("chapter"))}catch(a){return R(n,a.message,400)}return o?n.json({removed:!0}):R(n,"chapter not found",404)}),e.get("/api/projects/:name/ai-test",n=>{let s=r.findProjectByName(n.req.param("name"));return s===null?R(n,"project not found",404):n.json(uL(s.local_path))}),e.post("/api/projects/:name/ai-test",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=await dt(n);if(typeof i=="string")return R(n,i,400);let o=oe(i,"name"),a=oe(i,"body"),l=oe(i,"type");if(o===null||o.length===0)return R(n,"missing or empty name",400);if(a===null)return R(n,"missing body",400);if(l===null||!mo.has(l))return R(n,`invalid type: must be one of ${[...mo].join("|")}`,400);try{et(o)}catch(f){return R(n,f.message,400)}let c=cs(s.local_path),d=us(c,`${o}.md`);if(po(d))return R(n,`chapter already exists: ${o}`,409);iL(c,{recursive:!0}),$h(d,o,l,oe(i,"description"),a);let u=ds(c,o);return u===null?R(n,"chapter created but unreadable",500):n.json(u,201)}),e.get("/api/projects/:name/ai-test/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);try{et(n.req.param("chapter"))}catch(o){return R(n,o.message,400)}let i=ds(cs(s.local_path),n.req.param("chapter"));return i===null?R(n,"chapter not found",404):n.json(i)}),e.put("/api/projects/:name/ai-test/:chapter",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=n.req.param("chapter");try{et(i)}catch(m){return R(n,m.message,400)}let o=cs(s.local_path),a=ds(o,i);if(a===null)return R(n,"chapter not found",404);let l=await dt(n);if(typeof l=="string")return R(n,l,400);let c=oe(l,"body")??a.body,d=Object.prototype.hasOwnProperty.call(l,"description")?oe(l,"description"):a.description,u=oe(l,"type")??a.type;if(!mo.has(u))return R(n,`invalid type: must be one of ${[...mo].join("|")}`,400);$h(us(o,`${i}.md`),i,u,d,c);let f=ds(o,i);return f===null?R(n,"chapter updated but unreadable",500):n.json(f)}),e.delete("/api/projects/:name/ai-test/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=n.req.param("chapter");try{et(i)}catch(a){return R(n,a.message,400)}let o=us(cs(s.local_path),`${i}.md`);return po(o)?(lL(o),n.json({removed:!0})):R(n,"chapter not found",404)}),e.get("/api/tokens",n=>n.json([])),e.post("/api/tokens",n=>R(n,"scoped-tokens table not yet migrated; see briefs/scoped-tokens-design.md",501)),e.get("/api/settings",n=>n.json({})),e.patch("/api/settings",async n=>{let s=await dt(n);return typeof s=="string"?R(n,s,400):n.json({accepted:s,note:"settings persistence not yet implemented"})}),e.get("/api/chat/sessions",n=>n.json(r.listChatbotSessions(Oh))),e.post("/api/chat/sessions",async n=>{let s=await dL(n);if(typeof s=="string")return R(n,s,400);let i=s!==null?oe(s,"title"):null,o=r.createChatbotSession(Oh,i);return n.json(o,201)}),e.get("/api/chat/sessions/:id/messages",n=>{let s=n.req.param("id");return r.getChatbotSession(s)===null?R(n,"chat session not found",404):n.json(r.listChatbotMessages(s))}),e.post("/api/chat/sessions/:id/messages",async n=>{let s=n.req.param("id");if(r.getChatbotSession(s)===null)return R(n,"chat session not found",404);let i=await dt(n);if(typeof i=="string")return R(n,i,400);let o=oe(i,"role"),a=oe(i,"content");if(o===null||o!=="user"&&o!=="assistant"&&o!=="tool")return R(n,"role must be one of user|assistant|tool",400);if(a===null)return R(n,"missing content",400);let l=r.appendChatbotMessage(s,o,a);return n.json(l,201)}),e.get("/api/runs/:id/artifacts.zip",n=>{let s=Number(n.req.param("id"));if(!Number.isInteger(s))return R(n,"invalid run id",400);if(r.getRun(s)===null)return R(n,"run not found",404);let o=Rr(r,s),a=[];for(let c of o){let d=mL(c),u=null;if(c.content!==null&&c.content!==void 0)u=new TextEncoder().encode(c.content);else if(c.path!==null&&c.path!==void 0)try{let f=Ch(c.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);u=new Uint8Array(m)}catch{u=new Uint8Array(0)}u!==null&&a.push({name:d,data:u})}let l=Rh(a);return new Response(l,{status:200,headers:{"Content-Type":"application/zip","Content-Disposition":`attachment; filename="run-${s}-artifacts.zip"`,"Content-Length":String(l.byteLength)}})})}function R(e,t,r){return e.json({error:t},r)}async function dt(e){try{let t=await e.req.json();return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:"invalid JSON body"}catch{return"invalid JSON body"}}async function dL(e){let t=await e.req.text().catch(()=>"");if(t.trim().length===0)return null;try{let r=JSON.parse(t);return r!==null&&typeof r=="object"&&!Array.isArray(r)?r:"invalid JSON body"}catch{return"invalid JSON body"}}function oe(e,t){let r=e[t];return typeof r!="string"?null:r}function cs(e){return us(e,"ai-test")}function ds(e,t){let r=us(e,`${t}.md`);if(!po(r))return null;let n=Ch(r,"utf8"),s=fL(n),i=aL(r).mtime.toISOString();return{name:t,type:s.type,description:s.description,body:s.body,updated_at:i}}function uL(e){let t=cs(e);return po(t)?oL(t).filter(r=>r.endsWith(".md")&&r!=="index.md").map(r=>r.slice(0,-3)).sort().map(r=>{let n=ds(t,r);if(n===null)return null;let{name:s,type:i,description:o,updated_at:a}=n;return{name:s,type:i,description:o,updated_at:a}}).filter(r=>r!==null):[]}function $h(e,t,r,n,s){let i=n!==null&&n.length>0?`
1769
1769
  description: ${n}`:"",o=`---
1770
1770
  name: ${t}${i}
1771
1771
  type: ${r}
1772
1772
  ---
1773
- ${s}`;cL(e,o,"utf8")}function fL(e){let t=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(t===null)return{type:"scenario",description:null,body:e};let r=t[1],n=t[2].trimStart(),s=r.match(/^type:\s*(.+)$/m),i=r.match(/^description:\s*(.+)$/m);return{type:s?.[1]?.trim()??"scenario",description:i?.[1]?.trim()??null,body:n}}function mL(e){let t=e.state_name.replace(/[^a-zA-Z0-9_-]+/g,"_"),r=e.kind.replace(/[^a-zA-Z0-9_-]+/g,"_"),n=e.path!==null?pL(e.path):_L(e.kind);return`step-${e.step_id}-${t}/${e.id}-${r}${n}`}function pL(e){let t=e.lastIndexOf(".");if(t<0)return"";let r=e.slice(t);return/^\.[A-Za-z0-9]+$/.test(r)?r:""}function _L(e){return e.endsWith("_md")||e.includes("markdown")?".md":e.endsWith("_json")||e.includes("json")?".json":".txt"}var fo,mo,$h,jh=T(()=>{"use strict";Bt();Lh();Qc();fo=["user","feedback","project","reference"],mo=new Set(["smoke","integration","vision","scenario","regression"]),$h="operator"});function Re(e,t){return`<!doctype html>
1773
+ ${s}`;cL(e,o,"utf8")}function fL(e){let t=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(t===null)return{type:"scenario",description:null,body:e};let r=t[1],n=t[2].trimStart(),s=r.match(/^type:\s*(.+)$/m),i=r.match(/^description:\s*(.+)$/m);return{type:s?.[1]?.trim()??"scenario",description:i?.[1]?.trim()??null,body:n}}function mL(e){let t=e.state_name.replace(/[^a-zA-Z0-9_-]+/g,"_"),r=e.kind.replace(/[^a-zA-Z0-9_-]+/g,"_"),n=e.path!==null?pL(e.path):_L(e.kind);return`step-${e.step_id}-${t}/${e.id}-${r}${n}`}function pL(e){let t=e.lastIndexOf(".");if(t<0)return"";let r=e.slice(t);return/^\.[A-Za-z0-9]+$/.test(r)?r:""}function _L(e){return e.endsWith("_md")||e.includes("markdown")?".md":e.endsWith("_json")||e.includes("json")?".json":".txt"}var fo,mo,Oh,jh=T(()=>{"use strict";Bt();Lh();Qc();fo=["user","feedback","project","reference"],mo=new Set(["smoke","integration","vision","scenario","regression"]),Oh="operator"});function Re(e,t){return`<!doctype html>
1774
1774
  <html lang="en">
1775
1775
  <head>
1776
1776
  <meta charset="utf-8">
@@ -1838,43 +1838,43 @@ ${s}`;cL(e,o,"utf8")}function fL(e){let t=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r
1838
1838
  JOIN step s ON s.id = sa.step_id
1839
1839
  WHERE s.run_id = ? ORDER BY sa.id ASC`,e),l=new Map;for(let A of a){let Q=l.get(A.step_id)??[];Q.push({kind:A.kind,id:A.id}),l.set(A.step_id,Q)}let c=o.map(A=>({id:A.id,state_name:A.state_name,outcome:A.outcome,duration_ms:A.started_at!==null&&A.ended_at!==null?Math.max(0,new Date(A.ended_at).getTime()-new Date(A.started_at).getTime()):null,artifacts:l.get(A.id)??[]})),d=t.query("SELECT kind, COUNT(*) AS count FROM session_event WHERE run_id = ? GROUP BY kind",e),u=t.query("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'tool_result' AND payload_truncated = 0",e),f=0;for(let A of u)try{let Q=JSON.parse(A.payload);typeof Q.elapsedMs=="number"&&Q.elapsedMs>0&&(f+=Q.elapsedMs)}catch{}let m=d.map(A=>({kind:A.kind,count:A.count,total_elapsed_ms:A.kind==="tool_result"?f:0})),p=c.filter(A=>A.outcome==="request_changes"),h=[...new Set(p.map(A=>A.state_name))],g=new Date(n.started_at).getTime(),_=n.ended_at!==null?new Date(n.ended_at).getTime():Date.now(),y=t.query("SELECT project_id FROM job WHERE id = ?",n.job_id)[0]?.project_id??null,w=y!==null?t.query(`SELECT id, signal_kind, severity, description, detected_at FROM drift_signal
1840
1840
  WHERE project_id = ? AND detected_at >= ? AND detected_at <= ? ORDER BY detected_at ASC`,y,g,_):[],x=t.query(`SELECT SUM(input_tokens) AS input, SUM(output_tokens) AS output
1841
- FROM session_size WHERE observed_at >= ? AND observed_at <= ?`,n.started_at,n.ended_at??new Date().toISOString())[0],U=x?.input!==null&&x?.input!==void 0?`input: ${x.input}, output: ${x.output??0}`:"n/a",ue=t.getWorkflow(n.workflow_id),W=n.started_at!==null&&n.ended_at!==null?Math.max(0,new Date(n.ended_at).getTime()-new Date(n.started_at).getTime()):null,M={run_id:e,workflow_name:ue?.name??null,started_at:n.started_at,ended_at:n.ended_at,terminal_state:n.terminal_state,duration_ms:W,steps:c,tool_stats:m,reviewer_interventions:{count:p.length,state_names:h},drift_signals:w,token_totals:U};t.insertStepArtifact({step_id:i,kind:"run_report",content:JSON.stringify(M)})}var Jh=T(()=>{"use strict"});import{spawnSync as Gh}from"node:child_process";function od(e){return RL[e]??`no install hint; ensure '${e}' is on PATH`}function LL(e){switch(e){case"gh":return{args:["auth","status"]};case"claude":case"codex":case"gemini":case"qwen":return{args:["auth","status"]};case"opencode":return{args:["auth","list"]};default:return null}}function Xh(e){return Gh("which",[e],{encoding:"utf8"}).status===0}function Vh(e){if(e===void 0)return null;for(let t of e.tools??[])if(!Xh(t)){let r=od(t);return{kind:"missing_tool",tool:t,install_hint:r,message:`missing dependency: ${t}; ${r}`}}for(let t of e.auth??[]){if(!Xh(t)){let s=od(t);return{kind:"missing_tool",tool:t,install_hint:s,message:`missing dependency: ${t}; ${s}`}}let r=LL(t);if(r===null)continue;let n=Gh(t,r.args,{encoding:"utf8"});if(n.status!==0){let s=typeof n.stderr=="string"?n.stderr.trim():"";return{kind:"auth_failed",tool:t,install_hint:od(t),message:`${t} not authenticated; run \`${t} login\` or equivalent`,detail:s.length>0?s:void 0}}}return null}var RL,Kh=T(()=>{"use strict";RL={gh:"install: https://cli.github.com/",git:"install: apt-get install git OR brew install git",node:"install: https://nodejs.org/",claude:"install: https://docs.anthropic.com/en/docs/claude-code/quickstart",codex:"install: https://github.com/openai/codex",gemini:"install: https://github.com/google-gemini/gemini-cli",opencode:"install: https://opencode.ai/",qwen:"install: https://github.com/QwenLM/qwen-code"}});import{existsSync as $L,readdirSync as OL,readFileSync as CL}from"node:fs";import{join as Yh}from"node:path";function ML(e){let t=e.match(/^---\n([\s\S]*?)\n---/);if(!t)return[];let r=t[1],n=r.match(/^tags:\s*\[([^\]]*)\]/m);if(n)return n[1].split(",").map(i=>i.trim()).filter(Boolean);let s=r.match(/^tags:\s*\n((?:\s*-\s+.+\n?)*)/m);return s?s[1].split(`
1842
- `).map(i=>i.replace(/^\s*-\s+/,"").trim()).filter(Boolean):[]}function zh(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 Zh(e,t){if(t.length===0)return null;let r=Yh(e,"durable-memory");if(!$L(r))return null;let n;try{n=OL(r).filter(i=>i.endsWith(".md")&&i!=="index.md")}catch{return null}let s=[];for(let i of n)try{let o=CL(Yh(r,i),"utf8");if(ML(o).some(l=>t.includes(l))){let l=zh(o,"name")??i.replace(".md",""),c=zh(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 Qh=T(()=>{"use strict"});function cd(e){let t=e.trim().replace(jL,"").trim();for(let r=0;r<4;r+=1){let n=DL.exec(t);if(n===null)break;t=n[2].trim()}return t}function eg(e){let t=e.trim(),r=PL.exec(t);if(r!==null)return r[2];let n=FL.exec(t);return n!==null?n[0]:null}function ps(e,t){let r=e.split(`
1841
+ FROM session_size WHERE observed_at >= ? AND observed_at <= ?`,n.started_at,n.ended_at??new Date().toISOString())[0],U=x?.input!==null&&x?.input!==void 0?`input: ${x.input}, output: ${x.output??0}`:"n/a",ue=t.getWorkflow(n.workflow_id),W=n.started_at!==null&&n.ended_at!==null?Math.max(0,new Date(n.ended_at).getTime()-new Date(n.started_at).getTime()):null,M={run_id:e,workflow_name:ue?.name??null,started_at:n.started_at,ended_at:n.ended_at,terminal_state:n.terminal_state,duration_ms:W,steps:c,tool_stats:m,reviewer_interventions:{count:p.length,state_names:h},drift_signals:w,token_totals:U};t.insertStepArtifact({step_id:i,kind:"run_report",content:JSON.stringify(M)})}var Jh=T(()=>{"use strict"});import{spawnSync as Gh}from"node:child_process";function od(e){return RL[e]??`no install hint; ensure '${e}' is on PATH`}function LL(e){switch(e){case"gh":return{args:["auth","status"]};case"claude":case"codex":case"gemini":case"qwen":return{args:["auth","status"]};case"opencode":return{args:["auth","list"]};default:return null}}function Xh(e){return Gh("which",[e],{encoding:"utf8"}).status===0}function Vh(e){if(e===void 0)return null;for(let t of e.tools??[])if(!Xh(t)){let r=od(t);return{kind:"missing_tool",tool:t,install_hint:r,message:`missing dependency: ${t}; ${r}`}}for(let t of e.auth??[]){if(!Xh(t)){let s=od(t);return{kind:"missing_tool",tool:t,install_hint:s,message:`missing dependency: ${t}; ${s}`}}let r=LL(t);if(r===null)continue;let n=Gh(t,r.args,{encoding:"utf8"});if(n.status!==0){let s=typeof n.stderr=="string"?n.stderr.trim():"";return{kind:"auth_failed",tool:t,install_hint:od(t),message:`${t} not authenticated; run \`${t} login\` or equivalent`,detail:s.length>0?s:void 0}}}return null}var RL,Kh=T(()=>{"use strict";RL={gh:"install: https://cli.github.com/",git:"install: apt-get install git OR brew install git",node:"install: https://nodejs.org/",claude:"install: https://docs.anthropic.com/en/docs/claude-code/quickstart",codex:"install: https://github.com/openai/codex",gemini:"install: https://github.com/google-gemini/gemini-cli",opencode:"install: https://opencode.ai/",qwen:"install: https://github.com/QwenLM/qwen-code"}});import{existsSync as OL,readdirSync as $L,readFileSync as CL}from"node:fs";import{join as Yh}from"node:path";function ML(e){let t=e.match(/^---\n([\s\S]*?)\n---/);if(!t)return[];let r=t[1],n=r.match(/^tags:\s*\[([^\]]*)\]/m);if(n)return n[1].split(",").map(i=>i.trim()).filter(Boolean);let s=r.match(/^tags:\s*\n((?:\s*-\s+.+\n?)*)/m);return s?s[1].split(`
1842
+ `).map(i=>i.replace(/^\s*-\s+/,"").trim()).filter(Boolean):[]}function zh(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 Zh(e,t){if(t.length===0)return null;let r=Yh(e,"durable-memory");if(!OL(r))return null;let n;try{n=$L(r).filter(i=>i.endsWith(".md")&&i!=="index.md")}catch{return null}let s=[];for(let i of n)try{let o=CL(Yh(r,i),"utf8");if(ML(o).some(l=>t.includes(l))){let l=zh(o,"name")??i.replace(".md",""),c=zh(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 Qh=T(()=>{"use strict"});function cd(e){let t=e.trim().replace(jL,"").trim();for(let r=0;r<4;r+=1){let n=DL.exec(t);if(n===null)break;t=n[2].trim()}return t}function eg(e){let t=e.trim(),r=PL.exec(t);if(r!==null)return r[2];let n=FL.exec(t);return n!==null?n[0]:null}function ps(e,t){let r=e.split(`
1843
1843
  `),n=null,s=-1;for(let o=0;o<r.length;o+=1){let a=cd(r[o]),l=ad.exec(a);if(l===null)continue;let c=l[1].trim();if(ld.test(c))continue;let d=eg(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=cd(r[o]),l=ad.exec(a);if(l===null)break;let c=ld.exec(l[1].trim());if(c===null)break;i[c[1]]=c[2].trim()}return{outcome:n,evidence:i}}function tg(e){let t=e.split(`
1844
- `),r=null;for(let n=0;n<t.length;n+=1){let s=cd(t[n]),i=ad.exec(s);if(i===null)continue;let o=i[1].trim();if(ld.test(o))continue;let a=eg(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 jL,DL,ad,ld,PL,FL,dd=T(()=>{"use strict";Jn();jL=/^#{1,6}\s+/,DL=/^(```|\*\*|__|`|\*|_)([\s\S]+?)\1$/,ad=/^STANCE:\s+(.+)$/,ld=/^([A-Z][A-Z0-9_]*):\s*(.+)$/,PL=/^(```|\*\*|__|`|\*|_)([A-Za-z0-9_-]+)\1/,FL=/^[A-Za-z0-9_-]+/});function rg(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 ng=T(()=>{"use strict"});import{readFileSync as UL}from"node:fs";import{dirname as WL,join as BL}from"node:path";import{fileURLToPath as qL}from"node:url";function XL(e){return e.rules.map(t=>({command:t.command,subcommands:t.argv_patterns.map(r=>r.trim().split(/\s+/)),kind:t.kind}))}function YL(e){let t=[],r=[];for(let n of e)HL.has(n)?(r.length>0&&t.push(r),r=[]):r.push(n);return r.length>0&&t.push(r),t}function zL(e,t){if(e.length===0)return{matched:!1};let r=0;for(;r<e.length&&JL.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 ZL(e,t){if(e.length===0)return{matched:!1};let r=YL(e);for(let n of r){let s=zL(n,t);if(s.matched)return s}return{matched:!1}}function ud(e){return ZL(e,KL)}function QL(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 fd(e){return QL(e).split(" ").filter(t=>t.length>0)}var HL,JL,GL,VL,KL,sg=T(()=>{"use strict";HL=new Set(["&&","||",";","|",">",">>","<","<<"]),JL=/^[A-Za-z_][A-Za-z0-9_]*=/;GL=WL(qL(import.meta.url)),VL=JSON.parse(UL(BL(GL,"side_effect_classifier.json"),"utf-8")),KL=XL(VL)});function yo(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 ig(e,t){try{return await $r(md(e)??e,yo(t))===!0}catch{return!1}}async function wo(e,t){try{return await $r(md(e)??e,yo(t))}catch{return}}async function og(e,t){if(typeof e!="string")return e;let r=md(e);if(r===null)return e;try{return await $r(r,yo(t))}catch{return}}async function ag(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+=e$(await $r(a,yo(t)))}catch{n+=""}s=o+i[0].length}return n+=e.slice(s),n}function md(e){let t=e.trim();return!t.startsWith("={{")||!t.endsWith("}}")?null:t.slice(3,-2).trim()}function e$(e){return e==null?"":typeof e=="string"?e:JSON.stringify(e)}var _s=T(()=>{"use strict";os()});import{existsSync as lg,readdirSync as cg,readFileSync as t$,statSync as dg}from"node:fs";import{join as To}from"node:path";function ug(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 X(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=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,`${hs}${t.id}`,i);let a=e.dal.getRun(e.run_id),l=Vr(r)?"generic":"unhandled";return e.dal.raiseAttention({kind:ei,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:r$(s.agent_output??n),paused_at:i,created_at:i})}),e.dal.pauseJob(e.job.id),{kind:"paused"}}function r$(e){return e.length>8e3?`${e.slice(0,8e3)}
1845
- \u2026[truncated ${e.length-8e3} chars]`:e}function G(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 fg(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=cr(e.job.payload)?.[n];if(Array.isArray(i)&&i.every(o=>typeof o=="string"))return i}return null}async function Ve(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=cr(t.job.payload);return o===null?"":JSON.stringify(o)}if(i.startsWith("job_payload.")){let o=i.slice(12),l=cr(t.job.payload)?.[o];return l==null?"":String(l)}if(i.startsWith("outcomes.")){let o=n$(t.outcomes,i.slice(9));return o==null?"":typeof o=="string"?o:JSON.stringify(o)}return""});return ag(n,t)}function n$(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 cr(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 gs(e){let{context:t,stateId:r,member:n,prompt:s,stepId:i,timeoutMs:o,writesToProjectPath:a}=e,l=rg(t.dal,t.run_id,()=>i),c=pd(t,r),d={violation:null},u=S=>{if(l(S),d.violation===null&&S.kind==="tool_use"&&S.tool==="Bash"&&S.summary){let y=fd(S.summary),w=ud(y);w.matched&&!c&&(d.violation={summary:S.summary,kind:w.kind})}},f=new Date(Date.now()-1),m=0,p=0,h=S=>{u(S),s$(S,(y,w)=>{m+=y,p+=w})},g=await Ri({sessionid:n.sessionid,sessiondir:n.sessiondir,prompt:s,timeoutMs:o,dal:t.dal,team_member_id:n.id,onProgress:h});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})}),i$(t.project,t.dal,f);let _=d.violation;return _!==null?{kind:"g3_violation",summary:_.summary,violationKind:_.kind}:!a&&t.project.local_path.trim().length>0&&_d(t.project.local_path,f)?{kind:"g2_violation"}:{kind:"ok",text:g.text,ms:g.ms,argv:g.argv}}function s$(e,t){let r=e.raw;if(r==null)return;let s=r.message?.usage;if(s!==void 0){let o=Eo(s.input_tokens),a=Eo(s.output_tokens);(o>0||a>0)&&t(o,a);return}let i=r.usage;if(i!==void 0){let o=Eo(i.input_tokens),a=Eo(i.output_tokens);(o>0||a>0)&&t(o,a)}}function Eo(e){return typeof e=="number"&&Number.isFinite(e)&&e>=0?e:0}async function Jt(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 gs({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(Am(s)),l!=null&&l.length>0&&u.push(l);let f=r.prompt_template!==void 0?await Ve(r.prompt_template,e,t):"";f.length>0&&u.push(f),n!==null&&n.length>0&&u.push(n);let m=u.join(`
1844
+ `),r=null;for(let n=0;n<t.length;n+=1){let s=cd(t[n]),i=ad.exec(s);if(i===null)continue;let o=i[1].trim();if(ld.test(o))continue;let a=eg(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 jL,DL,ad,ld,PL,FL,dd=T(()=>{"use strict";Jn();jL=/^#{1,6}\s+/,DL=/^(```|\*\*|__|`|\*|_)([\s\S]+?)\1$/,ad=/^STANCE:\s+(.+)$/,ld=/^([A-Z][A-Z0-9_]*):\s*(.+)$/,PL=/^(```|\*\*|__|`|\*|_)([A-Za-z0-9_-]+)\1/,FL=/^[A-Za-z0-9_-]+/});function rg(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 ng=T(()=>{"use strict"});import{readFileSync as UL}from"node:fs";import{dirname as WL,join as BL}from"node:path";import{fileURLToPath as qL}from"node:url";function XL(e){return e.rules.map(t=>({command:t.command,subcommands:t.argv_patterns.map(r=>r.trim().split(/\s+/)),kind:t.kind}))}function YL(e){let t=[],r=[];for(let n of e)HL.has(n)?(r.length>0&&t.push(r),r=[]):r.push(n);return r.length>0&&t.push(r),t}function zL(e,t){if(e.length===0)return{matched:!1};let r=0;for(;r<e.length&&JL.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 ZL(e,t){if(e.length===0)return{matched:!1};let r=YL(e);for(let n of r){let s=zL(n,t);if(s.matched)return s}return{matched:!1}}function ud(e){return ZL(e,KL)}function QL(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 fd(e){return QL(e).split(" ").filter(t=>t.length>0)}var HL,JL,GL,VL,KL,sg=T(()=>{"use strict";HL=new Set(["&&","||",";","|",">",">>","<","<<"]),JL=/^[A-Za-z_][A-Za-z0-9_]*=/;GL=WL(qL(import.meta.url)),VL=JSON.parse(UL(BL(GL,"side_effect_classifier.json"),"utf-8")),KL=XL(VL)});function yo(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 ig(e,t){try{return await Or(md(e)??e,yo(t))===!0}catch{return!1}}async function wo(e,t){try{return await Or(md(e)??e,yo(t))}catch{return}}async function og(e,t){if(typeof e!="string")return e;let r=md(e);if(r===null)return e;try{return await Or(r,yo(t))}catch{return}}async function ag(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+=eO(await Or(a,yo(t)))}catch{n+=""}s=o+i[0].length}return n+=e.slice(s),n}function md(e){let t=e.trim();return!t.startsWith("={{")||!t.endsWith("}}")?null:t.slice(3,-2).trim()}function eO(e){return e==null?"":typeof e=="string"?e:JSON.stringify(e)}var _s=T(()=>{"use strict";os()});import{existsSync as lg,readdirSync as cg,readFileSync as tO,statSync as dg}from"node:fs";import{join as To}from"node:path";function ug(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 X(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,`${hs}${t.id}`,i);let a=e.dal.getRun(e.run_id),l=Vr(r)?"generic":"unhandled";return e.dal.raiseAttention({kind:ei,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:rO(s.agent_output??n),paused_at:i,created_at:i})}),e.dal.pauseJob(e.job.id),{kind:"paused"}}function rO(e){return e.length>8e3?`${e.slice(0,8e3)}
1845
+ \u2026[truncated ${e.length-8e3} chars]`:e}function G(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 fg(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=cr(e.job.payload)?.[n];if(Array.isArray(i)&&i.every(o=>typeof o=="string"))return i}return null}async function Ve(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=cr(t.job.payload);return o===null?"":JSON.stringify(o)}if(i.startsWith("job_payload.")){let o=i.slice(12),l=cr(t.job.payload)?.[o];return l==null?"":String(l)}if(i.startsWith("outcomes.")){let o=nO(t.outcomes,i.slice(9));return o==null?"":typeof o=="string"?o:JSON.stringify(o)}return""});return ag(n,t)}function nO(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 cr(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 gs(e){let{context:t,stateId:r,member:n,prompt:s,stepId:i,timeoutMs:o,writesToProjectPath:a}=e,l=rg(t.dal,t.run_id,()=>i),c=pd(t,r),d={violation:null},u=S=>{if(l(S),d.violation===null&&S.kind==="tool_use"&&S.tool==="Bash"&&S.summary){let y=fd(S.summary),w=ud(y);w.matched&&!c&&(d.violation={summary:S.summary,kind:w.kind})}},f=new Date(Date.now()-1),m=0,p=0,h=S=>{u(S),sO(S,(y,w)=>{m+=y,p+=w})},g=await Ri({sessionid:n.sessionid,sessiondir:n.sessiondir,prompt:s,timeoutMs:o,dal:t.dal,team_member_id:n.id,onProgress:h});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})}),iO(t.project,t.dal,f);let _=d.violation;return _!==null?{kind:"g3_violation",summary:_.summary,violationKind:_.kind}:!a&&t.project.local_path.trim().length>0&&_d(t.project.local_path,f)?{kind:"g2_violation"}:{kind:"ok",text:g.text,ms:g.ms,argv:g.argv}}function sO(e,t){let r=e.raw;if(r==null)return;let s=r.message?.usage;if(s!==void 0){let o=Eo(s.input_tokens),a=Eo(s.output_tokens);(o>0||a>0)&&t(o,a);return}let i=r.usage;if(i!==void 0){let o=Eo(i.input_tokens),a=Eo(i.output_tokens);(o>0||a>0)&&t(o,a)}}function Eo(e){return typeof e=="number"&&Number.isFinite(e)&&e>=0?e:0}async function Jt(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 gs({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(Am(s)),l!=null&&l.length>0&&u.push(l);let f=r.prompt_template!==void 0?await Ve(r.prompt_template,e,t):"";f.length>0&&u.push(f),n!==null&&n.length>0&&u.push(n);let m=u.join(`
1846
1846
 
1847
1847
  `);try{let p=await gs({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 h=ps(p.text,s);return e.dal.finishStep(d.id,h.outcome,h.outcome!==null?`chat_ms=${p.ms}`:h.reason),h.outcome!==null&&(e.outcomes[t]=h.outcome),{outcome:h.outcome,text:p.text,status_detail:h.outcome!==null?`chat_ms=${p.ms}`:h.reason}}catch(p){let h=p instanceof ve?`chat_${p.kind}`:"chat_other";return e.dal.finishStep(d.id,null,h),{outcome:null,text:"",status_detail:h}}}function pn(e,t){return(t?.length??0)>0?Zh(e.project.local_path,t):null}function mg(e){return ud(fd(e))}function pd(e,t){let r=e.dal.query(`SELECT state_name, outcome FROM step
1848
1848
  WHERE run_id = ? AND state_name != ? AND ended_at IS NOT NULL
1849
- 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 _d(e,t){if(!lg(e))return!1;let r=To(e,"durable-memory");function n(s){let i;try{i=cg(s,{withFileTypes:!0})}catch{return!1}for(let o of i){if(o.name===".git")continue;let a=To(s,o.name);if(a!==r)if(o.isDirectory()){if(n(a))return!0}else try{if(dg(a).mtime>t)return!0}catch{}}return!1}return n(e)}function i$(e,t,r){let n=To(e.local_path,"durable-memory");if(!lg(n))return;let s;try{s=cg(n)}catch{return}for(let i of s){if(!i.endsWith(".md")||i==="MEMORY.md")continue;let o=To(n,i),a;try{a=dg(o).mtime}catch{continue}if(a<=r)continue;let l;try{l=t$(o,"utf8")}catch{continue}let c=a$(l);if(c===null){process.stderr.write(`[durable-memory-sync] warning: ${i} has no valid frontmatter, skipping
1850
- `);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 a$(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||!o$.has(l)?null:{name:a,type:l,description:o?.[1]?.trim()??null,body:n}}var hs,o$,qe=T(()=>{"use strict";Ze();ln();Li();Qh();dd();Jn();ng();sg();_s();hs="__paused__:";o$=new Set(["user","feedback","project","reference"])});import{spawnSync as pg}from"node:child_process";function l$(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=pg("git",["diff","--quiet"],{cwd:i}).status!==0,a=pg("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),G(e,r,n,$c),{kind:"terminal",terminal:Y(e.workflow)}}return e.dal.finishStep(s.id,"clean","repo_clean"),G(e,r,n,"clean"),X(e.workflow,t.next)}var _g,hg=T(()=>{"use strict";qe();_g={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=>l$(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;for(let i of t.branches)if(await ig(i.when,e))return e.dal.finishStep(s.id,"matched",i.when),G(e,r,n,"matched"),X(e.workflow,i.next);return e.dal.finishStep(s.id,"no_match","choice_no_match"),G(e,r,n,"no_match"),t.default_next!==void 0?X(e.workflow,t.default_next):{kind:"terminal",terminal:e.workflow.terminals.no_match?"no_match":Y(e.workflow)}}var gg,yg=T(()=>{"use strict";qe();_s();gg={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=>c$(e,e.state)}});async function d$(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 h=`${n}:researcher_${m.alias}[${p}]`,g=await mn(e,h,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
+ 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 _d(e,t){if(!lg(e))return!1;let r=To(e,"durable-memory");function n(s){let i;try{i=cg(s,{withFileTypes:!0})}catch{return!1}for(let o of i){if(o.name===".git")continue;let a=To(s,o.name);if(a!==r)if(o.isDirectory()){if(n(a))return!0}else try{if(dg(a).mtime>t)return!0}catch{}}return!1}return n(e)}function iO(e,t,r){let n=To(e.local_path,"durable-memory");if(!lg(n))return;let s;try{s=cg(n)}catch{return}for(let i of s){if(!i.endsWith(".md")||i==="MEMORY.md")continue;let o=To(n,i),a;try{a=dg(o).mtime}catch{continue}if(a<=r)continue;let l;try{l=tO(o,"utf8")}catch{continue}let c=aO(l);if(c===null){process.stderr.write(`[durable-memory-sync] warning: ${i} has no valid frontmatter, skipping
1850
+ `);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 aO(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||!oO.has(l)?null:{name:a,type:l,description:o?.[1]?.trim()??null,body:n}}var hs,oO,qe=T(()=>{"use strict";Ze();ln();Li();Qh();dd();Jn();ng();sg();_s();hs="__paused__:";oO=new Set(["user","feedback","project","reference"])});import{spawnSync as pg}from"node:child_process";function lO(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=pg("git",["diff","--quiet"],{cwd:i}).status!==0,a=pg("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),G(e,r,n,Oc),{kind:"terminal",terminal:Y(e.workflow)}}return e.dal.finishStep(s.id,"clean","repo_clean"),G(e,r,n,"clean"),X(e.workflow,t.next)}var _g,hg=T(()=>{"use strict";qe();_g={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=>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;for(let i of t.branches)if(await ig(i.when,e))return e.dal.finishStep(s.id,"matched",i.when),G(e,r,n,"matched"),X(e.workflow,i.next);return e.dal.finishStep(s.id,"no_match","choice_no_match"),G(e,r,n,"no_match"),t.default_next!==void 0?X(e.workflow,t.default_next):{kind:"terminal",terminal:e.workflow.terminals.no_match?"no_match":Y(e.workflow)}}var gg,yg=T(()=>{"use strict";qe();_s();gg={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=>cO(e,e.state)}});async function dO(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 h=`${n}:researcher_${m.alias}[${p}]`,g=await mn(e,h,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??""}
1851
1851
  ${m}`:null).filter(m=>m!==null).join(`
1852
1852
 
1853
- `),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"&&G(e,r,n,"error");let m=t.outcomes.error;return m!==void 0?X(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"),G(e,r,n,"ok"),t.write_back_durable_memory){let m=e.membersByAlias.get(t.consolidator.alias);m!==void 0&&await Jt(e,n,m,t.write_back_durable_memory)}return X(e.workflow,t.outcomes.ok)}var wg,Eg=T(()=>{"use strict";qe();wg={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=>d$(e,e.state)}});async function u$(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 wo(t.items_from,e),a=_$(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?X(e.workflow,f):{kind:"terminal",terminal:Y(e.workflow)}}let l={routed:null},c=t.mode==="parallel"?await m$(e,t,s.id,a,l):await f$(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})),G(e,r,n,u),d){let f=t.outcomes.any_failed;return f!==void 0?X(e.workflow,f):{kind:"terminal",terminal:Y(e.workflow)}}return X(e.workflow,t.outcomes.all_ok)}finally{e.progress_step_id=i}}async function f$(e,t,r,n,s){let i=[];for(let o=0;o<n.length;o+=1){let a=await bg(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 m$(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 bg(e,t,r,n[l],l,s)}});return await Promise.all(a),i}async function bg(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__":p$(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 p$(e){return e==null?null:typeof e=="string"?e:JSON.stringify(e)}function _$(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 Tg,Sg=T(()=>{"use strict";qe();_s();Tg={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=>u$(e,e.state)}});async function h$(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 Jt(e,n,i,t.write_back_durable_memory),X(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}`),G(e,r,n,"timeout");let m=t.outcomes.timeout;return m!==void 0?X(e.workflow,m):{kind:"terminal",terminal:Y(e.workflow)}}let f=a.last_operator_input??"";try{let m=await gs({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"),G(e,r,n,"done"),t.write_back_durable_memory&&await Jt(e,n,i,t.write_back_durable_memory),X(e.workflow,t.outcomes.done)):(vg({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 Ve(t.agent.initial_prompt_template,e,n),u=o?`${o}
1853
+ `),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"&&G(e,r,n,"error");let m=t.outcomes.error;return m!==void 0?X(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"),G(e,r,n,"ok"),t.write_back_durable_memory){let m=e.membersByAlias.get(t.consolidator.alias);m!==void 0&&await Jt(e,n,m,t.write_back_durable_memory)}return X(e.workflow,t.outcomes.ok)}var wg,Eg=T(()=>{"use strict";qe();wg={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=>dO(e,e.state)}});async function uO(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 wo(t.items_from,e),a=_O(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?X(e.workflow,f):{kind:"terminal",terminal:Y(e.workflow)}}let l={routed:null},c=t.mode==="parallel"?await mO(e,t,s.id,a,l):await fO(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})),G(e,r,n,u),d){let f=t.outcomes.any_failed;return f!==void 0?X(e.workflow,f):{kind:"terminal",terminal:Y(e.workflow)}}return X(e.workflow,t.outcomes.all_ok)}finally{e.progress_step_id=i}}async function fO(e,t,r,n,s){let i=[];for(let o=0;o<n.length;o+=1){let a=await bg(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 mO(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 bg(e,t,r,n[l],l,s)}});return await Promise.all(a),i}async function bg(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__":pO(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 pO(e){return e==null?null:typeof e=="string"?e:JSON.stringify(e)}function _O(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 Tg,Sg=T(()=>{"use strict";qe();_s();Tg={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=>uO(e,e.state)}});async function hO(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 Jt(e,n,i,t.write_back_durable_memory),X(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}`),G(e,r,n,"timeout");let m=t.outcomes.timeout;return m!==void 0?X(e.workflow,m):{kind:"terminal",terminal:Y(e.workflow)}}let f=a.last_operator_input??"";try{let m=await gs({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"),G(e,r,n,"done"),t.write_back_durable_memory&&await Jt(e,n,i,t.write_back_durable_memory),X(e.workflow,t.outcomes.done)):(vg({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 Ve(t.agent.initial_prompt_template,e,n),u=o?`${o}
1854
1854
 
1855
- ${d}`:d;try{let f=await gs({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 Jt(e,n,i,t.write_back_durable_memory),X(e.workflow,t.outcomes.done)):(vg({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 vg(e){let{context:t,state:r,stateId:n,displayName:s,stepId:i,agentText:o}=e,a=$();t.dal.setRunPausedState(t.run_id,`${hs}${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(g$({context:t,stateId:s,state:r,stepId:i,agentText:o,pausedAt:a}))}),t.dal.pauseJob(t.job.id)}function g$(e){let{context:t,stateId:r,state:n,stepId:s,agentText:i,pausedAt:o}=e,a=t.dal.getRun(t.run_id),l=y$(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:w$(i,3),paused_at:o,created_run_inputs:cr(t.job.payload)}}function y$(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 w$(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 kg,Ig=T(()=>{"use strict";Li();qe();kg={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=>h$(e,e.state)}});async function E$(e,t){let r=e.stateId,n=e.displayName,s=fg(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?X(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 h;try{h=await e.dispatchState(m,i,{iteration:{item:f,index:u}})}finally{e.iteration=p}if(h.kind==="paused"||h.kind==="escalate")return h;let g=T$(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})),G(e,r,n,d),l){let u=t.outcomes.error;return u!==void 0?X(e.workflow,u):{kind:"terminal",terminal:Y(e.workflow)}}return X(e.workflow,t.outcomes.ok)}function T$(e){return e==null?null:typeof e=="string"?e:JSON.stringify(e)}var Ng,xg=T(()=>{"use strict";qe();Ng={description:{displayName:"Loop",name:"loop",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],builtin:!0},execute:async e=>E$(e,e.state)}});import{createHash as b$}from"node:crypto";import{existsSync as S$,mkdirSync as v$,readFileSync as k$,writeFileSync as I$}from"node:fs";import{dirname as N$,isAbsolute as Rg,normalize as x$,resolve as ys}from"node:path";import{Document as A$,ExternalHyperlink as R$,HeadingLevel as _n,LevelFormat as L$,Packer as $$,Paragraph as ft,Table as O$,TableCell as C$,TableRow as M$,TextRun as mt,WidthType as j$}from"docx";import{marked as D$}from"marked";async function P$(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 F$(e,t,n),o=await U$(e,t),a=await W$(e,t.title),l=await X$(i,a??e.workflow.name);if(l.length===0)throw new Error("rendered DOCX buffer was empty");return v$(N$(o),{recursive:!0}),I$(o,l),e.dal.insertStepArtifact({step_id:s.id,kind:"render_docx",path:o,sha:b$("sha256").update(l).digest("hex"),provider_call_mode:"library"}),e.dal.finishStep(s.id,"done",`wrote:${o}`),G(e,r,n,{output_path:o,path:o,bytes:l.length}),X(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),G(e,r,n,{error:o}),X(e.workflow,t.outcomes?.error??"@terminal:error")}}async function F$(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 Ve(t.markdown_source,e,r)).trim(),i=(n.length===0?J$(e,t.markdown_source):null)??n;if(i.length===0)throw new Error("markdown_source resolved empty");let o=q$(e.project.local_path,i);if(o!==null){if(!S$(o))throw new Error(`markdown_source file not found: ${o}`);return bo(k$(o,"utf8"))}return bo(i)}async function U$(e,t){if(typeof t.output_path!="string"||t.output_path.trim().length===0)throw new Error("output_path is required");let r=(await Ve(t.output_path,e,e.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=B$(e.project.local_path,r);if(!n.endsWith(".docx"))throw new Error(`output_path must end with .docx: ${n}`);return n}async function W$(e,t){if(typeof t!="string"||t.trim().length===0)return null;let r=(await Ve(t,e,e.stateId)).trim();return r.length===0?null:r}function B$(e,t){let r=ys(e);return x$(Rg(t)?ys(t):ys(r,t))}function q$(e,t){return H$(t)?Rg(t)?ys(t):ys(e,t):null}function H$(e){return e.endsWith(".md")||e.endsWith(".markdown")||e.startsWith("./")||e.startsWith("../")||e.startsWith("/")}function J$(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 bo(s);let i=e.dal.query(`SELECT sa.content
1855
+ ${d}`:d;try{let f=await gs({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 Jt(e,n,i,t.write_back_durable_memory),X(e.workflow,t.outcomes.done)):(vg({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 vg(e){let{context:t,state:r,stateId:n,displayName:s,stepId:i,agentText:o}=e,a=O();t.dal.setRunPausedState(t.run_id,`${hs}${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(gO({context:t,stateId:s,state:r,stepId:i,agentText:o,pausedAt:a}))}),t.dal.pauseJob(t.job.id)}function gO(e){let{context:t,stateId:r,state:n,stepId:s,agentText:i,pausedAt:o}=e,a=t.dal.getRun(t.run_id),l=yO(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:wO(i,3),paused_at:o,created_run_inputs:cr(t.job.payload)}}function yO(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 wO(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 kg,Ig=T(()=>{"use strict";Li();qe();kg={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=>hO(e,e.state)}});async function EO(e,t){let r=e.stateId,n=e.displayName,s=fg(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?X(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 h;try{h=await e.dispatchState(m,i,{iteration:{item:f,index:u}})}finally{e.iteration=p}if(h.kind==="paused"||h.kind==="escalate")return h;let g=TO(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})),G(e,r,n,d),l){let u=t.outcomes.error;return u!==void 0?X(e.workflow,u):{kind:"terminal",terminal:Y(e.workflow)}}return X(e.workflow,t.outcomes.ok)}function TO(e){return e==null?null:typeof e=="string"?e:JSON.stringify(e)}var Ng,xg=T(()=>{"use strict";qe();Ng={description:{displayName:"Loop",name:"loop",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],builtin:!0},execute:async e=>EO(e,e.state)}});import{createHash as bO}from"node:crypto";import{existsSync as SO,mkdirSync as vO,readFileSync as kO,writeFileSync as IO}from"node:fs";import{dirname as NO,isAbsolute as Rg,normalize as xO,resolve as ys}from"node:path";import{Document as AO,ExternalHyperlink as RO,HeadingLevel as _n,LevelFormat as LO,Packer as OO,Paragraph as ft,Table as $O,TableCell as CO,TableRow as MO,TextRun as mt,WidthType as jO}from"docx";import{marked as DO}from"marked";async function PO(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 FO(e,t,n),o=await UO(e,t),a=await WO(e,t.title),l=await XO(i,a??e.workflow.name);if(l.length===0)throw new Error("rendered DOCX buffer was empty");return vO(NO(o),{recursive:!0}),IO(o,l),e.dal.insertStepArtifact({step_id:s.id,kind:"render_docx",path:o,sha:bO("sha256").update(l).digest("hex"),provider_call_mode:"library"}),e.dal.finishStep(s.id,"done",`wrote:${o}`),G(e,r,n,{output_path:o,path:o,bytes:l.length}),X(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),G(e,r,n,{error:o}),X(e.workflow,t.outcomes?.error??"@terminal:error")}}async function FO(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 Ve(t.markdown_source,e,r)).trim(),i=(n.length===0?JO(e,t.markdown_source):null)??n;if(i.length===0)throw new Error("markdown_source resolved empty");let o=qO(e.project.local_path,i);if(o!==null){if(!SO(o))throw new Error(`markdown_source file not found: ${o}`);return bo(kO(o,"utf8"))}return bo(i)}async function UO(e,t){if(typeof t.output_path!="string"||t.output_path.trim().length===0)throw new Error("output_path is required");let r=(await Ve(t.output_path,e,e.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=BO(e.project.local_path,r);if(!n.endsWith(".docx"))throw new Error(`output_path must end with .docx: ${n}`);return n}async function WO(e,t){if(typeof t!="string"||t.trim().length===0)return null;let r=(await Ve(t,e,e.stateId)).trim();return r.length===0?null:r}function BO(e,t){let r=ys(e);return xO(Rg(t)?ys(t):ys(r,t))}function qO(e,t){return HO(t)?Rg(t)?ys(t):ys(e,t):null}function HO(e){return e.endsWith(".md")||e.endsWith(".markdown")||e.startsWith("./")||e.startsWith("../")||e.startsWith("/")}function JO(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 bo(s);let i=e.dal.query(`SELECT sa.content
1856
1856
  FROM step_artifact sa
1857
1857
  JOIN step s ON s.id = sa.step_id
1858
1858
  WHERE s.run_id = ?
1859
1859
  AND s.state_name LIKE ?
1860
1860
  AND sa.content IS NOT NULL
1861
1861
  ORDER BY sa.id DESC
1862
- LIMIT 1`,e.run_id,`${n}:coder[%`);return i[0]?.content===void 0?null:bo(i[0].content)}function bo(e){return e.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}async function X$(e,t){let r=$g(D$.lexer(e,{gfm:!0})),n=new A$({title:t,numbering:{config:[{reference:"ordered-list",levels:[{level:0,format:L$.DECIMAL,text:"%1."}]}]},sections:[{children:r.length===0?[new ft("")]:r}]});return $$.toBuffer(n)}function $g(e){let t=[];for(let r of e)switch(r.type){case"space":break;case"heading":t.push(new ft({heading:Q$(r.depth),children:ur(dr(r))}));break;case"paragraph":t.push(new ft({children:ur(dr(r))}));break;case"text":t.push(new ft({children:dr(r).length===0?[new mt(r.text)]:ur(dr(r))}));break;case"blockquote":t.push(...$g(dr(r)).map(n=>n instanceof ft?n:new ft({children:[new mt(r.text)]})));break;case"list":Y$(r)&&t.push(...G$(r));break;case"table":z$(r)&&t.push(V$(r));break;case"code":Z$(r)&&t.push(...K$(r));break;case"hr":t.push(new ft(""));break;case"html":r.text.trim().length>0&&t.push(new ft({children:[new mt(r.text)]}));break;default:break}return t}function ur(e,t){let r=[];for(let n of e)switch(n.type){case"text":case"escape":r.push(new mt({text:n.text,...hd(t)}));break;case"strong":r.push(...ur(dr(n),{...t,bold:!0}));break;case"em":r.push(...ur(dr(n),{...t,italics:!0}));break;case"codespan":r.push(new mt({text:n.text,...hd({...t,code:!0})}));break;case"link":r.push(new R$({link:n.href,children:ur(dr(n),{...t})}));break;case"br":r.push(new mt({text:"",break:1}));break;case"image":r.push(new mt({text:`[image: ${n.text}]`,italics:!0}));break;case"del":r.push(new mt({text:n.text,strike:!0}));break;default:r.push(new mt({text:n.raw,...hd(t)}));break}return r.length===0?[new mt("")]:r}function hd(e){return{...e?.bold===!0?{bold:!0}:{},...e?.italics===!0?{italics:!0}:{},...e?.code===!0?{font:"Courier New"}:{}}}function G$(e){return e.items.map(t=>new ft({children:ur(t.tokens.length===1&&t.tokens[0]?.type==="text"?[{...t.tokens[0],text:Ag(t)+t.tokens[0].text}]:[{type:"text",raw:t.text,text:Ag(t)+t.text}]),...e.ordered?{numbering:{reference:"ordered-list",level:0}}:{bullet:{level:0}}}))}function Ag(e){return e.task?`[${e.checked?"x":" "}] `:""}function V$(e){let t=[e.header,...e.rows].map(r=>new M$({children:r.map(n=>new C$({children:[new ft({children:ur(n.tokens,n.header?{bold:!0}:void 0)})]}))}));return new O$({width:{size:100,type:j$.PERCENTAGE},rows:t})}function K$(e){return e.text.split(`
1863
- `).map(r=>new ft({children:[new mt({text:r.length===0?" ":r,font:"Courier New"})]}))}function dr(e){let t=e.tokens;return Array.isArray(t)?t:[]}function Y$(e){return e.type==="list"&&Array.isArray(e.items)}function z$(e){let t=e;return e.type==="table"&&Array.isArray(t.header)&&Array.isArray(t.rows)}function Z$(e){return e.type==="code"&&typeof e.text=="string"}function Q$(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 Lg,Og=T(()=>{"use strict";qe();Lg={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=>P$(e,e.state)}});import{createHash as eO}from"node:crypto";import{existsSync as tO,mkdirSync as rO,readFileSync as Cg,statSync as nO}from"node:fs";import{dirname as sO,isAbsolute as Mg,normalize as iO,resolve as ws}from"node:path";import{marked as oO}from"marked";import aO from"write-excel-file/node";async function lO(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 cO(e,t),o=dO(t.input_format),a=await uO(e,t),l=await fO(e,t.title),c=o==="markdown"?TO(i):hO(i);await bO({sheets:c.length===0?[{name:"Sheet1",headers:[],rows:[]}]:c,outputPath:a,title:l??e.workflow.name});let d=nO(a).size;if(d===0)throw new Error("rendered XLSX file was empty");let u=eO("sha256").update(Cg(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}`),G(e,r,n,{output_path:a,path:a,bytes:d}),X(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),G(e,r,n,{error:o}),X(e.workflow,t.outcomes?.error??"@terminal:error")}}async function cO(e,t){if(typeof t.source!="string"||t.source.trim().length===0)return"";let r=(await Ve(t.source,e,e.stateId)).trim(),n=pO(e.project.local_path,r);if(n!==null){if(!tO(n))throw new Error(`source file not found: ${n}`);return Cg(n,"utf8")}return r}function dO(e){if(e==null||e==="")return"json";if(e==="json"||e==="markdown")return e;throw new Error(`unsupported input_format: ${String(e)}`)}async function uO(e,t){if(typeof t.output_path!="string"||t.output_path.trim().length===0)throw new Error("output_path is required");let r=(await Ve(t.output_path,e,e.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=mO(e.project.local_path,r);if(!n.endsWith(".xlsx"))throw new Error(`output_path must end with .xlsx: ${n}`);return n}async function fO(e,t){if(typeof t!="string"||t.trim().length===0)return null;let r=(await Ve(t,e,e.stateId)).trim();return r.length===0?null:r}function mO(e,t){let r=ws(e);return iO(Mg(t)?ws(t):ws(r,t))}function pO(e,t){return _O(t)?Mg(t)?ws(t):ws(e,t):null}function _O(e){return e.endsWith(".json")||e.endsWith(".md")||e.endsWith(".markdown")||e.startsWith("./")||e.startsWith("../")||e.startsWith("/")}function hO(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(!So(t)||!Array.isArray(t.sheets))throw new Error("JSON source must be an object with sheets[]");return t.sheets.map((r,n)=>gO(r,n))}function gO(e,t){if(!So(e))throw new Error(`sheets[${t}] must be an object`);let r=yO(e.headers,`sheets[${t}].headers`),n=wO(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:EO(e.styles)}}function yO(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 wO(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 EO(e){if(!So(e)||!So(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 TO(e){let t=oO.lexer(e,{gfm:!0}),r=[],n=null;for(let s of t){if(AO(s)){n=s.text;continue}RO(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 bO(e){rO(sO(e.outputPath),{recursive:!0});let t=new Set,r=e.sheets.map(n=>({sheet:IO(n.name,t),data:SO(n),columns:kO(n)}));await aO(r).toFile(e.outputPath)}function SO(e){let t=[];if(e.headers.length>0){let r=xO(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(vO));return t.length===0?[[{}]]:t}function vO(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 kO(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 IO(e,t){let r=NO(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 NO(e){let t=e.replace(/[\[\]:*?/\\]/g," ").trim();return(t.length===0?"Sheet":t).slice(0,31)}function xO(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 AO(e){return e.type==="heading"&&typeof e.text=="string"}function RO(e){let t=e;return e.type==="table"&&Array.isArray(t.header)&&Array.isArray(t.rows)}function So(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var jg,Dg=T(()=>{"use strict";qe();jg={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=>lO(e,e.state)}});import{spawnSync as LO}from"node:child_process";async function OO(e,t){let r=e.stateId,n=e.displayName,s=e.workflow.default_task_timeout_ms;for(let f of t.pre_checks??[])if(LO("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}`),G(e,r,n,"fail_pre_check");let h=t.outcomes.fail_pre_check;return h!==void 0?X(e.workflow,h):{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:
1864
- ${a}`:null,c,l,s,t.writes_to_project_path===!0,i);if(l){let g=tg(p.text);if(g!==null){let _=q(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.finishStep(_.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=ps(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"),G(e,r,n,y.outcome),X(e.workflow,t.outcomes_from_stance[y.outcome])}let g=ps(p.text,$O);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"),G(e,r,n,g.outcome),{kind:"escalate",token:g.outcome,reason:`failure_stance:${g.outcome}`}}let _=q(e,{run_id:e.run_id,state_name:n});if(e.steps_executed+=1,e.dal.finishStep(_.id,"approve","no_reviewers"),G(e,r,n,"approve"),t.write_back_durable_memory){let S=e.membersByAlias.get(t.coder.alias);S!==void 0&&await Jt(e,n,S,t.write_back_durable_memory)}return X(e.workflow,t.outcomes.approve)}let h=await Promise.all(o.map(g=>mn(e,`${n}:reviewer_${g.alias}[${f}]`,g,`CODER OUTPUT:
1862
+ LIMIT 1`,e.run_id,`${n}:coder[%`);return i[0]?.content===void 0?null:bo(i[0].content)}function bo(e){return e.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}async function XO(e,t){let r=Og(DO.lexer(e,{gfm:!0})),n=new AO({title:t,numbering:{config:[{reference:"ordered-list",levels:[{level:0,format:LO.DECIMAL,text:"%1."}]}]},sections:[{children:r.length===0?[new ft("")]:r}]});return OO.toBuffer(n)}function Og(e){let t=[];for(let r of e)switch(r.type){case"space":break;case"heading":t.push(new ft({heading:QO(r.depth),children:ur(dr(r))}));break;case"paragraph":t.push(new ft({children:ur(dr(r))}));break;case"text":t.push(new ft({children:dr(r).length===0?[new mt(r.text)]:ur(dr(r))}));break;case"blockquote":t.push(...Og(dr(r)).map(n=>n instanceof ft?n:new ft({children:[new mt(r.text)]})));break;case"list":YO(r)&&t.push(...GO(r));break;case"table":zO(r)&&t.push(VO(r));break;case"code":ZO(r)&&t.push(...KO(r));break;case"hr":t.push(new ft(""));break;case"html":r.text.trim().length>0&&t.push(new ft({children:[new mt(r.text)]}));break;default:break}return t}function ur(e,t){let r=[];for(let n of e)switch(n.type){case"text":case"escape":r.push(new mt({text:n.text,...hd(t)}));break;case"strong":r.push(...ur(dr(n),{...t,bold:!0}));break;case"em":r.push(...ur(dr(n),{...t,italics:!0}));break;case"codespan":r.push(new mt({text:n.text,...hd({...t,code:!0})}));break;case"link":r.push(new RO({link:n.href,children:ur(dr(n),{...t})}));break;case"br":r.push(new mt({text:"",break:1}));break;case"image":r.push(new mt({text:`[image: ${n.text}]`,italics:!0}));break;case"del":r.push(new mt({text:n.text,strike:!0}));break;default:r.push(new mt({text:n.raw,...hd(t)}));break}return r.length===0?[new mt("")]:r}function hd(e){return{...e?.bold===!0?{bold:!0}:{},...e?.italics===!0?{italics:!0}:{},...e?.code===!0?{font:"Courier New"}:{}}}function GO(e){return e.items.map(t=>new ft({children:ur(t.tokens.length===1&&t.tokens[0]?.type==="text"?[{...t.tokens[0],text:Ag(t)+t.tokens[0].text}]:[{type:"text",raw:t.text,text:Ag(t)+t.text}]),...e.ordered?{numbering:{reference:"ordered-list",level:0}}:{bullet:{level:0}}}))}function Ag(e){return e.task?`[${e.checked?"x":" "}] `:""}function VO(e){let t=[e.header,...e.rows].map(r=>new MO({children:r.map(n=>new CO({children:[new ft({children:ur(n.tokens,n.header?{bold:!0}:void 0)})]}))}));return new $O({width:{size:100,type:jO.PERCENTAGE},rows:t})}function KO(e){return e.text.split(`
1863
+ `).map(r=>new ft({children:[new mt({text:r.length===0?" ":r,font:"Courier New"})]}))}function dr(e){let t=e.tokens;return Array.isArray(t)?t:[]}function YO(e){return e.type==="list"&&Array.isArray(e.items)}function zO(e){let t=e;return e.type==="table"&&Array.isArray(t.header)&&Array.isArray(t.rows)}function ZO(e){return e.type==="code"&&typeof e.text=="string"}function QO(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 Lg,$g=T(()=>{"use strict";qe();Lg={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=>PO(e,e.state)}});import{createHash as e$}from"node:crypto";import{existsSync as t$,mkdirSync as r$,readFileSync as Cg,statSync as n$}from"node:fs";import{dirname as s$,isAbsolute as Mg,normalize as i$,resolve as ws}from"node:path";import{marked as o$}from"marked";import a$ from"write-excel-file/node";async function l$(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 c$(e,t),o=d$(t.input_format),a=await u$(e,t),l=await f$(e,t.title),c=o==="markdown"?T$(i):h$(i);await b$({sheets:c.length===0?[{name:"Sheet1",headers:[],rows:[]}]:c,outputPath:a,title:l??e.workflow.name});let d=n$(a).size;if(d===0)throw new Error("rendered XLSX file was empty");let u=e$("sha256").update(Cg(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}`),G(e,r,n,{output_path:a,path:a,bytes:d}),X(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),G(e,r,n,{error:o}),X(e.workflow,t.outcomes?.error??"@terminal:error")}}async function c$(e,t){if(typeof t.source!="string"||t.source.trim().length===0)return"";let r=(await Ve(t.source,e,e.stateId)).trim(),n=p$(e.project.local_path,r);if(n!==null){if(!t$(n))throw new Error(`source file not found: ${n}`);return Cg(n,"utf8")}return r}function d$(e){if(e==null||e==="")return"json";if(e==="json"||e==="markdown")return e;throw new Error(`unsupported input_format: ${String(e)}`)}async function u$(e,t){if(typeof t.output_path!="string"||t.output_path.trim().length===0)throw new Error("output_path is required");let r=(await Ve(t.output_path,e,e.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=m$(e.project.local_path,r);if(!n.endsWith(".xlsx"))throw new Error(`output_path must end with .xlsx: ${n}`);return n}async function f$(e,t){if(typeof t!="string"||t.trim().length===0)return null;let r=(await Ve(t,e,e.stateId)).trim();return r.length===0?null:r}function m$(e,t){let r=ws(e);return i$(Mg(t)?ws(t):ws(r,t))}function p$(e,t){return _$(t)?Mg(t)?ws(t):ws(e,t):null}function _$(e){return e.endsWith(".json")||e.endsWith(".md")||e.endsWith(".markdown")||e.startsWith("./")||e.startsWith("../")||e.startsWith("/")}function h$(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(!So(t)||!Array.isArray(t.sheets))throw new Error("JSON source must be an object with sheets[]");return t.sheets.map((r,n)=>g$(r,n))}function g$(e,t){if(!So(e))throw new Error(`sheets[${t}] must be an object`);let r=y$(e.headers,`sheets[${t}].headers`),n=w$(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:E$(e.styles)}}function y$(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 w$(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 E$(e){if(!So(e)||!So(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 T$(e){let t=o$.lexer(e,{gfm:!0}),r=[],n=null;for(let s of t){if(A$(s)){n=s.text;continue}R$(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 b$(e){r$(s$(e.outputPath),{recursive:!0});let t=new Set,r=e.sheets.map(n=>({sheet:I$(n.name,t),data:S$(n),columns:k$(n)}));await a$(r).toFile(e.outputPath)}function S$(e){let t=[];if(e.headers.length>0){let r=x$(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(v$));return t.length===0?[[{}]]:t}function v$(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 k$(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 I$(e,t){let r=N$(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 N$(e){let t=e.replace(/[\[\]:*?/\\]/g," ").trim();return(t.length===0?"Sheet":t).slice(0,31)}function x$(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 A$(e){return e.type==="heading"&&typeof e.text=="string"}function R$(e){let t=e;return e.type==="table"&&Array.isArray(t.header)&&Array.isArray(t.rows)}function So(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var jg,Dg=T(()=>{"use strict";qe();jg={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=>l$(e,e.state)}});import{spawnSync as L$}from"node:child_process";async function $$(e,t){let r=e.stateId,n=e.displayName,s=e.workflow.default_task_timeout_ms;for(let f of t.pre_checks??[])if(L$("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}`),G(e,r,n,"fail_pre_check");let h=t.outcomes.fail_pre_check;return h!==void 0?X(e.workflow,h):{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:
1864
+ ${a}`:null,c,l,s,t.writes_to_project_path===!0,i);if(l){let g=tg(p.text);if(g!==null){let _=q(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.finishStep(_.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=ps(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"),G(e,r,n,y.outcome),X(e.workflow,t.outcomes_from_stance[y.outcome])}let g=ps(p.text,O$);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"),G(e,r,n,g.outcome),{kind:"escalate",token:g.outcome,reason:`failure_stance:${g.outcome}`}}let _=q(e,{run_id:e.run_id,state_name:n});if(e.steps_executed+=1,e.dal.finishStep(_.id,"approve","no_reviewers"),G(e,r,n,"approve"),t.write_back_durable_memory){let S=e.membersByAlias.get(t.coder.alias);S!==void 0&&await Jt(e,n,S,t.write_back_durable_memory)}return X(e.workflow,t.outcomes.approve)}let h=await Promise.all(o.map(g=>mn(e,`${n}:reviewer_${g.alias}[${f}]`,g,`CODER OUTPUT:
1865
1865
  ${p.text}`,["approve","request_changes"],!0,s,t.writes_to_project_path===!0)));if(h.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}`),G(e,r,n,"approve"),t.write_back_durable_memory){let _=e.membersByAlias.get(t.coder.alias);_!==void 0&&await Jt(e,n,_,t.write_back_durable_memory)}return X(e.workflow,t.outcomes.approve)}if(a=h.filter(g=>g.outcome==="request_changes").map(g=>g.text).join(`
1866
1866
 
1867
- `),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}`),G(e,r,n,"max_loops_exceeded");let u=t.outcomes.max_loops_exceeded;return u!==void 0?X(e.workflow,u):{kind:"terminal",terminal:Y(e.workflow)}}var $O,Pg,Fg=T(()=>{"use strict";dd();qe();$O=["blocked","failed","aborted"],Pg={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=>OO(e,e.state)}});import{spawnSync as CO}from"node:child_process";async function MO(e,t){let r=e.stateId,n=e.displayName,s=await Ve(t.command,e,n),i=pd(e,n),o=mg(s);if(o.matched&&!i){let h=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:h.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(h.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=CO("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&&_d(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 h=c.stdout??"";e.dal.insertStepArtifact({step_id:d.id,kind:t.capture_output_to,content:h})}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}`),G(e,r,n,m),X(e.workflow,p))}var Ug,Wg=T(()=>{"use strict";qe();Ug={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=>MO(e,e.state)}});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;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=lt(i.definition),a=await DO(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)};G(e,r,n,PO(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)}:X(e.workflow,d)}async function DO(e,t){let r={};for(let[n,s]of Object.entries(t.inputs??{})){let i=await og(s,e);r[n]=i===s?await wo(s,e):i}return r}function PO(e,t,r){let n={};for(let s of r)n[s.name]=FO(e,t,s);return n}function FO(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=UO(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 UO(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 Bg,qg=T(()=>{"use strict";ls();qe();_s();Bg={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=>jO(e,e.state)}});function WO(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"),G(e,r,n,s),{kind:"terminal",terminal:s}}var Hg,Jg=T(()=>{"use strict";qe();Hg={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=>WO(e,e.state)}});async function BO(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=qO(e.cursor),a=i.filter(HO).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 qO(e){if(e===void 0)return 0;let t=Number(e);return Number.isFinite(t)?t:0}function HO(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 Xg,Gg=T(()=>{"use strict";Xg={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=>BO(e)}});async function JO(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 Vg,Kg=T(()=>{"use strict";Vg={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=>JO(e)}});function Yg(e){e.register(_g),e.register(Pg),e.register(wg),e.register(kg),e.register(Ng),e.register(Lg),e.register(jg),e.register(Ug),e.register(gg),e.register(Tg),e.register(Bg),e.register(Hg),e.register(Vg),e.register(Xg)}var zg=T(()=>{"use strict";hg();yg();Eg();Sg();Ig();xg();Og();Dg();Fg();Wg();qg();Jg();Gg();Kg()});function Zg(){return vo===null&&(vo=new gd,Yg(vo)),vo}var XO,gd,vo,Qg=T(()=>{"use strict";zg();XO={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"},gd=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:XO[t];return r?this.types.get(r):void 0}list(){return Array.from(this.types.values())}},vo=null});async function ry(e){ay(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=VO(t.definition,e.workflow),s=e.job.run_id===null?null:e.dal.getRun(e.job.run_id),i=Es(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=Vh(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(Es(n)){let m=yd({dal:e.dal,workflow:Io(n),job:e.job,project:r,run:o,membersByAlias:c,outcomes:s!==null&&o===s?e.dal.listLatestStepOutcomesByState(o.id):{},inputs:cr(e.job.payload)??{},team_id:e.team.id}),p=await sy(n,m,o.current_state??n.entry_step_id);return ty(e.dal,r.id,o.id,n.name,p),p}let d=s!==null&&o===s?e.dal.listLatestStepOutcomesByState(o.id):{},u=yd({dal:e.dal,workflow:n,job:e.job,project:r,run:o,membersByAlias:c,outcomes:d,inputs:cr(e.job.payload)??{},team_id:e.team.id}),f=await ny(u,o.current_state??n.start_at);return ty(e.dal,r.id,o.id,n.name,f),f}function ty(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 _=g.parameters;if(_.name===i&&(_.kind==="success"||_.kind==="failure"||_.kind==="neutral")){o=_.kind;break}}}let h=f.errors;if(h!==null&&typeof h=="object"){let g=h;(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 yd(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 wd(t,r,n,s?.display_name??r)}finally{t.parent_step_id=i,t.iteration=o}},runChildWorkflow:async(r,n,s)=>{ay(n);let i=Es(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=yd({dal:e.dal,workflow:Es(n)?Io(n):n,job:e.job,project:e.project,run:o,membersByAlias:e.membersByAlias,outcomes:{},inputs:s,team_id:e.team_id});return Es(n)?sy(n,a,o.current_state??n.entry_step_id):ny(a,o.current_state??n.start_at)}};return t}async function ny(e,t){let r=t;if(r.startsWith(hs))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 Xt(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=ko(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 Xt(e,l.terminal);r=l.state;continue}let o,a=oy(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"),G(e,r,r,a),a===Hn)return Xt(e,ol);let c=i.outcomes?.[a];o=c!==void 0?X(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 wd(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=ko(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 Xt(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=ko(e,Y(e.workflow));return n.kind==="terminal"?Xt(e,n.terminal):Xt(e,Y(e.workflow))}async function sy(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=oy(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"),G(t,a.id,a.name,l),l===Hn)return Xt(t,ol);let p=Object.keys(e.connections[a.id]??{}),h=e.connections[a.id]?.[l]?.[0]?.[0]?.step_id??e.connections[a.id]?.main?.[0]?.[0]?.step_id;if(h===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=h;continue}let c=await GO(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=Io(e,a);try{let p=ko(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 Xt(t,p.terminal);let h=s.get(p.state);if(h===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=h.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})}),Xt(t,"aborted")}async function GO(e,t,r){let n=iy(t,r),s=e.workflow;e.workflow=Io(t,r);try{return await wd(e,r.id,n,r.name)}finally{e.workflow=s}}function iy(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 wd(e,t,r,n){let s=Zg().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?zO(e,s):void 0,e.progress_step_id=null;try{return await s.execute(ug(e,t,r,n??t))}finally{e.emit_progress=i,e.progress_step_id=o}}function VO(e,t){try{let r=JSON.parse(e);if(YO(r)&&r.definition_schema_version===3)return It.parse(r)}catch{return t}return t}function Es(e){return e.definition_schema_version===3}function Io(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]=iy(e,i))}return t?.type==="lmctl/terminal"&&typeof t.parameters.name=="string"&&(n[t.parameters.name]={kind:KO(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 KO(e){return e==="success"||e==="failure"||e==="neutral"?e:"neutral"}function YO(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function zO(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 Xt(e,t){e.dal.setRunTerminalState(e.run_id,t);try{Hh(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 oy(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 ko(e,t){if(!ZO(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&&QO(e,t,r.on_unhandled_failure),{kind:"terminal",terminal:t}))}function ZO(e,t){return e.definition_schema_version===2&&e.terminals[t]?.kind==="failure"}function QO(e,t,r){let n=eC(e),s=r.capture_evidence&&n!==null?tC(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 eC(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 tC(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 ay(e){if(!ey.includes(e.definition_schema_version))throw new Error(`unsupported definition_schema_version ${e.definition_schema_version}; supported versions: ${ey.join(", ")}`)}var ey,ly=T(()=>{"use strict";cn();Jh();Kh();qe();Qg();Jn();ey=[1,2,3]});import{readFileSync as rC,readdirSync as nC}from"node:fs";import{basename as sC,join as iC,resolve as oC}from"node:path";function uy(e={}){let t=oC(e.workflowsDir??"workflows"),r=nC(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=>aC(iC(t,n)))}}function aC(e){let t=sC(e);try{let r=rC(e,"utf8"),n=lt(r);return py(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:_y(r)}}}function fy(e,t){try{let r=lt(t);return py(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:_y(r)}}}function my(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
+ `),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}`),G(e,r,n,"max_loops_exceeded");let u=t.outcomes.max_loops_exceeded;return u!==void 0?X(e.workflow,u):{kind:"terminal",terminal:Y(e.workflow)}}var O$,Pg,Fg=T(()=>{"use strict";dd();qe();O$=["blocked","failed","aborted"],Pg={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=>$$(e,e.state)}});import{spawnSync as C$}from"node:child_process";async function M$(e,t){let r=e.stateId,n=e.displayName,s=await Ve(t.command,e,n),i=pd(e,n),o=mg(s);if(o.matched&&!i){let h=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:h.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(h.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=C$("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&&_d(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 h=c.stdout??"";e.dal.insertStepArtifact({step_id:d.id,kind:t.capture_output_to,content:h})}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}`),G(e,r,n,m),X(e.workflow,p))}var Ug,Wg=T(()=>{"use strict";qe();Ug={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=>M$(e,e.state)}});async function j$(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=lt(i.definition),a=await D$(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)};G(e,r,n,P$(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)}:X(e.workflow,d)}async function D$(e,t){let r={};for(let[n,s]of Object.entries(t.inputs??{})){let i=await og(s,e);r[n]=i===s?await wo(s,e):i}return r}function P$(e,t,r){let n={};for(let s of r)n[s.name]=F$(e,t,s);return n}function F$(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=U$(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 U$(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 Bg,qg=T(()=>{"use strict";ls();qe();_s();Bg={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=>j$(e,e.state)}});function W$(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"),G(e,r,n,s),{kind:"terminal",terminal:s}}var Hg,Jg=T(()=>{"use strict";qe();Hg={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=>W$(e,e.state)}});async function B$(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=q$(e.cursor),a=i.filter(H$).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 q$(e){if(e===void 0)return 0;let t=Number(e);return Number.isFinite(t)?t:0}function H$(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 Xg,Gg=T(()=>{"use strict";Xg={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=>B$(e)}});async function J$(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 Vg,Kg=T(()=>{"use strict";Vg={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=>J$(e)}});function Yg(e){e.register(_g),e.register(Pg),e.register(wg),e.register(kg),e.register(Ng),e.register(Lg),e.register(jg),e.register(Ug),e.register(gg),e.register(Tg),e.register(Bg),e.register(Hg),e.register(Vg),e.register(Xg)}var zg=T(()=>{"use strict";hg();yg();Eg();Sg();Ig();xg();$g();Dg();Fg();Wg();qg();Jg();Gg();Kg()});function Zg(){return vo===null&&(vo=new gd,Yg(vo)),vo}var X$,gd,vo,Qg=T(()=>{"use strict";zg();X$={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"},gd=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:X$[t];return r?this.types.get(r):void 0}list(){return Array.from(this.types.values())}},vo=null});async function ry(e){ay(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=V$(t.definition,e.workflow),s=e.job.run_id===null?null:e.dal.getRun(e.job.run_id),i=Es(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=Vh(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(Es(n)){let m=yd({dal:e.dal,workflow:Io(n),job:e.job,project:r,run:o,membersByAlias:c,outcomes:s!==null&&o===s?e.dal.listLatestStepOutcomesByState(o.id):{},inputs:cr(e.job.payload)??{},team_id:e.team.id}),p=await sy(n,m,o.current_state??n.entry_step_id);return ty(e.dal,r.id,o.id,n.name,p),p}let d=s!==null&&o===s?e.dal.listLatestStepOutcomesByState(o.id):{},u=yd({dal:e.dal,workflow:n,job:e.job,project:r,run:o,membersByAlias:c,outcomes:d,inputs:cr(e.job.payload)??{},team_id:e.team.id}),f=await ny(u,o.current_state??n.start_at);return ty(e.dal,r.id,o.id,n.name,f),f}function ty(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 _=g.parameters;if(_.name===i&&(_.kind==="success"||_.kind==="failure"||_.kind==="neutral")){o=_.kind;break}}}let h=f.errors;if(h!==null&&typeof h=="object"){let g=h;(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 yd(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 wd(t,r,n,s?.display_name??r)}finally{t.parent_step_id=i,t.iteration=o}},runChildWorkflow:async(r,n,s)=>{ay(n);let i=Es(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=yd({dal:e.dal,workflow:Es(n)?Io(n):n,job:e.job,project:e.project,run:o,membersByAlias:e.membersByAlias,outcomes:{},inputs:s,team_id:e.team_id});return Es(n)?sy(n,a,o.current_state??n.entry_step_id):ny(a,o.current_state??n.start_at)}};return t}async function ny(e,t){let r=t;if(r.startsWith(hs))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 Xt(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=ko(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 Xt(e,l.terminal);r=l.state;continue}let o,a=oy(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"),G(e,r,r,a),a===Hn)return Xt(e,ol);let c=i.outcomes?.[a];o=c!==void 0?X(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 wd(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=ko(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 Xt(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=ko(e,Y(e.workflow));return n.kind==="terminal"?Xt(e,n.terminal):Xt(e,Y(e.workflow))}async function sy(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=oy(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"),G(t,a.id,a.name,l),l===Hn)return Xt(t,ol);let p=Object.keys(e.connections[a.id]??{}),h=e.connections[a.id]?.[l]?.[0]?.[0]?.step_id??e.connections[a.id]?.main?.[0]?.[0]?.step_id;if(h===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=h;continue}let c=await G$(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=Io(e,a);try{let p=ko(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 Xt(t,p.terminal);let h=s.get(p.state);if(h===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=h.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})}),Xt(t,"aborted")}async function G$(e,t,r){let n=iy(t,r),s=e.workflow;e.workflow=Io(t,r);try{return await wd(e,r.id,n,r.name)}finally{e.workflow=s}}function iy(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 wd(e,t,r,n){let s=Zg().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?z$(e,s):void 0,e.progress_step_id=null;try{return await s.execute(ug(e,t,r,n??t))}finally{e.emit_progress=i,e.progress_step_id=o}}function V$(e,t){try{let r=JSON.parse(e);if(Y$(r)&&r.definition_schema_version===3)return It.parse(r)}catch{return t}return t}function Es(e){return e.definition_schema_version===3}function Io(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]=iy(e,i))}return t?.type==="lmctl/terminal"&&typeof t.parameters.name=="string"&&(n[t.parameters.name]={kind:K$(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 K$(e){return e==="success"||e==="failure"||e==="neutral"?e:"neutral"}function Y$(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function z$(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 Xt(e,t){e.dal.setRunTerminalState(e.run_id,t);try{Hh(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 oy(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 ko(e,t){if(!Z$(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&&Q$(e,t,r.on_unhandled_failure),{kind:"terminal",terminal:t}))}function Z$(e,t){return e.definition_schema_version===2&&e.terminals[t]?.kind==="failure"}function Q$(e,t,r){let n=eC(e),s=r.capture_evidence&&n!==null?tC(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 eC(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 tC(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 ay(e){if(!ey.includes(e.definition_schema_version))throw new Error(`unsupported definition_schema_version ${e.definition_schema_version}; supported versions: ${ey.join(", ")}`)}var ey,ly=T(()=>{"use strict";cn();Jh();Kh();qe();Qg();Jn();ey=[1,2,3]});import{readFileSync as rC,readdirSync as nC}from"node:fs";import{basename as sC,join as iC,resolve as oC}from"node:path";function uy(e={}){let t=oC(e.workflowsDir??"workflows"),r=nC(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=>aC(iC(t,n)))}}function aC(e){let t=sC(e);try{let r=rC(e,"utf8"),n=lt(r);return py(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:_y(r)}}}function fy(e,t){try{let r=lt(t);return py(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:_y(r)}}}function my(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(`
1868
1868
  `)}
1869
1869
  `}function py(e,t){let r=cC(t),n=dC(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=lC(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 lC(e){return(e??[]).filter(t=>t.required===!0&&t.default===void 0).map(t=>t.name)}function cC(e){return Ed(e)?e.entry_step_id:e.start_at}function dC(e){return Ed(e)?e.steps.find(t=>t.id===e.entry_step_id)?.type??null:e.states[e.start_at]?.type??null}function Ed(e){return e.definition_schema_version===3}function _y(e){return e instanceof Ht?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 hy(e){let t=new Set;if(Ed(e))for(let r of e.steps){let n=r.members??{};cy(n,t)}else for(let r of Object.values(e.states))cy(r,t);return[...t].sort()}function cy(e,t){let r=["coder","agent","consolidator"],n=["reviewers","researchers"];for(let s of r){let i=e[s],o=dy(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=dy(o);a!==null&&t.add(a)}}}function dy(e){if(e===null||typeof e!="object")return null;let t=e.alias;return typeof t=="string"&&t.length>0?t:null}var No=T(()=>{"use strict";ls()});function uC({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,xo)[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}=fC(e,r,o);if(a<20)continue;let c=o??"initial",d=`${Ts}:${r.id}:${c}`;e.enqueueJob({project_id:r.id,source:xo,source_ref:Ts,payload:JSON.stringify({kind:Ts,project_id:r.id,completed_sessions:a,max_run_id:l,since_run_id:o}),dedupe_key:d})}}function fC(e,t,r){let n=e.query(`SELECT COUNT(*) AS cnt, MAX(r.id) AS max_id
1870
1870
  FROM run r
1871
1871
  JOIN job j ON j.id = r.job_id
1872
1872
  WHERE j.project_id = ?
1873
1873
  AND r.terminal_state IS NOT NULL
1874
- ${r!==null?"AND r.id > ?":""}`,...r!==null?[t.id,r]:[t.id]);return{count:n[0]?.cnt??0,maxRunId:n[0]?.max_id??0}}function gy(e){for(let t of mC)try{t(e)}catch{}}var xo,Ts,mC,Td=T(()=>{"use strict";xo="memory_policy",Ts="memory_consolidation_request";mC=[uC]});var Sy={};we(Sy,{getOrInsertConsolidationWorkflow:()=>wy,runJobById:()=>yC,runOnce:()=>Mr,startWorker:()=>wC});import{createHash as pC}from"node:crypto";import{readFileSync as _C}from"node:fs";import{pathToFileURL as hC}from"node:url";function wy(e,t="durable-memory-consolidation-v2"){let r=e.getWorkflowByName(t);if(r!==null)return r;try{qh({swallow:!0});let n=go(t);if(n===null)return null;let s=_C(n,"utf8"),i=lt(s);return e.insertWorkflow({name:t,version:i.version,definition_schema_version:i.definition_schema_version,definition:s,source_uri:hC(n).href,source_sha256:pC("sha256").update(s).digest("hex")})}catch{return null}}async function Mr(e){let t=Date.now(),r=null;try{return r=e.dal.claimNextJobWithConcurrency({worker_id:e.worker_id,lease_ms:e.lease_ms??yy,evaluator:n=>Ty(e.dal,n)}),r===null?null:await Ey(e.dal,r,t)}catch(n){if(r!==null)return fr(e.dal,r,"worker_run_failed",Cr(n),t);try{e.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:Ao(Cr(n))})})}catch{}return null}finally{e.max_concurrent}}async function yC(e){let t=Date.now(),r=null;try{let n=e.dal.claimJobByIdWithConcurrency({job_id:e.job_id,worker_id:e.worker_id,lease_ms:e.lease_ms??yy,evaluator:s=>Ty(e.dal,s)});return n.claimed?(r=n.job,{claimed:!0,...await Ey(e.dal,r,t)}):n}catch(n){if(r!==null)return{claimed:!0,...fr(e.dal,r,"worker_run_failed",Cr(n),t)};try{e.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:Ao(Cr(n)),job_id:e.job_id})})}catch{}return{claimed:!1,reason:"not_claimable",job_id:e.job_id}}finally{e.max_concurrent}}async function Ey(e,t,r){let n=e.getProjectByJob(t.id);if(n===null)return fr(e,t,"worker_project_missing","project_not_found",r);let s=t.source===xo&&t.source_ref===Ts,i=t.run_id===null?null:e.getRun(t.run_id),o;if(i!==null?o=e.getWorkflow(i.workflow_id):s?o=wy(e):o=by(e,t,n),o===null)return fr(e,t,"worker_workflow_missing","workflow_not_found",r,n);let a=e.getTeam(i?.team_id??n.team_id),l=a===null?[]:e.listTeamMembers(a.id);if(a===null||l.length===0)return fr(e,t,"worker_team_missing","team_not_found",r,n);let c;try{c=lt(o.definition)}catch(u){return fr(e,t,"worker_workflow_invalid",Cr(u),r,n)}let d=EC(c,l);if(d.length>0)return fr(e,t,"worker_team_missing_aliases",`missing_aliases:${d.join(",")}`,r,n,a);try{let u=await ry({dal:e,job:t,workflow:c,team:a,members:l,workflowRow:o});return e.setJobRun(t.id,u.run_id),u.paused===!0?{job_id:t.id,run_id:u.run_id,status:"paused",terminal_state:null,ms:Date.now()-r}:(e.releaseJob(t.id,"done",null),{job_id:t.id,run_id:u.run_id,status:"done",terminal_state:u.terminal_state,ms:Date.now()-r})}catch(u){return fr(e,t,"worker_run_failed",Cr(u),r,n,a)}}function Ty(e,t){let r=e.getProjectByJob(t.id);if(r===null)return{concurrency_key:t.concurrency_key_resolved,concurrent_limit:1};let n=by(e,t,r);if(n===null)return{concurrency_key:t.concurrency_key_resolved,concurrent_limit:1};let s=null;try{s=lt(n.definition)}catch{s=null}return so({workflow:s,job:t,project:r})}function by(e,t,r){return t.workflow_id_override!==null?e.getWorkflow(t.workflow_id_override):e.getWorkflowByName(r.workflow_name)}async function wC(e){let t=!1,r=null,n=Promise.resolve(),s=async()=>{if(!t){try{let i;do i=await Mr(e);while(!t&&i!==null)}catch(i){try{e.dal.raiseAttention({kind:"worker_loop_error",severity:"error",payload:JSON.stringify({error:Ao(Cr(i))})})}catch{}}t||(r=setTimeout(()=>{n=s()},e.poll_interval_ms??gC))}};return n=s(),{stop:async()=>{t=!0,r!==null&&clearTimeout(r),await n.catch(()=>{})}}}function fr(e,t,r,n,s,i,o){let a=Ao(n);return e.releaseJob(t.id,"failed",a),e.raiseAttention({kind:r,severity:"error",project_id:i?.id??t.project_id,payload:JSON.stringify({job_id:t.id,team_id:o?.id??null,error:a})}),{job_id:t.id,run_id:null,status:"failed",terminal_state:null,ms:Date.now()-s}}function Cr(e){return e instanceof Error?e.message:String(e)}function Ao(e){return e.length>4096?e.slice(0,4096):e}function EC(e,t){let r=hy(e);if(r.length===0)return[];let n=new Set(t.map(s=>s.alias));return r.filter(s=>!n.has(s))}var yy,gC,Ro=T(()=>{"use strict";id();ly();ls();No();Uc();Td();yy=6e5,gC=5e3});import{existsSync as TC,readFileSync as bC}from"node:fs";import{marked as SC}from"marked";function Ny(e,t){e.get("/layman",r=>r.html(Re("Layman Home",vC(t.dal)))),e.get("/api/layman",r=>r.json(Ly(t.dal))),e.get("/layman/start/:workflow",r=>{let n=Iy(r);return n===null?r.notFound():r.html(Re(`Start ${hn(n)}`,NC(t.dal,n)))}),e.post("/layman/start/:workflow",async r=>{let n=Iy(r);return n===null?r.notFound():n==="newspaper"?vy(r,t.dal):xC(r,t.dal,n)}),e.get("/layman/run/:id",r=>{let n=Ar(t.dal,Lo(r,"id"));return n===null?r.notFound():r.html(Re(`Run ${n.id}`,LC(t.dal,n)))}),e.get("/api/layman/run/:id",r=>{let n=Ar(t.dal,Lo(r,"id"));return n===null?r.notFound():r.json(BC(t.dal,n))}),e.post("/layman/run/:id/respond",async r=>OC(r,t.dal)),e.get("/layman/newspaper",r=>r.html(Re("Newspaper Subscriptions",UC(t.dal)))),e.post("/layman/newspaper",r=>vy(r,t.dal)),e.delete("/layman/newspaper/:id",r=>ky(r,t.dal)),e.post("/layman/newspaper/:id/delete",r=>ky(r,t.dal))}function vC(e){let t=Ly(e);return`<section class="layman-home">
1874
+ ${r!==null?"AND r.id > ?":""}`,...r!==null?[t.id,r]:[t.id]);return{count:n[0]?.cnt??0,maxRunId:n[0]?.max_id??0}}function gy(e){for(let t of mC)try{t(e)}catch{}}var xo,Ts,mC,Td=T(()=>{"use strict";xo="memory_policy",Ts="memory_consolidation_request";mC=[uC]});var Sy={};we(Sy,{getOrInsertConsolidationWorkflow:()=>wy,runJobById:()=>yC,runOnce:()=>Mr,startWorker:()=>wC});import{createHash as pC}from"node:crypto";import{readFileSync as _C}from"node:fs";import{pathToFileURL as hC}from"node:url";function wy(e,t="durable-memory-consolidation-v2"){let r=e.getWorkflowByName(t);if(r!==null)return r;try{qh({swallow:!0});let n=go(t);if(n===null)return null;let s=_C(n,"utf8"),i=lt(s);return e.insertWorkflow({name:t,version:i.version,definition_schema_version:i.definition_schema_version,definition:s,source_uri:hC(n).href,source_sha256:pC("sha256").update(s).digest("hex")})}catch{return null}}async function Mr(e){let t=Date.now(),r=null;try{return r=e.dal.claimNextJobWithConcurrency({worker_id:e.worker_id,lease_ms:e.lease_ms??yy,evaluator:n=>Ty(e.dal,n)}),r===null?null:await Ey(e.dal,r,t)}catch(n){if(r!==null)return fr(e.dal,r,"worker_run_failed",Cr(n),t);try{e.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:Ao(Cr(n))})})}catch{}return null}finally{e.max_concurrent}}async function yC(e){let t=Date.now(),r=null;try{let n=e.dal.claimJobByIdWithConcurrency({job_id:e.job_id,worker_id:e.worker_id,lease_ms:e.lease_ms??yy,evaluator:s=>Ty(e.dal,s)});return n.claimed?(r=n.job,{claimed:!0,...await Ey(e.dal,r,t)}):n}catch(n){if(r!==null)return{claimed:!0,...fr(e.dal,r,"worker_run_failed",Cr(n),t)};try{e.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:Ao(Cr(n)),job_id:e.job_id})})}catch{}return{claimed:!1,reason:"not_claimable",job_id:e.job_id}}finally{e.max_concurrent}}async function Ey(e,t,r){let n=e.getProjectByJob(t.id);if(n===null)return fr(e,t,"worker_project_missing","project_not_found",r);let s=t.source===xo&&t.source_ref===Ts,i=t.run_id===null?null:e.getRun(t.run_id),o;if(i!==null?o=e.getWorkflow(i.workflow_id):s?o=wy(e):o=by(e,t,n),o===null)return fr(e,t,"worker_workflow_missing","workflow_not_found",r,n);let a=e.getTeam(i?.team_id??n.team_id),l=a===null?[]:e.listTeamMembers(a.id);if(a===null||l.length===0)return fr(e,t,"worker_team_missing","team_not_found",r,n);let c;try{c=lt(o.definition)}catch(u){return fr(e,t,"worker_workflow_invalid",Cr(u),r,n)}let d=EC(c,l);if(d.length>0)return fr(e,t,"worker_team_missing_aliases",`missing_aliases:${d.join(",")}`,r,n,a);try{let u=await ry({dal:e,job:t,workflow:c,team:a,members:l,workflowRow:o});return e.setJobRun(t.id,u.run_id),u.paused===!0?{job_id:t.id,run_id:u.run_id,status:"paused",terminal_state:null,ms:Date.now()-r}:(e.releaseJob(t.id,"done",null),{job_id:t.id,run_id:u.run_id,status:"done",terminal_state:u.terminal_state,ms:Date.now()-r})}catch(u){return fr(e,t,"worker_run_failed",Cr(u),r,n,a)}}function Ty(e,t){let r=e.getProjectByJob(t.id);if(r===null)return{concurrency_key:t.concurrency_key_resolved,concurrent_limit:1};let n=by(e,t,r);if(n===null)return{concurrency_key:t.concurrency_key_resolved,concurrent_limit:1};let s=null;try{s=lt(n.definition)}catch{s=null}return so({workflow:s,job:t,project:r})}function by(e,t,r){return t.workflow_id_override!==null?e.getWorkflow(t.workflow_id_override):e.getWorkflowByName(r.workflow_name)}async function wC(e){let t=!1,r=null,n=Promise.resolve(),s=async()=>{if(!t){try{let i;do i=await Mr(e);while(!t&&i!==null)}catch(i){try{e.dal.raiseAttention({kind:"worker_loop_error",severity:"error",payload:JSON.stringify({error:Ao(Cr(i))})})}catch{}}t||(r=setTimeout(()=>{n=s()},e.poll_interval_ms??gC))}};return n=s(),{stop:async()=>{t=!0,r!==null&&clearTimeout(r),await n.catch(()=>{})}}}function fr(e,t,r,n,s,i,o){let a=Ao(n);return e.releaseJob(t.id,"failed",a),e.raiseAttention({kind:r,severity:"error",project_id:i?.id??t.project_id,payload:JSON.stringify({job_id:t.id,team_id:o?.id??null,error:a})}),{job_id:t.id,run_id:null,status:"failed",terminal_state:null,ms:Date.now()-s}}function Cr(e){return e instanceof Error?e.message:String(e)}function Ao(e){return e.length>4096?e.slice(0,4096):e}function EC(e,t){let r=hy(e);if(r.length===0)return[];let n=new Set(t.map(s=>s.alias));return r.filter(s=>!n.has(s))}var yy,gC,Ro=T(()=>{"use strict";id();ly();ls();No();Uc();Td();yy=6e5,gC=5e3});import{existsSync as TC,readFileSync as bC}from"node:fs";import{marked as SC}from"marked";function Ny(e,t){e.get("/layman",r=>r.html(Re("Layman Home",vC(t.dal)))),e.get("/api/layman",r=>r.json(Ly(t.dal))),e.get("/layman/start/:workflow",r=>{let n=Iy(r);return n===null?r.notFound():r.html(Re(`Start ${hn(n)}`,NC(t.dal,n)))}),e.post("/layman/start/:workflow",async r=>{let n=Iy(r);return n===null?r.notFound():n==="newspaper"?vy(r,t.dal):xC(r,t.dal,n)}),e.get("/layman/run/:id",r=>{let n=Ar(t.dal,Lo(r,"id"));return n===null?r.notFound():r.html(Re(`Run ${n.id}`,LC(t.dal,n)))}),e.get("/api/layman/run/:id",r=>{let n=Ar(t.dal,Lo(r,"id"));return n===null?r.notFound():r.json(BC(t.dal,n))}),e.post("/layman/run/:id/respond",async r=>$C(r,t.dal)),e.get("/layman/newspaper",r=>r.html(Re("Newspaper Subscriptions",UC(t.dal)))),e.post("/layman/newspaper",r=>vy(r,t.dal)),e.delete("/layman/newspaper/:id",r=>ky(r,t.dal)),e.post("/layman/newspaper/:id/delete",r=>ky(r,t.dal))}function vC(e){let t=Ly(e);return`<section class="layman-home">
1875
1875
  <h1>Welcome</h1>
1876
1876
  <p class="muted">Choose a workflow and answer a few plain-language prompts.</p>
1877
- <div class="grid">${$o.map(kC).join("")}</div>
1877
+ <div class="grid">${Oo.map(kC).join("")}</div>
1878
1878
  <h2>Recent Activity</h2>
1879
1879
  ${IC(t.recent_runs)}
1880
1880
  <section class="metric">
@@ -1900,11 +1900,11 @@ ${p.text}`,["approve","request_changes"],!0,s,t.writes_to_project_path===!0)));i
1900
1900
  <label>Output directory<input name="output_dir" value="drafts"></label>
1901
1901
  <button type="submit">Start Document Wizard</button>
1902
1902
  </form>`:Ry(n,"/layman/start/newspaper")}function xy(e){return`<label>Project<select name="project_id" required>${e.map(t=>`<option value="${b(t.id)}">${b(t.name)}</option>`).join("")}</select></label>`}async function xC(e,t,r){let n=await e.req.parseBody(),s=Cy(t,n);if(s===null)return e.html(Re("Start workflow",'<p class="error">Choose a valid project.</p>'),400);let i=t.getWorkflowByName(r);if(i===null)return e.html(Re("Start workflow",`<p class="error">${b(hn(r))} is not loaded.</p>`),400);let o=r==="info-qa"?AC(n):RC(n);if(typeof o=="string")return e.html(Re("Start workflow",`<p class="error">${b(o)}</p>`),400);let a=t.enqueueJob({project_id:s.id,workflow_id_override:i.id,source:"layman",source_ref:r,dedupe_key:`layman:${r}:${Date.now()}:${Math.random()}`,payload:JSON.stringify(o)}),l=await Mr({dal:t,worker_id:`layman-start-${Date.now()}`}),c=t.getJob(a.id),d=l?.job_id===a.id?l.run_id:c?.run_id??null;return d===null?e.redirect("/layman?queued=1",302):e.redirect(`/layman/run/${d}`,302)}function AC(e){let t=Ke(e.question).trim();if(t.length===0)return"Enter a question.";let r=Ke(e.output_path).trim();return{question:t,...r.length>0?{output_path:r}:{}}}function RC(e){let t=Ke(e.task_description).trim(),r=KC(Ke(e.slug).trim()),n=Ke(e.output_dir).trim()||"drafts";return t.length===0?"Describe the document you want.":r.length===0?"Enter a document slug.":{task_description:t,slug:r,output_dir:n}}function LC(e,t){let r=t.workflow?.name??"unknown",n=`<h1>${b(hn(r))}</h1>
1903
- <p><a href="/layman">Layman home</a></p>`;if(t.terminal_state!==null)return`${n}${MC(e,t,r)}`;let s=Oy(e,t);return s!==null&&s.status==="waiting_operator"?`${n}${$C(t,s)}`:`${n}<section hx-get="/layman/run/${b(t.id)}" hx-trigger="every 2s" hx-swap="outerHTML">
1903
+ <p><a href="/layman">Layman home</a></p>`;if(t.terminal_state!==null)return`${n}${MC(e,t,r)}`;let s=$y(e,t);return s!==null&&s.status==="waiting_operator"?`${n}${OC(t,s)}`:`${n}<section hx-get="/layman/run/${b(t.id)}" hx-trigger="every 2s" hx-swap="outerHTML">
1904
1904
  <h2>Running</h2>
1905
1905
  <p class="muted">Current stage: <strong>${b(t.current_state??"starting")}</strong></p>
1906
1906
  ${Ay(t)}
1907
- </section>`}function Ay(e){let t=e.steps.map(r=>[b(r.id),b(`\u25B6 ${r.state_name}`),b(r.outcome??"running"),b(r.status_detail??"")]);return me(["step","stage","outcome","detail"],t)}function $C(e,t){return`<section class="metric paused-interactive">
1907
+ </section>`}function Ay(e){let t=e.steps.map(r=>[b(r.id),b(`\u25B6 ${r.state_name}`),b(r.outcome??"running"),b(r.status_detail??"")]);return me(["step","stage","outcome","detail"],t)}function OC(e,t){return`<section class="metric paused-interactive">
1908
1908
  <h2>${b(JC(t.state_name))}</h2>
1909
1909
  <p class="muted">The agent is waiting for your response.</p>
1910
1910
  <h3>Agent output</h3>
@@ -1915,7 +1915,7 @@ ${p.text}`,["approve","request_changes"],!0,s,t.writes_to_project_path===!0)));i
1915
1915
  <button type="submit" name="done" value="false">Send response</button>
1916
1916
  <button type="submit" name="done" value="true">Done with this stage</button>
1917
1917
  </form>
1918
- </section>`}async function OC(e,t){let r=Lo(e,"id"),n=await e.req.parseBody(),s=Number(Ke(n.step_id)),i=Ke(n.input),o=Ke(n.done)==="true";if(!Number.isInteger(s))return e.html(Re("Interactive response",'<p class="error">Missing interactive step.</p>'),400);let a=t.resumeInteractive(s,i,o);return a.resumed?(CC(t,a.run.id),await Mr({dal:t,worker_id:`layman-respond-${Date.now()}`}),e.redirect(`/layman/run/${r}`,302)):e.html(Re("Interactive response",`<p class="error">Could not submit response: ${b(a.reason)}</p>`),400)}function CC(e,t){let r=e.getRun(t);if(r===null||r.current_state===null)return;let n=e.getWorkflow(r.workflow_id);if(n!==null)try{let s=JSON.parse(n.definition);if(!Sd(s)||s.definition_schema_version!==3||!Array.isArray(s.steps))return;let i=s.steps.find(o=>Sd(o)&&o.name===r.current_state&&typeof o.id=="string");Sd(i)&&typeof i.id=="string"&&e.setRunCurrentState(r.id,i.id)}catch{return}}function MC(e,t,r){let n=XC(t.terminal_state);return`<section class="metric terminal-run">
1918
+ </section>`}async function $C(e,t){let r=Lo(e,"id"),n=await e.req.parseBody(),s=Number(Ke(n.step_id)),i=Ke(n.input),o=Ke(n.done)==="true";if(!Number.isInteger(s))return e.html(Re("Interactive response",'<p class="error">Missing interactive step.</p>'),400);let a=t.resumeInteractive(s,i,o);return a.resumed?(CC(t,a.run.id),await Mr({dal:t,worker_id:`layman-respond-${Date.now()}`}),e.redirect(`/layman/run/${r}`,302)):e.html(Re("Interactive response",`<p class="error">Could not submit response: ${b(a.reason)}</p>`),400)}function CC(e,t){let r=e.getRun(t);if(r===null||r.current_state===null)return;let n=e.getWorkflow(r.workflow_id);if(n!==null)try{let s=JSON.parse(n.definition);if(!Sd(s)||s.definition_schema_version!==3||!Array.isArray(s.steps))return;let i=s.steps.find(o=>Sd(o)&&o.name===r.current_state&&typeof o.id=="string");Sd(i)&&typeof i.id=="string"&&e.setRunCurrentState(r.id,i.id)}catch{return}}function MC(e,t,r){let n=XC(t.terminal_state);return`<section class="metric terminal-run">
1919
1919
  <h2>${n?"Complete":"Stopped"}</h2>
1920
1920
  <p>Status: <strong>${b(t.terminal_state)}</strong></p>
1921
1921
  ${n?jC(e,t,r):PC(t)}
@@ -1925,7 +1925,7 @@ ${p.text}`,["approve","request_changes"],!0,s,t.writes_to_project_path===!0)));i
1925
1925
  <pre>${b(VC(GC(i??"No preview available."),30))}</pre>
1926
1926
  <h3>Downloads</h3>
1927
1927
  ${o.length>0?`<ul>${o}</ul>`:'<p class="muted">No rendered files found yet.</p>'}`}function PC(e){let t=[...e.steps].reverse().find(r=>r.status_detail!==null);return`<p class="error">${b(t?.status_detail??"The workflow did not complete successfully.")}</p>`}function kd(e,t){for(let r of[...e.steps].reverse())for(let n of t){let s=[...r.artifacts].reverse().find(i=>i.kind===n&&i.content!==null);if(s?.content!==null&&s?.content!==void 0)return s.content}return null}function bd(e,t){for(let r of[...e].reverse())if(t.includes(r.kind)&&r.path!==null)return r.path;return null}function FC(e){if(e===null||!TC(e)||!e.endsWith(".md"))return null;try{return bC(e,"utf8")}catch{return null}}function UC(e){let t=e.listProjects();return`<h1>Newspaper Subscriptions</h1>
1928
- ${WC($y(e))}
1928
+ ${WC(Oy(e))}
1929
1929
  <h2>Add Subscription</h2>
1930
1930
  ${t.length===0?'<p class="error">Create a project before subscribing.</p>':Ry(t,"/layman/newspaper")}`}function Ry(e,t){return`<form method="post" action="${b(t)}">
1931
1931
  ${xy(e)}
@@ -1938,19 +1938,19 @@ ${p.text}`,["approve","request_changes"],!0,s,t.writes_to_project_path===!0)));i
1938
1938
  <label>Custom cron<input name="cron" placeholder="0 6 * * *"></label>
1939
1939
  <label>Output directory<input name="output_dir" value="digests"></label>
1940
1940
  <button type="submit">Create subscription</button>
1941
- </form>`}async function vy(e,t){let r=await e.req.parseBody(),n=Cy(t,r);if(n===null)return e.html(Re("Newspaper",'<p class="error">Choose a valid project.</p>'),400);let s=t.getWorkflowByName("newspaper");if(s===null)return e.html(Re("Newspaper",'<p class="error">The newspaper workflow is not loaded.</p>'),400);let i=Ke(r.topics).split(/[\n,]/).map(a=>a.trim()).filter(a=>a.length>0);if(i.length===0)return e.html(Re("Newspaper",'<p class="error">Enter at least one topic.</p>'),400);let o={topics:i,output_dir:Ke(r.output_dir).trim()||"digests",schedule:HC(r)};return t.insertProjectWorkflow({project_id:n.id,workflow_id:s.id,condition:null,parameters_override:JSON.stringify(o),priority:100,enabled:!0}),e.redirect("/layman/newspaper?created=1",302)}function ky(e,t){let r=Lo(e,"id");return t.removeProjectWorkflow(r)?e.redirect("/layman/newspaper?removed=1",302):e.notFound()}function WC(e){return me(["id","project","topics","status","action"],e.map(t=>{let r=YC(t.parameters_override),n=Array.isArray(r.topics)?r.topics.join(", "):"";return[b(t.id),b(t.project_name),b(n),t.enabled===1?"enabled":"disabled",`<form method="post" action="/layman/newspaper/${t.id}/delete"><button type="submit">Remove</button></form>`]}))}function Ly(e){let t=$y(e);return{workflows:$o,recent_runs:qC(e),newspaper_subscriptions:t.length}}function BC(e,t){let r=Oy(e,t);return{id:t.id,workflow:t.workflow?.name??null,current_state:t.current_state,terminal_state:t.terminal_state,paused_interactive:r?.status==="waiting_operator"?{step_id:r.step_id,state_name:r.state_name,last_agent_output:r.last_agent_output}:null,steps:t.steps.map(n=>({id:n.id,state_name:n.state_name,outcome:n.outcome,status_detail:n.status_detail}))}}function qC(e){return e.query(`SELECT r.*, w.name AS workflow_name
1941
+ </form>`}async function vy(e,t){let r=await e.req.parseBody(),n=Cy(t,r);if(n===null)return e.html(Re("Newspaper",'<p class="error">Choose a valid project.</p>'),400);let s=t.getWorkflowByName("newspaper");if(s===null)return e.html(Re("Newspaper",'<p class="error">The newspaper workflow is not loaded.</p>'),400);let i=Ke(r.topics).split(/[\n,]/).map(a=>a.trim()).filter(a=>a.length>0);if(i.length===0)return e.html(Re("Newspaper",'<p class="error">Enter at least one topic.</p>'),400);let o={topics:i,output_dir:Ke(r.output_dir).trim()||"digests",schedule:HC(r)};return t.insertProjectWorkflow({project_id:n.id,workflow_id:s.id,condition:null,parameters_override:JSON.stringify(o),priority:100,enabled:!0}),e.redirect("/layman/newspaper?created=1",302)}function ky(e,t){let r=Lo(e,"id");return t.removeProjectWorkflow(r)?e.redirect("/layman/newspaper?removed=1",302):e.notFound()}function WC(e){return me(["id","project","topics","status","action"],e.map(t=>{let r=YC(t.parameters_override),n=Array.isArray(r.topics)?r.topics.join(", "):"";return[b(t.id),b(t.project_name),b(n),t.enabled===1?"enabled":"disabled",`<form method="post" action="/layman/newspaper/${t.id}/delete"><button type="submit">Remove</button></form>`]}))}function Ly(e){let t=Oy(e);return{workflows:Oo,recent_runs:qC(e),newspaper_subscriptions:t.length}}function BC(e,t){let r=$y(e,t);return{id:t.id,workflow:t.workflow?.name??null,current_state:t.current_state,terminal_state:t.terminal_state,paused_interactive:r?.status==="waiting_operator"?{step_id:r.step_id,state_name:r.state_name,last_agent_output:r.last_agent_output}:null,steps:t.steps.map(n=>({id:n.id,state_name:n.state_name,outcome:n.outcome,status_detail:n.status_detail}))}}function qC(e){return e.query(`SELECT r.*, w.name AS workflow_name
1942
1942
  FROM run r
1943
1943
  JOIN workflow w ON w.id = r.workflow_id
1944
1944
  WHERE w.name IN (${vd.map(()=>"?").join(",")})
1945
1945
  ORDER BY r.id DESC
1946
- LIMIT 10`,...vd)}function $y(e){return e.query(`SELECT pw.*, p.name AS project_name
1946
+ LIMIT 10`,...vd)}function Oy(e){return e.query(`SELECT pw.*, p.name AS project_name
1947
1947
  FROM project_workflow pw
1948
1948
  JOIN workflow w ON w.id = pw.workflow_id
1949
1949
  JOIN project p ON p.id = pw.project_id
1950
1950
  WHERE w.name = ?
1951
- ORDER BY pw.id DESC`,"newspaper")}function Oy(e,t){for(let r of[...t.steps].reverse()){let n=e.getInteractiveSessionByStepId(r.id);if(n!==null)return n}return null}function Cy(e,t){let r=Number(Ke(t.project_id));return Number.isInteger(r)?e.getProject(r):null}function HC(e){let t=Ke(e.schedule)||"daily";return t==="weekly"?{preset:t,cron:"0 6 * * 1"}:t==="custom"?{preset:t,cron:Ke(e.cron).trim()||"0 6 * * *"}:{preset:"daily",cron:"0 6 * * *"}}function Iy(e){let t=e.req.param("workflow");return vd.includes(t)?t:null}function hn(e){return $o.find(t=>t.name===e)?.title??e}function JC(e){return e.split(/[_:-]/).filter(Boolean).map(t=>`${t[0]?.toUpperCase()??""}${t.slice(1)}`).join(" ")}function Id(e){return SC.parse(e,{async:!1})}function XC(e){return e==="done"||e==="pr_ready"||e==="merged"}function GC(e){return e.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}function VC(e,t){return e.split(`
1951
+ ORDER BY pw.id DESC`,"newspaper")}function $y(e,t){for(let r of[...t.steps].reverse()){let n=e.getInteractiveSessionByStepId(r.id);if(n!==null)return n}return null}function Cy(e,t){let r=Number(Ke(t.project_id));return Number.isInteger(r)?e.getProject(r):null}function HC(e){let t=Ke(e.schedule)||"daily";return t==="weekly"?{preset:t,cron:"0 6 * * 1"}:t==="custom"?{preset:t,cron:Ke(e.cron).trim()||"0 6 * * *"}:{preset:"daily",cron:"0 6 * * *"}}function Iy(e){let t=e.req.param("workflow");return vd.includes(t)?t:null}function hn(e){return Oo.find(t=>t.name===e)?.title??e}function JC(e){return e.split(/[_:-]/).filter(Boolean).map(t=>`${t[0]?.toUpperCase()??""}${t.slice(1)}`).join(" ")}function Id(e){return SC.parse(e,{async:!1})}function XC(e){return e==="done"||e==="pr_ready"||e==="merged"}function GC(e){return e.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}function VC(e,t){return e.split(`
1952
1952
  `).slice(0,t).join(`
1953
- `)}function KC(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function Ke(e){return typeof e=="string"?e:""}function YC(e){if(e===null)return{};try{let t=JSON.parse(e);if(t!==null&&typeof t=="object"&&!Array.isArray(t))return t}catch{return{}}return{}}function Sd(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Lo(e,t){return Number(e.req.param(t))}var $o,vd,My=T(()=>{"use strict";Ro();Bt();ed();$o=[{name:"info-qa",title:"Ask a Question",description:"Get a grounded answer from multiple researchers and one consolidator."},{name:"document-creation",title:"Create a Document",description:"Draft, review, and render a polished document with an interactive wizard."},{name:"newspaper",title:"Daily Newspaper",description:"Subscribe to recurring digests for topics you care about."}],vd=$o.map(e=>e.name)});function ZC(e){return e.replace(/^\/+/,"")}function jy(e){return typeof e=="string"&&e!==""&&!e.includes("/")&&!e.includes("\\")}function gn(e){if(e.mailboxKey!==void 0&&e.mailboxKey!==null&&e.mailboxKey!==""){let t=ZC(e.mailboxKey),r=t.lastIndexOf("/");return(r>=0?t.slice(r+1):t).includes(".")&&(t=r>=0?t.slice(0,r+1):""),t!==""&&!t.endsWith("/")&&(t+="/"),t}return jy(e.userId)&&jy(e.deviceId)?`${e.userId}/${e.deviceId}/`:`${zC}/${e.identityId}/`}function eM(e){return String(Math.max(0,Math.floor(e))).padStart(QC,"0")}function Nd(e,t,r){return`${e}${t}${eM(r)}.json`}function Oo(e,t){return`${e}${t}`}function Co(e,t,r){let n=`${t}${r}`;if(!e.startsWith(n))return;let s=e.slice(n.length).match(/^(\d+)\.json$/);if(s===null)return;let i=Number(s[1]);return Number.isSafeInteger(i)?i:void 0}var zC,QC,Mo=T(()=>{"use strict";zC="mailbox";QC=12});function Gt(e,t){let r=Math.floor(e),n="",s=r;for(let d=0;d<12;d++)n=jo[s&15]+n,s=Math.floor(s/16);let i=Math.floor(t()*4096)&4095,o="",a=i;for(let d=0;d<3;d++)o=jo[a&15]+o,a=a>>4;let l=jo[8|Math.floor(t()*4)&3],c="";for(let d=0;d<15;d++)c+=jo[Math.floor(t()*16)&15];return n.slice(0,8)+"-"+n.slice(8,12)+"-7"+o+"-"+l+c.slice(0,3)+"-"+c.slice(3,15)}var jo,Do=T(()=>{"use strict";jo="0123456789abcdef"});function Ad(e,t){return!Number.isFinite(e)||e<=0?t:e}function Rd(e){if(e===null||typeof e!="object")return!1;let t=e;return t.name==="NoSuchKey"||t.name==="NotFound"||t.Code==="NoSuchKey"||t.code==="NoSuchKey"||t.$metadata!==void 0&&t.$metadata.httpStatusCode===404}function Wy(e){return e.conversation_id===Uy&&nM(e.payload)}function nM(e){return typeof e=="object"&&e!==null&&e.kind==="heartbeat"}function sM(e){let t=typeof e.hb=="string"&&e.hb!==""?e.hb:Wy(e)?e.timestamp:void 0;if(t===void 0)return;let r=Date.parse(t);return Number.isFinite(r)?r:void 0}var Dy,Py,Fy,tM,Uy,rM,xd,jr,Po=T(()=>{"use strict";Mo();Do();Dy=3e3,Py=1e4,Fy=12e3,tM=1e3,Uy="__lmctl_heartbeat__",rM={kind:"heartbeat"},xd={setTimeout:(e,t)=>setTimeout(e,t),clearTimeout:e=>clearTimeout(e)},jr=class{opts;basePrefix;ownStream;peerStream;cursor;ownSeq;bootstrapped=!1;bootstrapInFlight=null;bootstrapPromise=null;writeChain=Promise.resolve();readIntervalMs;heartbeatIdleMs;backoffReadIntervalMs;running=!1;stopped=!1;stopRequested=!1;timerHandle=null;heartbeatTimerHandle=null;lastWriteMs;lastPeerHeartbeatMs;tickInFlight=null;constructor(t){this.opts=t,this.basePrefix=gn({identityId:t.identityId,userId:t.userId,deviceId:t.deviceId,mailboxKey:t.mailboxKey}),this.ownStream=t.selfRole==="agent"?"local":"web",this.peerStream=t.selfRole==="agent"?"web":"local",this.cursor=t.cursor,this.readIntervalMs=Ad(t.readIntervalMs??t.pollIntervalMs??Dy,Dy),this.heartbeatIdleMs=Ad(t.heartbeatIdleMs??Py,Py),this.backoffReadIntervalMs=Ad(t.backoffReadIntervalMs??t.pollIntervalMs??Fy,Fy)}start(){if(this.stopped)throw new Error("SequentialMailboxClient: cannot start after stop()");this.running||(this.running=!0,this.bootstrapInFlight=this.bootstrapThenRun())}async stop(){this.stopped=!0,this.stopRequested=!0;let t=this.opts.timers??xd;if(this.timerHandle!==null&&(t.clearTimeout(this.timerHandle),this.timerHandle=null),this.heartbeatTimerHandle!==null&&(t.clearTimeout(this.heartbeatTimerHandle),this.heartbeatTimerHandle=null),this.bootstrapInFlight!==null)try{await this.bootstrapInFlight}catch{}if(this.tickInFlight!==null)try{await this.tickInFlight}catch{}this.running=!1}async putMessage(t){return this.putEnvelope(t.conversation_id,t.payload)}getCursor(){return this.cursor}getMailboxBasePrefix(){return this.basePrefix}setPollIntervalMs(t){if(!Number.isFinite(t)||t<=0)throw new Error(`SequentialMailboxClient.setPollIntervalMs: invalid ms=${t}`);this.readIntervalMs=t}isPeerOn(){return this.peerIsOn((this.opts.now??Date.now)())}async bootstrapThenRun(){if(await this.ensureBootstrapped(),this.stopRequested){this.running=!1;return}this.runTick(),this.writeHeartbeat()}ensureBootstrapped(){return this.bootstrapped?Promise.resolve():(this.bootstrapPromise===null&&(this.bootstrapPromise=this.runColdStart()),this.bootstrapPromise)}async runColdStart(){try{let t=await this.maxSeq(this.ownStream);this.ownSeq=t,this.cursor===void 0&&(this.cursor=await this.maxSeq(this.peerStream)),this.bootstrapped=!0}catch(t){throw this.bootstrapPromise=null,this.emitError(t,"list"),t}}async maxSeq(t){let r=Oo(this.basePrefix,t),n=0,s;do{let i=await this.opts.s3.send(new this.opts.commands.ListObjectsV2Command({Bucket:this.opts.bucket,Prefix:r,MaxKeys:tM,...s!==void 0&&{ContinuationToken:s}}));this.opts.onS3Op?.("list");for(let o of i.Contents??[]){let a=Co(o.Key??"",this.basePrefix,t);a!==void 0&&a>n&&(n=a)}s=i.IsTruncated===!0?i.NextContinuationToken:void 0}while(s!==void 0);return n}async putEnvelope(t,r){let n=this.writeChain.then(()=>this.doPut(t,r));return this.writeChain=n.catch(()=>{}),n}async doPut(t,r){await this.ensureBootstrapped();let n=(this.opts.now??Date.now)(),s=new Date(n).toISOString(),i={message_id:Gt(n,this.opts.random??Math.random),from:this.opts.selfRole,timestamp:s,hb:s,conversation_id:t,payload:r},o=(this.ownSeq??0)+1,a=Nd(this.basePrefix,this.ownStream,o);return await this.opts.s3.send(new this.opts.commands.PutObjectCommand({Bucket:this.opts.bucket,Key:a,Body:JSON.stringify(i),ContentType:"application/json"})),this.opts.onS3Op?.("put"),this.ownSeq=o,this.recordWrite(n),a}scheduleNextTick(t){if(this.stopRequested)return;let r=this.opts.timers??xd;this.timerHandle=r.setTimeout(()=>{this.timerHandle=null,this.runTick()},t)}runTick(){this.stopRequested||(this.tickInFlight=(async()=>{try{await this.pollOnce()}finally{this.tickInFlight=null,this.stopRequested||this.scheduleNextTick(this.nextReadDelayMs())}})())}async pollOnce(){for(;!this.stopRequested;){let t=(this.cursor??0)+1,r=Nd(this.basePrefix,this.peerStream,t),n;try{let i=await this.opts.s3.send(new this.opts.commands.GetObjectCommand({Bucket:this.opts.bucket,Key:r}));if(this.opts.onS3Op?.("get"),i.Body===void 0){this.emitError(new Error(`GetObject ${r}: empty body`),"get"),this.advanceCursor(t);continue}n=await i.Body.transformToString("utf-8")}catch(i){if(Rd(i)){this.opts.onS3Op?.("get");return}this.emitError(i,"get");return}let s;try{s=JSON.parse(n)}catch(i){this.emitError(i,"get"),this.advanceCursor(t);continue}if(this.recordPeerHeartbeat(s),Wy(s)){this.advanceCursor(t);continue}try{await this.opts.onMessage(s)}catch(i){this.emitError(i,"handle");return}this.advanceCursor(t)}}advanceCursor(t){this.cursor=t,this.notifyCursorAdvance(t)}nextReadDelayMs(){return this.peerIsOn((this.opts.now??Date.now)())?this.readIntervalMs:this.backoffReadIntervalMs}peerIsOn(t){return this.lastPeerHeartbeatMs!==void 0&&t-this.lastPeerHeartbeatMs<=this.heartbeatIdleMs}recordPeerHeartbeat(t){let r=sM(t);r!==void 0&&(this.lastPeerHeartbeatMs=r)}recordWrite(t){this.lastWriteMs=t,this.scheduleHeartbeatCheck(this.heartbeatIdleMs)}scheduleHeartbeatCheck(t){if(this.stopRequested)return;let r=this.opts.timers??xd;this.heartbeatTimerHandle!==null&&r.clearTimeout(this.heartbeatTimerHandle),this.heartbeatTimerHandle=r.setTimeout(()=>{this.heartbeatTimerHandle=null,this.maybeWriteHeartbeat()},t)}async maybeWriteHeartbeat(){if(this.stopRequested)return;let t=(this.opts.now??Date.now)();if(this.lastWriteMs!==void 0){let r=t-this.lastWriteMs;if(r<this.heartbeatIdleMs){this.scheduleHeartbeatCheck(this.heartbeatIdleMs-r);return}}await this.writeHeartbeat()}async writeHeartbeat(){try{await this.putEnvelope(Uy,rM)}catch(t){this.emitError(t,"put"),this.scheduleHeartbeatCheck(this.heartbeatIdleMs)}}notifyCursorAdvance(t){if(this.opts.onCursorAdvance!==void 0)try{this.opts.onCursorAdvance(t)}catch(r){this.emitError(r,"handle")}}emitError(t,r){if(this.opts.onError!==void 0)try{this.opts.onError(t,r)}catch{}else console.error(`SequentialMailboxClient[${r}]`,t)}}});import{getConnInfo as iM}from"@hono/node-server/conninfo";function By(e,t){let r=t.bucket??oM,n=t.remoteAddressOf??(i=>lM(i)),s=i=>{let o=n(i);return cM(o)?null:i.json({error:"forbidden",message:"local-mailbox is loopback-only"},403)};e.get("/local-mailbox/object",async i=>{let o=s(i);if(o!==null)return o;let a=Ld(i.req.query("key"));if(typeof a!="string")return i.json({error:"bad_request",message:a.error},400);try{let l=await t.s3.send(new t.commands.GetObjectCommand({Bucket:r,Key:a}));if(l.Body===void 0)return i.json({error:"empty_body"},404);let c=await l.Body.transformToString("utf-8");return i.body(c,200,{"Content-Type":"application/octet-stream"})}catch(l){return Rd(l)?i.json({error:"not_found"},404):i.json({error:"internal",message:$d(l)},500)}}),e.put("/local-mailbox/object",async i=>{let o=s(i);if(o!==null)return o;let a=Ld(i.req.query("key"));if(typeof a!="string")return i.json({error:"bad_request",message:a.error},400);let l=new Uint8Array(await i.req.arrayBuffer());try{return await t.s3.send(new t.commands.PutObjectCommand({Bucket:r,Key:a,Body:l})),i.json({ok:!0})}catch(c){return i.json({error:"internal",message:$d(c)},500)}}),e.get("/local-mailbox/list",async i=>{let o=s(i);if(o!==null)return o;let a=i.req.query("prefix")??"",l=Ld(a,{allowEmpty:!0});if(typeof l!="string")return i.json({error:"bad_request",message:l.error},400);let c=aM(i.req.query("maxKeys")),d=i.req.query("token");try{let u=await t.s3.send(new t.commands.ListObjectsV2Command({Bucket:r,Prefix:l,...c!==void 0?{MaxKeys:c}:{},...d!==void 0&&d!==""?{ContinuationToken:d}:{}}));return i.json({Contents:(u.Contents??[]).map(f=>({Key:f.Key,LastModified:f.LastModified instanceof Date?f.LastModified.toISOString():f.LastModified})),IsTruncated:u.IsTruncated??!1,...u.NextContinuationToken!==void 0?{NextContinuationToken:u.NextContinuationToken}:{}})}catch(u){return i.json({error:"internal",message:$d(u)},500)}})}function Ld(e,t={}){if(e===void 0||e==="")return t.allowEmpty===!0?"":{error:"key required"};let r=e.replace(/^\/+/,"");return r.split("/").includes("..")?{error:"key must not contain '..'"}:r}function aM(e){if(e===void 0||e==="")return;let t=Number(e);return Number.isInteger(t)&&t>0?t:void 0}function lM(e){try{return iM(e).remote.address}catch{return}}function cM(e){return e===void 0||e===""?!1:!!(e==="127.0.0.1"||e==="::1"||e.startsWith("::ffff:127.")||e.startsWith("127."))}function $d(e){return e instanceof Error?e.message:String(e)}var oM,qy=T(()=>{"use strict";Po();oM="local"});function Hy(e,t){e.get("/mailbox/workspace",r=>fM(r,t)),e.get("/mailbox/projects",r=>mM(r,t)),e.get("/mailbox/projects/:id",r=>pM(r,t)),e.post("/mailbox/projects",r=>_M(r,t)),e.patch("/mailbox/projects/:id",r=>hM(r,t)),e.delete("/mailbox/projects/:id",r=>gM(r,t)),e.post("/mailbox/projects/:project_id/prompts",r=>yM(r,t)),e.get("/mailbox/prompts/:id",r=>wM(r,t))}function fM(e,t){t.dal.ensureWorkspace({id:wn,name:Od});let r=Jy(t.dal),n={id:wn,name:Od,created_at:uM,projects:r};return e.json({workspace:n})}function mM(e,t){return e.json({projects:Jy(t.dal)})}function pM(e,t){let r=e.req.param("id");if(r===void 0||r==="")return e.json({error:"bad_request",message:"project id required"},400);if(r.startsWith(yn)){let s=Cd(t.dal,r);return s===null||s.deleted_at!==null?e.json({project:null},404):e.json({project:Wo(s)})}let n=Gy(t.dal,r);return n===null?e.json({project:null},404):e.json({project:Xy(n)})}async function _M(e,t){let r;try{r=await e.req.json()}catch{return e.json({error:"bad_request",message:"invalid JSON body"},400)}let n=r.input;if(n===void 0||typeof n!="object")return e.json({error:"bad_request",message:"input is required"},400);if(typeof n.name!="string"||n.name==="")return e.json({error:"bad_request",message:"input.name is required"},400);if(typeof n.repo_path!="string"||n.repo_path==="")return e.json({error:"bad_request",message:"input.repo_path is required"},400);t.dal.ensureWorkspace({id:wn,name:Od});let s=t.dal.insertWebProject({workspace_id:wn,name:n.name,repo_path:n.repo_path,config_json:n.config_json===void 0?null:JSON.stringify(n.config_json)});return e.json({project:Wo(s)},201)}async function hM(e,t){let r=e.req.param("id");if(r===void 0||r==="")return e.json({error:"bad_request",message:"project id required"},400);let n;try{n=await e.req.json()}catch{return e.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.input??{};if(r.startsWith(yn)){let i=Cd(t.dal,r);if(i===null||i.deleted_at!==null)return e.json({error:"project_not_found",message:`project not found: ${r}`},404);let o=t.dal.updateWebProject({id:i.id,name:s.name===void 0?void 0:s.name,config_json:s.config_json===void 0?void 0:JSON.stringify(s.config_json)});return o===null?e.json({error:"project_not_found",message:`project not found: ${r}`},404):e.json({project:Wo(o)})}return e.json({error:"project_not_found",message:`project not found: ${r}`},404)}function gM(e,t){let r=e.req.param("id");if(r===void 0||r==="")return e.json({error:"bad_request",message:"project id required"},400);if(r.startsWith(yn)){let n=Cd(t.dal,r);if(n===null)return e.json({deleted:!1});let s=t.dal.softDeleteWebProject(n.id);return e.json({deleted:s})}return e.json({deleted:!1})}async function yM(e,t){let r=e.req.param("project_id");if(r===void 0||r==="")return e.json({error:"bad_request",message:"project_id required in path"},400);let n;try{n=await e.req.json()}catch{return e.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.input;if(s===void 0||typeof s!="object")return e.json({error:"bad_request",message:"input is required"},400);let i=s.project_id??r;if(typeof s.text!="string"||s.text==="")return e.json({error:"bad_request",message:"input.text is required"},400);let o=Gy(t.dal,i);if(o===null)return e.json({error:"project_not_found",message:`project not found: ${i}`},404);if(t.dal.getWorkflowByName(o.workflow_name)===null)return e.json({error:"workflow_not_registered",message:`project ${o.name} has no registered workflow "${o.workflow_name}"`},400);let l=`${dM}${crypto.randomUUID()}`,c={text:s.text,context_json:s.context_json??null},d;t.enqueueProjectJob!==void 0?d=t.enqueueProjectJob({dal:t.dal,project_id:o.id,source_ref:l,payload:c}):d=await EM({dal:t.dal,project_id:o.id,source_ref:l,payload:c}),t.dal.insertPromptDispatch({prompt_id:l,project_id:o.id,job_id:d.id,text:s.text,context_json:s.context_json===void 0?null:JSON.stringify(s.context_json)});let u={id:l,project_id:`${Uo}${o.id}`,text:s.text,status:"pending",created_at:new Date().toISOString(),completed_at:null};return e.json({prompt:u},201)}function wM(e,t){let r=e.req.param("id");if(r===void 0||r==="")return e.json({error:"bad_request",message:"prompt id required"},400);let n=TM(t.dal,r);return e.json({result:n})}function Jy(e){let t=e.listProjects().map(Xy),r=e.listWebProjectsActive(wn).map(Wo);return[...t,...r].sort(LM)}function Xy(e){return{id:`${Uo}${e.id}`,workspace_id:wn,name:e.name,repo_path:e.local_path,config_json:{workflow_name:e.workflow_name,team_id:e.team_id,durable_memory_mode:e.durable_memory_mode},last_active_at:null,created_at:e.created_at}}function Wo(e){let t={};if(e.config_json!==null)try{let r=JSON.parse(e.config_json);r!==null&&typeof r=="object"&&(t=r)}catch{}return e.linked_v4_project_id!==null&&(t={...t,linked_v4_project_id:e.linked_v4_project_id}),{id:`${yn}${e.id}`,workspace_id:e.workspace_id,name:e.name,repo_path:e.repo_path,config_json:t,last_active_at:e.last_active_at,created_at:e.created_at}}function Cd(e,t){if(!t.startsWith(yn))return null;let r=t.slice(yn.length),n=Number.parseInt(r,10);return!Number.isFinite(n)||String(n)!==r?null:e.getWebProject(n)}function Gy(e,t){if(t.startsWith(Uo)){let n=t.slice(Uo.length),s=Number.parseInt(n,10);if(Number.isFinite(s)&&String(s)===n)return e.getProject(s)}let r=Number.parseInt(t,10);return Number.isFinite(r)&&String(r)===t?e.getProject(r):null}async function EM(e){let{enqueueManual:t}=await Promise.resolve().then(()=>(Bc(),uh));return{id:t(e.dal,{project_id:e.project_id,source_ref:e.source_ref,payload:e.payload}).id}}function TM(e,t){let r=e.getPromptDispatch(t);if(r===null)return{prompt_id:t,data:{status:"unknown"},errors_json:{error:"prompt_not_found"},duration_ms:null};let n=e.getJob(r.job_id);if(n===null)return{prompt_id:t,data:null,errors_json:{error:"job_missing",job_id:r.job_id},duration_ms:null};let s=n.run_id===null?null:e.getRun(n.run_id),i=e.getProject(r.project_id),o=xM(e,i?.team_id??null),a=NM(s),l=AM(n,a,o.length>0),c=RM(r.created_at,s),d=i===null?{totalEstimatedMs:void 0,perStep:new Map}:bM(e,i.workflow_name),u=d.totalEstimatedMs,f=Vy(r.created_at),m=i?.workflow_name,p=d.perStep.size>0?d.perStep.size:void 0,h=s===null?[]:SM(e,s.id),g=vM(s,a,h,d.perStep,o),_=kM(h,d.perStep),S=IM(g,_,u,f,m,p);return l==="error"?{prompt_id:t,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,...Fo(u,f),...S},errors_json:{error:n.last_error??"job_failed",job_id:n.id,run_id:s?.id??null},duration_ms:c}:l==="done"?(r.completed_at===null&&e.setPromptDispatchCompleted(t),{prompt_id:t,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,terminal_state:s?.terminal_state??null,text:r.text,...Fo(u,f),...S},errors_json:null,duration_ms:c}):l==="paused"?{prompt_id:t,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,attempt_count:n.attempt_count,paused_step:a,attention_needed:o,...Fo(u,f),...S},errors_json:null,duration_ms:c}:{prompt_id:t,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,attempt_count:n.attempt_count,...Fo(u,f),...S},errors_json:null,duration_ms:c}}function bM(e,t){let r={totalEstimatedMs:void 0,perStep:new Map},n=e.getWorkflowByName(t);if(n===null)return r;let s;try{s=JSON.parse(n.definition)}catch{return r}if(s===null||typeof s!="object")return r;let i=s,o=typeof i.estimated_duration_ms=="number"&&Number.isFinite(i.estimated_duration_ms)&&i.estimated_duration_ms>=0?i.estimated_duration_ms:void 0,a=new Map;if(Array.isArray(i.steps))for(let l of i.steps){if(l===null||typeof l!="object")continue;let c=l;if(typeof c.id!="string"||c.id.length===0)continue;let d=typeof c.name=="string"&&c.name.length>0?c.name:c.id,u=typeof c.estimated_duration_ms=="number"&&Number.isFinite(c.estimated_duration_ms)&&c.estimated_duration_ms>=0?c.estimated_duration_ms:void 0;a.set(c.id,u===void 0?{name:d}:{name:d,estimated_duration_ms:u})}if(i.steps===void 0&&i.states!==null&&typeof i.states=="object")for(let[l,c]of Object.entries(i.states)){if(c===null||typeof c!="object")continue;let d=c,u=typeof d.estimated_duration_ms=="number"&&Number.isFinite(d.estimated_duration_ms)&&d.estimated_duration_ms>=0?d.estimated_duration_ms:void 0;a.set(l,u===void 0?{name:l}:{name:l,estimated_duration_ms:u})}return{totalEstimatedMs:o,perStep:a}}function SM(e,t){try{return e.listStepsForRun(t)}catch{return[]}}function vM(e,t,r,n,s){if(e===null||e.terminal_state!==null)return;let i=t!==null?t:e.current_state;if(i===null||i.length===0)return;let a=[...r].reverse().find(f=>f.state_name===i&&f.ended_at===null)?.started_at??e.paused_at??e.started_at,l=n.get(i),c=l?.name??i,d=Vy(a),u={id:i,name:c,started_at:a,elapsed_ms:d};return l?.estimated_duration_ms!==void 0&&(u.estimated_duration_ms=l.estimated_duration_ms),s.length>0&&(u.attention_needed=s),u}function kM(e,t){let r=[];for(let n of e){if(n.ended_at===null)continue;let s=Date.parse(n.started_at),i=Date.parse(n.ended_at),o=Number.isFinite(s)&&Number.isFinite(i)?Math.max(0,i-s):0,a=t.get(n.state_name)?.name??n.state_name,l=n.outcome==="failed"?"failed":"done";r.push({id:n.state_name,name:a,duration_ms:o,status:l})}return r}function IM(e,t,r,n,s,i){let o={completed_steps:t,total_elapsed_ms:n};return e!==void 0&&(o.current_step=e),r!==void 0&&(o.total_estimated_ms=r),s!==void 0&&s.length>0&&(o.workflow_name=s),i!==void 0&&(o.total_steps=i),o}function Vy(e){let t=Date.parse(e);return Number.isNaN(t)?0:Math.max(0,Date.now()-t)}function Fo(e,t){return e===void 0?{elapsed_ms:t}:{elapsed_ms:t,estimated_duration_ms:e}}function NM(e){if(e===null)return null;let t=e.current_state;if(t===null)return null;let r="__paused__:";return t.startsWith(r)?t.slice(r.length):null}function xM(e,t){if(t===null)return[];let r;try{r=e.listTeamMembers(t)}catch{return[]}return r.filter(n=>n.state==="attention_needed").map(n=>({alias:n.alias,reason:n.state_reason}))}function AM(e,t,r){return e.status==="queued"?"pending":e.status==="done"?"done":e.status==="failed"?"error":t!==null||r||e.status==="paused"?"paused":e.status==="running"?"running":"error"}function RM(e,t){let r=Date.parse(e);if(Number.isNaN(r))return null;let n=t?.ended_at??null,s=n===null?Date.now():Date.parse(n);return Number.isNaN(s)?null:Math.max(0,s-r)}function LM(e,t){let r=Date.parse(e.last_active_at??""),n=Date.parse(t.last_active_at??""),s=(Number.isNaN(n)?0:n)-(Number.isNaN(r)?0:r);return s===0?e.name.localeCompare(t.name):s}var Uo,yn,dM,wn,Od,uM,Ky=T(()=>{"use strict";Uo="project:",yn="web_project:",dM="prompt:",wn="default",Od="Default workspace",uM=new Date(0).toISOString()});import{Buffer as Yy}from"node:buffer";function zy(e,t,r){if(typeof e=="number"&&Number.isFinite(e)&&e>0)return e;if(t!==void 0&&t!==""){let n=Number(t);if(Number.isFinite(n)&&n>0)return n}return r}function Zy(e){return CM[e]}function Qy(e){let t=e.trim();if(t==="")return;let r=t.split(/\s+/),n=r.shift();if(!(n===void 0||n===""))return{cmd:n,args:r}}var $M,OM,Bo,CM,Md=T(()=>{"use strict";$M=1e4,OM=256*1024,Bo=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(t){this.opts=t,this.pushWindowMs=zy(t.pushWindowMs,process.env.LMCTL_TERMINAL_PUSH_WINDOW_MS,$M),this.pushByteCap=zy(t.pushByteCap,process.env.LMCTL_TERMINAL_PUSH_BYTE_CAP,OM),this.timers=t.timers??{setTimeout:(r,n)=>globalThis.setTimeout(r,n),clearTimeout:r=>globalThis.clearTimeout(r)}}startSession(t){if(this.sessions.has(t.session_id))throw new Error(`terminal_session_already_exists: ${t.session_id}`);let r=this.opts.pty.spawn(t.command,t.args,{name:"xterm-256color",cols:t.cols??120,rows:t.rows??30,cwd:t.cwd??process.cwd(),env:t.env??process.env}),n={session_id:t.session_id,pty:r,pendingOutput:[],pendingBytes:0,pushTimer:void 0,closed:!1};return this.sessions.set(t.session_id,n),r.onData(s=>{this.onPtyData(n,s)}),r.onExit(s=>{this.onPtyExit(n,s)}),this.opts.log?.(`[dt-2] terminal session ${t.session_id} started pid=${r.pid} cmd=${t.command}`),{pid:r.pid}}endSession(t){let r=this.sessions.get(t);if(r!==void 0)try{r.pty.kill()}catch{}}onInbound(t){if(t.direction!=="user_to_agent")return;let r=this.sessions.get(t.session_id);if(r===void 0){this.opts.log?.(`[dt-2] inbound terminal data for unknown session ${t.session_id}; dropping`);return}if(r.closed){this.opts.log?.(`[dt-2] inbound terminal data for closed session ${t.session_id}; dropping`);return}try{r.pty.write(t.data)}catch(n){this.opts.log?.(`[dt-2] pty.write failed for session ${t.session_id}: ${n instanceof Error?n.message:String(n)}`)}}setPublish(t){this.opts={...this.opts,publish:t}}listSessions(){return Array.from(this.sessions.values()).map(t=>({session_id:t.session_id,pid:t.pty.pid}))}pendingBytesFor(t){return this.sessions.get(t)?.pendingBytes}async stop(){for(let t of Array.from(this.sessions.values()))try{t.pty.kill()}catch{}for(let t of Array.from(this.sessions.values()))t.pushTimer!==void 0&&(this.timers.clearTimeout(t.pushTimer),t.pushTimer=void 0)}onPtyData(t,r){if(!t.closed){if(t.pendingOutput.push(r),t.pendingBytes+=Yy.byteLength(r,"utf8"),t.pendingBytes>=this.pushByteCap){this.flush(t,"byte_cap");return}t.pushTimer===void 0&&(t.pushTimer=this.timers.setTimeout(()=>{this.flush(t,"window_idle")},this.pushWindowMs))}}async flush(t,r){if(t.pushTimer!==void 0&&(this.timers.clearTimeout(t.pushTimer),t.pushTimer=void 0),t.pendingOutput.length===0)return;let n=t.pendingOutput.join("");t.pendingOutput=[],t.pendingBytes=0;let s={kind:"terminal",session_id:t.session_id,direction:"agent_to_user",data:n,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s),this.opts.log?.(`[dt-2] flushed session=${t.session_id} reason=${r} bytes=${Yy.byteLength(n,"utf8")}`)}catch(i){this.opts.log?.(`[dt-2] publish failed session=${t.session_id} reason=${r}: ${i instanceof Error?i.message:String(i)}`)}}async onPtyExit(t,r){if(t.closed)return;await this.flush(t,"pty_exit");let n=`\r
1953
+ `)}function KC(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function Ke(e){return typeof e=="string"?e:""}function YC(e){if(e===null)return{};try{let t=JSON.parse(e);if(t!==null&&typeof t=="object"&&!Array.isArray(t))return t}catch{return{}}return{}}function Sd(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Lo(e,t){return Number(e.req.param(t))}var Oo,vd,My=T(()=>{"use strict";Ro();Bt();ed();Oo=[{name:"info-qa",title:"Ask a Question",description:"Get a grounded answer from multiple researchers and one consolidator."},{name:"document-creation",title:"Create a Document",description:"Draft, review, and render a polished document with an interactive wizard."},{name:"newspaper",title:"Daily Newspaper",description:"Subscribe to recurring digests for topics you care about."}],vd=Oo.map(e=>e.name)});function ZC(e){return e.replace(/^\/+/,"")}function jy(e){return typeof e=="string"&&e!==""&&!e.includes("/")&&!e.includes("\\")}function gn(e){if(e.mailboxKey!==void 0&&e.mailboxKey!==null&&e.mailboxKey!==""){let t=ZC(e.mailboxKey),r=t.lastIndexOf("/");return(r>=0?t.slice(r+1):t).includes(".")&&(t=r>=0?t.slice(0,r+1):""),t!==""&&!t.endsWith("/")&&(t+="/"),t}return jy(e.userId)&&jy(e.deviceId)?`${e.userId}/${e.deviceId}/`:`${zC}/${e.identityId}/`}function eM(e){return String(Math.max(0,Math.floor(e))).padStart(QC,"0")}function Nd(e,t,r){return`${e}${t}${eM(r)}.json`}function $o(e,t){return`${e}${t}`}function Co(e,t,r){let n=`${t}${r}`;if(!e.startsWith(n))return;let s=e.slice(n.length).match(/^(\d+)\.json$/);if(s===null)return;let i=Number(s[1]);return Number.isSafeInteger(i)?i:void 0}var zC,QC,Mo=T(()=>{"use strict";zC="mailbox";QC=12});function Gt(e,t){let r=Math.floor(e),n="",s=r;for(let d=0;d<12;d++)n=jo[s&15]+n,s=Math.floor(s/16);let i=Math.floor(t()*4096)&4095,o="",a=i;for(let d=0;d<3;d++)o=jo[a&15]+o,a=a>>4;let l=jo[8|Math.floor(t()*4)&3],c="";for(let d=0;d<15;d++)c+=jo[Math.floor(t()*16)&15];return n.slice(0,8)+"-"+n.slice(8,12)+"-7"+o+"-"+l+c.slice(0,3)+"-"+c.slice(3,15)}var jo,Do=T(()=>{"use strict";jo="0123456789abcdef"});function Ad(e,t){return!Number.isFinite(e)||e<=0?t:e}function Rd(e){if(e===null||typeof e!="object")return!1;let t=e;return t.name==="NoSuchKey"||t.name==="NotFound"||t.Code==="NoSuchKey"||t.code==="NoSuchKey"||t.$metadata!==void 0&&t.$metadata.httpStatusCode===404}function Wy(e){return e.conversation_id===Uy&&nM(e.payload)}function nM(e){return typeof e=="object"&&e!==null&&e.kind==="heartbeat"}function sM(e){let t=typeof e.hb=="string"&&e.hb!==""?e.hb:Wy(e)?e.timestamp:void 0;if(t===void 0)return;let r=Date.parse(t);return Number.isFinite(r)?r:void 0}var Dy,Py,Fy,tM,Uy,rM,xd,jr,Po=T(()=>{"use strict";Mo();Do();Dy=3e3,Py=1e4,Fy=12e3,tM=1e3,Uy="__lmctl_heartbeat__",rM={kind:"heartbeat"},xd={setTimeout:(e,t)=>setTimeout(e,t),clearTimeout:e=>clearTimeout(e)},jr=class{opts;basePrefix;ownStream;peerStream;cursor;ownSeq;bootstrapped=!1;bootstrapInFlight=null;bootstrapPromise=null;writeChain=Promise.resolve();readIntervalMs;heartbeatIdleMs;backoffReadIntervalMs;running=!1;stopped=!1;stopRequested=!1;timerHandle=null;heartbeatTimerHandle=null;lastWriteMs;lastPeerHeartbeatMs;tickInFlight=null;constructor(t){this.opts=t,this.basePrefix=gn({identityId:t.identityId,userId:t.userId,deviceId:t.deviceId,mailboxKey:t.mailboxKey}),this.ownStream=t.selfRole==="agent"?"local":"web",this.peerStream=t.selfRole==="agent"?"web":"local",this.cursor=t.cursor,this.readIntervalMs=Ad(t.readIntervalMs??t.pollIntervalMs??Dy,Dy),this.heartbeatIdleMs=Ad(t.heartbeatIdleMs??Py,Py),this.backoffReadIntervalMs=Ad(t.backoffReadIntervalMs??t.pollIntervalMs??Fy,Fy)}start(){if(this.stopped)throw new Error("SequentialMailboxClient: cannot start after stop()");this.running||(this.running=!0,this.bootstrapInFlight=this.bootstrapThenRun())}async stop(){this.stopped=!0,this.stopRequested=!0;let t=this.opts.timers??xd;if(this.timerHandle!==null&&(t.clearTimeout(this.timerHandle),this.timerHandle=null),this.heartbeatTimerHandle!==null&&(t.clearTimeout(this.heartbeatTimerHandle),this.heartbeatTimerHandle=null),this.bootstrapInFlight!==null)try{await this.bootstrapInFlight}catch{}if(this.tickInFlight!==null)try{await this.tickInFlight}catch{}this.running=!1}async putMessage(t){return this.putEnvelope(t.conversation_id,t.payload)}getCursor(){return this.cursor}getMailboxBasePrefix(){return this.basePrefix}setPollIntervalMs(t){if(!Number.isFinite(t)||t<=0)throw new Error(`SequentialMailboxClient.setPollIntervalMs: invalid ms=${t}`);this.readIntervalMs=t}isPeerOn(){return this.peerIsOn((this.opts.now??Date.now)())}async bootstrapThenRun(){if(await this.ensureBootstrapped(),this.stopRequested){this.running=!1;return}this.runTick(),this.writeHeartbeat()}ensureBootstrapped(){return this.bootstrapped?Promise.resolve():(this.bootstrapPromise===null&&(this.bootstrapPromise=this.runColdStart()),this.bootstrapPromise)}async runColdStart(){try{let t=await this.maxSeq(this.ownStream);this.ownSeq=t,this.cursor===void 0&&(this.cursor=await this.maxSeq(this.peerStream)),this.bootstrapped=!0}catch(t){throw this.bootstrapPromise=null,this.emitError(t,"list"),t}}async maxSeq(t){let r=$o(this.basePrefix,t),n=0,s;do{let i=await this.opts.s3.send(new this.opts.commands.ListObjectsV2Command({Bucket:this.opts.bucket,Prefix:r,MaxKeys:tM,...s!==void 0&&{ContinuationToken:s}}));this.opts.onS3Op?.("list");for(let o of i.Contents??[]){let a=Co(o.Key??"",this.basePrefix,t);a!==void 0&&a>n&&(n=a)}s=i.IsTruncated===!0?i.NextContinuationToken:void 0}while(s!==void 0);return n}async putEnvelope(t,r){let n=this.writeChain.then(()=>this.doPut(t,r));return this.writeChain=n.catch(()=>{}),n}async doPut(t,r){await this.ensureBootstrapped();let n=(this.opts.now??Date.now)(),s=new Date(n).toISOString(),i={message_id:Gt(n,this.opts.random??Math.random),from:this.opts.selfRole,timestamp:s,hb:s,conversation_id:t,payload:r},o=(this.ownSeq??0)+1,a=Nd(this.basePrefix,this.ownStream,o);return await this.opts.s3.send(new this.opts.commands.PutObjectCommand({Bucket:this.opts.bucket,Key:a,Body:JSON.stringify(i),ContentType:"application/json"})),this.opts.onS3Op?.("put"),this.ownSeq=o,this.recordWrite(n),a}scheduleNextTick(t){if(this.stopRequested)return;let r=this.opts.timers??xd;this.timerHandle=r.setTimeout(()=>{this.timerHandle=null,this.runTick()},t)}runTick(){this.stopRequested||(this.tickInFlight=(async()=>{try{await this.pollOnce()}finally{this.tickInFlight=null,this.stopRequested||this.scheduleNextTick(this.nextReadDelayMs())}})())}async pollOnce(){for(;!this.stopRequested;){let t=(this.cursor??0)+1,r=Nd(this.basePrefix,this.peerStream,t),n;try{let i=await this.opts.s3.send(new this.opts.commands.GetObjectCommand({Bucket:this.opts.bucket,Key:r}));if(this.opts.onS3Op?.("get"),i.Body===void 0){this.emitError(new Error(`GetObject ${r}: empty body`),"get"),this.advanceCursor(t);continue}n=await i.Body.transformToString("utf-8")}catch(i){if(Rd(i)){this.opts.onS3Op?.("get");return}this.emitError(i,"get");return}let s;try{s=JSON.parse(n)}catch(i){this.emitError(i,"get"),this.advanceCursor(t);continue}if(this.recordPeerHeartbeat(s),Wy(s)){this.advanceCursor(t);continue}try{await this.opts.onMessage(s)}catch(i){this.emitError(i,"handle");return}this.advanceCursor(t)}}advanceCursor(t){this.cursor=t,this.notifyCursorAdvance(t)}nextReadDelayMs(){return this.peerIsOn((this.opts.now??Date.now)())?this.readIntervalMs:this.backoffReadIntervalMs}peerIsOn(t){return this.lastPeerHeartbeatMs!==void 0&&t-this.lastPeerHeartbeatMs<=this.heartbeatIdleMs}recordPeerHeartbeat(t){let r=sM(t);r!==void 0&&(this.lastPeerHeartbeatMs=r)}recordWrite(t){this.lastWriteMs=t,this.scheduleHeartbeatCheck(this.heartbeatIdleMs)}scheduleHeartbeatCheck(t){if(this.stopRequested)return;let r=this.opts.timers??xd;this.heartbeatTimerHandle!==null&&r.clearTimeout(this.heartbeatTimerHandle),this.heartbeatTimerHandle=r.setTimeout(()=>{this.heartbeatTimerHandle=null,this.maybeWriteHeartbeat()},t)}async maybeWriteHeartbeat(){if(this.stopRequested)return;let t=(this.opts.now??Date.now)();if(this.lastWriteMs!==void 0){let r=t-this.lastWriteMs;if(r<this.heartbeatIdleMs){this.scheduleHeartbeatCheck(this.heartbeatIdleMs-r);return}}await this.writeHeartbeat()}async writeHeartbeat(){try{await this.putEnvelope(Uy,rM)}catch(t){this.emitError(t,"put"),this.scheduleHeartbeatCheck(this.heartbeatIdleMs)}}notifyCursorAdvance(t){if(this.opts.onCursorAdvance!==void 0)try{this.opts.onCursorAdvance(t)}catch(r){this.emitError(r,"handle")}}emitError(t,r){if(this.opts.onError!==void 0)try{this.opts.onError(t,r)}catch{}else console.error(`SequentialMailboxClient[${r}]`,t)}}});import{getConnInfo as iM}from"@hono/node-server/conninfo";function By(e,t){let r=t.bucket??oM,n=t.remoteAddressOf??(i=>lM(i)),s=i=>{let o=n(i);return cM(o)?null:i.json({error:"forbidden",message:"local-mailbox is loopback-only"},403)};e.get("/local-mailbox/object",async i=>{let o=s(i);if(o!==null)return o;let a=Ld(i.req.query("key"));if(typeof a!="string")return i.json({error:"bad_request",message:a.error},400);try{let l=await t.s3.send(new t.commands.GetObjectCommand({Bucket:r,Key:a}));if(l.Body===void 0)return i.json({error:"empty_body"},404);let c=await l.Body.transformToString("utf-8");return i.body(c,200,{"Content-Type":"application/octet-stream"})}catch(l){return Rd(l)?i.json({error:"not_found"},404):i.json({error:"internal",message:Od(l)},500)}}),e.put("/local-mailbox/object",async i=>{let o=s(i);if(o!==null)return o;let a=Ld(i.req.query("key"));if(typeof a!="string")return i.json({error:"bad_request",message:a.error},400);let l=new Uint8Array(await i.req.arrayBuffer());try{return await t.s3.send(new t.commands.PutObjectCommand({Bucket:r,Key:a,Body:l})),i.json({ok:!0})}catch(c){return i.json({error:"internal",message:Od(c)},500)}}),e.get("/local-mailbox/list",async i=>{let o=s(i);if(o!==null)return o;let a=i.req.query("prefix")??"",l=Ld(a,{allowEmpty:!0});if(typeof l!="string")return i.json({error:"bad_request",message:l.error},400);let c=aM(i.req.query("maxKeys")),d=i.req.query("token");try{let u=await t.s3.send(new t.commands.ListObjectsV2Command({Bucket:r,Prefix:l,...c!==void 0?{MaxKeys:c}:{},...d!==void 0&&d!==""?{ContinuationToken:d}:{}}));return i.json({Contents:(u.Contents??[]).map(f=>({Key:f.Key,LastModified:f.LastModified instanceof Date?f.LastModified.toISOString():f.LastModified})),IsTruncated:u.IsTruncated??!1,...u.NextContinuationToken!==void 0?{NextContinuationToken:u.NextContinuationToken}:{}})}catch(u){return i.json({error:"internal",message:Od(u)},500)}})}function Ld(e,t={}){if(e===void 0||e==="")return t.allowEmpty===!0?"":{error:"key required"};let r=e.replace(/^\/+/,"");return r.split("/").includes("..")?{error:"key must not contain '..'"}:r}function aM(e){if(e===void 0||e==="")return;let t=Number(e);return Number.isInteger(t)&&t>0?t:void 0}function lM(e){try{return iM(e).remote.address}catch{return}}function cM(e){return e===void 0||e===""?!1:!!(e==="127.0.0.1"||e==="::1"||e.startsWith("::ffff:127.")||e.startsWith("127."))}function Od(e){return e instanceof Error?e.message:String(e)}var oM,qy=T(()=>{"use strict";Po();oM="local"});function Hy(e,t){e.get("/mailbox/workspace",r=>fM(r,t)),e.get("/mailbox/projects",r=>mM(r,t)),e.get("/mailbox/projects/:id",r=>pM(r,t)),e.post("/mailbox/projects",r=>_M(r,t)),e.patch("/mailbox/projects/:id",r=>hM(r,t)),e.delete("/mailbox/projects/:id",r=>gM(r,t)),e.post("/mailbox/projects/:project_id/prompts",r=>yM(r,t)),e.get("/mailbox/prompts/:id",r=>wM(r,t))}function fM(e,t){t.dal.ensureWorkspace({id:wn,name:$d});let r=Jy(t.dal),n={id:wn,name:$d,created_at:uM,projects:r};return e.json({workspace:n})}function mM(e,t){return e.json({projects:Jy(t.dal)})}function pM(e,t){let r=e.req.param("id");if(r===void 0||r==="")return e.json({error:"bad_request",message:"project id required"},400);if(r.startsWith(yn)){let s=Cd(t.dal,r);return s===null||s.deleted_at!==null?e.json({project:null},404):e.json({project:Wo(s)})}let n=Gy(t.dal,r);return n===null?e.json({project:null},404):e.json({project:Xy(n)})}async function _M(e,t){let r;try{r=await e.req.json()}catch{return e.json({error:"bad_request",message:"invalid JSON body"},400)}let n=r.input;if(n===void 0||typeof n!="object")return e.json({error:"bad_request",message:"input is required"},400);if(typeof n.name!="string"||n.name==="")return e.json({error:"bad_request",message:"input.name is required"},400);if(typeof n.repo_path!="string"||n.repo_path==="")return e.json({error:"bad_request",message:"input.repo_path is required"},400);t.dal.ensureWorkspace({id:wn,name:$d});let s=t.dal.insertWebProject({workspace_id:wn,name:n.name,repo_path:n.repo_path,config_json:n.config_json===void 0?null:JSON.stringify(n.config_json)});return e.json({project:Wo(s)},201)}async function hM(e,t){let r=e.req.param("id");if(r===void 0||r==="")return e.json({error:"bad_request",message:"project id required"},400);let n;try{n=await e.req.json()}catch{return e.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.input??{};if(r.startsWith(yn)){let i=Cd(t.dal,r);if(i===null||i.deleted_at!==null)return e.json({error:"project_not_found",message:`project not found: ${r}`},404);let o=t.dal.updateWebProject({id:i.id,name:s.name===void 0?void 0:s.name,config_json:s.config_json===void 0?void 0:JSON.stringify(s.config_json)});return o===null?e.json({error:"project_not_found",message:`project not found: ${r}`},404):e.json({project:Wo(o)})}return e.json({error:"project_not_found",message:`project not found: ${r}`},404)}function gM(e,t){let r=e.req.param("id");if(r===void 0||r==="")return e.json({error:"bad_request",message:"project id required"},400);if(r.startsWith(yn)){let n=Cd(t.dal,r);if(n===null)return e.json({deleted:!1});let s=t.dal.softDeleteWebProject(n.id);return e.json({deleted:s})}return e.json({deleted:!1})}async function yM(e,t){let r=e.req.param("project_id");if(r===void 0||r==="")return e.json({error:"bad_request",message:"project_id required in path"},400);let n;try{n=await e.req.json()}catch{return e.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.input;if(s===void 0||typeof s!="object")return e.json({error:"bad_request",message:"input is required"},400);let i=s.project_id??r;if(typeof s.text!="string"||s.text==="")return e.json({error:"bad_request",message:"input.text is required"},400);let o=Gy(t.dal,i);if(o===null)return e.json({error:"project_not_found",message:`project not found: ${i}`},404);if(t.dal.getWorkflowByName(o.workflow_name)===null)return e.json({error:"workflow_not_registered",message:`project ${o.name} has no registered workflow "${o.workflow_name}"`},400);let l=`${dM}${crypto.randomUUID()}`,c={text:s.text,context_json:s.context_json??null},d;t.enqueueProjectJob!==void 0?d=t.enqueueProjectJob({dal:t.dal,project_id:o.id,source_ref:l,payload:c}):d=await EM({dal:t.dal,project_id:o.id,source_ref:l,payload:c}),t.dal.insertPromptDispatch({prompt_id:l,project_id:o.id,job_id:d.id,text:s.text,context_json:s.context_json===void 0?null:JSON.stringify(s.context_json)});let u={id:l,project_id:`${Uo}${o.id}`,text:s.text,status:"pending",created_at:new Date().toISOString(),completed_at:null};return e.json({prompt:u},201)}function wM(e,t){let r=e.req.param("id");if(r===void 0||r==="")return e.json({error:"bad_request",message:"prompt id required"},400);let n=TM(t.dal,r);return e.json({result:n})}function Jy(e){let t=e.listProjects().map(Xy),r=e.listWebProjectsActive(wn).map(Wo);return[...t,...r].sort(LM)}function Xy(e){return{id:`${Uo}${e.id}`,workspace_id:wn,name:e.name,repo_path:e.local_path,config_json:{workflow_name:e.workflow_name,team_id:e.team_id,durable_memory_mode:e.durable_memory_mode},last_active_at:null,created_at:e.created_at}}function Wo(e){let t={};if(e.config_json!==null)try{let r=JSON.parse(e.config_json);r!==null&&typeof r=="object"&&(t=r)}catch{}return e.linked_v4_project_id!==null&&(t={...t,linked_v4_project_id:e.linked_v4_project_id}),{id:`${yn}${e.id}`,workspace_id:e.workspace_id,name:e.name,repo_path:e.repo_path,config_json:t,last_active_at:e.last_active_at,created_at:e.created_at}}function Cd(e,t){if(!t.startsWith(yn))return null;let r=t.slice(yn.length),n=Number.parseInt(r,10);return!Number.isFinite(n)||String(n)!==r?null:e.getWebProject(n)}function Gy(e,t){if(t.startsWith(Uo)){let n=t.slice(Uo.length),s=Number.parseInt(n,10);if(Number.isFinite(s)&&String(s)===n)return e.getProject(s)}let r=Number.parseInt(t,10);return Number.isFinite(r)&&String(r)===t?e.getProject(r):null}async function EM(e){let{enqueueManual:t}=await Promise.resolve().then(()=>(Bc(),uh));return{id:t(e.dal,{project_id:e.project_id,source_ref:e.source_ref,payload:e.payload}).id}}function TM(e,t){let r=e.getPromptDispatch(t);if(r===null)return{prompt_id:t,data:{status:"unknown"},errors_json:{error:"prompt_not_found"},duration_ms:null};let n=e.getJob(r.job_id);if(n===null)return{prompt_id:t,data:null,errors_json:{error:"job_missing",job_id:r.job_id},duration_ms:null};let s=n.run_id===null?null:e.getRun(n.run_id),i=e.getProject(r.project_id),o=xM(e,i?.team_id??null),a=NM(s),l=AM(n,a,o.length>0),c=RM(r.created_at,s),d=i===null?{totalEstimatedMs:void 0,perStep:new Map}:bM(e,i.workflow_name),u=d.totalEstimatedMs,f=Vy(r.created_at),m=i?.workflow_name,p=d.perStep.size>0?d.perStep.size:void 0,h=s===null?[]:SM(e,s.id),g=vM(s,a,h,d.perStep,o),_=kM(h,d.perStep),S=IM(g,_,u,f,m,p);return l==="error"?{prompt_id:t,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,...Fo(u,f),...S},errors_json:{error:n.last_error??"job_failed",job_id:n.id,run_id:s?.id??null},duration_ms:c}:l==="done"?(r.completed_at===null&&e.setPromptDispatchCompleted(t),{prompt_id:t,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,terminal_state:s?.terminal_state??null,text:r.text,...Fo(u,f),...S},errors_json:null,duration_ms:c}):l==="paused"?{prompt_id:t,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,attempt_count:n.attempt_count,paused_step:a,attention_needed:o,...Fo(u,f),...S},errors_json:null,duration_ms:c}:{prompt_id:t,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,attempt_count:n.attempt_count,...Fo(u,f),...S},errors_json:null,duration_ms:c}}function bM(e,t){let r={totalEstimatedMs:void 0,perStep:new Map},n=e.getWorkflowByName(t);if(n===null)return r;let s;try{s=JSON.parse(n.definition)}catch{return r}if(s===null||typeof s!="object")return r;let i=s,o=typeof i.estimated_duration_ms=="number"&&Number.isFinite(i.estimated_duration_ms)&&i.estimated_duration_ms>=0?i.estimated_duration_ms:void 0,a=new Map;if(Array.isArray(i.steps))for(let l of i.steps){if(l===null||typeof l!="object")continue;let c=l;if(typeof c.id!="string"||c.id.length===0)continue;let d=typeof c.name=="string"&&c.name.length>0?c.name:c.id,u=typeof c.estimated_duration_ms=="number"&&Number.isFinite(c.estimated_duration_ms)&&c.estimated_duration_ms>=0?c.estimated_duration_ms:void 0;a.set(c.id,u===void 0?{name:d}:{name:d,estimated_duration_ms:u})}if(i.steps===void 0&&i.states!==null&&typeof i.states=="object")for(let[l,c]of Object.entries(i.states)){if(c===null||typeof c!="object")continue;let d=c,u=typeof d.estimated_duration_ms=="number"&&Number.isFinite(d.estimated_duration_ms)&&d.estimated_duration_ms>=0?d.estimated_duration_ms:void 0;a.set(l,u===void 0?{name:l}:{name:l,estimated_duration_ms:u})}return{totalEstimatedMs:o,perStep:a}}function SM(e,t){try{return e.listStepsForRun(t)}catch{return[]}}function vM(e,t,r,n,s){if(e===null||e.terminal_state!==null)return;let i=t!==null?t:e.current_state;if(i===null||i.length===0)return;let a=[...r].reverse().find(f=>f.state_name===i&&f.ended_at===null)?.started_at??e.paused_at??e.started_at,l=n.get(i),c=l?.name??i,d=Vy(a),u={id:i,name:c,started_at:a,elapsed_ms:d};return l?.estimated_duration_ms!==void 0&&(u.estimated_duration_ms=l.estimated_duration_ms),s.length>0&&(u.attention_needed=s),u}function kM(e,t){let r=[];for(let n of e){if(n.ended_at===null)continue;let s=Date.parse(n.started_at),i=Date.parse(n.ended_at),o=Number.isFinite(s)&&Number.isFinite(i)?Math.max(0,i-s):0,a=t.get(n.state_name)?.name??n.state_name,l=n.outcome==="failed"?"failed":"done";r.push({id:n.state_name,name:a,duration_ms:o,status:l})}return r}function IM(e,t,r,n,s,i){let o={completed_steps:t,total_elapsed_ms:n};return e!==void 0&&(o.current_step=e),r!==void 0&&(o.total_estimated_ms=r),s!==void 0&&s.length>0&&(o.workflow_name=s),i!==void 0&&(o.total_steps=i),o}function Vy(e){let t=Date.parse(e);return Number.isNaN(t)?0:Math.max(0,Date.now()-t)}function Fo(e,t){return e===void 0?{elapsed_ms:t}:{elapsed_ms:t,estimated_duration_ms:e}}function NM(e){if(e===null)return null;let t=e.current_state;if(t===null)return null;let r="__paused__:";return t.startsWith(r)?t.slice(r.length):null}function xM(e,t){if(t===null)return[];let r;try{r=e.listTeamMembers(t)}catch{return[]}return r.filter(n=>n.state==="attention_needed").map(n=>({alias:n.alias,reason:n.state_reason}))}function AM(e,t,r){return e.status==="queued"?"pending":e.status==="done"?"done":e.status==="failed"?"error":t!==null||r||e.status==="paused"?"paused":e.status==="running"?"running":"error"}function RM(e,t){let r=Date.parse(e);if(Number.isNaN(r))return null;let n=t?.ended_at??null,s=n===null?Date.now():Date.parse(n);return Number.isNaN(s)?null:Math.max(0,s-r)}function LM(e,t){let r=Date.parse(e.last_active_at??""),n=Date.parse(t.last_active_at??""),s=(Number.isNaN(n)?0:n)-(Number.isNaN(r)?0:r);return s===0?e.name.localeCompare(t.name):s}var Uo,yn,dM,wn,$d,uM,Ky=T(()=>{"use strict";Uo="project:",yn="web_project:",dM="prompt:",wn="default",$d="Default workspace",uM=new Date(0).toISOString()});import{Buffer as Yy}from"node:buffer";function zy(e,t,r){if(typeof e=="number"&&Number.isFinite(e)&&e>0)return e;if(t!==void 0&&t!==""){let n=Number(t);if(Number.isFinite(n)&&n>0)return n}return r}function Zy(e){return CM[e]}function Qy(e){let t=e.trim();if(t==="")return;let r=t.split(/\s+/),n=r.shift();if(!(n===void 0||n===""))return{cmd:n,args:r}}var OM,$M,Bo,CM,Md=T(()=>{"use strict";OM=1e4,$M=256*1024,Bo=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(t){this.opts=t,this.pushWindowMs=zy(t.pushWindowMs,process.env.LMCTL_TERMINAL_PUSH_WINDOW_MS,OM),this.pushByteCap=zy(t.pushByteCap,process.env.LMCTL_TERMINAL_PUSH_BYTE_CAP,$M),this.timers=t.timers??{setTimeout:(r,n)=>globalThis.setTimeout(r,n),clearTimeout:r=>globalThis.clearTimeout(r)}}startSession(t){if(this.sessions.has(t.session_id))throw new Error(`terminal_session_already_exists: ${t.session_id}`);let r=this.opts.pty.spawn(t.command,t.args,{name:"xterm-256color",cols:t.cols??120,rows:t.rows??30,cwd:t.cwd??process.cwd(),env:t.env??process.env}),n={session_id:t.session_id,pty:r,pendingOutput:[],pendingBytes:0,pushTimer:void 0,closed:!1};return this.sessions.set(t.session_id,n),r.onData(s=>{this.onPtyData(n,s)}),r.onExit(s=>{this.onPtyExit(n,s)}),this.opts.log?.(`[dt-2] terminal session ${t.session_id} started pid=${r.pid} cmd=${t.command}`),{pid:r.pid}}endSession(t){let r=this.sessions.get(t);if(r!==void 0)try{r.pty.kill()}catch{}}onInbound(t){if(t.direction!=="user_to_agent")return;let r=this.sessions.get(t.session_id);if(r===void 0){this.opts.log?.(`[dt-2] inbound terminal data for unknown session ${t.session_id}; dropping`);return}if(r.closed){this.opts.log?.(`[dt-2] inbound terminal data for closed session ${t.session_id}; dropping`);return}try{r.pty.write(t.data)}catch(n){this.opts.log?.(`[dt-2] pty.write failed for session ${t.session_id}: ${n instanceof Error?n.message:String(n)}`)}}setPublish(t){this.opts={...this.opts,publish:t}}listSessions(){return Array.from(this.sessions.values()).map(t=>({session_id:t.session_id,pid:t.pty.pid}))}pendingBytesFor(t){return this.sessions.get(t)?.pendingBytes}async stop(){for(let t of Array.from(this.sessions.values()))try{t.pty.kill()}catch{}for(let t of Array.from(this.sessions.values()))t.pushTimer!==void 0&&(this.timers.clearTimeout(t.pushTimer),t.pushTimer=void 0)}onPtyData(t,r){if(!t.closed){if(t.pendingOutput.push(r),t.pendingBytes+=Yy.byteLength(r,"utf8"),t.pendingBytes>=this.pushByteCap){this.flush(t,"byte_cap");return}t.pushTimer===void 0&&(t.pushTimer=this.timers.setTimeout(()=>{this.flush(t,"window_idle")},this.pushWindowMs))}}async flush(t,r){if(t.pushTimer!==void 0&&(this.timers.clearTimeout(t.pushTimer),t.pushTimer=void 0),t.pendingOutput.length===0)return;let n=t.pendingOutput.join("");t.pendingOutput=[],t.pendingBytes=0;let s={kind:"terminal",session_id:t.session_id,direction:"agent_to_user",data:n,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s),this.opts.log?.(`[dt-2] flushed session=${t.session_id} reason=${r} bytes=${Yy.byteLength(n,"utf8")}`)}catch(i){this.opts.log?.(`[dt-2] publish failed session=${t.session_id} reason=${r}: ${i instanceof Error?i.message:String(i)}`)}}async onPtyExit(t,r){if(t.closed)return;await this.flush(t,"pty_exit");let n=`\r
1954
1954
  [process exited with code ${r.exitCode}${r.signal!==void 0?` signal ${r.signal}`:""}]\r
1955
1955
  `,s={kind:"terminal",session_id:t.session_id,direction:"agent_to_user",data:n,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s)}catch(i){this.opts.log?.(`[dt-2] publish (exit) failed session=${t.session_id}: ${i instanceof Error?i.message:String(i)}`)}t.closed=!0,this.sessions.delete(t.session_id)}};CM={claude:{cmd:"claude",args:["--dangerously-skip-permissions"]},codex:{cmd:"codex",args:["--yolo","--sandbox","danger-full-access"]},gemini:{cmd:"gemini",args:["-y","--skip-trust"]},copilot:{cmd:"copilot",args:["--yolo"]},qwen:{cmd:"qwen",args:["--approval-mode","yolo"]},opencode:{cmd:"opencode",args:[]}}});function tw(e,t){e.post("/mailbox/terminal/launch",r=>MM(r,t)),e.post("/mailbox/terminal/end/:session_id",r=>jM(r,t)),e.get("/mailbox/terminal/sessions",r=>DM(r,t))}async function MM(e,t){let r=t.terminalSessionManager;if(r===void 0)return e.json({error:"terminal_unavailable",message:"terminal session manager not configured (mailbox runtime missing)"},503);let n;try{n=await e.req.json()}catch{return e.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.session_id;if(typeof s!="string"||!ew.test(s))return e.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400);let i=n.provider;if(typeof i!="string"||i==="")return e.json({error:"bad_request",message:"provider is required"},400);let o;if(typeof n.command_line=="string"&&n.command_line.trim()!==""){if(o=Qy(n.command_line),o===void 0)return e.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=Zy(i);if(a===void 0)return e.json({error:"no_default_for_provider",message:`no TERMINAL_LAUNCH_DEFAULTS entry for provider "${i}"`},400);o={cmd:a.cmd,args:[...a.args]}}try{let{pid:a}=r.startSession({session_id:s,command:o.cmd,args:o.args,...typeof n.cwd=="string"&&n.cwd!==""?{cwd:n.cwd}:{}});return e.json({session_id:s,pid:a,command:o.cmd,args:o.args},201)}catch(a){let l=a instanceof Error?a.message:String(a);return l.startsWith("terminal_session_already_exists")?e.json({error:"session_exists",message:l},409):e.json({error:"spawn_failed",message:l},500)}}function jM(e,t){let r=t.terminalSessionManager;if(r===void 0)return e.json({error:"terminal_unavailable",message:"terminal session manager not configured"},503);let n=e.req.param("session_id");return n===void 0||!ew.test(n)?e.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400):(r.endSession(n),e.json({session_id:n,ended:!0}))}function DM(e,t){let r=t.terminalSessionManager;return r===void 0?e.json({sessions:[],note:"terminal session manager not configured"}):e.json({sessions:r.listSessions()})}var ew,rw=T(()=>{"use strict";Md();ew=/^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i});import{Buffer as PM}from"node:buffer";function WM(e){try{return PM.byteLength(JSON.stringify(e),"utf8")}catch{return 256}}function nw(e,t,r){if(typeof e=="number"&&Number.isFinite(e)&&e>0)return e;if(t!==void 0&&t!==""){let n=Number(t);if(Number.isFinite(n)&&n>0)return n}return r}function sw(e){return BM[e]}function iw(e){let t=e.trim();if(t==="")return;let r=[],n=0;for(;n<t.length;){let i=t[n];if(i===" "||i===" "){n+=1;continue}if(i==='"'){let a=n+1,l="";for(;a<t.length&&t[a]!=='"';)l+=t[a],a+=1;r.push(l),n=a+1;continue}let o=n;for(;o<t.length&&t[o]!==" "&&t[o]!==" ";)o+=1;r.push(t.slice(n,o)),n=o}if(r.length===0)return;let s=r.shift();if(!(s===void 0||s===""))return{cmd:s,args:r}}var FM,UM,qo,BM,jd=T(()=>{"use strict";FM=2e3,UM=64*1024,qo=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(t){this.opts=t,this.pushWindowMs=nw(t.pushWindowMs,process.env.LMCTL_PROVIDER_PUSH_WINDOW_MS,FM),this.pushByteCap=nw(t.pushByteCap,process.env.LMCTL_PROVIDER_PUSH_BYTE_CAP,UM),this.timers=t.timers??{setTimeout:(r,n)=>globalThis.setTimeout(r,n),clearTimeout:r=>globalThis.clearTimeout(r)}}async startSession(t){if(this.sessions.has(t.session_id))throw new Error(`persistent_session_already_exists: ${t.session_id}`);let r=this.opts.adapterFactory(t.provider),n={session_id:t.session_id,provider:t.provider,adapter:r,child:void 0,pendingEvents:[],pendingBytes:0,pushTimer:void 0,generation:1,turnMap:new Map,closed:!1};this.sessions.set(t.session_id,n);let s=this.makeAdapterContext(n);try{let i=await r.start(t,s);return n.child=i,this.wireChildExit(n,i),this.opts.log?.(`[dt-3] persistent session ${t.session_id} started provider=${t.provider} pid=${i.pid??"?"}`),{pid:i.pid}}catch(i){throw this.sessions.delete(t.session_id),i}}async endSession(t){let r=this.sessions.get(t);if(r!==void 0){r.generation+=1;try{await r.adapter.stop()}catch{}if(r.child!==void 0)try{r.child.kill("SIGTERM")}catch{}await this.flush(r,"session_end"),r.closed=!0,this.sessions.delete(t)}}async onInbound(t){if(t.direction!=="user_to_agent")return;let r=this.sessions.get(t.session_id);if(r===void 0){this.opts.log?.(`[dt-3] inbound provider data for unknown session ${t.session_id}; dropping`);return}if(r.closed){this.opts.log?.(`[dt-3] inbound provider data for closed session ${t.session_id}; dropping`);return}let n=t.user_input??"";if(n!=="")try{await r.adapter.sendTurn(n)}catch(s){let i=s instanceof Error?s.message:String(s);this.opts.log?.(`[dt-3] adapter.sendTurn failed session=${t.session_id}: ${i}`),this.appendEvent(r,{event_type:"error",payload:{message:`sendTurn failed: ${i}`}})}}setPublish(t){this.opts={...this.opts,publish:t}}listSessions(){return Array.from(this.sessions.values()).map(t=>({session_id:t.session_id,provider:t.provider,pid:t.child?.pid}))}pendingEventCountFor(t){return this.sessions.get(t)?.pendingEvents.length}generationFor(t){return this.sessions.get(t)?.generation}_testBumpGeneration(t){let r=this.sessions.get(t);r!==void 0&&(r.generation+=1)}async stop(){for(let t of Array.from(this.sessions.values())){t.generation+=1;try{await t.adapter.stop()}catch{}if(t.child!==void 0)try{t.child.kill("SIGTERM")}catch{}}for(let t of Array.from(this.sessions.values()))t.pushTimer!==void 0&&(this.timers.clearTimeout(t.pushTimer),t.pushTimer=void 0)}makeAdapterContext(t){let r=t.generation,n=this;return{generation:r,currentGeneration(){return t.generation},emit(s){r===t.generation&&(t.closed||n.appendEvent(t,s))},...n.opts.log!==void 0?{log:n.opts.log}:{},turnMap:t.turnMap}}appendEvent(t,r){t.pendingEvents.push(r);let n=WM(r);if(t.pendingBytes+=n,t.pendingBytes>=this.pushByteCap){this.flush(t,"byte_cap");return}t.pushTimer===void 0&&(t.pushTimer=this.timers.setTimeout(()=>{this.flush(t,"window_idle")},this.pushWindowMs))}async flush(t,r){if(t.pushTimer!==void 0&&(this.timers.clearTimeout(t.pushTimer),t.pushTimer=void 0),t.pendingEvents.length===0)return;let n=t.pendingEvents;t.pendingEvents=[],t.pendingBytes=0;let s={kind:"provider",session_id:t.session_id,direction:"agent_to_user",events:n,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s),this.opts.log?.(`[dt-3] flushed session=${t.session_id} reason=${r} events=${n.length}`)}catch(i){this.opts.log?.(`[dt-3] publish failed session=${t.session_id} reason=${r}: ${i instanceof Error?i.message:String(i)}`)}}wireChildExit(t,r){let n=t.generation;r.on("exit",(s,i)=>{n===t.generation&&(t.closed||(this.appendEvent(t,{event_type:"error",payload:{message:`provider child exited code=${s??"?"} signal=${i??""}; session ended. Click Reset to start a new chat.`}}),this.flush(t,"child_exit"),t.closed=!0))}),r.on("error",s=>{n===t.generation&&(t.closed||(this.appendEvent(t,{event_type:"error",payload:{message:`provider child error: ${s.message}`}}),this.flush(t,"child_exit")))})}};BM={codex:{cmd:"codex",args:["app-server","--listen","stdio://"]},claude:{cmd:"claude",args:["-p","","--output-format","stream-json","--input-format","stream-json","--verbose","--dangerously-skip-permissions"]},gemini:{cmd:"gemini",args:["--acp","-y","--skip-trust"]},copilot:{cmd:"copilot",args:["--acp","--yolo"]},opencode:{cmd:"opencode",args:["acp"]},qwen:{cmd:"qwen",args:["-p","","--output-format","stream-json","--input-format","stream-json","--approval-mode","yolo"]}}});function aw(e,t){e.post("/mailbox/chat/launch",r=>qM(r,t)),e.post("/mailbox/chat/end/:session_id",r=>HM(r,t)),e.get("/mailbox/chat/sessions",r=>JM(r,t))}async function qM(e,t){let r=t.persistentSessionManager;if(r===void 0)return e.json({error:"chat_unavailable",message:"persistent session manager not configured (mailbox runtime missing)"},503);let n;try{n=await e.req.json()}catch{return e.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.session_id;if(typeof s!="string"||!ow.test(s))return e.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400);let i=n.provider;if(typeof i!="string"||i==="")return e.json({error:"bad_request",message:"provider is required"},400);let o;if(typeof n.command_line=="string"&&n.command_line.trim()!==""){if(o=iw(n.command_line),o===void 0)return e.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=sw(i);if(a===void 0)return e.json({error:"no_default_for_provider",message:`no PERSISTENT_LAUNCH_DEFAULTS entry for provider "${i}"`},400);o={cmd:a.cmd,args:[...a.args]}}try{let{pid:a}=await r.startSession({session_id:s,provider:i,command:o.cmd,args:o.args,...typeof n.cwd=="string"&&n.cwd!==""?{cwd:n.cwd}:{}});return e.json({session_id:s,provider:i,pid:a,command:o.cmd,args:o.args},201)}catch(a){let l=a instanceof Error?a.message:String(a);return l.startsWith("persistent_session_already_exists")?e.json({error:"session_exists",message:l},409):l.startsWith("no_persistent_adapter_for_provider")?e.json({error:"no_adapter",message:l},400):e.json({error:"spawn_failed",message:l},500)}}async function HM(e,t){let r=t.persistentSessionManager;if(r===void 0)return e.json({error:"chat_unavailable",message:"persistent session manager not configured"},503);let n=e.req.param("session_id");return n===void 0||!ow.test(n)?e.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400):(await r.endSession(n),e.json({session_id:n,ended:!0}))}function JM(e,t){let r=t.persistentSessionManager;return r===void 0?e.json({sessions:[],note:"persistent session manager not configured"}):e.json({sessions:r.listSessions()})}var ow,lw=T(()=>{"use strict";jd();ow=/^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i});import{readFileSync as XM}from"node:fs";function dw(e){let t=e.artifacts.find(r=>r.kind===`${e.state_name}_transcript`);if(t?.content!==void 0&&t.content!==null)return cw(t.content);if(t?.path===void 0||t.path===null)return[];try{let r=XM(t.path,{encoding:"utf8"});return cw(r)}catch{return[]}}function cw(e){let t=e.split(/\r?\n/).filter(r=>r.trim().length>0);return t.length===0?[]:t.map(r=>{let n=/^(user|assistant|system|tool)\s*:\s*(.*)$/i.exec(r);return n===null?{role:"transcript",text:r}:{role:n[1].toLowerCase(),text:n[2]}})}var uw=T(()=>{"use strict"});function fw(e,t,r){let n=e.getRun(t);if(n===null)return{err:`run ${t}: not found`};if(r!==void 0){let l=e.findTeamMemberByAlias(n.team_id,r);return l===null?{err:`run ${t}: team has no member alias "${r}"`}:l.sessionid===null||l.sessionid.length===0?{err:`run ${t}: member "${l.alias}" has no sessionid yet (seed first)`}:{ok:{provider:l.provider,sessionid:l.sessionid,sessiondir:l.sessiondir,alias:l.alias,...l.model!==null&&l.model!==void 0?{model:l.model}:{}}}}let s=e.latestAgentCall(t);if(s!==null){let l=e.findTeamMemberByAlias(n.team_id,s.alias);return l===null?{err:`run ${t}: team has no member alias "${s.alias}" (latest agent_call references a member that has been removed)`}:l.sessionid===null||l.sessionid.length===0?{err:`run ${t}: member "${l.alias}" has no sessionid yet (seed first)`}:{ok:{provider:l.provider,sessionid:l.sessionid,sessiondir:l.sessiondir,alias:l.alias,...l.model!==null&&l.model!==void 0?{model:l.model}:{}}}}let o=e.listTeamMembers(n.team_id).filter(l=>l.state!=="retired"&&l.sessionid!==null&&l.sessionid.length>0);if(o.length===0)return{err:`run ${t}: cannot resolve an agent session (no agent_call yet, no seeded member)`};if(o.length>1){let l=o.map(c=>c.alias).join(", ");return{err:`run ${t}: cannot resolve an agent session (no agent_call yet; team has multiple members [${l}] \u2014 pass --alias)`}}let a=o[0];return{ok:{provider:a.provider,sessionid:a.sessionid,sessiondir:a.sessiondir,alias:a.alias,...a.model!==null&&a.model!==void 0?{model:a.model}:{}}}}function Ho(e,t){let r=e.query(`SELECT id, kind FROM attention
1956
1956
  WHERE run_id = ?
@@ -1962,7 +1962,7 @@ ${p.text}`,["approve","request_changes"],!0,s,t.writes_to_project_path===!0)));i
1962
1962
  <label>Token <input name="token" type="password"></label>
1963
1963
  <button type="submit">Login</button>
1964
1964
  </form>
1965
- `))),t.post("/login",async s=>{let i=await s.req.parseBody(),o=typeof i.token=="string"?i.token:"";return Eh(o)?(Vc(s,o),s.redirect("/",302)):s.html(Re("Login","<p>Invalid token</p>"),401)}),t.post("/logout",s=>(Th(s),s.redirect("/login",302))),Ny(t,{dal:e.dal}),bw(t,{dal:e.dal}),Hy(t,{dal:e.dal}),tw(t,{terminalSessionManager:e.terminalSessionManager}),aw(t,{persistentSessionManager:e.persistentSessionManager}),t.post("/api/teams/:team_name/refresh",async s=>{let i=ss(s.req.param("team_name")),o=e.dal.findTeamByName(i);if(o===null)return s.notFound();let a=[],c=e.dal.db.transaction(()=>{let f=e.dal.listTeamMembers(o.id),m=f.filter(p=>p.state!=="idle");if(m.length>0)return{ok:!1,nonIdle:m.map(p=>({alias:p.alias,state:p.state}))};for(let p of f)e.dal.setMemberState(p.id,"in_chat","refreshing");return a=f.map(p=>({id:p.id,alias:p.alias})),{ok:!0}})();if(!c.ok){let f=c.nonIdle.map(m=>`${m.alias}:${m.state}`).join(", ");return s.text(`refresh refused: non-idle members: ${f}`,409)}let d=[],u=[];for(let f of a)try{await yc(e.dal,i,f.alias),e.dal.setMemberState(f.id,"idle",null),d.push(f.alias)}catch(m){let p=m instanceof Error?m.message:String(m);e.dal.setMemberState(f.id,"attention_needed",`refresh failed: ${p}`),u.push({alias:f.alias,error:p})}return D(s,{team:i,seeded:d,failed:u},f=>`<p>refreshed team ${b(f.team)}: seeded [${f.seeded.map(m=>b(m)).join(", ")}]${f.failed.length>0?` failed [${f.failed.map(m=>`${b(m.alias)}: ${b(m.error)}`).join(", ")}]`:""}</p>`)}),xh(t,{dal:e.dal}),Mh(t,{dal:e.dal}),t.get("/api/status",s=>D(s,Pi(e.dal),Cj)),t.get("/api/projects",s=>D(s,Fi(e.dal),Mj)),t.get("/api/teams",s=>D(s,g_(e.dal),Pj)),t.get("/api/workflows",s=>D(s,Ui(e.dal),Fj)),t.get("/api/workflows/verify",s=>{let i=uy();return s.req.header("accept")?.includes("text/plain")?s.text(my(i)):s.json(i)}),t.get("/api/jobs",s=>D(s,y_(e.dal,{status:s.req.query("status")}),Uj)),t.post("/api/uploads",s=>Aw(s,e.dal)),t.get("/api/jobs/:id",s=>{let i=Wi(e.dal,ee(s,"id"));return i===null?s.notFound():D(s,i,de)}),t.post("/api/jobs",async s=>{let i;try{i=await s.req.json()}catch{return s.text("invalid JSON body",400)}let o=null;if(typeof i.project_id=="number")o=i.project_id;else if(typeof i.project=="string"){let f=e.dal.findProjectByName(i.project);if(f===null)return s.text(`project not found: ${i.project}`,404);o=f.id}else{let f=e.dal.listProjects();f.length===1&&(o=f[0].id)}if(o===null)return s.text("missing project or project_id",400);let a=typeof i.workflow_id_override=="number"?i.workflow_id_override:null;if(a===null&&typeof i.workflow=="string"){let f=e.dal.getWorkflowByName(i.workflow);if(f===null)return s.text(`workflow not found: ${i.workflow}`,404);a=f.id}let l=typeof i.source=="string"?i.source:"manual",c=i.payload,d=c==null?null:typeof c=="string"?c:JSON.stringify(c),u=e.dal.enqueueJob({project_id:o,workflow_id_override:a,source:l,source_ref:typeof i.source_ref=="string"?i.source_ref:null,payload:d,priority:typeof i.priority=="number"?i.priority:0,dedupe_key:typeof i.dedupe_key=="string"?i.dedupe_key:null});return D(s,u,de)}),t.post("/api/jobs/:id/run",async s=>{let{runJobById:i}=await Promise.resolve().then(()=>(Ro(),Sy)),o=Wi(e.dal,ee(s,"id"));if(o===null)return s.notFound();let a=await i({dal:e.dal,worker_id:`api-job-run-${process.pid}-${Date.now()}`,job_id:o.id});return a.claimed?s.json({job_id:a.job_id,run_id:a.run_id,status:a.status,terminal_state:a.terminal_state,ms:a.ms}):s.json(a,409)}),t.get("/api/workflows/:name",s=>{let i=e.dal.getWorkflowByName(s.req.param("name"));return i===null?s.notFound():D(s,i,de)}),t.get("/api/projects/:name/workflows",s=>{let i=e.dal.findProjectByName(s.req.param("name"));return i===null?s.notFound():D(s,e.dal.listProjectWorkflows(i.id),jj)}),t.post("/api/projects/:name/workflows",async s=>{let i=e.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=await Tn(s);if(typeof o=="string")return s.text(o,400);let a=typeof o.workflow=="string"?o.workflow:null,l=typeof o.workflow_id=="number"?o.workflow_id:null,c=l!==null?e.dal.getWorkflow(l):a!==null?e.dal.getWorkflowByName(a):null;if(c===null)return s.text("workflow not found",404);let d=typeof o.condition=="string"&&o.condition.length>0?o.condition:null;if(d!==null)try{an(d)}catch{return s.text("invalid condition",400)}let u=Rj(o.parameters_override??o.params);if(typeof u=="string"&&u.startsWith("error:"))return s.text(u.slice(6),400);let f=typeof o.priority=="number"&&Number.isInteger(o.priority)?o.priority:100,m=e.dal.insertProjectWorkflow({project_id:i.id,workflow_id:c.id,condition:d,parameters_override:u,priority:f});return D(s,m,de)}),t.get("/api/projects/workflows/:id",s=>{let i=e.dal.getProjectWorkflow(ee(s,"id"));return i===null?s.notFound():D(s,i,de)}),t.delete("/api/projects/workflows/:id",s=>e.dal.removeProjectWorkflow(ee(s,"id"))?D(s,{removed:!0},de):s.notFound()),t.post("/api/projects/workflows/:id/enable",s=>{let i=e.dal.setProjectWorkflowEnabled(ee(s,"id"),!0);return i===null?s.notFound():D(s,i,de)}),t.post("/api/projects/workflows/:id/disable",s=>{let i=e.dal.setProjectWorkflowEnabled(ee(s,"id"),!1);return i===null?s.notFound():D(s,i,de)}),t.get("/api/projects/:name/issues",s=>{let i=e.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=$w(s.req.query("status"),Lj);if(typeof o=="string")return s.text(o,400);let a=$w(s.req.query("severity"),Fw);return typeof a=="string"?s.text(a,400):D(s,e.dal.listIssues(i.id,{...o!==void 0?{status:o}:{},...a!==void 0?{severity:a}:{},...s.req.query("ai_test_path")!==void 0?{ai_test_path:s.req.query("ai_test_path")}:{}}),Dj)}),t.post("/api/projects/:name/issues",async s=>{let i=e.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=await Tn(s);if(typeof o=="string")return s.text(o,400);let a=typeof o.title=="string"&&o.title.trim().length>0?o.title:null,l=typeof o.body=="string"?o.body:null;if(a===null||l===null)return s.text("missing title or body",400);let c=$j(o.severity);if(typeof c=="object")return s.text(c.error,400);let d=Oj(o.labels);if(typeof d=="string"&&d.startsWith("error:"))return s.text(d.slice(6),400);let u=e.dal.createIssue({project_id:i.id,title:a,body:l,...c!==void 0?{severity:c}:{},labels:d,ai_test_path:typeof o.ai_test_path=="string"?o.ai_test_path:null,source_run_id:typeof o.source_run_id=="number"?o.source_run_id:null});return D(s,u,de)}),t.get("/api/issues/:id",s=>{let i=e.dal.getIssue(ee(s,"id"));return i===null?s.notFound():D(s,i,de)}),t.post("/api/issues/:id/claim",async s=>{let i=ee(s,"id"),o=e.dal.getIssue(i);if(o===null)return s.notFound();let a=await Tn(s);if(typeof a=="string")return s.json({error:a},400);let l=typeof a.assigned_run_id=="number"?a.assigned_run_id:null;if(l===null)return s.json({error:"missing assigned_run_id"},400);let c=e.dal.claimIssue(i,l);return c===null?s.json({error:`issue ${i} is not in a claimable state (status=${o.status})`},400):D(s,c,de)}),t.post("/api/projects/:name/issues/claim-next",async s=>{let i=e.dal.findProjectByName(s.req.param("name"));if(i===null)return s.json({error:"project_not_found"},404);let o=await Tn(s);if(typeof o=="string")return s.json({error:o},400);let a=typeof o.assigned_run_id=="number"?o.assigned_run_id:null;if(a===null)return s.json({error:"missing assigned_run_id"},400);let l=e.dal.claimNextIssue(i.id,a);return l===null?s.json({status:"queue_empty"},404):D(s,l,de)}),t.post("/api/issues/:id/close",async s=>{let i=e.dal.getIssue(ee(s,"id"));if(i===null)return s.notFound();let o=await Tn(s);if(typeof o=="string")return s.json({error:o},400);let a=typeof o.closed_run_id=="number"?o.closed_run_id:i.assigned_run_id;if(a===null)return s.json({error:"missing closed_run_id"},400);try{return D(s,e.dal.closeIssue(ee(s,"id"),a,typeof o.commit_hash=="string"?o.commit_hash:null),de)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),t.post("/api/issues/:id/reopen",async s=>{let i=e.dal.getIssue(ee(s,"id"));if(i===null)return s.notFound();let o=await Tn(s);if(typeof o=="string")return s.json({error:o},400);let a=typeof o.source_run_id=="number"?o.source_run_id:i.closed_run_id??i.source_run_id;if(a===null)return s.json({error:"missing source_run_id"},400);try{return D(s,e.dal.reopenIssue(ee(s,"id"),a),de)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),t.get("/api/projects/:name",s=>{let i=e.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=i.name.indexOf("/"),a=o>0?i.name.slice(0,o):null,l=o>0?i.name.slice(o+1):i.name;return D(s,{...i,owner:a,repo:l},de)}),t.get("/api/runs/:run_id/artifacts",s=>{let i=ee(s,"run_id"),o=s.req.query("kind"),a=Rr(e.dal,i,o);return D(s,a,de)}),t.get("/api/runs/:run_id/artifacts/:kind",async s=>{let i=ee(s,"run_id"),o=s.req.param("kind"),a=Rr(e.dal,i,o);if(a.length===0)return s.notFound();let l=a[a.length-1],c=s.req.query("raw")==="true";if(l.content!==null&&l.content!==void 0)return c?s.text(l.content):D(s,l,de);if(l.path!==null&&l.path!==void 0){if(c)try{let{readFileSync:d}=await import("node:fs"),u=xj(l.path);if(Aj(u)){let h=d(l.path,"utf8");return s.body(h,200,{"Content-Type":u})}let f=d(l.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength),p=yj(l.path);return s.body(m,200,{"Content-Type":u,"Content-Disposition":`attachment; filename="${p}"`})}catch(d){return s.text(`failed to read artifact path: ${d.message}`,500)}return D(s,l,de)}return D(s,l,de)}),t.get("/api/runs",s=>D(s,sn(e.dal,{limit:qd(s,"limit")??100}),Wj)),t.get("/api/runs/:id",s=>{let i=Ar(e.dal,ee(s,"id"));return i===null?s.notFound():D(s,i,Bj)}),t.get("/api/runs/:id/where",s=>{let i=on(e.dal,ee(s,"id"));return i===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(qi(i)):s.json(i)}),t.get("/api/runs/:id/timeline",s=>{let i=Hi(e.dal,ee(s,"id"));return i===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(Ji(i)):s.json(i)}),t.post("/api/runs/:id/resume",async s=>{let i=s.req.query("outcome");if(i===void 0||i.length===0){let a=s.req.header("content-type")??"";if(a.includes("application/x-www-form-urlencoded")||a.includes("multipart/form-data")){let c=(await s.req.parseBody().catch(()=>({}))).outcome;typeof c=="string"&&c.length>0&&(i=c)}}if(i===void 0||i.length===0)return s.text("missing outcome",400);let o=e.dal.resumeRun(ee(s,"id"),i);return!o.resumed&&o.reason==="run_not_found"?s.notFound():o.resumed?(Yo(e.daemon),D(s,o,Ow)):D(s,o,Ow,400)}),t.post("/api/interactive/:step_id/respond",async s=>{let i=ee(s,"step_id"),o,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let d=await s.req.json();typeof d.input=="string"&&(o=d.input),d.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let d=await s.req.parseBody().catch(()=>({}));typeof d.input=="string"&&(o=d.input),(d.done==="true"||d.done===!0)&&(a=!0)}if(o===void 0)return s.text("missing input",400);let c=e.dal.resumeInteractive(i,o,a);return!c.resumed&&c.reason==="not_found"?s.notFound():c.resumed?(Yo(e.daemon),s.json({resumed:!0,session_status:c.session.status})):s.json({resumed:!1,reason:c.reason},400)}),t.get("/api/runs/:id/steps/:step_id",s=>Lw(s,e.dal,i=>D(s,i,Hj))),t.get("/api/runs/:id/steps/:step_id/transcript",s=>{let i=b_(e.dal,ee(s,"id"),ee(s,"step_id"));return i===null?s.notFound():Pw(s)?s.html(`<pre>${b(i)}</pre>`):s.req.header("accept")?.includes("text/plain")?s.text(i):s.json({transcript:i})}),t.get("/api/runs/:id/steps/:step_id/messages",s=>Lw(s,e.dal,i=>{let o=dw(i);return D(s,o,a=>me(["role","text"],a.map(l=>[b(l.role),b(l.text)])))})),t.get("/api/external-objects",s=>D(s,S_(e.dal,{type:s.req.query("type")}),Jj)),t.get("/api/external-signals",s=>D(s,v_(e.dal,{unhandled:s.req.query("unhandled")==="true"}),Xj)),t.get("/api/attentions",s=>D(s,or(e.dal,{unacked:s.req.query("unacked")==="true"}),Gj)),t.post("/api/attentions/:id/ack",s=>{let i=e.dal.acknowledgeAttention(ee(s,"id"));return i===null?s.notFound():D(s,i,o=>`<p>acknowledged attention ${b(o.id)}</p>`)}),t.get("/api/escalations",s=>{let i=s.req.query("project"),o=s.req.query("all")==="true",a=s.req.query("since"),l={all:o};i!==void 0&&(l.project=i),a!==void 0&&(l.since=a);let c=Bi(e.dal,l);return D(s,c,d=>`<h1>Escalations</h1>${me(["attention_id","project","run","workflow","state","prompt"],d.map(u=>[b(u.attention_id),b(u.project),b(u.run_id),b(u.workflow_name),b(u.state_name),b((u.prompt??"").slice(0,120))]))}`)}),t.get("/api/escalations/:id",s=>{let i=kt(e.dal,ee(s,"id"));return i===null?s.notFound():D(s,i,de)}),t.post("/api/escalations/:id/respond",async s=>{let i=ee(s,"id"),o,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let m=await s.req.json();typeof m.input=="string"&&(o=m.input),m.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let m=await s.req.parseBody().catch(()=>({}));typeof m.input=="string"&&(o=m.input),(m.done==="true"||m.done===!0)&&(a=!0)}if(o===void 0)return s.text("missing input",400);let c=kt(e.dal,i);if(c===null)return s.notFound();let d=or(e.dal).find(m=>m.id===i);if(d===void 0)return s.notFound();if(d.kind==="workflow_escalation"){let m=e.dal.resumeEscalation(i,o);if(!m.resumed)return s.json({ok:!1,reason:m.reason},400);Yo(e.daemon);let p=or(e.dal).find(h=>h.id===i);return s.json({ok:!0,attention_id:i,run_id:m.run.id,decision:o,session_status:"escalation_resumed",acknowledged_at:p?.acknowledged_at??null})}if(d.kind!=="interactive_waiting_operator")return s.json({ok:!1,reason:"wrong_kind",kind:d.kind},400);if(d.acknowledged_at!==null)return s.json({ok:!1,reason:"already_acked"},400);if(c.step_id===null)return s.json({ok:!1,reason:"no_step"},400);let u=e.dal.resumeInteractive(c.step_id,o,a);if(!u.resumed)return s.json({ok:!1,reason:u.reason,step_id:c.step_id},400);let f=e.dal.acknowledgeAttention(i);return Yo(e.daemon),s.json({ok:!0,attention_id:i,step_id:c.step_id,session_status:u.session.status,acknowledged_at:f?.acknowledged_at??null})}),t.get("/api/submitted-prs",s=>{let i=s.req.query("pr_url"),o=s.req.query("status"),a=w_(e.dal,{status:o,pr_url:i});return D(s,a,Vj)}),t.get("/api/submitted-prs/:id",s=>{let i=ee(s,"id"),o=E_(e.dal,i);return o===null?s.notFound():D(s,o,Kj)}),t.get("/api/sessions",s=>D(s,e.dal.latestSessionSizes(),Cw)),t.get("/api/sessions/:team_name/:alias/history",s=>{let i=ss(s.req.param("team_name"));return D(s,e.dal.sessionSizeHistory(i,s.req.param("alias")),Cw)}),t.post("/api/sessions/:team_name/:alias/compact",async s=>{let i=ss(s.req.param("team_name"));try{let o=await d_(e.dal,i,s.req.param("alias"));return D(s,o,a=>Mw("compacted",a.row))}catch(o){if(o instanceof ns)return s.text(o.message,409);throw o}}),t.post("/api/sessions/:team_name/:alias/refresh",async s=>{let i=ss(s.req.param("team_name")),o=await yc(e.dal,i,s.req.param("alias"));return D(s,o,a=>Mw(`refreshed ${a.sessionid}`,a.row))}),t.get("/api/intake/state",s=>D(s,r,jw)),t.post("/api/intake/scan",async s=>(r=await ao(e.dal),D(s,r,jw))),t.get("/api/stats/run-throughput",s=>D(s,N_(e.dal),Yj)),t.get("/api/daemon/state",s=>D(s,e.daemon?.state??null,zj)),t.post("/api/daemon/cycle",async s=>{if(e.daemon===void 0)return D(s,{disabled:!0},de);let i=await e.daemon.runCycle();return D(s,{state:e.daemon.state,result:i},de)}),t.get("/metrics/:project_id",s=>{let i=ee(s,"project_id"),o=e.dal.getProject(i);if(o===null)return s.notFound();let a=kc(e.dal,i),l=Ic(e.dal,{project_id:i});return s.html(Re(`Metrics \u2014 ${o.name}`,Zj(o.name,a,l)))}),t.get("/api/metrics/reviewer/:project_id",s=>{let i=ee(s,"project_id");if(e.dal.getProject(i)===null)return s.notFound();let o=qd(s,"since_days");return s.json(kc(e.dal,i,o))}),t.get("/api/metrics/tools/:project_id",s=>{let i=ee(s,"project_id");if(e.dal.getProject(i)===null)return s.notFound();let o=qd(s,"since_days");return s.json(Ic(e.dal,{project_id:i,since_days:o}))}),t.post("/api/drift/:id/ack",s=>{let i=e.dal.acknowledgeDriftSignal(ee(s,"id"));return i===null?s.notFound():s.json({id:i.id,acknowledged_at:i.acknowledged_at})}),t}function Lw(e,t,r){let n=vc(t,ee(e,"id"),ee(e,"step_id"));return n===null?e.notFound():r(n)}function Yo(e){e!==void 0&&e.runCycle().catch(()=>{})}function D(e,t,r,n=200){return Pw(e)?n===200?e.html(r(t)):e.html(r(t),400):new Response(JSON.stringify(t),{status:n,headers:{"Content-Type":"application/json; charset=UTF-8"}})}function Pw(e){let t=e.req.header("accept")??"";return t.includes("text/html")&&!t.includes("application/json")}function Ij(){let e=process.env.LMCTL_WEBUI_DIST;if(e!==void 0)return Ko(`${e}/index.html`)?Hd(e):null;let t="src/serve/webui-dist";if(Ko(`${t}/index.html`))return t;let r="dist/serve/webui-dist";if(Ko(`${r}/index.html`))return r;let n=bj(wj(vj(import.meta.url)),"webui-dist");return Ko(`${n}/index.html`)?Hd(n):null}function Hd(e){if(!Tj(e))return e;let t=Sj(process.cwd(),e);return t.length===0?".":t}function Nj(){return async(e,t)=>{await t(),e.header("Cache-Control","no-store")}}function ee(e,t){return Number(e.req.param(t))}function qd(e,t){let r=e.req.query(t);if(r===void 0)return;let n=Number(r);return Number.isInteger(n)&&n>0?n:void 0}function xj(e){switch(Ej(e).toLowerCase()){case".txt":return"text/plain; charset=utf-8";case".md":return"text/markdown; charset=utf-8";case".html":case".htm":return"text/html; charset=utf-8";case".css":return"text/css; charset=utf-8";case".csv":return"text/csv; charset=utf-8";case".json":return"application/json; charset=utf-8";case".xml":return"application/xml; charset=utf-8";case".yaml":case".yml":return"text/yaml; charset=utf-8";case".js":case".mjs":case".cjs":return"text/javascript; charset=utf-8";case".ts":return"text/x-typescript; charset=utf-8";case".log":return"text/plain; charset=utf-8";case".docx":return"application/vnd.openxmlformats-officedocument.wordprocessingml.document";case".xlsx":return"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";case".pptx":return"application/vnd.openxmlformats-officedocument.presentationml.presentation";case".pdf":return"application/pdf";case".png":return"image/png";case".jpg":case".jpeg":return"image/jpeg";case".gif":return"image/gif";case".webp":return"image/webp";case".zip":return"application/zip";case".gz":return"application/gzip";default:return"application/octet-stream"}}function Aj(e){return!!(e.startsWith("text/")||e.startsWith("application/json")||e.startsWith("application/xml"))}async function Tn(e){try{let t=await e.req.json();return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:"invalid JSON body"}catch{return"invalid JSON body"}}function Rj(e){if(e==null)return null;if(typeof e=="string"){try{let t=JSON.parse(e);if(t!==null&&typeof t=="object"&&!Array.isArray(t))return JSON.stringify(t)}catch{return"error:invalid parameters_override JSON"}return"error:parameters_override must be a JSON object"}return typeof e=="object"&&!Array.isArray(e)?JSON.stringify(e):"error:parameters_override must be a JSON object"}function $w(e,t){if(e===void 0||e.length===0)return;let r=e.split(",").map(n=>n.trim()).filter(n=>n.length>0);if(r.length!==0){for(let n of r)if(!t.includes(n))return`invalid value: ${n}`;return r}}function $j(e){if(e!=null)return typeof e=="string"&&Fw.includes(e)?e:{error:`invalid severity: ${String(e)}`}}function Oj(e){if(e==null)return null;if(typeof e=="string")try{let t=JSON.parse(e);return Array.isArray(t)&&t.every(r=>typeof r=="string")?JSON.stringify(t):"error:labels must be a JSON string array"}catch{return"error:invalid labels JSON"}return Array.isArray(e)&&e.every(t=>typeof t=="string")?JSON.stringify(e):"error:labels must be a JSON string array"}function Cj(e){return`<h1>Status</h1><div class="grid">
1965
+ `))),t.post("/login",async s=>{let i=await s.req.parseBody(),o=typeof i.token=="string"?i.token:"";return Eh(o)?(Vc(s,o),s.redirect("/",302)):s.html(Re("Login","<p>Invalid token</p>"),401)}),t.post("/logout",s=>(Th(s),s.redirect("/login",302))),Ny(t,{dal:e.dal}),bw(t,{dal:e.dal}),Hy(t,{dal:e.dal}),tw(t,{terminalSessionManager:e.terminalSessionManager}),aw(t,{persistentSessionManager:e.persistentSessionManager}),t.post("/api/teams/:team_name/refresh",async s=>{let i=ss(s.req.param("team_name")),o=e.dal.findTeamByName(i);if(o===null)return s.notFound();let a=[],c=e.dal.db.transaction(()=>{let f=e.dal.listTeamMembers(o.id),m=f.filter(p=>p.state!=="idle");if(m.length>0)return{ok:!1,nonIdle:m.map(p=>({alias:p.alias,state:p.state}))};for(let p of f)e.dal.setMemberState(p.id,"in_chat","refreshing");return a=f.map(p=>({id:p.id,alias:p.alias})),{ok:!0}})();if(!c.ok){let f=c.nonIdle.map(m=>`${m.alias}:${m.state}`).join(", ");return s.text(`refresh refused: non-idle members: ${f}`,409)}let d=[],u=[];for(let f of a)try{await yc(e.dal,i,f.alias),e.dal.setMemberState(f.id,"idle",null),d.push(f.alias)}catch(m){let p=m instanceof Error?m.message:String(m);e.dal.setMemberState(f.id,"attention_needed",`refresh failed: ${p}`),u.push({alias:f.alias,error:p})}return D(s,{team:i,seeded:d,failed:u},f=>`<p>refreshed team ${b(f.team)}: seeded [${f.seeded.map(m=>b(m)).join(", ")}]${f.failed.length>0?` failed [${f.failed.map(m=>`${b(m.alias)}: ${b(m.error)}`).join(", ")}]`:""}</p>`)}),xh(t,{dal:e.dal}),Mh(t,{dal:e.dal}),t.get("/api/status",s=>D(s,Pi(e.dal),Cj)),t.get("/api/projects",s=>D(s,Fi(e.dal),Mj)),t.get("/api/teams",s=>D(s,g_(e.dal),Pj)),t.get("/api/workflows",s=>D(s,Ui(e.dal),Fj)),t.get("/api/workflows/verify",s=>{let i=uy();return s.req.header("accept")?.includes("text/plain")?s.text(my(i)):s.json(i)}),t.get("/api/jobs",s=>D(s,y_(e.dal,{status:s.req.query("status")}),Uj)),t.post("/api/uploads",s=>Aw(s,e.dal)),t.get("/api/jobs/:id",s=>{let i=Wi(e.dal,ee(s,"id"));return i===null?s.notFound():D(s,i,de)}),t.post("/api/jobs",async s=>{let i;try{i=await s.req.json()}catch{return s.text("invalid JSON body",400)}let o=null;if(typeof i.project_id=="number")o=i.project_id;else if(typeof i.project=="string"){let f=e.dal.findProjectByName(i.project);if(f===null)return s.text(`project not found: ${i.project}`,404);o=f.id}else{let f=e.dal.listProjects();f.length===1&&(o=f[0].id)}if(o===null)return s.text("missing project or project_id",400);let a=typeof i.workflow_id_override=="number"?i.workflow_id_override:null;if(a===null&&typeof i.workflow=="string"){let f=e.dal.getWorkflowByName(i.workflow);if(f===null)return s.text(`workflow not found: ${i.workflow}`,404);a=f.id}let l=typeof i.source=="string"?i.source:"manual",c=i.payload,d=c==null?null:typeof c=="string"?c:JSON.stringify(c),u=e.dal.enqueueJob({project_id:o,workflow_id_override:a,source:l,source_ref:typeof i.source_ref=="string"?i.source_ref:null,payload:d,priority:typeof i.priority=="number"?i.priority:0,dedupe_key:typeof i.dedupe_key=="string"?i.dedupe_key:null});return D(s,u,de)}),t.post("/api/jobs/:id/run",async s=>{let{runJobById:i}=await Promise.resolve().then(()=>(Ro(),Sy)),o=Wi(e.dal,ee(s,"id"));if(o===null)return s.notFound();let a=await i({dal:e.dal,worker_id:`api-job-run-${process.pid}-${Date.now()}`,job_id:o.id});return a.claimed?s.json({job_id:a.job_id,run_id:a.run_id,status:a.status,terminal_state:a.terminal_state,ms:a.ms}):s.json(a,409)}),t.get("/api/workflows/:name",s=>{let i=e.dal.getWorkflowByName(s.req.param("name"));return i===null?s.notFound():D(s,i,de)}),t.get("/api/projects/:name/workflows",s=>{let i=e.dal.findProjectByName(s.req.param("name"));return i===null?s.notFound():D(s,e.dal.listProjectWorkflows(i.id),jj)}),t.post("/api/projects/:name/workflows",async s=>{let i=e.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=await Tn(s);if(typeof o=="string")return s.text(o,400);let a=typeof o.workflow=="string"?o.workflow:null,l=typeof o.workflow_id=="number"?o.workflow_id:null,c=l!==null?e.dal.getWorkflow(l):a!==null?e.dal.getWorkflowByName(a):null;if(c===null)return s.text("workflow not found",404);let d=typeof o.condition=="string"&&o.condition.length>0?o.condition:null;if(d!==null)try{an(d)}catch{return s.text("invalid condition",400)}let u=Rj(o.parameters_override??o.params);if(typeof u=="string"&&u.startsWith("error:"))return s.text(u.slice(6),400);let f=typeof o.priority=="number"&&Number.isInteger(o.priority)?o.priority:100,m=e.dal.insertProjectWorkflow({project_id:i.id,workflow_id:c.id,condition:d,parameters_override:u,priority:f});return D(s,m,de)}),t.get("/api/projects/workflows/:id",s=>{let i=e.dal.getProjectWorkflow(ee(s,"id"));return i===null?s.notFound():D(s,i,de)}),t.delete("/api/projects/workflows/:id",s=>e.dal.removeProjectWorkflow(ee(s,"id"))?D(s,{removed:!0},de):s.notFound()),t.post("/api/projects/workflows/:id/enable",s=>{let i=e.dal.setProjectWorkflowEnabled(ee(s,"id"),!0);return i===null?s.notFound():D(s,i,de)}),t.post("/api/projects/workflows/:id/disable",s=>{let i=e.dal.setProjectWorkflowEnabled(ee(s,"id"),!1);return i===null?s.notFound():D(s,i,de)}),t.get("/api/projects/:name/issues",s=>{let i=e.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=Ow(s.req.query("status"),Lj);if(typeof o=="string")return s.text(o,400);let a=Ow(s.req.query("severity"),Fw);return typeof a=="string"?s.text(a,400):D(s,e.dal.listIssues(i.id,{...o!==void 0?{status:o}:{},...a!==void 0?{severity:a}:{},...s.req.query("ai_test_path")!==void 0?{ai_test_path:s.req.query("ai_test_path")}:{}}),Dj)}),t.post("/api/projects/:name/issues",async s=>{let i=e.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=await Tn(s);if(typeof o=="string")return s.text(o,400);let a=typeof o.title=="string"&&o.title.trim().length>0?o.title:null,l=typeof o.body=="string"?o.body:null;if(a===null||l===null)return s.text("missing title or body",400);let c=Oj(o.severity);if(typeof c=="object")return s.text(c.error,400);let d=$j(o.labels);if(typeof d=="string"&&d.startsWith("error:"))return s.text(d.slice(6),400);let u=e.dal.createIssue({project_id:i.id,title:a,body:l,...c!==void 0?{severity:c}:{},labels:d,ai_test_path:typeof o.ai_test_path=="string"?o.ai_test_path:null,source_run_id:typeof o.source_run_id=="number"?o.source_run_id:null});return D(s,u,de)}),t.get("/api/issues/:id",s=>{let i=e.dal.getIssue(ee(s,"id"));return i===null?s.notFound():D(s,i,de)}),t.post("/api/issues/:id/claim",async s=>{let i=ee(s,"id"),o=e.dal.getIssue(i);if(o===null)return s.notFound();let a=await Tn(s);if(typeof a=="string")return s.json({error:a},400);let l=typeof a.assigned_run_id=="number"?a.assigned_run_id:null;if(l===null)return s.json({error:"missing assigned_run_id"},400);let c=e.dal.claimIssue(i,l);return c===null?s.json({error:`issue ${i} is not in a claimable state (status=${o.status})`},400):D(s,c,de)}),t.post("/api/projects/:name/issues/claim-next",async s=>{let i=e.dal.findProjectByName(s.req.param("name"));if(i===null)return s.json({error:"project_not_found"},404);let o=await Tn(s);if(typeof o=="string")return s.json({error:o},400);let a=typeof o.assigned_run_id=="number"?o.assigned_run_id:null;if(a===null)return s.json({error:"missing assigned_run_id"},400);let l=e.dal.claimNextIssue(i.id,a);return l===null?s.json({status:"queue_empty"},404):D(s,l,de)}),t.post("/api/issues/:id/close",async s=>{let i=e.dal.getIssue(ee(s,"id"));if(i===null)return s.notFound();let o=await Tn(s);if(typeof o=="string")return s.json({error:o},400);let a=typeof o.closed_run_id=="number"?o.closed_run_id:i.assigned_run_id;if(a===null)return s.json({error:"missing closed_run_id"},400);try{return D(s,e.dal.closeIssue(ee(s,"id"),a,typeof o.commit_hash=="string"?o.commit_hash:null),de)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),t.post("/api/issues/:id/reopen",async s=>{let i=e.dal.getIssue(ee(s,"id"));if(i===null)return s.notFound();let o=await Tn(s);if(typeof o=="string")return s.json({error:o},400);let a=typeof o.source_run_id=="number"?o.source_run_id:i.closed_run_id??i.source_run_id;if(a===null)return s.json({error:"missing source_run_id"},400);try{return D(s,e.dal.reopenIssue(ee(s,"id"),a),de)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),t.get("/api/projects/:name",s=>{let i=e.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=i.name.indexOf("/"),a=o>0?i.name.slice(0,o):null,l=o>0?i.name.slice(o+1):i.name;return D(s,{...i,owner:a,repo:l},de)}),t.get("/api/runs/:run_id/artifacts",s=>{let i=ee(s,"run_id"),o=s.req.query("kind"),a=Rr(e.dal,i,o);return D(s,a,de)}),t.get("/api/runs/:run_id/artifacts/:kind",async s=>{let i=ee(s,"run_id"),o=s.req.param("kind"),a=Rr(e.dal,i,o);if(a.length===0)return s.notFound();let l=a[a.length-1],c=s.req.query("raw")==="true";if(l.content!==null&&l.content!==void 0)return c?s.text(l.content):D(s,l,de);if(l.path!==null&&l.path!==void 0){if(c)try{let{readFileSync:d}=await import("node:fs"),u=xj(l.path);if(Aj(u)){let h=d(l.path,"utf8");return s.body(h,200,{"Content-Type":u})}let f=d(l.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength),p=yj(l.path);return s.body(m,200,{"Content-Type":u,"Content-Disposition":`attachment; filename="${p}"`})}catch(d){return s.text(`failed to read artifact path: ${d.message}`,500)}return D(s,l,de)}return D(s,l,de)}),t.get("/api/runs",s=>D(s,sn(e.dal,{limit:qd(s,"limit")??100}),Wj)),t.get("/api/runs/:id",s=>{let i=Ar(e.dal,ee(s,"id"));return i===null?s.notFound():D(s,i,Bj)}),t.get("/api/runs/:id/where",s=>{let i=on(e.dal,ee(s,"id"));return i===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(qi(i)):s.json(i)}),t.get("/api/runs/:id/timeline",s=>{let i=Hi(e.dal,ee(s,"id"));return i===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(Ji(i)):s.json(i)}),t.post("/api/runs/:id/resume",async s=>{let i=s.req.query("outcome");if(i===void 0||i.length===0){let a=s.req.header("content-type")??"";if(a.includes("application/x-www-form-urlencoded")||a.includes("multipart/form-data")){let c=(await s.req.parseBody().catch(()=>({}))).outcome;typeof c=="string"&&c.length>0&&(i=c)}}if(i===void 0||i.length===0)return s.text("missing outcome",400);let o=e.dal.resumeRun(ee(s,"id"),i);return!o.resumed&&o.reason==="run_not_found"?s.notFound():o.resumed?(Yo(e.daemon),D(s,o,$w)):D(s,o,$w,400)}),t.post("/api/interactive/:step_id/respond",async s=>{let i=ee(s,"step_id"),o,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let d=await s.req.json();typeof d.input=="string"&&(o=d.input),d.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let d=await s.req.parseBody().catch(()=>({}));typeof d.input=="string"&&(o=d.input),(d.done==="true"||d.done===!0)&&(a=!0)}if(o===void 0)return s.text("missing input",400);let c=e.dal.resumeInteractive(i,o,a);return!c.resumed&&c.reason==="not_found"?s.notFound():c.resumed?(Yo(e.daemon),s.json({resumed:!0,session_status:c.session.status})):s.json({resumed:!1,reason:c.reason},400)}),t.get("/api/runs/:id/steps/:step_id",s=>Lw(s,e.dal,i=>D(s,i,Hj))),t.get("/api/runs/:id/steps/:step_id/transcript",s=>{let i=b_(e.dal,ee(s,"id"),ee(s,"step_id"));return i===null?s.notFound():Pw(s)?s.html(`<pre>${b(i)}</pre>`):s.req.header("accept")?.includes("text/plain")?s.text(i):s.json({transcript:i})}),t.get("/api/runs/:id/steps/:step_id/messages",s=>Lw(s,e.dal,i=>{let o=dw(i);return D(s,o,a=>me(["role","text"],a.map(l=>[b(l.role),b(l.text)])))})),t.get("/api/external-objects",s=>D(s,S_(e.dal,{type:s.req.query("type")}),Jj)),t.get("/api/external-signals",s=>D(s,v_(e.dal,{unhandled:s.req.query("unhandled")==="true"}),Xj)),t.get("/api/attentions",s=>D(s,or(e.dal,{unacked:s.req.query("unacked")==="true"}),Gj)),t.post("/api/attentions/:id/ack",s=>{let i=e.dal.acknowledgeAttention(ee(s,"id"));return i===null?s.notFound():D(s,i,o=>`<p>acknowledged attention ${b(o.id)}</p>`)}),t.get("/api/escalations",s=>{let i=s.req.query("project"),o=s.req.query("all")==="true",a=s.req.query("since"),l={all:o};i!==void 0&&(l.project=i),a!==void 0&&(l.since=a);let c=Bi(e.dal,l);return D(s,c,d=>`<h1>Escalations</h1>${me(["attention_id","project","run","workflow","state","prompt"],d.map(u=>[b(u.attention_id),b(u.project),b(u.run_id),b(u.workflow_name),b(u.state_name),b((u.prompt??"").slice(0,120))]))}`)}),t.get("/api/escalations/:id",s=>{let i=kt(e.dal,ee(s,"id"));return i===null?s.notFound():D(s,i,de)}),t.post("/api/escalations/:id/respond",async s=>{let i=ee(s,"id"),o,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let m=await s.req.json();typeof m.input=="string"&&(o=m.input),m.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let m=await s.req.parseBody().catch(()=>({}));typeof m.input=="string"&&(o=m.input),(m.done==="true"||m.done===!0)&&(a=!0)}if(o===void 0)return s.text("missing input",400);let c=kt(e.dal,i);if(c===null)return s.notFound();let d=or(e.dal).find(m=>m.id===i);if(d===void 0)return s.notFound();if(d.kind==="workflow_escalation"){let m=e.dal.resumeEscalation(i,o);if(!m.resumed)return s.json({ok:!1,reason:m.reason},400);Yo(e.daemon);let p=or(e.dal).find(h=>h.id===i);return s.json({ok:!0,attention_id:i,run_id:m.run.id,decision:o,session_status:"escalation_resumed",acknowledged_at:p?.acknowledged_at??null})}if(d.kind!=="interactive_waiting_operator")return s.json({ok:!1,reason:"wrong_kind",kind:d.kind},400);if(d.acknowledged_at!==null)return s.json({ok:!1,reason:"already_acked"},400);if(c.step_id===null)return s.json({ok:!1,reason:"no_step"},400);let u=e.dal.resumeInteractive(c.step_id,o,a);if(!u.resumed)return s.json({ok:!1,reason:u.reason,step_id:c.step_id},400);let f=e.dal.acknowledgeAttention(i);return Yo(e.daemon),s.json({ok:!0,attention_id:i,step_id:c.step_id,session_status:u.session.status,acknowledged_at:f?.acknowledged_at??null})}),t.get("/api/submitted-prs",s=>{let i=s.req.query("pr_url"),o=s.req.query("status"),a=w_(e.dal,{status:o,pr_url:i});return D(s,a,Vj)}),t.get("/api/submitted-prs/:id",s=>{let i=ee(s,"id"),o=E_(e.dal,i);return o===null?s.notFound():D(s,o,Kj)}),t.get("/api/sessions",s=>D(s,e.dal.latestSessionSizes(),Cw)),t.get("/api/sessions/:team_name/:alias/history",s=>{let i=ss(s.req.param("team_name"));return D(s,e.dal.sessionSizeHistory(i,s.req.param("alias")),Cw)}),t.post("/api/sessions/:team_name/:alias/compact",async s=>{let i=ss(s.req.param("team_name"));try{let o=await d_(e.dal,i,s.req.param("alias"));return D(s,o,a=>Mw("compacted",a.row))}catch(o){if(o instanceof ns)return s.text(o.message,409);throw o}}),t.post("/api/sessions/:team_name/:alias/refresh",async s=>{let i=ss(s.req.param("team_name")),o=await yc(e.dal,i,s.req.param("alias"));return D(s,o,a=>Mw(`refreshed ${a.sessionid}`,a.row))}),t.get("/api/intake/state",s=>D(s,r,jw)),t.post("/api/intake/scan",async s=>(r=await ao(e.dal),D(s,r,jw))),t.get("/api/stats/run-throughput",s=>D(s,N_(e.dal),Yj)),t.get("/api/daemon/state",s=>D(s,e.daemon?.state??null,zj)),t.post("/api/daemon/cycle",async s=>{if(e.daemon===void 0)return D(s,{disabled:!0},de);let i=await e.daemon.runCycle();return D(s,{state:e.daemon.state,result:i},de)}),t.get("/metrics/:project_id",s=>{let i=ee(s,"project_id"),o=e.dal.getProject(i);if(o===null)return s.notFound();let a=kc(e.dal,i),l=Ic(e.dal,{project_id:i});return s.html(Re(`Metrics \u2014 ${o.name}`,Zj(o.name,a,l)))}),t.get("/api/metrics/reviewer/:project_id",s=>{let i=ee(s,"project_id");if(e.dal.getProject(i)===null)return s.notFound();let o=qd(s,"since_days");return s.json(kc(e.dal,i,o))}),t.get("/api/metrics/tools/:project_id",s=>{let i=ee(s,"project_id");if(e.dal.getProject(i)===null)return s.notFound();let o=qd(s,"since_days");return s.json(Ic(e.dal,{project_id:i,since_days:o}))}),t.post("/api/drift/:id/ack",s=>{let i=e.dal.acknowledgeDriftSignal(ee(s,"id"));return i===null?s.notFound():s.json({id:i.id,acknowledged_at:i.acknowledged_at})}),t}function Lw(e,t,r){let n=vc(t,ee(e,"id"),ee(e,"step_id"));return n===null?e.notFound():r(n)}function Yo(e){e!==void 0&&e.runCycle().catch(()=>{})}function D(e,t,r,n=200){return Pw(e)?n===200?e.html(r(t)):e.html(r(t),400):new Response(JSON.stringify(t),{status:n,headers:{"Content-Type":"application/json; charset=UTF-8"}})}function Pw(e){let t=e.req.header("accept")??"";return t.includes("text/html")&&!t.includes("application/json")}function Ij(){let e=process.env.LMCTL_WEBUI_DIST;if(e!==void 0)return Ko(`${e}/index.html`)?Hd(e):null;let t="src/serve/webui-dist";if(Ko(`${t}/index.html`))return t;let r="dist/serve/webui-dist";if(Ko(`${r}/index.html`))return r;let n=bj(wj(vj(import.meta.url)),"webui-dist");return Ko(`${n}/index.html`)?Hd(n):null}function Hd(e){if(!Tj(e))return e;let t=Sj(process.cwd(),e);return t.length===0?".":t}function Nj(){return async(e,t)=>{await t(),e.header("Cache-Control","no-store")}}function ee(e,t){return Number(e.req.param(t))}function qd(e,t){let r=e.req.query(t);if(r===void 0)return;let n=Number(r);return Number.isInteger(n)&&n>0?n:void 0}function xj(e){switch(Ej(e).toLowerCase()){case".txt":return"text/plain; charset=utf-8";case".md":return"text/markdown; charset=utf-8";case".html":case".htm":return"text/html; charset=utf-8";case".css":return"text/css; charset=utf-8";case".csv":return"text/csv; charset=utf-8";case".json":return"application/json; charset=utf-8";case".xml":return"application/xml; charset=utf-8";case".yaml":case".yml":return"text/yaml; charset=utf-8";case".js":case".mjs":case".cjs":return"text/javascript; charset=utf-8";case".ts":return"text/x-typescript; charset=utf-8";case".log":return"text/plain; charset=utf-8";case".docx":return"application/vnd.openxmlformats-officedocument.wordprocessingml.document";case".xlsx":return"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";case".pptx":return"application/vnd.openxmlformats-officedocument.presentationml.presentation";case".pdf":return"application/pdf";case".png":return"image/png";case".jpg":case".jpeg":return"image/jpeg";case".gif":return"image/gif";case".webp":return"image/webp";case".zip":return"application/zip";case".gz":return"application/gzip";default:return"application/octet-stream"}}function Aj(e){return!!(e.startsWith("text/")||e.startsWith("application/json")||e.startsWith("application/xml"))}async function Tn(e){try{let t=await e.req.json();return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:"invalid JSON body"}catch{return"invalid JSON body"}}function Rj(e){if(e==null)return null;if(typeof e=="string"){try{let t=JSON.parse(e);if(t!==null&&typeof t=="object"&&!Array.isArray(t))return JSON.stringify(t)}catch{return"error:invalid parameters_override JSON"}return"error:parameters_override must be a JSON object"}return typeof e=="object"&&!Array.isArray(e)?JSON.stringify(e):"error:parameters_override must be a JSON object"}function Ow(e,t){if(e===void 0||e.length===0)return;let r=e.split(",").map(n=>n.trim()).filter(n=>n.length>0);if(r.length!==0){for(let n of r)if(!t.includes(n))return`invalid value: ${n}`;return r}}function Oj(e){if(e!=null)return typeof e=="string"&&Fw.includes(e)?e:{error:`invalid severity: ${String(e)}`}}function $j(e){if(e==null)return null;if(typeof e=="string")try{let t=JSON.parse(e);return Array.isArray(t)&&t.every(r=>typeof r=="string")?JSON.stringify(t):"error:labels must be a JSON string array"}catch{return"error:invalid labels JSON"}return Array.isArray(e)&&e.every(t=>typeof t=="string")?JSON.stringify(e):"error:labels must be a JSON string array"}function Cj(e){return`<h1>Status</h1><div class="grid">
1966
1966
  <div class="metric"><strong>${e.jobs.queued}</strong><br>queued jobs</div>
1967
1967
  <div class="metric"><strong>${e.jobs.done}</strong><br>done jobs</div>
1968
1968
  <div class="metric"><strong>${e.runs.active}</strong><br>active runs</div>
@@ -1982,7 +1982,7 @@ ${p.text}`,["approve","request_changes"],!0,s,t.writes_to_project_path===!0)));i
1982
1982
  </fieldset>
1983
1983
  </form>
1984
1984
  <div id="pause-result" style="margin-top:0.6em;"></div>
1985
- </section>`}function Hj(e){return`<section><h3>${b(e.state_name)}</h3>${de(e)}<p><a hx-get="/api/runs/${e.run_id}/steps/${e.id}/transcript" hx-target="closest section" hx-swap="beforeend">Transcript</a> <a hx-get="/api/runs/${e.run_id}/steps/${e.id}/messages" hx-target="closest section" hx-swap="beforeend">Messages</a></p></section>`}function Ow(e){return e.resumed?`<p>resumed run ${b(e.run.id)}</p>`:`<p>resume failed: ${b(e.reason)}</p>`}function Jj(e){return`<h1>External Objects</h1>${me(["id","type","provider","external_id","status","url"],e.map(t=>[b(t.id),b(t.type),b(t.provider),b(t.external_id),b(t.status),b(t.url)]))}`}function Xj(e){return`<h1>External Signals</h1>${me(["id","object","kind","handled"],e.map(t=>[b(t.id),b(t.object_id),b(t.kind),b(t.handled_at)]))}`}function Gj(e){let t=`<style>
1985
+ </section>`}function Hj(e){return`<section><h3>${b(e.state_name)}</h3>${de(e)}<p><a hx-get="/api/runs/${e.run_id}/steps/${e.id}/transcript" hx-target="closest section" hx-swap="beforeend">Transcript</a> <a hx-get="/api/runs/${e.run_id}/steps/${e.id}/messages" hx-target="closest section" hx-swap="beforeend">Messages</a></p></section>`}function $w(e){return e.resumed?`<p>resumed run ${b(e.run.id)}</p>`:`<p>resume failed: ${b(e.reason)}</p>`}function Jj(e){return`<h1>External Objects</h1>${me(["id","type","provider","external_id","status","url"],e.map(t=>[b(t.id),b(t.type),b(t.provider),b(t.external_id),b(t.status),b(t.url)]))}`}function Xj(e){return`<h1>External Signals</h1>${me(["id","object","kind","handled"],e.map(t=>[b(t.id),b(t.object_id),b(t.kind),b(t.handled_at)]))}`}function Gj(e){let t=`<style>
1986
1986
  @keyframes attn-flicker { 0%,100%{background:#fff8e6;} 50%{background:#ffd766;} }
1987
1987
  tr.requires-user { animation: attn-flicker 1.4s ease-in-out infinite; font-weight:600; }
1988
1988
  tr.requires-user td:first-child::before { content:"\u2605 "; color:#d28e00; }
@@ -1996,7 +1996,7 @@ ${p.text}`,["approve","request_changes"],!0,s,t.writes_to_project_path===!0)));i
1996
1996
  <dt>submitted_at</dt><dd>${b(e.submitted_at)}</dd>
1997
1997
  <dt>last_scanned_at</dt><dd>${b(e.last_scanned_at??"\u2014")}</dd>
1998
1998
  <dt>last_known_state</dt><dd>${b(e.last_known_state??"\u2014")}</dd>
1999
- </dl>`}function Cw(e){return`<h1>Sessions</h1>${me(["team","alias","session","input","cache","output","total","observed","actions"],e.map(t=>{let r=Oi(t.team_name),n=encodeURIComponent(t.alias);return[b(t.team_name),b(t.alias),b(t.sessionid),b(t.input_tokens),b(t.cache_tokens),b(t.output_tokens),b(t.total_tokens),b(t.observed_at),`<button hx-post="/api/sessions/${r}/${n}/compact" hx-swap="outerHTML">Compact</button> <button hx-post="/api/sessions/${r}/${n}/refresh" hx-swap="outerHTML">Refresh</button>`]}))}`}function Mw(e,t){return t===null?`<span>${b(e)}</span>`:`<span>${b(e)} ${b(t.team_name)}/${b(t.alias)}</span>`}function Yj(e){return`<h1>Run Throughput</h1>${me(["workflow","terminal","count"],e.map(t=>[b(t.workflow_name),b(t.terminal_state),b(t.count)]))}`}function jw(e){return`<h1>Intake</h1><button hx-post="/api/intake/scan" hx-target="main" hx-swap="innerHTML">Scan now</button>${me(["project","scanned","new jobs","error"],e.map(t=>[b(t.project_name),b(t.scanned),b(t.new_jobs),b(t.error)]))}`}function zj(e){return`<h1>Daemon</h1>${e===null?"<p>disabled</p>":`${de(e)}<button hx-post="/api/daemon/cycle" hx-target="main" hx-swap="beforeend">Run cycle now</button>`}`}function Zj(e,t,r){let n=t.request_changes_rate,s=n.by_state.map(l=>[b(l.state_name),b(l.total),b(l.request_changes),b(l.rate_pct)]),i=t.step_duration_histogram.map(l=>[b(l.state_name),b(l.lt_5min),b(l.btw_5_15min),b(l.btw_15_60min),b(l.gt_60min),b(l.no_end)]),o=t.retry_counts.map(l=>[b(l.state_name),b(l.retried_runs),b(l.avg_retries)]),a=r.map(l=>[b(l.tool_name),b(l.invocations),b(l.successes),b(l.hit_rate_pct),b(l.avg_latency_ms??"n/a"),b(l.p50_latency_ms??"n/a"),b(l.p95_latency_ms??"n/a")]);return`<h1>Metrics \u2014 ${b(e)}</h1>
1999
+ </dl>`}function Cw(e){return`<h1>Sessions</h1>${me(["team","alias","session","input","cache","output","total","observed","actions"],e.map(t=>{let r=$i(t.team_name),n=encodeURIComponent(t.alias);return[b(t.team_name),b(t.alias),b(t.sessionid),b(t.input_tokens),b(t.cache_tokens),b(t.output_tokens),b(t.total_tokens),b(t.observed_at),`<button hx-post="/api/sessions/${r}/${n}/compact" hx-swap="outerHTML">Compact</button> <button hx-post="/api/sessions/${r}/${n}/refresh" hx-swap="outerHTML">Refresh</button>`]}))}`}function Mw(e,t){return t===null?`<span>${b(e)}</span>`:`<span>${b(e)} ${b(t.team_name)}/${b(t.alias)}</span>`}function Yj(e){return`<h1>Run Throughput</h1>${me(["workflow","terminal","count"],e.map(t=>[b(t.workflow_name),b(t.terminal_state),b(t.count)]))}`}function jw(e){return`<h1>Intake</h1><button hx-post="/api/intake/scan" hx-target="main" hx-swap="innerHTML">Scan now</button>${me(["project","scanned","new jobs","error"],e.map(t=>[b(t.project_name),b(t.scanned),b(t.new_jobs),b(t.error)]))}`}function zj(e){return`<h1>Daemon</h1>${e===null?"<p>disabled</p>":`${de(e)}<button hx-post="/api/daemon/cycle" hx-target="main" hx-swap="beforeend">Run cycle now</button>`}`}function Zj(e,t,r){let n=t.request_changes_rate,s=n.by_state.map(l=>[b(l.state_name),b(l.total),b(l.request_changes),b(l.rate_pct)]),i=t.step_duration_histogram.map(l=>[b(l.state_name),b(l.lt_5min),b(l.btw_5_15min),b(l.btw_15_60min),b(l.gt_60min),b(l.no_end)]),o=t.retry_counts.map(l=>[b(l.state_name),b(l.retried_runs),b(l.avg_retries)]),a=r.map(l=>[b(l.tool_name),b(l.invocations),b(l.successes),b(l.hit_rate_pct),b(l.avg_latency_ms??"n/a"),b(l.p50_latency_ms??"n/a"),b(l.p95_latency_ms??"n/a")]);return`<h1>Metrics \u2014 ${b(e)}</h1>
2000
2000
  <h2>Request-changes rate</h2>
2001
2001
  <p>Total: ${b(n.request_changes)} of ${b(n.total)} steps (${b(n.rate_pct)})</p>
2002
2002
  ${me(["state","total steps","request_changes","rate"],s)}
@@ -2018,10 +2018,10 @@ ${p.text}`,["approve","request_changes"],!0,s,t.writes_to_project_path===!0)));i
2018
2018
  AND status = 'running'
2019
2019
  AND launch_source = 'terminal'
2020
2020
  ORDER BY started_at DESC, id DESC
2021
- LIMIT 1`,t,r)[0];return s===void 0?null:s.holder_pid!==null&&(s.holder_host===null||s.holder_host===Jd())?Zt(s.holder_pid)?s:null:Vw(s)?s:null}function Vw(e){let t=Date.parse(e.last_heartbeat_at??e.started_at);return Number.isFinite(t)?Date.now()-t<=zw():!1}function Yw(e,t){return e.holder_pid===null?e.started_at<t:!Zt(e.holder_pid)}function zw(e=process.env){let t=e.LMCTL_INFLIGHT_TTL_MS;if(t===void 0||t.trim()==="")return Xw;let r=Number(t);return!Number.isFinite(r)||r<=0?Xw:r}function aD(e=process.env){let t=e.LMCTL_TERMINAL_LOCK_STALE_MS;if(t===void 0||t.trim()==="")return Gw;let r=Number(t);return!Number.isFinite(r)||r<=0?Gw:r}var Xw,Gw,Dr=T(()=>{"use strict";il();Xw=8*60*60*1e3,Gw=12e4});async function O(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 V(e,t){return e.flags[t]===!0}function ae(e,t){e.stdout.write(`${JSON.stringify(t,null,2)}
2021
+ LIMIT 1`,t,r)[0];return s===void 0?null:s.holder_pid!==null&&(s.holder_host===null||s.holder_host===Jd())?Zt(s.holder_pid)?s:null:Vw(s)?s:null}function Vw(e){let t=Date.parse(e.last_heartbeat_at??e.started_at);return Number.isFinite(t)?Date.now()-t<=zw():!1}function Yw(e,t){return e.holder_pid===null?e.started_at<t:!Zt(e.holder_pid)}function zw(e=process.env){let t=e.LMCTL_INFLIGHT_TTL_MS;if(t===void 0||t.trim()==="")return Xw;let r=Number(t);return!Number.isFinite(r)||r<=0?Xw:r}function aD(e=process.env){let t=e.LMCTL_TERMINAL_LOCK_STALE_MS;if(t===void 0||t.trim()==="")return Gw;let r=Number(t);return!Number.isFinite(r)||r<=0?Gw:r}var Xw,Gw,Dr=T(()=>{"use strict";il();Xw=8*60*60*1e3,Gw=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 V(e,t){return e.flags[t]===!0}function ae(e,t){e.stdout.write(`${JSON.stringify(t,null,2)}
2022
2022
  `)}function v(e,t){return e.stderr.write(`error: ${t}
2023
2023
  `),1}function je(e,t){let r=t instanceof Error?t.message:String(t);return e.stderr.write(`internal error: ${r}
2024
- `),2}var Le=T(()=>{"use strict";Ze();Je()});import{hostname as eE}from"node:os";async function Qo(e){let t=e.finalize??"auto";await sE(e.io,e.env);let r=await O(e.io,m=>m.listEnqueuedRequestMailFromSender(e.sender.teamfile,e.sender.alias,e.receiver.teamfile,e.receiver.alias)),n=r.length===0?[]:await O(e.io,m=>m.claimMailForDelivery(r.map(p=>p.id),new Date().toISOString(),process.pid,eE())),s=lD(n,e.newMessage,{newMessageFrom:e.newMessageFrom??nE(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 Qw(e.io,n.map(h=>h.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&&$e(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 Qw(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 tE(e){await sE(e.io,e.env);let t=await O(e.io,i=>i.listEnqueuedResponseMailFromSender(e.sender.teamfile,e.sender.alias,e.receiver.teamfile,e.receiver.alias)),r=t.length===0?[]:await O(e.io,i=>i.claimMailForDelivery(t.map(o=>o.id),new Date().toISOString(),process.pid,eE())),n=cD(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
+ `),2}var Le=T(()=>{"use strict";Ze();Je()});import{hostname as eE}from"node:os";async function Qo(e){let t=e.finalize??"auto";await sE(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,eE())),s=lD(n,e.newMessage,{newMessageFrom:e.newMessageFrom??nE(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 Qw(e.io,n.map(h=>h.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&&Oe(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 Qw(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 tE(e){await sE(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,eE())),n=cD(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`:""}
2025
2025
  ${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 lD(e,t,r={}){let n=e.map((s,i)=>[`--- queued message ${i+1} (mail #${s.id}, from ${rE(s)}, sent ${s.created_at}) ---`,s.payload].join(`
2026
2026
  `));return t!==void 0&&n.push([`--- new message (from ${r.newMessageFrom??"operator"}) ---`,t].join(`
2027
2027
  `)),n.join(`
@@ -2029,20 +2029,20 @@ ${i.text}`;return await Zo(e.io,r.map(l=>l.id),a),{status:"stalled",receipt:a,pr
2029
2029
  `)}function cD(e){return e.map((r,n)=>[`--- queued response ${n+1} (mail #${r.id}, from ${rE(r)}, sent ${r.created_at}) ---`,r.payload,"","[lmctl] This is a response to your earlier message. Read it and update your context; no follow-up response will be sent."].join(`
2030
2030
  `)).join(`
2031
2031
 
2032
- `)}function rE(e){return e.sender_teamfile===null||e.sender_alias===null?"operator":nE({teamfile:e.sender_teamfile,alias:e.sender_alias})}function nE(e){return`${e.teamfile}:${e.alias}`}async function Zo(e,t,r){if(t.length!==0)try{await O(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)}
2033
- `)}}async function Qw(e,t){if(t.length!==0)try{await O(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)}
2034
- `)}}async function sE(e,t){try{await O(e,r=>{r.reclaimStaleMailboxDeliveries(new Date(Date.now()-dD(t)).toISOString())})}catch{}}function dD(e){let t=e.LMCTL_MAILBOX_DELIVERY_STALE_MS;if(t===void 0||t.trim()==="")return Zw;let r=Number(t);return!Number.isFinite(r)||r<=0?Zw:r}var Zw,Xd=T(()=>{"use strict";vt();he();Le();Zw=8*60*60*1e3});import{basename as uD}from"node:path";function aE(e,t){let r=new Date(t.now.getTime()-_r()).toISOString(),n=dE(e,r).filter(f=>!f.sender.teamfile.startsWith("prompt:")),s=pD(t.sender,n),i=_D(t.sender,n);i!==null&&i.teamfile===t.root&&!oE(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=>oE(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<fD;return{stop:l.length>=1&&d,chain:hD(a)}}function lE(e,t){let r=new Date(t.now.getTime()-_r()).toISOString(),n=dE(e,r),s=uE(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 _r(e=process.env){let t=e.LMCTL_INFLIGHT_TTL_MS;if(t===void 0||t.trim()==="")return iE;let r=Number(t);return!Number.isFinite(r)||r<=0?iE:r}function cE(e){return`cross-team cycle detected (${e}); stopping to prevent a runaway loop.`}function mD(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 dE(e,t){return e.clearAgentInflightOlderThan(t),e.listAgentInflight().map(mD).filter(r=>Number.isFinite(r.at)&&new Date(r.at).toISOString()>=t).sort((r,n)=>r.at-n.at)}function pD(e,t,r={}){let n=new Map;for(let a of t)n.set(Pr(a.receiver),a);let s=[{...e,at:null}],i=e,o=new Set([Pr(e)]);for(let a=0;a<64;a+=1){let l=n.get(Pr(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=Pr(l.sender);if(o.has(d))break;s.unshift(c),o.add(d),i=l.sender}return s}function uE(e,t){let r=Pr(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=Pr(l.sender),d=Pr(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 _D(e,t){let r=uE(e,t);if(r.length===0)return null;let n=r[0];return n.sender.teamfile.startsWith("prompt:")?n.receiver:n.sender}function oE(e,t){return e.teamfile===t.teamfile&&e.alias===t.alias}function Pr(e){return`${e.teamfile}\0${e.alias}`}function hD(e){return e.map(t=>`${uD(t.teamfile)}:${t.alias}`).join(" \u2192 ")}var fD,iE,ea=T(()=>{"use strict";fD=6e4,iE=8*60*60*1e3});function fE(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(`
2035
- `);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(!gD.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,gD,xt,mE=T(()=>{"use strict";ta=["title","description","members"],gD=new Set(ta),xt=class extends Error{constructor(t){super(t),this.name="FrontmatterError"}}});import{readFileSync as yD,writeFileSync as nY,renameSync as sY,existsSync as _E}from"node:fs";import{basename as wD,resolve as bn,dirname as Gd}from"node:path";function TD(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 bD(e){return/^\s*_MEMBER_\s+\S/.test(e)}function SD(e){return/^\s*_SESSION_\s+\S/.test(e)}function vD(e){return/^\s*_SKILL_(?:\s|$)/.test(e)}function ra(e){let t=wD(e);return t.endsWith(".lmctl")?t.slice(0,-6):t}function De(e){let t=yD(e,"utf-8"),r=Gd(bn(e)),n=Kd(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 Kd(e,t,r={}){let n=[],s=[];r.sourcePath,r.baseDir;let i=e;if(i.startsWith("#teamfile:")){let l=i.indexOf(`
2032
+ `)}function rE(e){return e.sender_teamfile===null||e.sender_alias===null?"operator":nE({teamfile:e.sender_teamfile,alias:e.sender_alias})}function nE(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)}
2033
+ `)}}async function Qw(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)}
2034
+ `)}}async function sE(e,t){try{await $(e,r=>{r.reclaimStaleMailboxDeliveries(new Date(Date.now()-dD(t)).toISOString())})}catch{}}function dD(e){let t=e.LMCTL_MAILBOX_DELIVERY_STALE_MS;if(t===void 0||t.trim()==="")return Zw;let r=Number(t);return!Number.isFinite(r)||r<=0?Zw:r}var Zw,Xd=T(()=>{"use strict";vt();he();Le();Zw=8*60*60*1e3});import{basename as uD}from"node:path";function aE(e,t){let r=new Date(t.now.getTime()-_r()).toISOString(),n=dE(e,r).filter(f=>!f.sender.teamfile.startsWith("prompt:")),s=pD(t.sender,n),i=_D(t.sender,n);i!==null&&i.teamfile===t.root&&!oE(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=>oE(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<fD;return{stop:l.length>=1&&d,chain:hD(a)}}function lE(e,t){let r=new Date(t.now.getTime()-_r()).toISOString(),n=dE(e,r),s=uE(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 _r(e=process.env){let t=e.LMCTL_INFLIGHT_TTL_MS;if(t===void 0||t.trim()==="")return iE;let r=Number(t);return!Number.isFinite(r)||r<=0?iE:r}function cE(e){return`cross-team cycle detected (${e}); stopping to prevent a runaway loop.`}function mD(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 dE(e,t){return e.clearAgentInflightOlderThan(t),e.listAgentInflight().map(mD).filter(r=>Number.isFinite(r.at)&&new Date(r.at).toISOString()>=t).sort((r,n)=>r.at-n.at)}function pD(e,t,r={}){let n=new Map;for(let a of t)n.set(Pr(a.receiver),a);let s=[{...e,at:null}],i=e,o=new Set([Pr(e)]);for(let a=0;a<64;a+=1){let l=n.get(Pr(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=Pr(l.sender);if(o.has(d))break;s.unshift(c),o.add(d),i=l.sender}return s}function uE(e,t){let r=Pr(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=Pr(l.sender),d=Pr(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 _D(e,t){let r=uE(e,t);if(r.length===0)return null;let n=r[0];return n.sender.teamfile.startsWith("prompt:")?n.receiver:n.sender}function oE(e,t){return e.teamfile===t.teamfile&&e.alias===t.alias}function Pr(e){return`${e.teamfile}\0${e.alias}`}function hD(e){return e.map(t=>`${uD(t.teamfile)}:${t.alias}`).join(" \u2192 ")}var fD,iE,ea=T(()=>{"use strict";fD=6e4,iE=8*60*60*1e3});function fE(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(`
2035
+ `);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(!gD.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,gD,xt,mE=T(()=>{"use strict";ta=["title","description","members"],gD=new Set(ta),xt=class extends Error{constructor(t){super(t),this.name="FrontmatterError"}}});import{readFileSync as yD,writeFileSync as n8,renameSync as s8,existsSync as _E}from"node:fs";import{basename as wD,resolve as bn,dirname as Gd}from"node:path";function TD(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 bD(e){return/^\s*_MEMBER_\s+\S/.test(e)}function SD(e){return/^\s*_SESSION_\s+\S/.test(e)}function vD(e){return/^\s*_SKILL_(?:\s|$)/.test(e)}function ra(e){let t=wD(e);return t.endsWith(".lmctl")?t.slice(0,-6):t}function De(e){let t=yD(e,"utf-8"),r=Gd(bn(e)),n=Kd(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 Kd(e,t,r={}){let n=[],s=[];r.sourcePath,r.baseDir;let i=e;if(i.startsWith("#teamfile:")){let l=i.indexOf(`
2036
2036
  `);i=l>=0?i.slice(l+1):""}let o=null;if(i.startsWith("---"))try{o=fE(i)}catch(l){if(l instanceof xt)s.push(`frontmatter: ${l.message}`);else throw l}let a=e.split(`
2037
2037
  `);for(let l=0;l<a.length;l++){let c=a[l],d=l+1;if(SD(c))throw new Error(`line ${d}: _SESSION_ is the legacy prefix. Rename to _MEMBER_. (line: ${c.trim()})`);if(vD(c)||!bD(c))continue;let u=TD(c);for(let p of Object.keys(u))if(!pE.includes(p))throw new Error(`line ${d}: unknown key "${p}" on _MEMBER_ line: ${c.trim()}
2038
- allowed keys: ${pE.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 Yd(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()===Vd.toLowerCase());n.length>1&&r.push({field:Vd,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(!_E(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 ED.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()===Vd.toLowerCase())}function zd(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),!_E(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 zd(l,Gd(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||Gd(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 Vd,ED,pE,Vt=T(()=>{"use strict";mE();Vd="Lead",ED=new Set(["claude","codex","opencode","lmplayer","gemini","copilot","qwen","agy","ClaudeMock"]);pE=["alias","provider","sessionid","sessiondir","teamfile","model","effort"]});import{createHash as kD}from"node:crypto";import{existsSync as Ss,mkdirSync as ID,readFileSync as yE,realpathSync as ND,writeFileSync as xD}from"node:fs";import{basename as hE,dirname as wE,resolve as EE}from"node:path";function Ee(e,t){let r=EE(e);if(Ss(r))return ND(r);if(t!==void 0){let n=LD(e,r,t);if(n!==null)return n}return r}function gE(e,t){let r=wE(t),n=Kd(e,ra(t),{baseDir:r});for(let s of n.members)s.sessiondir!==void 0&&!s.sessiondir.startsWith("/")&&(s.sessiondir=EE(r,s.sessiondir));return n}function Pe(e,t){let r=Ee(e,RD(t)?t:void 0);if(t!==void 0){let n=t.getRootTeam(r);if(n!==null)return!Ss(r)&&"upsertRootTeam"in t&&(ID(wE(r),{recursive:!0}),xD(r,n.raw_text,"utf8")),gE(n.raw_text,r);if(Ss(r)){let s=yE(r,"utf8"),i=gE(s,r);return"upsertRootTeam"in t&&$D(i)&&OD(t,r,i,s),i}throw new Error(`teamfile not found: ${e}`)}if(!Ss(r))throw new Error(`teamfile not found: ${e}`);return De(r)}function TE(e,t,r){let n=Ee(e,t),s=t.getRootTeam(n);s===null||!Ss(n)||yE(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 RD(e){return typeof e=="object"&&e!==null&&"getRootTeam"in e&&"listRootTeams"in e}function LD(e,t,r){let n=r.getRootTeam(e)??r.getRootTeam(t);if(n!==null)return n.teamfile_path;let s=hE(e),i=ra(e),o=r.listRootTeams().filter(l=>hE(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 $D(e){return e.parseErrors.length>0?!1:e.members.every(t=>t.teamfile!==void 0?!0:t.session!==void 0&&t.session.length>=AD)}function OD(e,t,r,n){let s=new Date().toISOString(),i={teamfile_path:t,name:r.name,raw_text:n,raw_sha256:kD("sha256").update(n).digest("hex"),registered_at:s,last_seeded_at:s};e.upsertRootTeam(i)}var AD,Rt=T(()=>{"use strict";Vt();AD=5});import{existsSync as CD}from"node:fs";import{dirname as bE}from"node:path";function DD(e){return MD.test(e)||jD.test(e)}function SE(e){return sa.test(e)}function Fr(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 ye(`lmctl: "${e}" doesn't look like a teamfile (expected .lmctl extension).`);if(!SE(t))throw new ye(`lmctl: "${t}" is not a valid alias (must match ${sa.source}).`);let n=Ee(e,r);if(r===void 0&&!CD(n))throw new ye(`lmctl: teamfile not found: ${e}`);let s;try{s=Pe(n,r)}catch(o){throw new ye(`lmctl: ${e}: ${o instanceof Error?o.message:String(o)}`)}if(s.parseErrors.length>0)throw new ye(`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 ye(`lmctl: alias "${t}" not found in ${e}.
2038
+ allowed keys: ${pE.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 Yd(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()===Vd.toLowerCase());n.length>1&&r.push({field:Vd,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(!_E(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 ED.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()===Vd.toLowerCase())}function zd(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),!_E(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 zd(l,Gd(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||Gd(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 Vd,ED,pE,Vt=T(()=>{"use strict";mE();Vd="Lead",ED=new Set(["claude","codex","opencode","lmplayer","gemini","copilot","qwen","agy","ClaudeMock"]);pE=["alias","provider","sessionid","sessiondir","teamfile","model","effort"]});import{createHash as kD}from"node:crypto";import{existsSync as Ss,mkdirSync as ID,readFileSync as yE,realpathSync as ND,writeFileSync as xD}from"node:fs";import{basename as hE,dirname as wE,resolve as EE}from"node:path";function Ee(e,t){let r=EE(e);if(Ss(r))return ND(r);if(t!==void 0){let n=LD(e,r,t);if(n!==null)return n}return r}function gE(e,t){let r=wE(t),n=Kd(e,ra(t),{baseDir:r});for(let s of n.members)s.sessiondir!==void 0&&!s.sessiondir.startsWith("/")&&(s.sessiondir=EE(r,s.sessiondir));return n}function Pe(e,t){let r=Ee(e,RD(t)?t:void 0);if(t!==void 0){let n=t.getRootTeam(r);if(n!==null)return!Ss(r)&&"upsertRootTeam"in t&&(ID(wE(r),{recursive:!0}),xD(r,n.raw_text,"utf8")),gE(n.raw_text,r);if(Ss(r)){let s=yE(r,"utf8"),i=gE(s,r);return"upsertRootTeam"in t&&OD(i)&&$D(t,r,i,s),i}throw new Error(`teamfile not found: ${e}`)}if(!Ss(r))throw new Error(`teamfile not found: ${e}`);return De(r)}function TE(e,t,r){let n=Ee(e,t),s=t.getRootTeam(n);s===null||!Ss(n)||yE(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 RD(e){return typeof e=="object"&&e!==null&&"getRootTeam"in e&&"listRootTeams"in e}function LD(e,t,r){let n=r.getRootTeam(e)??r.getRootTeam(t);if(n!==null)return n.teamfile_path;let s=hE(e),i=ra(e),o=r.listRootTeams().filter(l=>hE(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 OD(e){return e.parseErrors.length>0?!1:e.members.every(t=>t.teamfile!==void 0?!0:t.session!==void 0&&t.session.length>=AD)}function $D(e,t,r,n){let s=new Date().toISOString(),i={teamfile_path:t,name:r.name,raw_text:n,raw_sha256:kD("sha256").update(n).digest("hex"),registered_at:s,last_seeded_at:s};e.upsertRootTeam(i)}var AD,Rt=T(()=>{"use strict";Vt();AD=5});import{existsSync as CD}from"node:fs";import{dirname as bE}from"node:path";function DD(e){return MD.test(e)||jD.test(e)}function SE(e){return sa.test(e)}function Fr(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 ye(`lmctl: "${e}" doesn't look like a teamfile (expected .lmctl extension).`);if(!SE(t))throw new ye(`lmctl: "${t}" is not a valid alias (must match ${sa.source}).`);let n=Ee(e,r);if(r===void 0&&!CD(n))throw new ye(`lmctl: teamfile not found: ${e}`);let s;try{s=Pe(n,r)}catch(o){throw new ye(`lmctl: ${e}: ${o instanceof Error?o.message:String(o)}`)}if(s.parseErrors.length>0)throw new ye(`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 ye(`lmctl: alias "${t}" not found in ${e}.
2039
2039
  Known aliases: ${o}`)}if(i.teamfile!==void 0){let o=zd(i,bE(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 ye(`lmctl: alias "${i.alias}" in ${e} has no session ID yet.
2040
2040
  Run: lmctl seed ${e}`);return{teamfile:n,alias:i.alias,provider:i.provider,sessionid:i.session,sessiondir:i.sessiondir??bE(n),isLead:At(s)?.alias===i.alias,...i.model!==void 0?{model:i.model}:{},...i.effort!==void 0?{effort:i.effort}:{}}}function hr(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=Fr(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?SE(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.
2041
2041
  Use: lmctl ${e.name} ${r}:<alias> or lmctl ${e.name} ${r} <alias>`};if(DD(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.
2042
2042
  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}".
2043
2043
  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.
2044
2044
  Use: <path>.lmctl[:<alias>] | <path>.lmctl <alias> | <sessionid> | --run <id>`}}var ye,MD,jD,sa,Lt=T(()=>{"use strict";Vt();Rt();ye=class extends Error{constructor(t){super(t),this.name="ChatTargetError"}},MD=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,jD=/^ses_[A-Za-z0-9_-]+$/,sa=/^[A-Za-z][A-Za-z0-9_-]*$/});function PD(e=process.env){let t=e.LMCTL_DAEMON_MAILBOX_RELAY_MAX_BATCHES;if(t===void 0||t.trim()==="")return vE;let r=Number(t);return!Number.isFinite(r)||r<=0?vE:Math.max(1,Math.trunc(r))}async function IE(e){let t=e.env??process.env,r=e.maxBatches??PD(t),n=JD(e.dal),s={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0};HD(e.dal,t);let i=new Set;for(;s.scanned<r;){let o=e.dal.listRelayMailboxLanes(r).find(l=>!i.has(kE(l)));if(o===void 0)break;i.add(kE(o)),s.scanned+=1;let a=await FD(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 kE(e){return JSON.stringify([e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias])}async function FD(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=mr(e,{receiver_teamfile:n.receiver_teamfile,receiver_alias:n.receiver_alias,sender_teamfile:n.sender_teamfile,sender_alias:n.sender_alias,ttlMs:_r()});if(!l.acquired)return{...s,skipped_busy:1};if(o=l.lease,n.message_type==="response"){let d=await tE({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 BD(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 WD(e,c)}catch(a){return UD(e,n,`relay delivery error: ${a instanceof Error?a.message:String(a)}`)}finally{if(o!==null)try{e.releaseAgentInflight(o)}catch{}}}function UD(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 WD(e,t){let r={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0},n=qD(t),s=new Date().toISOString(),{marked:i}=e.markRelayRequestDeliveredAndEnqueueResponses(t.queued,n,s);return{...r,delivered:i,errors:t.status==="ok"?0:1}}function BD(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 qD(e){return e.status==="ok"?e.receipt:e.status==="stalled"?`relay delivery error: provider stalled${e.stalledAfterMs!==void 0?` after ${e.stalledAfterMs}ms`:""}
2045
- ${e.receipt}`:`relay delivery error: ${e.error}`}function HD(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 JD(e){return{stdout:{write:()=>{}},stderr:{write:()=>{}},dal:e}}var vE,NE=T(()=>{"use strict";Dr();Xd();ea();Lt();vE=10});function vs(){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 GD(e=process.env){let t=e.LMCTL_DAEMON_FEATURES;if(t===void 0)return new Set(["mailbox-relay"]);if(t.trim()==="")return new Set;let r=new Set;for(let n of t.split(",")){let s=n.trim();if(s!==""){if(s==="all")return new Set(xE);XD.has(s)&&r.add(s)}}return r}function AE(e){let t=e.intervalMs??vs(),r=e.runOnceFn??Mr,n=new Set(e.features??GD()),s={running:e.autoStart!==!1,in_flight:!1,interval_ms:t,enabled_features:[...n].sort(),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},i=null,o=null,a=null,l=null,c=null;n.has("rollup-updater")&&e.startRollupUpdaterFn!==!1&&(c=(e.startRollupUpdaterFn??Ww)(e.dal));let d=m=>{s.running&&(i=setTimeout(()=>{f.runCycle().finally(()=>d(t))},m))},u=m=>{s.running&&(o=setTimeout(()=>{l===null&&(l=RE(e.dal,n,e.monitorSessionActivityFn??wc,t,s).finally(()=>{l=null})),l.finally(()=>u(Ec(e.dal,t)))},m))},f={state:s,runCycle:async()=>(a!==null||(a=VD(e.dal,r,e.collectSessionSizesFn??c_,e.scanIntakeFn??ao,e.monitorSessionActivityFn??wc,e.mailboxRelayFn??IE,e.worker_id??"daemon",t,n,s).finally(()=>{a=null})),a),stop:async()=>{s.running=!1,i!==null&&clearTimeout(i),o!==null&&clearTimeout(o),c?.stop(),a!==null&&await a.catch(()=>{}),l!==null&&await l.catch(()=>{})}};if(s.running){let m=e.firstDelayMs??5e3;d(m),n.has("session-monitor")&&u(m)}return f}async function VD(e,t,r,n,s,i,o,a,l,c){c.in_flight=!0,c.last_started_at=new Date().toISOString(),c.last_error=null;let d=[],u=0,f=0,m=[],p=null,h=KD();try{if(l.has("durable-memory-policies")&&gy({dal:e}),l.has("drift-detectors")&&Hw({dal:e}),l.has("intake")&&(m=await n(e)),l.has("job-worker"))for(;;){let g=await t({dal:e,worker_id:o,lease_ms:6e5});if(g===null)break;d.push(g)}if(l.has("mailbox-relay")&&(h=await i({dal:e})),l.has("session-size")){let g=await r(e);u=g.recorded,f=g.failed}l.has("session-monitor")&&(p=await RE(e,l,s,a,c))}catch(g){c.last_error=g instanceof Error?g.message:String(g);try{e.raiseAttention({kind:"daemon_worker_failed",severity:"error",payload:JSON.stringify({error:c.last_error})})}catch{}}finally{c.in_flight=!1,c.cycles+=1,c.last_jobs_processed=d.length,c.last_session_sizes_recorded=u,c.last_session_size_failures=f,c.last_intake_scanned=m.reduce((g,_)=>g+_.scanned,0),c.last_intake_new_jobs=m.reduce((g,_)=>g+_.new_jobs,0),c.last_intake_failures=m.filter(g=>g.error!==void 0).length,c.last_session_hung_detected=p?.hung_detected??0,c.last_mailbox_relay_scanned=h.scanned,c.last_mailbox_relay_delivered=h.delivered,c.last_mailbox_relay_errors=h.errors,c.jobs_processed+=d.length,c.last_finished_at=new Date().toISOString()}return{jobs_processed:d.length,outcomes:d,session_sizes_recorded:u,session_size_failures:f,intake:m,session_monitor:p,mailbox_relay:h}}function KD(){return{scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0}}async function RE(e,t,r,n,s){if(!t.has("session-monitor"))return null;let i=Ec(e,n),o=Date.now();if(s.last_session_monitor_checked_at!==null){let a=Date.parse(s.last_session_monitor_checked_at);if(Number.isFinite(a)&&o-a<i)return null}s.last_session_monitor_checked_at=new Date(o).toISOString(),s.last_session_monitor_error=null;try{return await r({dal:e,nowMs:o})}catch(a){s.last_session_monitor_error=a instanceof Error?a.message:String(a);try{e.raiseAttention({kind:"daemon_session_monitor_failed",severity:"error",payload:JSON.stringify({error:s.last_session_monitor_error})})}catch{}return null}}var xE,XD,Zd=T(()=>{"use strict";Hc();Ro();Td();Ci();Bw();Jw();Tc();NE();xE=["durable-memory-policies","drift-detectors","intake","job-worker","mailbox-relay","session-size","session-monitor","rollup-updater"],XD=new Set(xE)});function LE(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 $E=T(()=>{"use strict"});import{mkdirSync as YD,readFileSync as zD,readdirSync as ZD,statSync as QD,writeFileSync as eP}from"node:fs";import{dirname as tP,join as CE,sep as OE}from"node:path";function ia(e){return{s3:{async send(n){let s=n;switch(s._localfsTag){case ME:return rP(e,s.input);case jE:return nP(e,s.input);case DE:return sP(e,s.input);default:throw new Error("createLocalFsS3Client: unknown command")}}},commands:{ListObjectsV2Command:tu,GetObjectCommand:eu,PutObjectCommand:Qd}}}function rP(e,t){let r=PE(e,t.Key);return YD(tP(r),{recursive:!0}),eP(r,t.Body),{}}function nP(e,t){let r=PE(e,t.Key),n;try{n=zD(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 sP(e,t){let r=t.Prefix??"";FE(r);let s=iP(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 PE(e,t){return FE(t),CE(e,t)}function FE(e){if(e.split("/").includes(".."))throw new Error(`localfs-s3-client: refusing key/prefix with '..': ${e}`)}function iP(e){let t=[],r=(n,s)=>{let i;try{i=ZD(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=CE(n,o.name);if(o.isDirectory())r(l,a);else if(o.isFile()){let c=OE==="/"?a:a.split(OE).join("/");t.push({key:c,lastModified:QD(l).mtime})}}};return r(e,""),t}var ME,jE,DE,Qd,eu,tu,ru=T(()=>{"use strict";ME="localfs-put",jE="localfs-get",DE="localfs-list",Qd=class{input;_localfsTag=ME;constructor(t){this.input=t}},eu=class{input;_localfsTag=jE;constructor(t){this.input=t}},tu=class{input;_localfsTag=DE;constructor(t){this.input=t}}});function UE(){return{put:0,get:0,list:0}}function nu(e,t=oP){return e.put*t.putUsd+e.get*t.getUsd+e.list*t.listUsd}function su(e){let t=new Date(e),r=t.getUTCFullYear(),n=String(t.getUTCMonth()+1).padStart(2,"0");return`${r}-${n}`}var oP,oa,iu=T(()=>{"use strict";oP={putUsd:5e-6,getUsd:40000000000000003e-23,listUsd:5e-6};oa=class{counts=UE();record(t,r=1){this.counts[t]+=r}peek(){return{...this.counts}}drain(){let t={...this.counts};return this.counts=UE(),t}estimateCostUsd(t){return nu(this.counts,t)}}});function WE(e){let t=e.now??Date.now,r=e.timers??aP,n=null,s=null;async function i(){let l=t(),c=su(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(h){e.log?.(`[usage] publish rollup failed: ${h instanceof Error?h.message:String(h)}`)}let m=f;if(e.readUserTotal!==void 0)try{m=await e.readUserTotal(c)}catch(h){e.log?.(`[usage] read user total failed: ${h instanceof Error?h.message:String(h)}`),m=f}let p=nu(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(h){e.log?.(`[usage] onQuotaExceeded threw: ${h instanceof Error?h.message:String(h)}`)}}}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===su(t())}}}var aP,BE=T(()=>{"use strict";iu();aP={setInterval:(e,t)=>setInterval(e,t),clearInterval:e=>clearInterval(e)}});var ou=T(()=>{"use strict";Mo();Do();Do()});function lP(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 cP(e){return e.reply_to!==void 0&&e.response!==void 0}function dP(e){if(typeof e!="object"||e===null)return;let t=e.conversation_id;return typeof t=="string"?t:void 0}function qE(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,ks,HE=T(()=>{"use strict";ou();aa=class extends Error{name="MailboxFetchStoppedError";code="mailbox_fetch_stopped";constructor(t="MailboxFetchClient stopped before a response arrived"){super(t)}},ks=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=Gt(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(qE(c));return}d=()=>{this.pending.has(s)&&(this.pending.delete(s),l(qE(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=lP(t);if(n===null){this.log("MailboxFetchClient: dropping non-envelope inbound payload");return}if(cP(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??dP(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:Gt(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 au(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 JE=T(()=>{"use strict"});function lu(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 XE=T(()=>{"use strict"});function du(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 cu,GE=T(()=>{"use strict";cu="daemon:events"});function KE(e){return{kind:"prompt",prompt_id:e.prompt_id??Gt(e.now?.()??Date.now(),e.random??Math.random),root_teamfile:e.root_teamfile,text:e.text}}function uu(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 VE,fu=T(()=>{"use strict";ou();VE="prompt:root"});function Is(e){let t=e.split(".");if(t.length<2||t[1]===void 0||t[1]==="")return null;try{let r=JSON.parse(zE(t[1]));return typeof r.sub=="string"&&r.sub!==""?r.sub:null}catch{return null}}function uP(e){let t=e.split(".");if(t.length<2||t[1]===void 0||t[1]==="")return null;try{let r=JSON.parse(zE(t[1]));return typeof r.exp=="number"&&Number.isFinite(r.exp)?r.exp:null}catch{return null}}function YE(e,t=60){if(typeof e!="string"||e==="")return!0;let r=uP(e);return r===null?!0:Date.now()/1e3>=r-t}function zE(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 mu=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":fP},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 fP,pu=T(()=>{"use strict";fP="AWSCognitoIdentityProviderService.InitiateAuth"});import{chmodSync as ZE,mkdirSync as QE,readFileSync as eT,writeFileSync as tT}from"node:fs";import{homedir as rT}from"node:os";import{dirname as nT,join as sT}from"node:path";function Ns(){return process.env.LMCTL_DEVICE_AUTH_PATH??sT(rT(),".lmctl","device-auth.json")}function iT(){return process.env.LMCTL_TOKEN_PATH??sT(rT(),".lmctl","cli-tokens.json")}function _u(e=Ns()){try{let t=JSON.parse(eT(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 oT(e,t=Ns()){QE(nT(t),{recursive:!0,mode:448}),tT(t,JSON.stringify(e,null,2));try{ZE(t,384)}catch{}}function hu(e,t=iT()){let r={};try{r=JSON.parse(eT(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};QE(nT(t),{recursive:!0,mode:448}),tT(t,JSON.stringify(s,null,2));try{ZE(t,384)}catch{}}async function aT(e){let t=e.deviceAuthPath??Ns(),r=_u(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 hu({idToken:n.idToken,...n.accessToken!==void 0?{accessToken:n.accessToken}:{},refreshToken:r.refreshToken,...n.expiresAt!==void 0?{expiresAt:n.expiresAt}:{}},e.cliTokensPath??iT()),{idToken:n.idToken,userId:r.userId}}var gu=T(()=>{"use strict";pu()});import{existsSync as mP,realpathSync as pP}from"node:fs";import{dirname as _P}from"node:path";function yu(e){hP(e).catch(t=>{e.log?.(`[mailbox] prompt trigger failed: ${t instanceof Error?t.message:String(t)}`)})}async function hP(e){let t=e.payload.root_teamfile;try{t=pP(e.payload.root_teamfile)}catch(s){let i=`prompt root missing/unreadable: ${e.payload.root_teamfile}: ${s instanceof Error?s.message:String(s)}`;return Sn({rootTeamfile:e.payload.root_teamfile,receiverTeamfile:e.payload.root_teamfile,receiverAlias:"Lead",message:e.payload.text,promptId:e.payload.prompt_id,detail:i,reason:"root_unavailable"}),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 Sn({rootTeamfile:t,receiverTeamfile:t,receiverAlias:"Lead",message:e.payload.text,promptId:e.payload.prompt_id,detail:s,reason:"root_unregistered"}),e.log?.(`[mailbox] ${s}`),{status:"error",response:null,error_detail:s}}let r=yP(t);if("error"in r)return Sn({rootTeamfile:t,receiverTeamfile:t,receiverAlias:"Lead",message:e.payload.text,promptId:e.payload.prompt_id,detail:r.error,reason:"root_invalid"}),e.log?.(`[mailbox] ${r.error}`),{status:"error",response:null,error_detail:r.error};let n=mr(e.store,{receiver_teamfile:t,receiver_alias:r.alias,sender_teamfile:`prompt:${e.payload.prompt_id}`,sender_alias:"operator",ttlMs:bP(e.env??process.env)});if(!n.acquired){let s=TP(r.alias,n.current);return Sn({rootTeamfile:t,receiverTeamfile:t,receiverAlias:r.alias,message:e.payload.text,promptId:e.payload.prompt_id,detail:s,reason:"unavailable"}),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 c==="ok"?await wP(e.store,{rootTeamfile:t,receiverTeamfile:t,receiverAlias:r.alias,message:e.payload.text,response:i.text,status:c,error_detail:null,log:e.log}):Sn({rootTeamfile:t,receiverTeamfile:t,receiverAlias:r.alias,message:e.payload.text,promptId:e.payload.prompt_id,detail:l??"provider failed",reason:o?"stalled":"empty_response"}),{status:c,response:c==="error"?null:i.text,error_detail:l}}catch(s){let i=s instanceof Error?s.message:String(s);return Sn({rootTeamfile:t,receiverTeamfile:t,receiverAlias:r.alias,message:e.payload.text,promptId:e.payload.prompt_id,detail:i,reason:"provider_error"}),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 Sn(e){H({event:"prompt_trigger_error",reason:e.reason,prompt_id:e.promptId,root_teamfile:e.rootTeamfile,sender_teamfile:e.rootTeamfile,sender_alias:"operator",receiver_teamfile:e.receiverTeamfile,receiver_alias:e.receiverAlias,error_detail:e.detail,message_preview:gP(e.message)})}function gP(e){let t=e.replace(/\s+/gu," ").trim();return t.length<=500?t:`${t.slice(0,497)}...`}function yP(e){if(!mP(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??_P(e)}}async function wP(e,t){let r=dT(t.message),n=t.response===null?null:dT(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 dT(e){return e.length<=lT?{text:e,truncated:!1}:{text:e.slice(0,lT),truncated:!0}}function EP(e,t){return`${e} is servicing ${t.sender_alias} (${t.sender_teamfile}) since ${t.started_at}`}function TP(e,t){return t.sender_teamfile.startsWith("prompt:")?`${e} is busy servicing another prompt since ${t.started_at}`:EP(e,t)}function bP(e=process.env){let t=e.LMCTL_INFLIGHT_TTL_MS;if(t===void 0||t.trim()==="")return cT;let r=Number(t);return!Number.isFinite(r)||r<=0?cT:r}var lT,cT,uT=T(()=>{"use strict";vt();Vt();he();Dr();lT=256*1024,cT=30*60*1e3});import{chmodSync as gT,existsSync as SP,mkdirSync as yT,readFileSync as fa,writeFileSync as wT}from"node:fs";import{dirname as wu,resolve as ca,join as ET}from"node:path";import{fileURLToPath as vP}from"node:url";import{homedir as TT}from"node:os";import{CognitoIdentityClient as kP,GetIdCommand as IP}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as fT}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as NP,ListObjectsV2Command as xP,PutObjectCommand as AP,S3Client as mT}from"@aws-sdk/client-s3";function As(e={}){let t=e.env??process.env,r=e.tfstatePath!==void 0?[e.tfstatePath]:CP(e.selfUrl),n={},s;for(let I of r)if(SP(I)){n=OP(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)??RP,a=i(t.LMCTL_NEXT_COGNITO_USER_POOL_ID,n.LMCTL_NEXT_COGNITO_USER_POOL_ID)??LP,l=i(t.LMCTL_NEXT_MAILBOX_BUCKET,t.LMCTL_NEXT_POLICY_BUCKET,n.LMCTL_NEXT_MAILBOX_BUCKET,n.LMCTL_NEXT_POLICY_BUCKET)??$P,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,h=ua(t.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),g=ua(t.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),_=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}:{},...h!==void 0?{readIntervalMs:h}:{},...g!==void 0?{heartbeatIdleMs:g}:{},..._!==void 0?{backoffReadIntervalMs:_}:{},...S!==void 0?{chatLogPollIntervalMs:S}:{},...y!==void 0?{mailboxKey:y}:{},...w!==void 0?{tokenPath:w}:{}},f}function OP(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 CP(e){let t=wu(vP(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 MP(e){let t=jP(e.intervalMs)??bT,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 jP(e){return typeof e=="number"&&Number.isFinite(e)&&e>0?e:void 0}async function ST(e){let t=e.tokenPath??ET(TT(),".lmctl","cli-tokens.json"),r=_T(e.tokenPath);if(YE(r.cognito?.idToken)&&_u()!==null)try{await aT({region:e.region,clientId:e.cognitoClientId??ma,cliTokensPath:t}),r=_T(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 hT({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=fT({identityId:i,logins:{[s]:n},clientConfig:{region:e.region}}),l=new mT({region:e.region,credentials:a}),c={ListObjectsV2Command:xP,GetObjectCommand:NP,PutObjectCommand:AP},d=Is(n),u=d??i,f=e.deviceId,m=gn({identityId:i,userId:d,deviceId:f,mailboxKey:e.mailboxKey}),p=e.cursorStore,h;if(p!==void 0){let A=p.loadMailboxCursor(u,m);if(A!==null)h=A.last_processed_seq??void 0,e.log?.(`[mx-mailbox] resumed seq cursor=${h??"(sentinel)"} for user_id=${u}`);else{let Q=!1,B=0;for(;!Q&&B<2;){B+=1;try{let k=Oo(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=Co(j.Key??"",m,"web");C!==void 0&&C>N&&(N=C)}L=F.IsTruncated===!0?F.NextContinuationToken:void 0}while(L!==void 0);h=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&&FP(k)){e.log?.(`[mx-mailbox] cached identityId rejected by cognito (${N}); clearing + refreshing`),PP(t),o=!1,i=await hT({tokenPath:t,region:e.region,identityPoolId:e.identityPoolId,idpProvider:s,idToken:n,log:e.log}),a=fT({identityId:i,logins:{[s]:n},clientConfig:{region:e.region}}),l=new mT({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:h??null,last_processed_at:new Date().toISOString()})}}let g=null,_=e.terminalSessionManager,S=e.persistentSessionManager,y=e.promptTriggerStore,w=new oa,I=new jr({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(_!==void 0&&au(A.payload)){_.onInbound(A.payload);return}if(S!==void 0&&lu(A.payload)){await S.onInbound(A.payload);return}if(!du(A.payload)){if(y!==void 0&&uu(A.payload)){yu({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()})}}:{},...h!==void 0?{cursor:h}:{},...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 ks({client:I,...e.log!==void 0?{log:e.log}:{}}),_!==void 0&&_.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:cu,payload:A});I.start();let U=e.chatLogTailStore===void 0?void 0:MP({store:e.chatLogTailStore,publishDaemonEvent:x,cursorKey:m,intervalMs:e.chatLogPollIntervalMs??e.readIntervalMs??e.pollIntervalMs??bT,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:WE({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 vT(e){let t=e.s3!==void 0&&e.commands!==void 0?{s3:e.s3,commands:e.commands}:ia(e.rootDir),r=gn({identityId:xs,userId:xs,deviceId:pT}),n=null,s=e.terminalSessionManager,i=e.persistentSessionManager,o=e.promptTriggerStore,a=new jr({bucket:"local",identityId:xs,userId:xs,deviceId:pT,s3:t.s3,commands:t.commands,selfRole:"agent",onMessage:async c=>{if(s!==void 0&&au(c.payload)){s.onInbound(c.payload);return}if(i!==void 0&&lu(c.payload)){await i.onInbound(c.payload);return}if(!du(c.payload)){if(o!==void 0&&uu(c.payload)){yu({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 ks({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:cu,payload:c});return a.start(),e.log?.(`[local-webui] agent polling ${r} (local-fs ${e.rootDir})`),{identityId:xs,mailbox:a,fetchClient:n,publishDaemonEvent:l,async stop(){await n.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function _T(e){let t=e??ET(TT(),".lmctl","cli-tokens.json");try{let r=fa(t,"utf8");return JSON.parse(r)}catch{return{}}}function DP(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}};yT(wu(e),{recursive:!0,mode:448}),wT(e,JSON.stringify(n,null,2));try{gT(e,384)}catch{}}function PP(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,yT(wu(e),{recursive:!0,mode:448}),wT(e,JSON.stringify(r,null,2));try{gT(e,384)}catch{}}async function hT(e){e.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let r=await new kP({region:e.region}).send(new IP({IdentityPoolId:e.identityPoolId,Logins:{[e.idpProvider]:e.idToken}}));if(r.IdentityId===void 0||r.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{DP(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 FP(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 bT,da,ma,RP,LP,$P,xs,pT,Eu=T(()=>{"use strict";Po();ru();iu();BE();HE();JE();XE();GE();fu();Mo();mu();gu();uT();bT=3e3,da=1e3,ma="79u5jhkk46qofog661c9i0bdcs",RP="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",LP="us-east-1_4iUdFggDn",$P="lmctl-next-preview-mailbox-254332045686";xs="local",pT="local"});import{spawn as vu}from"node:child_process";import{createInterface as kT}from"node:readline";var Tu,bu,Su,IT,NT=T(()=>{"use strict";fi();he();Tu=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=vu(t.command,t.args,{cwd:t.cwd??process.cwd(),env:t.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=n,this.rl=kT({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
+ ${e.receipt}`:`relay delivery error: ${e.error}`}function HD(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 JD(e){return{stdout:{write:()=>{}},stderr:{write:()=>{}},dal:e}}var vE,NE=T(()=>{"use strict";Dr();Xd();ea();Lt();vE=10});function vs(){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 GD(e=process.env){let t=e.LMCTL_DAEMON_FEATURES;if(t===void 0)return new Set(["mailbox-relay"]);if(t.trim()==="")return new Set;let r=new Set;for(let n of t.split(",")){let s=n.trim();if(s!==""){if(s==="all")return new Set(xE);XD.has(s)&&r.add(s)}}return r}function AE(e){let t=e.intervalMs??vs(),r=e.runOnceFn??Mr,n=new Set(e.features??GD()),s={running:e.autoStart!==!1,in_flight:!1,interval_ms:t,enabled_features:[...n].sort(),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},i=null,o=null,a=null,l=null,c=null;n.has("rollup-updater")&&e.startRollupUpdaterFn!==!1&&(c=(e.startRollupUpdaterFn??Ww)(e.dal));let d=m=>{s.running&&(i=setTimeout(()=>{f.runCycle().finally(()=>d(t))},m))},u=m=>{s.running&&(o=setTimeout(()=>{l===null&&(l=RE(e.dal,n,e.monitorSessionActivityFn??wc,t,s).finally(()=>{l=null})),l.finally(()=>u(Ec(e.dal,t)))},m))},f={state:s,runCycle:async()=>(a!==null||(a=VD(e.dal,r,e.collectSessionSizesFn??c_,e.scanIntakeFn??ao,e.monitorSessionActivityFn??wc,e.mailboxRelayFn??IE,e.worker_id??"daemon",t,n,s).finally(()=>{a=null})),a),stop:async()=>{s.running=!1,i!==null&&clearTimeout(i),o!==null&&clearTimeout(o),c?.stop(),a!==null&&await a.catch(()=>{}),l!==null&&await l.catch(()=>{})}};if(s.running){let m=e.firstDelayMs??5e3;d(m),n.has("session-monitor")&&u(m)}return f}async function VD(e,t,r,n,s,i,o,a,l,c){c.in_flight=!0,c.last_started_at=new Date().toISOString(),c.last_error=null;let d=[],u=0,f=0,m=[],p=null,h=KD();try{if(l.has("durable-memory-policies")&&gy({dal:e}),l.has("drift-detectors")&&Hw({dal:e}),l.has("intake")&&(m=await n(e)),l.has("job-worker"))for(;;){let g=await t({dal:e,worker_id:o,lease_ms:6e5});if(g===null)break;d.push(g)}if(l.has("mailbox-relay")&&(h=await i({dal:e})),l.has("session-size")){let g=await r(e);u=g.recorded,f=g.failed}l.has("session-monitor")&&(p=await RE(e,l,s,a,c))}catch(g){c.last_error=g instanceof Error?g.message:String(g);try{e.raiseAttention({kind:"daemon_worker_failed",severity:"error",payload:JSON.stringify({error:c.last_error})})}catch{}}finally{c.in_flight=!1,c.cycles+=1,c.last_jobs_processed=d.length,c.last_session_sizes_recorded=u,c.last_session_size_failures=f,c.last_intake_scanned=m.reduce((g,_)=>g+_.scanned,0),c.last_intake_new_jobs=m.reduce((g,_)=>g+_.new_jobs,0),c.last_intake_failures=m.filter(g=>g.error!==void 0).length,c.last_session_hung_detected=p?.hung_detected??0,c.last_mailbox_relay_scanned=h.scanned,c.last_mailbox_relay_delivered=h.delivered,c.last_mailbox_relay_errors=h.errors,c.jobs_processed+=d.length,c.last_finished_at=new Date().toISOString()}return{jobs_processed:d.length,outcomes:d,session_sizes_recorded:u,session_size_failures:f,intake:m,session_monitor:p,mailbox_relay:h}}function KD(){return{scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0}}async function RE(e,t,r,n,s){if(!t.has("session-monitor"))return null;let i=Ec(e,n),o=Date.now();if(s.last_session_monitor_checked_at!==null){let a=Date.parse(s.last_session_monitor_checked_at);if(Number.isFinite(a)&&o-a<i)return null}s.last_session_monitor_checked_at=new Date(o).toISOString(),s.last_session_monitor_error=null;try{return await r({dal:e,nowMs:o})}catch(a){s.last_session_monitor_error=a instanceof Error?a.message:String(a);try{e.raiseAttention({kind:"daemon_session_monitor_failed",severity:"error",payload:JSON.stringify({error:s.last_session_monitor_error})})}catch{}return null}}var xE,XD,Zd=T(()=>{"use strict";Hc();Ro();Td();Ci();Bw();Jw();Tc();NE();xE=["durable-memory-policies","drift-detectors","intake","job-worker","mailbox-relay","session-size","session-monitor","rollup-updater"],XD=new Set(xE)});function LE(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 OE=T(()=>{"use strict"});import{mkdirSync as YD,readFileSync as zD,readdirSync as ZD,statSync as QD,writeFileSync as eP}from"node:fs";import{dirname as tP,join as CE,sep as $E}from"node:path";function ia(e){return{s3:{async send(n){let s=n;switch(s._localfsTag){case ME:return rP(e,s.input);case jE:return nP(e,s.input);case DE:return sP(e,s.input);default:throw new Error("createLocalFsS3Client: unknown command")}}},commands:{ListObjectsV2Command:tu,GetObjectCommand:eu,PutObjectCommand:Qd}}}function rP(e,t){let r=PE(e,t.Key);return YD(tP(r),{recursive:!0}),eP(r,t.Body),{}}function nP(e,t){let r=PE(e,t.Key),n;try{n=zD(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 sP(e,t){let r=t.Prefix??"";FE(r);let s=iP(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 PE(e,t){return FE(t),CE(e,t)}function FE(e){if(e.split("/").includes(".."))throw new Error(`localfs-s3-client: refusing key/prefix with '..': ${e}`)}function iP(e){let t=[],r=(n,s)=>{let i;try{i=ZD(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=CE(n,o.name);if(o.isDirectory())r(l,a);else if(o.isFile()){let c=$E==="/"?a:a.split($E).join("/");t.push({key:c,lastModified:QD(l).mtime})}}};return r(e,""),t}var ME,jE,DE,Qd,eu,tu,ru=T(()=>{"use strict";ME="localfs-put",jE="localfs-get",DE="localfs-list",Qd=class{input;_localfsTag=ME;constructor(t){this.input=t}},eu=class{input;_localfsTag=jE;constructor(t){this.input=t}},tu=class{input;_localfsTag=DE;constructor(t){this.input=t}}});function UE(){return{put:0,get:0,list:0}}function nu(e,t=oP){return e.put*t.putUsd+e.get*t.getUsd+e.list*t.listUsd}function su(e){let t=new Date(e),r=t.getUTCFullYear(),n=String(t.getUTCMonth()+1).padStart(2,"0");return`${r}-${n}`}var oP,oa,iu=T(()=>{"use strict";oP={putUsd:5e-6,getUsd:40000000000000003e-23,listUsd:5e-6};oa=class{counts=UE();record(t,r=1){this.counts[t]+=r}peek(){return{...this.counts}}drain(){let t={...this.counts};return this.counts=UE(),t}estimateCostUsd(t){return nu(this.counts,t)}}});function WE(e){let t=e.now??Date.now,r=e.timers??aP,n=null,s=null;async function i(){let l=t(),c=su(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(h){e.log?.(`[usage] publish rollup failed: ${h instanceof Error?h.message:String(h)}`)}let m=f;if(e.readUserTotal!==void 0)try{m=await e.readUserTotal(c)}catch(h){e.log?.(`[usage] read user total failed: ${h instanceof Error?h.message:String(h)}`),m=f}let p=nu(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(h){e.log?.(`[usage] onQuotaExceeded threw: ${h instanceof Error?h.message:String(h)}`)}}}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===su(t())}}}var aP,BE=T(()=>{"use strict";iu();aP={setInterval:(e,t)=>setInterval(e,t),clearInterval:e=>clearInterval(e)}});var ou=T(()=>{"use strict";Mo();Do();Do()});function lP(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 cP(e){return e.reply_to!==void 0&&e.response!==void 0}function dP(e){if(typeof e!="object"||e===null)return;let t=e.conversation_id;return typeof t=="string"?t:void 0}function qE(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,ks,HE=T(()=>{"use strict";ou();aa=class extends Error{name="MailboxFetchStoppedError";code="mailbox_fetch_stopped";constructor(t="MailboxFetchClient stopped before a response arrived"){super(t)}},ks=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=Gt(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(qE(c));return}d=()=>{this.pending.has(s)&&(this.pending.delete(s),l(qE(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=lP(t);if(n===null){this.log("MailboxFetchClient: dropping non-envelope inbound payload");return}if(cP(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??dP(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:Gt(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 au(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 JE=T(()=>{"use strict"});function lu(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 XE=T(()=>{"use strict"});function du(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 cu,GE=T(()=>{"use strict";cu="daemon:events"});function KE(e){return{kind:"prompt",prompt_id:e.prompt_id??Gt(e.now?.()??Date.now(),e.random??Math.random),root_teamfile:e.root_teamfile,text:e.text}}function uu(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 VE,fu=T(()=>{"use strict";ou();VE="prompt:root"});function Is(e){let t=e.split(".");if(t.length<2||t[1]===void 0||t[1]==="")return null;try{let r=JSON.parse(zE(t[1]));return typeof r.sub=="string"&&r.sub!==""?r.sub:null}catch{return null}}function uP(e){let t=e.split(".");if(t.length<2||t[1]===void 0||t[1]==="")return null;try{let r=JSON.parse(zE(t[1]));return typeof r.exp=="number"&&Number.isFinite(r.exp)?r.exp:null}catch{return null}}function YE(e,t=60){if(typeof e!="string"||e==="")return!0;let r=uP(e);return r===null?!0:Date.now()/1e3>=r-t}function zE(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 mu=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":fP},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 fP,pu=T(()=>{"use strict";fP="AWSCognitoIdentityProviderService.InitiateAuth"});import{chmodSync as ZE,mkdirSync as QE,readFileSync as eT,writeFileSync as tT}from"node:fs";import{homedir as rT}from"node:os";import{dirname as nT,join as sT}from"node:path";function Ns(){return process.env.LMCTL_DEVICE_AUTH_PATH??sT(rT(),".lmctl","device-auth.json")}function iT(){return process.env.LMCTL_TOKEN_PATH??sT(rT(),".lmctl","cli-tokens.json")}function _u(e=Ns()){try{let t=JSON.parse(eT(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 oT(e,t=Ns()){QE(nT(t),{recursive:!0,mode:448}),tT(t,JSON.stringify(e,null,2));try{ZE(t,384)}catch{}}function hu(e,t=iT()){let r={};try{r=JSON.parse(eT(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};QE(nT(t),{recursive:!0,mode:448}),tT(t,JSON.stringify(s,null,2));try{ZE(t,384)}catch{}}async function aT(e){let t=e.deviceAuthPath??Ns(),r=_u(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 hu({idToken:n.idToken,...n.accessToken!==void 0?{accessToken:n.accessToken}:{},refreshToken:r.refreshToken,...n.expiresAt!==void 0?{expiresAt:n.expiresAt}:{}},e.cliTokensPath??iT()),{idToken:n.idToken,userId:r.userId}}var gu=T(()=>{"use strict";pu()});import{existsSync as mP,realpathSync as pP}from"node:fs";import{dirname as _P}from"node:path";function yu(e){hP(e).catch(t=>{e.log?.(`[mailbox] prompt trigger failed: ${t instanceof Error?t.message:String(t)}`)})}async function hP(e){let t=e.payload.root_teamfile;try{t=pP(e.payload.root_teamfile)}catch(s){let i=`prompt root missing/unreadable: ${e.payload.root_teamfile}: ${s instanceof Error?s.message:String(s)}`;return Sn({rootTeamfile:e.payload.root_teamfile,receiverTeamfile:e.payload.root_teamfile,receiverAlias:"Lead",message:e.payload.text,promptId:e.payload.prompt_id,detail:i,reason:"root_unavailable"}),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 Sn({rootTeamfile:t,receiverTeamfile:t,receiverAlias:"Lead",message:e.payload.text,promptId:e.payload.prompt_id,detail:s,reason:"root_unregistered"}),e.log?.(`[mailbox] ${s}`),{status:"error",response:null,error_detail:s}}let r=yP(t);if("error"in r)return Sn({rootTeamfile:t,receiverTeamfile:t,receiverAlias:"Lead",message:e.payload.text,promptId:e.payload.prompt_id,detail:r.error,reason:"root_invalid"}),e.log?.(`[mailbox] ${r.error}`),{status:"error",response:null,error_detail:r.error};let n=mr(e.store,{receiver_teamfile:t,receiver_alias:r.alias,sender_teamfile:`prompt:${e.payload.prompt_id}`,sender_alias:"operator",ttlMs:bP(e.env??process.env)});if(!n.acquired){let s=TP(r.alias,n.current);return Sn({rootTeamfile:t,receiverTeamfile:t,receiverAlias:r.alias,message:e.payload.text,promptId:e.payload.prompt_id,detail:s,reason:"unavailable"}),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 c==="ok"?await wP(e.store,{rootTeamfile:t,receiverTeamfile:t,receiverAlias:r.alias,message:e.payload.text,response:i.text,status:c,error_detail:null,log:e.log}):Sn({rootTeamfile:t,receiverTeamfile:t,receiverAlias:r.alias,message:e.payload.text,promptId:e.payload.prompt_id,detail:l??"provider failed",reason:o?"stalled":"empty_response"}),{status:c,response:c==="error"?null:i.text,error_detail:l}}catch(s){let i=s instanceof Error?s.message:String(s);return Sn({rootTeamfile:t,receiverTeamfile:t,receiverAlias:r.alias,message:e.payload.text,promptId:e.payload.prompt_id,detail:i,reason:"provider_error"}),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 Sn(e){H({event:"prompt_trigger_error",reason:e.reason,prompt_id:e.promptId,root_teamfile:e.rootTeamfile,sender_teamfile:e.rootTeamfile,sender_alias:"operator",receiver_teamfile:e.receiverTeamfile,receiver_alias:e.receiverAlias,error_detail:e.detail,message_preview:gP(e.message)})}function gP(e){let t=e.replace(/\s+/gu," ").trim();return t.length<=500?t:`${t.slice(0,497)}...`}function yP(e){if(!mP(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??_P(e)}}async function wP(e,t){let r=dT(t.message),n=t.response===null?null:dT(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 dT(e){return e.length<=lT?{text:e,truncated:!1}:{text:e.slice(0,lT),truncated:!0}}function EP(e,t){return`${e} is servicing ${t.sender_alias} (${t.sender_teamfile}) since ${t.started_at}`}function TP(e,t){return t.sender_teamfile.startsWith("prompt:")?`${e} is busy servicing another prompt since ${t.started_at}`:EP(e,t)}function bP(e=process.env){let t=e.LMCTL_INFLIGHT_TTL_MS;if(t===void 0||t.trim()==="")return cT;let r=Number(t);return!Number.isFinite(r)||r<=0?cT:r}var lT,cT,uT=T(()=>{"use strict";vt();Vt();he();Dr();lT=256*1024,cT=30*60*1e3});import{chmodSync as gT,existsSync as SP,mkdirSync as yT,readFileSync as fa,writeFileSync as wT}from"node:fs";import{dirname as wu,resolve as ca,join as ET}from"node:path";import{fileURLToPath as vP}from"node:url";import{homedir as TT}from"node:os";import{CognitoIdentityClient as kP,GetIdCommand as IP}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as fT}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as NP,ListObjectsV2Command as xP,PutObjectCommand as AP,S3Client as mT}from"@aws-sdk/client-s3";function As(e={}){let t=e.env??process.env,r=e.tfstatePath!==void 0?[e.tfstatePath]:CP(e.selfUrl),n={},s;for(let I of r)if(SP(I)){n=$P(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)??RP,a=i(t.LMCTL_NEXT_COGNITO_USER_POOL_ID,n.LMCTL_NEXT_COGNITO_USER_POOL_ID)??LP,l=i(t.LMCTL_NEXT_MAILBOX_BUCKET,t.LMCTL_NEXT_POLICY_BUCKET,n.LMCTL_NEXT_MAILBOX_BUCKET,n.LMCTL_NEXT_POLICY_BUCKET)??OP,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,h=ua(t.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),g=ua(t.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),_=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}:{},...h!==void 0?{readIntervalMs:h}:{},...g!==void 0?{heartbeatIdleMs:g}:{},..._!==void 0?{backoffReadIntervalMs:_}:{},...S!==void 0?{chatLogPollIntervalMs:S}:{},...y!==void 0?{mailboxKey:y}:{},...w!==void 0?{tokenPath:w}:{}},f}function $P(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 CP(e){let t=wu(vP(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 MP(e){let t=jP(e.intervalMs)??bT,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 jP(e){return typeof e=="number"&&Number.isFinite(e)&&e>0?e:void 0}async function ST(e){let t=e.tokenPath??ET(TT(),".lmctl","cli-tokens.json"),r=_T(e.tokenPath);if(YE(r.cognito?.idToken)&&_u()!==null)try{await aT({region:e.region,clientId:e.cognitoClientId??ma,cliTokensPath:t}),r=_T(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 hT({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=fT({identityId:i,logins:{[s]:n},clientConfig:{region:e.region}}),l=new mT({region:e.region,credentials:a}),c={ListObjectsV2Command:xP,GetObjectCommand:NP,PutObjectCommand:AP},d=Is(n),u=d??i,f=e.deviceId,m=gn({identityId:i,userId:d,deviceId:f,mailboxKey:e.mailboxKey}),p=e.cursorStore,h;if(p!==void 0){let A=p.loadMailboxCursor(u,m);if(A!==null)h=A.last_processed_seq??void 0,e.log?.(`[mx-mailbox] resumed seq cursor=${h??"(sentinel)"} for user_id=${u}`);else{let Q=!1,B=0;for(;!Q&&B<2;){B+=1;try{let k=$o(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=Co(j.Key??"",m,"web");C!==void 0&&C>N&&(N=C)}L=F.IsTruncated===!0?F.NextContinuationToken:void 0}while(L!==void 0);h=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&&FP(k)){e.log?.(`[mx-mailbox] cached identityId rejected by cognito (${N}); clearing + refreshing`),PP(t),o=!1,i=await hT({tokenPath:t,region:e.region,identityPoolId:e.identityPoolId,idpProvider:s,idToken:n,log:e.log}),a=fT({identityId:i,logins:{[s]:n},clientConfig:{region:e.region}}),l=new mT({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:h??null,last_processed_at:new Date().toISOString()})}}let g=null,_=e.terminalSessionManager,S=e.persistentSessionManager,y=e.promptTriggerStore,w=new oa,I=new jr({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(_!==void 0&&au(A.payload)){_.onInbound(A.payload);return}if(S!==void 0&&lu(A.payload)){await S.onInbound(A.payload);return}if(!du(A.payload)){if(y!==void 0&&uu(A.payload)){yu({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()})}}:{},...h!==void 0?{cursor:h}:{},...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 ks({client:I,...e.log!==void 0?{log:e.log}:{}}),_!==void 0&&_.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:cu,payload:A});I.start();let U=e.chatLogTailStore===void 0?void 0:MP({store:e.chatLogTailStore,publishDaemonEvent:x,cursorKey:m,intervalMs:e.chatLogPollIntervalMs??e.readIntervalMs??e.pollIntervalMs??bT,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:WE({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 vT(e){let t=e.s3!==void 0&&e.commands!==void 0?{s3:e.s3,commands:e.commands}:ia(e.rootDir),r=gn({identityId:xs,userId:xs,deviceId:pT}),n=null,s=e.terminalSessionManager,i=e.persistentSessionManager,o=e.promptTriggerStore,a=new jr({bucket:"local",identityId:xs,userId:xs,deviceId:pT,s3:t.s3,commands:t.commands,selfRole:"agent",onMessage:async c=>{if(s!==void 0&&au(c.payload)){s.onInbound(c.payload);return}if(i!==void 0&&lu(c.payload)){await i.onInbound(c.payload);return}if(!du(c.payload)){if(o!==void 0&&uu(c.payload)){yu({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 ks({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:cu,payload:c});return a.start(),e.log?.(`[local-webui] agent polling ${r} (local-fs ${e.rootDir})`),{identityId:xs,mailbox:a,fetchClient:n,publishDaemonEvent:l,async stop(){await n.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function _T(e){let t=e??ET(TT(),".lmctl","cli-tokens.json");try{let r=fa(t,"utf8");return JSON.parse(r)}catch{return{}}}function DP(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}};yT(wu(e),{recursive:!0,mode:448}),wT(e,JSON.stringify(n,null,2));try{gT(e,384)}catch{}}function PP(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,yT(wu(e),{recursive:!0,mode:448}),wT(e,JSON.stringify(r,null,2));try{gT(e,384)}catch{}}async function hT(e){e.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let r=await new kP({region:e.region}).send(new IP({IdentityPoolId:e.identityPoolId,Logins:{[e.idpProvider]:e.idToken}}));if(r.IdentityId===void 0||r.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{DP(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 FP(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 bT,da,ma,RP,LP,OP,xs,pT,Eu=T(()=>{"use strict";Po();ru();iu();BE();HE();JE();XE();GE();fu();Mo();mu();gu();uT();bT=3e3,da=1e3,ma="79u5jhkk46qofog661c9i0bdcs",RP="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",LP="us-east-1_4iUdFggDn",OP="lmctl-next-preview-mailbox-254332045686";xs="local",pT="local"});import{spawn as vu}from"node:child_process";import{createInterface as kT}from"node:readline";var Tu,bu,Su,IT,NT=T(()=>{"use strict";fi();he();Tu=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=vu(t.command,t.args,{cwd:t.cwd??process.cwd(),env:t.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=n,this.rl=kT({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+`
2046
2046
  `)}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+`
2047
2047
  `)}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}}}},bu=class{child;ctx;buffer="";sessionIdSeen;closed=!1;async start(t,r){this.ctx=r;let n=vu(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(`
2048
2048
  `);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+`
@@ -2050,15 +2050,15 @@ ${e.receipt}`:`relay delivery error: ${e.error}`}function HD(e,t){let r=t.LMCTL_
2050
2050
  `)}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+`
2051
2051
  `)}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+`
2052
2052
  `)}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}})}}},IT=e=>{switch(e){case"codex":return new Tu;case"claude":case"qwen":return new bu;case"gemini":case"copilot":case"opencode":return new Su;default:throw new Error(`no_persistent_adapter_for_provider: ${e}`)}}});import{randomUUID as UP}from"node:crypto";import{existsSync as Fz,mkdirSync as WP,readFileSync as BP,writeFileSync as qP}from"node:fs";import{homedir as HP}from"node:os";import{dirname as JP,join as XP}from"node:path";function pa(){return process.env.LMCTL_DEVICE_FILE??XP(HP(),".lmctl","device.json")}function Ur(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(BP(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 ku(e=pa()){let t=Ur(e);if(t!==null&&t.created_at!=="env")return t;let r={device_id:UP(),created_at:new Date().toISOString()};return WP(JP(e),{recursive:!0}),qP(e,`${JSON.stringify(r,null,2)}
2053
- `,{encoding:"utf8",mode:384}),r}var Iu=T(()=>{"use strict"});import*as xT from"node:child_process";function VP(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 Nu(e,t={}){let r=t.spawnSync===void 0&&process.env[KP]==="1",n=t.spawnSync??xT.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=VP(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 AT(e){if(e.binary==="<unknown>")return`unknown provider "${e.provider}" \u2014 no binary mapping (allowed: ${Object.keys(_a).join(", ")})`;let t=GP[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,GP,KP,RT=T(()=>{"use strict";_a={claude:"claude",codex:"codex",copilot:"copilot",gemini:"gemini",opencode:"opencode",lmplayer:"lmplayer",qwen:"qwen",agy:"agy"},GP={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"};KP="LMCTL_SKIP_BINARY_CHECK"});var UT={};we(UT,{ProviderBinaryPreflightError:()=>ha,__setProviderBinaryCheckForTest:()=>sF,bootstrapAgentRestMailbox:()=>OT,publishRegisteredWorkflowsOnStart:()=>$T,resolveLocalMailboxDir:()=>PT,resolveLocalWebuiDir:()=>DT,resolveServeConfig:()=>CT,runProviderBinaryPreflight:()=>jT,runServe:()=>eF,validateServeArgs:()=>FT});import{randomBytes as YP}from"node:crypto";import{existsSync as zP}from"node:fs";import{homedir as ZP}from"node:os";import{isAbsolute as LT,resolve as xu}from"node:path";async function eF(e,t={stdout:process.stdout,stderr:process.stderr}){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(QP),0;let r=FT(e,process.env);if(typeof r=="string")return t.stderr.write(`error: ${r}
2053
+ `,{encoding:"utf8",mode:384}),r}var Iu=T(()=>{"use strict"});import*as xT from"node:child_process";function VP(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 Nu(e,t={}){let r=t.spawnSync===void 0&&process.env[KP]==="1",n=t.spawnSync??xT.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=VP(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 AT(e){if(e.binary==="<unknown>")return`unknown provider "${e.provider}" \u2014 no binary mapping (allowed: ${Object.keys(_a).join(", ")})`;let t=GP[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,GP,KP,RT=T(()=>{"use strict";_a={claude:"claude",codex:"codex",copilot:"copilot",gemini:"gemini",opencode:"opencode",lmplayer:"lmplayer",qwen:"qwen",agy:"agy"},GP={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"};KP="LMCTL_SKIP_BINARY_CHECK"});var UT={};we(UT,{ProviderBinaryPreflightError:()=>ha,__setProviderBinaryCheckForTest:()=>sF,bootstrapAgentRestMailbox:()=>$T,publishRegisteredWorkflowsOnStart:()=>OT,resolveLocalMailboxDir:()=>PT,resolveLocalWebuiDir:()=>DT,resolveServeConfig:()=>CT,runProviderBinaryPreflight:()=>jT,runServe:()=>eF,validateServeArgs:()=>FT});import{randomBytes as YP}from"node:crypto";import{existsSync as zP}from"node:fs";import{homedir as ZP}from"node:os";import{isAbsolute as LT,resolve as xu}from"node:path";async function eF(e,t={stdout:process.stdout,stderr:process.stderr}){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(QP),0;let r=FT(e,process.env);if(typeof r=="string")return t.stderr.write(`error: ${r}
2054
2054
  `),2;try{jT(t)}catch(y){return 1}let n=Ie({path:le()}),s={portCli:iF(e)},i;try{i=CT({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)}
2055
2055
  `),2}process.env.LMCTL_API_URL=i.apiUrl,process.env.LMCTL_API_TOKEN=i.apiToken,process.env.LMCTL_API_PORT=String(i.port),LE(n);let o;if(r.localWebui!==void 0){let y=DT(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=PT(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}
2056
2056
  `)}let a=r.noDaemon?void 0:AE({dal:n,intervalMs:vs()}),l=o!==void 0?{missing:[],tfstateCandidatesChecked:[]}:As({env:process.env});l.missing.length>0&&t.stderr.write(`[lmctl-next-agent] mailbox transport not configured: missing ${l.missing.join(", ")}; running without cloud sync`+(l.tfstatePathUsed===void 0?` (no terraform.tfstate found; checked ${l.tfstateCandidatesChecked.length} candidate path${l.tfstateCandidatesChecked.length===1?"":"s"})`:` (terraform.tfstate at ${l.tfstatePathUsed} did not supply the missing fields)`)+`
2057
2057
  `);let c=await nF({log:y=>t.stderr.write(`${y}
2058
2058
  `)}),d=new qo({adapterFactory:IT,publish:async()=>{throw new Error("persistent_publish_not_wired: mailbox runtime has not bound the publish hook yet")},log:y=>t.stderr.write(`${y}
2059
- `)}),u=Ur()?.device_id,f=Dw({dal:n,daemon:a,...l.config!==void 0?{webuiRuntimeConfig:tF(l.config,u)}:{},...c!==void 0?{terminalSessionManager:c}:{},persistentSessionManager:d,...o!==void 0?{localWebui:{webuiDir:o.webuiDir,localMailbox:{s3:o.s3,commands:o.commands}}}:{},authDisabled:r.insecureNoAuth}),m=process.env.LMCTL_USAGE_QUOTA_USD,p=m!==void 0&&m!==""?Number(m):NaN,h=Number.isFinite(p)&&p>0?p:void 0,g=await OT({dal:n,app:f,io:t,mailbox:l.config===void 0?void 0:{...l.config,cursorStore:n,chatLogTailStore:n,promptTriggerStore:n,usageStore:n,...h!==void 0?{usageQuotaUsd:h}:{},...u!==void 0?{deviceId:u}:{}},...o!==void 0?{localMailbox:{rootDir:o.rootDir,s3:o.s3,commands:o.commands,promptTriggerStore:n}}:{},...c!==void 0?{terminalSessionManager:c}:{},persistentSessionManager:d});await $T({dal:n,mailbox:g.mailbox,io:t});let{serve:_}=await import("@hono/node-server"),S=_({fetch:f.fetch,port:i.port,hostname:r.bind});return t.stdout.write(`listening on ${r.bind}:${i.port}
2060
- `),await new Promise(y=>{let w=()=>{(async()=>(a!==void 0&&await a.stop(),S.close(),await g.stop(),c!==void 0&&await c.stop(),await d.stop(),n.close(),y()))()};process.once("SIGTERM",w),process.once("SIGINT",w)}),0}function tF(e,t){return{identityPoolId:e.identityPoolId,cognitoUserPoolId:e.cognitoUserPoolId,cognitoRegion:e.region,mailboxBucket:e.mailboxBucket,workspaceFetchMode:"mailbox",...t!==void 0?{deviceId:t}:{},...e.mailboxKey!==void 0?{mailboxKey:e.mailboxKey}:{},mailboxPolling:{...e.readIntervalMs!==void 0?{readIntervalSeconds:e.readIntervalMs/1e3}:{},...e.heartbeatIdleMs!==void 0?{heartbeatIdleSeconds:e.heartbeatIdleMs/1e3}:{},...e.backoffReadIntervalMs!==void 0?{backoffReadIntervalSeconds:e.backoffReadIntervalMs/1e3}:{}}}}async function $T(e){if(e.mailbox===void 0)return;let t={kind:"daemon_event",event:"workflows",ts:Date.now(),workflows:e.dal.listRootTeams().map(r=>({teamfile_path:r.teamfile_path,name:r.name,registered_at:r.registered_at,last_seeded_at:r.last_seeded_at}))};try{await e.mailbox.publishDaemonEvent(t)}catch(r){e.io?.stderr.write(`[mailbox] daemon_event workflows push failed: ${r instanceof Error?r.message:String(r)}
2061
- `)}}async function OT(e){let t;if(e.mailbox!==void 0||e.localMailbox!==void 0)try{t=e.localMailbox!==void 0?await vT({...e.localMailbox,log:r=>e.io?.stderr.write(`${r}
2059
+ `)}),u=Ur()?.device_id,f=Dw({dal:n,daemon:a,...l.config!==void 0?{webuiRuntimeConfig:tF(l.config,u)}:{},...c!==void 0?{terminalSessionManager:c}:{},persistentSessionManager:d,...o!==void 0?{localWebui:{webuiDir:o.webuiDir,localMailbox:{s3:o.s3,commands:o.commands}}}:{},authDisabled:r.insecureNoAuth}),m=process.env.LMCTL_USAGE_QUOTA_USD,p=m!==void 0&&m!==""?Number(m):NaN,h=Number.isFinite(p)&&p>0?p:void 0,g=await $T({dal:n,app:f,io:t,mailbox:l.config===void 0?void 0:{...l.config,cursorStore:n,chatLogTailStore:n,promptTriggerStore:n,usageStore:n,...h!==void 0?{usageQuotaUsd:h}:{},...u!==void 0?{deviceId:u}:{}},...o!==void 0?{localMailbox:{rootDir:o.rootDir,s3:o.s3,commands:o.commands,promptTriggerStore:n}}:{},...c!==void 0?{terminalSessionManager:c}:{},persistentSessionManager:d});await OT({dal:n,mailbox:g.mailbox,io:t});let{serve:_}=await import("@hono/node-server"),S=_({fetch:f.fetch,port:i.port,hostname:r.bind});return t.stdout.write(`listening on ${r.bind}:${i.port}
2060
+ `),await new Promise(y=>{let w=()=>{(async()=>(a!==void 0&&await a.stop(),S.close(),await g.stop(),c!==void 0&&await c.stop(),await d.stop(),n.close(),y()))()};process.once("SIGTERM",w),process.once("SIGINT",w)}),0}function tF(e,t){return{identityPoolId:e.identityPoolId,cognitoUserPoolId:e.cognitoUserPoolId,cognitoRegion:e.region,mailboxBucket:e.mailboxBucket,workspaceFetchMode:"mailbox",...t!==void 0?{deviceId:t}:{},...e.mailboxKey!==void 0?{mailboxKey:e.mailboxKey}:{},mailboxPolling:{...e.readIntervalMs!==void 0?{readIntervalSeconds:e.readIntervalMs/1e3}:{},...e.heartbeatIdleMs!==void 0?{heartbeatIdleSeconds:e.heartbeatIdleMs/1e3}:{},...e.backoffReadIntervalMs!==void 0?{backoffReadIntervalSeconds:e.backoffReadIntervalMs/1e3}:{}}}}async function OT(e){if(e.mailbox===void 0)return;let t={kind:"daemon_event",event:"workflows",ts:Date.now(),workflows:e.dal.listRootTeams().map(r=>({teamfile_path:r.teamfile_path,name:r.name,registered_at:r.registered_at,last_seeded_at:r.last_seeded_at}))};try{await e.mailbox.publishDaemonEvent(t)}catch(r){e.io?.stderr.write(`[mailbox] daemon_event workflows push failed: ${r instanceof Error?r.message:String(r)}
2061
+ `)}}async function $T(e){let t;if(e.mailbox!==void 0||e.localMailbox!==void 0)try{t=e.localMailbox!==void 0?await vT({...e.localMailbox,log:r=>e.io?.stderr.write(`${r}
2062
2062
  `),...e.terminalSessionManager!==void 0?{terminalSessionManager:e.terminalSessionManager}:{},...e.persistentSessionManager!==void 0?{persistentSessionManager:e.persistentSessionManager}:{}}):await ST({...e.mailbox,log:r=>e.io?.stderr.write(`${r}
2063
2063
  `),...e.terminalSessionManager!==void 0?{terminalSessionManager:e.terminalSessionManager}:{},...e.persistentSessionManager!==void 0?{persistentSessionManager:e.persistentSessionManager}:{}}),t.fetchClient.onRequest(hh({app:e.app,log:r=>e.io?.stderr.write(`${r}
2064
2064
  `)})),e.io?.stderr.write(`[mailbox] dg-2 agent runtime started (identity=${t.identityId})
@@ -2068,7 +2068,7 @@ ${e.receipt}`:`relay delivery error: ${e.error}`}function HD(e,t){let r=t.LMCTL_
2068
2068
  `);return{port:a,apiUrl:u,apiToken:c}}function rF(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 nF(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 Bo({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 sF(e){MT=e??Nu}function jT(e){let t=Object.keys(_a),r=MT(t),n=r.filter(i=>!i.found);if(n.length>0){for(let i of n)e.stderr.write(`error: ${AT(i)}
2069
2069
  `);throw e.stderr.write(`error: agent refusing to start; ensure missing provider CLIs are on PATH
2070
2070
  `),new ha(n)}let s=r.map(i=>i.provider).join(", ");e.stdout.write(`providers ready: ${s}
2071
- `)}function DT(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=LT(r)?r:xu(process.cwd(),r);return zP(`${n}/index.html`)?n:null}function PT(e){let t=e.LMCTL_LOCAL_MAILBOX_DIR;return t!==void 0&&t!==""?LT(t)?t:xu(process.cwd(),t):xu(ZP(),".lmctl","local-mailbox")}function iF(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 FT(e,t=process.env){let r=oF(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 oF(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 QP,ha,MT,WT=T(()=>{"use strict";Ze();Uw();Zd();$E();Xc();Eu();ru();Md();jd();NT();Iu();RT();Je();QP=`usage: lmctl serve [--port N] [--bind HOST] [--no-daemon] [--insecure-no-auth] [--webui [DIR]]
2071
+ `)}function DT(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=LT(r)?r:xu(process.cwd(),r);return zP(`${n}/index.html`)?n:null}function PT(e){let t=e.LMCTL_LOCAL_MAILBOX_DIR;return t!==void 0&&t!==""?LT(t)?t:xu(process.cwd(),t):xu(ZP(),".lmctl","local-mailbox")}function iF(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 FT(e,t=process.env){let r=oF(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 oF(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 QP,ha,MT,WT=T(()=>{"use strict";Ze();Uw();Zd();OE();Xc();Eu();ru();Md();jd();NT();Iu();RT();Je();QP=`usage: lmctl serve [--port N] [--bind HOST] [--no-daemon] [--insecure-no-auth] [--webui [DIR]]
2072
2072
 
2073
2073
  Start the local HTTP API, web UI, queue daemon, terminal manager, and agent
2074
2074
  services. Help exits before any port binding or daemon startup.
@@ -2084,22 +2084,22 @@ with LMCTL_API_TOKEN=<token> or run serve with --insecure-no-auth for a local
2084
2084
  unauthenticated daemon.
2085
2085
  `;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}},MT=Nu});import{existsSync as aF,mkdirSync as lF,readFileSync as cF,renameSync as dF,unlinkSync as uF,writeFileSync as fF}from"node:fs";import{homedir as qT}from"node:os";import{dirname as Rs,join as pt,resolve as mF}from"node:path";function Nn(e,t,r){let n=Rs(mF(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())gr(pt(o,".mcp.json"),"mcpServers",[vn(),kn()]),a.has("opencode")&&gr(pt(o,".opencode","opencode.json"),"mcp",[XT(),GT()]);for(let o of s)gF(o)}function JT(e=HT??qT()){return pt(e,".copilot","mcp-config.json")}function _F(e,t){rt.mkdirSync(Rs(e),{recursive:!0});let r=pt(Rs(e),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{rt.writeFileSync(r,`${JSON.stringify(t,null,2)}
2086
2086
  `,"utf8"),rt.renameSync(r,e)}catch(n){try{rt.unlinkSync(r)}catch{}throw n}}function hF(e,t){rt.mkdirSync(Rs(e),{recursive:!0});let r=pt(Rs(e),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{rt.writeFileSync(r,t,"utf8"),rt.renameSync(r,e)}catch(n){try{rt.unlinkSync(r)}catch{}throw n}}function gr(e,t,r){try{if(!rt.existsSync(e))return;let n=JSON.parse(rt.readFileSync(e,"utf8"));if(!In(n)||!In(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,_F(e,n),H({event:"mcp_cleanup",path:e,removed:i})}catch{}}function vn(){return{name:ya,shouldRemove:kF}}function XT(){return{name:ya,shouldRemove:IF}}function kn(){return{name:ga,shouldRemove:SF}}function GT(){return{name:ga,shouldRemove:vF}}function gF(e){let t=HT??qT();switch(e){case"copilot":gr(JT(t),"mcpServers",[vn(),kn()]);return;case"claude":gr(pt(t,".claude.json"),"mcpServers",[vn(),kn()]);return;case"gemini":gr(pt(t,".gemini","settings.json"),"mcpServers",[vn(),kn()]);return;case"qwen":gr(pt(t,".qwen","settings.json"),"mcpServers",[vn(),kn()]);return;case"agy":gr(pt(t,".gemini","antigravity-cli","settings.json"),"mcpServers",[vn(),kn()]);return;case"opencode":gr(pt(t,".config","opencode","opencode.json"),"mcp",[XT(),GT()]);return;case"codex":yF(pt(t,".codex","config.toml"));return;default:return}}function yF(e){try{if(!rt.existsSync(e))return;let t=rt.readFileSync(e,"utf8"),r=wF(t);if(r===null)return;let n=t.split(/\n/),s=[],i=new Set,o=!1,a;for(let l of n){let c=VT(l);if(c===null)return;if(c!==void 0){if(BT(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=TF(l);if(d===null)return;if(d!==void 0&&BT(d,r)){i.add(d[1]);continue}s.push(l)}if(i.size===0)return;hF(e,s.join(`
2087
- `)),H({event:"mcp_cleanup",path:e,removed:[...i]})}catch{}}function BT(e,t){return e.length<2||e[0]!=="mcp_servers"?!1:t.has(e[1])}function wF(e){let t=new Map,r;for(let s of e.split(/\n/)){let i=VT(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=EF(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=KT(l);if(u===null)return null;d.command=u}else if(c[2]==="args"){let u=bF(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&&zT(i.command,i.args)&&n.add(s),s===ya&&ZT(i.command,i.args)&&n.add(s);return n}function EF(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 VT(e){if(!/^\s*\[/.test(e))return;let t=/^\s*\[([^\]\r\n]+)\]\s*(?:#.*)?$/.exec(e);return t===null?null:wa(t[1])}function TF(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 KT(e){let t=YT(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 bF(e){let t=YT(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=>KT(s.trim()));return n.some(s=>s===null)?null:n}function YT(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 SF(e){return In(e)?e.type==="stdio"&&typeof e.command=="string"&&zT(e.command,e.args):!1}function vF(e){return!In(e)||!Array.isArray(e.command)?!1:e.command.length===2&&typeof e.command[0]=="string"&&typeof e.command[1]=="string"&&eb(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"&&QT(e.command[0],[e.command[1],e.command[2]])}function kF(e){return In(e)?e.type==="stdio"&&ZT(e.command,e.args):!1}function IF(e){return!In(e)||!Array.isArray(e.command)?!1:e.command.length===2&&typeof e.command[0]=="string"&&typeof e.command[1]=="string"&&tb(e.command[0])&&e.command[1]==="mcp"}function zT(e,t){return eb(e)&&rb(t)||QT(e,t)}function ZT(e,t){return tb(e)&&rb(t)}function QT(e,t){return NF(e)&&Array.isArray(t)&&t.length===2&&xF(t[0])&&t[1]==="mcp"}function eb(e){return typeof e=="string"&&Au(e)==="lmctl"}function tb(e){return typeof e=="string"&&Au(e)==="lmctl0"}function NF(e){if(typeof e!="string")return!1;let t=Au(e).toLowerCase();return t==="node"||t==="node.exe"}function xF(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 Au(e){let t=e.replace(/\\/g,"/");return t.split("/").filter(n=>n.length>0).at(-1)??t}function rb(e){return Array.isArray(e)&&e.length===1&&e[0]==="mcp"}function In(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var ga,ya,pF,rt,HT,Ls=T(()=>{"use strict";he();ga="lmctl",ya="lmctl0",pF={existsSync:aF,mkdirSync:lF,readFileSync:cF,writeFileSync:fF,renameSync:dF,unlinkSync:uF},rt=pF});function ib(e){let t=nb(e.registry,e.fromTeamfile);if(t===void 0)return xn(`sender team is not registered in policy graph: ${e.fromTeamfile}`);if(!sb(t,e.fromAlias))return xn(`sender alias "${e.fromAlias}" not found in ${e.fromTeamfile}`);let r=nb(e.registry,e.toTeamfile);return r===void 0?xn(`target team is not registered in policy graph: ${e.toTeamfile}`):sb(r,e.toAlias)?e.toTeamfile===e.fromTeamfile?{allowed:!0,outOfPolicy:!1,reason:"same team"}:t.leadAlias===null?xn(`sender team has no Lead: ${e.fromTeamfile}`):e.fromAlias!==t.leadAlias?xn(`cross-team sends may only originate from Lead; got "${e.fromAlias}" in ${e.fromTeamfile}`):{allowed:!0,outOfPolicy:!1,reason:"cross-team send from Lead"}:xn(`target alias "${e.toAlias}" not found in ${e.toTeamfile}`)}function nb(e,t){return e.teams.find(r=>r.teamfile===t)}function sb(e,t){return e.aliases.some(r=>r===t)}function xn(e){return{allowed:!1,outOfPolicy:!0,reason:e}}var ob=T(()=>{"use strict"});import{randomUUID as AF}from"node:crypto";import{hostname as ab,networkInterfaces as RF}from"node:os";function lb(e){let t=(e.now??new Date).toISOString();return{lock_id:AF(),teamfile:e.teamfile,alias:e.alias,holder_pid:e.pid??process.pid,holder_host:e.host??ab(),holder_ips:e.ips??MF(),started_at:t,last_heartbeat:t}}function cb(e=process.env){return db(e.LMCTL_TERMINAL_LOCK_HEARTBEAT_MS,LF)}function OF(e=process.env){return db(e.LMCTL_TERMINAL_LOCK_STALE_MS,$F)}function Ru(e,t={}){let r=t.now??new Date,n=t.localHost??ab(),s=t.staleMs??OF();if(e.holder_host===n)return(t.isProcessAlive??CF)(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 Lu(e){return`${e.alias} is held by a terminal on ${e.holder_host} since ${e.started_at}; retry later`}function db(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 CF(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 MF(){let e=new Set;for(let t of Object.values(RF()))for(let r of t??[])r.internal||e.add(r.address);return[...e].sort()}var LF,$F,$u=T(()=>{"use strict";LF=15e3,$F=12e4});function jF(e){return`lmctl ${e}: LMCTL_SELF_SESSIONID is not set \u2014 it looks like you are running lmctl
2087
+ `)),H({event:"mcp_cleanup",path:e,removed:[...i]})}catch{}}function BT(e,t){return e.length<2||e[0]!=="mcp_servers"?!1:t.has(e[1])}function wF(e){let t=new Map,r;for(let s of e.split(/\n/)){let i=VT(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=EF(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=KT(l);if(u===null)return null;d.command=u}else if(c[2]==="args"){let u=bF(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&&zT(i.command,i.args)&&n.add(s),s===ya&&ZT(i.command,i.args)&&n.add(s);return n}function EF(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 VT(e){if(!/^\s*\[/.test(e))return;let t=/^\s*\[([^\]\r\n]+)\]\s*(?:#.*)?$/.exec(e);return t===null?null:wa(t[1])}function TF(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 KT(e){let t=YT(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 bF(e){let t=YT(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=>KT(s.trim()));return n.some(s=>s===null)?null:n}function YT(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 SF(e){return In(e)?e.type==="stdio"&&typeof e.command=="string"&&zT(e.command,e.args):!1}function vF(e){return!In(e)||!Array.isArray(e.command)?!1:e.command.length===2&&typeof e.command[0]=="string"&&typeof e.command[1]=="string"&&eb(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"&&QT(e.command[0],[e.command[1],e.command[2]])}function kF(e){return In(e)?e.type==="stdio"&&ZT(e.command,e.args):!1}function IF(e){return!In(e)||!Array.isArray(e.command)?!1:e.command.length===2&&typeof e.command[0]=="string"&&typeof e.command[1]=="string"&&tb(e.command[0])&&e.command[1]==="mcp"}function zT(e,t){return eb(e)&&rb(t)||QT(e,t)}function ZT(e,t){return tb(e)&&rb(t)}function QT(e,t){return NF(e)&&Array.isArray(t)&&t.length===2&&xF(t[0])&&t[1]==="mcp"}function eb(e){return typeof e=="string"&&Au(e)==="lmctl"}function tb(e){return typeof e=="string"&&Au(e)==="lmctl0"}function NF(e){if(typeof e!="string")return!1;let t=Au(e).toLowerCase();return t==="node"||t==="node.exe"}function xF(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 Au(e){let t=e.replace(/\\/g,"/");return t.split("/").filter(n=>n.length>0).at(-1)??t}function rb(e){return Array.isArray(e)&&e.length===1&&e[0]==="mcp"}function In(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var ga,ya,pF,rt,HT,Ls=T(()=>{"use strict";he();ga="lmctl",ya="lmctl0",pF={existsSync:aF,mkdirSync:lF,readFileSync:cF,writeFileSync:fF,renameSync:dF,unlinkSync:uF},rt=pF});function ib(e){let t=nb(e.registry,e.fromTeamfile);if(t===void 0)return xn(`sender team is not registered in policy graph: ${e.fromTeamfile}`);if(!sb(t,e.fromAlias))return xn(`sender alias "${e.fromAlias}" not found in ${e.fromTeamfile}`);let r=nb(e.registry,e.toTeamfile);return r===void 0?xn(`target team is not registered in policy graph: ${e.toTeamfile}`):sb(r,e.toAlias)?e.toTeamfile===e.fromTeamfile?{allowed:!0,outOfPolicy:!1,reason:"same team"}:t.leadAlias===null?xn(`sender team has no Lead: ${e.fromTeamfile}`):e.fromAlias!==t.leadAlias?xn(`cross-team sends may only originate from Lead; got "${e.fromAlias}" in ${e.fromTeamfile}`):{allowed:!0,outOfPolicy:!1,reason:"cross-team send from Lead"}:xn(`target alias "${e.toAlias}" not found in ${e.toTeamfile}`)}function nb(e,t){return e.teams.find(r=>r.teamfile===t)}function sb(e,t){return e.aliases.some(r=>r===t)}function xn(e){return{allowed:!1,outOfPolicy:!0,reason:e}}var ob=T(()=>{"use strict"});import{randomUUID as AF}from"node:crypto";import{hostname as ab,networkInterfaces as RF}from"node:os";function lb(e){let t=(e.now??new Date).toISOString();return{lock_id:AF(),teamfile:e.teamfile,alias:e.alias,holder_pid:e.pid??process.pid,holder_host:e.host??ab(),holder_ips:e.ips??MF(),started_at:t,last_heartbeat:t}}function cb(e=process.env){return db(e.LMCTL_TERMINAL_LOCK_HEARTBEAT_MS,LF)}function $F(e=process.env){return db(e.LMCTL_TERMINAL_LOCK_STALE_MS,OF)}function Ru(e,t={}){let r=t.now??new Date,n=t.localHost??ab(),s=t.staleMs??$F();if(e.holder_host===n)return(t.isProcessAlive??CF)(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 Lu(e){return`${e.alias} is held by a terminal on ${e.holder_host} since ${e.started_at}; retry later`}function db(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 CF(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 MF(){let e=new Set;for(let t of Object.values(RF()))for(let r of t??[])r.internal||e.add(r.address);return[...e].sort()}var LF,OF,Ou=T(()=>{"use strict";LF=15e3,OF=12e4});function jF(e){return`lmctl ${e}: LMCTL_SELF_SESSIONID is not set \u2014 it looks like you are running lmctl
2088
2088
  manually, outside a member session that lmctl started. Running lmctl this way is
2089
2089
  not officially supported.
2090
- 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.
2090
+ To experiment with it manually: https://lmctl.com/lmctl/docs/manual-invocation`}function Os(e){return`lmctl ${e}: LMCTL_SELF_SESSIONID is set but does not match any member of a registered team.
2091
2091
  The session marker may be stale or the team may not be registered in this lmctl database.
2092
2092
  Consulted ${Vs(jt(),le())}
2093
2093
  To experiment with it manually: https://lmctl.com/lmctl/docs/manual-invocation`}function ub(e){return`unknown option --from
2094
- ${jF(e)}`}function fb(e,t){let r=Ou(e,t);return r.ok?{ok:!0,identity:r.identity,source:"session"}:r}function Ou(e,t){let r=e[Vn];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 Ea=T(()=>{"use strict";st();Je();Rt()});function Wr(e){let t=Fr(e);if(t===null)throw new Error(`invalid agent identity: ${e}`);return{teamfile:t.teamfile,alias:t.alias,value:e}}var Cu=T(()=>{"use strict";Lt()});async function Sa(e){let t=e.onEvent??(()=>{}),r=PF(e.io,t),n=null,s=null,i=null,o,a=null,l=e.prompt;try{let c=await O(r,w=>He(e.teamfile,e.alias,w)),d=c.teamfile,u=await O(r,w=>XF(w,e.env??process.env)),f=u.sender,m=await GF(r,{explicitRoot:e.rootFlag,sender:f,receiverTeamfile:d,operatorOrigin:u.origin==="operator"}),p=f===null?null:await VF(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}
2095
- `}),i=await WF(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=HF(r,i);try{Nn(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 h=await hb(r,d,c.alias);if(h!==null){let w=Lu(h);if(f!==null){let I=await Mu(r,{sender:f,receiverTeamfile:d,receiverAlias:c.alias,rootTeamfile:m,payload:e.prompt});return a=Ta(`enqueued mailbox message ${I.id}`,null),ju(I.id,f,d,c.alias)}return An(i,n,e.prompt,w,"unavailable"),a=Du(w,null),{status:"busy",message:w,teamChatLogId:null}}if(await FF(r,d,c.alias)){if(f!==null){let I=await Mu(r,{sender:f,receiverTeamfile:d,receiverAlias:c.alias,rootTeamfile:m,payload:e.prompt});return a=Ta(`enqueued mailbox message ${I.id}`,null),ju(I.id,f,d,c.alias)}let w=await UF(r,d,c.alias);return An(i,n,e.prompt,w,"unavailable"),a=Du(w,null),{status:"busy",message:w,teamChatLogId:null}}if(f!==null&&f.teamfile!==d){let w=await O(r,I=>aE(I,{root:m,sender:f,receiverTeamfile:d,receiverAlias:c.alias,now:new Date}));if(w.stop){let I=cE(w.chain);return An(i,n,e.prompt,I,"cycle"),a=ba(I,null),{status:"error",errorKind:"cycle",message:I,teamChatLogId:null}}}let g=await zF(r,{receiver_teamfile:d,receiver_alias:c.alias,sender_teamfile:f?.teamfile??d,sender_alias:f?.alias??"operator"});if(!g.acquired){let w=gb(d,c.alias,g.current);if(f!==null){let I=await Mu(r,{sender:f,receiverTeamfile:d,receiverAlias:c.alias,rootTeamfile:m,payload:e.prompt});return a=Ta(`enqueued mailbox message ${I.id}`,null),ju(I.id,f,d,c.alias)}return An(i,n,e.prompt,w,"unavailable"),a=Du(w,null),{status:"busy",message:w,teamChatLogId:null}}s=g.lease;let _=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 qF(r,i,w)}});l=_.prompt;let S=_.status==="stalled",y=null;if(S){let w=`provider stalled${_.stalledAfterMs!==void 0?` after ${_.stalledAfterMs}ms`:""}`;An(i,n,l,w,"error"),a=ba(w,null,_.receipt)}else y=await QF(r,{...n,message:l,response:_.receipt,status:n.policy?.outOfPolicy===!0?"out_of_policy":"ok",error_detail:n.policy?.outOfPolicy===!0?n.policy.reason:null}),a=Ta(_.receipt,y);return{status:S?"stalled":"ok",replyText:_.receipt,wroteDelta:_.wroteDelta,teamChatLogId:y,durationMs:_.durationMs}}catch(c){let d=c instanceof Error?c.message:String(c);return An(i,n,l,d,"error"),a=ba(d,null),{status:"error",errorKind:c instanceof ye?"target":"provider",message:d,teamChatLogId:null}}finally{o!==void 0&&clearInterval(o),s!==null&&await ZF(r,s),i!==null&&await BF(r,i,a??ba("chat turn exited without a terminal outcome",null))}}function PF(e,t){return{...e,stdout:{write:()=>{}},stderr:{write:r=>{t({kind:"warning",message:r})}}}}async function FF(e,t,r){return await O(e,n=>Kw(n,t,r))}async function UF(e,t,r){let n=await hb(e,t,r);if(n!==null)return Lu(n);let s=await O(e,i=>i.getAgentInflight(t,r));return s!==null?gb(t,r,s):`${r} is busy; wait and retry`}async function Mu(e,t){return await O(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 ju(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 WF(e,t){try{return(await O(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:JF(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()&&$e(JSON.stringify({event:"tracked_invocation_start_error",error:r instanceof Error?r.message:String(r)})),null}}async function BF(e,t,r){try{await O(e,n=>{n.finishTrackedInvocation(t,r)})}catch(n){ce()&&$e(JSON.stringify({event:"tracked_invocation_finish_error",id:t,error:n instanceof Error?n.message:String(n)}))}}async function qF(e,t,r){try{await O(e,n=>{n.updateTrackedInvocationRequestPayload(t,r)})}catch(n){ce()&&$e(JSON.stringify({event:"tracked_invocation_request_payload_error",id:t,error:n instanceof Error?n.message:String(n)}))}}function HF(e,t){if(t===null)return;let r=setInterval(()=>{O(e,n=>n.heartbeatTrackedInvocation(t)).catch(n=>{ce()&&$e(JSON.stringify({event:"tracked_invocation_heartbeat_error",id:t,error:n instanceof Error?n.message:String(n)}))})},DF);return r.unref?.(),r}function Ta(e,t){return{status:"done",result_summary:Os(e),error:null,team_chat_log_id:t}}function Du(e,t){return{status:"busy",result_summary:Os(e),error:e,team_chat_log_id:t}}function ba(e,t,r){return{status:"error",result_summary:Os(r===void 0?e:r),error:e,team_chat_log_id:t}}function Os(e){let t=e.replace(/\s+/gu," ").trim();return t.length<=500?t:`${t.slice(0,497)}...`}function JF(e,t,r){return`lmctl chat ${JSON.stringify(e)} ${t} ${JSON.stringify(r)}`}function XF(e,t){let r=fb(t,e);if(r.ok)return{sender:Wr(r.identity),origin:"agent"};if(r.reason==="unset")return{sender:null,origin:"operator"};throw new Error($s("chat"))}async function GF(e,t){if(t.explicitRoot!==void 0)return await O(e,n=>Ee(t.explicitRoot,n));if(t.operatorOrigin||t.sender===null)return t.receiverTeamfile;let r=t.sender;return await O(e,n=>lE(n,{sender:r,now:new Date})??t.receiverTeamfile)}async function VF(e,t){return await O(e,r=>ib({rootTeamfile:t.rootTeamfile,fromTeamfile:t.sender.teamfile,fromAlias:t.sender.alias,toTeamfile:t.receiverTeamfile,toAlias:t.receiverAlias,registry:KF(r,t.sender.teamfile,t.receiverTeamfile)}))}function KF(e,t,r){return{teams:[t,r].map(s=>YF(s,e))}}function YF(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 zF(e,t){return await O(e,r=>{let n=ce(),s=mr(r,{receiver_teamfile:t.receiver_teamfile,receiver_alias:t.receiver_alias,sender_teamfile:t.sender_teamfile,sender_alias:t.sender_alias,ttlMs:_r()});return s.acquired?(n&&$e(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:pb(s.previous)}})),{acquired:!0,lease:s.lease}):(n&&$e(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:pb(s.current)})),{acquired:!1,current:s.current})})}async function hb(e,t,r){return await O(e,n=>{for(let i=0;i<2;i+=1){let o=n.getTerminalLock(t,r);if(o===null)return null;if(Ru(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:Ru(s).live?s:null})}function pb(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 ZF(e,t){try{await O(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)}
2096
- `)}}function gb(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 QF(e,t){let r=_b(t.message),n=t.response===null?null:_b(t.response);try{return await O(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)}
2097
- `),null}}function An(e,t,r,n,s){e!==null||t===null||H({event:"chat_attempt_error",reason:s,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,origin:t.origin,error_detail:n,message_preview:Os(r)})}function _b(e){return e.length<=mb?{text:e,truncated:!1}:{text:e.slice(0,mb),truncated:!0}}var mb,DF,Pu=T(()=>{"use strict";Lt();Vt();Ls();ob();Rt();ea();he();Le();Dr();$u();Ea();Cu();Xd();mb=256*1024,DF=3e4});var Sb={};we(Sb,{parseIdleTimeoutMs:()=>Tb,resolvePromptInput:()=>Eb,runChat:()=>r1});import{readFileSync as e1}from"node:fs";async function r1(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(`${wb}
2094
+ ${jF(e)}`}function fb(e,t){let r=$u(e,t);return r.ok?{ok:!0,identity:r.identity,source:"session"}:r}function $u(e,t){let r=e[Vn];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 Ea=T(()=>{"use strict";st();Je();Rt()});function Wr(e){let t=Fr(e);if(t===null)throw new Error(`invalid agent identity: ${e}`);return{teamfile:t.teamfile,alias:t.alias,value:e}}var Cu=T(()=>{"use strict";Lt()});async function Sa(e){let t=e.onEvent??(()=>{}),r=PF(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=>XF(w,e.env??process.env)),f=u.sender,m=await GF(r,{explicitRoot:e.rootFlag,sender:f,receiverTeamfile:d,operatorOrigin:u.origin==="operator"}),p=f===null?null:await VF(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}
2095
+ `}),i=await WF(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=HF(r,i);try{Nn(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 h=await hb(r,d,c.alias);if(h!==null){let w=Lu(h);if(f!==null){let I=await Mu(r,{sender:f,receiverTeamfile:d,receiverAlias:c.alias,rootTeamfile:m,payload:e.prompt});return a=Ta(`enqueued mailbox message ${I.id}`,null),ju(I.id,f,d,c.alias)}return An(i,n,e.prompt,w,"unavailable"),a=Du(w,null),{status:"busy",message:w,teamChatLogId:null}}if(await FF(r,d,c.alias)){if(f!==null){let I=await Mu(r,{sender:f,receiverTeamfile:d,receiverAlias:c.alias,rootTeamfile:m,payload:e.prompt});return a=Ta(`enqueued mailbox message ${I.id}`,null),ju(I.id,f,d,c.alias)}let w=await UF(r,d,c.alias);return An(i,n,e.prompt,w,"unavailable"),a=Du(w,null),{status:"busy",message:w,teamChatLogId:null}}if(f!==null&&f.teamfile!==d){let w=await $(r,I=>aE(I,{root:m,sender:f,receiverTeamfile:d,receiverAlias:c.alias,now:new Date}));if(w.stop){let I=cE(w.chain);return An(i,n,e.prompt,I,"cycle"),a=ba(I,null),{status:"error",errorKind:"cycle",message:I,teamChatLogId:null}}}let g=await zF(r,{receiver_teamfile:d,receiver_alias:c.alias,sender_teamfile:f?.teamfile??d,sender_alias:f?.alias??"operator"});if(!g.acquired){let w=gb(d,c.alias,g.current);if(f!==null){let I=await Mu(r,{sender:f,receiverTeamfile:d,receiverAlias:c.alias,rootTeamfile:m,payload:e.prompt});return a=Ta(`enqueued mailbox message ${I.id}`,null),ju(I.id,f,d,c.alias)}return An(i,n,e.prompt,w,"unavailable"),a=Du(w,null),{status:"busy",message:w,teamChatLogId:null}}s=g.lease;let _=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 qF(r,i,w)}});l=_.prompt;let S=_.status==="stalled",y=null;if(S){let w=`provider stalled${_.stalledAfterMs!==void 0?` after ${_.stalledAfterMs}ms`:""}`;An(i,n,l,w,"error"),a=ba(w,null,_.receipt)}else y=await QF(r,{...n,message:l,response:_.receipt,status:n.policy?.outOfPolicy===!0?"out_of_policy":"ok",error_detail:n.policy?.outOfPolicy===!0?n.policy.reason:null}),a=Ta(_.receipt,y);return{status:S?"stalled":"ok",replyText:_.receipt,wroteDelta:_.wroteDelta,teamChatLogId:y,durationMs:_.durationMs}}catch(c){let d=c instanceof Error?c.message:String(c);return An(i,n,l,d,"error"),a=ba(d,null),{status:"error",errorKind:c instanceof ye?"target":"provider",message:d,teamChatLogId:null}}finally{o!==void 0&&clearInterval(o),s!==null&&await ZF(r,s),i!==null&&await BF(r,i,a??ba("chat turn exited without a terminal outcome",null))}}function PF(e,t){return{...e,stdout:{write:()=>{}},stderr:{write:r=>{t({kind:"warning",message:r})}}}}async function FF(e,t,r){return await $(e,n=>Kw(n,t,r))}async function UF(e,t,r){let n=await hb(e,t,r);if(n!==null)return Lu(n);let s=await $(e,i=>i.getAgentInflight(t,r));return s!==null?gb(t,r,s):`${r} is busy; wait and retry`}async function Mu(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 ju(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 WF(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:JF(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()&&Oe(JSON.stringify({event:"tracked_invocation_start_error",error:r instanceof Error?r.message:String(r)})),null}}async function BF(e,t,r){try{await $(e,n=>{n.finishTrackedInvocation(t,r)})}catch(n){ce()&&Oe(JSON.stringify({event:"tracked_invocation_finish_error",id:t,error:n instanceof Error?n.message:String(n)}))}}async function qF(e,t,r){try{await $(e,n=>{n.updateTrackedInvocationRequestPayload(t,r)})}catch(n){ce()&&Oe(JSON.stringify({event:"tracked_invocation_request_payload_error",id:t,error:n instanceof Error?n.message:String(n)}))}}function HF(e,t){if(t===null)return;let r=setInterval(()=>{$(e,n=>n.heartbeatTrackedInvocation(t)).catch(n=>{ce()&&Oe(JSON.stringify({event:"tracked_invocation_heartbeat_error",id:t,error:n instanceof Error?n.message:String(n)}))})},DF);return r.unref?.(),r}function Ta(e,t){return{status:"done",result_summary:$s(e),error:null,team_chat_log_id:t}}function Du(e,t){return{status:"busy",result_summary:$s(e),error:e,team_chat_log_id:t}}function ba(e,t,r){return{status:"error",result_summary:$s(r===void 0?e:r),error:e,team_chat_log_id:t}}function $s(e){let t=e.replace(/\s+/gu," ").trim();return t.length<=500?t:`${t.slice(0,497)}...`}function JF(e,t,r){return`lmctl chat ${JSON.stringify(e)} ${t} ${JSON.stringify(r)}`}function XF(e,t){let r=fb(t,e);if(r.ok)return{sender:Wr(r.identity),origin:"agent"};if(r.reason==="unset")return{sender:null,origin:"operator"};throw new Error(Os("chat"))}async function GF(e,t){if(t.explicitRoot!==void 0)return await $(e,n=>Ee(t.explicitRoot,n));if(t.operatorOrigin||t.sender===null)return t.receiverTeamfile;let r=t.sender;return await $(e,n=>lE(n,{sender:r,now:new Date})??t.receiverTeamfile)}async function VF(e,t){return await $(e,r=>ib({rootTeamfile:t.rootTeamfile,fromTeamfile:t.sender.teamfile,fromAlias:t.sender.alias,toTeamfile:t.receiverTeamfile,toAlias:t.receiverAlias,registry:KF(r,t.sender.teamfile,t.receiverTeamfile)}))}function KF(e,t,r){return{teams:[t,r].map(s=>YF(s,e))}}function YF(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 zF(e,t){return await $(e,r=>{let n=ce(),s=mr(r,{receiver_teamfile:t.receiver_teamfile,receiver_alias:t.receiver_alias,sender_teamfile:t.sender_teamfile,sender_alias:t.sender_alias,ttlMs:_r()});return s.acquired?(n&&Oe(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:pb(s.previous)}})),{acquired:!0,lease:s.lease}):(n&&Oe(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:pb(s.current)})),{acquired:!1,current:s.current})})}async function hb(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(Ru(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:Ru(s).live?s:null})}function pb(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 ZF(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)}
2096
+ `)}}function gb(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 QF(e,t){let r=_b(t.message),n=t.response===null?null:_b(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)}
2097
+ `),null}}function An(e,t,r,n,s){e!==null||t===null||H({event:"chat_attempt_error",reason:s,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,origin:t.origin,error_detail:n,message_preview:$s(r)})}function _b(e){return e.length<=mb?{text:e,truncated:!1}:{text:e.slice(0,mb),truncated:!0}}var mb,DF,Pu=T(()=>{"use strict";Lt();Vt();Ls();ob();Rt();ea();he();Le();Dr();Ou();Ea();Cu();Xd();mb=256*1024,DF=3e4});var Sb={};we(Sb,{parseIdleTimeoutMs:()=>Tb,resolvePromptInput:()=>Eb,runChat:()=>r1});import{readFileSync as e1}from"node:fs";async function r1(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(`${wb}
2098
2098
  `),e.length===0?2:0;let n=n1(e);if(typeof n=="string")return t.stderr.write(`error: ${n}
2099
2099
  ${wb}
2100
2100
  `),2;if(n.promptFile!==void 0){let u=await Eb(n.promptFile,t);if(typeof u!="string")return t.stderr.write(`error: ${u.error}
2101
2101
  `),2;n.prompt=u}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)
2102
- `),2):await O(t,async f=>{let m=f.getRun(u);if(m===null)return t.stderr.write(`error: run ${u}: not found
2102
+ `),2):await $(t,async f=>{let m=f.getRun(u);if(m===null)return t.stderr.write(`error: run ${u}: not found
2103
2103
  `),1;if(m.terminal_state!==null&&m.terminal_state.length>0)return v(t,`run ${u}: already terminal (${m.terminal_state}); chat --run cannot resume a terminated run`);let p=Ho(f,u);if(p===null)return t.stderr.write(`error: run ${u}: no pending operator-answerable attention (chat --run only resumes paused runs)
2104
2104
  `),1;if(p.kind==="workflow_escalation"){if(n.done)return t.stderr.write(`error: --done is not valid for workflow_escalation (the decision itself is terminal)
2105
2105
  `),2;let h=f.resumeEscalation(p.attention_id,n.prompt);return h.resumed===!0?(t.stdout.write(`run ${u}: escalation resumed (decision: ${n.prompt})
@@ -2124,7 +2124,7 @@ ${wb}
2124
2124
  `):t.stdout.write(`${u.replyText}${u.replyText.endsWith(`
2125
2125
  `)?"":`
2126
2126
  `}`),u.status==="stalled"?1:0)}else{if(s.provider===void 0)return t.stderr.write(`error: chat raw mode (bare sessionid / --session) requires --provider <name>
2127
- `),2;i={provider:s.provider,sessionId:s.sessionid,cwd:process.cwd()}}let o=!1,a=ce(),l=0,c=0,d=0;try{let u={provider:i.provider,sessionId:i.sessionId,cwd:i.cwd,prompt:n.prompt,permissionMode:n.permissionMode,env:r,onDelta:p=>{o=!0,a&&(l+=1,d=Buffer.byteLength(p,"utf8"),c+=d),t.stdout.write(p)},onProgress:p=>bb(t,i.alias??"(raw)",p)};i.model!==void 0&&(u.model=i.model),i.effort!==void 0&&(u.effort=i.effort),i.alias!==void 0&&(u.alias=i.alias),i.isLead!==void 0&&(u.isLead=i.isLead),n.idleTimeoutMs!==void 0&&(u.timeoutMs=n.idleTimeoutMs);let f=await St(u);a&&$e(JSON.stringify({event:"chat_return",alias:i.alias??"(raw)",provider:i.provider,streamed:o,blockCount:l,streamedBytes:c,resultTextBytes:Buffer.byteLength(f.text,"utf8"),lastChunkBytes:d,tailPreview:i1(f.text,200)}));let m=f.status==="stalled";return o?f.text.endsWith(`
2127
+ `),2;i={provider:s.provider,sessionId:s.sessionid,cwd:process.cwd()}}let o=!1,a=ce(),l=0,c=0,d=0;try{let u={provider:i.provider,sessionId:i.sessionId,cwd:i.cwd,prompt:n.prompt,permissionMode:n.permissionMode,env:r,onDelta:p=>{o=!0,a&&(l+=1,d=Buffer.byteLength(p,"utf8"),c+=d),t.stdout.write(p)},onProgress:p=>bb(t,i.alias??"(raw)",p)};i.model!==void 0&&(u.model=i.model),i.effort!==void 0&&(u.effort=i.effort),i.alias!==void 0&&(u.alias=i.alias),i.isLead!==void 0&&(u.isLead=i.isLead),n.idleTimeoutMs!==void 0&&(u.timeoutMs=n.idleTimeoutMs);let f=await St(u);a&&Oe(JSON.stringify({event:"chat_return",alias:i.alias??"(raw)",provider:i.provider,streamed:o,blockCount:l,streamedBytes:c,resultTextBytes:Buffer.byteLength(f.text,"utf8"),lastChunkBytes:d,tailPreview:i1(f.text,200)}));let m=f.status==="stalled";return o?f.text.endsWith(`
2128
2128
  `)||t.stdout.write(`
2129
2129
  `):t.stdout.write(`${f.text}${f.text.endsWith(`
2130
2130
  `)?"":`
@@ -2158,15 +2158,15 @@ Send a prompt to a team member or raw provider session, or answer a paused run.`
2158
2158
  ${qu}`);if(n.positionals.length===0)return v(t,`recover requires a <teamfile>
2159
2159
 
2160
2160
  ${qu}`);if(n.positionals.length>2)return v(t,`unexpected argument: ${n.positionals[2]}`);let s=n.positionals[0],i=Fr(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(V(n,"--all")&&l!==void 0)return v(t,"recover --all is mutually exclusive with <alias>");let c;try{c=await w1(t,o,l)}catch(p){if(p instanceof ye)return v(t,p.message);throw p}let d=r.now??new Date,u=V(n,"--dry-run"),f=[];for(let p of c)f.push(await E1(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(V(n,"--json"))ae(t,{dryRun:u,now:d.toISOString(),summary:m,members:f});else{for(let p of f)t.stdout.write(T1(p));t.stdout.write(`Recover checked ${m.checked}: ${u?`${m.wouldRecover} would recover`:`${m.recovered} recovered`}, ${m.skipped} skipped, ${m.errors} error(s).
2161
- `)}return m.errors>0?1:0}async function w1(e,t,r){return await O(e,n=>{let s=Ee(t,n);if(r!==void 0){let i=Pe(s,n);if(i.parseErrors.length>0)throw new ye(`lmctl: ${t}: ${i.parseErrors.join("; ")}`);let o=na(i,r);return o?.teamfile!==void 0?Hu(Rb(Ab(s),o.teamfile),n,new Set):[He(t,r,n)]}return Hu(s,n,new Set)})}function Hu(e,t,r){let n=Ee(e,t);if(r.has(n))return[];r.add(n);let s=Pe(n,t);if(s.parseErrors.length>0)throw new ye(`lmctl: ${n}: ${s.parseErrors.join("; ")}`);let i=[];for(let o of s.members){if(o.teamfile!==void 0){i.push(...Hu(Rb(Ab(n),o.teamfile),t,r));continue}o.session!==void 0&&i.push(He(n,o.alias,t))}return i}async function E1(e,t,r){let n;try{let a=await _t(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 O(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 Sa({teamfile:t.teamfile,alias:t.alias,prompt:g1,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 T1(e){let t=e.sessionLimit?.resets_at??"unknown",r=e.reason===null?"":` (${e.reason})`;return`${e.alias}: ${e.action} resets_at=${t}${r}
2162
- `}var g1,qu,$b=T(()=>{"use strict";Fu();Br();Vt();Rt();Lt();Pu();Le();g1="Your session limit reset time has passed. Continue your work from the last actionable point.",qu=["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(`
2163
- `)});var Ms,s5,Ju=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}],s5=Ms.length});import{spawn as b1}from"node:child_process";async function Cb(e,t,r){let n=v1.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 k1(n.name,s)}function k1(e,t){return e==="lmctl_chat"?I1(t):{status:"error",code:404,message:`unknown local tool: ${e}`}}function I1(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()&&$e(JSON.stringify({event:"mcp_chat_spawn",team:r,alias:n})),N1(s,process.cwd())}function N1(e,t){return new Promise(r=>{let n=!1,s,i=d=>{n||(n=!0,s!==void 0&&clearTimeout(s),r(d))},o=b1("lmctl",e,{cwd:t,env:process.env,stdio:["ignore","pipe","pipe"]}),a=x1(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()&&$e(JSON.stringify({event:"mcp_chat_payload",bytes:Buffer.byteLength(l,"utf8"),lines:l.split(`
2164
- `).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 x1(e){let t=e.LMCTL_MCP_CHAT_TIMEOUT_MS;if(t===void 0||t.trim().length===0)return Ob;let r=Number(t);return!Number.isFinite(r)||r<=0?Ob:r}function Xu(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:S1),s=e.getConfig("api.token"),i=t.LMCTL_API_TOKEN!==void 0&&t.LMCTL_API_TOKEN.length>0?t.LMCTL_API_TOKEN:s;return{baseUrl:n,token:i}}var S1,Ob,v1,Gu=T(()=>{"use strict";Ju();he();S1="http://127.0.0.1:8787",Ob=30*60*1e3,v1=new Map(Ms.map(e=>[e.name,e]))});async function $1(e,t){let r=e.id===void 0,n=e.id??null;if(e.method==="exit")return r||t.io.write(Vu({jsonrpc:"2.0",id:n,result:null})),{kind:"exit"};if(e.method==="initialize")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{protocolVersion:A1,capabilities:{tools:{listChanged:!1}},serverInfo:{name:R1,version:L1}}}};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 Cb(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 Vu(e){return`${JSON.stringify(e)}
2165
- `}async function Mb(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(Vu({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 $1(l,e);c.kind==="response"?e.io.write(Vu(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(`
2161
+ `)}return m.errors>0?1:0}async function w1(e,t,r){return await $(e,n=>{let s=Ee(t,n);if(r!==void 0){let i=Pe(s,n);if(i.parseErrors.length>0)throw new ye(`lmctl: ${t}: ${i.parseErrors.join("; ")}`);let o=na(i,r);return o?.teamfile!==void 0?Hu(Rb(Ab(s),o.teamfile),n,new Set):[He(t,r,n)]}return Hu(s,n,new Set)})}function Hu(e,t,r){let n=Ee(e,t);if(r.has(n))return[];r.add(n);let s=Pe(n,t);if(s.parseErrors.length>0)throw new ye(`lmctl: ${n}: ${s.parseErrors.join("; ")}`);let i=[];for(let o of s.members){if(o.teamfile!==void 0){i.push(...Hu(Rb(Ab(n),o.teamfile),t,r));continue}o.session!==void 0&&i.push(He(n,o.alias,t))}return i}async function E1(e,t,r){let n;try{let a=await _t(t.sessionid,t.provider);if(a===null)return Ot(t,"session_not_found",null,"session detail not found");n=Cs(a.messages)}catch(a){return Ot(t,"load_error",null,a instanceof Error?a.message:String(a))}if(n===null)return Ot(t,"not_limited",null,"no current session-limit marker");if(n.resets_at===null)return Ot(t,"unknown_reset",n,"reset time could not be parsed");let s=Date.parse(n.resets_at);if(!Number.isFinite(s))return Ot(t,"unknown_reset",n,"reset time could not be parsed");if(s>r.now.getTime())return Ot(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 Ot(t,"busy",n,`in-flight since ${i.started_at}`);if(r.dryRun)return Ot(t,"would_recover",n,null);let o=await Sa({teamfile:t.teamfile,alias:t.alias,prompt:g1,permissionMode:"yolo",io:e,env:process.env});return o.status==="ok"||o.status==="stalled"?Ot(t,"recovered",n,null):Ot(t,o.status==="busy"?"busy":"send_error",n,o.message)}function Ot(e,t,r,n){return{alias:e.alias,teamfile:e.teamfile,provider:e.provider,sessionid:e.sessionid,action:t,sessionLimit:r,reason:n}}function T1(e){let t=e.sessionLimit?.resets_at??"unknown",r=e.reason===null?"":` (${e.reason})`;return`${e.alias}: ${e.action} resets_at=${t}${r}
2162
+ `}var g1,qu,Ob=T(()=>{"use strict";Fu();Br();Vt();Rt();Lt();Pu();Le();g1="Your session limit reset time has passed. Continue your work from the last actionable point.",qu=["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(`
2163
+ `)});var Ms,s5,Ju=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}],s5=Ms.length});import{spawn as b1}from"node:child_process";async function Cb(e,t,r){let n=v1.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 k1(n.name,s)}function k1(e,t){return e==="lmctl_chat"?I1(t):{status:"error",code:404,message:`unknown local tool: ${e}`}}function I1(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()&&Oe(JSON.stringify({event:"mcp_chat_spawn",team:r,alias:n})),N1(s,process.cwd())}function N1(e,t){return new Promise(r=>{let n=!1,s,i=d=>{n||(n=!0,s!==void 0&&clearTimeout(s),r(d))},o=b1("lmctl",e,{cwd:t,env:process.env,stdio:["ignore","pipe","pipe"]}),a=x1(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()&&Oe(JSON.stringify({event:"mcp_chat_payload",bytes:Buffer.byteLength(l,"utf8"),lines:l.split(`
2164
+ `).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 x1(e){let t=e.LMCTL_MCP_CHAT_TIMEOUT_MS;if(t===void 0||t.trim().length===0)return $b;let r=Number(t);return!Number.isFinite(r)||r<=0?$b:r}function Xu(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:S1),s=e.getConfig("api.token"),i=t.LMCTL_API_TOKEN!==void 0&&t.LMCTL_API_TOKEN.length>0?t.LMCTL_API_TOKEN:s;return{baseUrl:n,token:i}}var S1,$b,v1,Gu=T(()=>{"use strict";Ju();he();S1="http://127.0.0.1:8787",$b=30*60*1e3,v1=new Map(Ms.map(e=>[e.name,e]))});async function O1(e,t){let r=e.id===void 0,n=e.id??null;if(e.method==="exit")return r||t.io.write(Vu({jsonrpc:"2.0",id:n,result:null})),{kind:"exit"};if(e.method==="initialize")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{protocolVersion:A1,capabilities:{tools:{listChanged:!1}},serverInfo:{name:R1,version:L1}}}};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 Cb(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 Vu(e){return`${JSON.stringify(e)}
2165
+ `}async function Mb(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(Vu({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 O1(l,e);c.kind==="response"?e.io.write(Vu(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(`
2166
2166
  `);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(`
2167
2167
  `)}};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}
2168
- `),a.finally(()=>c(1))})})}var A1,R1,L1,jb=T(()=>{"use strict";Ju();Gu();A1="2025-06-18",R1="lmctl",L1="0.0.1"});var Pb={};we(Pb,{runMcp:()=>C1});async function C1(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(O1),0;if(e.length>0)return t.stderr.write(`usage: lmctl mcp
2169
- `),2;H({event:"mcp_bridge_start",pid:process.pid});let n=t.dal===void 0,s=t.dal??M1(),i=1;try{let o=s===void 0?Xu({getConfig:()=>null},process.env):Xu(s,process.env);return i=await Mb({io:{write:l=>t.stdout.write(l),log:l=>t.stderr.write(l)},dispatch:{config:o,...s!==void 0?{dal:s}:{}}},r),i}finally{H({event:"mcp_bridge_exit",pid:process.pid,exit_code:i}),n&&s!==void 0&&s.close()}}function M1(){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(H({event:"mcp_bridge_db_open_failed",pid:process.pid,attempt:r,db_path:e,error_message:s}),r<t&&Db(s))j1(50*r);else if(!Db(s))break}}function Db(e){return/SQLITE_BUSY|database is locked|database is busy/i.test(e)}function j1(e){let t=new Int32Array(new SharedArrayBuffer(4));Atomics.wait(t,0,0,e)}var O1,Fb=T(()=>{"use strict";Ze();Gu();jb();he();Je();O1=`usage: lmctl mcp
2168
+ `),a.finally(()=>c(1))})})}var A1,R1,L1,jb=T(()=>{"use strict";Ju();Gu();A1="2025-06-18",R1="lmctl",L1="0.0.1"});var Pb={};we(Pb,{runMcp:()=>C1});async function C1(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($1),0;if(e.length>0)return t.stderr.write(`usage: lmctl mcp
2169
+ `),2;H({event:"mcp_bridge_start",pid:process.pid});let n=t.dal===void 0,s=t.dal??M1(),i=1;try{let o=s===void 0?Xu({getConfig:()=>null},process.env):Xu(s,process.env);return i=await Mb({io:{write:l=>t.stdout.write(l),log:l=>t.stderr.write(l)},dispatch:{config:o,...s!==void 0?{dal:s}:{}}},r),i}finally{H({event:"mcp_bridge_exit",pid:process.pid,exit_code:i}),n&&s!==void 0&&s.close()}}function M1(){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(H({event:"mcp_bridge_db_open_failed",pid:process.pid,attempt:r,db_path:e,error_message:s}),r<t&&Db(s))j1(50*r);else if(!Db(s))break}}function Db(e){return/SQLITE_BUSY|database is locked|database is busy/i.test(e)}function j1(e){let t=new Int32Array(new SharedArrayBuffer(4));Atomics.wait(t,0,0,e)}var $1,Fb=T(()=>{"use strict";Ze();Gu();jb();he();Je();$1=`usage: lmctl mcp
2170
2170
 
2171
2171
  Start the stdio MCP bridge. The bridge resolves api.url and api.token from
2172
2172
  local config, then uses stdin/stdout for JSON-RPC frames.
@@ -2217,7 +2217,7 @@ last_run_id: 0
2217
2217
  ## Expected
2218
2218
 
2219
2219
  ## Cleanup
2220
- `}var Xb,Vb=T(()=>{"use strict";Zu();Xb=Na(mU(import.meta.url),"../../config/ai_test_templates")});import{createHash as gU}from"node:crypto";import{existsSync as yU,mkdirSync as wU,writeFileSync as EU}from"node:fs";import{dirname as TU,join as Ln}from"node:path";function Qu(e){return typeof e=="string"&&e.startsWith(Kb)}function NU(e){if(!Qu(e))throw new ht(`not an lmctl:// URI: ${e}`,"malformed");let t=e.slice(Kb.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(!kU.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 xU(e,t,r){if(e==="workflow")return go(t,r);let n=e==="mcp"?Ln("templates","mcp",`${t}.json`):Ln("templates","skills",t,"SKILL.md");for(let s of sd(r)){let i=Ln(s,n);if(yU(i))return i}return null}function AU(e,t,r){let n=Ln(nd(r),SU,e);return e==="skill"?Ln(n,t,"SKILL.md"):Ln(n,`${t}${e==="workflow"?".compound.json":".json"}`)}function RU(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 Yb(e,t){let{kind:r,name:n,ref:s}=NU(e),i=xU(r,n,t);if(i!==null)return i;let o=`${bU}${r}/${n}`,a;try{a=await fetch(o,{signal:AbortSignal.timeout(vU)})}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=IU.exec(s);if(d!==null){let u=gU("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(!RU(r,l))throw new ht(`lmctl:// '${e}' remote artifact failed shape validation for ${r} \u2014 discarded, NOT cached.`,"validation-failure");let c=AU(r,n,t);return wU(TU(c),{recursive:!0}),EU(c,l,"utf8"),c}var Kb,bU,SU,vU,kU,ht,IU,zb=T(()=>{"use strict";id();Kb="lmctl://",bU="https://lmctl.com/templates/",SU=".cache",vU=8e3,kU=new Set(["workflow","mcp","skill"]),ht=class extends Error{reason;constructor(t,r="malformed"){super(t),this.reason=r,this.name="LmctlUriError"}},IU=/^(?:sha256[:-])?([0-9a-f]{64})$/i});import{spawnSync as LU}from"node:child_process";import{cpSync as Zb,existsSync as $U,mkdirSync as OU,mkdtempSync as CU,readFileSync as V5,statSync as MU,writeFileSync as Qb}from"node:fs";import{homedir as jU,tmpdir as DU}from"node:os";import{basename as eS,join as Yt}from"node:path";function ef(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function tf(e,t,r){if(Array.isArray(e)){for(let n of e)tf(n,t,r);return}if(ef(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))tf(n,t,r)}}function WU(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(!(!ef(a)||!Array.isArray(a.steps)))for(let l of a.steps)ef(l)&&l.members!==void 0&&tf(l.members,t.alias,r)}let s=i=>{let o=new Map;for(let a of i)o.set(UU(a),a);return[...o.values()]};return{mcp:s(r.mcp),skills:s(r.skills)}}function BU(e,t){return e.listProjects().find(r=>r.team_id===t.team_id)?.local_path}async function qU(e,t){let r;try{r=await fetch(e,{signal:AbortSignal.timeout(PU)})}catch(s){throw new yr(t,`fetch ${e} failed: ${s.message}`)}if(!r.ok)throw new yr(t,`fetch ${e} \u2192 HTTP ${r.status}`);let n=await r.text();if(n.length>tS)throw new yr(t,`fetched ${e} exceeds ${tS} bytes`);return n}function HU(e,t,r,n){let s=LU(e,t,{cwd:r,env:er(void 0,r),encoding:"utf8",timeout:6e4});if(s.error)throw new yr(n,`spawn ${e} failed: ${s.error.message}`);if(s.status!==0)throw new yr(n,`${e} ${t.slice(0,3).join(" ")} exited ${s.status}: ${(s.stderr??"").trim().slice(0,200)}`)}function JU(e){if(typeof e!="string")return e.name;let t=eS(e.replace(/\/+$/,""));return t.toLowerCase()==="skill.md"?eS(e.replace(/\/skill\.md$/i,"")):t}async function rS(e,t,r){let n=JU(e),s=Yt(t,n);if(OU(s,{recursive:!0}),typeof e!="string")return Qb(Yt(s,"SKILL.md"),e.content,"utf8"),{name:n,dir:s};if(Qu(e)&&(e=await Yb(e)),sS.test(e))return Qb(Yt(s,"SKILL.md"),await qU(e,r),"utf8"),{name:n,dir:s};if(!$U(e))throw new yr(r,`skill path not found: ${e}`);return MU(e).isDirectory()?(Zb(e,s,{recursive:!0}),{name:n,dir:s}):(Zb(e,Yt(s,"SKILL.md")),{name:n,dir:s})}async function iS(e){let{dal:t,member:r,stderr:n}=e,s=WU(t,r);if(s.mcp.length===0&&s.skills.length===0)return;let i=Ue(r),o=r.sessiondir||e.baseDir||BU(t,r)||process.cwd(),a=l=>{n.write(`[seed:${r.alias}] ${l}
2220
+ `}var Xb,Vb=T(()=>{"use strict";Zu();Xb=Na(mU(import.meta.url),"../../config/ai_test_templates")});import{createHash as gU}from"node:crypto";import{existsSync as yU,mkdirSync as wU,writeFileSync as EU}from"node:fs";import{dirname as TU,join as Ln}from"node:path";function Qu(e){return typeof e=="string"&&e.startsWith(Kb)}function NU(e){if(!Qu(e))throw new ht(`not an lmctl:// URI: ${e}`,"malformed");let t=e.slice(Kb.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(!kU.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 xU(e,t,r){if(e==="workflow")return go(t,r);let n=e==="mcp"?Ln("templates","mcp",`${t}.json`):Ln("templates","skills",t,"SKILL.md");for(let s of sd(r)){let i=Ln(s,n);if(yU(i))return i}return null}function AU(e,t,r){let n=Ln(nd(r),SU,e);return e==="skill"?Ln(n,t,"SKILL.md"):Ln(n,`${t}${e==="workflow"?".compound.json":".json"}`)}function RU(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 Yb(e,t){let{kind:r,name:n,ref:s}=NU(e),i=xU(r,n,t);if(i!==null)return i;let o=`${bU}${r}/${n}`,a;try{a=await fetch(o,{signal:AbortSignal.timeout(vU)})}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=IU.exec(s);if(d!==null){let u=gU("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(!RU(r,l))throw new ht(`lmctl:// '${e}' remote artifact failed shape validation for ${r} \u2014 discarded, NOT cached.`,"validation-failure");let c=AU(r,n,t);return wU(TU(c),{recursive:!0}),EU(c,l,"utf8"),c}var Kb,bU,SU,vU,kU,ht,IU,zb=T(()=>{"use strict";id();Kb="lmctl://",bU="https://lmctl.com/templates/",SU=".cache",vU=8e3,kU=new Set(["workflow","mcp","skill"]),ht=class extends Error{reason;constructor(t,r="malformed"){super(t),this.reason=r,this.name="LmctlUriError"}},IU=/^(?:sha256[:-])?([0-9a-f]{64})$/i});import{spawnSync as LU}from"node:child_process";import{cpSync as Zb,existsSync as OU,mkdirSync as $U,mkdtempSync as CU,readFileSync as V5,statSync as MU,writeFileSync as Qb}from"node:fs";import{homedir as jU,tmpdir as DU}from"node:os";import{basename as eS,join as Yt}from"node:path";function ef(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function tf(e,t,r){if(Array.isArray(e)){for(let n of e)tf(n,t,r);return}if(ef(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))tf(n,t,r)}}function WU(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(!(!ef(a)||!Array.isArray(a.steps)))for(let l of a.steps)ef(l)&&l.members!==void 0&&tf(l.members,t.alias,r)}let s=i=>{let o=new Map;for(let a of i)o.set(UU(a),a);return[...o.values()]};return{mcp:s(r.mcp),skills:s(r.skills)}}function BU(e,t){return e.listProjects().find(r=>r.team_id===t.team_id)?.local_path}async function qU(e,t){let r;try{r=await fetch(e,{signal:AbortSignal.timeout(PU)})}catch(s){throw new yr(t,`fetch ${e} failed: ${s.message}`)}if(!r.ok)throw new yr(t,`fetch ${e} \u2192 HTTP ${r.status}`);let n=await r.text();if(n.length>tS)throw new yr(t,`fetched ${e} exceeds ${tS} bytes`);return n}function HU(e,t,r,n){let s=LU(e,t,{cwd:r,env:er(void 0,r),encoding:"utf8",timeout:6e4});if(s.error)throw new yr(n,`spawn ${e} failed: ${s.error.message}`);if(s.status!==0)throw new yr(n,`${e} ${t.slice(0,3).join(" ")} exited ${s.status}: ${(s.stderr??"").trim().slice(0,200)}`)}function JU(e){if(typeof e!="string")return e.name;let t=eS(e.replace(/\/+$/,""));return t.toLowerCase()==="skill.md"?eS(e.replace(/\/skill\.md$/i,"")):t}async function rS(e,t,r){let n=JU(e),s=Yt(t,n);if($U(s,{recursive:!0}),typeof e!="string")return Qb(Yt(s,"SKILL.md"),e.content,"utf8"),{name:n,dir:s};if(Qu(e)&&(e=await Yb(e)),sS.test(e))return Qb(Yt(s,"SKILL.md"),await qU(e,r),"utf8"),{name:n,dir:s};if(!OU(e))throw new yr(r,`skill path not found: ${e}`);return MU(e).isDirectory()?(Zb(e,s,{recursive:!0}),{name:n,dir:s}):(Zb(e,Yt(s,"SKILL.md")),{name:n,dir:s})}async function iS(e){let{dal:t,member:r,stderr:n}=e,s=WU(t,r);if(s.mcp.length===0&&s.skills.length===0)return;let i=Ue(r),o=r.sessiondir||e.baseDir||BU(t,r)||process.cwd(),a=l=>{n.write(`[seed:${r.alias}] ${l}
2221
2221
  `)};if(s.mcp.length>0&&a(`MCP capability install is disabled in lmctl; ${s.mcp.length} declared server(s) NOT installed. Use nomcp for MCP server access.`),s.skills.length>0)if(FU.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=CU(Yt(DU(),`lmctl-skill-${r.alias}-`));for(let c of s.skills){let d=typeof c=="string"&&!sS.test(c)?c:(await rS(c,l,r.alias)).dir;HU(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(nS[i]!==void 0){let l=nS[i]();for(let c of s.skills)await rS(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 yr,sS,PU,tS,FU,UU,xa,nS,oS=T(()=>{"use strict";Ze();zb();st();Ls();yr=class extends Error{alias;constructor(t,r){super(`capability install failed for ${t}: ${r}`),this.alias=t,this.name="CapabilityInstallError"}},sS=/^https?:\/\//i,PU=8e3,tS=1e6,FU=new Set(["opencode"]),UU=e=>JSON.stringify(e),xa=()=>process.env.HOME??jU();nS={claude:()=>Yt(xa(),".claude","skills"),qwen:()=>Yt(xa(),".qwen","skills"),codex:()=>Yt(xa(),".codex","skills"),copilot:()=>Yt(xa(),".copilot","skills")}});var rf,aS=T(()=>{"use strict";rf=`---
2222
2222
 
2223
2223
  # Durable memory \u2014 how to use it
@@ -2229,7 +2229,7 @@ ON EVERY NEW TASK:
2229
2229
  2. Pull only the chapters relevant to your current task. Don't load everything.
2230
2230
  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.
2231
2231
 
2232
- Don't dump all of durable-memory into your context. The pattern is index-first, chapter-on-demand.`});var cS={};we(cS,{runTeam:()=>VU});import{join as XU}from"node:path";async function VU(e,t){let[r,...n]=e;if(r==="--help"||r==="-h"||r==="help")return t.stdout.write(GU),0;try{return await O(t,async s=>{switch(r){case"create":return YU(n,t,s);case"list":return zU(n,t,s);case"show":return ZU(n,t,s);case"add-member":return QU(n,t,s);case"seed":return lS(n,t,s,!1);case"refresh":return lS(n,t,s,!0);case"companion":return tW(n,t,s);case"list-roots":return KU(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 KU(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 V(n,"--json")?ae(t,s):t.stdout.write(s.map(i=>`${i.name??"(unnamed)"} ${i.teamfile_path} ${i.last_seeded_at??""}`).join(`
2232
+ Don't dump all of durable-memory into your context. The pattern is index-first, chapter-on-demand.`});var cS={};we(cS,{runTeam:()=>VU});import{join as XU}from"node:path";async function VU(e,t){let[r,...n]=e;if(r==="--help"||r==="-h"||r==="help")return t.stdout.write(GU),0;try{return await $(t,async s=>{switch(r){case"create":return YU(n,t,s);case"list":return zU(n,t,s);case"show":return ZU(n,t,s);case"add-member":return QU(n,t,s);case"seed":return lS(n,t,s,!1);case"refresh":return lS(n,t,s,!0);case"companion":return tW(n,t,s);case"list-roots":return KU(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 KU(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 V(n,"--json")?ae(t,s):t.stdout.write(s.map(i=>`${i.name??"(unnamed)"} ${i.teamfile_path} ${i.last_seeded_at??""}`).join(`
2233
2233
  `)+(s.length>0?`
2234
2234
  `:"")),0}function YU(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}
2235
2235
  `),0}function zU(e,t,r){let n=Z(e,[]);if(n.error!==void 0)return v(t,n.error);let s=r.listTeams();return V(n,"--json")?ae(t,s):t.stdout.write(`${s.map(i=>`${i.id} ${i.name}`).join(`
@@ -2237,7 +2237,7 @@ Don't dump all of durable-memory into your context. The pattern is index-first,
2237
2237
  `:""}`),0}function ZU(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(V(n,"--json"))ae(t,{team:i,members:o});else{t.stdout.write(`team ${i.name}
2238
2238
  `);for(let a of o)t.stdout.write(`- ${a.alias} ${Ue(a)} ${a.sessionid??"(unseeded)"}
2239
2239
  `)}return 0}function QU(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")??XU(Tr(),"sessions",i.name,o)});return V(n,"--json")?ae(t,l):t.stdout.write(`added member ${l.alias} to ${i.name}
2240
- `),0}async function lS(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=eW(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=fy(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))Hb(f,r),Gb(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 h=p.role_prompt??"",g=h.length>0?`${h}
2240
+ `),0}async function lS(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=eW(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=fy(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))Hb(f,r),Gb(f);let d=[],u=!1;for(let f of l){let m=await Oi({member:f,dal:r}),p=r.updateTeamMemberSession(f.id,m.sessionid);if(p!==null){let h=p.role_prompt??"",g=h.length>0?`${h}
2241
2241
 
2242
2242
  ${rf}`:rf;r.setMemberPromptSnapshot(f.id,g),d.push(p);let _=ka(Ue(p),m.sessionid);_!==null&&t.stderr.write(`[seeded ${p.alias}] customize/compact in its native TUI:
2243
2243
  ${_}
@@ -2256,7 +2256,7 @@ ${rf}`:rf;r.setMemberPromptSnapshot(f.id,g),d.push(p);let _=ka(Ue(p),m.sessionid
2256
2256
  Manage DB-backed teams, members, and provider session lifecycle. Use seed or
2257
2257
  refresh to create/update native provider sessions for team members.
2258
2258
  `});var gS={};we(gS,{applyMaxBytes:()=>Aa,renderMessage:()=>_S,runTail:()=>oW});async function oW(e,t={stdout:process.stdout,stderr:process.stderr}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(`${iW}
2259
- `),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?nW: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=V(r,"--watch"),a=P(r,"--watch-interval"),l=a===void 0?sW: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 O(t,async p=>aW(t,p,m,i,o,l))}catch(p){return je(t,p)}}let d=hr(rW,{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 O(t,g=>Ee(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 h=At(p);if(h===void 0)return v(t,`tail: ${d.teamfile} has no Lead member; pass <tf>:<alias>`);try{let g=await O(t,_=>He(d.teamfile,h.alias,_));u={provider:g.provider,sessionId:g.sessionid,cwd:g.sessiondir}}catch(g){return g instanceof ye?v(t,g.message):je(t,g)}}else try{let m=await O(t,p=>He(d.teamfile,d.alias,p));u={provider:m.provider,sessionId:m.sessionid,cwd:m.sessiondir}}catch(m){return m instanceof ye?v(t,m.message):je(t,m)}else{let m=d.sessionid,p=d.provider;if(p===void 0){let h=await Ia(m);if(h.length===0)return v(t,`tail: session "${m}" not found in any provider store`);if(h.length>1)return v(t,`tail: session "${m}" matches multiple providers (${h.join(", ")}); pass --provider`);p=h[0]}u={provider:p,sessionId:m}}let f=await uS(t,u.provider,u.sessionId,i,-1);return f<0?1:o?await new Promise(m=>{let p=async()=>{try{let _=await uS(t,u.provider,u.sessionId,i,f);_>=0&&(f=_)}catch(_){t.stderr.write(`tail: ${_ instanceof Error?_.message:String(_)}
2259
+ `),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?nW: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=V(r,"--watch"),a=P(r,"--watch-interval"),l=a===void 0?sW: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=>aW(t,p,m,i,o,l))}catch(p){return je(t,p)}}let d=hr(rW,{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=>Ee(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 h=At(p);if(h===void 0)return v(t,`tail: ${d.teamfile} has no Lead member; pass <tf>:<alias>`);try{let g=await $(t,_=>He(d.teamfile,h.alias,_));u={provider:g.provider,sessionId:g.sessionid,cwd:g.sessiondir}}catch(g){return g instanceof ye?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 ye?v(t,m.message):je(t,m)}else{let m=d.sessionid,p=d.provider;if(p===void 0){let h=await Ia(m);if(h.length===0)return v(t,`tail: session "${m}" not found in any provider store`);if(h.length>1)return v(t,`tail: session "${m}" matches multiple providers (${h.join(", ")}); pass --provider`);p=h[0]}u={provider:p,sessionId:m}}let f=await uS(t,u.provider,u.sessionId,i,-1);return f<0?1:o?await new Promise(m=>{let p=async()=>{try{let _=await uS(t,u.provider,u.sessionId,i,f);_>=0&&(f=_)}catch(_){t.stderr.write(`tail: ${_ instanceof Error?_.message:String(_)}
2260
2260
  `)}},h=setInterval(()=>{p()},l*1e3),g=()=>{clearInterval(h),m(0)};process.once("SIGINT",g),process.once("SIGTERM",g)}):0}async function uS(e,t,r,n,s){let i;try{i=await _t(r,t)}catch(c){return e.stderr.write(`tail: failed to load session: ${c instanceof Error?c.message:String(c)}
2261
2261
  `),-1}if(i===null)return e.stderr.write(`tail: session not found: ${r} (provider=${t})
2262
2262
  `),-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+=`${_S(o[c])}
@@ -2276,7 +2276,7 @@ ${o.map(a=>` ${a}`).join(`
2276
2276
  Print or watch provider session messages, or follow a managed run timeline.
2277
2277
  --lines and --max-bytes are mutually exclusive. Default: --max-bytes 4096.`;fS=`\u2026 [truncated older output \u2014 raise with --max-bytes]
2278
2278
  `});var IS={};we(IS,{runInfo:()=>fW});import{execFileSync as nf}from"node:child_process";import{dirname as wS,resolve as lW}from"node:path";function uW(e){return e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${Math.round(e/1e3)}K`:String(e)}async function fW(e,t={stdout:process.stdout,stderr:process.stderr}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(`${dW}
2279
- `),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=V(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 O(t,async u=>pW(t,u,d,n))}catch(u){return je(t,u)}}let i=hr(cW,{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 O(t,u=>Ee(i.teamfile,u))}catch(u){return v(t,`health: ${u instanceof Error?u.message:String(u)}`)}return _W(t,d,n)}let o,a,l,c;if(i.mode==="ai-team")try{let d=await O(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 ye?v(t,d.message):je(t,d)}else if(a=i.sessionid,i.provider!==void 0)o=i.provider;else{let d=await Ia(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 mW(t,o,a,l,n,c)}async function mW(e,t,r,n,s,i){let o;try{o=await _t(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 hW(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}
2279
+ `),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=V(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=>pW(t,u,d,n))}catch(u){return je(t,u)}}let i=hr(cW,{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=>Ee(i.teamfile,u))}catch(u){return v(t,`health: ${u instanceof Error?u.message:String(u)}`)}return _W(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 ye?v(t,d.message):je(t,d)}else if(a=i.sessionid,i.provider!==void 0)o=i.provider;else{let d=await Ia(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 mW(t,o,a,l,n,c)}async function mW(e,t,r,n,s,i){let o;try{o=await _t(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 hW(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}
2280
2280
  `),e.stdout.write(` Provider: ${o.provider}
2281
2281
  `),n!==void 0&&e.stdout.write(` Alias: ${n}
2282
2282
  `),l!==null&&e.stdout.write(` Liveness: ${sf(l.liveness)}
@@ -2285,6 +2285,8 @@ Print or watch provider session messages, or follow a managed run timeline.
2285
2285
  `),e.stdout.write(` Model: ${o.model??"(unknown)"}
2286
2286
  `),o.totalInputTokens===void 0||o.totalOutputTokens===void 0?e.stdout.write(" Tokens: n/a"):e.stdout.write(` Tokens: ${o.totalInputTokens} in / ${o.totalOutputTokens} out`),c.totalCachedInputTokens!==void 0&&e.stdout.write(` (cached: ${c.totalCachedInputTokens})`),e.stdout.write(`
2287
2287
  `),(o.totalInputTokens===void 0||o.totalOutputTokens===void 0)&&e.stdout.write(` n/a = this provider does not expose a context/token total; absence is not a health signal.
2288
+ `),l!==null&&e.stdout.write(` lastContext = prompt size of the LAST COMPLETED turn; it LAGS BY ONE TURN. Right after a
2289
+ compaction it still reports the pre-compaction size (the summarisation request itself).
2288
2290
  `),a!==null&&e.stdout.write(` SessionLimit: LIMITED resets_at=${bS(a)}
2289
2291
  `),e.stdout.write(` Created: ${c.createdAt}
2290
2292
  `),e.stdout.write(` Modified: ${c.modifiedAt}
@@ -2298,7 +2300,7 @@ Print or watch provider session messages, or follow a managed run timeline.
2298
2300
  `),e.stdout.write(` Steps: ${s.steps.length}
2299
2301
  `),e.stdout.write(` AgentCalls: ${o.agentCallCount}
2300
2302
  `),e.stdout.write(` Tokens: ${o.totalInputTokens} in / ${o.totalOutputTokens} out
2301
- `),0)}async function _W(e,t,r){let n,s;try{let y=await O(e,w=>{let I=Pe(t,w);if(I.parseErrors.length>0)throw new Error(I.parseErrors.join("; "));return{teamName:I.name,targets:ES(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=SS(t),o=i.kind==="repo"?i:null,a=await TS(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 _t(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)}
2303
+ `),0)}async function _W(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:ES(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=SS(t),o=i.kind==="repo"?i:null,a=await TS(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 _t(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)}
2302
2304
  `)}let I=w?.messageCount,x=o===null?void 0:w===null?null:vS(w,o.since),U=o===null?void 0:w===null?null:kS(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,h=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}
2303
2305
  `),i.kind==="repo"){e.stdout.write(`Git progress:
2304
2306
  `);for(let y of i.commits)e.stdout.write(` ${y.ref}: ${y.timestamp.toISOString()}
@@ -2309,15 +2311,19 @@ Print or watch provider session messages, or follow a managed run timeline.
2309
2311
  `);let _=!1,S=l.filter(y=>y.sessionLimit!==null);for(let y of l){let w=wW(y.lastContext,y.detailLoaded,uW);(w==="n/a"||y.cumulativeTokens==="n/a")&&(_=!0),e.stdout.write(` ${y.sessionid.padEnd(f)} ${y.reportPath.padEnd(m)}${y.provider.padEnd(p)}${y.model.padEnd(h)}${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)} ${yW(y.cumulativeTokens).padStart(19)}`:"")+`
2310
2312
  `)}if(e.stdout.write(` ${"TOTAL".padEnd(f)} ${"".padEnd(m)}${"".padEnd(p)}${"".padEnd(h)}${"".padEnd(g)}${gt(c).padStart(6)}`+(o!==null?` ${"".padStart(12)} ${gt(d).padStart(17)} ${gt(null).padStart(19)} ${gt(u).padStart(19)}`:"")+`
2311
2313
  `),_&&e.stdout.write(`n/a = this provider does not expose a context/token total; absence is not a health signal.
2314
+ `),e.stdout.write(`LAST CONTEXT = prompt size of the LAST COMPLETED turn, so it LAGS BY ONE TURN.
2315
+ Right after a compaction the last completed turn IS the summarisation request, which carried the
2316
+ full pre-compaction prompt \u2014 so this reads the OLD large number while the live context is already
2317
+ small. Re-read after the next turn before concluding a compaction failed or gating on the value.
2312
2318
  `),S.length>0){e.stdout.write(`Session limits:
2313
2319
  `);for(let y of S)e.stdout.write(` ${y.reportPath}: LIMITED resets_at=${bS(y.sessionLimit)}
2314
- `)}return 0}function ES(e,t,r,n){let s=Ee(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(...ES(lW(wS(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 hW(e,t,r){let n=await TS(e,[{teamfile:t.teamfile,alias:t.alias}]),s=SS(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:vS(r,i.since),tokens:null},cumulativeTokens:kS(r)??"n/a"}:{}}}async function TS(e,t){try{let r=await O(e,n=>t.map(s=>{let i=pr(n,s.teamfile,s.alias);return[of(s.teamfile,s.alias),gW(i)]}));return new Map(r)}catch{return new Map}}function of(e,t){return`${e}\0${t.toLowerCase()}`}function gW(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 bS(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 yW(e){return e==="n/a"?e:gt(e)}function wW(e,t,r=String){return e!==void 0?r(e):t?"n/a":"unknown"}function SS(e){let t=wS(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:EW(t)}}function EW(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 vS(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 kS(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 cW,dW,NS=T(()=>{"use strict";Br();Le();Lt();Rt();Dr();Bt();Fu();cW={name:"health",allowsBareTeamfile:!0,supportsRaw:!0},dW=`usage: lmctl health [target] [alias]
2320
+ `)}return 0}function ES(e,t,r,n){let s=Ee(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(...ES(lW(wS(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 hW(e,t,r){let n=await TS(e,[{teamfile:t.teamfile,alias:t.alias}]),s=SS(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:vS(r,i.since),tokens:null},cumulativeTokens:kS(r)??"n/a"}:{}}}async function TS(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),gW(i)]}));return new Map(r)}catch{return new Map}}function of(e,t){return`${e}\0${t.toLowerCase()}`}function gW(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 bS(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 yW(e){return e==="n/a"?e:gt(e)}function wW(e,t,r=String){return e!==void 0?r(e):t?"n/a":"unknown"}function SS(e){let t=wS(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:EW(t)}}function EW(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 vS(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 kS(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 cW,dW,NS=T(()=>{"use strict";Br();Le();Lt();Rt();Dr();Bt();Fu();cW={name:"health",allowsBareTeamfile:!0,supportsRaw:!0},dW=`usage: lmctl health [target] [alias]
2315
2321
  lmctl health <teamfile> # team rollup
2316
2322
  lmctl health <sessionid> [--provider <name>]
2317
2323
  [--json]
2318
2324
 
2319
2325
  Show provider session details, team rollups, or managed run state/token totals.`});var AS={};we(AS,{runLs:()=>vW});import{resolve as lf}from"node:path";function SW(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 vW(e,t={stdout:process.stdout,stderr:process.stderr}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(`${TW}
2320
- `),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=V(r,"--json");if(V(r,"--runs")){for(let _ of["--provider","--sessiondir"])if(P(r,_)!==void 0)return v(t,`--runs is mutually exclusive with ${_}`);for(let _ of["--recursive","--all"])if(V(r,_))return v(t,`--runs is mutually exclusive with ${_}`);if(n==="teamfile")return v(t,"--runs is mutually exclusive with --format teamfile (runs are not teamfile members)");let p=P(r,"--limit"),h=bW;if(p!==void 0){let _=Number.parseInt(p,10);if(!Number.isFinite(_)||_<1||String(_)!==p)return v(t,`invalid --limit "${p}" (expected a positive integer)`);if(_>xS)return v(t,`--limit ${_} exceeds maximum (${xS})`);h=_}let g=n==="json"||s===!0?"json":"table";try{return await O(t,async _=>kW(t,_,h,g))}catch(_){return je(t,_)}}let o=IW(n,s);if("error"in o)return v(t,o.error);let a=o.format,l=P(r,"--provider"),c=P(r,"--sessiondir"),d=V(r,"--recursive"),u=V(r,"--all"),f;try{f=await cc(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(h=>{let g=lf(h.cwd);return d?g===p||g.startsWith(`${p}/`):g===p})}if(f=SW(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(),h=d?"under":"in";t.stdout.write(`No native sessions found ${h} ${p}.
2326
+ `),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=V(r,"--json");if(V(r,"--runs")){for(let _ of["--provider","--sessiondir"])if(P(r,_)!==void 0)return v(t,`--runs is mutually exclusive with ${_}`);for(let _ of["--recursive","--all"])if(V(r,_))return v(t,`--runs is mutually exclusive with ${_}`);if(n==="teamfile")return v(t,"--runs is mutually exclusive with --format teamfile (runs are not teamfile members)");let p=P(r,"--limit"),h=bW;if(p!==void 0){let _=Number.parseInt(p,10);if(!Number.isFinite(_)||_<1||String(_)!==p)return v(t,`invalid --limit "${p}" (expected a positive integer)`);if(_>xS)return v(t,`--limit ${_} exceeds maximum (${xS})`);h=_}let g=n==="json"||s===!0?"json":"table";try{return await $(t,async _=>kW(t,_,h,g))}catch(_){return je(t,_)}}let o=IW(n,s);if("error"in o)return v(t,o.error);let a=o.format,l=P(r,"--provider"),c=P(r,"--sessiondir"),d=V(r,"--recursive"),u=V(r,"--all"),f;try{f=await cc(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(h=>{let g=lf(h.cwd);return d?g===p||g.startsWith(`${p}/`):g===p})}if(f=SW(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(),h=d?"under":"in";t.stdout.write(`No native sessions found ${h} ${p}.
2321
2327
  `)}return 0}if(a==="teamfile"){for(let p of f)t.stdout.write(`_MEMBER_ alias=- provider=${p.provider} sessionid=${p.sessionId} sessiondir=${p.cwd}
2322
2328
  `);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
2323
2329
  `);for(let p of f){let h=p.cwd.length>36?`\u2026${p.cwd.slice(-35)}`:p.cwd;t.stdout.write(`${p.sessionId.padEnd(m)} ${p.provider.padEnd(10)} ${h.padEnd(36)} ${p.modifiedAt.toISOString()}
@@ -2328,13 +2334,13 @@ Show provider session details, team rollups, or managed run state/token totals.`
2328
2334
  [--recursive] [--all] [--format table|teamfile|json] [--json]
2329
2335
  lmctl ls --runs [--limit N] [--format table|json] [--json]
2330
2336
 
2331
- List native provider sessions in scope, or list recent managed runs with --runs.`,bW=50,xS=500});import{existsSync as Ds,readFileSync as LS}from"node:fs";import{homedir as NW}from"node:os";import{dirname as $S,resolve as $n}from"node:path";import{fileURLToPath as xW}from"node:url";function uf(e,t={}){let r=[],n=LW(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=DW(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}": `+(La??"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: ${FW(o)}`)}return r}function LW(e){if(!e&&js)return js;let t=new Map,r,n=e??$W();if(!Ds(n))return r=`${n} not found`,e||cf(t),e||(js=t),e||(La=r),t;let s;try{s=LS(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||(La=r),t}for(let[i,o]of Object.entries(AW)){let a=MW(s,o),l=jW(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||(La=r),t}function $W(){return OW($S(xW(import.meta.url)))}function OW(e){let t=CW(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 CW(e){let t=$n(e);for(;;){if(Ds($n(t,"package.json")))return t;let r=$S(t);if(r===t)return null;t=r}}function cf(e){for(let[t,r]of Object.entries(RW))e.set(t,r)}function MW(e,t){let n=new RegExp(`^## ${UW(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 jW(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 DW(e){let t=e??$n(NW(),".config","opencode","opencode.json");if(!Ds(t))return{available:!0,models:[]};let r;try{r=JSON.parse(LS(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:PW(r)}}function PW(e){if(!df(e))return[];let t=Ra(e.provider)??Ra(e.providers);if(!t)return[];let r=new Set;for(let[n,s]of Object.entries(t)){if(!df(s))continue;let i=Ra(s.models)??Ra(s.model);if(i)for(let o of Object.keys(i))r.add(o.startsWith(`${n}/`)?o:`${n}/${o}`)}return[...r].sort()}function Ra(e){return df(e)?e:null}function df(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function FW(e){return e.length>0?e.join(", "):"(none)"}function UW(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var AW,RW,js,La,OS=T(()=>{"use strict";AW={claude:"Claude",codex:"Codex",gemini:"Gemini",qwen:"Qwen",agy:"Antigravity"},RW={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.6-sol","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 3.5 Flash (Medium)","Gemini 3.5 Flash (High)","Gemini 3.5 Flash (Low)","Gemini 3.1 Pro (Low)","Gemini 3.1 Pro (High)","Claude Sonnet 4.6 (Thinking)","Claude Opus 4.6 (Thinking)","GPT-OSS 120B (Medium)"]},js=null});import{homedir as WW}from"node:os";import{basename as BW}from"node:path";function $a(e,t){let r=new Set;return{text:e.replace(HW,(s,i)=>{let o=i.trim(),a=qW[o];return a===void 0?(r.add(o),s):a(t)}),unknownNames:[...r].sort()}}function Oa(e){return{workdir:e.workdir,teamfile:e.teamfile,date:JW(e.date)}}function JW(e){return e.toISOString().slice(0,10)}var qW,HW,ff=T(()=>{"use strict";qW={workdir:e=>e.workdir,teamfile:e=>e.teamfile,teamname:e=>{let t=BW(e.teamfile);return t.endsWith(".lmctl")?t.slice(0,-6):t},home:()=>WW(),date:e=>e.date},HW=/{{\s*([A-Za-z0-9_-]+)\s*}}/g});var Us={};we(Us,{GEMINI_PROVIDER_NOTICE:()=>DS,_setLintSessiondirFsOpsForTests:()=>QW,_setTeamfileSeedForTests:()=>ZW,buildRootTeamRegistrationRow:()=>BS,registerRootTeam:()=>qS,runHire:()=>aB,runLint:()=>oB,runRefresh:()=>lB,runSeed:()=>US,sha256Text:()=>WS});import{createHash as XW}from"node:crypto";import{accessSync as GW,constants as CS,existsSync as VW,readFileSync as ja,realpathSync as _f,statSync as KW,writeFileSync as Ma}from"node:fs";import{dirname as Hr,resolve as jS}from"node:path";function ZW(e){PS=e??(async t=>{let{seed:r}=await Promise.resolve().then(()=>(vt(),uc)),n=await r(t);return n.success?{sessionId:n.sessionId,warnings:n.warnings}:{error:n.error??"provider seed failed"}})}function QW(e){qr=e===null?hf:{...hf,...e}}function eB(e,t){let r=Hr(t),n=new Set,s=[];for(let i of e){if(i.teamfile!==void 0)continue;let o=i.sessiondir??r,a=jS(o);if(n.has(a))continue;let l=tB(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 tB(e){try{if(qr.existsSync(e)){if(!qr.statSync(e).isDirectory())return"ENOTDIR";qr.accessSync(e,CS.W_OK);return}let t=sB(e);if(t===void 0)return;if(!qr.statSync(t).isDirectory())return"ENOTDIR";qr.accessSync(t,CS.W_OK);return}catch(t){return iB(t)??"permission check failed"}}function rB(e,t){let r=[];for(let n of e)n.teamfile!==void 0||n.sessiondir===void 0||FS(n.sessiondir,t)&&r.push(`${n.alias}: sessiondir equals the teamfile directory and is redundant; lmctl seed will remove it`);return r}function nB(e,t,r,n){let s=!1;for(let i of e){if(i.teamfile!==void 0||i.sessiondir===void 0||!FS(i.sessiondir,n))continue;let o=r.get(i.alias.toLowerCase());if(o===void 0)continue;let a=HS(t[o],"sessiondir");a!==t[o]&&(t[o]=a,s=!0),i.sessiondir=void 0}return s}function FS(e,t){return MS(e)===MS(t)}function MS(e){let t=jS(e);try{return _f(t)}catch{return t}}function sB(e){let t=e;for(;;){try{if(qr.existsSync(t))return t}catch{return}let r=Hr(t);if(r===t)return;t=r}}function iB(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 oB(e,t={stdout:process.stdout,stderr:process.stderr}){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(YW),0;if(e.length!==1)return t.stderr.write(`usage: lmctl lint <teamfile.lmctl>
2332
- `),2;let r=e[0],n;try{n=await O(t,c=>Ee(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=Yd(s,Hr(n)),o=uf(s.members),a=ja(n,"utf8"),l=$a(a,Oa({workdir:Hr(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(...vl(s.members,Hr(n))),o.push(...eB(s.members,n)),o.push(...rB(s.members,Hr(n)));for(let c of i)t.stderr.write(`error: ${c.field}: ${c.message}
2337
+ List native provider sessions in scope, or list recent managed runs with --runs.`,bW=50,xS=500});import{existsSync as Ds,readFileSync as LS}from"node:fs";import{homedir as NW}from"node:os";import{dirname as OS,resolve as On}from"node:path";import{fileURLToPath as xW}from"node:url";function uf(e,t={}){let r=[],n=LW(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=DW(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}": `+(La??"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: ${FW(o)}`)}return r}function LW(e){if(!e&&js)return js;let t=new Map,r,n=e??OW();if(!Ds(n))return r=`${n} not found`,e||cf(t),e||(js=t),e||(La=r),t;let s;try{s=LS(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||(La=r),t}for(let[i,o]of Object.entries(AW)){let a=MW(s,o),l=jW(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||(La=r),t}function OW(){return $W(OS(xW(import.meta.url)))}function $W(e){let t=CW(e);if(t){let n=On(t,"durable-memory","model_selection.md");if(Ds(n))return n}let r=[On(e,"..","..","durable-memory","model_selection.md"),On(e,"..","..","..","durable-memory","model_selection.md")];for(let n of r)if(Ds(n))return n;return r[r.length-1]}function CW(e){let t=On(e);for(;;){if(Ds(On(t,"package.json")))return t;let r=OS(t);if(r===t)return null;t=r}}function cf(e){for(let[t,r]of Object.entries(RW))e.set(t,r)}function MW(e,t){let n=new RegExp(`^## ${UW(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 jW(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 DW(e){let t=e??On(NW(),".config","opencode","opencode.json");if(!Ds(t))return{available:!0,models:[]};let r;try{r=JSON.parse(LS(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:PW(r)}}function PW(e){if(!df(e))return[];let t=Ra(e.provider)??Ra(e.providers);if(!t)return[];let r=new Set;for(let[n,s]of Object.entries(t)){if(!df(s))continue;let i=Ra(s.models)??Ra(s.model);if(i)for(let o of Object.keys(i))r.add(o.startsWith(`${n}/`)?o:`${n}/${o}`)}return[...r].sort()}function Ra(e){return df(e)?e:null}function df(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function FW(e){return e.length>0?e.join(", "):"(none)"}function UW(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var AW,RW,js,La,$S=T(()=>{"use strict";AW={claude:"Claude",codex:"Codex",gemini:"Gemini",qwen:"Qwen",agy:"Antigravity"},RW={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.6-sol","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 3.5 Flash (Medium)","Gemini 3.5 Flash (High)","Gemini 3.5 Flash (Low)","Gemini 3.1 Pro (Low)","Gemini 3.1 Pro (High)","Claude Sonnet 4.6 (Thinking)","Claude Opus 4.6 (Thinking)","GPT-OSS 120B (Medium)"]},js=null});import{homedir as WW}from"node:os";import{basename as BW}from"node:path";function Oa(e,t){let r=new Set;return{text:e.replace(HW,(s,i)=>{let o=i.trim(),a=qW[o];return a===void 0?(r.add(o),s):a(t)}),unknownNames:[...r].sort()}}function $a(e){return{workdir:e.workdir,teamfile:e.teamfile,date:JW(e.date)}}function JW(e){return e.toISOString().slice(0,10)}var qW,HW,ff=T(()=>{"use strict";qW={workdir:e=>e.workdir,teamfile:e=>e.teamfile,teamname:e=>{let t=BW(e.teamfile);return t.endsWith(".lmctl")?t.slice(0,-6):t},home:()=>WW(),date:e=>e.date},HW=/{{\s*([A-Za-z0-9_-]+)\s*}}/g});var Us={};we(Us,{GEMINI_PROVIDER_NOTICE:()=>DS,_setLintSessiondirFsOpsForTests:()=>QW,_setTeamfileSeedForTests:()=>ZW,buildRootTeamRegistrationRow:()=>BS,registerRootTeam:()=>qS,runHire:()=>aB,runLint:()=>oB,runRefresh:()=>lB,runSeed:()=>US,sha256Text:()=>WS});import{createHash as XW}from"node:crypto";import{accessSync as GW,constants as CS,existsSync as VW,readFileSync as ja,realpathSync as _f,statSync as KW,writeFileSync as Ma}from"node:fs";import{dirname as Hr,resolve as jS}from"node:path";function ZW(e){PS=e??(async t=>{let{seed:r}=await Promise.resolve().then(()=>(vt(),uc)),n=await r(t);return n.success?{sessionId:n.sessionId,warnings:n.warnings}:{error:n.error??"provider seed failed"}})}function QW(e){qr=e===null?hf:{...hf,...e}}function eB(e,t){let r=Hr(t),n=new Set,s=[];for(let i of e){if(i.teamfile!==void 0)continue;let o=i.sessiondir??r,a=jS(o);if(n.has(a))continue;let l=tB(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 tB(e){try{if(qr.existsSync(e)){if(!qr.statSync(e).isDirectory())return"ENOTDIR";qr.accessSync(e,CS.W_OK);return}let t=sB(e);if(t===void 0)return;if(!qr.statSync(t).isDirectory())return"ENOTDIR";qr.accessSync(t,CS.W_OK);return}catch(t){return iB(t)??"permission check failed"}}function rB(e,t){let r=[];for(let n of e)n.teamfile!==void 0||n.sessiondir===void 0||FS(n.sessiondir,t)&&r.push(`${n.alias}: sessiondir equals the teamfile directory and is redundant; lmctl seed will remove it`);return r}function nB(e,t,r,n){let s=!1;for(let i of e){if(i.teamfile!==void 0||i.sessiondir===void 0||!FS(i.sessiondir,n))continue;let o=r.get(i.alias.toLowerCase());if(o===void 0)continue;let a=HS(t[o],"sessiondir");a!==t[o]&&(t[o]=a,s=!0),i.sessiondir=void 0}return s}function FS(e,t){return MS(e)===MS(t)}function MS(e){let t=jS(e);try{return _f(t)}catch{return t}}function sB(e){let t=e;for(;;){try{if(qr.existsSync(t))return t}catch{return}let r=Hr(t);if(r===t)return;t=r}}function iB(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 oB(e,t={stdout:process.stdout,stderr:process.stderr}){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(YW),0;if(e.length!==1)return t.stderr.write(`usage: lmctl lint <teamfile.lmctl>
2338
+ `),2;let r=e[0],n;try{n=await $(t,c=>Ee(r,c))}catch(c){return $e(t,`${r}: ${c instanceof Error?c.message:String(c)}`)}let s;try{s=De(n)}catch(c){return $e(t,`${r}: ${c instanceof Error?c.message:String(c)}`)}let i=Yd(s,Hr(n)),o=uf(s.members),a=ja(n,"utf8"),l=Oa(a,$a({workdir:Hr(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(...vl(s.members,Hr(n))),o.push(...eB(s.members,n)),o.push(...rB(s.members,Hr(n)));for(let c of i)t.stderr.write(`error: ${c.field}: ${c.message}
2333
2339
  `);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}
2334
- `);return await O(t,c=>{TE(n,c,d=>t.stderr.write(`${d}
2340
+ `);return await $(t,c=>{TE(n,c,d=>t.stderr.write(`${d}
2335
2341
  `))}),i.length>0?1:(t.stdout.write(`ok
2336
2342
  `),0)}async function US(e,t={stdout:process.stdout,stderr:process.stderr}){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(zW),0;if(e.length!==1)return t.stderr.write(`usage: lmctl seed <teamfile.lmctl>
2337
- `),2;let r=e[0],n;try{n=await O(t,_=>Ee(r,_))}catch(_){return Oe(t,`${r}: ${_ instanceof Error?_.message:String(_)}`)}let s;try{s=_f(n)}catch(_){return Oe(t,`${r}: ${_ instanceof Error?_.message:String(_)}`)}let i=Hr(n),o;try{o=De(n)}catch(_){return Oe(t,`${r}: ${_ instanceof Error?_.message:String(_)}`)}let l=ja(n,"utf8").split(`
2343
+ `),2;let r=e[0],n;try{n=await $(t,_=>Ee(r,_))}catch(_){return $e(t,`${r}: ${_ instanceof Error?_.message:String(_)}`)}let s;try{s=_f(n)}catch(_){return $e(t,`${r}: ${_ instanceof Error?_.message:String(_)}`)}let i=Hr(n),o;try{o=De(n)}catch(_){return $e(t,`${r}: ${_ instanceof Error?_.message:String(_)}`)}let l=ja(n,"utf8").split(`
2338
2344
  `),c=uB(l),d=nB(o.members,l,c,i),u=Yd(o,i);if(u.length>0){yf(o.members,t);for(let _ of u)t.stderr.write(`error: ${_.field}: ${_.message}
2339
2345
  `);return 1}try{Nn(t,o,n)}catch{}yf(o.members,t);for(let _ of uf(o.members))t.stderr.write(`warning: ${_}
2340
2346
  `);for(let _ of vl(o.members,i))t.stderr.write(`warning: ${_}
@@ -2348,10 +2354,10 @@ List native provider sessions in scope, or list recent managed runs with --runs.
2348
2354
  `),"utf8"),t.stdout.write(`${_.alias}: seeded ${y.sessionId} provider=${_.provider} sessiondir=${S}
2349
2355
  `)}let p=l.join(`
2350
2356
  `),h=gB(p,_f(n));(h!==p||d)&&Ma(n,h,"utf8"),f===0&&t.stdout.write(`no members needed seeding
2351
- `);let g=new Date().toISOString();return await O(t,_=>{qS(_,{teamfilePath:s,name:o.name,rawText:h,now:g})}),0}async function aB(e,t={stdout:process.stdout,stderr:process.stderr}){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(Ca),0;let r=Z(e,["--provider","--sessiondir"],[]);if(r.error!==void 0)return pf(t,r.error,Ca);if(r.positionals.length!==2)return pf(t,"expected <teamfile.lmctl> and <alias>",Ca);let[n,s]=r.positionals;if(!pB(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",Ca);if(!JS(i))return Oe(t,`invalid provider "${i}"`);let o;try{o=await O(t,u=>Ee(n,u))}catch(u){return Oe(t,`${n}: ${u instanceof Error?u.message:String(u)}`)}let a;try{a=ja(o,"utf8")}catch(u){return Oe(t,`${n}: ${u instanceof Error?u.message:String(u)}`)}if(mB(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=hB(a,c);return Ma(o,d,"utf8"),t.stdout.write(`Hired ${s} (${i}) -> ${o}
2357
+ `);let g=new Date().toISOString();return await $(t,_=>{qS(_,{teamfilePath:s,name:o.name,rawText:h,now:g})}),0}async function aB(e,t={stdout:process.stdout,stderr:process.stderr}){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(Ca),0;let r=Z(e,["--provider","--sessiondir"],[]);if(r.error!==void 0)return pf(t,r.error,Ca);if(r.positionals.length!==2)return pf(t,"expected <teamfile.lmctl> and <alias>",Ca);let[n,s]=r.positionals;if(!pB(s))return $e(t,`invalid alias "${s}"`);if(s.toLowerCase()==="lead")return $e(t,"hire only applies to non-Lead members");let i=P(r,"--provider");if(i===void 0)return pf(t,"missing value for --provider",Ca);if(!JS(i))return $e(t,`invalid provider "${i}"`);let o;try{o=await $(t,u=>Ee(n,u))}catch(u){return $e(t,`${n}: ${u instanceof Error?u.message:String(u)}`)}let a;try{a=ja(o,"utf8")}catch(u){return $e(t,`${n}: ${u instanceof Error?u.message:String(u)}`)}if(mB(a,s))return $e(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=hB(a,c);return Ma(o,d,"utf8"),t.stdout.write(`Hired ${s} (${i}) -> ${o}
2352
2358
  `),t.stdout.write(`Run: lmctl seed ${o}
2353
- `),0}async function lB(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=Fr(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 O(t,u=>Ee(r,u))}catch(u){return Oe(t,`${r}: ${u instanceof Error?u.message:String(u)}`)}let i;try{i=ja(s,"utf8")}catch(u){return Oe(t,`${r}: ${u instanceof Error?u.message:String(u)}`)}let o=i.split(`
2354
- `),a=fB(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)[Vn],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]=HS(l,"sessionid"),a>0&&/^\s*#CreationTime:/u.test(o[a-1])&&o.splice(a-1,1),Ma(s,o.join(`
2359
+ `),0}async function lB(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=Fr(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=>Ee(r,u))}catch(u){return $e(t,`${r}: ${u instanceof Error?u.message:String(u)}`)}let i;try{i=ja(s,"utf8")}catch(u){return $e(t,`${r}: ${u instanceof Error?u.message:String(u)}`)}let o=i.split(`
2360
+ `),a=fB(o,n);if(a===void 0)return $e(t,`${n}: no active _MEMBER_ entry found`);let l=o[a];if(Fs(l,"teamfile")!==void 0)return $e(t,`${n}: refresh only applies to provider-backed members, not teamfile= members`);let c=(t.env??process.env)[Vn],d=Fs(l,"sessionid");return c!==void 0&&c.length>0&&d===c?$e(t,`${n}: cannot refresh its own running session \u2014 a meta-Lead or the operator must run this refresh.`):(o[a]=HS(l,"sessionid"),a>0&&/^\s*#CreationTime:/u.test(o[a-1])&&o.splice(a-1,1),Ma(s,o.join(`
2355
2361
  `),"utf8"),US([s],t))}function WS(e){return XW("sha256").update(e).digest("hex")}function BS(e,t){return{teamfile_path:t.teamfilePath,name:t.name,raw_text:t.rawText,raw_sha256:WS(t.rawText),registered_at:e?.registered_at??t.now,last_seeded_at:t.now}}function qS(e,t){let r=BS(e.getRootTeam(t.teamfilePath),t);return e.upsertRootTeam(r),r}function cB(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(`
2356
2362
  `):"- (no non-Lead members)",i=r.find(a=>a.alias.toLowerCase()==="lead")?.provider??"",o=dB(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"`,"- SAFE INPUT \u2014 use for ANYTHING non-trivial. A prompt typed into the command line is expanded by YOUR shell first,"," so backticks, $(...), $VAR and quotes are executed or stripped out of the message before lmctl sees it."," If the text contains backticks, quotes, $, newlines, or ANY relayed/pasted/quoted content, do NOT put it in the command.",` Write it to a file with your file-writing tool (NOT echo/heredoc \u2014 those are shell too), then: lmctl chat "${e}" <alias> --prompt-file <path>`,"- 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(`
2357
2363
  `)}function dB(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 uB(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 fB(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 mB(e,t){for(let r of e.split(`
@@ -2368,11 +2374,11 @@ ${o}`:`
2368
2374
  ${i}`:`${r}
2369
2375
  `:e.length>0?`${r}
2370
2376
  ${e}`:`${r}
2371
- `}function JS(e){return e==="claude"||e==="codex"||e==="gemini"||e==="copilot"||e==="opencode"||e==="lmplayer"||e==="qwen"||e==="agy"||e==="ClaudeMock"}function Oe(e,t){return e.stderr.write(`error: ${t}
2377
+ `}function JS(e){return e==="claude"||e==="codex"||e==="gemini"||e==="copilot"||e==="opencode"||e==="lmplayer"||e==="qwen"||e==="agy"||e==="ClaudeMock"}function $e(e,t){return e.stderr.write(`error: ${t}
2372
2378
  `),1}function pf(e,t,r){return e.stderr.write(`error: ${t}
2373
2379
  ${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_
2374
2380
  `),r.provider==="gemini"&&t.stderr.write(`${DS.replace("%s",r.alias)}
2375
- `)}var Ps,YW,zW,Ca,mf,DS,hf,PS,qr,Ws=T(()=>{"use strict";Vt();OS();fi();st();Le();Rt();Lt();Rt();ff();Ls();Ps=5,YW=`usage: lmctl lint <teamfile.lmctl>
2381
+ `)}var Ps,YW,zW,Ca,mf,DS,hf,PS,qr,Ws=T(()=>{"use strict";Vt();$S();fi();st();Le();Rt();Lt();Rt();ff();Ls();Ps=5,YW=`usage: lmctl lint <teamfile.lmctl>
2376
2382
 
2377
2383
  Validate an lmctl teamfile and warn about stale or placeholder session ids.
2378
2384
  `,zW=`usage: lmctl seed <teamfile.lmctl>
@@ -2409,11 +2415,11 @@ Copy a teamfile and strip its session ids, producing a static editable template.
2409
2415
 
2410
2416
  Examples:
2411
2417
  lmctl clone ./backend/backend.lmctl ./backend-v2/backend-v2.lmctl
2412
- `});var ev={};we(ev,{runPlan:()=>jB});import{existsSync as RB,mkdirSync as LB,writeFileSync as $B}from"node:fs";import{basename as ZS,extname as QS,join as OB,resolve as CB}from"node:path";async function jB(e,t={stdout:process.stdout,stderr:process.stderr}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(MB),0;let r=Z(e,["--team","--provider"],[]);if(r.error!==void 0)return t.stderr.write(`error: ${r.error}
2418
+ `});var ev={};we(ev,{runPlan:()=>jB});import{existsSync as RB,mkdirSync as LB,writeFileSync as OB}from"node:fs";import{basename as ZS,extname as QS,join as $B,resolve as CB}from"node:path";async function jB(e,t={stdout:process.stdout,stderr:process.stderr}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(MB),0;let r=Z(e,["--team","--provider"],[]);if(r.error!==void 0)return t.stderr.write(`error: ${r.error}
2413
2419
  `),t.stderr.write(`usage: lmctl plan [options] <directory>
2414
2420
  `),2;if(r.positionals.length!==1)return t.stderr.write(`usage: lmctl plan [options] <directory>
2415
- `),2;let n=CB(r.positionals[0]);LB(n,{recursive:!0});let s=P(r,"--team")??ZS(n),i=P(r,"--provider")??"claude",o=OB(n,DB(s));if(RB(o))return t.stderr.write(`error: ${o} already exists.
2416
- `),1;let a=FB({teamName:PB(s),leadProvider:i}),l=$a(a,Oa({workdir:n,teamfile:o,date:new Date}));return $B(o,l.text,"utf8"),t.stdout.write(`Created ${o}
2421
+ `),2;let n=CB(r.positionals[0]);LB(n,{recursive:!0});let s=P(r,"--team")??ZS(n),i=P(r,"--provider")??"claude",o=$B(n,DB(s));if(RB(o))return t.stderr.write(`error: ${o} already exists.
2422
+ `),1;let a=FB({teamName:PB(s),leadProvider:i}),l=Oa(a,$a({workdir:n,teamfile:o,date:new Date}));return OB(o,l.text,"utf8"),t.stdout.write(`Created ${o}
2417
2423
  `),t.stdout.write(`Edit ${o}; only _MEMBER_ lines are parsed, everything else is free-form.
2418
2424
  `),t.stdout.write(`After editing, run: lmctl lint ${o}
2419
2425
  `),t.stdout.write(`Then run: lmctl seed ${o}
@@ -2444,7 +2450,7 @@ Examples:
2444
2450
 
2445
2451
  # Same shape, codex for the Lead and Reviewer2
2446
2452
  lmctl plan ./backend --provider codex
2447
- `});import{execFileSync as UB}from"node:child_process";import{resolve as rv}from"node:path";function WB(e){return e.filter(t=>t.state!=="retired")}function nv(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=UB("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=rv(s),o=t.listProjects().find(a=>rv(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 sv(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 iv(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=WB(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 ov=T(()=>{"use strict";Le()});var cv={};we(cv,{SIZE_WARN_EST_TOKENS:()=>Bs,estimateTokens:()=>lv,runTerminal:()=>JB});import{spawn as BB}from"node:child_process";import{statSync as qB}from"node:fs";async function JB(e,t){if(e.includes("--help")||e.includes("-h"))return ZB(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"?V(r,o):P(r,o)!==void 0)return v(t,`--run is mutually exclusive with ${o}`);try{return await O(t,async o=>{let a=P(r,"--alias"),l=fw(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"?V(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=hr(HB,{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 O(t,l=>XB(t,a.teamfile,a.alias,l))}try{return await O(t,async s=>{let i=KB(t,s,r);if(typeof i=="number")return i;let o=P(r,"--alias");return V(r,"--size")?zB(t,s,i,o,V(r,"--json")):YB(t,s,i,o)})}catch(s){return je(t,s)}}async function XB(e,t,r,n){let s;try{s=He(t,r,n)}catch(d){return d instanceof ye?v(e,d.message):je(e,d)}let i=mr(n,{receiver_teamfile:s.teamfile,receiver_alias:s.alias,sender_teamfile:s.teamfile,sender_alias:"terminal",ttlMs:_r()});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=lb({teamfile:s.teamfile,alias:s.alias}),a=null,l=null,c=null;try{n.setTerminalLock(o),l=GB(n,s),a=setInterval(()=>{try{!n.heartbeatTerminalLock(o.teamfile,o.alias,o.lock_id,new Date().toISOString())&&a!==null&&(clearInterval(a),a=null)}catch{}},cb()),a.unref?.();try{Nn(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),VB(n,l,c)}}function GB(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 VB(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(!va(r))return v(e,`no resume incantation for provider "${r}"`);if(!xb.test(n))return v(e,"refusing to resume: malformed sessionid");let o=Bu(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}
2453
+ `});import{execFileSync as UB}from"node:child_process";import{resolve as rv}from"node:path";function WB(e){return e.filter(t=>t.state!=="retired")}function nv(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=UB("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=rv(s),o=t.listProjects().find(a=>rv(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 sv(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 iv(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=WB(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 ov=T(()=>{"use strict";Le()});var cv={};we(cv,{SIZE_WARN_EST_TOKENS:()=>Bs,estimateTokens:()=>lv,runTerminal:()=>JB});import{spawn as BB}from"node:child_process";import{statSync as qB}from"node:fs";async function JB(e,t){if(e.includes("--help")||e.includes("-h"))return ZB(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"?V(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=fw(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"?V(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=hr(HB,{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=>XB(t,a.teamfile,a.alias,l))}try{return await $(t,async s=>{let i=KB(t,s,r);if(typeof i=="number")return i;let o=P(r,"--alias");return V(r,"--size")?zB(t,s,i,o,V(r,"--json")):YB(t,s,i,o)})}catch(s){return je(t,s)}}async function XB(e,t,r,n){let s;try{s=He(t,r,n)}catch(d){return d instanceof ye?v(e,d.message):je(e,d)}let i=mr(n,{receiver_teamfile:s.teamfile,receiver_alias:s.alias,sender_teamfile:s.teamfile,sender_alias:"terminal",ttlMs:_r()});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=lb({teamfile:s.teamfile,alias:s.alias}),a=null,l=null,c=null;try{n.setTerminalLock(o),l=GB(n,s),a=setInterval(()=>{try{!n.heartbeatTerminalLock(o.teamfile,o.alias,o.lock_id,new Date().toISOString())&&a!==null&&(clearInterval(a),a=null)}catch{}},cb()),a.unref?.();try{Nn(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),VB(n,l,c)}}function GB(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 VB(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(!va(r))return v(e,`no resume incantation for provider "${r}"`);if(!xb.test(n))return v(e,"refusing to resume: malformed sessionid");let o=Bu(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}
2448
2454
  `),Ae({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=BB(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 KB(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=nv(e,t,P(r,"--project"));return typeof s=="number"?s:sv(e,t,s,void 0)}async function YB(e,t,r,n){let s=iv(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 lv(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=qB(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 zB(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;va(c)&&(u=await _t(l,c));let f=lv(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?ka(c,l,d!==null?{model:d}:{}):null})}if(s)return ae(e,{estimate:!0,legend:av,guide_tokens:Bs,members:o}),0;e.stdout.write(`session size \u2014 ESTIMATE only (nothing is changed automatically)
2449
2455
  `),e.stdout.write(`${av}
2450
2456
  `);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)
@@ -2484,7 +2490,7 @@ Examples:
2484
2490
  tokens it surfaces the resume incantation so YOU can
2485
2491
  open & self-compact. Nothing is ever changed
2486
2492
  automatically; ${Bs} is a guide, not a gate.
2487
- `),0}var HB,Bs,av,dv=T(()=>{"use strict";Ze();Br();Le();ov();Lt();Vt();st();Ls();Dr();ea();$u();Jo();he();HB={name:"terminal",allowsBareTeamfile:!1,supportsRaw:!1},Bs=2e5,av="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=QB[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 QB,uv=T(()=>{"use strict";QB={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 yv={};we(yv,{initWorkspace:()=>hv,runWorkspace:()=>oq,setWorkspaceProvider:()=>gv});import{copyFileSync as eq,cpSync as tq,existsSync as Fe,mkdirSync as wr,readdirSync as Sf,renameSync as rq,rmSync as Da,statSync as Pa,writeFileSync as nq}from"node:fs";import{spawnSync as sq}from"node:child_process";import{homedir as fv}from"node:os";import{dirname as vf,join as qs}from"node:path";async function oq(e,t){let[r,...n]=e;if(r==="--help"||r==="-h"||r==="help")return t.stdout.write(iq),0;switch(r){case"list":return aq(n,t);case"create":return lq(n,t);case"use":return cq(n,t);case"show":return dq(n,t);case"delete":return uq(n,t);case"migrate":return fq(n,t);case"init":return hv(n,t);case"set-provider":return gv(n,t);default:return v(t,"usage: lmctl workspace <list|create|use|show|delete|migrate|init|set-provider>")}}function pv(){let e=Gs(),t=[],r=new Set,n=br.default,s=Fe(Js()),i=Fe(Mt(n));if((s||i||e===null||e===n)&&(t.push({name:n,db_path:i?Er(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=Pa(Mt(a)).isDirectory()}catch{l=!1}l&&(t.push({name:a,db_path:Er(a),active:e===a,legacy:!1}),r.add(a))}}return t}function aq(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=pv();if(V(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}
2493
+ `),0}var HB,Bs,av,dv=T(()=>{"use strict";Ze();Br();Le();ov();Lt();Vt();st();Ls();Dr();ea();Ou();Jo();he();HB={name:"terminal",allowsBareTeamfile:!1,supportsRaw:!1},Bs=2e5,av="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=QB[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 QB,uv=T(()=>{"use strict";QB={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 yv={};we(yv,{initWorkspace:()=>hv,runWorkspace:()=>oq,setWorkspaceProvider:()=>gv});import{copyFileSync as eq,cpSync as tq,existsSync as Fe,mkdirSync as wr,readdirSync as Sf,renameSync as rq,rmSync as Da,statSync as Pa,writeFileSync as nq}from"node:fs";import{spawnSync as sq}from"node:child_process";import{homedir as fv}from"node:os";import{dirname as vf,join as qs}from"node:path";async function oq(e,t){let[r,...n]=e;if(r==="--help"||r==="-h"||r==="help")return t.stdout.write(iq),0;switch(r){case"list":return aq(n,t);case"create":return lq(n,t);case"use":return cq(n,t);case"show":return dq(n,t);case"delete":return uq(n,t);case"migrate":return fq(n,t);case"init":return hv(n,t);case"set-provider":return gv(n,t);default:return v(t,"usage: lmctl workspace <list|create|use|show|delete|migrate|init|set-provider>")}}function pv(){let e=Gs(),t=[],r=new Set,n=br.default,s=Fe(Js()),i=Fe(Mt(n));if((s||i||e===null||e===n)&&(t.push({name:n,db_path:i?Er(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=Pa(Mt(a)).isDirectory()}catch{l=!1}l&&(t.push({name:a,db_path:Er(a),active:e===a,legacy:!1}),r.add(a))}}return t}function aq(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=pv();if(V(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}
2488
2494
  `)}return 0}function lq(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=Mt(n);if(Fe(s))return v(t,`workspace already exists: ${n} (${s})`);let i=P(r,"--docroot")??Ja(n);wr(s,{recursive:!0}),wr(i,{recursive:!0});let o=Er(n);wr(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 V(r,"--json")?ae(t,l):t.stdout.write(`created workspace ${n} at ${s}
2489
2495
  `),0}function cq(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!==br.default&&!Fe(Mt(n)))return v(t,`workspace not found: ${n} (run \`lmctl workspace create ${n}\` first)`);let s=Xs();return wr(vf(s),{recursive:!0}),nq(s,`${n}
2490
2496
  `),V(r,"--json")?ae(t,{active:n,path:s}):t.stdout.write(`active workspace set to ${n}
@@ -2494,9 +2500,9 @@ Examples:
2494
2500
  `),Pa(e).isDirectory()?tq(e,t,{recursive:!0}):eq(e,t),!Fe(t))throw new Error(`migration copy verification failed: ${t} not present after copy`);Da(e,{recursive:!0,force:!0})}function fq(e,t){let r=Z(e,[],["--json"]);if(r.error!==void 0)return v(t,r.error);let n=V(r,"--json"),s=Xa(),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}
2495
2501
  `);t.stdout.write(f?`migration complete
2496
2502
  `:`${m??"nothing to migrate"}
2497
- `)}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 Pa(qs(s,f)).isDirectory()}catch{return!1}});if(c.length===0)Da(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\`)`);wr(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&&(Da(s,{recursive:!0,force:!0}),o.push(`removed empty ${s}`))}catch{}}let d=qf(),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 _v(e,t){return sq(e,t,{encoding:"utf8",timeout:5e3,maxBuffer:1024*1024})}function _q(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 mv(e){return e==="~"?fv():e.startsWith("~/")?qs(fv(),e.slice(2)):e}async function hv(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: ${On.join(", ")}.`].join(`
2503
+ `)}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 Pa(qs(s,f)).isDirectory()}catch{return!1}});if(c.length===0)Da(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\`)`);wr(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&&(Da(s,{recursive:!0,force:!0}),o.push(`removed empty ${s}`))}catch{}}let d=qf(),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 _v(e,t){return sq(e,t,{encoding:"utf8",timeout:5e3,maxBuffer:1024*1024})}function _q(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 mv(e){return e==="~"?fv():e.startsWith("~/")?qs(fv(),e.slice(2)):e}async function hv(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: ${$n.join(", ")}.`].join(`
2498
2504
  `)+`
2499
- `),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??_v,a=On.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 ${On.join("|")} first
2505
+ `),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??_v,a=$n.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 ${$n.join("|")} first
2500
2506
  `),2;let l=r.isTty??!!process.stdin.isTTY,c=r.promptLine??_q,d=r.promptLine!==void 0||l,u=x=>(t.stderr.write(`error: ${x} is required in non-interactive mode (no TTY); pass it explicitly
2501
2507
  `),2),f,m=P(s,"--name");if(m!==void 0){if(!ze(m))return t.stderr.write(`error: invalid workspace name: ${m}
2502
2508
  `),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)
@@ -2507,13 +2513,13 @@ Examples:
2507
2513
  `),t.stdout.write(` basedir: ${h}
2508
2514
  `),t.stdout.write(` provider1=${S.provider1} provider2=${S.provider2} provider3=${S.provider3}
2509
2515
  `),t.stdout.write(`activate it with: lmctl workspace use ${f}
2510
- `)),0}async function gv(e,t,r={}){let n="usage: lmctl [--workspace W] workspace set-provider <provider1|provider2|provider3> <concrete>";if(e.includes("--help")||e.includes("-h"))return t.stdout.write([n,"","Remaps an abstract provider slot for the selected workspace. The next","`team seed` resolves that slot to the new concrete; already-seeded",`members keep their frozen provider_resolved. Scanned providers: ${On.join(", ")}.`].join(`
2516
+ `)),0}async function gv(e,t,r={}){let n="usage: lmctl [--workspace W] workspace set-provider <provider1|provider2|provider3> <concrete>";if(e.includes("--help")||e.includes("-h"))return t.stdout.write([n,"","Remaps an abstract provider slot for the selected workspace. The next","`team seed` resolves that slot to the new concrete; already-seeded",`members keep their frozen provider_resolved. Scanned providers: ${$n.join(", ")}.`].join(`
2511
2517
  `)+`
2512
2518
  `),0;let s=Z(e,[]);if(s.error!==void 0)return v(t,s.error);let[i,o,...a]=s.positionals;if(i===void 0||o===void 0||a.length!==0)return v(t,n);let l=/^provider[123]$/.test(i)?i:/^[123]$/.test(i)?`provider${i}`:null;if(l===null)return t.stderr.write(`error: invalid slot: ${i} (expected provider1, provider2, or provider3)
2513
- `),2;let c=r.spawn??_v,d=On.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 ${On.join("|")} first
2519
+ `),2;let c=r.spawn??_v,d=$n.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 ${$n.join("|")} first
2514
2520
  `),2;if(!d.includes(o))return t.stderr.write(`error: ${o} is not an available provider (available: ${d.join(", ")})
2515
2521
  `),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=jt()??br.default;return t.stdout.write(`workspace.${l} = ${o} (workspace: ${m})
2516
- `),0}var iq,On,mq,pq,wv=T(()=>{"use strict";Ze();uv();Le();Je();iq=`usage: lmctl workspace list [--json]
2522
+ `),0}var iq,$n,mq,pq,wv=T(()=>{"use strict";Ze();uv();Le();Je();iq=`usage: lmctl workspace list [--json]
2517
2523
  lmctl workspace create <name> [--docroot PATH] [--json]
2518
2524
  lmctl workspace use <name> [--json]
2519
2525
  lmctl workspace show <name> [--json]
@@ -2525,7 +2531,7 @@ Examples:
2525
2531
  Manage isolated workspace state directories, active workspace selection,
2526
2532
  legacy profile migration, and configured provider slots.
2527
2533
  delete requires --confirm; deleting default or active workspaces also requires --force.
2528
- `;On=["claude","codex","gemini","qwen"],mq={provider1:"claude",provider2:"codex",provider3:"gemini"},pq={provider1:"primary implementer",provider2:"independent reviewer",provider3:"auxiliary / tie-break"}});import{createHash as hq,randomBytes as gq}from"node:crypto";import{readFile as yq}from"node:fs/promises";function Ev(e=new Date,t=gq(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 wq(e){return hq("sha256").update(e).digest("hex")}async function Tv(e){return(await Promise.all(e.map(async({bundlePath:r,absPath:n})=>{let s=await yq(n);return{path:r,sha256:wq(s),size:s.byteLength}}))).sort((r,n)=>r.path<n.path?-1:r.path>n.path?1:0)}function bv(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 Sv}from"node:child_process";import{mkdir as If,writeFile as vv,readFile as Eq,rm as kv}from"node:fs/promises";import{tmpdir as Tq}from"node:os";import{dirname as Iv,join as Nf}from"node:path";async function Nv(e){let t=e.stagingDir??Nf(Tq(),`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(Iv(m),{recursive:!0}),typeof f=="string")await vv(m,f);else{let p=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);await vv(m,new Uint8Array(p))}n.push({bundlePath:u,absPath:m})},i=u=>`${JSON.stringify(u,null,2)}
2534
+ `;$n=["claude","codex","gemini","qwen"],mq={provider1:"claude",provider2:"codex",provider3:"gemini"},pq={provider1:"primary implementer",provider2:"independent reviewer",provider3:"auxiliary / tie-break"}});import{createHash as hq,randomBytes as gq}from"node:crypto";import{readFile as yq}from"node:fs/promises";function Ev(e=new Date,t=gq(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 wq(e){return hq("sha256").update(e).digest("hex")}async function Tv(e){return(await Promise.all(e.map(async({bundlePath:r,absPath:n})=>{let s=await yq(n);return{path:r,sha256:wq(s),size:s.byteLength}}))).sort((r,n)=>r.path<n.path?-1:r.path>n.path?1:0)}function bv(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 Sv}from"node:child_process";import{mkdir as If,writeFile as vv,readFile as Eq,rm as kv}from"node:fs/promises";import{tmpdir as Tq}from"node:os";import{dirname as Iv,join as Nf}from"node:path";async function Nv(e){let t=e.stagingDir??Nf(Tq(),`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(Iv(m),{recursive:!0}),typeof f=="string")await vv(m,f);else{let p=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);await vv(m,new Uint8Array(p))}n.push({bundlePath:u,absPath:m})},i=u=>`${JSON.stringify(u,null,2)}
2529
2535
  `;if(e.data.serve!==void 0){let u=e.data.serve,f=u.pid===null?`no daemon (source=${u.pid_source})
2530
2536
  `:`${u.pid}
2531
2537
  # source=${u.pid_source} alive=${String(u.pid_alive)}
@@ -2544,28 +2550,28 @@ delete requires --confirm; deleting default or active workspaces also requires -
2544
2550
  # tail_lines=${u.tail_lines}
2545
2551
  `;await s("intents/recent.log",`${m}${u.tail}${u.tail.length>0?`
2546
2552
  `:""}`)}if(await s("README.md",bq(e)),e.sanitized)for(let u of n){let f=await Eq(u.absPath);try{Vf(u.bundlePath,f.toString("utf8"))}catch(m){throw await kv(t,{recursive:!0,force:!0}),m instanceof Sr,m}}let o=await Tv(n),a=bv({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(Iv(e.outputPath),{recursive:!0});let l=Sv("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=Sv("stat",["-c","%s",e.outputPath],{encoding:"utf8"}),d=Number.parseInt((c.stdout??"0").trim(),10)||0;return await kv(t,{recursive:!0,force:!0}),{outputPath:e.outputPath,manifest:a,bundleSizeBytes:d}}function bq(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(`
2547
- `)}var xv=T(()=>{"use strict";kf();Ks()});import{spawnSync as Sq}from"node:child_process";import{stat as vq}from"node:fs/promises";async function Av(e){try{if(!(await vq(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 kq(e);case"hq":return Iq(e)}}function kq(e){let r=Sq("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 Iq(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 Rv=T(()=>{"use strict"});var $v={};we($v,{parseDiagnoseArgs:()=>Lv,runDiagnose:()=>Aq});import{tmpdir as Nq}from"node:os";import{join as xq}from"node:path";async function Aq(e,t={stdout:process.stdout,stderr:process.stderr}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(`${$q()}
2553
+ `)}var xv=T(()=>{"use strict";kf();Ks()});import{spawnSync as Sq}from"node:child_process";import{stat as vq}from"node:fs/promises";async function Av(e){try{if(!(await vq(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 kq(e);case"hq":return Iq(e)}}function kq(e){let r=Sq("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 Iq(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 Rv=T(()=>{"use strict"});var Ov={};we(Ov,{parseDiagnoseArgs:()=>Lv,runDiagnose:()=>Aq});import{tmpdir as Nq}from"node:os";import{join as xq}from"node:path";async function Aq(e,t={stdout:process.stdout,stderr:process.stderr}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(`${Oq()}
2548
2554
  `),0;let r=Lv(e);if(typeof r=="string")return t.stderr.write(`error: ${r}
2549
2555
  `),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)
2550
2556
  `),2;if(r.upload&&r.internalS3)return t.stderr.write(`error: pick one of --upload (HQ) or --internal-s3, not both
2551
- `),2;let n=Ev(),s=r.outputPath??Lq(n),i=r.internalS3?"internal-s3":r.upload?"hq":"local";try{return await O(t,async o=>{let a=await Yf({dal:o,include:r.include,dbPath:le(),intentLog:process.env.LMCTL_INTENT_LOG}),l;try{l=await Nv({ticketId:n,data:a,outputPath:s,lmctlNextVersion:yt(),sanitized:!r.noSanitize})}catch(u){if(u instanceof Sr)return t.stderr.write(`sanitization failed: ${u.message}
2557
+ `),2;let n=Ev(),s=r.outputPath??Lq(n),i=r.internalS3?"internal-s3":r.upload?"hq":"local";try{return await $(t,async o=>{let a=await Yf({dal:o,include:r.include,dbPath:le(),intentLog:process.env.LMCTL_INTENT_LOG}),l;try{l=await Nv({ticketId:n,data:a,outputPath:s,lmctlNextVersion:yt(),sanitized:!r.noSanitize})}catch(u){if(u instanceof Sr)return t.stderr.write(`sanitization failed: ${u.message}
2552
2558
  `),2;throw u}let c=await Av({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)}
2553
2559
  `):(t.stdout.write(`ticket: ${n}
2554
2560
  `),t.stdout.write(`bundle: ${l.outputPath} (${l.bundleSizeBytes} bytes, ${l.manifest.files.length} files)
2555
2561
  `),t.stdout.write(`upload[${c.mode}]: ${c.ok?"ok":"noop"} \u2014 ${c.message}
2556
2562
  `)),c.ok||i==="local"?0:1})}catch(o){return t.stderr.write(`diagnose failed: ${o instanceof Error?o.message:String(o)}
2557
- `),1}}function Lv(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(!Rq(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 Rq(e){return Ys.includes(e)}function Lq(e){return xq(Nq(),`lmctl-diag-${e}.tar.gz`)}function $q(){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(`
2558
- `)}var Ov=T(()=>{"use strict";Pn();xv();kf();Ks();Rv();Je();Le()});var Fv={};we(Fv,{ATTENTION_STATES:()=>Rf,DAEMON_INTERVAL_FAST_MS:()=>Af,REQUIRED_TEAM_ALIASES:()=>Cv,chooseDiagnoses:()=>Dv,collectEvidence:()=>jv,diagnose:()=>Mv,renderReport:()=>Pv,runDiagnosePrompt:()=>Mq});function Mv(e,t){let r=jv(e,t),n=Dv(r);return Pv(r,n)}function jv(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:vs(),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=Cq(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=Cv.filter(a=>!o.has(a))}catch{n.team.sectionAvailable=!1}return n.daemon.workerPid=null,n.daemon.lastTickAt=null,n}function Dv(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 Pv(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: ${Oq(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(`
2563
+ `),1}}function Lv(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(!Rq(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 Rq(e){return Ys.includes(e)}function Lq(e){return xq(Nq(),`lmctl-diag-${e}.tar.gz`)}function Oq(){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(`
2564
+ `)}var $v=T(()=>{"use strict";Pn();xv();kf();Ks();Rv();Je();Le()});var Fv={};we(Fv,{ATTENTION_STATES:()=>Rf,DAEMON_INTERVAL_FAST_MS:()=>Af,REQUIRED_TEAM_ALIASES:()=>Cv,chooseDiagnoses:()=>Dv,collectEvidence:()=>jv,diagnose:()=>Mv,renderReport:()=>Pv,runDiagnosePrompt:()=>Mq});function Mv(e,t){let r=jv(e,t),n=Dv(r);return Pv(r,n)}function jv(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:vs(),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=Cq(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=Cv.filter(a=>!o.has(a))}catch{n.team.sectionAvailable=!1}return n.daemon.workerPid=null,n.daemon.lastTickAt=null,n}function Dv(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 Pv(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: ${$q(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(`
2559
2565
  `)+`
2560
- `}function Oq(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 Cq(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:`${t.slice(0,80)}...`}async function Mq(e,t={stdout:process.stdout,stderr:process.stderr}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(`${xf()}
2566
+ `}function $q(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 Cq(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:`${t.slice(0,80)}...`}async function Mq(e,t={stdout:process.stdout,stderr:process.stderr}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(`${xf()}
2561
2567
  `),0;let r=[];for(let s of e){if(s.startsWith("--"))return t.stderr.write(`error: unknown flag: ${s}
2562
2568
  `),t.stderr.write(`${xf()}
2563
2569
  `),2;r.push(s)}if(r.length!==1)return t.stderr.write(`error: expected exactly one positional arg: <prompt_id>
2564
2570
  `),t.stderr.write(`${xf()}
2565
- `),2;let n=r[0];try{return await O(t,s=>(t.stdout.write(Mv(s,n)),0))}catch(s){return t.stderr.write(`diagnose-prompt failed: ${s instanceof Error?s.message:String(s)}
2571
+ `),2;let n=r[0];try{return await $(t,s=>(t.stdout.write(Mv(s,n)),0))}catch(s){return t.stderr.write(`diagnose-prompt failed: ${s instanceof Error?s.message:String(s)}
2566
2572
  `),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(`
2567
2573
  `)}var Cv,Af,Rf,Uv=T(()=>{"use strict";Zd();Le();Cv=["Coder","Reviewer1","Polisher"],Af=3e4,Rf=new Set(["attention_needed","paused","escalation"])});var ck={};we(ck,{appendIntent:()=>ek,resolveIntentLogPath:()=>Qv,runStatus:()=>Xq});import{appendFileSync as jq,mkdirSync as Dq}from"node:fs";import{homedir as Pq,hostname as Wv}from"node:os";import{basename as Fq,dirname as Zv,isAbsolute as Uq,join as Wq,resolve as Bq}from"node:path";function Qv(){return process.env.LMCTL_INTENT_LOG??Wq(Pq(),".lmctl","recent-intents.log")}function ek(e){try{let t=Qv();Dq(Zv(t),{recursive:!0});let r=JSON.stringify({ts:e.ts??new Date().toISOString(),cwd:e.cwd??process.cwd(),verb:e.verb,args:[...e.args]});jq(t,`${r}
2568
- `)}catch{}}async function Xq(e,t){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(qq),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=V(n,"--json"),i=SH(P(n,"--since"));if("error"in i)return v(t,i.error);try{let o=t.env??process.env;if(s){let a=await O(t,l=>Xv(l,o));ae(t,a)}else{let a=await O(t,async l=>cH(await Xv(l,o),{sinceIso:i.iso}));t.stdout.write(a)}return ek({verb:"status",args:e}),0}catch(o){return v(t,o instanceof Error?o.message:String(o))}}async function Xv(e,t){let r=Ou(t,e);if(!r.ok){if(r.reason==="not-found")throw new Error($s("status"));return await Vq(e)}return await Gq(e,r.identity)}async function Gq(e,t){let r=Wr(t),n=e.getRootTeam(r.teamfile);if(n===null)throw new Error($s("status"));let s=Pe(n.teamfile_path,e),i=$f(Ua(e,{from:r.value})),o=$f(Ua(e,{target_teamfile:r.teamfile,target_alias:r.alias})),a=Zq([...Lf(e,{from:r.value}),...Lf(e,{target_teamfile:r.teamfile,target_alias:r.alias})]);return{scope:"self",identity:r.value,...tk(),team:{name:s.name,teamfile:n.teamfile_path},members:s.members.map(l=>Yq(e,n.teamfile_path,l)),activity:{from_me:i.map(l=>Of(l,e)),to_me:o.map(l=>Of(l,e))},transcript_harvest:await nk(a),mailbox:{outbound:Wa(Qq(e,r.teamfile,r.alias),"outbound"),inbound_pending:Wa(eH(e,r.teamfile,r.alias),"inbound")},waiting_on:tH(e,r.teamfile,r.alias).map(l=>rk(l,e))}}function tk(){return{workspace:jt(),db_path:le()}}async function Vq(e){let t=e.listRootTeams();return{scope:"workspace",identity:null,...tk(),teams:t.map(r=>Kq(e,r)),activity:$f(Ua(e)).map(r=>Of(r,e)),transcript_harvest:await nk(Lf(e)),mailbox:{pending_outbound:Wa(Gv(e,"sender"),"outbound"),pending_inbound:Wa(Gv(e,"receiver"),"inbound")},waiting_on:rH(e).map(r=>rk(r,e))}}function Kq(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 Yq(e,t,r){let n=r.teamfile===void 0?null:Ee(Uq(r.teamfile)?r.teamfile:Bq(Zv(t),r.teamfile),e),s=pr(e,t,r.alias),i=s.busy&&s.reason==="in-flight"?zq(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 zq(e,t,r,n){let s=n.sender_alias==="operator"?"operator":`${n.sender_teamfile}:${n.sender_alias}`,o=e.db.prepare(`
2574
+ `)}catch{}}async function Xq(e,t){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(qq),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=V(n,"--json"),i=SH(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=>Xv(l,o));ae(t,a)}else{let a=await $(t,async l=>cH(await Xv(l,o),{sinceIso:i.iso}));t.stdout.write(a)}return ek({verb:"status",args:e}),0}catch(o){return v(t,o instanceof Error?o.message:String(o))}}async function Xv(e,t){let r=$u(t,e);if(!r.ok){if(r.reason==="not-found")throw new Error(Os("status"));return await Vq(e)}return await Gq(e,r.identity)}async function Gq(e,t){let r=Wr(t),n=e.getRootTeam(r.teamfile);if(n===null)throw new Error(Os("status"));let s=Pe(n.teamfile_path,e),i=Of(Ua(e,{from:r.value})),o=Of(Ua(e,{target_teamfile:r.teamfile,target_alias:r.alias})),a=Zq([...Lf(e,{from:r.value}),...Lf(e,{target_teamfile:r.teamfile,target_alias:r.alias})]);return{scope:"self",identity:r.value,...tk(),team:{name:s.name,teamfile:n.teamfile_path},members:s.members.map(l=>Yq(e,n.teamfile_path,l)),activity:{from_me:i.map(l=>$f(l,e)),to_me:o.map(l=>$f(l,e))},transcript_harvest:await nk(a),mailbox:{outbound:Wa(Qq(e,r.teamfile,r.alias),"outbound"),inbound_pending:Wa(eH(e,r.teamfile,r.alias),"inbound")},waiting_on:tH(e,r.teamfile,r.alias).map(l=>rk(l,e))}}function tk(){return{workspace:jt(),db_path:le()}}async function Vq(e){let t=e.listRootTeams();return{scope:"workspace",identity:null,...tk(),teams:t.map(r=>Kq(e,r)),activity:Of(Ua(e)).map(r=>$f(r,e)),transcript_harvest:await nk(Lf(e)),mailbox:{pending_outbound:Wa(Gv(e,"sender"),"outbound"),pending_inbound:Wa(Gv(e,"receiver"),"inbound")},waiting_on:rH(e).map(r=>rk(r,e))}}function Kq(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 Yq(e,t,r){let n=r.teamfile===void 0?null:Ee(Uq(r.teamfile)?r.teamfile:Bq(Zv(t),r.teamfile),e),s=pr(e,t,r.alias),i=s.busy&&s.reason==="in-flight"?zq(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 zq(e,t,r,n){let s=n.sender_alias==="operator"?"operator":`${n.sender_teamfile}:${n.sender_alias}`,o=e.db.prepare(`
2569
2575
  SELECT * FROM tracked_invocation
2570
2576
  WHERE kind = 'chat'
2571
2577
  AND status = 'running'
@@ -2642,9 +2648,9 @@ delete requires --confirm; deleting default or active workspaces also requires -
2642
2648
  ELSE delivered_at
2643
2649
  END ASC,
2644
2650
  id ASC
2645
- `).all()}function $f(e){return e.filter(t=>zo(t)!=="dead")}function rk(e,t){let r=e.delivered_at!==null&&(e.receipt===null||e.receipt==="");return{id:e.id,state:r?"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,payload:e.payload,payload_preview:lk(e.payload),receiver_availability:nH(pr(t,e.receiver_teamfile,e.receiver_alias)),age_basis_at:r?e.delivered_at:e.created_at,created_at:e.created_at,delivered_at:e.delivered_at}}function nH(e){if(!e.busy)return{state:"idle",reason:null,detail:"receiver idle now"};if(e.reason==="in-flight"){let s=e.inFlight.sender_alias==="operator"?"operator":`${e.inFlight.sender_teamfile}:${e.inFlight.sender_alias}`,i=e.inFlight.holder_pid===null?"":`, holder pid ${e.inFlight.holder_pid}`;return{state:"busy",reason:"in-flight",detail:`receiver busy now (in-flight: ${Ye(s)} since ${e.inFlight.started_at}${i})`}}if(e.source==="terminal-lock"){let s=e.terminalLock,i=s.holder_host===Wv()?"this host":s.holder_host;return{state:"busy",reason:"terminal-held",detail:`receiver busy now (terminal: holder pid ${s.holder_pid} alive on ${i})`}}let t=e.terminalInvocation,r=t.holder_host===null?"unknown host":t.holder_host===Wv()?"this host":t.holder_host,n=t.holder_pid===null?"":` holder pid ${t.holder_pid}`;return{state:"busy",reason:"terminal-held",detail:`receiver busy now (terminal: invocation #${t.id}${n} alive on ${r})`}}async function nk(e){let t=[];for(let r of e)t.push(await sH(r));return t}async function sH(e){let t=e.target_teamfile===null||e.target_alias===null?null:`${e.target_teamfile}:${e.target_alias}`,r={tracked_invocation_id:e.id,from_identity:e.from_identity,target:t??"(unknown)",started_at:e.started_at,tail_hint:t===null?"":`lmctl tail "${e.target_teamfile}" ${e.target_alias}`};if(t===null)return Jr(r,"missing-target",null,null);if(e.request_payload===null||e.request_payload.length===0)return Jr(r,"missing-request-payload",null,null);let n=iH(e.meta);if(n.provider===null||n.sessionid===null)return Jr(r,"missing-session-metadata",n.provider,n.sessionid);if(!oH(n.provider))return Jr(r,"unsupported-provider",n.provider,n.sessionid);let s;try{s=await _t(n.sessionid,n.provider)}catch{return Jr(r,"read-error",n.provider,n.sessionid)}if(s===null)return Jr(r,"session-not-found",n.provider,n.sessionid);let i=aH(e.request_payload,s.messages);return i.state!=="completed"?Jr(r,i.reason,n.provider,n.sessionid):{...r,state:"completed",reason:null,provider:n.provider,session_id:n.sessionid,result_payload:i.result,result_preview:ak(i.result),assistant_timestamp:i.assistantTimestamp,matched_user_index:i.userIndex}}function Jr(e,t,r,n){return{...e,state:"unreconciled",reason:t,provider:r,session_id:n,result_payload:null,result_preview:null,assistant_timestamp:null,matched_user_index:null}}function iH(e){if(e===null||e.trim()==="")return{provider:null,sessionid:null};try{let t=JSON.parse(e);return{provider:typeof t.provider=="string"&&t.provider.length>0?t.provider:null,sessionid:typeof t.sessionid=="string"&&t.sessionid.length>0?t.sessionid:null}}catch{return{provider:null,sessionid:null}}}function oH(e){return["claude","codex","gemini","copilot","opencode","lmplayer","qwen","agy","ClaudeMock"].includes(e)}function aH(e,t){let r=t.map((i,o)=>({message:i,index:o})).filter(({message:i})=>i.role==="user"&&i.content===e);if(r.length===0)return{state:"unreconciled",reason:"request-not-found"};if(r.length>1)return{state:"unreconciled",reason:"duplicate-request"};let n=r[0].index,s=[];for(let i of t.slice(n+1)){if(i.role==="user")break;i.role==="assistant"&&i.content.trim().length>0&&s.push(i)}return s.length===0?{state:"unreconciled",reason:"no-assistant-response"}:{state:"completed",userIndex:n,result:s.map(i=>i.content).join(`
2651
+ `).all()}function Of(e){return e.filter(t=>zo(t)!=="dead")}function rk(e,t){let r=e.delivered_at!==null&&(e.receipt===null||e.receipt==="");return{id:e.id,state:r?"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,payload:e.payload,payload_preview:lk(e.payload),receiver_availability:nH(pr(t,e.receiver_teamfile,e.receiver_alias)),age_basis_at:r?e.delivered_at:e.created_at,created_at:e.created_at,delivered_at:e.delivered_at}}function nH(e){if(!e.busy)return{state:"idle",reason:null,detail:"receiver idle now"};if(e.reason==="in-flight"){let s=e.inFlight.sender_alias==="operator"?"operator":`${e.inFlight.sender_teamfile}:${e.inFlight.sender_alias}`,i=e.inFlight.holder_pid===null?"":`, holder pid ${e.inFlight.holder_pid}`;return{state:"busy",reason:"in-flight",detail:`receiver busy now (in-flight: ${Ye(s)} since ${e.inFlight.started_at}${i})`}}if(e.source==="terminal-lock"){let s=e.terminalLock,i=s.holder_host===Wv()?"this host":s.holder_host;return{state:"busy",reason:"terminal-held",detail:`receiver busy now (terminal: holder pid ${s.holder_pid} alive on ${i})`}}let t=e.terminalInvocation,r=t.holder_host===null?"unknown host":t.holder_host===Wv()?"this host":t.holder_host,n=t.holder_pid===null?"":` holder pid ${t.holder_pid}`;return{state:"busy",reason:"terminal-held",detail:`receiver busy now (terminal: invocation #${t.id}${n} alive on ${r})`}}async function nk(e){let t=[];for(let r of e)t.push(await sH(r));return t}async function sH(e){let t=e.target_teamfile===null||e.target_alias===null?null:`${e.target_teamfile}:${e.target_alias}`,r={tracked_invocation_id:e.id,from_identity:e.from_identity,target:t??"(unknown)",started_at:e.started_at,tail_hint:t===null?"":`lmctl tail "${e.target_teamfile}" ${e.target_alias}`};if(t===null)return Jr(r,"missing-target",null,null);if(e.request_payload===null||e.request_payload.length===0)return Jr(r,"missing-request-payload",null,null);let n=iH(e.meta);if(n.provider===null||n.sessionid===null)return Jr(r,"missing-session-metadata",n.provider,n.sessionid);if(!oH(n.provider))return Jr(r,"unsupported-provider",n.provider,n.sessionid);let s;try{s=await _t(n.sessionid,n.provider)}catch{return Jr(r,"read-error",n.provider,n.sessionid)}if(s===null)return Jr(r,"session-not-found",n.provider,n.sessionid);let i=aH(e.request_payload,s.messages);return i.state!=="completed"?Jr(r,i.reason,n.provider,n.sessionid):{...r,state:"completed",reason:null,provider:n.provider,session_id:n.sessionid,result_payload:i.result,result_preview:ak(i.result),assistant_timestamp:i.assistantTimestamp,matched_user_index:i.userIndex}}function Jr(e,t,r,n){return{...e,state:"unreconciled",reason:t,provider:r,session_id:n,result_payload:null,result_preview:null,assistant_timestamp:null,matched_user_index:null}}function iH(e){if(e===null||e.trim()==="")return{provider:null,sessionid:null};try{let t=JSON.parse(e);return{provider:typeof t.provider=="string"&&t.provider.length>0?t.provider:null,sessionid:typeof t.sessionid=="string"&&t.sessionid.length>0?t.sessionid:null}}catch{return{provider:null,sessionid:null}}}function oH(e){return["claude","codex","gemini","copilot","opencode","lmplayer","qwen","agy","ClaudeMock"].includes(e)}function aH(e,t){let r=t.map((i,o)=>({message:i,index:o})).filter(({message:i})=>i.role==="user"&&i.content===e);if(r.length===0)return{state:"unreconciled",reason:"request-not-found"};if(r.length>1)return{state:"unreconciled",reason:"duplicate-request"};let n=r[0].index,s=[];for(let i of t.slice(n+1)){if(i.role==="user")break;i.role==="assistant"&&i.content.trim().length>0&&s.push(i)}return s.length===0?{state:"unreconciled",reason:"no-assistant-response"}:{state:"completed",userIndex:n,result:s.map(i=>i.content).join(`
2646
2652
 
2647
- `),assistantTimestamp:lH(s[s.length-1]?.timestamp)}}function lH(e){if(e===void 0)return null;let t=e.getTime();return Number.isFinite(t)?e.toISOString():null}function Of(e,t){let r={id:e.id,kind:e.kind,origin:e.origin,status:e.status,holder_liveness:zo(e),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:zv(e.result_summary),error:zv(e.error)};return r.mailbox_delivery=gH(r,t),r}function Wa(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 cH(e,t){return e.scope==="self"?dH(e,t):uH(e,t)}function dH(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:"),ik(r,e.waiting_on,"self"),r.push(""),r.push("transcript harvest:"),ok(r,e.transcript_harvest,"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:"),qa(r,e.mailbox.outbound),r.push(""),r.push("mailbox inbound pending:"),qa(r,e.mailbox.inbound_pending),r.push(""),r.push(sk(e)),r.join(`
2653
+ `),assistantTimestamp:lH(s[s.length-1]?.timestamp)}}function lH(e){if(e===void 0)return null;let t=e.getTime();return Number.isFinite(t)?e.toISOString():null}function $f(e,t){let r={id:e.id,kind:e.kind,origin:e.origin,status:e.status,holder_liveness:zo(e),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:zv(e.result_summary),error:zv(e.error)};return r.mailbox_delivery=gH(r,t),r}function Wa(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 cH(e,t){return e.scope==="self"?dH(e,t):uH(e,t)}function dH(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:"),ik(r,e.waiting_on,"self"),r.push(""),r.push("transcript harvest:"),ok(r,e.transcript_harvest,"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:"),qa(r,e.mailbox.outbound),r.push(""),r.push("mailbox inbound pending:"),qa(r,e.mailbox.inbound_pending),r.push(""),r.push(sk(e)),r.join(`
2648
2654
  `)}function uH(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:"),ik(r,e.waiting_on,"workspace"),r.push(""),r.push("transcript harvest:"),ok(r,e.transcript_harvest,"workspace"),r.push(""),r.push("recent activity:"),Cf(r,Mf(e.activity,t.sinceIso),"workspace"),r.push(""),r.push("mailbox pending outbound:"),qa(r,e.mailbox.pending_outbound),r.push(""),r.push("mailbox pending inbound:"),qa(r,e.mailbox.pending_inbound),r.push(""),r.push(sk(e)),r.join(`
2649
2655
  `)}function sk(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(Yv).sort(_H),s=n.length===0?t:t.filter(i=>!Yv(i));for(let i of n.slice(0,Bv))Kv(e,i,r);Ba(e,n.length,Bv,"more open delegations");for(let i of s.slice(0,Fa))Kv(e,i,r);Ba(e,s.length,Fa,"older")}function ik(e,t,r){if(t.length===0){e.push(" none");return}let n=fH(t,Hq);for(let s of n){let i=r==="workspace"&&s.sender!==null?`${Ye(s.sender)} -> ${Ye(s.receiver)}`:Ye(s.receiver);e.push(` ${i} - ${s.state} ${bH(s.age_basis_at)} (#${s.id}, ${s.message_type})`),e.push(` "${s.payload_preview}"`),e.push(` ${s.receiver_availability.detail}; lane key: sender+receiver, another sender's chat will not flush this queued mail`)}pH(e,t,n)}function ok(e,t,r){if(t.length===0){e.push(" none");return}for(let n of t.slice(0,Fa)){let s=r==="workspace"?` from ${Ye(n.from_identity)} -> ${Ye(n.target)}`:` -> ${Ye(n.target)}`;if(n.state==="completed"){let i=n.result_preview===null?"":` "${n.result_preview}"`;e.push(` #${n.tracked_invocation_id} completed in transcript; lmctl DB not finalized${s} since ${n.started_at}${i}`)}else e.push(` #${n.tracked_invocation_id} unreconciled${s} since ${n.started_at} (${n.reason??"unknown"})`);n.tail_hint.length>0&&e.push(` inspect: ${n.tail_hint}`)}Ba(e,t.length,Fa,"more transcript harvest rows")}function fH(e,t){let r=[...e].sort(Vv);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=mH(n);a>=0&&(n[a]=o)}return n.sort(Vv)}function mH(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 pH(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 Vv(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 Kv(e,t,r){let n=TH(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?"":` "${ak(i)}"`;e.push(` #${t.id} ${hH(t)} ${t.kind}${n} ${s}${o}`)}function Yv(e){return e.mailbox_delivery?.state==="queued"||e.mailbox_delivery?.state==="delivering"}function _H(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 hH(e){return e.status==="running"&&e.holder_liveness==="unknown"?"RUNNING_UNKNOWN":e.mailbox_delivery===null?e.status.toUpperCase():e.mailbox_delivery.state.toUpperCase()}function gH(e,t){let r=yH(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 yH(e,t){if(e.kind!=="chat"||e.status!=="done"||e.target===null||e.result===null)return null;let r,n;try{r=Wr(e.from_identity),n=Wr(e.target)}catch{return null}for(let s of wH(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)&&EH(i,e))return i}return null}function wH(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 EH(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 TH(e,t){if(t==="from-me")return e.target===null?"":` -> ${Ye(e.target)}`;if(t==="to-me")return` from ${Ye(e.from_identity)}`;let r=e.target===null?"":` -> ${Ye(e.target)}`;return` from ${Ye(e.from_identity)}${r}`}function Ba(e,t,r,n){let s=t-r;s>0&&e.push(` (+${s} ${n} -- use --json)`)}function qa(e,t){if(t.length===0){e.push(" none");return}for(let r of t.slice(0,qv)){let n=r.sender??"operator";e.push(` ${Ye(n)} -> ${Ye(r.receiver)}: ${r.pending_count} pending ${r.message_types.join("+")} (oldest ${r.oldest_created_at})`)}Ba(e,t.length,qv,"more lanes")}function zv(e){return e===null||e.length===0?null:e.replace(/\s+/g," ").trim()}function ak(e){let t=e.replace(/\s+/g," ").trim();return t.length<=Hv?t:`${t.slice(0,Hv-3)}...`}function lk(e){let t=e.replace(/\s+/gu," ").trim();return t.length<=Jv?t:`${t.slice(0,Jv-3)}...`}function bH(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 Ye(e){if(e==="operator")return e;try{let t=Wr(e);return`${Fq(t.teamfile)}:${t.alias}`}catch{return e}}function SH(e){if(e===void 0)return{iso:new Date(Date.now()-Jq).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 qq,Fa,Bv,qv,Hq,Jq,Hv,Jv,dk=T(()=>{"use strict";Dr();Le();Cu();Je();Ea();Rt();Br();qq=`usage: lmctl status [--json] [--since <duration|ISO8601>]
2650
2656
 
@@ -2710,7 +2716,7 @@ ${Cn}Run 'lmctl help' for usage.
2710
2716
  `),0;if(n==="--help"||n==="-h"||n===void 0)return t.stdout.write(jf),0;if(n==="help"){let[a,...l]=r.slice(1);return a===void 0||a==="--help"||a==="-h"?(t.stdout.write(jf),0):uk.has(a)?fk(a,[...l,"--help"],t):mk(t,a)}Bf(le(),t.stderr),Hf(t.stderr);let[s,...i]=r;if(s===void 0)return t.stdout.write(jf),0;let o=Date.now();Pf(s,i,{phase:"start",started_at:new Date(o).toISOString()});try{let a=await fk(s,i,t);return Pf(s,i,{phase:"finish",outcome:a===0?"ok":"error",exit_code:a,duration_ms:Date.now()-o}),uk.has(s)&&!za(r,t)&&await am(t,r),a}catch(a){let l=a instanceof Error?a:new Error(String(a));return Pf(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:xH(l)}),NH(a,s,i,t)}}function Pf(e,t,r){Ae({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 NH(e,t,r,n){let s=e instanceof Error?e:new Error(String(e));return n.stderr.write(`error: ${s.message}
2711
2717
  `),nm()?(n.stderr.write(`(debug details written to ~/.lmctl/debug-*.log)
2712
2718
  `),1):(n.stderr.write(`(re-run with --debug for the full stack trace and context in ~/.lmctl/debug-*.log)
2713
- `),1)}function xH(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 fk(e,t,r){switch(e){case"api":{let{runApi:n}=await Promise.resolve().then(()=>(J_(),H_));return n(t,r)}case"serve":{let{runServe:n}=await Promise.resolve().then(()=>(WT(),UT));return n(t,r)}case"chat":{let{runChat:n}=await Promise.resolve().then(()=>(vb(),Sb));return n(t,r)}case"recover":{let{runRecover:n}=await Promise.resolve().then(()=>($b(),Lb));return n(t,r)}case"mcp":{let{runMcp:n}=await Promise.resolve().then(()=>(Fb(),Pb));return n(t,r)}case"device":{let{runDevice:n}=await Promise.resolve().then(()=>(Wb(),Ub));return n(t,r)}case"team":{let{runTeam:n}=await Promise.resolve().then(()=>(dS(),cS));return n(t,r)}case"tail":{let{runTail:n}=await Promise.resolve().then(()=>(yS(),gS));return n(t,r)}case"health":{let{runInfo:n}=await Promise.resolve().then(()=>(NS(),IS));return n(t,r)}case"ls":{let{runLs:n}=await Promise.resolve().then(()=>(RS(),AS));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(()=>(zS(),YS));return n(t,r)}case"plan":{let{runPlan:n}=await Promise.resolve().then(()=>(tv(),ev));return n(t,r)}case"terminal":{let{runTerminal:n}=await Promise.resolve().then(()=>(dv(),cv));return n(t,r)}case"workspace":{let{runWorkspace:n}=await Promise.resolve().then(()=>(wv(),yv));return n(t,r)}case"diagnose":{let{runDiagnose:n}=await Promise.resolve().then(()=>(Ov(),$v));return n(t,r)}case"diagnose-prompt":{let{runDiagnosePrompt:n}=await Promise.resolve().then(()=>(Uv(),Fv));return n(t,r)}case"status":{let{runStatus:n}=await Promise.resolve().then(()=>(dk(),ck));return n(t,r)}case"db":return AH(t,r);default:return mk(r,e)}}function AH(e,t){let[r,...n]=e;return r==="--help"||r==="-h"||r==="help"?(t.stdout.write(`usage: lmctl db downgrade --to <version> --confirm
2719
+ `),1)}function xH(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 fk(e,t,r){switch(e){case"api":{let{runApi:n}=await Promise.resolve().then(()=>(J_(),H_));return n(t,r)}case"serve":{let{runServe:n}=await Promise.resolve().then(()=>(WT(),UT));return n(t,r)}case"chat":{let{runChat:n}=await Promise.resolve().then(()=>(vb(),Sb));return n(t,r)}case"recover":{let{runRecover:n}=await Promise.resolve().then(()=>(Ob(),Lb));return n(t,r)}case"mcp":{let{runMcp:n}=await Promise.resolve().then(()=>(Fb(),Pb));return n(t,r)}case"device":{let{runDevice:n}=await Promise.resolve().then(()=>(Wb(),Ub));return n(t,r)}case"team":{let{runTeam:n}=await Promise.resolve().then(()=>(dS(),cS));return n(t,r)}case"tail":{let{runTail:n}=await Promise.resolve().then(()=>(yS(),gS));return n(t,r)}case"health":{let{runInfo:n}=await Promise.resolve().then(()=>(NS(),IS));return n(t,r)}case"ls":{let{runLs:n}=await Promise.resolve().then(()=>(RS(),AS));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(()=>(zS(),YS));return n(t,r)}case"plan":{let{runPlan:n}=await Promise.resolve().then(()=>(tv(),ev));return n(t,r)}case"terminal":{let{runTerminal:n}=await Promise.resolve().then(()=>(dv(),cv));return n(t,r)}case"workspace":{let{runWorkspace:n}=await Promise.resolve().then(()=>(wv(),yv));return n(t,r)}case"diagnose":{let{runDiagnose:n}=await Promise.resolve().then(()=>($v(),Ov));return n(t,r)}case"diagnose-prompt":{let{runDiagnosePrompt:n}=await Promise.resolve().then(()=>(Uv(),Fv));return n(t,r)}case"status":{let{runStatus:n}=await Promise.resolve().then(()=>(dk(),ck));return n(t,r)}case"db":return AH(t,r);default:return mk(r,e)}}function AH(e,t){let[r,...n]=e;return r==="--help"||r==="-h"||r==="help"?(t.stdout.write(`usage: lmctl db downgrade --to <version> --confirm
2714
2720
 
2715
2721
  Database utilities. The downgrade command is currently a documented stub;
2716
2722
  restore from backup for rollback and use normal migrations for forward changes.