@lmctl-ai/lmctl 0.1.149 → 0.1.150

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/cli/index.js +258 -258
  2. package/package.json +1 -1
package/dist/cli/index.js CHANGED
@@ -1,8 +1,8 @@
1
- var _k=Object.defineProperty;var T=(e,t)=>()=>(e&&(t=e(e=0)),t);var ye=(e,t)=>{for(var r in t)_k(e,r,{get:t[r],enumerable:!0})};import{existsSync as Hs,readdirSync as kH,readFileSync as hk}from"node:fs";import{homedir as gk,platform as qf}from"node:os";import{join as Mt}from"node:path";function br(){let e=process.env.LMCTL_HOME;return e!==void 0&&e.length>0?e:Mt(gk(),yk)}function Js(){return Mt(br(),Hf)}function Xr(){return Mt(br(),wk)}function jt(e){return Mt(Xr(),e)}function Tr(e){return Mt(jt(e),Hf)}function Ja(e){return Mt(jt(e),"projects")}function Xs(){return Mt(br(),Ek)}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=hk(e,"utf8").trim();return t.length===0||!ze(t)?null:t}catch{return null}}function Dt(){let e=process.env.LMCTL_WORKSPACE;return e!==void 0&&e.length>0&&ze(e)?e:Gs()}function le(e){if(e!==void 0&&e.length>0)return e;if(process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0)return process.env.LMCTL_DB;let t=Dt();if(t!==null)return Tr(t);let r=Js();return Hs(r)||!Hs(Xr())?r:Tr(Jf)}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 Sk(e,t=qf()){return t!=="linux"?!1:e.startsWith("/mnt/c/")||e==="/mnt/c"}function Xf(e,t=process.stderr,r=qf()){Sk(e,r)&&t.write(`warning: DB on /mnt/c is slow; consider moving to ~/.lmctl/state.db (set LMCTL_DB or use --db)
2
- `)}function Xa(){return Mt(br(),Tk)}function Gf(){return Mt(br(),bk)}function vk(){try{return Hs(Xa())}catch{return!1}}function Vf(e=process.stderr){vk()&&e.write(`note: legacy ~/.lmctl/profiles/ detected \u2014 run 'lmctl workspace migrate' to move it to ~/.lmctl/workspaces/
1
+ var _k=Object.defineProperty;var T=(e,t)=>()=>(e&&(t=e(e=0)),t);var we=(e,t)=>{for(var r in t)_k(e,r,{get:t[r],enumerable:!0})};import{existsSync as Js,readdirSync as xH,readFileSync as hk}from"node:fs";import{homedir as gk,platform as qf}from"node:os";import{join as Mt}from"node:path";function br(){let e=process.env.LMCTL_HOME;return e!==void 0&&e.length>0?e:Mt(gk(),yk)}function Xs(){return Mt(br(),Hf)}function Xr(){return Mt(br(),wk)}function jt(e){return Mt(Xr(),e)}function Tr(e){return Mt(jt(e),Hf)}function Ja(e){return Mt(jt(e),"projects")}function Gs(){return Mt(br(),Ek)}function ze(e){return!(e.length===0||e.length>64||!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(e)||e==="."||e==="..")}function Vs(){let e=Gs();if(!Js(e))return null;try{let t=hk(e,"utf8").trim();return t.length===0||!ze(t)?null:t}catch{return null}}function Dt(){let e=process.env.LMCTL_WORKSPACE;return e!==void 0&&e.length>0&&ze(e)?e:Vs()}function le(e){if(e!==void 0&&e.length>0)return e;if(process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0)return process.env.LMCTL_DB;let t=Dt();if(t!==null)return Tr(t);let r=Xs();return Js(r)||!Js(Xr())?r:Tr(Jf)}function Ks(e,t){return`workspace: ${process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0?"(overridden by --db)":e??"default"} db: ${t}`}function Sk(e,t=qf()){return t!=="linux"?!1:e.startsWith("/mnt/c/")||e==="/mnt/c"}function Xf(e,t=process.stderr,r=qf()){Sk(e,r)&&t.write(`warning: DB on /mnt/c is slow; consider moving to ~/.lmctl/state.db (set LMCTL_DB or use --db)
2
+ `)}function Xa(){return Mt(br(),Tk)}function Gf(){return Mt(br(),bk)}function vk(){try{return Js(Xa())}catch{return!1}}function Vf(e=process.stderr){vk()&&e.write(`note: legacy ~/.lmctl/profiles/ detected \u2014 run 'lmctl workspace migrate' to move it to ~/.lmctl/workspaces/
3
3
  `)}var yk,Hf,wk,Ek,Jf,Tk,bk,Sr,Xe=T(()=>{"use strict";yk=".lmctl",Hf="state.db",wk="workspaces",Ek="active-workspace",Jf="default",Tk="profiles",bk="active-profile";Sr={default:Jf}});function xk(e){for(let t of Nk)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 Ak(e){let t=e.toLowerCase();return!!(t==="::1"||t==="::"||t.startsWith("fe80:")||t.startsWith("fe80::"))}function Ok(e){let t=e.split(".");if(t.length!==4)return!1;for(let r of t){if(r.length===0||r.length>3)return!1;let n=Number(r);if(!Number.isFinite(n)||n<0||n>255)return!1}return!0}function Dn(e){let t=e;for(let{re:r,replacement:n}of Ik)t=t.replace(r,n);return t=t.replace(Rk,r=>!Ok(r)||xk(r)?r:Kf),t=t.replace(Lk,r=>Ak(r)?r:Kf),t}function Pn(e){return e.split(`
4
4
  `).map(t=>Dn(t)).join(`
5
- `)}function zf(e,t){let r=e.toUpperCase();return r.includes("TOKEN")||r.includes("SECRET")||r.includes("KEY")||r.includes("PASSWORD")||r.includes("PASSWD")||r.includes("CREDENTIAL")||r.includes("AUTH")?{key:e,value:st}:{key:e,value:Dn(t)}}function tr(e){if(typeof e=="string")return Dn(e);if(Array.isArray(e))return e.map(t=>tr(t));if(e!==null&&typeof e=="object"){let t={};for(let[r,n]of Object.entries(e)){let s=r.toUpperCase();s.includes("TOKEN")||s.includes("SECRET")||s.includes("KEY")||s.includes("PASSWORD")||s.includes("PASSWD")||s.includes("CREDENTIAL")?t[r]=typeof n=="string"?st:tr(n):t[r]=tr(n)}return t}return e}function Zf(e,t){for(let{name:r,re:n}of $k){let s=t.match(n);if(s!==null&&!s[0].includes(st))throw new vr(e,r)}}var st,kk,Kf,Yf,Ik,Nk,Rk,Lk,$k,vr,Ks=T(()=>{"use strict";st="[REDACTED]",kk="[REDACTED_EMAIL]",Kf="[REDACTED_IP]",Yf="[USER]",Ik=[{re:/(authorization\s*[:=]\s*)(bearer\s+[^\s,;"']+)/gi,replacement:`$1Bearer ${st}`},{re:/(authorization\s*[:=]\s*)(basic\s+[^\s,;"']+)/gi,replacement:`$1Basic ${st}`},{re:/\b(Bearer\s+)[A-Za-z0-9_\-./+=]{8,}/g,replacement:`$1${st}`},{re:/\bsk-ant-[A-Za-z0-9_\-]{8,}/g,replacement:st},{re:/\bsk-[A-Za-z0-9_\-]{16,}/g,replacement:st},{re:/\bgh[pousr]_[A-Za-z0-9]{30,}/g,replacement:st},{re:/\bAKIA[0-9A-Z]{16}\b/g,replacement:st},{re:/\b(api[_-]?key|token|secret|password|passwd)(\s*[:=]\s*"?)([A-Za-z0-9_\-./+=]{8,})("?)/gi,replacement:`$1$2${st}$4`},{re:/(\/home\/)[^/\s"'`]+/g,replacement:`$1${Yf}`},{re:/(\/Users\/)[^/\s"'`]+/g,replacement:`$1${Yf}`},{re:/\b[A-Za-z0-9._%+\-]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,}\b/g,replacement:kk}],Nk=["127.","10.","192.168.","0.0.0.0"];Rk=/\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/g,Lk=/\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"'`]+/}],vr=class extends Error{bundlePath;patternName;constructor(t,r){super(`sanitization failed: ${r} pattern matched in ${t}`),this.bundlePath=t,this.patternName=r,this.name="SanitizationError"}}});import{spawnSync as Ga}from"node:child_process";import{readFileSync as Ck}from"node:fs";import{readFile as Ka,stat as Qf}from"node:fs/promises";import{homedir as Mk}from"node:os";import{join as jk}from"node:path";import{fileURLToPath as Dk}from"node:url";function yt(){try{let e=new URL("../../package.json",import.meta.url),t=JSON.parse(Ck(Dk(e),"utf8"));if(typeof t.version=="string")return t.version}catch{}return"0.0.0"}async function em(e){let t=new Set(e.include??Ys),r={};return t.has("serve")&&(r.serve=await Fk(e)),t.has("db")&&(r.db=Uk(e)),t.has("runs")&&(r.runs=Wk(e)),t.has("jobs")&&(r.jobs=Bk(e)),t.has("attentions")&&(r.attentions=qk(e)),t.has("env")&&(r.env=await Hk(e)),t.has("intents")&&(r.intents=await Xk(e)),r}async function Fk(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 zf(e,t){let r=e.toUpperCase();return r.includes("TOKEN")||r.includes("SECRET")||r.includes("KEY")||r.includes("PASSWORD")||r.includes("PASSWD")||r.includes("CREDENTIAL")||r.includes("AUTH")?{key:e,value:st}:{key:e,value:Dn(t)}}function tr(e){if(typeof e=="string")return Dn(e);if(Array.isArray(e))return e.map(t=>tr(t));if(e!==null&&typeof e=="object"){let t={};for(let[r,n]of Object.entries(e)){let s=r.toUpperCase();s.includes("TOKEN")||s.includes("SECRET")||s.includes("KEY")||s.includes("PASSWORD")||s.includes("PASSWD")||s.includes("CREDENTIAL")?t[r]=typeof n=="string"?st:tr(n):t[r]=tr(n)}return t}return e}function Zf(e,t){for(let{name:r,re:n}of $k){let s=t.match(n);if(s!==null&&!s[0].includes(st))throw new vr(e,r)}}var st,kk,Kf,Yf,Ik,Nk,Rk,Lk,$k,vr,Ys=T(()=>{"use strict";st="[REDACTED]",kk="[REDACTED_EMAIL]",Kf="[REDACTED_IP]",Yf="[USER]",Ik=[{re:/(authorization\s*[:=]\s*)(bearer\s+[^\s,;"']+)/gi,replacement:`$1Bearer ${st}`},{re:/(authorization\s*[:=]\s*)(basic\s+[^\s,;"']+)/gi,replacement:`$1Basic ${st}`},{re:/\b(Bearer\s+)[A-Za-z0-9_\-./+=]{8,}/g,replacement:`$1${st}`},{re:/\bsk-ant-[A-Za-z0-9_\-]{8,}/g,replacement:st},{re:/\bsk-[A-Za-z0-9_\-]{16,}/g,replacement:st},{re:/\bgh[pousr]_[A-Za-z0-9]{30,}/g,replacement:st},{re:/\bAKIA[0-9A-Z]{16}\b/g,replacement:st},{re:/\b(api[_-]?key|token|secret|password|passwd)(\s*[:=]\s*"?)([A-Za-z0-9_\-./+=]{8,})("?)/gi,replacement:`$1$2${st}$4`},{re:/(\/home\/)[^/\s"'`]+/g,replacement:`$1${Yf}`},{re:/(\/Users\/)[^/\s"'`]+/g,replacement:`$1${Yf}`},{re:/\b[A-Za-z0-9._%+\-]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,}\b/g,replacement:kk}],Nk=["127.","10.","192.168.","0.0.0.0"];Rk=/\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/g,Lk=/\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"'`]+/}],vr=class extends Error{bundlePath;patternName;constructor(t,r){super(`sanitization failed: ${r} pattern matched in ${t}`),this.bundlePath=t,this.patternName=r,this.name="SanitizationError"}}});import{spawnSync as Ga}from"node:child_process";import{readFileSync as Ck}from"node:fs";import{readFile as Ka,stat as Qf}from"node:fs/promises";import{homedir as Mk}from"node:os";import{join as jk}from"node:path";import{fileURLToPath as Dk}from"node:url";function yt(){try{let e=new URL("../../package.json",import.meta.url),t=JSON.parse(Ck(Dk(e),"utf8"));if(typeof t.version=="string")return t.version}catch{}return"0.0.0"}async function em(e){let t=new Set(e.include??zs),r={};return t.has("serve")&&(r.serve=await Fk(e)),t.has("db")&&(r.db=Uk(e)),t.has("runs")&&(r.runs=Wk(e)),t.has("jobs")&&(r.jobs=Bk(e)),t.has("attentions")&&(r.attentions=qk(e)),t.has("env")&&(r.env=await Hk(e)),t.has("intents")&&(r.intents=await Xk(e)),r}async function Fk(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=Pn(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 Uk(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 Wk(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
@@ -12,9 +12,9 @@ var _k=Object.defineProperty;var T=(e,t)=>()=>(e&&(t=e(e=0)),t);var ye=(e,t)=>{f
12
12
  FROM attention WHERE acknowledged_at IS NULL ORDER BY created_at DESC LIMIT 100`);return{unacked:tr(r)}}async function Hk(e){let t=yt(),r=process.version,n=Ga("uname",["-a"],{encoding:"utf8"}),s=Pn((n.stdout??"").trim()),i=[],o=e.dbPath??process.env.LMCTL_DB;if(o!==void 0)try{await Qf(o);let d=Ga("du",["-sh",o],{encoding:"utf8"});d.status===0&&i.push(d.stdout.trim())}catch{}let a=e.sessiondir??process.env.LMCTL_SESSIONDIR;if(a!==void 0)try{await Qf(a);let d=Ga("du",["-sh",a],{encoding:"utf8"});d.status===0&&i.push(d.stdout.trim())}catch{}let l=i.length===0?"(no paths configured)":Pn(i.join(`
13
13
  `)),c=[];for(let d of Pk){let u=process.env[d];if(u===void 0){c.push({key:d,value:"(unset)"});continue}c.push(zf(d,u))}return{lmctl_next_version:t,node_version:r,os_info:s,disk_usage:l,env_keys_present:c}}function Jk(){return process.env.LMCTL_INTENT_LOG??jk(Mk(),".lmctl","recent-intents.log")}async function Xk(e){let t=e.intentLog??Jk(),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:Pn(i.join(`
15
- `)),note:null}}catch(n){return n.code==="ENOENT"?{source_path:t,tail_lines:0,tail:"",note:"no intent log present (status never run on this host)"}:{source_path:t,tail_lines:0,tail:"",note:`intent log unreadable: ${n instanceof Error?n.message:String(n)}`}}}var Ys,Pk,Va,Fn=T(()=>{"use strict";Ks();Ys=["serve","db","runs","jobs","attentions","env","intents"];Pk=["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 nm,appendFileSync as Gk,mkdirSync as Vk,existsSync as FH,readdirSync as UH,unlinkSync as WH}from"node:fs";import{join as Zs,dirname as Kk}from"node:path";import{homedir as Yk}from"node:os";function Ya(){return Zs(Yk(),".lmctl")}function sm(){Gr=!0,process.env.LMCTL_DEBUG="1"}function im(){return{cliDebug:Gr,lmctlDebugEnv:process.env.LMCTL_DEBUG}}function om(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-rm>=zk&&(tm=eI(),rm=e),tm}function am(){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{Qk();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};Gk(zs,JSON.stringify(r)+`
16
- `)}catch{}}function Qk(){if(!zs){let t=Zk().slice(0,13).replace("T","-");zs=Zs(Ya(),`debug-${t}.log`)}Vk(Kk(zs),{recursive:!0})}function Oe(...e){Ae({event:"legacy",msg:e.join(" ")})}function wt(...e){Ae({event:"legacy",msg:e.join(" ")},{verbose:!0})}function V(e){Ae(e,{always:!0})}function eI(){return tI()||rI()}function tI(){try{let e=nm(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 rI(){try{let e=nm(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,tm,rm,zk,zs,we=T(()=>{"use strict";Gr=!1,tm=!1,rm=0,zk=5e3;zs=null});import{existsSync as TI}from"node:fs";import{createRequire as bI}from"node:module";function SI(){return Za===null&&(Za=bI(import.meta.url)("node:sqlite").DatabaseSync),Za}function Qa(e){return e.length===1&&vI(e[0])?[e[0]]:e}function vI(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,fm,tl,mm=T(()=>{"use strict";Za=null;el=class{name;handle;transactionDepth=0;savepointId=0;constructor(t,r={}){if(r.fileMustExist===!0&&t!==":memory:"&&!TI(t))throw new Error("unable to open database file");this.name=t,this.handle=new(SI())(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)}}},fm=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 kI,mkdirSync as II,readFileSync as _m}from"node:fs";import{homedir as NI}from"node:os";import{dirname as hm,join as xI,resolve as gm}from"node:path";import{fileURLToPath as AI,pathToFileURL as RI}from"node:url";function nl(e){e.dbPath!==":memory:"&&II(hm(e.dbPath),{recursive:!0});let t=new fm(e.dbPath);t.pragma("journal_mode = WAL"),t.pragma("synchronous = NORMAL"),t.pragma("foreign_keys = ON");let r=Em(t);return r===0&&(t.exec(_m(wm,"utf8")),t.pragma(`user_version = ${OI}`)),$I(t,r),t}function $I(e,t){let r=t;if(r<2&&r!==0&&(e.exec(`
15
+ `)),note:null}}catch(n){return n.code==="ENOENT"?{source_path:t,tail_lines:0,tail:"",note:"no intent log present (status never run on this host)"}:{source_path:t,tail_lines:0,tail:"",note:`intent log unreadable: ${n instanceof Error?n.message:String(n)}`}}}var zs,Pk,Va,Fn=T(()=>{"use strict";Ys();zs=["serve","db","runs","jobs","attentions","env","intents"];Pk=["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 nm,appendFileSync as Gk,mkdirSync as Vk,existsSync as BH,readdirSync as qH,unlinkSync as HH}from"node:fs";import{join as Qs,dirname as Kk}from"node:path";import{homedir as Yk}from"node:os";function Ya(){return Qs(Yk(),".lmctl")}function sm(){Gr=!0,process.env.LMCTL_DEBUG="1"}function im(){return{cliDebug:Gr,lmctlDebugEnv:process.env.LMCTL_DEBUG}}function om(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-rm>=zk&&(tm=eI(),rm=e),tm}function am(){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{Qk();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};Gk(Zs,JSON.stringify(r)+`
16
+ `)}catch{}}function Qk(){if(!Zs){let t=Zk().slice(0,13).replace("T","-");Zs=Qs(Ya(),`debug-${t}.log`)}Vk(Kk(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 eI(){return tI()||rI()}function tI(){try{let e=nm(Qs(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 rI(){try{let e=nm(Qs(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,tm,rm,zk,Zs,he=T(()=>{"use strict";Gr=!1,tm=!1,rm=0,zk=5e3;Zs=null});import{existsSync as TI}from"node:fs";import{createRequire as bI}from"node:module";function SI(){return Za===null&&(Za=bI(import.meta.url)("node:sqlite").DatabaseSync),Za}function Qa(e){return e.length===1&&vI(e[0])?[e[0]]:e}function vI(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,fm,tl,mm=T(()=>{"use strict";Za=null;el=class{name;handle;transactionDepth=0;savepointId=0;constructor(t,r={}){if(r.fileMustExist===!0&&t!==":memory:"&&!TI(t))throw new Error("unable to open database file");this.name=t,this.handle=new(SI())(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)}}},fm=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 kI,mkdirSync as II,readFileSync as _m}from"node:fs";import{homedir as NI}from"node:os";import{dirname as hm,join as xI,resolve as gm}from"node:path";import{fileURLToPath as AI,pathToFileURL as RI}from"node:url";function nl(e){e.dbPath!==":memory:"&&II(hm(e.dbPath),{recursive:!0});let t=new fm(e.dbPath);t.pragma("journal_mode = WAL"),t.pragma("synchronous = NORMAL"),t.pragma("foreign_keys = ON");let r=Em(t);return r===0&&(t.exec(_m(wm,"utf8")),t.pragma(`user_version = ${OI}`)),$I(t,r),t}function $I(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,
@@ -954,8 +954,8 @@ var _k=Object.defineProperty;var T=(e,t)=>()=>(e&&(t=e(e=0)),t);var ye=(e,t)=>{f
954
954
  AND delivering_at IS NULL
955
955
  ORDER BY receiver_teamfile ASC, receiver_alias ASC, id ASC
956
956
  `),deleteMailboxMessage:e.prepare("DELETE FROM agent_mailbox WHERE id = ?")}}function Wn(e){if(Buffer.byteLength(e,"utf8")<=65536)return e;let r=Buffer.byteLength(Nm,"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")}${Nm}`}var Nm,Am=T(()=>{"use strict";Nm=`
957
- ...[truncated]`});function Hn(e,t){return JSON.stringify([e,t])}function Rm(e){try{let t=JSON.parse(e);return typeof t.lock_id!="string"||typeof t.teamfile!="string"||typeof t.alias!="string"||typeof t.holder_pid!="number"||typeof t.holder_host!="string"||!Array.isArray(t.holder_ips)||!t.holder_ips.every(r=>typeof r=="string")||typeof t.started_at!="string"||typeof t.last_heartbeat!="string"?null:{lock_id:t.lock_id,teamfile:t.teamfile,alias:t.alias,holder_pid:t.holder_pid,holder_host:t.holder_host,holder_ips:t.holder_ips,started_at:t.started_at,last_heartbeat:t.last_heartbeat}}catch{return null}}var Bn,qn,Lm=T(()=>{"use strict";Bn="terminal_lock",qn="member"});function rr(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 sl=T(()=>{"use strict"});function Vr(e){return typeof e=="string"&&MI.has(e)}function Cm(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: ${Om}: <one short sentence: why no declared outcome fits>`,"Never invent a different outcome; never leave the STANCE line out."].join(`
958
- `)}var Om,Qs,MI,Jn,$m,il,ei,Xn=T(()=>{"use strict";Om="other",Qs=["not_enough_information","dont_know","other_work"],MI=new Set([Om,...Qs]),Jn="@abort",$m="invalid_decision",il="escalation_aborted",ei="workflow_escalation"});import{randomUUID as Mm}from"node:crypto";import{hostname as Gn}from"node:os";function Ue(e){return e.provider_resolved??e.provider}function O(){return new Date().toISOString()}function Ie(e){return new ol(nl({dbPath:e.path}))}function jm(e,t,r){let n=Dm(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 Dm(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 Dm(e){let t=jI(e),r=t===null?null:DI(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 jI(e){try{let t=JSON.parse(e);return ti(t)?t:null}catch{return null}}function DI(e,t){let r=e[t];return ti(r)?r:null}function ti(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function PI(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 FI(e,t){return e===null?!0:e.holder_host===Gn()?!rr(e.holder_pid):e.last_heartbeat<t}function UI(e,t){return e.delivering_at===null?!1:e.delivery_holder_host===Gn()&&WI(e.delivery_holder_pid)?!rr(e.delivery_holder_pid):e.delivering_at<t}function WI(e){return Number.isInteger(e)&&(e??0)>0}function BI(e){return{...xm(e),getRuntimeState:e.prepare("SELECT * FROM runtime_state WHERE scope = ? AND key = ? AND kind = ?"),upsertRuntimeState:e.prepare(`
957
+ ...[truncated]`});function Hn(e,t){return JSON.stringify([e,t])}function Rm(e){try{let t=JSON.parse(e);return typeof t.lock_id!="string"||typeof t.teamfile!="string"||typeof t.alias!="string"||typeof t.holder_pid!="number"||typeof t.holder_host!="string"||!Array.isArray(t.holder_ips)||!t.holder_ips.every(r=>typeof r=="string")||typeof t.started_at!="string"||typeof t.last_heartbeat!="string"?null:{lock_id:t.lock_id,teamfile:t.teamfile,alias:t.alias,holder_pid:t.holder_pid,holder_host:t.holder_host,holder_ips:t.holder_ips,started_at:t.started_at,last_heartbeat:t.last_heartbeat}}catch{return null}}var Bn,qn,Lm=T(()=>{"use strict";Bn="terminal_lock",qn="member"});function rr(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 sl=T(()=>{"use strict"});function Vr(e){return typeof e=="string"&&MI.has(e)}function Cm(e){return["Decide the workflow outcome. Reply with a final line:",` STANCE: <one of: ${e.length>0?e.join(" | "):"(this step declares no outcomes \u2014 escalate)"}>`,"If you cannot pick one of those declared outcomes, escalate to a","human instead \u2014 reply with exactly one of:",` STANCE: ${ei[0]}`,` STANCE: ${ei[1]}`,` STANCE: ${ei[2]}`,` STANCE: ${Om}: <one short sentence: why no declared outcome fits>`,"Never invent a different outcome; never leave the STANCE line out."].join(`
958
+ `)}var Om,ei,MI,Jn,$m,il,ti,Xn=T(()=>{"use strict";Om="other",ei=["not_enough_information","dont_know","other_work"],MI=new Set([Om,...ei]),Jn="@abort",$m="invalid_decision",il="escalation_aborted",ti="workflow_escalation"});import{randomUUID as Mm}from"node:crypto";import{hostname as Gn}from"node:os";function Ue(e){return e.provider_resolved??e.provider}function O(){return new Date().toISOString()}function Ie(e){return new ol(nl({dbPath:e.path}))}function jm(e,t,r){let n=Dm(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 Dm(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 Dm(e){let t=jI(e),r=t===null?null:DI(t,"states");if(r===null)return[];let n=[];for(let s of Object.values(r))ri(s)&&s.type==="Subflow"&&typeof s.workflow_name=="string"&&s.workflow_name.length>0&&n.push(s.workflow_name);return n}function jI(e){try{let t=JSON.parse(e);return ri(t)?t:null}catch{return null}}function DI(e,t){let r=e[t];return ri(r)?r:null}function ri(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function PI(e){try{let t=JSON.parse(e);return!ri(t)||typeof t.lock_id!="string"||typeof t.holder_pid!="number"||typeof t.holder_host!="string"||typeof t.started_at!="string"||typeof t.last_heartbeat!="string"?null:{lock_id:t.lock_id,holder_pid:t.holder_pid,holder_host:t.holder_host,started_at:t.started_at,last_heartbeat:t.last_heartbeat}}catch{return null}}function FI(e,t){return e===null?!0:e.holder_host===Gn()?!rr(e.holder_pid):e.last_heartbeat<t}function UI(e,t){return e.delivering_at===null?!1:e.delivery_holder_host===Gn()&&WI(e.delivery_holder_pid)?!rr(e.delivery_holder_pid):e.delivering_at<t}function WI(e){return Number.isInteger(e)&&(e??0)>0}function BI(e){return{...xm(e),getRuntimeState:e.prepare("SELECT * FROM runtime_state WHERE scope = ? AND key = ? AND kind = ?"),upsertRuntimeState:e.prepare(`
959
959
  INSERT INTO runtime_state (scope, key, kind, data, updated_at)
960
960
  VALUES (?, ?, ?, ?, ?)
961
961
  ON CONFLICT(scope, key, kind) DO UPDATE SET
@@ -1355,9 +1355,9 @@ var _k=Object.defineProperty;var T=(e,t)=>()=>(e&&(t=e(e=0)),t);var ye=(e,t)=>{f
1355
1355
  error_detail = ?,
1356
1356
  truncated = ?
1357
1357
  WHERE id = ?
1358
- `),...km(e),...bm(e)}}function qI(e,t){return t===void 0?{resumed:!1,reason:e}:{resumed:!1,reason:e,valid:t}}var ol,Ze=T(()=>{"use strict";Tm();Sm();Im();Am();Lm();sl();Xn();ol=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;tryAcquireAgentInflightTxn;recvMailboxMessagesTxn;constructor(t){t.pragma("foreign_keys = ON"),this.db=t,this.stmts=BI(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)=>qI("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!==Jn&&!a.includes(n))return{resumed:!1,reason:$m};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){jm(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){jm(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=Mm(),s=O();return this.stmts.insertChatbotSession.run(n,t,r??null,s,s,"active"),this.stmts.getChatbotSession.get(n)}getChatbotSession(t){return this.stmts.getChatbotSession.get(t)??null}listChatbotSessions(t){return this.stmts.listChatbotSessionsForUser.all(t)}appendChatbotMessage(t,r,n,s){let i=O(),o=this.stmts.insertChatbotMessage.run(t,r,n,s??null,i);return this.stmts.touchChatbotSession.run(i,t),this.stmts.getChatbotMessage.get(o.lastInsertRowid)}listChatbotMessages(t){return this.stmts.listChatbotMessages.all(t)}getConfig(t){return this.stmts.getConfig.get(t)?.value??null}setConfig(t,r){this.stmts.upsertConfig.run(t,r,O())}getConfigAll(){let t=this.stmts.listConfig.all(),r={};for(let n of t)r[n.key]=n.value;return r}enqueueJob(t){let r=this.stmts.insertJob.run(t.project_id,t.workflow_id_override??null,t.source,t.source_ref??null,t.payload??null,t.priority??0,t.available_at??O(),t.dedupe_key??null,t.concurrency_key??null,O());if(r.changes===1)return this.stmts.getJob.get(r.lastInsertRowid);if(t.dedupe_key===void 0||t.dedupe_key===null)throw new Error("job insert ignored without dedupe key");return this.stmts.findJobByDedupe.get(t.source,t.dedupe_key)}claimNextJob(t){let r=O(),n=new Date(Date.now()+t.lease_ms).toISOString();return this.claimTxn(t.worker_id,n,r)}claimNextJobWithConcurrency(t){let r=O(),n=new Date(Date.now()+t.lease_ms).toISOString();return this.claimWithConcurrencyTxn(t.worker_id,n,r,t.evaluator)}claimJobByIdWithConcurrency(t){let r=O(),n=new Date(Date.now()+t.lease_ms).toISOString();return this.claimByIdWithConcurrencyTxn(t.job_id,t.worker_id,n,r,t.evaluator)}releaseJob(t,r,n){let s=r==="queued"||r==="running"?null:O();return this.stmts.releaseJob.run(r,n??null,s,t),this.getJob(t)}getJob(t){return this.stmts.getJob.get(t)??null}findJobBySourceAndDedupe(t,r){return this.stmts.findJobByDedupe.get(t,r)??null}insertRun(t){let r=this.getWorkflow(t.workflow_id);if(r===null)throw new Error(`workflow not found: ${t.workflow_id}`);let n=this.stmts.insertRun.run(t.job_id,t.workflow_id,t.team_id,t.current_state??null,r.active_version_id,t.parent_run_id??null,O()),s=this.stmts.getRun.get(n.lastInsertRowid);return(t.parent_run_id===void 0||t.parent_run_id===null)&&this.stmts.setJobRun.run(s.id,t.job_id),s}setJobRun(t,r){return this.stmts.setJobRun.run(r,t),this.getJob(t)}insertPromptDispatch(t){return this.stmts.insertPromptDispatch.run(t.prompt_id,t.project_id,t.job_id,t.text,t.context_json??null,O()),this.stmts.getPromptDispatch.get(t.prompt_id)}getPromptDispatch(t){return this.stmts.getPromptDispatch.get(t)??null}setPromptDispatchCompleted(t,r){return this.stmts.setPromptDispatchCompleted.run(r??O(),t),this.getPromptDispatch(t)}getWorkspace(t){return this.stmts.getWorkspace.get(t)??null}ensureWorkspace(t={}){let r=t.id??"default";this.stmts.ensureWorkspace.run(r,t.name??"Default workspace",t.idleThresholdMs??6e5,O());let n=this.getWorkspace(r);if(n===null)throw new Error(`workspace ${r} missing after upsert`);return n}listWebProjectsActive(t){return this.stmts.listWebProjectsActive.all(t)}getWebProject(t){return this.stmts.getWebProject.get(t)??null}insertWebProject(t){let r=O(),n=this.stmts.insertWebProject.run(t.workspace_id,t.name,t.repo_path,t.config_json??null,t.linked_v4_project_id??null,r,r),s=Number(n.lastInsertRowid),i=this.getWebProject(s);if(i===null)throw new Error(`web_project ${s} missing after insert`);return i}updateWebProject(t){let r=this.getWebProject(t.id);return r===null||r.deleted_at!==null?null:(this.stmts.updateWebProject.run(t.name??r.name,t.config_json===void 0?r.config_json:t.config_json,O(),t.id),this.getWebProject(t.id))}softDeleteWebProject(t){return this.stmts.softDeleteWebProject.run(O(),t).changes===1}loadMailboxCursor(t,r){return this.stmts.loadMailboxCursor.get(t,r)??null}saveMailboxCursor(t){this.stmts.saveMailboxCursor.run(t.user_id,t.mailbox_key,t.last_processed_version_id,t.last_processed_seq??null,t.last_processed_at)}addUsage(t){this.stmts.addUsage.run(t.user_id,t.device_id,t.period,t.put,t.get,t.list,t.updated_at)}loadUsage(t,r,n){return this.stmts.loadUsage.get(t,r,n)??null}sumUsageForPeriod(t,r){let n=this.stmts.sumUsageForPeriod.get(t,r);return{put:n?.put??0,get:n?.get??0,list:n?.list??0}}upsertRootTeam(t){this.stmts.upsertRootTeam.run(t.teamfile_path,t.name,t.raw_text,t.raw_sha256,t.registered_at,t.last_seeded_at)}getRootTeam(t){return this.stmts.getRootTeam.get(t)??null}listRootTeams(){return this.stmts.listRootTeams.all()}insertTeamChatLog(t){let r=this.stmts.insertTeamChatLog.run(t.root_teamfile,t.sender_teamfile,t.sender_alias,t.receiver_teamfile,t.receiver_alias,t.message,t.response,t.origin,t.status,t.error_detail,t.truncated,t.created_at);return Number(r.lastInsertRowid)}listTeamChatLog(t){return this.stmts.listTeamChatLog.all(t)}listTeamChatLogSinceId(t,r=500){return this.stmts.listTeamChatLogSinceId.all(t,Math.max(1,Math.trunc(r)))}getMaxTeamChatLogId(){return this.stmts.getMaxTeamChatLogId.get()?.max_id??0}loadTeamChatLogCursor(t){return this.stmts.loadTeamChatLogCursor.get(t)??null}saveTeamChatLogCursor(t){this.stmts.saveTeamChatLogCursor.run(t.cursor_key,t.last_pushed_id,t.updated_at)}startTrackedInvocation(t){let r=t.started_at??O(),n=t.holder_host??Gn(),s=t.last_heartbeat_at??r,i=this.stmts.insertTrackedInvocation.run(t.kind,t.origin,t.scope_teamfile??null,t.from_identity,t.target_teamfile??null,t.target_alias??null,t.root_teamfile??null,t.cwd??null,Pt(t.command),r,t.holder_pid??null,n,s,Pt(t.meta),t.launch_source??t.kind,t.request_payload??null);return this.getTrackedInvocation(Number(i.lastInsertRowid))}getTrackedInvocation(t){return this.stmts.getTrackedInvocation.get(t)??null}listAllRunningTrackedInvocations(){return this.stmts.listAllRunningTrackedInvocations.all()}finishTrackedInvocation(t,r){let n=r.ended_at??O();return this.stmts.finishTrackedInvocation.run(r.status,n,r.exit_code??null,r.signal??null,Pt(r.result_summary),Pt(r.error),r.team_chat_log_id??null,Pt(r.meta),n,t).changes!==1?null:this.getTrackedInvocation(t)}reclaimTrackedInvocationIfUnchanged(t,r,n){let s=n.ended_at??O();return this.stmts.reclaimTrackedInvocationIfUnchanged.run(n.status,s,n.exit_code??null,n.signal??null,Pt(n.result_summary),Pt(n.error),n.team_chat_log_id??null,Pt(n.meta),s,t,r.holder_pid,r.holder_host,r.started_at,r.last_heartbeat_at).changes!==1?null:this.getTrackedInvocation(t)}heartbeatTrackedInvocation(t,r=O()){return this.stmts.heartbeatTrackedInvocation.run(r,t).changes!==1?null:this.getTrackedInvocation(t)}updateTrackedInvocationRequestPayload(t,r){return this.stmts.updateTrackedInvocationRequestPayload.run(r,t).changes!==1?null:this.getTrackedInvocation(t)}listClaimableTerminalTrackedInvocations(t){let r=["status IN ('done', 'error', 'busy', 'cancelled')","ended_at IS NOT NULL","notified_by IS NULL"],n=[];t.from!==void 0&&(r.push("from_identity = ?"),n.push(t.from)),t.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(t.scope_teamfile));let s=Math.max(1,Math.min(1e3,Math.trunc(t.limit??100)));return n.push(s),this.db.prepare(`SELECT * FROM tracked_invocation WHERE ${r.join(" AND ")} ORDER BY ended_at ASC, id ASC LIMIT ?`).all(...n)}claimTrackedInvocationNotification(t,r,n=O()){return this.stmts.claimTrackedInvocationNotification.run(r,n,t).changes!==1?null:this.getTrackedInvocation(t)}listTrackedInvocations(t={}){let r=[],n=[];t.from!==void 0&&(r.push("from_identity = ?"),n.push(t.from)),t.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(t.scope_teamfile)),t.status!==void 0&&(r.push("status = ?"),n.push(t.status)),t.kind!==void 0&&(r.push("kind = ?"),n.push(t.kind)),t.origin!==void 0&&(r.push("origin = ?"),n.push(t.origin));let s=Math.max(1,Math.min(1e3,Math.trunc(t.limit??100)));n.push(s);let i=r.length===0?"":` WHERE ${r.join(" AND ")}`;return this.db.prepare(`SELECT * FROM tracked_invocation${i} ORDER BY started_at DESC, id DESC LIMIT ?`).all(...n)}maxTrackedInvocationId(t={}){let r=[],n=[];t.from!==void 0&&(r.push("from_identity = ?"),n.push(t.from)),t.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(t.scope_teamfile));let s=r.length===0?"":` WHERE ${r.join(" AND ")}`,i=this.db.prepare(`SELECT COALESCE(MAX(id), 0) AS max_id FROM tracked_invocation${s}`).get(...n);return Number(i?.max_id??0)}listRunningTrackedInvocations(t={}){return this.listTrackedInvocations({...t,status:"running"})}enqueueMail(t){return this.sendMailboxMessage(t)}sendMailboxMessage(t){let r=this.stmts.insertMailboxMessage.run(t.receiver_teamfile,t.receiver_alias,t.sender_teamfile??null,t.sender_alias??null,t.root_teamfile??null,Wn(t.payload),t.created_at??O(),t.remote_transport??null,t.remote_message_id??null,t.remote_thread_id??null,t.meta??null,t.message_type??"request",t.reply_mode??"pull",t.request_mailbox_id??null);return this.getMailboxMessage(Number(r.lastInsertRowid))}listEnqueuedRequestMailFromSender(t,r,n,s){return this.stmts.listEnqueuedRequestMailFromSender.all(t,r,n,s)}listEnqueuedResponseMailFromSender(t,r,n,s){return this.stmts.listEnqueuedResponseMailFromSender.all(t,r,n,s)}listRelayMailboxLanes(t){return this.stmts.listRelayMailboxLanes.all(Math.max(1,Math.trunc(t)))}markMailDelivered(t,r,n){let s=[...new Set(t.map(o=>Math.trunc(o)).filter(o=>Number.isInteger(o)&&o>0))];if(s.length===0)return 0;let i=Wn(r);this.db.exec("BEGIN IMMEDIATE");try{let o=0;for(let a of s)o+=this.stmts.markMailboxMessageDelivered.run(n,i,a).changes;return this.db.exec("COMMIT"),o}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}markRelayRequestDelivered(t,r,n){let s=Wn(r);this.db.exec("BEGIN IMMEDIATE");try{let i=0;for(let o of t)this.stmts.markMailboxMessageDeliveredIfUnchanged.run(n,s,o.id,o.delivering_at,o.delivery_holder_pid,o.delivery_holder_host).changes===1&&(i+=1);return this.db.exec("COMMIT"),i}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}markRelayRequestDeliveredAndEnqueueResponses(t,r,n){let s=Wn(r);this.db.exec("BEGIN IMMEDIATE");try{let i=0,o=0;for(let a of t){if(this.stmts.markMailboxMessageDeliveredIfUnchanged.run(n,s,a.id,a.delivering_at,a.delivery_holder_pid,a.delivery_holder_host).changes!==1||(i+=1,a.sender_teamfile===null||a.sender_alias===null))continue;let c=this.stmts.insertMailboxResponseIfAbsent.run(a.sender_teamfile,a.sender_alias,a.receiver_teamfile,a.receiver_alias,a.root_teamfile,s,n,null,null,null,null,a.reply_mode,a.id);o+=c.changes}return this.db.exec("COMMIT"),{marked:i,responses:o}}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}claimMailForDelivery(t,r,n=process.pid,s=Gn()){let i=[...new Set(t.map(o=>Math.trunc(o)).filter(o=>Number.isInteger(o)&&o>0))];if(i.length===0)return[];this.db.exec("BEGIN IMMEDIATE");try{let o=[];for(let a of i)if(this.stmts.claimMailboxMessageDelivery.run(r,n,s,a).changes===1){let c=this.getMailboxMessage(a);c!==null&&o.push(c)}return this.db.exec("COMMIT"),o}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}clearMailDelivery(t){let r=[...new Set(t.map(n=>Math.trunc(n)).filter(n=>Number.isInteger(n)&&n>0))];if(r.length===0)return 0;this.db.exec("BEGIN IMMEDIATE");try{let n=0;for(let s of r)n+=this.stmts.clearMailboxMessageDelivery.run(s).changes;return this.db.exec("COMMIT"),n}catch(n){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),n}}reclaimMailboxDeliveryIfUnchanged(t){return this.stmts.clearMailboxMessageDeliveryIfUnchanged.run(t.id,t.delivering_at,t.delivery_holder_pid,t.delivery_holder_host).changes!==1?null:this.getMailboxMessage(t.id)}reclaimStaleMailboxDeliveries(t){let r=this.stmts.listInFlightMailboxDeliveries.all(),n=[];this.db.exec("BEGIN IMMEDIATE");try{for(let s of r){if(!UI(s,t))continue;let i=this.reclaimMailboxDeliveryIfUnchanged(s);i!==null&&n.push(i)}return this.db.exec("COMMIT"),n}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}listDeliveredReceiptsForSender(t,r){return this.stmts.listDeliveredReceiptsForSender.all(t,r)}listOutboundPendingForSender(t,r){return this.stmts.listOutboundPendingForSender.all(t,r)}getMailboxMessage(t){return this.stmts.getMailboxMessage.get(t)??null}peekMailboxMessages(t,r=1e3){return this.stmts.listMailboxMessagesForReceiver.all(t.receiver_teamfile,t.receiver_alias,Math.max(1,Math.min(1e3,Math.trunc(r))))}recvMailboxMessages(t){return this.recvMailboxMessagesTxn(t.receiver_teamfile,t.receiver_alias)}updateTeamChatLogResponse(t,r){this.stmts.updateTeamChatLogResponse.run(r.response,r.status,r.error_detail,r.truncated,t)}getAgentInflight(t,r){return this.stmts.getAgentInflight.get(t,r)??null}listAgentInflight(){return this.stmts.listAgentInflight.all()}tryAcquireAgentInflight(t,r){return this.tryAcquireAgentInflightTxn(t,r)}clearAgentInflight(t,r){this.stmts.clearAgentInflight.run(t,r)}clearObservedTerminalAgentInflight(t,r,n){return this.stmts.clearObservedTerminalAgentInflight.run({receiver_teamfile:t,receiver_alias:r,observed_sender_teamfile:n.sender_teamfile,observed_sender_alias:n.sender_alias,observed_started_at:n.started_at,observed_holder_pid:n.holder_pid}).changes===1}releaseAgentInflight(t){this.db.exec("BEGIN IMMEDIATE");try{let r=this.getAgentInflight(t.receiver_teamfile,t.receiver_alias);if(r===null||r.sender_teamfile!==t.sender_teamfile||r.sender_alias!==t.sender_alias)return this.db.exec("COMMIT"),!1;if(r.active_count<=1)return this.stmts.clearAgentInflightIfSender.run(t.receiver_teamfile,t.receiver_alias,t.sender_teamfile,t.sender_alias),this.db.exec("COMMIT"),!0;let n=this.stmts.decrementAgentInflight.run(t.receiver_teamfile,t.receiver_alias,t.sender_teamfile,t.sender_alias);return this.db.exec("COMMIT"),n.changes===1}catch(r){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),r}}clearAgentInflightOlderThan(t){return this.stmts.clearAgentInflightOlderThan.run(t).changes}getTerminalLock(t,r){let n=this.stmts.getRuntimeState.get(Bn,Hn(t,r),qn);return n===void 0?null:Rm(n.data)}setTerminalLock(t){this.stmts.upsertRuntimeState.run(Bn,Hn(t.teamfile,t.alias),qn,JSON.stringify(t),t.last_heartbeat)}heartbeatTerminalLock(t,r,n,s){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getTerminalLock(t,r);if(i===null||i.lock_id!==n)return this.db.exec("COMMIT"),!1;let o={...i,last_heartbeat:s};return this.stmts.upsertRuntimeState.run(Bn,Hn(t,r),qn,JSON.stringify(o),s),this.db.exec("COMMIT"),!0}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}clearTerminalLock(t,r,n){this.db.exec("BEGIN IMMEDIATE");try{let s=this.getTerminalLock(t,r);if(s===null||s.lock_id!==n)return this.db.exec("COMMIT"),!1;let i=this.stmts.deleteRuntimeState.run(Bn,Hn(t,r),qn);return this.db.exec("COMMIT"),i.changes===1}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}getRuntimeProcessLock(t,r,n){let s=this.stmts.getRuntimeState.get(t,r,n);return s===void 0?null:PI(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&&!FI(o,s))return this.db.exec("COMMIT"),{acquired:!1,current:o};let a={lock_id:Mm(),holder_pid:process.pid,holder_host:Gn(),started_at:i,last_heartbeat:i};return this.stmts.upsertRuntimeState.run(t,r,n,JSON.stringify(a),i),this.db.exec("COMMIT"),{acquired:!0,lock:a,previous:o}}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}clearRuntimeProcessLock(t,r,n,s){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getRuntimeProcessLock(t,r,n);if(i===null||i.lock_id!==s)return this.db.exec("COMMIT"),!1;let o=this.stmts.deleteRuntimeState.run(t,r,n);return this.db.exec("COMMIT"),o.changes===1}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}getRun(t){return this.stmts.getRun.get(t)??null}setRunCurrentState(t,r){return this.stmts.setRunCurrentState.run(r,t),this.stmts.getRun.get(t)??null}setRunPausedState(t,r,n){return this.stmts.setRunPausedState.run(r,n,t),this.stmts.getRun.get(t)??null}setRunPendingEscalationDecision(t,r){return this.stmts.setRunPendingEscalationDecision.run(r,t),this.stmts.getRun.get(t)??null}setRunTerminalState(t,r){return this.stmts.setRunTerminalState.run(r,O(),t),this.stmts.getRun.get(t)??null}pauseJob(t){return this.stmts.pauseJob.run(t),this.getJob(t)}resumeRun(t,r){return this.resumeRunTxn(t,r,O())}insertStep(t){let r=this.stmts.insertStep.run(t.run_id,t.parent_step_id??null,t.state_name,t.outcome??null,t.status_detail??null,O());return this.stmts.getStep.get(r.lastInsertRowid)}finishStep(t,r,n){return this.stmts.finishStep.run(r??null,n??null,O(),t),this.stmts.getStep.get(t)??null}listStepsForRun(t){return this.stmts.listStepsForRun.all(t)}listLatestStepOutcomesByState(t){let r=this.stmts.listLatestStepOutcomesByState.all(t),n={};for(let s of r)n[s.state_name]=s.outcome;return n}insertSubmittedPr(t){let r=this.stmts.insertSubmittedPr.run(t.repo,t.pr_url,t.issue_url??null,t.local_path??null,t.branch??null,t.head_sha??null,t.status??"watching",t.submitted_at??O(),t.last_known_state??null,t.created_by_run_id??null);return this.stmts.getSubmittedPr.get(r.lastInsertRowid)}listSubmittedPrs(t){return t?.status!==void 0?this.stmts.listSubmittedPrsByStatus.all(t.status):this.stmts.listSubmittedPrs.all()}getSubmittedPr(t){return this.stmts.getSubmittedPr.get(t)??null}findSubmittedPrByUrl(t){return this.stmts.findSubmittedPrByUrl.get(t)??null}insertStepArtifact(t){let r=this.stmts.insertStepArtifact.run(t.step_id,t.kind,t.path??null,t.content??null,t.sha??null,t.provider_call_mode??null,O());return this.stmts.getStepArtifact.get(r.lastInsertRowid)}insertExternalObject(t){let n=this.stmts.insertExternalObject.run(t.type,t.provider,t.project_id,t.run_id??null,t.external_id,t.url??null,t.status??null,t.metadata??null,t.last_seen_at??null,O()).changes===1;return{row:this.stmts.findExternalObjectByUnique.get(t.provider,t.type,t.external_id),inserted:n}}insertExternalSignal(t){let r=this.stmts.insertExternalSignal.run(t.object_id,t.kind,t.source??null,t.occurred_at??null,t.payload??null,t.signal_hash??null,null,O()),n=r.changes===1;return{row:t.signal_hash===void 0||t.signal_hash===null?this.stmts.getExternalSignal.get(r.lastInsertRowid):this.stmts.findExternalSignalByUnique.get(t.object_id,t.kind,t.signal_hash),inserted:n}}raiseAttention(t){let r=this.stmts.insertAttention.run(t.kind,t.severity??"warn",t.project_id??null,t.run_id??null,t.external_object_id??null,t.requires_user===!0?1:0,t.payload??null,O());return this.stmts.getAttention.get(r.lastInsertRowid)}acknowledgeAttention(t){return this.stmts.ackAttention.run(O(),t),this.stmts.getAttention.get(t)??null}upsertDurableMemory(t){let r=O();return this.stmts.upsertDurableMemory.run(t.project_id,t.type,t.name,t.description??null,t.body,r,r),this.stmts.getDurableMemoryByName.get(t.project_id,t.name)}getDurableMemoryByName(t,r){return this.stmts.getDurableMemoryByName.get(t,r)??null}deleteDurableMemory(t,r){return this.stmts.deleteDurableMemory.run(t,r).changes>0}listDurableMemory(t,r){return r!==void 0?this.stmts.listDurableMemoryByType.all(t,r):this.stmts.listDurableMemory.all(t)}indexDurableMemory(t,r){return r!==void 0&&r.length>0?this.stmts.listDurableMemory.all(t).filter(s=>r.includes(s.type)).map(({name:s,description:i,type:o,updated_at:a})=>({name:s,description:i,type:o,updated_at:a})):this.stmts.listDurableMemory.all(t).map(({name:n,description:s,type:i,updated_at:o})=>({name:n,description:s,type:i,updated_at:o}))}recordSessionSize(t){let r=this.stmts.insertSessionSize.run(t.team_name,t.alias,t.sessionid,t.input_tokens??null,t.cache_tokens??null,t.output_tokens??null,t.total_tokens??null,t.observed_at??O());return this.stmts.getSessionSize.get(r.lastInsertRowid)}latestSessionSizes(){return this.stmts.latestSessionSizes.all()}sessionSizeHistory(t,r,n=20){return this.stmts.sessionSizeHistory.all(t,r,n)}insertSessionEvent(t){let r=this.stmts.insertSessionEvent.run(t.run_id,t.step_id??null,t.kind,t.timestamp_ms,t.payload,t.payload_truncated??0,t.overflow_artifact_id??null);return this.stmts.getSessionEvent.get(r.lastInsertRowid)}listSessionEvents(t,r){return r!==void 0?this.stmts.listSessionEventsSince.all(t,r):this.stmts.listSessionEvents.all(t)}listSessionEventsSince(t,r=1e3){return this.stmts.listAllEventsSince.all(t,r)}latestAgentCall(t){let r=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call' ORDER BY id DESC LIMIT 1").get(t);if(r===void 0)return null;try{let n=JSON.parse(r.payload);return typeof n.alias!="string"||typeof n.provider!="string"?null:{alias:n.alias,provider:n.provider,...typeof n.model=="string"?{model:n.model}:{}}}catch{return null}}agentCallTokenTotals(t){let r=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call'").all(t),n=0,s=0,i=0;for(let o of r)try{let a=JSON.parse(o.payload);typeof a.tokens_in=="number"&&(n+=a.tokens_in),typeof a.tokens_out=="number"&&(s+=a.tokens_out),i+=1}catch{}return{totalInputTokens:n,totalOutputTokens:s,agentCallCount:i}}addRollupValue(t){this.stmts.upsertRollupStat.run(t.run_id,t.step_id??null,t.metric_kind,t.value,t.bucket_start_ms,t.bucket_end_ms,t.updated_at)}listRollupStats(t){return this.stmts.listRollupStats.all(t)}getRollupCursor(){return this.stmts.getRollupCursor.get("last_event_id")?.value??0}setRollupCursor(t){this.stmts.setRollupCursor.run("last_event_id",t)}insertDriftSignal(t){let r=this.stmts.insertDriftSignal.run(t.team_member_id,t.project_id??null,t.signal_kind,t.severity,t.description,t.detected_at,t.expires_at??null,t.payload??null);return this.stmts.getDriftSignal.get(r.lastInsertRowid)}listDriftSignals(t={}){return t.team_member_id!==void 0&&t.unacked?this.stmts.listUnackedDriftByMember.all(t.team_member_id):t.team_member_id!==void 0?this.stmts.listDriftByMember.all(t.team_member_id):t.project_id!==void 0?this.stmts.listDriftByProject.all(t.project_id):this.stmts.listAllDrift.all()}hasUnackedDriftSignal(t,r,n){return this.stmts.findUnackedDrift.get(t,r??null,n)!==void 0}acknowledgeDriftSignal(t){return this.stmts.ackDriftSignal.run(Date.now(),t),this.stmts.getDriftSignal.get(t)??null}insertInteractiveSession(t){let r=Date.now();return this.stmts.insertInteractiveSession.run(t.run_id,t.step_id,t.state_name,t.status,r,r),this.stmts.getInteractiveSessionByStepId.get(t.step_id)}getInteractiveSessionByStepId(t){return this.stmts.getInteractiveSessionByStepId.get(t)??null}getInteractiveSessionByRunAndState(t,r){return this.stmts.getInteractiveSessionByRunAndState.get(t,r)??null}setInteractiveAgentOutput(t,r,n){this.stmts.setInteractiveAgentOutput.run(r,n,Date.now(),t)}resumeInteractive(t,r,n){return this.resumeInteractiveTxn(t,r,n,O())}resumeEscalation(t,r){return this.resumeEscalationTxn(t,r,O())}}});import{realpathSync as HI}from"node:fs";import{resolve as JI}from"node:path";function al(e){let t=JI(e);try{return HI(t)}catch{return t}}var Pm=T(()=>{"use strict"});import{platform as Fm}from"node:os";function Et(e){let t=new Vn;for(let r of e)t.registerAdapter(r);return t}var Vn,ll=T(()=>{"use strict";Pm();Vn=class{providers=[];adapters=new Map;register(t){this.providers.push(t)}async listAll(t){let r=[],n=t?.provider?this.providers.filter(o=>o.name===t.provider):this.providers,s=await Promise.all(n.map(o=>o.discoverSessions()));for(let o of s)r.push(...o);let i=r;if(t?.workspace){let o=al(t.workspace);i=i.filter(a=>al(a.cwd)===o)}if(t?.from){let o=t.from.getTime();i=i.filter(a=>a.modifiedAt.getTime()>=o)}if(t?.to){let o=t.to.getTime();i=i.filter(a=>a.modifiedAt.getTime()<=o)}return i.sort((o,a)=>a.modifiedAt.getTime()-o.modifiedAt.getTime()),t?.limit&&(i=i.slice(0,t.limit)),i}async getSession(t,r){let n=r?this.providers.filter(s=>s.name===r):this.providers;for(let s of n){let i=await s.loadSession(t);if(i)return i}return null}async resolveSession(t,r){let n=await this.resolveSessions(t,r);return n.length===1?n[0]:null}async resolveSessions(t,r){let n=r?this.providers.filter(i=>i.name===r):this.providers,s=[];for(let i of n){let o=await i.resolveSessionPath(t);o&&s.push({provider:i,filePath:o})}return s}getWatchTargets(){let t=Fm()==="darwin"||Fm()==="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 Um}from"node:fs";import{createInterface as Wm}from"node:readline";import{stat as XI}from"node:fs/promises";import{homedir as GI}from"node:os";async function*We(e){let t=Um(e,{encoding:"utf-8"}),r=Wm({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=Um(e,{encoding:"utf-8"}),s=Wm({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 XI(e);return{createdAt:t.birthtime,modifiedAt:t.mtime}}function fe(e){return e.replace(/\\n/g,`
1359
- `).replace(/\\t/g," ").replace(/\\r/g,"\r")}function H(e,t){return e.length<=t?e:e.slice(0,t-3)+"..."}var be,nr=T(()=>{"use strict";be=GI()});import{readdir as ri,stat as Bm,unlink as VI}from"node:fs/promises";import{join as Kr,basename as qm}from"node:path";function KI(e){return e==="file-history-snapshot"||e==="progress"||e==="system"||e==="queue-operation"}function YI(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 Hm(e){let t=0,r=0,n=0,s=0,i=0,o=0,a;for await(let l of We(e))if(!l.isSidechain){if(l.type==="user"&&!l.isMeta&&l.message){let c=l.message.content;if(typeof c=="string"){if(c.includes("<command-name>")||c.includes("<local-command-"))continue;t++}}else if(l.type==="assistant"&&l.message){let c=l.message.content;if(Array.isArray(c))for(let u of c)u.type==="text"&&t++;let d=l.message.usage;if(d){let u=d.input_tokens||0,f=d.cache_creation_input_tokens||0,m=d.cache_read_input_tokens||0,p=d.output_tokens||0;r+=u+f+m,n+=m,s+=f,i+=p;let _=u+f+m;_&&(o=_),a={inputTokens:u,cacheWriteInputTokens:f,cachedInputTokens:m,outputTokens:p}}}}return{messageCount:t,totalInputTokens:r,totalCacheReadInputTokens:n,totalCacheWriteInputTokens:s,totalOutputTokens:i,lastInputTokens:o,lastTokenUsage:a}}var ni,Jm=T(()=>{"use strict";nr();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 Bm(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=qm(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(!KI(m.type)&&(!i&&m.cwd&&(i=m.cwd),!o&&m.slug&&(o=m.slug),!a&&m.version&&(a=m.version),!u&&m.timestamp&&(u=new Date(m.timestamp)),m.type==="assistant"&&m.message?.model&&(l=m.message.model),m.type==="user"&&!m.isMeta&&m.message)){let p=m.message.content;if(typeof p=="string"){if(p.includes("<command-name>")||p.includes("<local-command-"))continue;c||(c=H(p.trim(),80)),d=H(p.trim(),80)}}if(!i)return null;let f=await Hm(t);return{provider:"claude",sessionId:r,slug:o,cwd:i,createdAt:u||s.createdAt,modifiedAt:s.modifiedAt,model:l,cliVersion:a,startCommand:"claude",firstUserMessage:c,lastUserMessage:d,messageCount:f.messageCount,filePath:t,totalInputTokens:f.totalInputTokens||void 0,totalCachedInputTokens:f.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:f.totalCacheWriteInputTokens||void 0,totalOutputTokens:f.totalOutputTokens||void 0,lastInputTokens:f.lastInputTokens||void 0,lastTokenUsage:f.lastTokenUsage}}async loadSession(t){let r=await this.resolveSessionFile(t);if(!r)return null;let n=await Ne(r),s=[],i="",o,a,l,c,d,u,f,m=t;for await(let _ of We(r))if(_.type!=="file-history-snapshot"&&!_.isSidechain){if(!i&&_.cwd&&(i=_.cwd),!o&&_.slug&&(o=_.slug),!a&&_.version&&(a=_.version),!c&&_.gitBranch&&(c=_.gitBranch),!f&&_.timestamp&&(f=new Date(_.timestamp)),_.sessionId&&(m=_.sessionId),_.type==="system"||_.type==="progress"||_.type==="queue-operation"){s.push({role:"system",timestamp:new Date(_.timestamp||0),content:YI(_)});continue}if(_.type==="user"&&_.message){if(_.isMeta)continue;let g=new Date(_.timestamp||0),h=_.message.content;if(typeof h=="string"){if(h.includes("<command-name>")||h.includes("<local-command-"))continue;d||(d=H(h.trim(),80)),u=H(h.trim(),80),s.push({role:"user",timestamp:g,content:fe(h.trim())})}else if(Array.isArray(h)){for(let S of h)if(S.type==="tool_result"){let y=typeof S.content=="string"?fe(S.content):JSON.stringify(S.content);s.push({role:"tool_result",timestamp:g,content:y,toolCallId:S.tool_use_id})}}}if(_.type==="assistant"&&_.message){_.message.model&&(l=_.message.model);let g=new Date(_.timestamp||0),h=_.message.content;if(Array.isArray(h))for(let S of h)S.type==="text"&&S.text?s.push({role:"assistant",timestamp:g,content:fe(S.text),model:_.message.model}):S.type==="tool_use"?s.push({role:"tool_use",timestamp:g,content:S.name||"unknown tool",toolName:S.name,toolInput:JSON.stringify(S.input,null,2),toolCallId:S.id,model:_.message.model}):S.type==="thinking"&&S.thinking&&s.push({role:"thinking",timestamp:g,content:S.thinking})}}if(!i)return null;let p=await Hm(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 VI(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 Bm(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=qm(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]??cl[t],s=n?.profiles?.[r]?.flags??cl[t]?.profiles?.[r]?.flags;if(s!==void 0)return s.trim();if(n?.profile_flag)return n.profile_flag.replace(/\{\{profile\}\}/g,r).trim();throw new Error(`Profile "${r}" is not configured for tool "${t}"`)}function Xm(e,t){return!!e.tools[t]}function Gm(e,t,r,n,s){let i=e.tools[t]??cl[t],o;if(i?.agent){let l=si(n);o=i.agent.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,l)}else{let l=zI[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 cl,zI,Vm=T(()=>{"use strict";cl={claude:{start:"claude",resume:"claude --resume {{session_id}} --dangerously-skip-permissions",profiles:{default:{description:"Default profile",flags:""}}},codex:{start:"codex",resume:"codex resume {{session_id}} --dangerously-bypass-approvals-and-sandbox",profiles:{default:{description:"Default profile",flags:""}}},opencode:{start:"opencode",resume:"opencode --session {{session_id}}",profiles:{default:{description:"Default profile",flags:""}}},gemini:{start:"gemini",resume:"gemini --resume {{session_id}} -y",profiles:{default:{description:"Default profile",flags:""}}},copilot:{start:"copilot",resume:"copilot --resume={{session_id}} --yolo",profiles:{default:{description:"Default profile",flags:""}}},qwen:{start:"qwen",resume:"qwen --resume {{session_id}} --approval-mode yolo",profiles:{default:{description:"Default profile",flags:""}}},agy:{start:"agy",resume:"agy --conversation {{session_id}} --dangerously-skip-permissions",profiles:{default:{description:"Default profile",flags:""}}}},zI={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 Km(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 Ym=T(()=>{"use strict"});var QI,he,ii,Tt=T(()=>{"use strict";QI="ACK: waiting for explicit lmctl task.",he=`lmctl seed initial connection only. Create or pin this provider session, then stop. Do not inspect files, run commands, infer a task, delegate, edit, or begin work. Reply exactly: ${QI}`,ii=`send this exact lmctl seed instruction: "${he}"`});function Ft(e,t){let r={...e??process.env,PWD:t};return delete r.OLDPWD,r}function tN(e,t){return t===void 0||t.length===0?e:{...e??process.env,[Kn]:t}}function Be(e,t,r,n="chat"){return{...tN(Ft(e,t),r),[eN]:n}}var Kn,eN,it=T(()=>{"use strict";Kn="LMCTL_SELF_SESSIONID",eN="LMCTL_LAUNCH_SOURCE"});import{spawn as zm}from"node:child_process";import{mkdirSync as rN}from"node:fs";var dl,xe,Ut=T(()=>{"use strict";Vm();Ym();Tt();it();dl=class e extends Error{cancelReason;constructor(t,r){super(t),this.name="TurnAbortError",this.cancelReason=r,Object.setPrototypeOf(this,e.prototype)}},xe=class e{name;capabilities;injection;provider;binary;seedArgs;seedStdin;resumeTemplate;startTemplate;transportFn;constructor(t){this.name=t.provider.name,this.provider=t.provider,this.capabilities=t.capabilities,this.injection=t.injection,this.binary=t.binary,this.seedArgs=t.seedArgs,this.seedStdin=t.seedStdin,this.resumeTemplate=t.resumeTemplate,this.startTemplate=t.startTemplate,this.transportFn=t.transport}discover(){return this.provider.discoverSessions()}load(t){return this.provider.loadSession(t)}resolvePath(t){return this.provider.resolveSessionPath(t)}delete(t){return this.provider.deleteSession(t)}getWatchPaths(){return this.provider.getWatchPaths?.()??[]}seedArgsFor(t){let r=t?.prompt;return r===void 0?this.seedArgs:this.seedArgs.map(n=>n===he?r:n)}seed(t,r){return rN(t,{recursive:!0}),new Promise(n=>{let s;try{s=zm(this.binary,this.seedArgsFor(r),{cwd:t,env:Ft(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&&Xm(r.userConfig,this.name)){let s=r.userConfig.tools[this.name];if(s?.agent)return this.runOneShotAgent(t,r,s.agent)}let n=r.timeoutMs??e.DEFAULT_IDLE_TIMEOUT_MS;return n<=0&&!r.signal?this.transportFn(t,{...r,binary:this.binary}):this.withTimeouts(n,t,r)}withTimeouts(t,r,n){let s=new AbortController,i,o,a="",l,c=()=>{t<=0||(clearTimeout(i),i=setTimeout(()=>{n.onIdleWarning?.(t),d(),s.abort(),l&&l({text:a,sessionId:n.sessionId,durationMs:t,status:"stalled",stalledAfterMs:t})},t))},d=()=>{clearTimeout(i)};n.signal&&(n.signal.aborted?(o="external",s.abort()):n.signal.addEventListener("abort",()=>{o="external",s.abort()},{once:!0})),c();let u={...n,binary:this.binary,signal:s.signal,onDelta:p=>{a+=p,c(),n.onDelta?.(p)},onProgress:p=>{p.kind!=="api_retry"&&c(),n.onProgress?.(p)}},f=this.transportFn(r,u).then(p=>(d(),{...p,status:"ok"})).catch(p=>{throw d(),o==="external"?new dl("Turn cancelled","external"):p}),m=new Promise(p=>{l=p});return Promise.race([f,m])}runOneShotAgent(t,r,n){let s=Gm(r.userConfig,this.name,r.sessionId,t,r.profile),i=Date.now();return new Promise((o,a)=>{let l=Km(r.env),c=zm(s,{shell:!0,cwd:r.cwd,env:Be(r.env,r.cwd,r.sessionId),stdio:["pipe","pipe","pipe"]}),d=!1,u=!1,f=setTimeout(()=>{u=!0,c.kill()},l),m="",p="";if(c.stdout?.on("data",_=>{let g=_.toString();m+=g,r.onDelta?.(g)}),c.stderr?.on("data",_=>{p+=_.toString()}),r.signal){if(r.signal.aborted)return clearTimeout(f),c.kill(),a(new Error("Aborted"));r.signal.addEventListener("abort",()=>c.kill(),{once:!0})}c.on("exit",_=>{if(d)return;d=!0,clearTimeout(f);let g=Date.now()-i;u?a(new Error(`Agent command timed out after ${l}ms`)):_===0||_===null?o({text:m.trim(),sessionId:r.sessionId,durationMs:g}):a(new Error(p.trim().slice(0,200)||`Agent command exited with code ${_}`))}),c.on("error",_=>{d||(d=!0,clearTimeout(f),a(_))})})}}});function ai(e,t){let r;if(t&&typeof t=="object"){let n=t.code;typeof n=="number"&&(r=n)}return new Bt(e,r,t)}var Qe,Se,Wt,oi,Bt,Yr=T(()=>{"use strict";Qe=class extends Error{constructor(t,r){super(t,r),this.name=this.constructor.name}},Se=class extends Qe{},Wt=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}},Bt=class extends Qe{rpcCode;rpcData;constructor(t,r,n){super(t),r!==void 0&&(this.rpcCode=r),n!==void 0&&(this.rpcData=n)}}});import*as fl from"node:child_process";function sN(e){if(typeof fl.spawnSync=="function")try{fl.spawnSync("taskkill",["/T","/F","/PID",String(e)],{windowsHide:!0})}catch{}}function Zm(e){return e.exitCode!==null||e.signalCode!==null}function ul(e,t){return Zm(e)?Promise.resolve(!0):new Promise(r=>{let n=!1,s=()=>{n||(n=!0,clearTimeout(i),r(!0))},i=setTimeout(()=>{n||(n=!0,e.removeListener("exit",s),r(!1))},t);e.once("exit",s)})}async function ot(e,t={}){let r=Date.now(),n=t.stdinEnd!==!1,s=t.softDelayMs??5e3,i=t.killDelayMs??5e3,o=t.platform??process.platform,a=t.runTaskkill??sN;if(Zm(e))return{signal:"natural",elapsedMs:Date.now()-r};if(n&&e.stdin&&!e.stdin.destroyed)try{e.stdin.end()}catch{}if(await ul(e,s))return{signal:"stdin",elapsedMs:Date.now()-r};if(o==="win32"&&typeof e.pid=="number")a(e.pid);else try{e.kill("SIGTERM")}catch{}if(await ul(e,i))return{signal:"SIGTERM",elapsedMs:Date.now()-r};if(o!=="win32")try{e.kill("SIGKILL")}catch{}return await ul(e,nN)?{signal:"SIGKILL",elapsedMs:Date.now()-r}:{signal:"abandoned",elapsedMs:Date.now()-r}}var nN,li=T(()=>{"use strict";nN=1e3});function Qm(e){ce()&&Ae({event:"legacy",msg:`[debug] ${e}`},{always:!0})}function sr(e,t){let r=oN[e];if(r)return r[t]??r.yolo}function lN(e,t){if(t.length===0)return!0;for(let r=0;r+t.length<=e.length;r++){let n=!0;for(let s=0;s<t.length;s++)if(e[r+s]!==t[s]){n=!1;break}if(n)return!0}return!1}function at(e,t,r="yolo"){if(aN.has(e)){Qm(`YOLO ${e} [mode=${r}]: ${e==="codex"?`JSON-RPC params (approvalPolicy=never, sandbox=${r==="plan"?"read-only":"danger-full-access"})`:e==="opencode"?".opencode/opencode.json (permission=allow)":"protocol/config (out-of-band)"} \u2014 no argv flag`);return}let n=r==="plan"?sr(e,"plan"):iN[e];if(!n){let s=`unknown provider "${e}" \u2014 YOLO contract not configured. Add an entry to YOLO_FLAGS in src/providers/yolo-contract.ts before spawning this provider.`;throw V({event:"yolo_assert_failed",provider:e,reason:"unconfigured_provider",args:t.join(" "),message:s}),new Se(s)}if(!lN(t,n)){let s=n.join(" "),i=`${e} spawn missing YOLO flag '${s}' \u2014 YOLO is mandatory for every provider; see src/providers/yolo-contract.ts. Got argv: [${t.map(o=>JSON.stringify(o)).join(", ")}]`;throw V({event:"yolo_assert_failed",provider:e,reason:"flag_missing",required_flag:s,mode:r,args:t.join(" "),message:i}),new Se(i)}Qm(`YOLO ${e} [mode=${r}]: argv flag '${n.join(" ")}'`)}var iN,oN,aN,zr=T(()=>{"use strict";Yr();we();iN={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"],gemini:["-y"],copilot:["--yolo"],agy:["--dangerously-skip-permissions"],lmplayer:["--dangerously-skip-permissions"]},oN={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"]}};aN=new Set(["codex","opencode"])});function ep(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
+ `),...km(e),...bm(e)}}function qI(e,t){return t===void 0?{resumed:!1,reason:e}:{resumed:!1,reason:e,valid:t}}var ol,Ze=T(()=>{"use strict";Tm();Sm();Im();Am();Lm();sl();Xn();ol=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;tryAcquireAgentInflightTxn;recvMailboxMessagesTxn;constructor(t){t.pragma("foreign_keys = ON"),this.db=t,this.stmts=BI(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)=>qI("state_not_found")),this.resumeInteractiveTxn=t.transaction((r,n,s,i)=>{let o=this.getInteractiveSessionByStepId(r);if(o===null)return{resumed:!1,reason:"not_found"};if(o.status!=="waiting_operator")return{resumed:!1,reason:"not_waiting_operator"};let a=this.getRun(o.run_id);if(a===null)return{resumed:!1,reason:"run_not_found"};let l=s?"done":"waiting_agent";return this.stmts.updateInteractiveSession.run(l,n,Date.now(),o.id),this.stmts.resumeRunState.run(o.state_name,a.id),this.stmts.requeuePausedJob.run(i,a.job_id),{resumed:!0,session:this.getInteractiveSessionByStepId(r),run:this.getRun(a.id),job:this.getJob(a.job_id)}}),this.resumeEscalationTxn=t.transaction((r,n,s)=>{let i=this.stmts.getAttention.get(r);if(i===void 0)return{resumed:!1,reason:"not_found"};if(i.kind!==ti)return{resumed:!1,reason:"wrong_kind"};if(i.acknowledged_at!==null)return{resumed:!1,reason:"already_acked"};if(i.run_id===null)return{resumed:!1,reason:"run_not_found"};let o=null,a=[];if(i.payload!==null)try{let d=JSON.parse(i.payload);d.step!==void 0&&typeof d.step.id=="string"&&d.step.id.length>0&&(o=d.step.id),Array.isArray(d.declared_outcomes)&&(a=d.declared_outcomes.filter(u=>typeof u=="string"))}catch{}if(o===null)return{resumed:!1,reason:"no_step"};let l=this.getRun(i.run_id);if(l===null)return{resumed:!1,reason:"run_not_found"};if(n!==Jn&&!a.includes(n))return{resumed:!1,reason:$m};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){jm(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){jm(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=Mm(),s=O();return this.stmts.insertChatbotSession.run(n,t,r??null,s,s,"active"),this.stmts.getChatbotSession.get(n)}getChatbotSession(t){return this.stmts.getChatbotSession.get(t)??null}listChatbotSessions(t){return this.stmts.listChatbotSessionsForUser.all(t)}appendChatbotMessage(t,r,n,s){let i=O(),o=this.stmts.insertChatbotMessage.run(t,r,n,s??null,i);return this.stmts.touchChatbotSession.run(i,t),this.stmts.getChatbotMessage.get(o.lastInsertRowid)}listChatbotMessages(t){return this.stmts.listChatbotMessages.all(t)}getConfig(t){return this.stmts.getConfig.get(t)?.value??null}setConfig(t,r){this.stmts.upsertConfig.run(t,r,O())}getConfigAll(){let t=this.stmts.listConfig.all(),r={};for(let n of t)r[n.key]=n.value;return r}enqueueJob(t){let r=this.stmts.insertJob.run(t.project_id,t.workflow_id_override??null,t.source,t.source_ref??null,t.payload??null,t.priority??0,t.available_at??O(),t.dedupe_key??null,t.concurrency_key??null,O());if(r.changes===1)return this.stmts.getJob.get(r.lastInsertRowid);if(t.dedupe_key===void 0||t.dedupe_key===null)throw new Error("job insert ignored without dedupe key");return this.stmts.findJobByDedupe.get(t.source,t.dedupe_key)}claimNextJob(t){let r=O(),n=new Date(Date.now()+t.lease_ms).toISOString();return this.claimTxn(t.worker_id,n,r)}claimNextJobWithConcurrency(t){let r=O(),n=new Date(Date.now()+t.lease_ms).toISOString();return this.claimWithConcurrencyTxn(t.worker_id,n,r,t.evaluator)}claimJobByIdWithConcurrency(t){let r=O(),n=new Date(Date.now()+t.lease_ms).toISOString();return this.claimByIdWithConcurrencyTxn(t.job_id,t.worker_id,n,r,t.evaluator)}releaseJob(t,r,n){let s=r==="queued"||r==="running"?null:O();return this.stmts.releaseJob.run(r,n??null,s,t),this.getJob(t)}getJob(t){return this.stmts.getJob.get(t)??null}findJobBySourceAndDedupe(t,r){return this.stmts.findJobByDedupe.get(t,r)??null}insertRun(t){let r=this.getWorkflow(t.workflow_id);if(r===null)throw new Error(`workflow not found: ${t.workflow_id}`);let n=this.stmts.insertRun.run(t.job_id,t.workflow_id,t.team_id,t.current_state??null,r.active_version_id,t.parent_run_id??null,O()),s=this.stmts.getRun.get(n.lastInsertRowid);return(t.parent_run_id===void 0||t.parent_run_id===null)&&this.stmts.setJobRun.run(s.id,t.job_id),s}setJobRun(t,r){return this.stmts.setJobRun.run(r,t),this.getJob(t)}insertPromptDispatch(t){return this.stmts.insertPromptDispatch.run(t.prompt_id,t.project_id,t.job_id,t.text,t.context_json??null,O()),this.stmts.getPromptDispatch.get(t.prompt_id)}getPromptDispatch(t){return this.stmts.getPromptDispatch.get(t)??null}setPromptDispatchCompleted(t,r){return this.stmts.setPromptDispatchCompleted.run(r??O(),t),this.getPromptDispatch(t)}getWorkspace(t){return this.stmts.getWorkspace.get(t)??null}ensureWorkspace(t={}){let r=t.id??"default";this.stmts.ensureWorkspace.run(r,t.name??"Default workspace",t.idleThresholdMs??6e5,O());let n=this.getWorkspace(r);if(n===null)throw new Error(`workspace ${r} missing after upsert`);return n}listWebProjectsActive(t){return this.stmts.listWebProjectsActive.all(t)}getWebProject(t){return this.stmts.getWebProject.get(t)??null}insertWebProject(t){let r=O(),n=this.stmts.insertWebProject.run(t.workspace_id,t.name,t.repo_path,t.config_json??null,t.linked_v4_project_id??null,r,r),s=Number(n.lastInsertRowid),i=this.getWebProject(s);if(i===null)throw new Error(`web_project ${s} missing after insert`);return i}updateWebProject(t){let r=this.getWebProject(t.id);return r===null||r.deleted_at!==null?null:(this.stmts.updateWebProject.run(t.name??r.name,t.config_json===void 0?r.config_json:t.config_json,O(),t.id),this.getWebProject(t.id))}softDeleteWebProject(t){return this.stmts.softDeleteWebProject.run(O(),t).changes===1}loadMailboxCursor(t,r){return this.stmts.loadMailboxCursor.get(t,r)??null}saveMailboxCursor(t){this.stmts.saveMailboxCursor.run(t.user_id,t.mailbox_key,t.last_processed_version_id,t.last_processed_seq??null,t.last_processed_at)}addUsage(t){this.stmts.addUsage.run(t.user_id,t.device_id,t.period,t.put,t.get,t.list,t.updated_at)}loadUsage(t,r,n){return this.stmts.loadUsage.get(t,r,n)??null}sumUsageForPeriod(t,r){let n=this.stmts.sumUsageForPeriod.get(t,r);return{put:n?.put??0,get:n?.get??0,list:n?.list??0}}upsertRootTeam(t){this.stmts.upsertRootTeam.run(t.teamfile_path,t.name,t.raw_text,t.raw_sha256,t.registered_at,t.last_seeded_at)}getRootTeam(t){return this.stmts.getRootTeam.get(t)??null}listRootTeams(){return this.stmts.listRootTeams.all()}insertTeamChatLog(t){let r=this.stmts.insertTeamChatLog.run(t.root_teamfile,t.sender_teamfile,t.sender_alias,t.receiver_teamfile,t.receiver_alias,t.message,t.response,t.origin,t.status,t.error_detail,t.truncated,t.created_at);return Number(r.lastInsertRowid)}listTeamChatLog(t){return this.stmts.listTeamChatLog.all(t)}listTeamChatLogSinceId(t,r=500){return this.stmts.listTeamChatLogSinceId.all(t,Math.max(1,Math.trunc(r)))}getMaxTeamChatLogId(){return this.stmts.getMaxTeamChatLogId.get()?.max_id??0}loadTeamChatLogCursor(t){return this.stmts.loadTeamChatLogCursor.get(t)??null}saveTeamChatLogCursor(t){this.stmts.saveTeamChatLogCursor.run(t.cursor_key,t.last_pushed_id,t.updated_at)}startTrackedInvocation(t){let r=t.started_at??O(),n=t.holder_host??Gn(),s=t.last_heartbeat_at??r,i=this.stmts.insertTrackedInvocation.run(t.kind,t.origin,t.scope_teamfile??null,t.from_identity,t.target_teamfile??null,t.target_alias??null,t.root_teamfile??null,t.cwd??null,Pt(t.command),r,t.holder_pid??null,n,s,Pt(t.meta),t.launch_source??t.kind,t.request_payload??null);return this.getTrackedInvocation(Number(i.lastInsertRowid))}getTrackedInvocation(t){return this.stmts.getTrackedInvocation.get(t)??null}listAllRunningTrackedInvocations(){return this.stmts.listAllRunningTrackedInvocations.all()}finishTrackedInvocation(t,r){let n=r.ended_at??O();return this.stmts.finishTrackedInvocation.run(r.status,n,r.exit_code??null,r.signal??null,Pt(r.result_summary),Pt(r.error),r.team_chat_log_id??null,Pt(r.meta),n,t).changes!==1?null:this.getTrackedInvocation(t)}reclaimTrackedInvocationIfUnchanged(t,r,n){let s=n.ended_at??O();return this.stmts.reclaimTrackedInvocationIfUnchanged.run(n.status,s,n.exit_code??null,n.signal??null,Pt(n.result_summary),Pt(n.error),n.team_chat_log_id??null,Pt(n.meta),s,t,r.holder_pid,r.holder_host,r.started_at,r.last_heartbeat_at).changes!==1?null:this.getTrackedInvocation(t)}heartbeatTrackedInvocation(t,r=O()){return this.stmts.heartbeatTrackedInvocation.run(r,t).changes!==1?null:this.getTrackedInvocation(t)}updateTrackedInvocationRequestPayload(t,r){return this.stmts.updateTrackedInvocationRequestPayload.run(r,t).changes!==1?null:this.getTrackedInvocation(t)}listClaimableTerminalTrackedInvocations(t){let r=["status IN ('done', 'error', 'busy', 'cancelled')","ended_at IS NOT NULL","notified_by IS NULL"],n=[];t.from!==void 0&&(r.push("from_identity = ?"),n.push(t.from)),t.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(t.scope_teamfile));let s=Math.max(1,Math.min(1e3,Math.trunc(t.limit??100)));return n.push(s),this.db.prepare(`SELECT * FROM tracked_invocation WHERE ${r.join(" AND ")} ORDER BY ended_at ASC, id ASC LIMIT ?`).all(...n)}claimTrackedInvocationNotification(t,r,n=O()){return this.stmts.claimTrackedInvocationNotification.run(r,n,t).changes!==1?null:this.getTrackedInvocation(t)}listTrackedInvocations(t={}){let r=[],n=[];t.from!==void 0&&(r.push("from_identity = ?"),n.push(t.from)),t.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(t.scope_teamfile)),t.status!==void 0&&(r.push("status = ?"),n.push(t.status)),t.kind!==void 0&&(r.push("kind = ?"),n.push(t.kind)),t.origin!==void 0&&(r.push("origin = ?"),n.push(t.origin));let s=Math.max(1,Math.min(1e3,Math.trunc(t.limit??100)));n.push(s);let i=r.length===0?"":` WHERE ${r.join(" AND ")}`;return this.db.prepare(`SELECT * FROM tracked_invocation${i} ORDER BY started_at DESC, id DESC LIMIT ?`).all(...n)}maxTrackedInvocationId(t={}){let r=[],n=[];t.from!==void 0&&(r.push("from_identity = ?"),n.push(t.from)),t.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(t.scope_teamfile));let s=r.length===0?"":` WHERE ${r.join(" AND ")}`,i=this.db.prepare(`SELECT COALESCE(MAX(id), 0) AS max_id FROM tracked_invocation${s}`).get(...n);return Number(i?.max_id??0)}listRunningTrackedInvocations(t={}){return this.listTrackedInvocations({...t,status:"running"})}enqueueMail(t){return this.sendMailboxMessage(t)}sendMailboxMessage(t){let r=this.stmts.insertMailboxMessage.run(t.receiver_teamfile,t.receiver_alias,t.sender_teamfile??null,t.sender_alias??null,t.root_teamfile??null,Wn(t.payload),t.created_at??O(),t.remote_transport??null,t.remote_message_id??null,t.remote_thread_id??null,t.meta??null,t.message_type??"request",t.reply_mode??"pull",t.request_mailbox_id??null);return this.getMailboxMessage(Number(r.lastInsertRowid))}listEnqueuedRequestMailFromSender(t,r,n,s){return this.stmts.listEnqueuedRequestMailFromSender.all(t,r,n,s)}listEnqueuedResponseMailFromSender(t,r,n,s){return this.stmts.listEnqueuedResponseMailFromSender.all(t,r,n,s)}listRelayMailboxLanes(t){return this.stmts.listRelayMailboxLanes.all(Math.max(1,Math.trunc(t)))}markMailDelivered(t,r,n){let s=[...new Set(t.map(o=>Math.trunc(o)).filter(o=>Number.isInteger(o)&&o>0))];if(s.length===0)return 0;let i=Wn(r);this.db.exec("BEGIN IMMEDIATE");try{let o=0;for(let a of s)o+=this.stmts.markMailboxMessageDelivered.run(n,i,a).changes;return this.db.exec("COMMIT"),o}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}markRelayRequestDelivered(t,r,n){let s=Wn(r);this.db.exec("BEGIN IMMEDIATE");try{let i=0;for(let o of t)this.stmts.markMailboxMessageDeliveredIfUnchanged.run(n,s,o.id,o.delivering_at,o.delivery_holder_pid,o.delivery_holder_host).changes===1&&(i+=1);return this.db.exec("COMMIT"),i}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}markRelayRequestDeliveredAndEnqueueResponses(t,r,n){let s=Wn(r);this.db.exec("BEGIN IMMEDIATE");try{let i=0,o=0;for(let a of t){if(this.stmts.markMailboxMessageDeliveredIfUnchanged.run(n,s,a.id,a.delivering_at,a.delivery_holder_pid,a.delivery_holder_host).changes!==1||(i+=1,a.sender_teamfile===null||a.sender_alias===null))continue;let c=this.stmts.insertMailboxResponseIfAbsent.run(a.sender_teamfile,a.sender_alias,a.receiver_teamfile,a.receiver_alias,a.root_teamfile,s,n,null,null,null,null,a.reply_mode,a.id);o+=c.changes}return this.db.exec("COMMIT"),{marked:i,responses:o}}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}claimMailForDelivery(t,r,n=process.pid,s=Gn()){let i=[...new Set(t.map(o=>Math.trunc(o)).filter(o=>Number.isInteger(o)&&o>0))];if(i.length===0)return[];this.db.exec("BEGIN IMMEDIATE");try{let o=[];for(let a of i)if(this.stmts.claimMailboxMessageDelivery.run(r,n,s,a).changes===1){let c=this.getMailboxMessage(a);c!==null&&o.push(c)}return this.db.exec("COMMIT"),o}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}clearMailDelivery(t){let r=[...new Set(t.map(n=>Math.trunc(n)).filter(n=>Number.isInteger(n)&&n>0))];if(r.length===0)return 0;this.db.exec("BEGIN IMMEDIATE");try{let n=0;for(let s of r)n+=this.stmts.clearMailboxMessageDelivery.run(s).changes;return this.db.exec("COMMIT"),n}catch(n){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),n}}reclaimMailboxDeliveryIfUnchanged(t){return this.stmts.clearMailboxMessageDeliveryIfUnchanged.run(t.id,t.delivering_at,t.delivery_holder_pid,t.delivery_holder_host).changes!==1?null:this.getMailboxMessage(t.id)}reclaimStaleMailboxDeliveries(t){let r=this.stmts.listInFlightMailboxDeliveries.all(),n=[];this.db.exec("BEGIN IMMEDIATE");try{for(let s of r){if(!UI(s,t))continue;let i=this.reclaimMailboxDeliveryIfUnchanged(s);i!==null&&n.push(i)}return this.db.exec("COMMIT"),n}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}listDeliveredReceiptsForSender(t,r){return this.stmts.listDeliveredReceiptsForSender.all(t,r)}listOutboundPendingForSender(t,r){return this.stmts.listOutboundPendingForSender.all(t,r)}getMailboxMessage(t){return this.stmts.getMailboxMessage.get(t)??null}peekMailboxMessages(t,r=1e3){return this.stmts.listMailboxMessagesForReceiver.all(t.receiver_teamfile,t.receiver_alias,Math.max(1,Math.min(1e3,Math.trunc(r))))}recvMailboxMessages(t){return this.recvMailboxMessagesTxn(t.receiver_teamfile,t.receiver_alias)}updateTeamChatLogResponse(t,r){this.stmts.updateTeamChatLogResponse.run(r.response,r.status,r.error_detail,r.truncated,t)}getAgentInflight(t,r){return this.stmts.getAgentInflight.get(t,r)??null}listAgentInflight(){return this.stmts.listAgentInflight.all()}tryAcquireAgentInflight(t,r){return this.tryAcquireAgentInflightTxn(t,r)}clearAgentInflight(t,r){this.stmts.clearAgentInflight.run(t,r)}clearObservedTerminalAgentInflight(t,r,n){return this.stmts.clearObservedTerminalAgentInflight.run({receiver_teamfile:t,receiver_alias:r,observed_sender_teamfile:n.sender_teamfile,observed_sender_alias:n.sender_alias,observed_started_at:n.started_at,observed_holder_pid:n.holder_pid}).changes===1}releaseAgentInflight(t){this.db.exec("BEGIN IMMEDIATE");try{let r=this.getAgentInflight(t.receiver_teamfile,t.receiver_alias);if(r===null||r.sender_teamfile!==t.sender_teamfile||r.sender_alias!==t.sender_alias)return this.db.exec("COMMIT"),!1;if(r.active_count<=1)return this.stmts.clearAgentInflightIfSender.run(t.receiver_teamfile,t.receiver_alias,t.sender_teamfile,t.sender_alias),this.db.exec("COMMIT"),!0;let n=this.stmts.decrementAgentInflight.run(t.receiver_teamfile,t.receiver_alias,t.sender_teamfile,t.sender_alias);return this.db.exec("COMMIT"),n.changes===1}catch(r){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),r}}clearAgentInflightOlderThan(t){return this.stmts.clearAgentInflightOlderThan.run(t).changes}getTerminalLock(t,r){let n=this.stmts.getRuntimeState.get(Bn,Hn(t,r),qn);return n===void 0?null:Rm(n.data)}setTerminalLock(t){this.stmts.upsertRuntimeState.run(Bn,Hn(t.teamfile,t.alias),qn,JSON.stringify(t),t.last_heartbeat)}heartbeatTerminalLock(t,r,n,s){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getTerminalLock(t,r);if(i===null||i.lock_id!==n)return this.db.exec("COMMIT"),!1;let o={...i,last_heartbeat:s};return this.stmts.upsertRuntimeState.run(Bn,Hn(t,r),qn,JSON.stringify(o),s),this.db.exec("COMMIT"),!0}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}clearTerminalLock(t,r,n){this.db.exec("BEGIN IMMEDIATE");try{let s=this.getTerminalLock(t,r);if(s===null||s.lock_id!==n)return this.db.exec("COMMIT"),!1;let i=this.stmts.deleteRuntimeState.run(Bn,Hn(t,r),qn);return this.db.exec("COMMIT"),i.changes===1}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}getRuntimeProcessLock(t,r,n){let s=this.stmts.getRuntimeState.get(t,r,n);return s===void 0?null:PI(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&&!FI(o,s))return this.db.exec("COMMIT"),{acquired:!1,current:o};let a={lock_id:Mm(),holder_pid:process.pid,holder_host:Gn(),started_at:i,last_heartbeat:i};return this.stmts.upsertRuntimeState.run(t,r,n,JSON.stringify(a),i),this.db.exec("COMMIT"),{acquired:!0,lock:a,previous:o}}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}clearRuntimeProcessLock(t,r,n,s){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getRuntimeProcessLock(t,r,n);if(i===null||i.lock_id!==s)return this.db.exec("COMMIT"),!1;let o=this.stmts.deleteRuntimeState.run(t,r,n);return this.db.exec("COMMIT"),o.changes===1}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}getRun(t){return this.stmts.getRun.get(t)??null}setRunCurrentState(t,r){return this.stmts.setRunCurrentState.run(r,t),this.stmts.getRun.get(t)??null}setRunPausedState(t,r,n){return this.stmts.setRunPausedState.run(r,n,t),this.stmts.getRun.get(t)??null}setRunPendingEscalationDecision(t,r){return this.stmts.setRunPendingEscalationDecision.run(r,t),this.stmts.getRun.get(t)??null}setRunTerminalState(t,r){return this.stmts.setRunTerminalState.run(r,O(),t),this.stmts.getRun.get(t)??null}pauseJob(t){return this.stmts.pauseJob.run(t),this.getJob(t)}resumeRun(t,r){return this.resumeRunTxn(t,r,O())}insertStep(t){let r=this.stmts.insertStep.run(t.run_id,t.parent_step_id??null,t.state_name,t.outcome??null,t.status_detail??null,O());return this.stmts.getStep.get(r.lastInsertRowid)}finishStep(t,r,n){return this.stmts.finishStep.run(r??null,n??null,O(),t),this.stmts.getStep.get(t)??null}listStepsForRun(t){return this.stmts.listStepsForRun.all(t)}listLatestStepOutcomesByState(t){let r=this.stmts.listLatestStepOutcomesByState.all(t),n={};for(let s of r)n[s.state_name]=s.outcome;return n}insertSubmittedPr(t){let r=this.stmts.insertSubmittedPr.run(t.repo,t.pr_url,t.issue_url??null,t.local_path??null,t.branch??null,t.head_sha??null,t.status??"watching",t.submitted_at??O(),t.last_known_state??null,t.created_by_run_id??null);return this.stmts.getSubmittedPr.get(r.lastInsertRowid)}listSubmittedPrs(t){return t?.status!==void 0?this.stmts.listSubmittedPrsByStatus.all(t.status):this.stmts.listSubmittedPrs.all()}getSubmittedPr(t){return this.stmts.getSubmittedPr.get(t)??null}findSubmittedPrByUrl(t){return this.stmts.findSubmittedPrByUrl.get(t)??null}insertStepArtifact(t){let r=this.stmts.insertStepArtifact.run(t.step_id,t.kind,t.path??null,t.content??null,t.sha??null,t.provider_call_mode??null,O());return this.stmts.getStepArtifact.get(r.lastInsertRowid)}insertExternalObject(t){let n=this.stmts.insertExternalObject.run(t.type,t.provider,t.project_id,t.run_id??null,t.external_id,t.url??null,t.status??null,t.metadata??null,t.last_seen_at??null,O()).changes===1;return{row:this.stmts.findExternalObjectByUnique.get(t.provider,t.type,t.external_id),inserted:n}}insertExternalSignal(t){let r=this.stmts.insertExternalSignal.run(t.object_id,t.kind,t.source??null,t.occurred_at??null,t.payload??null,t.signal_hash??null,null,O()),n=r.changes===1;return{row:t.signal_hash===void 0||t.signal_hash===null?this.stmts.getExternalSignal.get(r.lastInsertRowid):this.stmts.findExternalSignalByUnique.get(t.object_id,t.kind,t.signal_hash),inserted:n}}raiseAttention(t){let r=this.stmts.insertAttention.run(t.kind,t.severity??"warn",t.project_id??null,t.run_id??null,t.external_object_id??null,t.requires_user===!0?1:0,t.payload??null,O());return this.stmts.getAttention.get(r.lastInsertRowid)}acknowledgeAttention(t){return this.stmts.ackAttention.run(O(),t),this.stmts.getAttention.get(t)??null}upsertDurableMemory(t){let r=O();return this.stmts.upsertDurableMemory.run(t.project_id,t.type,t.name,t.description??null,t.body,r,r),this.stmts.getDurableMemoryByName.get(t.project_id,t.name)}getDurableMemoryByName(t,r){return this.stmts.getDurableMemoryByName.get(t,r)??null}deleteDurableMemory(t,r){return this.stmts.deleteDurableMemory.run(t,r).changes>0}listDurableMemory(t,r){return r!==void 0?this.stmts.listDurableMemoryByType.all(t,r):this.stmts.listDurableMemory.all(t)}indexDurableMemory(t,r){return r!==void 0&&r.length>0?this.stmts.listDurableMemory.all(t).filter(s=>r.includes(s.type)).map(({name:s,description:i,type:o,updated_at:a})=>({name:s,description:i,type:o,updated_at:a})):this.stmts.listDurableMemory.all(t).map(({name:n,description:s,type:i,updated_at:o})=>({name:n,description:s,type:i,updated_at:o}))}recordSessionSize(t){let r=this.stmts.insertSessionSize.run(t.team_name,t.alias,t.sessionid,t.input_tokens??null,t.cache_tokens??null,t.output_tokens??null,t.total_tokens??null,t.observed_at??O());return this.stmts.getSessionSize.get(r.lastInsertRowid)}latestSessionSizes(){return this.stmts.latestSessionSizes.all()}sessionSizeHistory(t,r,n=20){return this.stmts.sessionSizeHistory.all(t,r,n)}insertSessionEvent(t){let r=this.stmts.insertSessionEvent.run(t.run_id,t.step_id??null,t.kind,t.timestamp_ms,t.payload,t.payload_truncated??0,t.overflow_artifact_id??null);return this.stmts.getSessionEvent.get(r.lastInsertRowid)}listSessionEvents(t,r){return r!==void 0?this.stmts.listSessionEventsSince.all(t,r):this.stmts.listSessionEvents.all(t)}listSessionEventsSince(t,r=1e3){return this.stmts.listAllEventsSince.all(t,r)}latestAgentCall(t){let r=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call' ORDER BY id DESC LIMIT 1").get(t);if(r===void 0)return null;try{let n=JSON.parse(r.payload);return typeof n.alias!="string"||typeof n.provider!="string"?null:{alias:n.alias,provider:n.provider,...typeof n.model=="string"?{model:n.model}:{}}}catch{return null}}agentCallTokenTotals(t){let r=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call'").all(t),n=0,s=0,i=0;for(let o of r)try{let a=JSON.parse(o.payload);typeof a.tokens_in=="number"&&(n+=a.tokens_in),typeof a.tokens_out=="number"&&(s+=a.tokens_out),i+=1}catch{}return{totalInputTokens:n,totalOutputTokens:s,agentCallCount:i}}addRollupValue(t){this.stmts.upsertRollupStat.run(t.run_id,t.step_id??null,t.metric_kind,t.value,t.bucket_start_ms,t.bucket_end_ms,t.updated_at)}listRollupStats(t){return this.stmts.listRollupStats.all(t)}getRollupCursor(){return this.stmts.getRollupCursor.get("last_event_id")?.value??0}setRollupCursor(t){this.stmts.setRollupCursor.run("last_event_id",t)}insertDriftSignal(t){let r=this.stmts.insertDriftSignal.run(t.team_member_id,t.project_id??null,t.signal_kind,t.severity,t.description,t.detected_at,t.expires_at??null,t.payload??null);return this.stmts.getDriftSignal.get(r.lastInsertRowid)}listDriftSignals(t={}){return t.team_member_id!==void 0&&t.unacked?this.stmts.listUnackedDriftByMember.all(t.team_member_id):t.team_member_id!==void 0?this.stmts.listDriftByMember.all(t.team_member_id):t.project_id!==void 0?this.stmts.listDriftByProject.all(t.project_id):this.stmts.listAllDrift.all()}hasUnackedDriftSignal(t,r,n){return this.stmts.findUnackedDrift.get(t,r??null,n)!==void 0}acknowledgeDriftSignal(t){return this.stmts.ackDriftSignal.run(Date.now(),t),this.stmts.getDriftSignal.get(t)??null}insertInteractiveSession(t){let r=Date.now();return this.stmts.insertInteractiveSession.run(t.run_id,t.step_id,t.state_name,t.status,r,r),this.stmts.getInteractiveSessionByStepId.get(t.step_id)}getInteractiveSessionByStepId(t){return this.stmts.getInteractiveSessionByStepId.get(t)??null}getInteractiveSessionByRunAndState(t,r){return this.stmts.getInteractiveSessionByRunAndState.get(t,r)??null}setInteractiveAgentOutput(t,r,n){this.stmts.setInteractiveAgentOutput.run(r,n,Date.now(),t)}resumeInteractive(t,r,n){return this.resumeInteractiveTxn(t,r,n,O())}resumeEscalation(t,r){return this.resumeEscalationTxn(t,r,O())}}});import{realpathSync as HI}from"node:fs";import{resolve as JI}from"node:path";function al(e){let t=JI(e);try{return HI(t)}catch{return t}}var Pm=T(()=>{"use strict"});import{platform as Fm}from"node:os";function Et(e){let t=new Vn;for(let r of e)t.registerAdapter(r);return t}var Vn,ll=T(()=>{"use strict";Pm();Vn=class{providers=[];adapters=new Map;register(t){this.providers.push(t)}async listAll(t){let r=[],n=t?.provider?this.providers.filter(o=>o.name===t.provider):this.providers,s=await Promise.all(n.map(o=>o.discoverSessions()));for(let o of s)r.push(...o);let i=r;if(t?.workspace){let o=al(t.workspace);i=i.filter(a=>al(a.cwd)===o)}if(t?.from){let o=t.from.getTime();i=i.filter(a=>a.modifiedAt.getTime()>=o)}if(t?.to){let o=t.to.getTime();i=i.filter(a=>a.modifiedAt.getTime()<=o)}return i.sort((o,a)=>a.modifiedAt.getTime()-o.modifiedAt.getTime()),t?.limit&&(i=i.slice(0,t.limit)),i}async getSession(t,r){let n=r?this.providers.filter(s=>s.name===r):this.providers;for(let s of n){let i=await s.loadSession(t);if(i)return i}return null}async resolveSession(t,r){let n=await this.resolveSessions(t,r);return n.length===1?n[0]:null}async resolveSessions(t,r){let n=r?this.providers.filter(i=>i.name===r):this.providers,s=[];for(let i of n){let o=await i.resolveSessionPath(t);o&&s.push({provider:i,filePath:o})}return s}getWatchTargets(){let t=Fm()==="darwin"||Fm()==="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 Um}from"node:fs";import{createInterface as Wm}from"node:readline";import{stat as XI}from"node:fs/promises";import{homedir as GI}from"node:os";async function*We(e){let t=Um(e,{encoding:"utf-8"}),r=Wm({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=Um(e,{encoding:"utf-8"}),s=Wm({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 XI(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,nr=T(()=>{"use strict";be=GI()});import{readdir as ni,stat as Bm,unlink as VI}from"node:fs/promises";import{join as Kr,basename as qm}from"node:path";function KI(e){return e==="file-history-snapshot"||e==="progress"||e==="system"||e==="queue-operation"}function YI(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 Hm(e){let t=0,r=0,n=0,s=0,i=0,o=0,a;for await(let l of We(e))if(!l.isSidechain){if(l.type==="user"&&!l.isMeta&&l.message){let c=l.message.content;if(typeof c=="string"){if(c.includes("<command-name>")||c.includes("<local-command-"))continue;t++}}else if(l.type==="assistant"&&l.message){let c=l.message.content;if(Array.isArray(c))for(let u of c)u.type==="text"&&t++;let d=l.message.usage;if(d){let u=d.input_tokens||0,f=d.cache_creation_input_tokens||0,m=d.cache_read_input_tokens||0,p=d.output_tokens||0;r+=u+f+m,n+=m,s+=f,i+=p;let _=u+f+m;_&&(o=_),a={inputTokens:u,cacheWriteInputTokens:f,cachedInputTokens:m,outputTokens:p}}}}return{messageCount:t,totalInputTokens:r,totalCacheReadInputTokens:n,totalCacheWriteInputTokens:s,totalOutputTokens:i,lastInputTokens:o,lastTokenUsage:a}}var si,Jm=T(()=>{"use strict";nr();si=class{name="claude";claudeDir;projectsDir;constructor(t={}){this.claudeDir=t.claudeDir||Kr(be,".claude"),this.projectsDir=Kr(this.claudeDir,"projects")}getWatchPaths(){return[{directory:this.projectsDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let t=[],r;try{r=await ni(this.projectsDir)}catch{return t}for(let n of r){let s=Kr(this.projectsDir,n);if(!(await Bm(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await ni(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=qm(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(!KI(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 Hm(t);return{provider:"claude",sessionId:r,slug:o,cwd:i,createdAt:u||s.createdAt,modifiedAt:s.modifiedAt,model:l,cliVersion:a,startCommand:"claude",firstUserMessage:c,lastUserMessage:d,messageCount:f.messageCount,filePath:t,totalInputTokens:f.totalInputTokens||void 0,totalCachedInputTokens:f.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:f.totalCacheWriteInputTokens||void 0,totalOutputTokens:f.totalOutputTokens||void 0,lastInputTokens:f.lastInputTokens||void 0,lastTokenUsage:f.lastTokenUsage}}async loadSession(t){let r=await this.resolveSessionFile(t);if(!r)return null;let n=await Ne(r),s=[],i="",o,a,l,c,d,u,f,m=t;for await(let _ of We(r))if(_.type!=="file-history-snapshot"&&!_.isSidechain){if(!i&&_.cwd&&(i=_.cwd),!o&&_.slug&&(o=_.slug),!a&&_.version&&(a=_.version),!c&&_.gitBranch&&(c=_.gitBranch),!f&&_.timestamp&&(f=new Date(_.timestamp)),_.sessionId&&(m=_.sessionId),_.type==="system"||_.type==="progress"||_.type==="queue-operation"){s.push({role:"system",timestamp:new Date(_.timestamp||0),content:YI(_)});continue}if(_.type==="user"&&_.message){if(_.isMeta)continue;let g=new Date(_.timestamp||0),h=_.message.content;if(typeof h=="string"){if(h.includes("<command-name>")||h.includes("<local-command-"))continue;d||(d=J(h.trim(),80)),u=J(h.trim(),80),s.push({role:"user",timestamp:g,content:fe(h.trim())})}else if(Array.isArray(h)){for(let S of h)if(S.type==="tool_result"){let y=typeof S.content=="string"?fe(S.content):JSON.stringify(S.content);s.push({role:"tool_result",timestamp:g,content:y,toolCallId:S.tool_use_id})}}}if(_.type==="assistant"&&_.message){_.message.model&&(l=_.message.model);let g=new Date(_.timestamp||0),h=_.message.content;if(Array.isArray(h))for(let S of h)S.type==="text"&&S.text?s.push({role:"assistant",timestamp:g,content:fe(S.text),model:_.message.model}):S.type==="tool_use"?s.push({role:"tool_use",timestamp:g,content:S.name||"unknown tool",toolName:S.name,toolInput:JSON.stringify(S.input,null,2),toolCallId:S.id,model:_.message.model}):S.type==="thinking"&&S.thinking&&s.push({role:"thinking",timestamp:g,content:S.thinking})}}if(!i)return null;let p=await Hm(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 VI(r),!0):!1}async resolveSessionFile(t){let r;try{r=await ni(this.projectsDir)}catch{return null}let n=[];for(let o of r){let a=Kr(this.projectsDir,o);if(!(await Bm(a).catch(()=>null))?.isDirectory())continue;let c;try{c=await ni(a)}catch{continue}for(let d of c){if(!d.endsWith(".jsonl"))continue;let u=qm(d,".jsonl");/^[0-9a-f]{8}-/.test(u)&&n.push({filePath:Kr(a,d),fileSessionId:u})}}let s=n.find(o=>o.fileSessionId===t);if(s)return s.filePath;let i=n.filter(o=>o.fileSessionId.startsWith(t));if(i.length===1)return i[0].filePath;for(let o of n){let a=await Ce(o.filePath,20);for(let l of a)if(l.slug&&l.slug===t)return o.filePath}return null}}});function ii(e){return"'"+e.replace(/'/g,"'\\''")+"'"}function ZI(e,t,r){if(!r)return"";let n=e.tools[t]??cl[t],s=n?.profiles?.[r]?.flags??cl[t]?.profiles?.[r]?.flags;if(s!==void 0)return s.trim();if(n?.profile_flag)return n.profile_flag.replace(/\{\{profile\}\}/g,r).trim();throw new Error(`Profile "${r}" is not configured for tool "${t}"`)}function Xm(e,t){return!!e.tools[t]}function Gm(e,t,r,n,s){let i=e.tools[t]??cl[t],o;if(i?.agent){let l=ii(n);o=i.agent.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,l)}else{let l=zI[t];if(!l)throw new Error(`No agent command configured for tool "${t}"`);let c=l.argv.map(d=>d.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,n));if(l.mode==="stdin"){let d=c.map(ii).join(" ");o=`printf '%s\\n' ${ii(n)} | ${d}`}else o=c.map(ii).join(" ")}let a=ZI(e,t,s);return a&&(o+=" "+a),o}var cl,zI,Vm=T(()=>{"use strict";cl={claude:{start:"claude",resume:"claude --resume {{session_id}} --dangerously-skip-permissions",profiles:{default:{description:"Default profile",flags:""}}},codex:{start:"codex",resume:"codex resume {{session_id}} --dangerously-bypass-approvals-and-sandbox",profiles:{default:{description:"Default profile",flags:""}}},opencode:{start:"opencode",resume:"opencode --session {{session_id}}",profiles:{default:{description:"Default profile",flags:""}}},gemini:{start:"gemini",resume:"gemini --resume {{session_id}} -y",profiles:{default:{description:"Default profile",flags:""}}},copilot:{start:"copilot",resume:"copilot --resume={{session_id}} --yolo",profiles:{default:{description:"Default profile",flags:""}}},qwen:{start:"qwen",resume:"qwen --resume {{session_id}} --approval-mode yolo",profiles:{default:{description:"Default profile",flags:""}}},agy:{start:"agy",resume:"agy --conversation {{session_id}} --dangerously-skip-permissions",profiles:{default:{description:"Default profile",flags:""}}}},zI={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 Km(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 Ym=T(()=>{"use strict"});var QI,ge,oi,Tt=T(()=>{"use strict";QI="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: ${QI}`,oi=`send this exact lmctl seed instruction: "${ge}"`});function Ft(e,t){let r={...e??process.env,PWD:t};return delete r.OLDPWD,r}function tN(e,t){return t===void 0||t.length===0?e:{...e??process.env,[Kn]:t}}function Be(e,t,r,n="chat"){return{...tN(Ft(e,t),r),[eN]:n}}var Kn,eN,it=T(()=>{"use strict";Kn="LMCTL_SELF_SESSIONID",eN="LMCTL_LAUNCH_SOURCE"});import{spawn as zm}from"node:child_process";import{mkdirSync as rN}from"node:fs";var dl,xe,Ut=T(()=>{"use strict";Vm();Ym();Tt();it();dl=class e extends Error{cancelReason;constructor(t,r){super(t),this.name="TurnAbortError",this.cancelReason=r,Object.setPrototypeOf(this,e.prototype)}},xe=class e{name;capabilities;injection;provider;binary;seedArgs;seedStdin;resumeTemplate;startTemplate;transportFn;constructor(t){this.name=t.provider.name,this.provider=t.provider,this.capabilities=t.capabilities,this.injection=t.injection,this.binary=t.binary,this.seedArgs=t.seedArgs,this.seedStdin=t.seedStdin,this.resumeTemplate=t.resumeTemplate,this.startTemplate=t.startTemplate,this.transportFn=t.transport}discover(){return this.provider.discoverSessions()}load(t){return this.provider.loadSession(t)}resolvePath(t){return this.provider.resolveSessionPath(t)}delete(t){return this.provider.deleteSession(t)}getWatchPaths(){return this.provider.getWatchPaths?.()??[]}seedArgsFor(t){let r=t?.prompt;return r===void 0?this.seedArgs:this.seedArgs.map(n=>n===ge?r:n)}seed(t,r){return rN(t,{recursive:!0}),new Promise(n=>{let s;try{s=zm(this.binary,this.seedArgsFor(r),{cwd:t,env:Ft(void 0,t),stdio:["pipe","pipe","pipe"],timeout:6e4})}catch(a){return n({success:!1,error:a instanceof Error?a.message:String(a)})}let i="";s.stderr?.on("data",a=>{i+=a.toString()});let o=r?.prompt!==void 0&&this.seedStdin!==void 0?`${r.prompt}
1360
+ `:this.seedStdin;o&&s.stdin?.write(o),s.stdin?.end(),s.on("exit",a=>{n(a===0||a===null?{success:!0}:{success:!1,error:i.trim().slice(0,200)||`exit code ${a}`})}),s.on("error",a=>{n({success:!1,error:a.message})})})}resumeCommand(t,r){return this.resumeTemplate.replace(/\{\{session_id\}\}/g,t)}startCommand(t){return this.startTemplate}manualSeedHint(t){return{launchCommand:`cd ${t} && ${this.binary}`,postLaunchNote:oi,lsCommand:`lmctl ls --provider ${this.name} --sessiondir ${t}`}}static DEFAULT_IDLE_TIMEOUT_MS=8*60*60*1e3;sendTurn(t,r){if(r.userConfig&&Xm(r.userConfig,this.name)){let s=r.userConfig.tools[this.name];if(s?.agent)return this.runOneShotAgent(t,r,s.agent)}let n=r.timeoutMs??e.DEFAULT_IDLE_TIMEOUT_MS;return n<=0&&!r.signal?this.transportFn(t,{...r,binary:this.binary}):this.withTimeouts(n,t,r)}withTimeouts(t,r,n){let s=new AbortController,i,o,a="",l,c=()=>{t<=0||(clearTimeout(i),i=setTimeout(()=>{n.onIdleWarning?.(t),d(),s.abort(),l&&l({text:a,sessionId:n.sessionId,durationMs:t,status:"stalled",stalledAfterMs:t})},t))},d=()=>{clearTimeout(i)};n.signal&&(n.signal.aborted?(o="external",s.abort()):n.signal.addEventListener("abort",()=>{o="external",s.abort()},{once:!0})),c();let u={...n,binary:this.binary,signal:s.signal,onDelta:p=>{a+=p,c(),n.onDelta?.(p)},onProgress:p=>{p.kind!=="api_retry"&&c(),n.onProgress?.(p)}},f=this.transportFn(r,u).then(p=>(d(),{...p,status:"ok"})).catch(p=>{throw d(),o==="external"?new dl("Turn cancelled","external"):p}),m=new Promise(p=>{l=p});return Promise.race([f,m])}runOneShotAgent(t,r,n){let s=Gm(r.userConfig,this.name,r.sessionId,t,r.profile),i=Date.now();return new Promise((o,a)=>{let l=Km(r.env),c=zm(s,{shell:!0,cwd:r.cwd,env:Be(r.env,r.cwd,r.sessionId),stdio:["pipe","pipe","pipe"]}),d=!1,u=!1,f=setTimeout(()=>{u=!0,c.kill()},l),m="",p="";if(c.stdout?.on("data",_=>{let g=_.toString();m+=g,r.onDelta?.(g)}),c.stderr?.on("data",_=>{p+=_.toString()}),r.signal){if(r.signal.aborted)return clearTimeout(f),c.kill(),a(new Error("Aborted"));r.signal.addEventListener("abort",()=>c.kill(),{once:!0})}c.on("exit",_=>{if(d)return;d=!0,clearTimeout(f);let g=Date.now()-i;u?a(new Error(`Agent command timed out after ${l}ms`)):_===0||_===null?o({text:m.trim(),sessionId:r.sessionId,durationMs:g}):a(new Error(p.trim().slice(0,200)||`Agent command exited with code ${_}`))}),c.on("error",_=>{d||(d=!0,clearTimeout(f),a(_))})})}}});function li(e,t){let r;if(t&&typeof t=="object"){let n=t.code;typeof n=="number"&&(r=n)}return new Bt(e,r,t)}var Qe,Se,Wt,ai,Bt,Yr=T(()=>{"use strict";Qe=class extends Error{constructor(t,r){super(t,r),this.name=this.constructor.name}},Se=class extends Qe{},Wt=class extends Qe{exitCode;signal;stderr;constructor(t,r,n=null,s){super(t),this.exitCode=r,this.signal=n,this.stderr=s}},ai=class extends Qe{line;constructor(t,r,n){super(t,{cause:n}),this.line=r}},Bt=class extends Qe{rpcCode;rpcData;constructor(t,r,n){super(t),r!==void 0&&(this.rpcCode=r),n!==void 0&&(this.rpcData=n)}}});import*as fl from"node:child_process";function sN(e){if(typeof fl.spawnSync=="function")try{fl.spawnSync("taskkill",["/T","/F","/PID",String(e)],{windowsHide:!0})}catch{}}function Zm(e){return e.exitCode!==null||e.signalCode!==null}function ul(e,t){return Zm(e)?Promise.resolve(!0):new Promise(r=>{let n=!1,s=()=>{n||(n=!0,clearTimeout(i),r(!0))},i=setTimeout(()=>{n||(n=!0,e.removeListener("exit",s),r(!1))},t);e.once("exit",s)})}async function ot(e,t={}){let r=Date.now(),n=t.stdinEnd!==!1,s=t.softDelayMs??5e3,i=t.killDelayMs??5e3,o=t.platform??process.platform,a=t.runTaskkill??sN;if(Zm(e))return{signal:"natural",elapsedMs:Date.now()-r};if(n&&e.stdin&&!e.stdin.destroyed)try{e.stdin.end()}catch{}if(await ul(e,s))return{signal:"stdin",elapsedMs:Date.now()-r};if(o==="win32"&&typeof e.pid=="number")a(e.pid);else try{e.kill("SIGTERM")}catch{}if(await ul(e,i))return{signal:"SIGTERM",elapsedMs:Date.now()-r};if(o!=="win32")try{e.kill("SIGKILL")}catch{}return await ul(e,nN)?{signal:"SIGKILL",elapsedMs:Date.now()-r}:{signal:"abandoned",elapsedMs:Date.now()-r}}var nN,ci=T(()=>{"use strict";nN=1e3});function Qm(e){ce()&&Ae({event:"legacy",msg:`[debug] ${e}`},{always:!0})}function sr(e,t){let r=oN[e];if(r)return r[t]??r.yolo}function lN(e,t){if(t.length===0)return!0;for(let r=0;r+t.length<=e.length;r++){let n=!0;for(let s=0;s<t.length;s++)if(e[r+s]!==t[s]){n=!1;break}if(n)return!0}return!1}function at(e,t,r="yolo"){if(aN.has(e)){Qm(`YOLO ${e} [mode=${r}]: ${e==="codex"?`JSON-RPC params (approvalPolicy=never, sandbox=${r==="plan"?"read-only":"danger-full-access"})`:e==="opencode"?".opencode/opencode.json (permission=allow)":"protocol/config (out-of-band)"} \u2014 no argv flag`);return}let n=r==="plan"?sr(e,"plan"):iN[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(!lN(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)}Qm(`YOLO ${e} [mode=${r}]: argv flag '${n.join(" ")}'`)}var iN,oN,aN,zr=T(()=>{"use strict";Yr();he();iN={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"],gemini:["-y"],copilot:["--yolo"],agy:["--dangerously-skip-permissions"],lmplayer:["--dangerously-skip-permissions"]},oN={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"]}};aN=new Set(["codex","opencode"])});function ep(e){if(e.length===0)return"";if(e.length===1)return e[0];let t=[];for(let r=0;r<e.length;r++)r===0?t.push(e[r]):t.push(`
1361
1361
 
1362
1362
  --- additional response (turn ${r+1} of ${e.length}; likely an injected mid-call notification) ---
1363
1363
 
@@ -1365,49 +1365,49 @@ var _k=Object.defineProperty;var T=(e,t)=>()=>(e&&(t=e(e=0)),t);var ye=(e,t)=>{f
1365
1365
  One possible cause: the provider stream ended before a complete response was delivered; for Claude Code this can appear as "API Error: Stream idle timeout - partial response received".`;return t?`Original provider error:
1366
1366
  ${t}
1367
1367
 
1368
- ${r}`:r}function rp(e,t){return new Promise((r,n)=>{let s=t.tool||"claude",i=t.binaryPath||uN[s]||"claude",o=["-p","","--output-format","stream-json","--input-format","stream-json"];s==="claude"&&o.push("--verbose"),t.sessionId&&o.push("--resume",t.sessionId),t.model&&o.push("--model",t.model);let a=t.permissionMode??"yolo",l=sr(s,a)??mN[s]??["--dangerously-skip-permissions"];o.push(...l);try{at(s,o,a)}catch(g){return n(g)}if(t.cwd&&!dN(t.cwd))return V({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${t.cwd}`,elapsed_ms:0}),n(new Se(`sessiondir missing: ${t.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=cN(i,o,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:Be(t.env,t.cwd,t.sessionId)}),d=!1;if(t.signal){if(t.signal.aborted)return d=!0,V({event:"transport_abort",provider:s,phase:"pre_spawn"}),ot(c).catch(()=>{}),n(new Error("Aborted"));t.signal.addEventListener("abort",()=>{d=!0,V({event:"transport_abort",provider:s}),ot(c).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let u=ml({onEvent:t.onEvent,onText:t.onText}),f="";function m(g){let h=u.sawResult();u.processLine(g),!h&&u.sawResult()&&c.stdin?.end()}c.stdout?.on("data",g=>{f+=g.toString();let h=f.split(`
1369
- `);f=h.pop()||"";for(let S of h)m(S)});let p="";c.stderr?.on("data",g=>{p+=g.toString()}),c.on("error",g=>{V({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:g.message}),n(new Se(`Failed to spawn ${i}: ${g.message}`,{cause:g}))}),c.on("exit",g=>{if(d)return;f.trim()&&m(f);let h=u.finalize();h?(wt(`stream-json: result ${h.result.slice(0,80)}${h.result.length>80?"...":""} (${h.durationMs}ms)`),r({...h,exitCode:g})):(V({event:"transport_error",provider:s,error_class:"Error",reason:"provider_no_result",exit_code:g,stderr_tail:p.slice(0,500)}),n(new Error(fN({tool:s,exitCode:g,stderr:p}))))});let _=JSON.stringify({type:"user",message:{role:"user",content:e}});c.stdin?.write(_+`
1370
- `),wt(`stream-json: prompt sent (${e.length} chars)`)})}var uN,mN,np=T(()=>{"use strict";Yr();li();zr();we();it();pl();pl();uN={claude:"claude",qwen:"qwen"};mN={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"]}});function ci(e={}){return[]}var _l=T(()=>{"use strict"});function hl(e){return e==="plan"?"read-only":"danger-full-access"}function sp(e="0.0.0"){return{clientInfo:{name:"lmctl",title:"lmctl",version:e},capabilities:{experimentalApi:!1}}}function gl(){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 yl(e){for(let[,t]of e.agentItems.entries())t.phase!=="commentary"&&t.buffer&&(e.resultText+=t.buffer);e.agentItems.clear()}function ip(e){let t=e.params,r=t?.error,n=typeof r?.message=="string"?r.message:void 0,s=n&&n.length>0?n:"(no message)";return t?.willRetry===!0?{willRetry:!0}:{willRetry:!1,turnError:new Error(`Turn errored: ${s}`)}}function wl(){return{pendingCodexError:null}}function El(e,t){let r=ip(e);return r.willRetry||(t.pendingCodexError=r.turnError),r}function Tl(e,t){if(t.pendingCodexError){let i=t.pendingCodexError;return t.pendingCodexError=null,{shouldReject:!0,turnError:i}}let n=e.params?.turn;if((typeof n?.status=="string"?n.status:void 0)==="failed"){let i=n?.error,o=typeof i?.message=="string"?i.message:void 0,a=o&&o.length>0?o:"(no message)";return{shouldReject:!0,turnError:new Error(`Turn errored: ${a}`)}}return{shouldReject:!1}}var bl=T(()=>{"use strict"});import{spawn as pN}from"node:child_process";import{createInterface as _N}from"node:readline";import{existsSync as hN,readFileSync as gN}from"node:fs";import{fileURLToPath as yN}from"node:url";function EN(){return sp(wN)}function ir(e,t){wt(`[codex:${e}] ${JSON.stringify(t)}`)}function TN(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 rp(e,t){return new Promise((r,n)=>{let s=t.tool||"claude",i=t.binaryPath||uN[s]||"claude",o=["-p","","--output-format","stream-json","--input-format","stream-json"];s==="claude"&&o.push("--verbose"),t.sessionId&&o.push("--resume",t.sessionId),t.model&&o.push("--model",t.model);let a=t.permissionMode??"yolo",l=sr(s,a)??mN[s]??["--dangerously-skip-permissions"];o.push(...l);try{at(s,o,a)}catch(g){return n(g)}if(t.cwd&&!dN(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=cN(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"}),ot(c).catch(()=>{}),n(new Error("Aborted"));t.signal.addEventListener("abort",()=>{d=!0,H({event:"transport_abort",provider:s}),ot(c).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let u=ml({onEvent:t.onEvent,onText:t.onText}),f="";function m(g){let h=u.sawResult();u.processLine(g),!h&&u.sawResult()&&c.stdin?.end()}c.stdout?.on("data",g=>{f+=g.toString();let h=f.split(`
1369
+ `);f=h.pop()||"";for(let S of h)m(S)});let p="";c.stderr?.on("data",g=>{p+=g.toString()}),c.on("error",g=>{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 h=u.finalize();h?(wt(`stream-json: result ${h.result.slice(0,80)}${h.result.length>80?"...":""} (${h.durationMs}ms)`),r({...h,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(fN({tool:s,exitCode:g,stderr:p}))))});let _=JSON.stringify({type:"user",message:{role:"user",content:e}});c.stdin?.write(_+`
1370
+ `),wt(`stream-json: prompt sent (${e.length} chars)`)})}var uN,mN,np=T(()=>{"use strict";Yr();ci();zr();he();it();pl();pl();uN={claude:"claude",qwen:"qwen"};mN={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"]}});function di(e={}){return[]}var _l=T(()=>{"use strict"});function hl(e){return e==="plan"?"read-only":"danger-full-access"}function sp(e="0.0.0"){return{clientInfo:{name:"lmctl",title:"lmctl",version:e},capabilities:{experimentalApi:!1}}}function gl(){return{agentItems:new Map,resultText:""}}function ui(e,t,r,n){let s=e.method;if(!s)return!1;let i=e.params;if(s==="turn/started")return t.agentItems.clear(),t.resultText="",!1;if(s==="item/started"){let o=i?.item;if(o?.type==="agentMessage"&&typeof o.id=="string"){let a=typeof o.phase=="string"?o.phase:void 0,l=a==="commentary"||a==="final_answer"?a:void 0;return t.agentItems.set(o.id,{phase:l,buffer:""}),!0}return!1}if(s==="item/agentMessage/delta"){let o=i?.delta||"",a=typeof i?.itemId=="string"?i.itemId:void 0;if(!o)return!0;let l=a?t.agentItems.get(a):void 0;return l?(l.phase==="commentary"||(l.buffer+=o),r?.(o),l.phase&&i&&(i._lmctlItemPhase=l.phase)):(t.resultText+=o,r?.(o)),!0}if(s==="item/completed"){let o=i?.item;if(o?.type==="agentMessage"&&typeof o.id=="string"){let a=t.agentItems.get(o.id);if(a){if(a.phase!=="commentary"){let l=typeof o.text=="string"?o.text:a.buffer;if(n&&typeof o.text=="string"&&o.text!==a.buffer){let c=typeof i?.threadId=="string"?i.threadId:void 0,d=typeof i?.turnId=="string"?i.turnId:void 0;n({itemId:o.id,threadId:c,turnId:d,expectedFromItemText:o.text,gotFromBuffer:a.buffer})}t.resultText+=l}t.agentItems.delete(o.id)}return!0}return!1}return!1}function yl(e){for(let[,t]of e.agentItems.entries())t.phase!=="commentary"&&t.buffer&&(e.resultText+=t.buffer);e.agentItems.clear()}function ip(e){let t=e.params,r=t?.error,n=typeof r?.message=="string"?r.message:void 0,s=n&&n.length>0?n:"(no message)";return t?.willRetry===!0?{willRetry:!0}:{willRetry:!1,turnError:new Error(`Turn errored: ${s}`)}}function wl(){return{pendingCodexError:null}}function El(e,t){let r=ip(e);return r.willRetry||(t.pendingCodexError=r.turnError),r}function Tl(e,t){if(t.pendingCodexError){let i=t.pendingCodexError;return t.pendingCodexError=null,{shouldReject:!0,turnError:i}}let n=e.params?.turn;if((typeof n?.status=="string"?n.status:void 0)==="failed"){let i=n?.error,o=typeof i?.message=="string"?i.message:void 0,a=o&&o.length>0?o:"(no message)";return{shouldReject:!0,turnError:new Error(`Turn errored: ${a}`)}}return{shouldReject:!1}}var bl=T(()=>{"use strict"});import{spawn as pN}from"node:child_process";import{createInterface as _N}from"node:readline";import{existsSync as hN,readFileSync as gN}from"node:fs";import{fileURLToPath as yN}from"node:url";function EN(){return sp(wN)}function ir(e,t){wt(`[codex:${e}] ${JSON.stringify(t)}`)}function TN(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 op(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=hl(l);try{at("codex",i,l)}catch(W){return n(W)}if(t.cwd&&!hN(t.cwd))return V({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:`sessiondir missing: ${t.cwd}`}),n(new Se(`sessiondir missing: ${t.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let d=pN(s,i,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:Be(t.env,t.cwd,t.threadId)}),u=!1;if(t.signal){if(t.signal.aborted)return u=!0,V({event:"transport_abort",provider:"codex",phase:"pre_spawn"}),ot(d).catch(()=>{}),n(new Error("Aborted"));t.signal.addEventListener("abort",()=>{u=!0,V({event:"transport_abort",provider:"codex"}),ot(d).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let f=_N({input:d.stdout}),m=new Map,p=1,_=t.threadId||"",g="",h=!1,S=!1,y=Date.now(),w=gl(),I=wl();function x(W,M={}){return new Promise((A,Q)=>{let B=p++;m.set(B,{resolve:A,reject:Q});let k=JSON.stringify({jsonrpc:"2.0",id:B,method:W,params:M});d.stdin?.write(k+`
1374
+ ${r}`:r}function op(e,t){return new Promise((r,n)=>{let s=t.binaryPath||"codex",i=["app-server","--listen","stdio://"];t.model&&i.push("-c",`model=${JSON.stringify(t.model)}`);let o=t.isLead??t.alias?.toLowerCase()==="lead",a=o?di():[];i.push(...a),ce()&&Oe(JSON.stringify({event:"codex_mcp_inject",alias:t.alias??null,isLead:o,injected:a.length>0}));let l=t.permissionMode??"yolo",c=hl(l);try{at("codex",i,l)}catch(W){return n(W)}if(t.cwd&&!hN(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=pN(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"}),ot(d).catch(()=>{}),n(new Error("Aborted"));t.signal.addEventListener("abort",()=>{u=!0,H({event:"transport_abort",provider:"codex"}),ot(d).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let f=_N({input:d.stdout}),m=new Map,p=1,_=t.threadId||"",g="",h=!1,S=!1,y=Date.now(),w=gl(),I=wl();function x(W,M={}){return new Promise((A,Q)=>{let B=p++;m.set(B,{resolve:A,reject:Q});let k=JSON.stringify({jsonrpc:"2.0",id:B,method:W,params:M});d.stdin?.write(k+`
1375
1375
  `)})}function U(W,M={}){let A=JSON.stringify({jsonrpc:"2.0",method:W,params:M});d.stdin?.write(A+`
1376
- `)}f.on("line",W=>{let M;try{M=JSON.parse(W)}catch{return}if(typeof M.id=="number"&&m.has(M.id)){let B=m.get(M.id);if(m.delete(M.id),M.error){let k=M.error,N=typeof k?.message=="string"&&k.message.length>0?k.message:JSON.stringify(M.error);B.reject(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&&(_=k.id)}let Q=ce()?B=>{ir("item.text/buffer-mismatch",{itemId:B.itemId,threadId:B.threadId??null,turnId:B.turnId??null,expectedFromItemText:B.expectedFromItemText,gotFromBuffer:B.gotFromBuffer,expectedLen:B.expectedFromItemText.length,gotLen:B.gotFromBuffer.length})}:void 0;if(A==="turn/started"){let B=M.params,k=B?.turn;k?.id&&(g=k.id),di(M,w,t.onDelta,Q),ce()&&ir("turn/started",{params:B??null})}if(ce()&&(A==="item/started"||A==="item/completed")){let B=M.params;B?.item?.type==="agentMessage"&&ir(A,{params:B??null})}if(A==="item/started"||A==="item/agentMessage/delta"||A==="item/completed"){if(A==="item/agentMessage/delta"){let B=M.params;ce()&&ir("agentMessage/delta",{params:B??null})}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&&ir("turn/completed/unflushed-item",{itemId:N,phase:L.phase,bufferLen:L.buffer.length});yl(w),ce()&&ir("turn/completed",{params:B??null});let k=Tl(M,I);k.shouldReject?(ce()&&ir("turn/completed/terminal-reject",{message:k.turnError.message}),S=!0,h=!0,d.stdin?.end(),n(k.turnError)):(h=!0,d.stdin?.end())}if(A==="error"){let B=El(M,I);if(ce()){let k=M.params,N=k?.error,L=typeof N?.message=="string"?N.message:"(no message)";ir(B.willRetry?"error/retry":"error/terminal-deferred",{message:L,willRetry:B.willRetry,params:k??null})}}t.onEvent?.(M)});let ue="";d.stderr?.on("data",W=>{ue+=W.toString()}),d.on("error",W=>{V({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:W.message}),n(new Se(`Failed to spawn codex app-server: ${W.message}`,{cause:W}))}),d.on("exit",W=>{if(!u&&!S){if(h){r({result:w.resultText,threadId:_,turnId:g,durationMs:Date.now()-y,exitCode:W});return}if(I.pendingCodexError){n(I.pendingCodexError);return}V({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:W,stderr_tail:ue.slice(0,500)}),n(new Error(TN({exitCode:W,stderr:ue})))}}),(async()=>{try{if(await x("initialize",EN()),U("initialized",{}),t.threadId)try{let W=x("thread/resume",{threadId:t.threadId,sandbox:c,approvalPolicy:"never",...t.model?{model:t.model}:{}}),M=new Promise((A,Q)=>setTimeout(()=>Q(new Error("resume timeout")),5e3));await Promise.race([W,M]),_=t.threadId}catch{process.stderr.write(`[codex] thread/resume failed, creating new thread
1377
- `);let M=(await x("thread/start",{cwd:t.cwd,approvalPolicy:"never",sandbox:c,...t.model?{model:t.model}:{}})).result?.thread;M?.id&&(_=M.id)}else{let M=(await x("thread/start",{cwd:t.cwd,approvalPolicy:"never",sandbox:c,...t.model?{model:t.model}:{}})).result?.thread;M?.id&&(_=M.id)}await x("turn/start",{threadId:_,input:[{type:"text",text:e}],...t.model?{model:t.model}:{}})}catch(W){ot(d).catch(()=>{}),n(W instanceof Error?W:new Error(String(W)))}})()})}var wN,ap=T(()=>{"use strict";we();we();Yr();li();zr();_l();we();it();bl();bl();wN=(()=>{try{let e=new URL("../../../package.json",import.meta.url),t=JSON.parse(gN(yN(e),"utf8"));return typeof t.version=="string"?t.version:"0.0.0"}catch{return"0.0.0"}})()});import{existsSync as dp,mkdirSync as bN,readFileSync as up,writeFileSync as lp}from"node:fs";import{join as Yn,resolve as SN}from"node:path";function fp(e){if(e==="allow")return!0;if(e&&typeof e=="object"&&!Array.isArray(e)){let t=Object.entries(e);if(t.length===1&&t[0][0]==="*"&&t[0][1]==="allow")return!0}return!1}function Sl(e,t,r={existsSync:dp,readFileSync:up}){let n=[];for(let s of e){if(s.provider.trim().toLowerCase()!=="opencode")continue;let i=SN(t,s.sessiondir??t);for(let o of vN(i)){let a=kN(o,r);a!==void 0&&Object.prototype.hasOwnProperty.call(a,"permission")&&(fp(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 vN(e){return[Yn(e,".opencode","opencode.jsonc"),Yn(e,"opencode.jsonc"),Yn(e,"opencode.json")]}function kN(e,t){try{if(!t.existsSync(e))return;let r=t.readFileSync(e,"utf-8"),n=JSON.parse(IN(r));return n===null||typeof n!="object"||Array.isArray(n)?void 0:n}catch{return}}function IN(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=Yn(e,".opencode"),n=Yn(r,"opencode.json");if(!dp(n)){bN(r,{recursive:!0});let o=JSON.stringify({permission:"allow"},null,2);return lp(n,o+`
1379
- `,"utf-8"),!0}let s;try{s=JSON.parse(up(n,"utf-8"))}catch{return console.log(cp.yellow(` .opencode/opencode.json at ${n} is malformed \u2014 skipping opencode config install.`)),!1}if(typeof s!="object"||s===null)return console.log(cp.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),fp(s.permission)||V({event:"opencode_yolo_override",provider:"opencode",config_path:n,user_permission:s.permission,message:`opencode.json has a user-set 'permission' value other than 'allow' \u2014 lmctl's YOLO contract is NOT in effect; turns may hang waiting on permission prompts. Set permission: "allow" or remove the key to restore YOLO.`}),i&&lp(n,JSON.stringify(s,null,2)+`
1380
- `,"utf-8"),i}var cp,fi=T(()=>{"use strict";we();cp={yellow:e=>e}});function _p(e){let t=[...e.matchAll(NN)];if(t.length>0){let r=t[t.length-1],n=(r.index??0)+r[0].length;return mp(e.slice(n).trimStart())}return mp(ON(e.replace(xN,"")))}function ON(e){let t=AN.exec(e);if(t===null)return e;let r=e.slice(t[0].length),n=[...r.matchAll(RN)];if(n.length<2)return e;let s=n[0],i=(s.index??0)+s[0].length;return r.slice(i).trimStart()}function mp(e){let t=[...e.matchAll(LN)];if(t.length===0)return e;let r=t[t.length-1],n=(r.index??0)+r[0].length;return e.slice(n).trimStart()}function zn(e,t=""){let r=e.result;return typeof r?.sessionId=="string"&&r.sessionId.length>0?r.sessionId:t}function hp(e){let t=e.result;return typeof t?.stopReason=="string"?t.stopReason:""}function vl(e={}){let t="",r="",n="",s=!1,i=!1,o=()=>({result:e.tool==="gemini"?_p(r):r,sessionId:t,stopReason:n});return{setSessionId(a){t=a},beginTurn(){r="",n="",s=!1,i=!0},completeTurn(a){return n=hp(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 pp,NN,xN,AN,RN,LN,kl=T(()=>{"use strict";pp="(?:png|jpe?g|webp|heic|pdf)",NN=new RegExp(`\\bSTANCE:\\s*\\S+_\\d{6,}\\.${pp}\\s*`,"gi"),xN=new RegExp(`^ACK:\\s*waiting for explicit lmctl task\\.\\d{6,}\\.${pp}\\s*`,"i"),AN=/^ACK:\s*waiting for explicit lmctl task[._]?\s*/i,RN=/^STANCE:\s+\S+\s*$/gim,LN=/\[Thought:\s*true\]\s*/gi});import{spawn as $N}from"node:child_process";import{existsSync as CN}from"node:fs";import{createInterface as MN}from"node:readline";function jN(e){let t=e.stderr.trim().slice(0,500),r=`lmctl: ${e.tool} ACP process exited with code ${e.exitCode} before completing the prompt.
1376
+ `)}f.on("line",W=>{let M;try{M=JSON.parse(W)}catch{return}if(typeof M.id=="number"&&m.has(M.id)){let B=m.get(M.id);if(m.delete(M.id),M.error){let k=M.error,N=typeof k?.message=="string"&&k.message.length>0?k.message:JSON.stringify(M.error);B.reject(li(`codex app-server error: ${N}`,k))}else B.resolve(M);t.onEvent?.(M);return}let A=M.method;if(!A){t.onEvent?.(M);return}if(A==="thread/started"){let k=M.params?.thread;k?.id&&(_=k.id)}let Q=ce()?B=>{ir("item.text/buffer-mismatch",{itemId:B.itemId,threadId:B.threadId??null,turnId:B.turnId??null,expectedFromItemText:B.expectedFromItemText,gotFromBuffer:B.gotFromBuffer,expectedLen:B.expectedFromItemText.length,gotLen:B.gotFromBuffer.length})}:void 0;if(A==="turn/started"){let B=M.params,k=B?.turn;k?.id&&(g=k.id),ui(M,w,t.onDelta,Q),ce()&&ir("turn/started",{params:B??null})}if(ce()&&(A==="item/started"||A==="item/completed")){let B=M.params;B?.item?.type==="agentMessage"&&ir(A,{params:B??null})}if(A==="item/started"||A==="item/agentMessage/delta"||A==="item/completed"){if(A==="item/agentMessage/delta"){let B=M.params;ce()&&ir("agentMessage/delta",{params:B??null})}ui(M,w,t.onDelta,Q)}if(A==="turn/completed"){let B=M.params;if(ce())for(let[N,L]of w.agentItems.entries())L.buffer&&ir("turn/completed/unflushed-item",{itemId:N,phase:L.phase,bufferLen:L.buffer.length});yl(w),ce()&&ir("turn/completed",{params:B??null});let k=Tl(M,I);k.shouldReject?(ce()&&ir("turn/completed/terminal-reject",{message:k.turnError.message}),S=!0,h=!0,d.stdin?.end(),n(k.turnError)):(h=!0,d.stdin?.end())}if(A==="error"){let B=El(M,I);if(ce()){let k=M.params,N=k?.error,L=typeof N?.message=="string"?N.message:"(no message)";ir(B.willRetry?"error/retry":"error/terminal-deferred",{message:L,willRetry:B.willRetry,params:k??null})}}t.onEvent?.(M)});let ue="";d.stderr?.on("data",W=>{ue+=W.toString()}),d.on("error",W=>{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(h){r({result:w.resultText,threadId:_,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(TN({exitCode:W,stderr:ue})))}}),(async()=>{try{if(await x("initialize",EN()),U("initialized",{}),t.threadId)try{let W=x("thread/resume",{threadId:t.threadId,sandbox:c,approvalPolicy:"never",...t.model?{model:t.model}:{}}),M=new Promise((A,Q)=>setTimeout(()=>Q(new Error("resume timeout")),5e3));await Promise.race([W,M]),_=t.threadId}catch{process.stderr.write(`[codex] thread/resume failed, creating new thread
1377
+ `);let M=(await x("thread/start",{cwd:t.cwd,approvalPolicy:"never",sandbox:c,...t.model?{model:t.model}:{}})).result?.thread;M?.id&&(_=M.id)}else{let M=(await x("thread/start",{cwd:t.cwd,approvalPolicy:"never",sandbox:c,...t.model?{model:t.model}:{}})).result?.thread;M?.id&&(_=M.id)}await x("turn/start",{threadId:_,input:[{type:"text",text:e}],...t.model?{model:t.model}:{}})}catch(W){ot(d).catch(()=>{}),n(W instanceof Error?W:new Error(String(W)))}})()})}var wN,ap=T(()=>{"use strict";he();he();Yr();ci();zr();_l();he();it();bl();bl();wN=(()=>{try{let e=new URL("../../../package.json",import.meta.url),t=JSON.parse(gN(yN(e),"utf8"));return typeof t.version=="string"?t.version:"0.0.0"}catch{return"0.0.0"}})()});import{existsSync as dp,mkdirSync as bN,readFileSync as up,writeFileSync as lp}from"node:fs";import{join as Yn,resolve as SN}from"node:path";function fp(e){if(e==="allow")return!0;if(e&&typeof e=="object"&&!Array.isArray(e)){let t=Object.entries(e);if(t.length===1&&t[0][0]==="*"&&t[0][1]==="allow")return!0}return!1}function Sl(e,t,r={existsSync:dp,readFileSync:up}){let n=[];for(let s of e){if(s.provider.trim().toLowerCase()!=="opencode")continue;let i=SN(t,s.sessiondir??t);for(let o of vN(i)){let a=kN(o,r);a!==void 0&&Object.prototype.hasOwnProperty.call(a,"permission")&&(fp(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 vN(e){return[Yn(e,".opencode","opencode.jsonc"),Yn(e,"opencode.jsonc"),Yn(e,"opencode.json")]}function kN(e,t){try{if(!t.existsSync(e))return;let r=t.readFileSync(e,"utf-8"),n=JSON.parse(IN(r));return n===null||typeof n!="object"||Array.isArray(n)?void 0:n}catch{return}}function IN(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 fi(e,t={}){let r=Yn(e,".opencode"),n=Yn(r,"opencode.json");if(!dp(n)){bN(r,{recursive:!0});let o=JSON.stringify({permission:"allow"},null,2);return lp(n,o+`
1379
+ `,"utf-8"),!0}let s;try{s=JSON.parse(up(n,"utf-8"))}catch{return console.log(cp.yellow(` .opencode/opencode.json at ${n} is malformed \u2014 skipping opencode config install.`)),!1}if(typeof s!="object"||s===null)return console.log(cp.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),fp(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&&lp(n,JSON.stringify(s,null,2)+`
1380
+ `,"utf-8"),i}var cp,mi=T(()=>{"use strict";he();cp={yellow:e=>e}});function _p(e){let t=[...e.matchAll(NN)];if(t.length>0){let r=t[t.length-1],n=(r.index??0)+r[0].length;return mp(e.slice(n).trimStart())}return mp(ON(e.replace(xN,"")))}function ON(e){let t=AN.exec(e);if(t===null)return e;let r=e.slice(t[0].length),n=[...r.matchAll(RN)];if(n.length<2)return e;let s=n[0],i=(s.index??0)+s[0].length;return r.slice(i).trimStart()}function mp(e){let t=[...e.matchAll(LN)];if(t.length===0)return e;let r=t[t.length-1],n=(r.index??0)+r[0].length;return e.slice(n).trimStart()}function zn(e,t=""){let r=e.result;return typeof r?.sessionId=="string"&&r.sessionId.length>0?r.sessionId:t}function hp(e){let t=e.result;return typeof t?.stopReason=="string"?t.stopReason:""}function vl(e={}){let t="",r="",n="",s=!1,i=!1,o=()=>({result:e.tool==="gemini"?_p(r):r,sessionId:t,stopReason:n});return{setSessionId(a){t=a},beginTurn(){r="",n="",s=!1,i=!0},completeTurn(a){return n=hp(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 pp,NN,xN,AN,RN,LN,kl=T(()=>{"use strict";pp="(?:png|jpe?g|webp|heic|pdf)",NN=new RegExp(`\\bSTANCE:\\s*\\S+_\\d{6,}\\.${pp}\\s*`,"gi"),xN=new RegExp(`^ACK:\\s*waiting for explicit lmctl task\\.\\d{6,}\\.${pp}\\s*`,"i"),AN=/^ACK:\s*waiting for explicit lmctl task[._]?\s*/i,RN=/^STANCE:\s+\S+\s*$/gim,LN=/\[Thought:\s*true\]\s*/gi});import{spawn as $N}from"node:child_process";import{existsSync as CN}from"node:fs";import{createInterface as MN}from"node:readline";function jN(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 gp(e,t){let r=DN[t.tool];return r?new Promise((n,s)=>{let i=t.binaryPath||r.binary;if(t.tool==="opencode")try{ui(t.cwd)}catch(y){V({event:"opencode_config_install_failed",cwd:t.cwd,error_message:y instanceof Error?y.message:String(y)})}let o=t.permissionMode??"yolo",a=[...r.args];if(o==="plan")if(t.tool==="gemini"){let y=sr("gemini","plan"),w=sr("gemini","yolo");a=a.filter(I=>!(w??[]).includes(I)),y&&a.push(...y)}else t.tool==="copilot"&&process.stderr.write(`[acp] copilot has no plan-mode flag in --acp mode; --permission-mode plan is not honored (running yolo). See src/providers/yolo-contract.ts.
1384
+ ${r}`:r}function gp(e,t){let r=DN[t.tool];return r?new Promise((n,s)=>{let i=t.binaryPath||r.binary;if(t.tool==="opencode")try{fi(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=sr("gemini","plan"),w=sr("gemini","yolo");a=a.filter(I=>!(w??[]).includes(I)),y&&a.push(...y)}else t.tool==="copilot"&&process.stderr.write(`[acp] copilot has no plan-mode flag in --acp mode; --permission-mode plan is not honored (running yolo). See src/providers/yolo-contract.ts.
1385
1385
  `);t.model&&t.tool==="gemini"&&a.push("--model",t.model);let l=t.tool==="copilot"?"yolo":o;try{at(t.tool,a,l)}catch(y){return s(y)}if(t.model&&t.tool==="copilot"&&process.stderr.write(`[acp] copilot does not support per-session model selection in --acp mode (model="${t.model}" ignored). Set the default via copilot's /model slash command in an interactive \`lmctl terminal\` session.
1386
- `),t.cwd&&!CN(t.cwd))return V({event:"transport_error",provider:t.tool,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${t.cwd}`,elapsed_ms:0}),s(new Se(`sessiondir missing: ${t.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=$N(i,a,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:Be(t.env,t.cwd,t.sessionId)}),d=Date.now(),u=!1;if(t.signal){if(t.signal.aborted)return u=!0,V({event:"transport_abort",provider:t.tool,phase:"pre_spawn"}),ot(c).catch(()=>{}),s(new Error("Aborted"));t.signal.addEventListener("abort",()=>{u=!0,V({event:"transport_abort",provider:t.tool,elapsed_ms:Date.now()-d}),ot(c).catch(()=>{}),s(new Error("Aborted"))},{once:!0})}let f=MN({input:c.stdout}),m=new Map,p=t.sessionId||"",_=vl({tool:t.tool,onDelta:t.onDelta});_.setSessionId(p);function g(y,w={}){return new Promise((I,x)=>{let U=PN++;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
- `)})}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"){V({event:"acp_unhandled_request",provider:t.tool,method:I,id:w.id,params:w.params});let x=JSON.stringify({jsonrpc:"2.0",id:w.id,error:{code:-32601,message:`Method not found: ${I} (lmctl does not implement server-side ACP methods)`}});Ae({event:"acp_send",direction:"SEND",provider:t.tool,replyTo:w.id,error:"method not found"}),c.stdin?.write(x+`
1388
- `);return}_.processMessage(w)}});let h="";c.stderr?.on("data",y=>{h+=y.toString()}),c.on("error",y=>{V({event:"transport_error",provider:t.tool,error_class:"TransportConnectionError",error_message:y.message,elapsed_ms:Date.now()-d}),s(new Se(`Failed to spawn ${r.binary} ${r.args.join(" ")}: ${y.message}`,{cause:y}))}),c.on("exit",y=>{if(u)return;let w=_.finalize();w!==null?n({result:w.result,sessionId:w.sessionId,durationMs:Date.now()-d,stopReason:w.stopReason,exitCode:y}):(V({event:"transport_error",provider:t.tool,error_class:"Error",reason:"provider_no_result",exit_code:y,stderr_tail:h.slice(0,500),elapsed_ms:Date.now()-d}),s(new Error(jN({tool:t.tool,exitCode:y,stderr:h}))))});function S(y,w={}){let I=JSON.stringify({jsonrpc:"2.0",method:y,params:w});c.stdin?.write(I+`
1386
+ `),t.cwd&&!CN(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=$N(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"}),ot(c).catch(()=>{}),s(new Error("Aborted"));t.signal.addEventListener("abort",()=>{u=!0,H({event:"transport_abort",provider:t.tool,elapsed_ms:Date.now()-d}),ot(c).catch(()=>{}),s(new Error("Aborted"))},{once:!0})}let f=MN({input:c.stdout}),m=new Map,p=t.sessionId||"",_=vl({tool:t.tool,onDelta:t.onDelta});_.setSessionId(p);function g(y,w={}){return new Promise((I,x)=>{let U=PN++;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
+ `)})}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(li(`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}_.processMessage(w)}});let h="";c.stderr?.on("data",y=>{h+=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=_.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:h.slice(0,500),elapsed_ms:Date.now()-d}),s(new Error(jN({tool:t.tool,exitCode:y,stderr:h}))))});function S(y,w={}){let I=JSON.stringify({jsonrpc:"2.0",method:y,params:w});c.stdin?.write(I+`
1389
1389
  `)}(async()=>{try{if(await g("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),S("notifications/initialized"),t.sessionId)try{let I=await g("session/load",{sessionId:t.sessionId,cwd:t.cwd,mcpServers:[]});p=zn(I,t.sessionId),_.setSessionId(p)}catch(I){if(t.requireResume)throw new Error(`Cannot resume session ${t.sessionId} via ACP: ${I instanceof Error?I.message:String(I)}`);process.stderr.write(`[acp] session/load failed for ${t.sessionId}, creating new session
1390
1390
  `);let x=await g("session/new",{cwd:t.cwd,mcpServers:[]});p=zn(x),_.setSessionId(p)}else{let I=await g("session/new",{cwd:t.cwd,mcpServers:[]});p=zn(I),_.setSessionId(p)}if(t.model&&t.tool==="opencode")try{await g("session/set_config_option",{sessionId:p,configId:"model",value:t.model}),wt(`acp: set_config_option(model=${t.model}) ok`)}catch(I){let x=I instanceof Error?I.message:String(I);process.stderr.write(`[acp] set_config_option(model=${t.model}) failed: ${x}
1391
1391
  `)}if(t.effort&&t.tool==="opencode")try{await g("session/set_config_option",{sessionId:p,configId:"effort",value:t.effort}),wt(`acp: set_config_option(effort=${t.effort}) ok`)}catch(I){let x=I instanceof Error?I.message:String(I);process.stderr.write(`[acp] set_config_option(effort=${t.effort}) failed: ${x}
1392
- `)}_.beginTurn(),wt(`acp: prompt sent (${e.length} chars)`);let y=await g("session/prompt",{sessionId:p,prompt:[{type:"text",text:e}]}),w=_.completeTurn(y);wt(`acp: result received (${w.result.length} chars, stopReason=${w.stopReason})`),c.stdin?.end()}catch(y){ot(c).catch(()=>{}),s(y instanceof Error?y:new Error(String(y)))}})()}):Promise.reject(new Error(`No ACP config for tool "${t.tool}"`))}var DN,PN,yp=T(()=>{"use strict";we();Yr();li();zr();fi();we();it();kl();kl();DN={gemini:{binary:"gemini",args:["--acp","-y","--skip-trust"]},copilot:{binary:"copilot",args:["--acp","--yolo"]},opencode:{binary:"opencode",args:["acp"]}},PN=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 wp(e,t){return r=>{if(r.kind==="tool_use"&&typeof r.id=="string"){if(e.size>=FN){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 UN(){let e=new Map;return(t,r)=>{WN(t,wp(e,r))}}function WN(e,t){let r=e.type;if(r==="system"){let n=e.subtype;if(n==="api_retry"){let s=typeof e.attempt=="number"?e.attempt:void 0,i=typeof e.max_retries=="number"?e.max_retries:void 0,o=typeof e.error_status=="number"?e.error_status:void 0,a=typeof e.error=="string"?e.error:void 0,l=typeof e.retry_delay_ms=="number"?e.retry_delay_ms:void 0,c=[];s!==void 0&&c.push(i!==void 0?`attempt ${s}/${i}`:`attempt ${s}`),o!==void 0&&c.push(`HTTP ${o}`),l!==void 0&&c.push(`retry in ${Math.round(l/1e3)}s`),a&&c.push(pe(a,60));let d=c.length>0?c.join(", "):n;t({kind:"api_retry",summary:d});return}if(n==="api_error"){let s=typeof e.error_status=="number"?e.error_status:void 0,i=typeof e.error=="string"?e.error:void 0,o=["api_error"];s!==void 0&&o.push(`HTTP ${s}`),i&&o.push(pe(i,80)),t({kind:"other",summary:o.join(": "),raw:e});return}t({kind:"system",summary:n||"system",raw:e});return}if(r==="assistant"||r==="user"){let s=e.message?.content;if(!Array.isArray(s))return;for(let i of s){let o=i.type;if(o==="text"){let a=i.text||"";a&&t({kind:"text",summary:pe(a),raw:i})}else if(o==="tool_use"){let a=i.name||"tool",l=typeof i.id=="string"?i.id:void 0,c=i.input,d="";c&&(typeof c.command=="string"?d=c.command:typeof c.file_path=="string"?d=c.file_path:typeof c.path=="string"?d=c.path:typeof c.pattern=="string"?d=c.pattern:typeof c.url=="string"?d=c.url:d=pe(JSON.stringify(c))),t({kind:"tool_use",tool:a,summary:pe(d),id:l,raw:i})}else if(o==="thinking"){let a=i.thinking||"";t({kind:"thinking",summary:pe(a),raw:i})}else if(o==="tool_result"){let l=i.is_error===!0?"error":"ok",c=typeof i.tool_use_id=="string"?i.tool_use_id:void 0,d,u=i.content;if(typeof u=="string")d=`${u.split(`
1392
+ `)}_.beginTurn(),wt(`acp: prompt sent (${e.length} chars)`);let y=await g("session/prompt",{sessionId:p,prompt:[{type:"text",text:e}]}),w=_.completeTurn(y);wt(`acp: result received (${w.result.length} chars, stopReason=${w.stopReason})`),c.stdin?.end()}catch(y){ot(c).catch(()=>{}),s(y instanceof Error?y:new Error(String(y)))}})()}):Promise.reject(new Error(`No ACP config for tool "${t.tool}"`))}var DN,PN,yp=T(()=>{"use strict";he();Yr();ci();zr();mi();he();it();kl();kl();DN={gemini:{binary:"gemini",args:["--acp","-y","--skip-trust"]},copilot:{binary:"copilot",args:["--acp","--yolo"]},opencode:{binary:"opencode",args:["acp"]}},PN=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 wp(e,t){return r=>{if(r.kind==="tool_use"&&typeof r.id=="string"){if(e.size>=FN){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 UN(){let e=new Map;return(t,r)=>{WN(t,wp(e,r))}}function WN(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?UN():void 0,s=await rp(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 BN(){let e=new Map;return(t,r)=>{qN(t,wp(e,r))}}function qN(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?BN():void 0,s=await gp(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 HN(e,t){let r=e.method;if(!r)return;let n=e.params;if(r==="turn/started"){t({kind:"system",summary:"turn started"});return}if(r==="turn/completed"){t({kind:"system",summary:"turn completed"});return}if(r==="error"){let s=n?.error,i=typeof s?.message=="string"?s.message:void 0,o=i&&i.length>0?i:"(no message)",a=n?.willRetry===!0;t(a?{kind:"api_retry",summary:`codex retry: ${pe(o,120)}`}:{kind:"other",summary:`codex error: ${pe(o,120)}`});return}if(r==="item/started"||r==="item/completed"){let s=n?.item;if(!s)return;let i=s.type,o=r==="item/started";switch(i){case"commandExecution":{let a=typeof s.id=="string"?s.id:void 0,l=s.command,c=Array.isArray(l)?l.join(" "):typeof l=="string"?l:"";if(o)t({kind:"tool_use",tool:"Bash",summary:pe(c||"(command)"),id:a});else{let d=s.exitCode,u=s.status||"",f=typeof s.durationMs=="number"?s.durationMs:void 0,m=typeof d=="number"?`exit ${d}`:u||"done",p=[];typeof d=="number"?p.push(`exit ${d}`):u&&p.push(u),typeof f=="number"&&p.push(`${Math.round(f/1e3)}s`),t({kind:"tool_result",summary:p.join(", ")||"done",status:m,elapsedMs:f,id:a})}return}case"fileChange":{let a=typeof s.id=="string"?s.id:void 0;if(o){let l=s.changes,c=Array.isArray(l)?l.map(d=>d.path||"").filter(Boolean).join(", "):"";t({kind:"tool_use",tool:"FileChange",summary:pe(c||"(edit)"),id:a})}else{let l=s.status||"done";t({kind:"tool_result",summary:l,status:l,id:a})}return}case"mcpToolCall":{let a=typeof s.id=="string"?s.id:void 0,l=s.server||"mcp",c=s.tool||"tool";if(o)t({kind:"tool_use",tool:`${l}/${c}`,summary:"",id:a});else{let d=s.status||"done";t({kind:"tool_result",summary:d,status:d,id:a})}return}case"webSearch":{let a=typeof s.id=="string"?s.id:void 0;t(o?{kind:"tool_use",tool:"WebSearch",summary:pe(s.query||""),id:a}:{kind:"tool_result",summary:"done",status:"done",id:a});return}case"reasoning":{o&&t({kind:"thinking",summary:""});return}case"agentMessage":case"userMessage":return;default:{i&&t({kind:o?"tool_use":"tool_result",tool:i,summary:""});return}}}if(r==="item/agentMessage/delta"){let s=n?.delta||"";if(s){let i=typeof n?._lmctlItemPhase=="string"?n._lmctlItemPhase:void 0;t(i==="commentary"?{kind:"thinking",summary:pe(s)}:{kind:"text",summary:pe(s)})}return}if(r==="item/reasoning/summaryTextDelta"||r==="item/reasoning/textDelta"){let s=n?.delta||"";s&&t({kind:"thinking",summary:pe(s)});return}if(r==="item/commandExecution/outputDelta"){let s=(typeof n?.delta=="string"?n.delta:"")||"";if(s){let i=s.split(`
1394
+ `).length} lines, ${f.length} chars`)}t({kind:"tool_result",status:l,summary:d,id:c,raw:i})}else o&&t({kind:"other",summary:o,raw:i})}return}if(r==="result"){t({kind:"system",summary:"result",raw:e});return}}async function pi(e,t){let r=t.binary==="qwen"?"qwen":"claude",n=t.onProgress?UN():void 0,s=await rp(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 BN(){let e=new Map;return(t,r)=>{qN(t,wp(e,r))}}function qN(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?BN():void 0,s=await gp(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 HN(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 Ep(e,t){let r=await op(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=>HN(n,t.onProgress):void 0,signal:t.signal});return{text:r.result,sessionId:r.threadId,durationMs:r.durationMs}}var FN,Ir=T(()=>{"use strict";np();ap();yp();we();FN=256});function Nl(e){return new Il(e)}var Il,xl=T(()=>{"use strict";Jm();Ut();Ir();Tt();Il=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",he,"--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 JN,stat as Tp,unlink as XN}from"node:fs/promises";import{join as Zn,basename as GN}from"node:path";function VN(e,t,r){return`${e}|${t.toISOString()}|${r}`}function Qn(e,t,r){let n=VN(r.role,r.timestamp,r.content);t.has(n)||(t.add(n),e.push(r))}function bp(e,t){return t==="exec"||e==="codex_exec"?"codex exec":"codex"}function KN(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 Sp(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=KN(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,vp=T(()=>{"use strict";nr();_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 Tp(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 JN(t)}catch{return r}for(let s of n){let i=Zn(t,s),o=await Tp(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=GN(t,".jsonl"),n=r.match(/rollout-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}-(.+)$/);return n?n[1]:r}async extractSummary(t){let r=await Ce(t,30),n=await Ne(t),s=this.extractSessionIdFromFilename(t),i="",o,a,l,c,d,u,f;for(let p of r){if(p.type==="session_meta"&&p.payload&&(p.payload.id&&(s=p.payload.id),p.payload.cwd&&(i=p.payload.cwd),p.payload.cli_version&&(o=p.payload.cli_version),p.payload.timestamp&&(l=new Date(p.payload.timestamp)),p.payload.originator&&(u=p.payload.originator),p.payload.source&&(f=p.payload.source)),p.type==="turn_context"&&p.payload&&(p.payload.model&&(a=p.payload.model),!i&&p.payload.cwd&&(i=p.payload.cwd)),p.type==="event_msg"&&p.payload?.type==="user_message"){let _=p.payload.message||p.payload.text;_&&(c||(c=H(_.trim(),80)),d=H(_.trim(),80))}if(p.type==="response_item"&&p.payload?.type==="message"&&p.payload.role==="user"&&p.payload.content){let _=p.payload.content.find(g=>g.type==="input_text"&&typeof g.text=="string"&&g.text);typeof _?.text=="string"&&(c||(c=H(_.text.trim(),80)),d=H(_.text.trim(),80))}}if(!i)return null;let m=await Sp(t);return{provider:"codex",sessionId:s,cwd:i,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:o,startCommand:bp(u,f),firstUserMessage:c,lastUserMessage:d,messageCount:m.messageCount,filePath:t,totalInputTokens:m.totalInputTokens||void 0,totalCachedInputTokens:m.totalCachedInputTokens||void 0,totalOutputTokens:m.totalOutputTokens||void 0,totalReasoningOutputTokens:m.totalReasoningOutputTokens||void 0,lastInputTokens:m.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:m.lastTokenUsage,modelContextWindow:m.modelContextWindow}}async loadSession(t){let r=await this.resolveSessionFile(t);if(!r)return null;let n=await Ne(r),s=[],i="",o,a,l,c,d,u=t,f,m=new Set;for await(let _ of We(r)){let g=_.timestamp?new Date(_.timestamp):new Date;if(_.type==="session_meta"&&_.payload){_.payload.id&&(u=_.payload.id),_.payload.cwd&&(i=_.payload.cwd),_.payload.cli_version&&(o=_.payload.cli_version),_.payload.timestamp&&(l=new Date(_.payload.timestamp)),f=bp(_.payload.originator,_.payload.source);continue}if(_.type==="turn_context"&&_.payload){_.payload.model&&(a=_.payload.model),!i&&_.payload.cwd&&(i=_.payload.cwd);continue}if(_.type==="response_item"&&_.payload){let h=_.payload;if(h.type==="message"){if(h.role==="user"&&h.content){for(let S of h.content)if(S.type==="input_text"&&typeof S.text=="string"&&S.text){let y=S.text.trim();c||(c=H(y,80)),d=H(y,80),Qn(s,m,{role:"user",timestamp:g,content:fe(y)})}continue}if(h.role==="assistant"&&h.content){for(let S of h.content)S.type==="output_text"&&typeof S.text=="string"&&S.text&&Qn(s,m,{role:"assistant",timestamp:g,content:fe(S.text),model:a});continue}if(h.role!=="user"&&h.role!=="assistant"&&h.content){for(let S of h.content)(S.type==="input_text"||S.type==="output_text")&&typeof S.text=="string"&&S.text&&Qn(s,m,{role:"system",timestamp:g,content:fe(S.text.trim())});continue}}if(h.type==="function_call"){s.push({role:"tool_use",timestamp:g,content:h.name||"unknown tool",toolName:h.name,toolInput:h.arguments!==void 0?fe(pi(h.arguments)):void 0,toolCallId:h.call_id});continue}if(h.type==="function_call_output"){s.push({role:"tool_result",timestamp:g,content:fe(pi(h.output)),toolCallId:h.call_id});continue}if(h.type==="reasoning"&&h.summary){let S=h.summary.map(y=>pi(y.text)).join(`
1398
- `);S.trim()&&Qn(s,m,{role:"thinking",timestamp:g,content:fe(S)});continue}}if(_.type==="event_msg"&&_.payload&&_.payload.type==="agent_reasoning"){let h=_.payload.message||_.payload.text;h&&Qn(s,m,{role:"thinking",timestamp:g,content:fe(h)})}}if(!i)return null;let p=await Sp(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 XN(r),!0):!1}async resolveSessionFile(t){let r=await this.getSessionsDirs(),n=[];for(let i of r){let o=await this.findSessionFiles(i);n.push(...o)}for(let i of n)if(this.extractSessionIdFromFilename(i)===t)return i;let s=[];for(let i of n)this.extractSessionIdFromFilename(i).startsWith(t)&&s.push(i);if(s.length===1)return s[0];for(let i of n){let o=await Ce(i,1);if(o.length>0&&o[0].type==="session_meta"){let a=o[0].payload?.id;if(a===t||a&&a.startsWith(t))return i}}return null}}});function Rl(e){return new Al(e)}var Al,Ll=T(()=>{"use strict";vp();Ut();Ir();Tt();Al=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:`${he}
1399
- `,resumeTemplate:"codex resume {{session_id}}",startTemplate:"codex",transport:Ep})}seedArgsFor(t){let r=super.seedArgsFor(t);return t?.model?[...r.slice(0,-1),"--model",t.model,r[r.length-1]]:r}}});function es(e){if(!e.trim())return"unknown";let t=e.split(/\r?\n/).filter(n=>n.trim().length>0);if(t.length>1)try{let n=JSON.parse(t[0]);if(n!==null&&typeof n=="object"&&!Array.isArray(n)&&"kind"in n)return"jsonl"}catch{}let r;try{r=JSON.parse(e)}catch{return"unknown"}if(r!==null&&typeof r=="object"&&!Array.isArray(r)){let n=r;if(Array.isArray(n.messages))return"json";if("kind"in n)return"jsonl"}return"unknown"}function hi(e){let t=es(e);if(t==="unknown")throw new Error("gemini session content matches neither known format (old .json with messages[] or new .jsonl with kind metadata)");if(t==="json"){let a=JSON.parse(e);return{sessionId:a.sessionId,projectHash:a.projectHash,startTime:a.startTime,lastUpdated:a.lastUpdated,kind:a.kind,messages:Array.isArray(a.messages)?a.messages:[]}}let r=e.split(`
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 Ep(e,t){let r=await op(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=>HN(n,t.onProgress):void 0,signal:t.signal});return{text:r.result,sessionId:r.threadId,durationMs:r.durationMs}}var FN,Ir=T(()=>{"use strict";np();ap();yp();he();FN=256});function Nl(e){return new Il(e)}var Il,xl=T(()=>{"use strict";Jm();Ut();Ir();Tt();Il=class extends xe{constructor(t){super({provider:new si(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"claude",seedArgs:["-p",ge,"--dangerously-skip-permissions"],resumeTemplate:"claude --resume {{session_id}}",startTemplate:"claude",transport:pi})}seedArgsFor(t){let r=super.seedArgsFor(t);return t?.model?[...r,"--model",t.model]:r}}});import{readdir as JN,stat as Tp,unlink as XN}from"node:fs/promises";import{join as Zn,basename as GN}from"node:path";function VN(e,t,r){return`${e}|${t.toISOString()}|${r}`}function Qn(e,t,r){let n=VN(r.role,r.timestamp,r.content);t.has(n)||(t.add(n),e.push(r))}function bp(e,t){return t==="exec"||e==="codex_exec"?"codex exec":"codex"}function KN(e){if(!e)return;let t=e.cached_input_tokens??e.cache_read_input_tokens;return{inputTokens:e.input_tokens,cachedInputTokens:t,outputTokens:e.output_tokens,reasoningOutputTokens:e.reasoning_output_tokens,totalTokens:e.total_tokens}}function _i(e){if(e==null)return"";if(typeof e=="string")return e;if(typeof e=="number"||typeof e=="boolean")return String(e);if(Array.isArray(e))return e.map(r=>{if(typeof r=="string")return r;if(r&&typeof r=="object"){let n=r;if(typeof n.text=="string")return n.text;if(typeof n.image_url=="string")return"[input_image]";if(typeof n.type=="string")return`[${n.type}]`}return _i(r)}).filter(r=>r.length>0).join(`
1397
+ `);try{return JSON.stringify(e)}catch{return String(e)}}async function Sp(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=KN(l.payload.info.last_token_usage);d&&(o=d),typeof l.payload.info.model_context_window=="number"&&(a=l.payload.info.model_context_window)}}return{messageCount:t,totalInputTokens:r,totalCachedInputTokens:n,totalOutputTokens:s,totalReasoningOutputTokens:i,lastTokenUsage:o,modelContextWindow:a}}var hi,vp=T(()=>{"use strict";nr();hi=class{name="codex";codexDirs;constructor(t={}){let r=[Zn(be,".codex"),Zn(be,".code")];if(t.codexDirs&&t.codexDirs.length>0){this.codexDirs=[...new Set(t.codexDirs)];return}let n=[t.codexDir||r[0],t.codeDir||r[1]];this.codexDirs=[...new Set(n)]}getWatchPaths(){return this.codexDirs.map(t=>({directory:Zn(t,"sessions"),filePattern:/\.jsonl$/}))}async getSessionsDirs(){let t=[];for(let r of this.codexDirs){let n=Zn(r,"sessions");try{await Tp(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 JN(t)}catch{return r}for(let s of n){let i=Zn(t,s),o=await Tp(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=GN(t,".jsonl"),n=r.match(/rollout-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}-(.+)$/);return n?n[1]:r}async extractSummary(t){let r=await Ce(t,30),n=await Ne(t),s=this.extractSessionIdFromFilename(t),i="",o,a,l,c,d,u,f;for(let p of r){if(p.type==="session_meta"&&p.payload&&(p.payload.id&&(s=p.payload.id),p.payload.cwd&&(i=p.payload.cwd),p.payload.cli_version&&(o=p.payload.cli_version),p.payload.timestamp&&(l=new Date(p.payload.timestamp)),p.payload.originator&&(u=p.payload.originator),p.payload.source&&(f=p.payload.source)),p.type==="turn_context"&&p.payload&&(p.payload.model&&(a=p.payload.model),!i&&p.payload.cwd&&(i=p.payload.cwd)),p.type==="event_msg"&&p.payload?.type==="user_message"){let _=p.payload.message||p.payload.text;_&&(c||(c=J(_.trim(),80)),d=J(_.trim(),80))}if(p.type==="response_item"&&p.payload?.type==="message"&&p.payload.role==="user"&&p.payload.content){let _=p.payload.content.find(g=>g.type==="input_text"&&typeof g.text=="string"&&g.text);typeof _?.text=="string"&&(c||(c=J(_.text.trim(),80)),d=J(_.text.trim(),80))}}if(!i)return null;let m=await Sp(t);return{provider:"codex",sessionId:s,cwd:i,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:o,startCommand:bp(u,f),firstUserMessage:c,lastUserMessage:d,messageCount:m.messageCount,filePath:t,totalInputTokens:m.totalInputTokens||void 0,totalCachedInputTokens:m.totalCachedInputTokens||void 0,totalOutputTokens:m.totalOutputTokens||void 0,totalReasoningOutputTokens:m.totalReasoningOutputTokens||void 0,lastInputTokens:m.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:m.lastTokenUsage,modelContextWindow:m.modelContextWindow}}async loadSession(t){let r=await this.resolveSessionFile(t);if(!r)return null;let n=await Ne(r),s=[],i="",o,a,l,c,d,u=t,f,m=new Set;for await(let _ of We(r)){let g=_.timestamp?new Date(_.timestamp):new Date;if(_.type==="session_meta"&&_.payload){_.payload.id&&(u=_.payload.id),_.payload.cwd&&(i=_.payload.cwd),_.payload.cli_version&&(o=_.payload.cli_version),_.payload.timestamp&&(l=new Date(_.payload.timestamp)),f=bp(_.payload.originator,_.payload.source);continue}if(_.type==="turn_context"&&_.payload){_.payload.model&&(a=_.payload.model),!i&&_.payload.cwd&&(i=_.payload.cwd);continue}if(_.type==="response_item"&&_.payload){let h=_.payload;if(h.type==="message"){if(h.role==="user"&&h.content){for(let S of h.content)if(S.type==="input_text"&&typeof S.text=="string"&&S.text){let y=S.text.trim();c||(c=J(y,80)),d=J(y,80),Qn(s,m,{role:"user",timestamp:g,content:fe(y)})}continue}if(h.role==="assistant"&&h.content){for(let S of h.content)S.type==="output_text"&&typeof S.text=="string"&&S.text&&Qn(s,m,{role:"assistant",timestamp:g,content:fe(S.text),model:a});continue}if(h.role!=="user"&&h.role!=="assistant"&&h.content){for(let S of h.content)(S.type==="input_text"||S.type==="output_text")&&typeof S.text=="string"&&S.text&&Qn(s,m,{role:"system",timestamp:g,content:fe(S.text.trim())});continue}}if(h.type==="function_call"){s.push({role:"tool_use",timestamp:g,content:h.name||"unknown tool",toolName:h.name,toolInput:h.arguments!==void 0?fe(_i(h.arguments)):void 0,toolCallId:h.call_id});continue}if(h.type==="function_call_output"){s.push({role:"tool_result",timestamp:g,content:fe(_i(h.output)),toolCallId:h.call_id});continue}if(h.type==="reasoning"&&h.summary){let S=h.summary.map(y=>_i(y.text)).join(`
1398
+ `);S.trim()&&Qn(s,m,{role:"thinking",timestamp:g,content:fe(S)});continue}}if(_.type==="event_msg"&&_.payload&&_.payload.type==="agent_reasoning"){let h=_.payload.message||_.payload.text;h&&Qn(s,m,{role:"thinking",timestamp:g,content:fe(h)})}}if(!i)return null;let p=await Sp(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 XN(r),!0):!1}async resolveSessionFile(t){let r=await this.getSessionsDirs(),n=[];for(let i of r){let o=await this.findSessionFiles(i);n.push(...o)}for(let i of n)if(this.extractSessionIdFromFilename(i)===t)return i;let s=[];for(let i of n)this.extractSessionIdFromFilename(i).startsWith(t)&&s.push(i);if(s.length===1)return s[0];for(let i of n){let o=await Ce(i,1);if(o.length>0&&o[0].type==="session_meta"){let a=o[0].payload?.id;if(a===t||a&&a.startsWith(t))return i}}return null}}});function Rl(e){return new Al(e)}var Al,Ll=T(()=>{"use strict";vp();Ut();Ir();Tt();Al=class extends xe{constructor(t){super({provider:new hi(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append"},binary:"codex",seedArgs:["exec","--dangerously-bypass-approvals-and-sandbox","--skip-git-repo-check","-"],seedStdin:`${ge}
1399
+ `,resumeTemplate:"codex resume {{session_id}}",startTemplate:"codex",transport:Ep})}seedArgsFor(t){let r=super.seedArgsFor(t);return t?.model?[...r.slice(0,-1),"--model",t.model,r[r.length-1]]:r}}});function es(e){if(!e.trim())return"unknown";let t=e.split(/\r?\n/).filter(n=>n.trim().length>0);if(t.length>1)try{let n=JSON.parse(t[0]);if(n!==null&&typeof n=="object"&&!Array.isArray(n)&&"kind"in n)return"jsonl"}catch{}let r;try{r=JSON.parse(e)}catch{return"unknown"}if(r!==null&&typeof r=="object"&&!Array.isArray(r)){let n=r;if(Array.isArray(n.messages))return"json";if("kind"in n)return"jsonl"}return"unknown"}function gi(e){let t=es(e);if(t==="unknown")throw new Error("gemini session content matches neither known format (old .json with messages[] or new .jsonl with kind metadata)");if(t==="json"){let a=JSON.parse(e);return{sessionId:a.sessionId,projectHash:a.projectHash,startTime:a.startTime,lastUpdated:a.lastUpdated,kind:a.kind,messages:Array.isArray(a.messages)?a.messages:[]}}let r=e.split(`
1400
1400
  `).map(a=>a).filter(a=>a.trim().length>0);if(r.length===0)throw new Error("gemini session file is empty");let n=r[0],s;try{s=JSON.parse(n)}catch(a){throw new Error(`gemini JSONL session: metadata line failed to parse: ${a instanceof Error?a.message:String(a)}`)}if(s===null||typeof s!="object")throw new Error("gemini JSONL session: metadata line is not an object");let i=[],o=new Map;for(let a=1;a<r.length;a++){let l;try{l=JSON.parse(r[a])}catch{continue}if(l===null||typeof l!="object")continue;let c=l;if("$set"in c&&c.$set&&typeof c.$set=="object"){Object.assign(s,c.$set);continue}if(typeof c.id=="string"||typeof c.type=="string"){let d=c;if(typeof d.id=="string"){let u=o.get(d.id);u?YN(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 YN(e,t){for(let[r,n]of Object.entries(t))if(n!==void 0){if(r==="tokens"&&kp(e.tokens)&&kp(n)){e.tokens={...e.tokens,...n};continue}e[r]=n}}function kp(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Ip(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 zN}from"node:crypto";import{readdir as ts,readFile as Np,stat as gi,unlink as ZN}from"node:fs/promises";import{join as Ge,basename as QN,dirname as e0}from"node:path";import{cwd as t0}from"node:process";function xp(e){return e?typeof e=="string"?e:Array.isArray(e)?e.map(t=>t.text||"").join(""):"":""}function Ap(e){return e==="user"}function $l(e){return e==="gemini"||e==="assistant"}function Nr(e,t=new Date(0)){if(!e)return t;let r=new Date(e);return Number.isNaN(r.getTime())?t:r}function r0(e){return`${e.sessionId}\0${e.cwd}`}function n0(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 Rp(e){let t=0,r=0,n=0,s=0,i=0,o;for(let a of e){if(!$l(a.type)||!a.tokens)continue;let l=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 s0(e){return zN("sha256").update(e).digest("hex")}function rs(e,t){let r=t;for(;r&&!e.has(r);){e.add(r);let n=e0(r);if(n===r)break;r=n}}var wi,Lp=T(()=>{"use strict";nr();Ol();we();wi=class{name="gemini";workspaceHashMap;geminiProjectsFile;geminiTmpDir;claudeProjectsDir;codexSessionDirs;extraWorkspacePaths;constructor(t={}){let r=t.geminiDir||Ge(be,".gemini");this.geminiProjectsFile=Ge(r,"projects.json"),this.geminiTmpDir=Ge(r,"tmp");let n=t.claudeDir||Ge(be,".claude");this.claudeProjectsDir=Ge(n,"projects");let s=[Ge(be,".codex"),Ge(be,".code")],i=t.codexDirs&&t.codexDirs.length>0?t.codexDirs:[t.codexDir||s[0],t.codeDir||s[1]];this.codexSessionDirs=[...new Set(i)].map(o=>Ge(o,"sessions")),this.extraWorkspacePaths=t.extraWorkspacePaths||[]}getWatchPaths(){return[{directory:this.geminiTmpDir,filePattern:/\.jsonl?$/}]}async discoverSessions(){let t=await this.findSessionFiles(),r=new Map;for(let n of t)try{let s=await this.extractSummary(n);if(!s)continue;let i=r0(s),o=r.get(i);r.set(i,o?n0(o,s):s)}catch{}return[...r.values()]}async loadSession(t){let r=await this.resolveSessionFile(t);if(!r)return null;let n;try{n=await this.readSessionFile(r)}catch{return null}if(!n)return null;let s=await Ne(r),i=[],o=n.messages||[],a=n.sessionId||this.extractSessionIdFromFilename(r),l=n.projectHash||"",c=await this.resolveWorkspace(l),d,u,f;for(let g of o){let h=Nr(g.timestamp),S=g.type,y=fe(xp(g.content));if(Ap(S)){let I=y.trim();I&&(d||(d=H(I,80)),u=H(I,80)),i.push({role:"user",timestamp:h,content:I||y});continue}if($l(S)){g.model&&(f=g.model);for(let I of g.thoughts||[]){let x=[I.subject,I.description].filter(Boolean).join(`
1403
- `).trim();x&&i.push({role:"thinking",timestamp:Nr(I.timestamp,h),content:fe(x)})}i.push({role:"assistant",timestamp:h,content:y,model:g.model});continue}let w=S?`[${S}] `:"";i.push({role:"system",timestamp:h,content:`${w}${y}`.trim()})}let m=Nr(n.startTime,s.createdAt),p=Nr(n.lastUpdated,s.modifiedAt),_=Rp(o);return{provider:"gemini",sessionId:a,cwd:c,createdAt:m,modifiedAt:p,model:f,startCommand:"gemini",firstUserMessage:d,lastUserMessage:u,messageCount:i.filter(g=>g.role==="user"||g.role==="assistant").length,filePath:r,totalInputTokens:_.totalInputTokens||void 0,totalCachedInputTokens:_.totalCachedInputTokens||void 0,totalOutputTokens:_.totalOutputTokens||void 0,totalReasoningOutputTokens:_.totalReasoningOutputTokens||void 0,lastInputTokens:_.lastInputTokens||void 0,lastTokenUsage:_.lastTokenUsage,messages:i}}async extractSummary(t){let r=await this.readSessionFile(t);if(!r)return null;let n=await Ne(t),s=r.messages||[],i=r.sessionId||this.extractSessionIdFromFilename(t),o=r.projectHash||"",a=await this.resolveWorkspace(o),l,c,d,u=0;for(let m of s)if(Ap(m.type)){u++;let p=xp(m.content).trim();p&&(l||(l=H(fe(p),80)),c=H(fe(p),80))}else $l(m.type)&&(u++,m.model&&(d=m.model));let f=Rp(s);return{provider:"gemini",sessionId:i,cwd:a,createdAt:Nr(r.startTime,n.createdAt),modifiedAt:Nr(r.lastUpdated,n.modifiedAt),model:d,startCommand:"gemini",firstUserMessage:l,lastUserMessage:c,messageCount:u,filePath:t,totalInputTokens:f.totalInputTokens||void 0,totalCachedInputTokens:f.totalCachedInputTokens||void 0,totalOutputTokens:f.totalOutputTokens||void 0,totalReasoningOutputTokens:f.totalReasoningOutputTokens||void 0,lastInputTokens:f.lastInputTokens||void 0,lastTokenUsage:f.lastTokenUsage}}async readSessionFile(t){let r=await Np(t,"utf-8");if(es(r)==="unknown")return V({event:"gemini_session_format_unknown",provider:"gemini",file:t,preview:r.slice(0,120),message:`gemini session file at ${t} matches neither old (.json with messages[]) nor new (.jsonl with kind metadata) format. Skipping; lmctl ls / audit / stats will not see this session.`}),null;try{return hi(r)}catch{return null}}extractSessionIdFromFilename(t){let r=QN(t).replace(/\.jsonl?$/,""),n=r.match(/session-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-(.+)$/);return n?n[1]:r}async findSessionFiles(){let t=[],r;try{r=await ts(this.geminiTmpDir)}catch{return t}for(let n of r){let s=Ge(this.geminiTmpDir,n,"chats");if(!(await gi(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await ts(s)}catch{continue}for(let a of o)a.startsWith("session-")&&(!a.endsWith(".json")&&!a.endsWith(".jsonl")||t.push(Ge(s,a)))}return t}async resolveSessionPath(t){return this.resolveSessionFile(t)}async deleteSession(t){let r=await this.resolveSessionFile(t);return r?(await 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:Nr(i?.lastUpdated,d.modifiedAt)})}return n.sort((s,i)=>{let o=i.modifiedAt.getTime()-s.modifiedAt.getTime();return o!==0?o:i.filePath.localeCompare(s.filePath)}),n[0]?.filePath??null}async resolveWorkspace(t){return t?(await this.getWorkspaceHashMap()).get(t)||`[hash:${t.slice(0,16)}]`:"(unknown workspace)"}async getWorkspaceHashMap(){if(this.workspaceHashMap)return this.workspaceHashMap;let t=new Set;rs(t,t0());for(let n of this.extraWorkspacePaths)rs(t,n);for(let n of await this.collectGeminiProjectPaths())rs(t,n);for(let n of await this.collectCodexCwds())rs(t,n);for(let n of await this.collectClaudeCwds())rs(t,n);let r=new Map;for(let n of t)r.set(s0(n),n);return this.workspaceHashMap=r,r}async collectGeminiProjectPaths(){let t;try{t=await Np(this.geminiProjectsFile,"utf-8")}catch{return[]}try{let n=JSON.parse(t).projects;return!n||typeof n!="object"||Array.isArray(n)?[]:Object.keys(n)}catch{return[]}}async collectCodexCwds(){let t=new Set;for(let r of this.codexSessionDirs){let n=await this.findJsonlFiles(r);for(let s of n){let o=(await Ce(s,1).catch(()=>[]))[0]?.payload?.cwd;o&&t.add(o)}}return[...t]}async collectClaudeCwds(){let t=new Set,r;try{r=await ts(this.claudeProjectsDir)}catch{return[]}for(let n of r){let s=Ge(this.claudeProjectsDir,n);if(!(await gi(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await ts(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=Ge(s,a),d=(await Ce(l,1).catch(()=>[]))[0]?.cwd;d&&t.add(d)}}return[...t]}async findJsonlFiles(t){let r=[];if(!(await gi(t).catch(()=>null))?.isDirectory())return r;let s;try{s=await ts(t)}catch{return r}for(let i of s){let o=Ge(t,i),a=await 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 i0,writeFileSync as o0,mkdirSync as a0}from"node:fs";import{join as l0,dirname as c0}from"node:path";import{randomUUID as d0}from"node:crypto";function Ml(e){return new Cl(e)}var Cl,jl=T(()=>{"use strict";Lp();Ut();Ir();Tt();Ol();Cl=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",he,"-y","--skip-trust"],resumeTemplate:"gemini --resume {{session_id}} --skip-trust",startTemplate:"gemini --skip-trust",transport:(r,n)=>Zr(r,{...n,acpTool:"gemini"})})}forkHint(t){return["Gemini fork: copies the session file with a new ID.","The forked session has the same conversation history","but diverges from that point forward."].join(`
1404
- `)}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=i0(n,"utf-8"),i=es(s),o=hi(s),a=d0();o.sessionId=a,o.kind="main";let l=c0(n),c=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),d=i==="jsonl"?".jsonl":".json",u=`session-${c}-${a.slice(0,8)}${d}`,f=l0(l,u);return a0(l,{recursive:!0}),o0(f,Ip(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 Op,readFile as u0,rm as f0,stat as Qr}from"node:fs/promises";import{basename as m0,join as lt}from"node:path";function p0(e){let t={};for(let r of e.split(`
1405
- `)){let n=r.match(/^(\w+):\s*(.*)$/);n&&(t[n[1]]=n[2].trim())}return{id:t.id,cwd:t.cwd,summary_count:t.summary_count?parseInt(t.summary_count,10):void 0,created_at:t.created_at,updated_at:t.updated_at,summary:t.summary}}function xr(e){if(!e)return;let t=new Date(e);return Number.isNaN(t.getTime())?void 0:t}async function _0(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,$p=T(()=>{"use strict";nr();Ei=class{name="copilot";sessionStateDir;constructor(t={}){let r=t.copilotDir||lt(be,".copilot");this.sessionStateDir=lt(r,"session-state")}getWatchPaths(){return[{directory:this.sessionStateDir,filePattern:/events\.jsonl$/}]}async discoverSessions(){let t=[],r;try{r=await Op(this.sessionStateDir)}catch{return t}for(let n of r){let s=lt(this.sessionStateDir,n);if((await Qr(s).catch(()=>null))?.isDirectory())try{let o=await this.extractSummary(s,n);o&&t.push(o)}catch{}}return t}async loadSession(t){let r=await this.resolveSessionDir(t);if(!r)return null;let n=await this.readWorkspaceYaml(r),s=lt(r,"events.jsonl"),i=await Qr(s).catch(()=>null),o=i?s:lt(r,"workspace.yaml"),a=await Ne(i?s:r),l=[],c=n?.cwd||"(unknown workspace)",d,u,f,m,p,_,g=n?.id||m0(r)||t;if(i)for await(let h of We(s)){let S=xr(h.timestamp)||a.modifiedAt;if(h.type==="session.start"&&h.data){h.data.sessionId&&(g=h.data.sessionId),h.data.copilotVersion&&(u=h.data.copilotVersion),h.data.startTime&&(_=xr(h.data.startTime)),h.data.selectedModel&&(d=h.data.selectedModel),h.data.context&&(h.data.context.cwd&&(c=h.data.context.cwd),h.data.context.branch&&(f=h.data.context.branch));continue}if(h.type==="session.model_change"&&h.data?.newModel){d=h.data.newModel;continue}if(h.type==="user.message"&&h.data){let y=h.data.content||"",w=y.trim();w&&(m||(m=H(w,80)),p=H(w,80)),l.push({role:"user",timestamp:S,content:fe(w||y)});continue}if(h.type==="assistant.message"&&h.data){let y=(h.data.content||"").trim();if(y&&l.push({role:"assistant",timestamp:S,content:fe(y),model:d}),h.data.toolRequests)for(let w of h.data.toolRequests)l.push({role:"tool_use",timestamp:S,content:w.name||"unknown tool",toolName:w.name,toolInput:w.arguments?JSON.stringify(w.arguments,null,2):void 0,toolCallId:w.toolCallId});continue}if(h.type==="tool.execution_complete"&&h.data){let y=h.data.result?.content||"",w=h.data.result?.detailedContent||"";l.push({role:"tool_result",timestamp:S,content:fe(y),toolDetailedContent:w?fe(w):void 0,toolCallId:h.data.toolCallId});continue}if(h.type==="assistant.reasoning"&&h.data?.content){l.push({role:"thinking",timestamp:S,content:fe(h.data.content)});continue}if(h.type==="session.error"||h.type==="session.warning"||h.type==="session.info"||h.type==="system.message"){let y=h.data?.message||"";y.trim()&&l.push({role:"system",timestamp:S,content:fe(y)});continue}}if(!m){let h=(n?.summary||"").trim();h&&(m=H(h,80))}return{provider:"copilot",sessionId:g,cwd:c,createdAt:_??xr(n?.created_at)??a.createdAt,modifiedAt:xr(n?.updated_at)??a.modifiedAt,model:d,cliVersion:u,startCommand:"copilot",gitBranch:f,firstUserMessage:m,lastUserMessage:p,messageCount:l.filter(h=>h.role==="user"||h.role==="assistant").length,filePath:o,messages:l}}async extractSummary(t,r){let n=await this.readWorkspaceYaml(t),s=lt(t,"events.jsonl"),i=await Qr(s).catch(()=>null),o=i?s:lt(t,"workspace.yaml"),a=await Ne(i?s:t),l=i?await Ce(s,20):[],c=n?.id||r,d=n?.cwd||"(unknown workspace)",u,f,m,p,_;for(let h of l)if(h.type==="session.start"&&h.data&&(h.data.sessionId&&(c=h.data.sessionId),h.data.copilotVersion&&(f=h.data.copilotVersion),h.data.startTime&&(m=xr(h.data.startTime)),h.data.selectedModel&&(u=h.data.selectedModel),h.data.context?.cwd&&(d=h.data.context.cwd)),h.type==="session.model_change"&&h.data?.newModel&&(u||(u=h.data.newModel)),h.type==="user.message"&&h.data){let S=(h.data.content||"").trim();S&&(p||(p=H(S,80)),_=H(S,80))}if(!p){let h=(n?.summary||"").trim();h&&(p=H(h,80))}let g=i?await _0(s):0;return{provider:"copilot",sessionId:c,cwd:d,createdAt:m??xr(n?.created_at)??a.createdAt,modifiedAt:xr(n?.updated_at)??a.modifiedAt,model:u,cliVersion:f,startCommand:"copilot",firstUserMessage:p,lastUserMessage:_,messageCount:g,filePath:o}}async readWorkspaceYaml(t){let r=lt(t,"workspace.yaml");try{let n=await u0(r,"utf-8");return p0(n)}catch{return null}}async resolveSessionPath(t){return this.resolveSessionDir(t)}async deleteSession(t){let r=await this.resolveSessionDir(t);return r?(await f0(r,{recursive:!0}),!0):!1}async resolveSessionDir(t){let r;try{r=await Op(this.sessionStateDir)}catch{return null}if(r.includes(t)){let s=lt(this.sessionStateDir,t);if((await Qr(s).catch(()=>null))?.isDirectory())return s}let n=[];for(let s of r)if(s.startsWith(t)){let i=lt(this.sessionStateDir,s);(await Qr(i).catch(()=>null))?.isDirectory()&&n.push(i)}if(n.length===1)return n[0];for(let s of r){let i=lt(this.sessionStateDir,s);if(!(await Qr(i).catch(()=>null))?.isDirectory())continue;let a=await this.readWorkspaceYaml(i);if(a&&(a.id===t||a.id?.startsWith(t)))return i}return null}}});function Pl(e){return new Dl(e)}var Dl,Fl=T(()=>{"use strict";$p();Ut();Ir();we();Tt();Dl=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",he,"--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 Cp,readdirSync as h0,statSync as Mp}from"node:fs";import{join as or}from"node:path";import{createRequire as g0}from"node:module";function jp(){return Ul===null&&(Ul=g0(import.meta.url)("node:sqlite").DatabaseSync),Ul}function y0(){let e=process.env.XDG_DATA_HOME||or(be,".local","share"),t=process.env.XDG_CONFIG_HOME||or(be,".config");return[or(e,"opencode","opencode.db"),or(t,"opencode","opencode.db")]}function w0(){if(process.env.OPENCODE_DB)return[process.env.OPENCODE_DB];let e=process.env.XDG_DATA_HOME||or(be,".local","share"),t=or(e,"lmplayer"),r=or(t,"opencode-local.db"),n=[r];try{let s=h0(t).filter(i=>/^opencode.*\.db$/u.test(i)).map(i=>or(t,i)).filter(i=>i!==r).sort((i,o)=>{try{return Mp(o).mtimeMs-Mp(i).mtimeMs}catch{return 0}});n.push(...s)}catch{}return n}function E0(e){return e==="lmplayer"?w0():y0()}var Ul,en,Wl=T(()=>{"use strict";nr();Ul=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=E0(this.name)}existingDbPaths(){return this.dbPaths.filter(t=>Cp(t))}openDb(t){return Cp(t)?new(jp())(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 Ol=T(()=>{"use strict"});import{createHash as zN}from"node:crypto";import{readdir as ts,readFile as Np,stat as yi,unlink as ZN}from"node:fs/promises";import{join as Ge,basename as QN,dirname as e0}from"node:path";import{cwd as t0}from"node:process";function xp(e){return e?typeof e=="string"?e:Array.isArray(e)?e.map(t=>t.text||"").join(""):"":""}function Ap(e){return e==="user"}function $l(e){return e==="gemini"||e==="assistant"}function Nr(e,t=new Date(0)){if(!e)return t;let r=new Date(e);return Number.isNaN(r.getTime())?t:r}function r0(e){return`${e.sessionId}\0${e.cwd}`}function n0(e,t){let r=e.filePaths??[e.filePath],n=t.filePaths??[t.filePath],s=[...new Set([...r,...n])],i=t.modifiedAt.getTime()>=e.modifiedAt.getTime()?t:e;return{...i,createdAt:e.createdAt.getTime()<=t.createdAt.getTime()?e.createdAt:t.createdAt,modifiedAt:i.modifiedAt,filePath:i.filePath,filePaths:s}}function wi(e){let t=Number(e??0);return Number.isFinite(t)?Math.max(0,Math.round(t)):0}function Rp(e){let t=0,r=0,n=0,s=0,i=0,o;for(let a of e){if(!$l(a.type)||!a.tokens)continue;let l=wi(a.tokens.input),c=wi(a.tokens.cached),d=Math.max(l-c,0),u=wi(a.tokens.output),f=wi(a.tokens.thoughts);t+=l,r+=c,n+=u,s+=f,i=l,o={inputTokens:d,cachedInputTokens:c,cacheWriteInputTokens:0,outputTokens:u,reasoningOutputTokens:f,totalTokens:l+u+f}}return{totalInputTokens:t,totalCachedInputTokens:r,totalOutputTokens:n,totalReasoningOutputTokens:s,lastInputTokens:i,lastTokenUsage:o}}function s0(e){return zN("sha256").update(e).digest("hex")}function rs(e,t){let r=t;for(;r&&!e.has(r);){e.add(r);let n=e0(r);if(n===r)break;r=n}}var Ei,Lp=T(()=>{"use strict";nr();Ol();he();Ei=class{name="gemini";workspaceHashMap;geminiProjectsFile;geminiTmpDir;claudeProjectsDir;codexSessionDirs;extraWorkspacePaths;constructor(t={}){let r=t.geminiDir||Ge(be,".gemini");this.geminiProjectsFile=Ge(r,"projects.json"),this.geminiTmpDir=Ge(r,"tmp");let n=t.claudeDir||Ge(be,".claude");this.claudeProjectsDir=Ge(n,"projects");let s=[Ge(be,".codex"),Ge(be,".code")],i=t.codexDirs&&t.codexDirs.length>0?t.codexDirs:[t.codexDir||s[0],t.codeDir||s[1]];this.codexSessionDirs=[...new Set(i)].map(o=>Ge(o,"sessions")),this.extraWorkspacePaths=t.extraWorkspacePaths||[]}getWatchPaths(){return[{directory:this.geminiTmpDir,filePattern:/\.jsonl?$/}]}async discoverSessions(){let t=await this.findSessionFiles(),r=new Map;for(let n of t)try{let s=await this.extractSummary(n);if(!s)continue;let i=r0(s),o=r.get(i);r.set(i,o?n0(o,s):s)}catch{}return[...r.values()]}async loadSession(t){let r=await this.resolveSessionFile(t);if(!r)return null;let n;try{n=await this.readSessionFile(r)}catch{return null}if(!n)return null;let s=await Ne(r),i=[],o=n.messages||[],a=n.sessionId||this.extractSessionIdFromFilename(r),l=n.projectHash||"",c=await this.resolveWorkspace(l),d,u,f;for(let g of o){let h=Nr(g.timestamp),S=g.type,y=fe(xp(g.content));if(Ap(S)){let I=y.trim();I&&(d||(d=J(I,80)),u=J(I,80)),i.push({role:"user",timestamp:h,content:I||y});continue}if($l(S)){g.model&&(f=g.model);for(let I of g.thoughts||[]){let x=[I.subject,I.description].filter(Boolean).join(`
1403
+ `).trim();x&&i.push({role:"thinking",timestamp:Nr(I.timestamp,h),content:fe(x)})}i.push({role:"assistant",timestamp:h,content:y,model:g.model});continue}let w=S?`[${S}] `:"";i.push({role:"system",timestamp:h,content:`${w}${y}`.trim()})}let m=Nr(n.startTime,s.createdAt),p=Nr(n.lastUpdated,s.modifiedAt),_=Rp(o);return{provider:"gemini",sessionId:a,cwd:c,createdAt:m,modifiedAt:p,model:f,startCommand:"gemini",firstUserMessage:d,lastUserMessage:u,messageCount:i.filter(g=>g.role==="user"||g.role==="assistant").length,filePath:r,totalInputTokens:_.totalInputTokens||void 0,totalCachedInputTokens:_.totalCachedInputTokens||void 0,totalOutputTokens:_.totalOutputTokens||void 0,totalReasoningOutputTokens:_.totalReasoningOutputTokens||void 0,lastInputTokens:_.lastInputTokens||void 0,lastTokenUsage:_.lastTokenUsage,messages:i}}async extractSummary(t){let r=await this.readSessionFile(t);if(!r)return null;let n=await Ne(t),s=r.messages||[],i=r.sessionId||this.extractSessionIdFromFilename(t),o=r.projectHash||"",a=await this.resolveWorkspace(o),l,c,d,u=0;for(let m of s)if(Ap(m.type)){u++;let p=xp(m.content).trim();p&&(l||(l=J(fe(p),80)),c=J(fe(p),80))}else $l(m.type)&&(u++,m.model&&(d=m.model));let f=Rp(s);return{provider:"gemini",sessionId:i,cwd:a,createdAt:Nr(r.startTime,n.createdAt),modifiedAt:Nr(r.lastUpdated,n.modifiedAt),model:d,startCommand:"gemini",firstUserMessage:l,lastUserMessage:c,messageCount:u,filePath:t,totalInputTokens:f.totalInputTokens||void 0,totalCachedInputTokens:f.totalCachedInputTokens||void 0,totalOutputTokens:f.totalOutputTokens||void 0,totalReasoningOutputTokens:f.totalReasoningOutputTokens||void 0,lastInputTokens:f.lastInputTokens||void 0,lastTokenUsage:f.lastTokenUsage}}async readSessionFile(t){let r=await Np(t,"utf-8");if(es(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 gi(r)}catch{return null}}extractSessionIdFromFilename(t){let r=QN(t).replace(/\.jsonl?$/,""),n=r.match(/session-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-(.+)$/);return n?n[1]:r}async findSessionFiles(){let t=[],r;try{r=await ts(this.geminiTmpDir)}catch{return t}for(let n of r){let s=Ge(this.geminiTmpDir,n,"chats");if(!(await yi(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await ts(s)}catch{continue}for(let a of o)a.startsWith("session-")&&(!a.endsWith(".json")&&!a.endsWith(".jsonl")||t.push(Ge(s,a)))}return t}async resolveSessionPath(t){return this.resolveSessionFile(t)}async deleteSession(t){let r=await this.resolveSessionFile(t);return r?(await 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:Nr(i?.lastUpdated,d.modifiedAt)})}return n.sort((s,i)=>{let o=i.modifiedAt.getTime()-s.modifiedAt.getTime();return o!==0?o:i.filePath.localeCompare(s.filePath)}),n[0]?.filePath??null}async resolveWorkspace(t){return t?(await this.getWorkspaceHashMap()).get(t)||`[hash:${t.slice(0,16)}]`:"(unknown workspace)"}async getWorkspaceHashMap(){if(this.workspaceHashMap)return this.workspaceHashMap;let t=new Set;rs(t,t0());for(let n of this.extraWorkspacePaths)rs(t,n);for(let n of await this.collectGeminiProjectPaths())rs(t,n);for(let n of await this.collectCodexCwds())rs(t,n);for(let n of await this.collectClaudeCwds())rs(t,n);let r=new Map;for(let n of t)r.set(s0(n),n);return this.workspaceHashMap=r,r}async collectGeminiProjectPaths(){let t;try{t=await Np(this.geminiProjectsFile,"utf-8")}catch{return[]}try{let n=JSON.parse(t).projects;return!n||typeof n!="object"||Array.isArray(n)?[]:Object.keys(n)}catch{return[]}}async collectCodexCwds(){let t=new Set;for(let r of this.codexSessionDirs){let n=await this.findJsonlFiles(r);for(let s of n){let o=(await Ce(s,1).catch(()=>[]))[0]?.payload?.cwd;o&&t.add(o)}}return[...t]}async collectClaudeCwds(){let t=new Set,r;try{r=await ts(this.claudeProjectsDir)}catch{return[]}for(let n of r){let s=Ge(this.claudeProjectsDir,n);if(!(await yi(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await ts(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=Ge(s,a),d=(await Ce(l,1).catch(()=>[]))[0]?.cwd;d&&t.add(d)}}return[...t]}async findJsonlFiles(t){let r=[];if(!(await yi(t).catch(()=>null))?.isDirectory())return r;let s;try{s=await ts(t)}catch{return r}for(let i of s){let o=Ge(t,i),a=await yi(o).catch(()=>null);if(a)if(a.isDirectory()){let l=await this.findJsonlFiles(o);r.push(...l)}else i.endsWith(".jsonl")&&r.push(o)}return r}}});import{readFileSync as i0,writeFileSync as o0,mkdirSync as a0}from"node:fs";import{join as l0,dirname as c0}from"node:path";import{randomUUID as d0}from"node:crypto";function Ml(e){return new Cl(e)}var Cl,jl=T(()=>{"use strict";Lp();Ut();Ir();Tt();Ol();Cl=class extends xe{constructor(t){super({provider:new Ei(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!0,forkSupport:"automatic",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"skill-file",leaderSetupHint:"Place skill files in the project's .gemini/ directory"},binary:"gemini",seedArgs:["-p",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:oi,lsCommand:`lmctl ls --provider gemini --sessiondir ${t}`}}async fork(t,r){let n=await this.resolvePath(t);if(!n)return{success:!1,error:`Session file not found for ${t}`};try{let s=i0(n,"utf-8"),i=es(s),o=gi(s),a=d0();o.sessionId=a,o.kind="main";let l=c0(n),c=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),d=i==="jsonl"?".jsonl":".json",u=`session-${c}-${a.slice(0,8)}${d}`,f=l0(l,u);return a0(l,{recursive:!0}),o0(f,Ip(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 Op,readFile as u0,rm as f0,stat as Qr}from"node:fs/promises";import{basename as m0,join as lt}from"node:path";function p0(e){let t={};for(let r of e.split(`
1405
+ `)){let n=r.match(/^(\w+):\s*(.*)$/);n&&(t[n[1]]=n[2].trim())}return{id:t.id,cwd:t.cwd,summary_count:t.summary_count?parseInt(t.summary_count,10):void 0,created_at:t.created_at,updated_at:t.updated_at,summary:t.summary}}function xr(e){if(!e)return;let t=new Date(e);return Number.isNaN(t.getTime())?void 0:t}async function _0(e){let t=0;for await(let r of We(e))(r.type==="user.message"||r.type==="assistant.message"&&(r.data?.content||"").trim())&&t++;return t}var Ti,$p=T(()=>{"use strict";nr();Ti=class{name="copilot";sessionStateDir;constructor(t={}){let r=t.copilotDir||lt(be,".copilot");this.sessionStateDir=lt(r,"session-state")}getWatchPaths(){return[{directory:this.sessionStateDir,filePattern:/events\.jsonl$/}]}async discoverSessions(){let t=[],r;try{r=await Op(this.sessionStateDir)}catch{return t}for(let n of r){let s=lt(this.sessionStateDir,n);if((await Qr(s).catch(()=>null))?.isDirectory())try{let o=await this.extractSummary(s,n);o&&t.push(o)}catch{}}return t}async loadSession(t){let r=await this.resolveSessionDir(t);if(!r)return null;let n=await this.readWorkspaceYaml(r),s=lt(r,"events.jsonl"),i=await Qr(s).catch(()=>null),o=i?s:lt(r,"workspace.yaml"),a=await Ne(i?s:r),l=[],c=n?.cwd||"(unknown workspace)",d,u,f,m,p,_,g=n?.id||m0(r)||t;if(i)for await(let h of We(s)){let S=xr(h.timestamp)||a.modifiedAt;if(h.type==="session.start"&&h.data){h.data.sessionId&&(g=h.data.sessionId),h.data.copilotVersion&&(u=h.data.copilotVersion),h.data.startTime&&(_=xr(h.data.startTime)),h.data.selectedModel&&(d=h.data.selectedModel),h.data.context&&(h.data.context.cwd&&(c=h.data.context.cwd),h.data.context.branch&&(f=h.data.context.branch));continue}if(h.type==="session.model_change"&&h.data?.newModel){d=h.data.newModel;continue}if(h.type==="user.message"&&h.data){let y=h.data.content||"",w=y.trim();w&&(m||(m=J(w,80)),p=J(w,80)),l.push({role:"user",timestamp:S,content:fe(w||y)});continue}if(h.type==="assistant.message"&&h.data){let y=(h.data.content||"").trim();if(y&&l.push({role:"assistant",timestamp:S,content:fe(y),model:d}),h.data.toolRequests)for(let w of h.data.toolRequests)l.push({role:"tool_use",timestamp:S,content:w.name||"unknown tool",toolName:w.name,toolInput:w.arguments?JSON.stringify(w.arguments,null,2):void 0,toolCallId:w.toolCallId});continue}if(h.type==="tool.execution_complete"&&h.data){let y=h.data.result?.content||"",w=h.data.result?.detailedContent||"";l.push({role:"tool_result",timestamp:S,content:fe(y),toolDetailedContent:w?fe(w):void 0,toolCallId:h.data.toolCallId});continue}if(h.type==="assistant.reasoning"&&h.data?.content){l.push({role:"thinking",timestamp:S,content:fe(h.data.content)});continue}if(h.type==="session.error"||h.type==="session.warning"||h.type==="session.info"||h.type==="system.message"){let y=h.data?.message||"";y.trim()&&l.push({role:"system",timestamp:S,content:fe(y)});continue}}if(!m){let h=(n?.summary||"").trim();h&&(m=J(h,80))}return{provider:"copilot",sessionId:g,cwd:c,createdAt:_??xr(n?.created_at)??a.createdAt,modifiedAt:xr(n?.updated_at)??a.modifiedAt,model:d,cliVersion:u,startCommand:"copilot",gitBranch:f,firstUserMessage:m,lastUserMessage:p,messageCount:l.filter(h=>h.role==="user"||h.role==="assistant").length,filePath:o,messages:l}}async extractSummary(t,r){let n=await this.readWorkspaceYaml(t),s=lt(t,"events.jsonl"),i=await Qr(s).catch(()=>null),o=i?s:lt(t,"workspace.yaml"),a=await Ne(i?s:t),l=i?await Ce(s,20):[],c=n?.id||r,d=n?.cwd||"(unknown workspace)",u,f,m,p,_;for(let h of l)if(h.type==="session.start"&&h.data&&(h.data.sessionId&&(c=h.data.sessionId),h.data.copilotVersion&&(f=h.data.copilotVersion),h.data.startTime&&(m=xr(h.data.startTime)),h.data.selectedModel&&(u=h.data.selectedModel),h.data.context?.cwd&&(d=h.data.context.cwd)),h.type==="session.model_change"&&h.data?.newModel&&(u||(u=h.data.newModel)),h.type==="user.message"&&h.data){let S=(h.data.content||"").trim();S&&(p||(p=J(S,80)),_=J(S,80))}if(!p){let h=(n?.summary||"").trim();h&&(p=J(h,80))}let g=i?await _0(s):0;return{provider:"copilot",sessionId:c,cwd:d,createdAt:m??xr(n?.created_at)??a.createdAt,modifiedAt:xr(n?.updated_at)??a.modifiedAt,model:u,cliVersion:f,startCommand:"copilot",firstUserMessage:p,lastUserMessage:_,messageCount:g,filePath:o}}async readWorkspaceYaml(t){let r=lt(t,"workspace.yaml");try{let n=await u0(r,"utf-8");return p0(n)}catch{return null}}async resolveSessionPath(t){return this.resolveSessionDir(t)}async deleteSession(t){let r=await this.resolveSessionDir(t);return r?(await f0(r,{recursive:!0}),!0):!1}async resolveSessionDir(t){let r;try{r=await Op(this.sessionStateDir)}catch{return null}if(r.includes(t)){let s=lt(this.sessionStateDir,t);if((await Qr(s).catch(()=>null))?.isDirectory())return s}let n=[];for(let s of r)if(s.startsWith(t)){let i=lt(this.sessionStateDir,s);(await Qr(i).catch(()=>null))?.isDirectory()&&n.push(i)}if(n.length===1)return n[0];for(let s of r){let i=lt(this.sessionStateDir,s);if(!(await Qr(i).catch(()=>null))?.isDirectory())continue;let a=await this.readWorkspaceYaml(i);if(a&&(a.id===t||a.id?.startsWith(t)))return i}return null}}});function Pl(e){return new Dl(e)}var Dl,Fl=T(()=>{"use strict";$p();Ut();Ir();he();Tt();Dl=class extends xe{constructor(t){super({provider:new Ti(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 Cp,readdirSync as h0,statSync as Mp}from"node:fs";import{join as or}from"node:path";import{createRequire as g0}from"node:module";function jp(){return Ul===null&&(Ul=g0(import.meta.url)("node:sqlite").DatabaseSync),Ul}function y0(){let e=process.env.XDG_DATA_HOME||or(be,".local","share"),t=process.env.XDG_CONFIG_HOME||or(be,".config");return[or(e,"opencode","opencode.db"),or(t,"opencode","opencode.db")]}function w0(){if(process.env.OPENCODE_DB)return[process.env.OPENCODE_DB];let e=process.env.XDG_DATA_HOME||or(be,".local","share"),t=or(e,"lmplayer"),r=or(t,"opencode-local.db"),n=[r];try{let s=h0(t).filter(i=>/^opencode.*\.db$/u.test(i)).map(i=>or(t,i)).filter(i=>i!==r).sort((i,o)=>{try{return Mp(o).mtimeMs-Mp(i).mtimeMs}catch{return 0}});n.push(...s)}catch{}return n}function E0(e){return e==="lmplayer"?w0():y0()}var Ul,en,Wl=T(()=>{"use strict";nr();Ul=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=E0(this.name)}existingDbPaths(){return this.dbPaths.filter(t=>Cp(t))}openDb(t){return Cp(t)?new(jp())(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
1409
- WHERE m.session_id = ? ORDER BY m.time_created ASC`).all(a.id),u=0,f,m,p,_=[];for(let h of d){let S;try{S=JSON.parse(h.data)}catch{continue}p||(p=S.model?.modelID||S.modelID),(S.role==="user"||S.role==="assistant")&&u++,S.role==="user"&&_.push(h.id)}let g=[..._.length>0?[_[0]]:[],..._.length>1?[_[_.length-1]]:[]];for(let h of g){let S=n.prepare("SELECT id, data FROM part WHERE message_id = ? ORDER BY time_created ASC").all(h),y=this.extractText(S);y&&(f||(f=H(y,80)),m=H(y,80))}t.push({provider:this.name,sessionId:a.id,slug:a.slug,cwd:c,createdAt:new Date(a.time_created),modifiedAt:new Date(a.time_updated),model:p,startCommand:this.startCommand,firstUserMessage:f,lastUserMessage:m,messageCount:u,filePath:r})}}catch{}finally{n.close()}}return t.sort((r,n)=>n.modifiedAt.getTime()-r.modifiedAt.getTime())}async loadSession(t){for(let r of this.existingDbPaths()){let n=this.openDb(r);if(n)try{let s=this.findSessionRow(n,t);if(!s)continue;return this.buildSessionDetail(n,s,r)}catch{}finally{n.close()}}return null}buildSessionDetail(t,r,n){let s=t.prepare("SELECT id, worktree, name FROM project WHERE id = ?").get(r.project_id),i=r.directory||s?.worktree||"(unknown)",o=t.prepare(`SELECT id, session_id, time_created, time_updated, data
1410
- FROM message WHERE session_id = ? ORDER BY time_created ASC`).all(r.id),a=[],l=0,c,d,u;for(let f of o){let m;try{m=JSON.parse(f.data)}catch{continue}c||(c=m.model?.modelID||m.modelID);let p=m.model?.modelID||m.modelID,_=new Date(m.time?.created||f.time_created),g=t.prepare("SELECT id, data FROM part WHERE message_id = ? ORDER BY time_created ASC").all(f.id);if(m.role==="user"){let h=this.extractText(g);h&&(d||(d=H(h,80)),u=H(h,80)),a.push({role:"user",timestamp:_,content:h||"(empty)"}),l++}else if(m.role==="assistant"){for(let h of g){let S;try{S=JSON.parse(h.data)}catch{continue}S.type==="text"&&S.text?a.push({role:"assistant",timestamp:_,content:S.text,model:p}):S.type==="reasoning"&&S.text?a.push({role:"thinking",timestamp:_,content:S.text}):S.type==="tool"&&S.tool&&(a.push({role:"tool_use",timestamp:_,content:`${S.tool}`,toolName:S.tool,toolCallId:S.callID,toolInput:S.state?.input?JSON.stringify(S.state.input):void 0}),(S.state?.output||S.state?.error)&&a.push({role:"tool_result",timestamp:_,content:S.state.error||S.state.output||"",toolCallId:S.callID}))}l++}}return{provider:this.name,sessionId:r.id,slug:r.slug,cwd:i,createdAt:new Date(r.time_created),modifiedAt:new Date(r.time_updated),model:c,startCommand:this.startCommand,firstUserMessage:d,lastUserMessage:u,messageCount:l,filePath:n,messages:a}}extractText(t){let r=[];for(let n of t){let s;try{s=JSON.parse(n.data)}catch{continue}s.type==="text"&&s.text&&r.push(s.text)}return r.join(`
1409
+ WHERE m.session_id = ? ORDER BY m.time_created ASC`).all(a.id),u=0,f,m,p,_=[];for(let h of d){let S;try{S=JSON.parse(h.data)}catch{continue}p||(p=S.model?.modelID||S.modelID),(S.role==="user"||S.role==="assistant")&&u++,S.role==="user"&&_.push(h.id)}let g=[..._.length>0?[_[0]]:[],..._.length>1?[_[_.length-1]]:[]];for(let h of g){let S=n.prepare("SELECT id, data FROM part WHERE message_id = ? ORDER BY time_created ASC").all(h),y=this.extractText(S);y&&(f||(f=J(y,80)),m=J(y,80))}t.push({provider:this.name,sessionId:a.id,slug:a.slug,cwd:c,createdAt:new Date(a.time_created),modifiedAt:new Date(a.time_updated),model:p,startCommand:this.startCommand,firstUserMessage:f,lastUserMessage:m,messageCount:u,filePath:r})}}catch{}finally{n.close()}}return t.sort((r,n)=>n.modifiedAt.getTime()-r.modifiedAt.getTime())}async loadSession(t){for(let r of this.existingDbPaths()){let n=this.openDb(r);if(n)try{let s=this.findSessionRow(n,t);if(!s)continue;return this.buildSessionDetail(n,s,r)}catch{}finally{n.close()}}return null}buildSessionDetail(t,r,n){let s=t.prepare("SELECT id, worktree, name FROM project WHERE id = ?").get(r.project_id),i=r.directory||s?.worktree||"(unknown)",o=t.prepare(`SELECT id, session_id, time_created, time_updated, data
1410
+ FROM message WHERE session_id = ? ORDER BY time_created ASC`).all(r.id),a=[],l=0,c,d,u;for(let f of o){let m;try{m=JSON.parse(f.data)}catch{continue}c||(c=m.model?.modelID||m.modelID);let p=m.model?.modelID||m.modelID,_=new Date(m.time?.created||f.time_created),g=t.prepare("SELECT id, data FROM part WHERE message_id = ? ORDER BY time_created ASC").all(f.id);if(m.role==="user"){let h=this.extractText(g);h&&(d||(d=J(h,80)),u=J(h,80)),a.push({role:"user",timestamp:_,content:h||"(empty)"}),l++}else if(m.role==="assistant"){for(let h of g){let S;try{S=JSON.parse(h.data)}catch{continue}S.type==="text"&&S.text?a.push({role:"assistant",timestamp:_,content:S.text,model:p}):S.type==="reasoning"&&S.text?a.push({role:"thinking",timestamp:_,content:S.text}):S.type==="tool"&&S.tool&&(a.push({role:"tool_use",timestamp:_,content:`${S.tool}`,toolName:S.tool,toolCallId:S.callID,toolInput:S.state?.input?JSON.stringify(S.state.input):void 0}),(S.state?.output||S.state?.error)&&a.push({role:"tool_result",timestamp:_,content:S.state.error||S.state.output||"",toolCallId:S.callID}))}l++}}return{provider:this.name,sessionId:r.id,slug:r.slug,cwd:i,createdAt:new Date(r.time_created),modifiedAt:new Date(r.time_updated),model:c,startCommand:this.startCommand,firstUserMessage:d,lastUserMessage:u,messageCount:l,filePath:n,messages:a}}extractText(t){let r=[];for(let n of t){let s;try{s=JSON.parse(n.data)}catch{continue}s.type==="text"&&s.text&&r.push(s.text)}return r.join(`
1411
1411
  `).trim()}async resolveSessionPath(t){for(let r of this.existingDbPaths()){let n=this.openDb(r);if(n)try{if(this.findSessionRow(n,t))return r}catch{}finally{n.close()}}return null}async deleteSession(t){for(let r of this.existingDbPaths()){let n=new(jp())(r,{open:!0});try{let s=this.findSessionRow(n,t);if(!s)continue;return n.prepare("DELETE FROM session WHERE id = ?").run(s.id).changes>0}catch{}finally{n.close()}}return!1}findSessionRow(t,r){let n=t.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
1412
1412
  s.time_created, s.time_updated
1413
1413
  FROM session s WHERE s.id = ?`).get(r);if(n)return n;let s=t.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
@@ -1415,12 +1415,12 @@ ${r}`:r}function gp(e,t){let r=DN[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 ql(){return new Bl}var Bl,Hl=T(()=>{"use strict";Wl();Ut();Ir();Tt();Bl=class extends xe{constructor(){super({provider:new en,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"custom-tool",leaderSetupHint:"OpenCode supports custom tools via .opencode/tools/ directory"},binary:"opencode",seedArgs:["run",he],resumeTemplate:"opencode --session {{session_id}}",startTemplate:"opencode",transport:(t,r)=>Zr(t,{...r,acpTool:"opencode"})})}seedArgsFor(t){let r=["run"];return t?.model&&r.push("--model",t.model),t?.effort&&r.push("--variant",t.effort),r.push(t?.prompt??he),r}}});import{spawn as T0}from"node:child_process";import{mkdirSync as b0}from"node:fs";function Xl(e){return new Jl(e)}async function S0(e,t){let r=Date.now(),n=Dp({prompt:e,sessionId:t.sessionId,model:t.model,effort:t.effort,formatJson:!0,permissionMode:t.permissionMode??"yolo"});at("lmplayer",n,t.permissionMode??"yolo");let s=await Pp(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 Dp(e){let t=["run"];return e.model&&t.push("--model",e.model),e.sessionId&&t.push("--session",e.sessionId),e.formatJson&&t.push("--format","json"),e.effort&&t.push("--effort",e.effort),t.push(...sr("lmplayer",e.permissionMode)??[]),t.push(e.prompt),t}function Pp(e,t,r){return new Promise((n,s)=>{let i;try{i=T0(e,t,{cwd:r.cwd,env:r.env,stdio:["ignore","pipe","pipe"]})}catch(g){s(g);return}let o="",a="",l="",c,d,u=[],f=!1,m=r.timeoutMs===void 0?void 0:setTimeout(()=>{f||(f=!0,i.kill(),p(),s(new Error(`lmplayer seed timed out after ${r.timeoutMs}ms`)))},r.timeoutMs),p=()=>{m!==void 0&&clearTimeout(m)},_=g=>{let h=g.trim();if(!h)return;let S;try{S=JSON.parse(h)}catch{u.push(g),r.onText?.(g);return}if(!bi(S))return;let y=Ti(S,!1);c===void 0&&y!==void 0&&(c=y),d=Ti(S,!0)??d;let w=Fp(S);w&&(u.push(w),r.onText?.(w))};i.stdout?.on("data",g=>{let h=g.toString("utf8");o+=h,l+=h;let S=l.indexOf(`
1418
+ LIMIT 2`).all(`${r}%`);return s.length!==1?null:s[0]}}});function ql(){return new Bl}var Bl,Hl=T(()=>{"use strict";Wl();Ut();Ir();Tt();Bl=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 T0}from"node:child_process";import{mkdirSync as b0}from"node:fs";function Xl(e){return new Jl(e)}async function S0(e,t){let r=Date.now(),n=Dp({prompt:e,sessionId:t.sessionId,model:t.model,effort:t.effort,formatJson:!0,permissionMode:t.permissionMode??"yolo"});at("lmplayer",n,t.permissionMode??"yolo");let s=await Pp(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 Dp(e){let t=["run"];return e.model&&t.push("--model",e.model),e.sessionId&&t.push("--session",e.sessionId),e.formatJson&&t.push("--format","json"),e.effort&&t.push("--effort",e.effort),t.push(...sr("lmplayer",e.permissionMode)??[]),t.push(e.prompt),t}function Pp(e,t,r){return new Promise((n,s)=>{let i;try{i=T0(e,t,{cwd:r.cwd,env:r.env,stdio:["ignore","pipe","pipe"]})}catch(g){s(g);return}let o="",a="",l="",c,d,u=[],f=!1,m=r.timeoutMs===void 0?void 0:setTimeout(()=>{f||(f=!0,i.kill(),p(),s(new Error(`lmplayer seed timed out after ${r.timeoutMs}ms`)))},r.timeoutMs),p=()=>{m!==void 0&&clearTimeout(m)},_=g=>{let h=g.trim();if(!h)return;let S;try{S=JSON.parse(h)}catch{u.push(g),r.onText?.(g);return}if(!Si(S))return;let y=bi(S,!1);c===void 0&&y!==void 0&&(c=y),d=bi(S,!0)??d;let w=Fp(S);w&&(u.push(w),r.onText?.(w))};i.stdout?.on("data",g=>{let h=g.toString("utf8");o+=h,l+=h;let S=l.indexOf(`
1419
1419
  `);for(;S>=0;){let y=l.slice(0,S);l=l.slice(S+1),_(y),S=l.indexOf(`
1420
- `)}}),i.stderr?.on("data",g=>{a+=g.toString("utf8")}),r.signal&&(r.signal.aborted?i.kill():r.signal.addEventListener("abort",()=>i.kill(),{once:!0})),i.on("exit",g=>{f||(f=!0,p(),l.length>0&&_(l),n({code:g,stdout:o,stderr:a,sessionId:c??d,text:u.join("")}))}),i.on("error",g=>{f||(f=!0,p(),s(g))})})}function Fp(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=Fp(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 Jl,Gl=T(()=>{"use strict";Wl();Ut();Tt();zr();it();Jl=class extends xe{constructor(t){super({provider:new en({providerName:"lmplayer",startCommand:"lmplayer",dbPath:t?.lmplayerDbPath}),capabilities:{canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!0},injection:{leaderMode:"none"},binary:"lmplayer",seedArgs:["run","--format","json","--dangerously-skip-permissions",he],resumeTemplate:"lmplayer run --session {{session_id}} --dangerously-skip-permissions",startTemplate:"lmplayer run --dangerously-skip-permissions",transport:S0})}seedArgsFor(t){return Dp({prompt:t?.prompt??he,model:t?.model,effort:t?.effort,formatJson:!0,permissionMode:"yolo"})}async seed(t,r){b0(t,{recursive:!0});let n=this.seedArgsFor(r);at("lmplayer",n);try{let s=await Pp(this.binary,n,{cwd:t,env:Ft(void 0,t),timeoutMs:6e4});return s.code!==0&&s.code!==null?{success:!1,error:s.stderr.trim().slice(0,200)||`exit code ${s.code}`}:s.sessionId?{success:!0,sessionId:s.sessionId}:{success:!1,error:"lmplayer seed failed; provider did not report a sessionID"}}catch(s){return{success:!1,error:s instanceof Error?s.message:String(s)}}}manualSeedHint(t){return{launchCommand:`cd ${t} && lmplayer run --format json --dangerously-skip-permissions "${he}"`,postLaunchNote:"Copy the sessionID reported by lmplayer into this member's sessionid= field.",lsCommand:`lmctl ls --provider lmplayer --sessiondir ${t}`}}}});import{readdir as Si,readFile as v0,rm as k0}from"node:fs/promises";import{basename as Up,join as ar}from"node:path";function Wp(e){return e.type==="user"||e.message?.role==="user"}function Bp(e){return e.type==="assistant"||e.message?.role==="assistant"||e.message?.role==="model"}function qp(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&&_(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 Fp(e){for(let t of["text","content","delta","output","message"]){let r=e[t];if(typeof r=="string")return r}for(let t of["data","event","payload","part"]){let r=e[t];if(Si(r)){let n=Fp(r);if(n)return n}}}function bi(e,t){for(let n of["sessionID","sessionId","session_id"]){let s=e[n];if(typeof s=="string"&&s.length>0)return s}let r=e.session;if(typeof r=="string"&&r.length>0)return r;if(Si(r)){let n=bi(r,t);if(n!==void 0)return n}if(t){let n=e.id;if(typeof n=="string"&&n.length>0)return n}for(let n of["data","event","payload","part"]){let s=e[n];if(Si(s)){let i=bi(s,t);if(i!==void 0)return i}}}function Si(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var Jl,Gl=T(()=>{"use strict";Wl();Ut();Tt();zr();it();Jl=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:S0})}seedArgsFor(t){return Dp({prompt:t?.prompt??ge,model:t?.model,effort:t?.effort,formatJson:!0,permissionMode:"yolo"})}async seed(t,r){b0(t,{recursive:!0});let n=this.seedArgsFor(r);at("lmplayer",n);try{let s=await Pp(this.binary,n,{cwd:t,env:Ft(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 vi,readFile as v0,rm as k0}from"node:fs/promises";import{basename as Up,join as ar}from"node:path";function Wp(e){return e.type==="user"||e.message?.role==="user"}function Bp(e){return e.type==="assistant"||e.message?.role==="assistant"||e.message?.role==="model"}function qp(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 Hp(e){return e.model||e.message?.model}var vi,Jp=T(()=>{"use strict";nr();vi=class{name="qwen";baseDir;constructor(t){this.baseDir=t?.qwenDir||ar(be,".qwen")}async discoverSessions(){let t=ar(this.baseDir,"projects"),r;try{r=await Si(t)}catch{return[]}let n=[];for(let s of r){let i=ar(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=ar(i,a);try{let d=await this.extractSummary(c,l);d&&n.push(d)}catch{}}}return n}async extractSummary(t,r){let n=await Ce(t,30);if(n.length===0)return null;let s=await Ne(t),i="(unknown)",o,a,l,c,d=0;for(let u of n){if(u.cwd&&(i=u.cwd,u.version&&(a=u.version)),u.type==="system"&&u.cwd&&(i=u.cwd,u.version&&(a=u.version),u.model&&(o=u.model)),Wp(u)){let f=qp(u).trim();f&&(l||(l=H(f,80)),c=H(f,80)),d++}if(Bp(u)){let f=Hp(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=Up(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(Wp(f)){let _=qp(f);_.trim()&&(c||(c=H(_.trim(),80)),d=H(_.trim(),80)),u.push({role:"user",timestamp:p,content:_})}else if(Bp(f)){let _=Hp(f);if(_&&(i=_),Array.isArray(m.content))for(let g of m.content)g.type==="text"&&g.text?u.push({role:"assistant",timestamp:p,content:g.text,model:_}):g.type==="thinking"&&g.thinking&&u.push({role:"thinking",timestamp:p,content:g.thinking});else if(typeof m.content=="string")u.push({role:"assistant",timestamp:p,content:m.content,model:_});else if(Array.isArray(m.parts))for(let g of m.parts)if(g.thought||g.type==="thinking"){let h=g.thinking||g.text;h&&u.push({role:"thinking",timestamp:p,content:h})}else g.text&&u.push({role:"assistant",timestamp:p,content:g.text,model:_})}}return{provider:"qwen",sessionId:r,slug:l,cwd:s,createdAt:n.createdAt,modifiedAt:n.modifiedAt,model:i,cliVersion:o,gitBranch:a,startCommand:"qwen",firstUserMessage:c,lastUserMessage:d,messageCount:u.length,filePath:t,messages:u}}async resolveSessionPath(t){let r=ar(this.baseDir,"projects");try{let n=await Si(r),s=[];for(let i of n){let o=ar(r,i,"chats",`${t}.jsonl`);try{return await v0(o,{flag:"r"}),o}catch{continue}}for(let i of n){let o=ar(r,i,"chats"),a;try{a=await Si(o)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;Up(l,".jsonl").startsWith(t)&&s.push(ar(o,l))}}if(s.length===1)return s[0]}catch{}return null}async deleteSession(t){let r=await this.resolveSessionPath(t);if(!r)return!1;try{return await k0(r),!0}catch{return!1}}}});function Kl(){return new Vl}var Vl,Yl=T(()=>{"use strict";Jp();Ut();Ir();Tt();Vl=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",he,"--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 Xp,readFile as I0,rm as Gp,stat as Vp}from"node:fs/promises";import{basename as zl,join as qt}from"node:path";async function N0(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 x0(e,t){if(!e)return t;let r=new Date(e);return Number.isNaN(r.getTime())?t:r}function Kp(e){return e.type==="USER_INPUT"}function Yp(e){return e.source==="MODEL"&&e.type==="PLANNER_RESPONSE"}function A0(e){return e.source==="MODEL"&&e.type!=="PLANNER_RESPONSE"}function zp(e){if(!e)return"";let t=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(e);return t?t[1]:e}function Zp(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 R0(e){if(e===void 0)return"";try{return JSON.stringify(e)}catch{return String(e)}}async function L0(e){for await(let t of We(e)){let r=t.tool_calls?.map(s=>s.args)??[];for(let s of r){let i=O0(s);if(i)return i}let n=$0(t.content);if(n)return n}return null}function O0(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 $0(e){return e?/"Cwd":"([^"]+)"/.exec(e)?.[1]??null:null}function Qp(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,e_=T(()=>{"use strict";nr();ki=class{name="agy";baseDir;constructor(t={}){this.baseDir=t.agyDir||qt(be,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:qt(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let t=qt(this.baseDir,"conversations"),r;try{r=await Xp(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 qt(this.baseDir,"conversations",`${t}.db`)}transcriptPath(t){return qt(this.baseDir,"brain",t,".system_generated","logs","transcript.jsonl")}async existingTranscriptPath(t){let r=this.transcriptPath(t);try{return await Vp(r),r}catch{return null}}async extractSummary(t){let r=this.conversationPath(t),n=await this.existingTranscriptPath(t),s=n??r,i=await N0([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=Zp(f.content);if(m&&(a=m),Kp(f)){let p=zp(f.content).trim();p&&(l||(l=H(p,80)),c=H(p,80)),d++}else Yp(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=Qp(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=x0(d.created_at,s.modifiedAt),f=Zp(d.content);if(f&&(a=f),Kp(d)){let m=zp(d.content),p=m.trim();p&&(l||(l=H(p,80)),c=H(p,80)),o.push({role:"user",timestamp:u,content:m});continue}if(Array.isArray(d.tool_calls))for(let m of d.tool_calls)o.push({role:"tool_use",timestamp:u,content:R0(m.args),toolName:m.name||"tool"});Yp(d)&&d.content?o.push({role:"assistant",timestamp:u,content:d.content,model:a}):A0(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 Vp(r),r}catch{}let n=qt(this.baseDir,"conversations");try{let s=[];for(let i of await Xp(n)){if(!i.endsWith(".db"))continue;zl(i,".db").startsWith(t)&&s.push(qt(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=Qp(r);return n?(await Gp(this.conversationPath(n),{force:!0}),await Gp(qt(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 L0(r);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(t){let r=qt(this.baseDir,"cache","last_conversations.json");try{let n=JSON.parse(await I0(r,"utf8"));for(let[s,i]of Object.entries(n))if(i===t)return s}catch{}return null}}});import{spawn as C0}from"node:child_process";function Ql(e){return new Zl(e)}async function M0(e,t){let r=Date.now(),n=["--conversation",t.sessionId,"-p",e,"--dangerously-skip-permissions","--print-timeout",D0(t.timeoutMs)];t.model&&n.push("--model",t.model),at("agy",n,t.permissionMode??"yolo"),t.onProgress?.({kind:"system",summary:"agy -p one-shot started (no streaming events)"});let{stdout:s}=await j0(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 j0(e,t,r){return new Promise((n,s)=>{let i;try{i=C0(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 D0(e){return!e||e<=0?"8h":`${Math.max(1,Math.ceil(e/1e3))}s`}var Zl,ec=T(()=>{"use strict";e_();Ut();Tt();it();zr();Zl=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",he,"--dangerously-skip-permissions","--print-timeout","2m"],resumeTemplate:"agy --conversation {{session_id}} --dangerously-skip-permissions",startTemplate:"agy --dangerously-skip-permissions",transport:M0})}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 P0}from"node:crypto";import{existsSync as F0,mkdirSync as U0,readFileSync as W0,renameSync as B0,writeFileSync as q0}from"node:fs";import{dirname as i_,join as t_,resolve as tc}from"node:path";function H0(e){return P0("sha256").update(e).digest("hex").slice(0,8)}function J0(e){let t=e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return t.length>0?t:"session"}function X0(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 o_(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 tc(t);let r=process.env.LMCTL_DB;return r!==void 0&&r.trim().length>0?t_(i_(tc(r)),".lmctl-claude-mock","sessions.json"):t_(tc(e),".lmctl-claude-mock","sessions.json")}function r_(){return{schemaVersion:1,sessions:{}}}function ns(e){if(!F0(e))return r_();try{let t=JSON.parse(W0(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 r_()}}function a_(e,t){U0(i_(e),{recursive:!0});let r=`${e}.${process.pid}.${Date.now()}.tmp`;q0(r,`${JSON.stringify(t,null,2)}
1423
- `,"utf8"),B0(r,e)}function G0(e){return{...e,timestamp:e.timestamp.toISOString()}}function V0(e){return{...e,timestamp:new Date(e.timestamp)}}function K0(e){return{...e,createdAt:e.createdAt.toISOString(),modifiedAt:e.modifiedAt.toISOString(),messages:e.messages.map(G0)}}function l_(e){return{...e,createdAt:new Date(e.createdAt),modifiedAt:new Date(e.modifiedAt),messages:e.messages.map(V0)}}function Ni(e,t=process.cwd()){let r=tn.get(e);if(r!==void 0)return r;let s=ns(rn(t)).sessions[e];if(s===void 0)return;let i=l_(s);return tn.set(i.sessionId,i),i}function n_(e){tn.set(e.sessionId,e);let t=rn(e.cwd),r=ns(t);r.sessions[e.sessionId]=K0({...e,filePath:t}),a_(t,r)}function Y0(){let e=ns(rn()),t=Object.values(e.sessions).map(l_);for(let r of t)tn.set(r.sessionId,r);return t}function z0(e,t){let r=t.script;if(r===void 0)return;let n=r[e],s=r[o_(e)],i=n??s;if(typeof i=="string")return i;if(i!==void 0&&typeof i.text=="string")return i.text}function s_(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 sc(){return new nc}var tn,rc,nc,ic=T(()=>{"use strict";tn=new Map;rc=class{name="ClaudeMock";async discoverSessions(){let t=new Map;for(let r of Y0())t.set(r.sessionId,r);for(let r of tn.values())t.set(r.sessionId,r);return[...t.values()].map(s_)}async loadSession(t){let r=Ni(t);return r===void 0?null:{...s_(r),messages:r.messages.slice()}}async resolveSessionPath(t){return Ni(t)?.filePath??null}async deleteSession(t){let r=tn.delete(t),n=rn(),s=ns(n),i=s.sessions[t]!==void 0;return delete s.sessions[t],i&&a_(n,s),r||i}},nc=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new rc;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=J0(X0(t,r)),s=`mock-${n}-${H0(`${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"),n_(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=ns(rn(r.cwd)),a=z0(t,o)??`ClaudeMock ack: ${o_(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),n_(s),r.onProgress?.({kind:"text",summary:"ClaudeMock deterministic reply"}),{text:a,sessionId:r.sessionId,durationMs:Math.max(1,Date.now()-n),stopReason:"mock_stop",numTurns:1,status:"ok"}}}});function bt(e){let t=[Nl({claudeDir:e?.claudeDir}),Rl({codexDir:e?.codexDir,codeDir:e?.codeDir}),Ml({geminiDir:e?.geminiDir,claudeDir:e?.claudeDir,codexDir:e?.codexDir,codeDir:e?.codeDir}),Pl({copilotDir:e?.copilotDir}),ql(),Xl({lmplayerDbPath:e?.lmplayerDbPath}),Kl(),Ql({agyDir:e?.agyDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&t.push(sc()),t}var oc=T(()=>{"use strict";xl();Ll();jl();Fl();Hl();Gl();Yl();ec();ic();xl();Ll();jl();Fl();Hl();Gl();Yl();ec();ic()});var dc={};ye(dc,{ProviderRegistry:()=>Vn,TransportConnectionError:()=>Se,TransportError:()=>Qe,TransportJsonError:()=>oi,TransportProcessError:()=>Wt,TransportRpcError:()=>Bt,_resetDefaultRegistryForTests:()=>Z0,chat:()=>St,countTokens:()=>cc,createAdapterRegistry:()=>Et,createAllAdapters:()=>bt,listSessions:()=>lc,seed:()=>ac});function Ai(){return xi===null&&(xi=Et(bt())),xi}function Z0(){xi=null}function d_(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=d_(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 ac(e){let t=e.registry??Ai(),r=d_(t,e.provider),n=await c_(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 c_(t,e.provider,e.cwd),a=Q0(n,o);return a?{success:!0,sessionId:a,...i}:{success:!0,...i}}async function c_(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 Q0(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 lc(e={}){return(e.registry??Ai()).listAll({provider:e.provider,workspace:e.workspace,limit:e.limit,from:e.from,to:e.to})}async function cc(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";ll();oc();ll();oc();Yr();xi=null});function ex(){return uc===null&&(uc=Et(bt())),uc}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 rx(e)}catch(o){throw s=!0,i=o,o}finally{if(n)if(!s)nn.delete(r),t.setMemberState(r,"idle");else{let o=tx(i,r);t.setMemberState(r,o!==null?"attention_needed":"idle",o)}}}function tx(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 rx(e){let t=e.timeoutMs,r=typeof t=="number"&&t>0,n=ex(),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`,fc(e.sessionid,e.sessiondir,"unresolved")));s=d.provider.name}catch(d){return Promise.reject(new ve("other",null,`library: session resolution failed: ${u_(d)}`,fc(e.sessionid,e.sessiondir,"unresolved")))}let i=fc(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):nx(d,i)}finally{a!==null&&clearTimeout(a)}}function fc(e,t,r){return["<library>","chat",e,t,"--provider",r]}function u_(e){return e instanceof Error?e.message:String(e)}function nx(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 Wt?new ve("nonzero_exit",e.exitCode??null,e.stderr??e.message,t):e instanceof Bt?new ve("nonzero_exit",e.rpcCode??null,e.message,t):e instanceof Qe?new ve("other",null,e.message,t):new ve("other",null,u_(e),t)}var ve,uc,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"}},uc=null;nn=new Map});function f_(){return mc===null&&(mc=Et(bt())),mc}function ix(e,t){if(!sx.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=ix(e.member.provider,e.dal),r=t===e.member.provider?e.member:{...e.member,provider:t},n=await ox({member:r});return e.dal.setMemberProviderResolved(e.member.id,t),{sessionid:n.sessionid,provider_resolved:t}}async function ox(e){let t=e.member.provider,r=e.member.sessiondir,n=pc("seed",r,t);try{let s=await ac({provider:t,cwd:r,registry:f_()});if(!s.success)throw lx(s.error,n);if(!s.sessionId)throw new ke("parse",0,"",n);return{sessionid:s.sessionId}}catch(s){throw s instanceof ke?s:_c(s,n)}}async function m_(e){return ax(e)}async function ax(e){let t=f_(),r=pc("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:_c(i,r)}let s=pc("tokens",e.sessionid,n);try{let i=await cc({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:_c(i,s)}}function pc(e,t,r){return["<library>",e,t,"--provider",r]}function lx(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 _c(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 Wt?new ke("nonzero_exit",e.exitCode??null,e.stderr??e.message,t):e instanceof Bt?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,mc,sx,hc=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"}},mc=null;sx=/^provider[123]$/});function $i(e){return Buffer.from(e,"utf8").toString("base64url")}function is(e){return Buffer.from(e,"base64url").toString("utf8")}async function p_(e,t=r=>m_({sessionid:r})){if(process.env.LMCTL_SESSION_SIZE_DISABLED==="1")return{recorded:0,failed:0};let r=0,n=0;for(let s of cx(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 __(e,t,r){let n=h_(e,t,r);if(n===null||n.member.sessionid===null)throw new Error("session member not found");if(n.member.state!=="idle")throw new ss(r,n.member.state);e.setMemberState(n.member.id,"in_chat","compacting");try{return await Ri({sessionid:n.member.sessionid,sessiondir:n.member.sessiondir,prompt:"/compact"}),e.setMemberState(n.member.id,"idle",null),{ok:!0,row:g_(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 gc(e,t,r){let n=h_(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:g_(e,t,r)}}function cx(e){return e.listTeams().flatMap(t=>e.listTeamMembers(t.id).filter(r=>r.sessionid!==null).map(r=>({team_name:t.name,member:r})))}function h_(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 g_(e,t,r){return e.sessionSizeHistory(t,r,1)[0]??null}var ss,Ci=T(()=>{"use strict";Li();hc();ss=class extends Error{constructor(t,r){super(`member ${t} is currently ${r}; cannot compact while busy`),this.name="MemberBusyError"}}});async function yc(e){let t=e.dal,r=e.nowMs??Date.now(),n=e.thresholdMs??ux(t),s=r-n,i=t.query(`
1422
+ `):"":""}function Hp(e){return e.model||e.message?.model}var ki,Jp=T(()=>{"use strict";nr();ki=class{name="qwen";baseDir;constructor(t){this.baseDir=t?.qwenDir||ar(be,".qwen")}async discoverSessions(){let t=ar(this.baseDir,"projects"),r;try{r=await vi(t)}catch{return[]}let n=[];for(let s of r){let i=ar(t,s,"chats"),o;try{o=await vi(i)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),c=ar(i,a);try{let d=await this.extractSummary(c,l);d&&n.push(d)}catch{}}}return n}async extractSummary(t,r){let n=await Ce(t,30);if(n.length===0)return null;let s=await Ne(t),i="(unknown)",o,a,l,c,d=0;for(let u of n){if(u.cwd&&(i=u.cwd,u.version&&(a=u.version)),u.type==="system"&&u.cwd&&(i=u.cwd,u.version&&(a=u.version),u.model&&(o=u.model)),Wp(u)){let f=qp(u).trim();f&&(l||(l=J(f,80)),c=J(f,80)),d++}if(Bp(u)){let f=Hp(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=Up(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(Wp(f)){let _=qp(f);_.trim()&&(c||(c=J(_.trim(),80)),d=J(_.trim(),80)),u.push({role:"user",timestamp:p,content:_})}else if(Bp(f)){let _=Hp(f);if(_&&(i=_),Array.isArray(m.content))for(let g of m.content)g.type==="text"&&g.text?u.push({role:"assistant",timestamp:p,content:g.text,model:_}):g.type==="thinking"&&g.thinking&&u.push({role:"thinking",timestamp:p,content:g.thinking});else if(typeof m.content=="string")u.push({role:"assistant",timestamp:p,content:m.content,model:_});else if(Array.isArray(m.parts))for(let g of m.parts)if(g.thought||g.type==="thinking"){let h=g.thinking||g.text;h&&u.push({role:"thinking",timestamp:p,content:h})}else g.text&&u.push({role:"assistant",timestamp:p,content:g.text,model:_})}}return{provider:"qwen",sessionId:r,slug:l,cwd:s,createdAt:n.createdAt,modifiedAt:n.modifiedAt,model:i,cliVersion:o,gitBranch:a,startCommand:"qwen",firstUserMessage:c,lastUserMessage:d,messageCount:u.length,filePath:t,messages:u}}async resolveSessionPath(t){let r=ar(this.baseDir,"projects");try{let n=await vi(r),s=[];for(let i of n){let o=ar(r,i,"chats",`${t}.jsonl`);try{return await v0(o,{flag:"r"}),o}catch{continue}}for(let i of n){let o=ar(r,i,"chats"),a;try{a=await vi(o)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;Up(l,".jsonl").startsWith(t)&&s.push(ar(o,l))}}if(s.length===1)return s[0]}catch{}return null}async deleteSession(t){let r=await this.resolveSessionPath(t);if(!r)return!1;try{return await k0(r),!0}catch{return!1}}}});function Kl(){return new Vl}var Vl,Yl=T(()=>{"use strict";Jp();Ut();Ir();Tt();Vl=class extends xe{constructor(){super({provider:new ki,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"qwen",seedArgs:["-p",ge,"--approval-mode","yolo"],resumeTemplate:"qwen --resume {{session_id}}",startTemplate:"qwen",transport:pi})}seedArgsFor(t){let r=super.seedArgsFor(t);return t?.model?[...r,"--model",t.model]:r}}});import{readdir as Xp,readFile as I0,rm as Gp,stat as Vp}from"node:fs/promises";import{basename as zl,join as qt}from"node:path";async function N0(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 x0(e,t){if(!e)return t;let r=new Date(e);return Number.isNaN(r.getTime())?t:r}function Kp(e){return e.type==="USER_INPUT"}function Yp(e){return e.source==="MODEL"&&e.type==="PLANNER_RESPONSE"}function A0(e){return e.source==="MODEL"&&e.type!=="PLANNER_RESPONSE"}function zp(e){if(!e)return"";let t=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(e);return t?t[1]:e}function Zp(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 R0(e){if(e===void 0)return"";try{return JSON.stringify(e)}catch{return String(e)}}async function L0(e){for await(let t of We(e)){let r=t.tool_calls?.map(s=>s.args)??[];for(let s of r){let i=O0(s);if(i)return i}let n=$0(t.content);if(n)return n}return null}function O0(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 $0(e){return e?/"Cwd":"([^"]+)"/.exec(e)?.[1]??null:null}function Qp(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 Ii,e_=T(()=>{"use strict";nr();Ii=class{name="agy";baseDir;constructor(t={}){this.baseDir=t.agyDir||qt(be,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:qt(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let t=qt(this.baseDir,"conversations"),r;try{r=await Xp(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 qt(this.baseDir,"conversations",`${t}.db`)}transcriptPath(t){return qt(this.baseDir,"brain",t,".system_generated","logs","transcript.jsonl")}async existingTranscriptPath(t){let r=this.transcriptPath(t);try{return await Vp(r),r}catch{return null}}async extractSummary(t){let r=this.conversationPath(t),n=await this.existingTranscriptPath(t),s=n??r,i=await N0([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=Zp(f.content);if(m&&(a=m),Kp(f)){let p=zp(f.content).trim();p&&(l||(l=J(p,80)),c=J(p,80)),d++}else Yp(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=Qp(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=x0(d.created_at,s.modifiedAt),f=Zp(d.content);if(f&&(a=f),Kp(d)){let m=zp(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:R0(m.args),toolName:m.name||"tool"});Yp(d)&&d.content?o.push({role:"assistant",timestamp:u,content:d.content,model:a}):A0(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 Vp(r),r}catch{}let n=qt(this.baseDir,"conversations");try{let s=[];for(let i of await Xp(n)){if(!i.endsWith(".db"))continue;zl(i,".db").startsWith(t)&&s.push(qt(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=Qp(r);return n?(await Gp(this.conversationPath(n),{force:!0}),await Gp(qt(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 L0(r);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(t){let r=qt(this.baseDir,"cache","last_conversations.json");try{let n=JSON.parse(await I0(r,"utf8"));for(let[s,i]of Object.entries(n))if(i===t)return s}catch{}return null}}});import{spawn as C0}from"node:child_process";function Ql(e){return new Zl(e)}async function M0(e,t){let r=Date.now(),n=["--conversation",t.sessionId,"-p",e,"--dangerously-skip-permissions","--print-timeout",D0(t.timeoutMs)];t.model&&n.push("--model",t.model),at("agy",n,t.permissionMode??"yolo"),t.onProgress?.({kind:"system",summary:"agy -p one-shot started (no streaming events)"});let{stdout:s}=await j0(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 j0(e,t,r){return new Promise((n,s)=>{let i;try{i=C0(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 D0(e){return!e||e<=0?"8h":`${Math.max(1,Math.ceil(e/1e3))}s`}var Zl,ec=T(()=>{"use strict";e_();Ut();Tt();it();zr();Zl=class extends xe{constructor(t){super({provider:new Ii(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append",leaderSetupHint:"Antigravity uses one-shot print turns; no streaming events are available."},binary:"agy",seedArgs:["-p",ge,"--dangerously-skip-permissions","--print-timeout","2m"],resumeTemplate:"agy --conversation {{session_id}} --dangerously-skip-permissions",startTemplate:"agy --dangerously-skip-permissions",transport:M0})}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 P0}from"node:crypto";import{existsSync as F0,mkdirSync as U0,readFileSync as W0,renameSync as B0,writeFileSync as q0}from"node:fs";import{dirname as i_,join as t_,resolve as tc}from"node:path";function H0(e){return P0("sha256").update(e).digest("hex").slice(0,8)}function J0(e){let t=e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return t.length>0?t:"session"}function X0(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 o_(e){return e.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function Ni(e){return Math.max(1,Math.ceil(e.length/4))}function rn(e=process.cwd()){let t=process.env.LMCTL_CLAUDE_MOCK_STORE;if(t!==void 0&&t.trim().length>0)return tc(t);let r=process.env.LMCTL_DB;return r!==void 0&&r.trim().length>0?t_(i_(tc(r)),".lmctl-claude-mock","sessions.json"):t_(tc(e),".lmctl-claude-mock","sessions.json")}function r_(){return{schemaVersion:1,sessions:{}}}function ns(e){if(!F0(e))return r_();try{let t=JSON.parse(W0(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 r_()}}function a_(e,t){U0(i_(e),{recursive:!0});let r=`${e}.${process.pid}.${Date.now()}.tmp`;q0(r,`${JSON.stringify(t,null,2)}
1423
+ `,"utf8"),B0(r,e)}function G0(e){return{...e,timestamp:e.timestamp.toISOString()}}function V0(e){return{...e,timestamp:new Date(e.timestamp)}}function K0(e){return{...e,createdAt:e.createdAt.toISOString(),modifiedAt:e.modifiedAt.toISOString(),messages:e.messages.map(G0)}}function l_(e){return{...e,createdAt:new Date(e.createdAt),modifiedAt:new Date(e.modifiedAt),messages:e.messages.map(V0)}}function xi(e,t=process.cwd()){let r=tn.get(e);if(r!==void 0)return r;let s=ns(rn(t)).sessions[e];if(s===void 0)return;let i=l_(s);return tn.set(i.sessionId,i),i}function n_(e){tn.set(e.sessionId,e);let t=rn(e.cwd),r=ns(t);r.sessions[e.sessionId]=K0({...e,filePath:t}),a_(t,r)}function Y0(){let e=ns(rn()),t=Object.values(e.sessions).map(l_);for(let r of t)tn.set(r.sessionId,r);return t}function z0(e,t){let r=t.script;if(r===void 0)return;let n=r[e],s=r[o_(e)],i=n??s;if(typeof i=="string")return i;if(i!==void 0&&typeof i.text=="string")return i.text}function s_(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 sc(){return new nc}var tn,rc,nc,ic=T(()=>{"use strict";tn=new Map;rc=class{name="ClaudeMock";async discoverSessions(){let t=new Map;for(let r of Y0())t.set(r.sessionId,r);for(let r of tn.values())t.set(r.sessionId,r);return[...t.values()].map(s_)}async loadSession(t){let r=xi(t);return r===void 0?null:{...s_(r),messages:r.messages.slice()}}async resolveSessionPath(t){return xi(t)?.filePath??null}async deleteSession(t){let r=tn.delete(t),n=rn(),s=ns(n),i=s.sessions[t]!==void 0;return delete s.sessions[t],i&&a_(n,s),r||i}},nc=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new rc;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=J0(X0(t,r)),s=`mock-${n}-${H0(`${t}:${n}`)}`,i=new Date,o=rn(t),a=xi(s,t),l=r?.prompt??"ClaudeMock seed",c=Ni(l),d={sessionId:s,cwd:t,filePath:o,createdAt:a?.createdAt??i,modifiedAt:i,messages:a?.messages.slice()??[],totalInputTokens:a?.totalInputTokens??0,totalOutputTokens:a?.totalOutputTokens??0};return d.messages.push({role:"user",timestamp:i,content:l}),d.messages.push({role:"assistant",timestamp:i,content:"ACK: ClaudeMock seeded"}),d.totalInputTokens+=c,d.totalOutputTokens+=Ni("ACK: ClaudeMock seeded"),n_(d),{success:!0,sessionId:s}}resumeCommand(t){return`ClaudeMock --resume ${t}`}startCommand(){return"ClaudeMock"}manualSeedHint(t){return{launchCommand:`cd ${t} && ClaudeMock`,postLaunchNote:"ClaudeMock is a hermetic test provider; no manual seed is required.",lsCommand:`lmctl ls --provider ClaudeMock --sessiondir ${t}`}}forkHint(t){return"ClaudeMock does not support fork."}async fork(t,r){return{success:!1,error:"ClaudeMock does not support fork."}}async sendTurn(t,r){let n=Date.now(),s=xi(r.sessionId,r.cwd);if(s===void 0)throw new Error(`ClaudeMock session not found: ${r.sessionId}`);let i=new Date,o=ns(rn(r.cwd)),a=z0(t,o)??`ClaudeMock ack: ${o_(t)}`;return s.messages.push({role:"user",timestamp:i,content:t}),s.messages.push({role:"assistant",timestamp:i,content:a,model:r.model??"claude-mock"}),s.modifiedAt=i,s.totalInputTokens+=Ni(t),s.totalOutputTokens+=Ni(a),n_(s),r.onProgress?.({kind:"text",summary:"ClaudeMock deterministic reply"}),{text:a,sessionId:r.sessionId,durationMs:Math.max(1,Date.now()-n),stopReason:"mock_stop",numTurns:1,status:"ok"}}}});function bt(e){let t=[Nl({claudeDir:e?.claudeDir}),Rl({codexDir:e?.codexDir,codeDir:e?.codeDir}),Ml({geminiDir:e?.geminiDir,claudeDir:e?.claudeDir,codexDir:e?.codexDir,codeDir:e?.codeDir}),Pl({copilotDir:e?.copilotDir}),ql(),Xl({lmplayerDbPath:e?.lmplayerDbPath}),Kl(),Ql({agyDir:e?.agyDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&t.push(sc()),t}var oc=T(()=>{"use strict";xl();Ll();jl();Fl();Hl();Gl();Yl();ec();ic();xl();Ll();jl();Fl();Hl();Gl();Yl();ec();ic()});var dc={};we(dc,{ProviderRegistry:()=>Vn,TransportConnectionError:()=>Se,TransportError:()=>Qe,TransportJsonError:()=>ai,TransportProcessError:()=>Wt,TransportRpcError:()=>Bt,_resetDefaultRegistryForTests:()=>Z0,chat:()=>St,countTokens:()=>cc,createAdapterRegistry:()=>Et,createAllAdapters:()=>bt,listSessions:()=>lc,seed:()=>ac});function Ri(){return Ai===null&&(Ai=Et(bt())),Ai}function Z0(){Ai=null}function d_(e,t){let r=e.getAdapter(t);if(!r)throw new Error(`provider "${t}" is not registered in this registry`);return r}async function St(e){let t=e.registry??Ri(),r=d_(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 ac(e){let t=e.registry??Ri(),r=d_(t,e.provider),n=await c_(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 c_(t,e.provider,e.cwd),a=Q0(n,o);return a?{success:!0,sessionId:a,...i}:{success:!0,...i}}async function c_(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 Q0(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 lc(e={}){return(e.registry??Ri()).listAll({provider:e.provider,workspace:e.workspace,limit:e.limit,from:e.from,to:e.to})}async function cc(e){let r=await(e.registry??Ri()).getSession(e.sessionId,e.provider);if(!r)throw new Error(`session "${e.sessionId}" not found`);let n=r.totalInputTokens??0,s=r.totalCachedInputTokens??0,i=r.totalCacheWriteInputTokens??0,o=r.totalOutputTokens??0,a=r.totalReasoningOutputTokens??0;return{provider:r.provider,sessionId:r.sessionId,input:n,cachedInput:s,cacheWriteInput:i,output:o,reasoningOutput:a,total:n+s+i+o+a,lastTurn:r.lastTokenUsage}}var Ai,vt=T(()=>{"use strict";ll();oc();ll();oc();Yr();Ai=null});function ex(){return uc===null&&(uc=Et(bt())),uc}async function Li(e){let{dal:t,team_member_id:r}=e,n=t!==void 0&&r!==void 0;n&&t.setMemberState(r,"in_chat");let s=!1,i;try{return await rx(e)}catch(o){throw s=!0,i=o,o}finally{if(n)if(!s)nn.delete(r),t.setMemberState(r,"idle");else{let o=tx(i,r);t.setMemberState(r,o!==null?"attention_needed":"idle",o)}}}function tx(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 rx(e){let t=e.timeoutMs,r=typeof t=="number"&&t>0,n=ex(),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`,fc(e.sessionid,e.sessiondir,"unresolved")));s=d.provider.name}catch(d){return Promise.reject(new ve("other",null,`library: session resolution failed: ${u_(d)}`,fc(e.sessionid,e.sessiondir,"unresolved")))}let i=fc(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):nx(d,i)}finally{a!==null&&clearTimeout(a)}}function fc(e,t,r){return["<library>","chat",e,t,"--provider",r]}function u_(e){return e instanceof Error?e.message:String(e)}function nx(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 Wt?new ve("nonzero_exit",e.exitCode??null,e.stderr??e.message,t):e instanceof Bt?new ve("nonzero_exit",e.rpcCode??null,e.message,t):e instanceof Qe?new ve("other",null,e.message,t):new ve("other",null,u_(e),t)}var ve,uc,nn,Oi=T(()=>{"use strict";vt();ve=class extends Error{kind;exit_status;stderr;argv;constructor(t,r,n,s){super(`lmctl chat failed: ${t}`),this.kind=t,this.exit_status=r,this.stderr=n,this.argv=s,this.name="ChatError"}},uc=null;nn=new Map});function f_(){return mc===null&&(mc=Et(bt())),mc}function ix(e,t){if(!sx.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=ix(e.member.provider,e.dal),r=t===e.member.provider?e.member:{...e.member,provider:t},n=await ox({member:r});return e.dal.setMemberProviderResolved(e.member.id,t),{sessionid:n.sessionid,provider_resolved:t}}async function ox(e){let t=e.member.provider,r=e.member.sessiondir,n=pc("seed",r,t);try{let s=await ac({provider:t,cwd:r,registry:f_()});if(!s.success)throw lx(s.error,n);if(!s.sessionId)throw new ke("parse",0,"",n);return{sessionid:s.sessionId}}catch(s){throw s instanceof ke?s:_c(s,n)}}async function m_(e){return ax(e)}async function ax(e){let t=f_(),r=pc("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:_c(i,r)}let s=pc("tokens",e.sessionid,n);try{let i=await cc({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:_c(i,s)}}function pc(e,t,r){return["<library>",e,t,"--provider",r]}function lx(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 _c(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 Wt?new ke("nonzero_exit",e.exitCode??null,e.stderr??e.message,t):e instanceof Bt?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,mc,sx,hc=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"}},mc=null;sx=/^provider[123]$/});function Ci(e){return Buffer.from(e,"utf8").toString("base64url")}function is(e){return Buffer.from(e,"base64url").toString("utf8")}async function p_(e,t=r=>m_({sessionid:r})){if(process.env.LMCTL_SESSION_SIZE_DISABLED==="1")return{recorded:0,failed:0};let r=0,n=0;for(let s of cx(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 __(e,t,r){let n=h_(e,t,r);if(n===null||n.member.sessionid===null)throw new Error("session member not found");if(n.member.state!=="idle")throw new ss(r,n.member.state);e.setMemberState(n.member.id,"in_chat","compacting");try{return await Li({sessionid:n.member.sessionid,sessiondir:n.member.sessiondir,prompt:"/compact"}),e.setMemberState(n.member.id,"idle",null),{ok:!0,row:g_(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 gc(e,t,r){let n=h_(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:g_(e,t,r)}}function cx(e){return e.listTeams().flatMap(t=>e.listTeamMembers(t.id).filter(r=>r.sessionid!==null).map(r=>({team_name:t.name,member:r})))}function h_(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 g_(e,t,r){return e.sessionSizeHistory(t,r,1)[0]??null}var ss,Mi=T(()=>{"use strict";Oi();hc();ss=class extends Error{constructor(t,r){super(`member ${t} is currently ${r}; cannot compact while busy`),this.name="MemberBusyError"}}});async function yc(e){let t=e.dal,r=e.nowMs??Date.now(),n=e.thresholdMs??ux(t),s=r-n,i=t.query(`
1424
1424
  SELECT
1425
1425
  isess.id AS interactive_session_id,
1426
1426
  isess.run_id,
@@ -1446,16 +1446,16 @@ ${r}`:r}function gp(e,t){let r=DN[t.tool];return r?new Promise((n,s)=>{let i=t.b
1446
1446
  JOIN step s ON s.id = isess.step_id
1447
1447
  WHERE isess.status = 'waiting_agent'
1448
1448
  AND r.terminal_state IS NULL
1449
- `),o={scanned:i.length,hung_detected:0,attentions_created:0,duplicates_suppressed:0};for(let a of i){let l=px(a.workflow_definition,a.session_state_name,a.step_state_name);if(l===null)continue;let c=fx(t,a.team_id,l);if(c===null||c.sessionid===null)continue;let d=c.alias.toLowerCase()!=="lead",u=a.last_activity_at<s&&(a.last_event_at===null||a.last_event_at<s),f=a.started_at<s;if(!d||!u||!f)continue;let m={session_id:c.sessionid,step_id:a.step_id,member_alias:c.alias,provider:Ue(c),last_activity_at:a.last_activity_at,elapsed_ms:r-a.started_at,session_state:a.session_status,factors:{leaf:!0,no_activity:!0,elapsed:!0}};if(o.hung_detected+=1,mx(t,a.run_id,a.step_id,c.sessionid)){o.duplicates_suppressed+=1;continue}let p={run_id:a.run_id,project_id:a.project_id,payload:m};t.raiseAttention({kind:"session_hung",severity:"warn",project_id:a.project_id,run_id:a.run_id,requires_user:!0,payload:JSON.stringify(m)}),o.attentions_created+=1,e.enableKillHook===!0&&e.killHook!==void 0&&await e.killHook(p)}return o}function ux(e){return y_(e.getConfig(Mi),dx)*1e3}function wc(e,t){return y_(e.getConfig(ji),t)}function y_(e,t){if(e===null||e.trim().length===0)return t;let r=Number(e);return Number.isFinite(r)&&r>0?Math.floor(r):t}function fx(e,t,r){return e.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",t,r)[0]??null}function mx(e,t,r,n){return e.query(`SELECT * FROM attention
1449
+ `),o={scanned:i.length,hung_detected:0,attentions_created:0,duplicates_suppressed:0};for(let a of i){let l=px(a.workflow_definition,a.session_state_name,a.step_state_name);if(l===null)continue;let c=fx(t,a.team_id,l);if(c===null||c.sessionid===null)continue;let d=c.alias.toLowerCase()!=="lead",u=a.last_activity_at<s&&(a.last_event_at===null||a.last_event_at<s),f=a.started_at<s;if(!d||!u||!f)continue;let m={session_id:c.sessionid,step_id:a.step_id,member_alias:c.alias,provider:Ue(c),last_activity_at:a.last_activity_at,elapsed_ms:r-a.started_at,session_state:a.session_status,factors:{leaf:!0,no_activity:!0,elapsed:!0}};if(o.hung_detected+=1,mx(t,a.run_id,a.step_id,c.sessionid)){o.duplicates_suppressed+=1;continue}let p={run_id:a.run_id,project_id:a.project_id,payload:m};t.raiseAttention({kind:"session_hung",severity:"warn",project_id:a.project_id,run_id:a.run_id,requires_user:!0,payload:JSON.stringify(m)}),o.attentions_created+=1,e.enableKillHook===!0&&e.killHook!==void 0&&await e.killHook(p)}return o}function ux(e){return y_(e.getConfig(ji),dx)*1e3}function wc(e,t){return y_(e.getConfig(Di),t)}function y_(e,t){if(e===null||e.trim().length===0)return t;let r=Number(e);return Number.isFinite(r)&&r>0?Math.floor(r):t}function fx(e,t,r){return e.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",t,r)[0]??null}function mx(e,t,r,n){return e.query(`SELECT * FROM attention
1450
1450
  WHERE kind = 'session_hung'
1451
1451
  AND run_id = ?
1452
- AND acknowledged_at IS NULL`,t).some(i=>{let o=w_(i.payload);return o!==null&&o.step_id===r&&o.session_id===n})}function px(e,t,r){let n=w_(e);return n===null?null:_x(n,t,r)??hx(n,t,r)}function _x(e,t,r){if(!Array.isArray(e.steps))return null;let n=e.steps.filter(gx),s=n.find(a=>a.id===t)??n.find(a=>a.name===t)??n.find(a=>a.name===r);if(s===void 0||s.type!=="lmctl/interactive")return null;let i=Ar(s.members)?s.members:null,o=i!==null&&Ar(i.agent)?i.agent:null;return typeof o?.alias=="string"?o.alias:null}function hx(e,t,r){if(!Ar(e.states))return null;let n=e.states[t]??e.states[r];if(!Ar(n))return null;let s=n;if(!Ar(s.agent))return null;let i=s.agent;return typeof i.alias=="string"?i.alias:null}function gx(e){return Ar(e)}function w_(e){if(e===null)return null;try{let t=JSON.parse(e);return Ar(t)?t:null}catch{return null}}function Ar(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}var Mi,ji,dx,Ec=T(()=>{"use strict";Ze();Mi="monitor.session_hung.elapsed_threshold_seconds",ji="monitor.session_hung.check_interval_ms",dx=600});function Pi(e){let t=e.query(`
1452
+ AND acknowledged_at IS NULL`,t).some(i=>{let o=w_(i.payload);return o!==null&&o.step_id===r&&o.session_id===n})}function px(e,t,r){let n=w_(e);return n===null?null:_x(n,t,r)??hx(n,t,r)}function _x(e,t,r){if(!Array.isArray(e.steps))return null;let n=e.steps.filter(gx),s=n.find(a=>a.id===t)??n.find(a=>a.name===t)??n.find(a=>a.name===r);if(s===void 0||s.type!=="lmctl/interactive")return null;let i=Ar(s.members)?s.members:null,o=i!==null&&Ar(i.agent)?i.agent:null;return typeof o?.alias=="string"?o.alias:null}function hx(e,t,r){if(!Ar(e.states))return null;let n=e.states[t]??e.states[r];if(!Ar(n))return null;let s=n;if(!Ar(s.agent))return null;let i=s.agent;return typeof i.alias=="string"?i.alias:null}function gx(e){return Ar(e)}function w_(e){if(e===null)return null;try{let t=JSON.parse(e);return Ar(t)?t:null}catch{return null}}function Ar(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}var ji,Di,dx,Ec=T(()=>{"use strict";Ze();ji="monitor.session_hung.elapsed_threshold_seconds",Di="monitor.session_hung.check_interval_ms",dx=600});function Fi(e){let t=e.query(`
1453
1453
  SELECT status, COUNT(*) AS count FROM job GROUP BY status
1454
- `),r={queued:Di(t,"queued"),running:Di(t,"running"),done:Di(t,"done"),failed:Di(t,"failed"),total:bc(t)},n=e.query(`
1454
+ `),r={queued:Pi(t,"queued"),running:Pi(t,"running"),done:Pi(t,"done"),failed:Pi(t,"failed"),total:bc(t)},n=e.query(`
1455
1455
  SELECT terminal_state, COUNT(*) AS count FROM run GROUP BY terminal_state
1456
1456
  `),s=e.query(`
1457
1457
  SELECT acknowledged_at, COUNT(*) AS count FROM attention GROUP BY acknowledged_at IS NOT NULL
1458
- `);return{generated_at:new Date().toISOString(),jobs:r,runs:{active:n.filter(i=>i.terminal_state===null).reduce((i,o)=>i+o.count,0),terminal:n.filter(i=>i.terminal_state!==null).reduce((i,o)=>i+o.count,0),total:bc(n)},attentions:{unacked:s.filter(i=>i.acknowledged_at===null).reduce((i,o)=>i+o.count,0),total:bc(s)},projects:Tc(e,"project"),teams:Tc(e,"team"),workflows:Tc(e,"workflow")}}function Fi(e){return e.listProjects()}function b_(e){return e.listTeams().map(t=>({...t,members:e.listTeamMembers(t.id)}))}function Ui(e){return e.query(`
1458
+ `);return{generated_at:new Date().toISOString(),jobs:r,runs:{active:n.filter(i=>i.terminal_state===null).reduce((i,o)=>i+o.count,0),terminal:n.filter(i=>i.terminal_state!==null).reduce((i,o)=>i+o.count,0),total:bc(n)},attentions:{unacked:s.filter(i=>i.acknowledged_at===null).reduce((i,o)=>i+o.count,0),total:bc(s)},projects:Tc(e,"project"),teams:Tc(e,"team"),workflows:Tc(e,"workflow")}}function Ui(e){return e.listProjects()}function b_(e){return e.listTeams().map(t=>({...t,members:e.listTeamMembers(t.id)}))}function Wi(e){return e.query(`
1459
1459
  SELECT w.*
1460
1460
  FROM workflow w
1461
1461
  JOIN (
@@ -1464,7 +1464,7 @@ ${r}`:r}function gp(e,t){let r=DN[t.tool];return r?new Promise((n,s)=>{let i=t.b
1464
1464
  GROUP BY name
1465
1465
  ) latest ON latest.name = w.name AND latest.version = w.version
1466
1466
  ORDER BY w.name ASC
1467
- `)}function S_(e,t={}){return t.status!==void 0?e.query("SELECT * FROM job WHERE status = ? ORDER BY priority DESC, id ASC",t.status):e.query("SELECT * FROM job ORDER BY priority DESC, id ASC LIMIT 100")}function v_(e,t={}){if(t.pr_url!==void 0){let r=e.findSubmittedPrByUrl(t.pr_url);return r===null?[]:[r]}return e.listSubmittedPrs({status:t.status})}function k_(e,t){return e.getSubmittedPr(t)}function Wi(e,t){return e.query("SELECT * FROM job WHERE id = ?",t)[0]??null}function sn(e,t={}){return e.query("SELECT * FROM run ORDER BY id DESC LIMIT ?",t.limit??100)}function Rr(e,t){let r=e.query("SELECT * FROM run WHERE id = ?",t)[0];return r===void 0?null:{...r,job:Wi(e,r.job_id),workflow:e.query("SELECT * FROM workflow WHERE id = ?",r.workflow_id)[0]??null,team:e.getTeam(r.team_id),steps:yx(e,r.id)}}function yx(e,t){return e.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",t).map(r=>({...r,artifacts:I_(e,r.id)}))}function Sc(e,t,r){let n=e.query("SELECT * FROM step WHERE run_id = ? AND id = ?",t,r)[0];return n===void 0?null:{...n,artifacts:I_(e,n.id)}}function I_(e,t){return e.query("SELECT * FROM step_artifact WHERE step_id = ? ORDER BY id ASC",t)}function Lr(e,t,r){let n=r===void 0?"SELECT sa.*, s.state_name FROM step_artifact sa JOIN step s ON sa.step_id = s.id WHERE s.run_id = ? ORDER BY sa.id ASC":"SELECT sa.*, s.state_name FROM step_artifact sa JOIN step s ON sa.step_id = s.id WHERE s.run_id = ? AND sa.kind = ? ORDER BY sa.id ASC";return r===void 0?e.query(n,t):e.query(n,t,r)}function N_(e,t,r){let n=Sc(e,t,r);return n===null?null:(n.artifacts.find(i=>i.kind===`${n.state_name}_transcript`)??n.artifacts.find(i=>i.content!==null))?.content??null}function x_(e,t={}){return t.type!==void 0?e.query("SELECT * FROM external_object WHERE type = ? ORDER BY id DESC",t.type):e.query("SELECT * FROM external_object ORDER BY id DESC LIMIT 100")}function A_(e,t={}){return t.unhandled===!0?e.query("SELECT * FROM external_signal WHERE handled_at IS NULL ORDER BY id DESC"):e.query("SELECT * FROM external_signal ORDER BY id DESC LIMIT 100")}function cr(e,t={}){return t.unacked===!0?e.query("SELECT * FROM attention WHERE acknowledged_at IS NULL ORDER BY id DESC"):e.query("SELECT * FROM attention ORDER BY id DESC LIMIT 100")}function Bi(e,t={}){let r=[],n="a.kind IN ('interactive_waiting_operator', 'workflow_escalation')";return t.all!==!0&&(n+=" AND a.acknowledged_at IS NULL"),t.project!==void 0&&(n+=" AND p.name = ?",r.push(t.project)),t.since!==void 0&&(n+=" AND a.created_at >= ?",r.push(t.since)),e.query(`${R_}
1467
+ `)}function S_(e,t={}){return t.status!==void 0?e.query("SELECT * FROM job WHERE status = ? ORDER BY priority DESC, id ASC",t.status):e.query("SELECT * FROM job ORDER BY priority DESC, id ASC LIMIT 100")}function v_(e,t={}){if(t.pr_url!==void 0){let r=e.findSubmittedPrByUrl(t.pr_url);return r===null?[]:[r]}return e.listSubmittedPrs({status:t.status})}function k_(e,t){return e.getSubmittedPr(t)}function Bi(e,t){return e.query("SELECT * FROM job WHERE id = ?",t)[0]??null}function sn(e,t={}){return e.query("SELECT * FROM run ORDER BY id DESC LIMIT ?",t.limit??100)}function Rr(e,t){let r=e.query("SELECT * FROM run WHERE id = ?",t)[0];return r===void 0?null:{...r,job:Bi(e,r.job_id),workflow:e.query("SELECT * FROM workflow WHERE id = ?",r.workflow_id)[0]??null,team:e.getTeam(r.team_id),steps:yx(e,r.id)}}function yx(e,t){return e.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",t).map(r=>({...r,artifacts:I_(e,r.id)}))}function Sc(e,t,r){let n=e.query("SELECT * FROM step WHERE run_id = ? AND id = ?",t,r)[0];return n===void 0?null:{...n,artifacts:I_(e,n.id)}}function I_(e,t){return e.query("SELECT * FROM step_artifact WHERE step_id = ? ORDER BY id ASC",t)}function Lr(e,t,r){let n=r===void 0?"SELECT sa.*, s.state_name FROM step_artifact sa JOIN step s ON sa.step_id = s.id WHERE s.run_id = ? ORDER BY sa.id ASC":"SELECT sa.*, s.state_name FROM step_artifact sa JOIN step s ON sa.step_id = s.id WHERE s.run_id = ? AND sa.kind = ? ORDER BY sa.id ASC";return r===void 0?e.query(n,t):e.query(n,t,r)}function N_(e,t,r){let n=Sc(e,t,r);return n===null?null:(n.artifacts.find(i=>i.kind===`${n.state_name}_transcript`)??n.artifacts.find(i=>i.content!==null))?.content??null}function x_(e,t={}){return t.type!==void 0?e.query("SELECT * FROM external_object WHERE type = ? ORDER BY id DESC",t.type):e.query("SELECT * FROM external_object ORDER BY id DESC LIMIT 100")}function A_(e,t={}){return t.unhandled===!0?e.query("SELECT * FROM external_signal WHERE handled_at IS NULL ORDER BY id DESC"):e.query("SELECT * FROM external_signal ORDER BY id DESC LIMIT 100")}function cr(e,t={}){return t.unacked===!0?e.query("SELECT * FROM attention WHERE acknowledged_at IS NULL ORDER BY id DESC"):e.query("SELECT * FROM attention ORDER BY id DESC LIMIT 100")}function qi(e,t={}){let r=[],n="a.kind IN ('interactive_waiting_operator', 'workflow_escalation')";return t.all!==!0&&(n+=" AND a.acknowledged_at IS NULL"),t.project!==void 0&&(n+=" AND p.name = ?",r.push(t.project)),t.since!==void 0&&(n+=" AND a.created_at >= ?",r.push(t.since)),e.query(`${R_}
1468
1468
  WHERE ${n}
1469
1469
  ORDER BY a.created_at DESC`,...r).map(L_)}function kt(e,t){let n=e.query(`${R_}
1470
1470
  WHERE a.id = ?`,t)[0];return n===void 0?null:L_(n)}function L_(e){let{payload_json:t,...r}=e,n={...r,node_path:null,expected_response:null,transcript_tail:null,paused_at:null,created_run_inputs:null,workflow_version_id:null,workflow_step:null,escalation_tier:null,escalation_token:null,escalation_reason:null,declared_outcomes:null,agent_output:null};if(t==null)return n;let s;try{s=JSON.parse(t)}catch{return n}if(s===null||typeof s!="object")return n;let i=s;if(Array.isArray(i.node_path)&&i.node_path.every(o=>typeof o=="string")&&(n.node_path=i.node_path),i.expected_response!==null&&typeof i.expected_response=="object"){let o=i.expected_response;if(typeof o.kind=="string"){let a=Array.isArray(o.choices)&&o.choices.every(l=>typeof l=="string")?o.choices:null;n.expected_response={kind:o.kind,choices:a}}}if(Array.isArray(i.transcript_tail)&&i.transcript_tail.every(o=>typeof o=="string")&&(n.transcript_tail=i.transcript_tail),typeof i.paused_at=="string"&&(n.paused_at=i.paused_at),i.created_run_inputs!==null&&typeof i.created_run_inputs=="object"&&!Array.isArray(i.created_run_inputs)&&(n.created_run_inputs=i.created_run_inputs),typeof i.workflow_version_id=="number"?n.workflow_version_id=i.workflow_version_id:i.workflow_version_id===null&&(n.workflow_version_id=null),i.step!==null&&typeof i.step=="object"&&!Array.isArray(i.step)){let o=i.step;typeof o.id=="string"&&o.id.length>0&&(n.workflow_step={id:o.id,name:typeof o.name=="string"?o.name:null,type:typeof o.type=="string"?o.type:null})}return typeof i.tier=="string"&&(n.escalation_tier=i.tier),typeof i.token=="string"&&(n.escalation_token=i.token),typeof i.reason=="string"&&(n.escalation_reason=i.reason),Array.isArray(i.declared_outcomes)&&i.declared_outcomes.every(o=>typeof o=="string")&&(n.declared_outcomes=i.declared_outcomes),typeof i.agent_output=="string"&&(n.agent_output=i.agent_output),n}function O_(e){return e.query(`
@@ -1473,7 +1473,7 @@ ${r}`:r}function gp(e,t){let r=DN[t.tool];return r?new Promise((n,s)=>{let i=t.b
1473
1473
  JOIN workflow w ON w.id = r.workflow_id
1474
1474
  GROUP BY w.name, r.terminal_state
1475
1475
  ORDER BY w.name ASC, r.terminal_state ASC
1476
- `)}function Tc(e,t){return e.query(`SELECT COUNT(*) AS count FROM ${t}`)[0]?.count??0}function Di(e,t){return e.find(r=>r.status===t)?.count??0}function bc(e){return e.reduce((t,r)=>t+r.count,0)}function vc(e,t,r){let n=r!==void 0?new Date(Date.now()-Math.trunc(r)*864e5).toISOString():null,s=[t];n!==null&&s.push(n);let i=e.query(`SELECT s.state_name, s.outcome
1476
+ `)}function Tc(e,t){return e.query(`SELECT COUNT(*) AS count FROM ${t}`)[0]?.count??0}function Pi(e,t){return e.find(r=>r.status===t)?.count??0}function bc(e){return e.reduce((t,r)=>t+r.count,0)}function vc(e,t,r){let n=r!==void 0?new Date(Date.now()-Math.trunc(r)*864e5).toISOString():null,s=[t];n!==null&&s.push(n);let i=e.query(`SELECT s.state_name, s.outcome
1477
1477
  FROM step s
1478
1478
  JOIN run r ON r.id = s.run_id
1479
1479
  JOIN job j ON j.id = r.job_id
@@ -1540,9 +1540,9 @@ ${r}`:r}function gp(e,t){let r=DN[t.tool];return r?new Promise((n,s)=>{let i=t.b
1540
1540
  json_extract(payload, '$.elapsedMs') ASC`,r),o=new Map;for(let l of i){let c=o.get(l.tool_name)??[];c.push(l.elapsed_ms),o.set(l.tool_name,c)}let a=new Map(s.map(l=>[l.tool_name,l.cnt]));return n.map(l=>{let c=a.get(l.tool_name)??0,d=o.get(l.tool_name)??[],u=d.length>0?d.reduce((p,_)=>p+_,0)/d.length:null,f=d.length>0?d[Math.floor(d.length*.5)]??null:null,m=d.length>0?d[Math.floor(d.length*.95)]??null:null;return{tool_name:l.tool_name,invocations:l.cnt,successes:c,hit_rate_pct:l.cnt>0?`${(c/l.cnt*100).toFixed(1)}%`:"0.0%",avg_latency_ms:u!==null?Math.round(u):null,p50_latency_ms:f,p95_latency_ms:m}})}function $_(e){try{let t=JSON.parse(e);if(t.schema_version==="lmctl/v3"&&Array.isArray(t.steps)){let r=[],n=new Map,s=new Map;for(let i of t.steps){let o=typeof i.id=="string"?i.id:null;o!==null&&(r.push(o),typeof i.type=="string"&&s.set(o,i.type),typeof i.name=="string"&&i.name.length>0&&n.set(i.name,o))}return{schema:"v3",nodes:r,nodeTypes:s,nameToId:n}}if(t.states!==null&&typeof t.states=="object"){let r=t.states,n=new Map;for(let[l,c]of Object.entries(r))if(c!==null&&typeof c=="object"){let d=c.type;typeof d=="string"&&n.set(l,d)}let s=typeof t.start_at=="string"?t.start_at:null,i=Object.keys(r),o=s!==null&&i.includes(s)?[s,...i.filter(l=>l!==s)]:i,a=t.terminals!==null&&typeof t.terminals=="object"?Object.keys(t.terminals).map(l=>`@terminal:${l}`):[];for(let l of a)n.set(l,"Terminal");return{schema:"v2",nodes:[...o,...a],nodeTypes:n,nameToId:new Map}}}catch{}return{schema:"unknown",nodes:[],nodeTypes:new Map,nameToId:new Map}}function on(e,t){let r=e.query("SELECT * FROM run WHERE id = ?",t)[0];if(r===void 0)return null;let n=e.query("SELECT * FROM workflow WHERE id = ?",r.workflow_id)[0]??null,s=(()=>{let g=e.query("SELECT * FROM job WHERE id = ?",r.job_id)[0];return g===void 0?null:e.query("SELECT * FROM project WHERE id = ?",g.project_id)[0]?.name??null})(),i=n!==null?$_(n.definition):{schema:"unknown",nodes:[],nodeTypes:new Map,nameToId:new Map},o=e.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",t),a=g=>i.schema==="v3"&&i.nameToId.has(g)?i.nameToId.get(g):g,l=new Map;for(let g of o)l.set(a(g.state_name),g);let c=e.query(`SELECT state_name, status, last_agent_output
1541
1541
  FROM interactive_session
1542
1542
  WHERE run_id = ? AND status = 'waiting_operator'
1543
- ORDER BY id DESC LIMIT 1`,t)[0],d=c!==void 0?a(c.state_name):null,u=d,f=c?.last_agent_output??null;if(u===null){let g=o.find(h=>h.ended_at===null);g!==void 0?u=a(g.state_name):o.length>0?u=a(o[o.length-1].state_name):u=r.current_state}r.terminal_state!==null&&(u=`@terminal:${r.terminal_state}`,f=null);let m=new Set,p=[...i.nodes];for(let g of o){let h=a(g.state_name);!i.nodes.includes(h)&&!p.includes(h)&&p.push(h)}u!==null&&!p.includes(u)&&p.push(u);let _=[];for(let g of p){if(m.has(g))continue;m.add(g);let h=g===u,S=l.get(g),y="pending",w=null;if(g.startsWith("@terminal:"))y=r.terminal_state===g.slice(10)?"done":"pending";else if(S!==void 0&&(S.ended_at===null?y=h&&d===g?"paused":"running":S.outcome===null?y="failed":y="done",S.ended_at!==null)){let I=Date.parse(S.started_at),x=Date.parse(S.ended_at);!Number.isNaN(I)&&!Number.isNaN(x)&&(w=x-I)}h&&d===g&&(y="paused"),_.push({id:g,status:y,is_current:h,elapsed_ms:w,prompt:h&&y==="paused"?f:null,expected:h&&y==="paused"?"free_text":null})}return{run_id:t,workflow_name:n?.name??null,workflow_version:n?.version??null,workflow_version_id:r.workflow_version_id,project:s,paused:r.paused_at!==null&&r.terminal_state===null,terminal_state:r.terminal_state,current_state:u,nodes:_}}function qi(e){let t=[],r=e.workflow_name??"?",n=e.workflow_version!==null?`v${e.workflow_version}`:"v?",s=e.terminal_state!==null?`terminal:${e.terminal_state}`:e.paused?"paused":"running";t.push(`run: ${e.run_id} (${r}, ${n}) - ${s}`),e.project!==null&&t.push(`project: ${e.project}`),t.push(""),t.push("workflow tree:");for(let i of e.nodes)t.push(...wx(i));return`${t.join(`
1543
+ ORDER BY id DESC LIMIT 1`,t)[0],d=c!==void 0?a(c.state_name):null,u=d,f=c?.last_agent_output??null;if(u===null){let g=o.find(h=>h.ended_at===null);g!==void 0?u=a(g.state_name):o.length>0?u=a(o[o.length-1].state_name):u=r.current_state}r.terminal_state!==null&&(u=`@terminal:${r.terminal_state}`,f=null);let m=new Set,p=[...i.nodes];for(let g of o){let h=a(g.state_name);!i.nodes.includes(h)&&!p.includes(h)&&p.push(h)}u!==null&&!p.includes(u)&&p.push(u);let _=[];for(let g of p){if(m.has(g))continue;m.add(g);let h=g===u,S=l.get(g),y="pending",w=null;if(g.startsWith("@terminal:"))y=r.terminal_state===g.slice(10)?"done":"pending";else if(S!==void 0&&(S.ended_at===null?y=h&&d===g?"paused":"running":S.outcome===null?y="failed":y="done",S.ended_at!==null)){let I=Date.parse(S.started_at),x=Date.parse(S.ended_at);!Number.isNaN(I)&&!Number.isNaN(x)&&(w=x-I)}h&&d===g&&(y="paused"),_.push({id:g,status:y,is_current:h,elapsed_ms:w,prompt:h&&y==="paused"?f:null,expected:h&&y==="paused"?"free_text":null})}return{run_id:t,workflow_name:n?.name??null,workflow_version:n?.version??null,workflow_version_id:r.workflow_version_id,project:s,paused:r.paused_at!==null&&r.terminal_state===null,terminal_state:r.terminal_state,current_state:u,nodes:_}}function Hi(e){let t=[],r=e.workflow_name??"?",n=e.workflow_version!==null?`v${e.workflow_version}`:"v?",s=e.terminal_state!==null?`terminal:${e.terminal_state}`:e.paused?"paused":"running";t.push(`run: ${e.run_id} (${r}, ${n}) - ${s}`),e.project!==null&&t.push(`project: ${e.project}`),t.push(""),t.push("workflow tree:");for(let i of e.nodes)t.push(...wx(i));return`${t.join(`
1544
1544
  `)}
1545
- `}function wx(e){let t=[],r=Ex(e.status),n=[];e.status==="done"&&e.elapsed_ms!==null?n.push(`done, ${(e.elapsed_ms/1e3).toFixed(1)}s`):e.status==="failed"?n.push("failed"):e.status==="paused"?n.push("paused, waiting for operator input"):e.status==="running"?n.push("running"):e.status==="pending"&&n.push("pending");let s=n.length>0?`(${n.join(", ")})`:"",i=e.is_current?" <- CURRENT":"",o=e.id.padEnd(28);if(t.push(` ${r} ${o} ${s}${i}`.trimEnd()),e.is_current&&e.status==="paused"&&e.prompt!==null){let a=e.prompt.split(/\r?\n/)[0]??"",l=a.length>80?`${a.slice(0,80)}...`:a;t.push(` \u2514 prompt: "${l}"`),e.expected!==null&&t.push(` \u2514 expected: ${e.expected}`)}return t}function Ex(e){switch(e){case"done":return"[x]";case"failed":return"[!]";case"paused":return"[*]";case"running":return"[>]";case"pending":return"[ ]";default:return" "}}function Hi(e,t,r={}){let n=r.nowMs??Date.now(),s=e.query("SELECT * FROM run WHERE id = ?",t)[0];if(s===void 0)return null;let i=e.query("SELECT * FROM workflow WHERE id = ?",s.workflow_id)[0]??null,o=s.workflow_version_id===null?null:e.query("SELECT version FROM workflow_version WHERE id = ?",s.workflow_version_id)[0]??null,a=e.query("SELECT * FROM job WHERE id = ?",s.job_id)[0]??null,l=a===null?null:e.query("SELECT * FROM project WHERE id = ?",a.project_id)[0]??null,c=i!==null?$_(i.definition):{schema:"unknown",nodes:[],nodeTypes:new Map,nameToId:new Map},d=I=>c.schema==="v3"&&c.nameToId.has(I)?c.nameToId.get(I):I,u=e.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",t),f=new Map;for(let I of u)f.set(d(I.state_name),I);let m=e.query("SELECT * FROM interactive_session WHERE run_id = ? ORDER BY id ASC",t),p=new Map;for(let I of m)p.set(d(I.state_name),I);let _=new Map,g=e.query("SELECT MAX(timestamp_ms) AS timestamp_ms FROM session_event WHERE run_id = ? AND step_id IS NULL",t)[0]?.timestamp_ms??null;for(let I of e.query(`SELECT step_id, MAX(timestamp_ms) AS timestamp_ms
1545
+ `}function wx(e){let t=[],r=Ex(e.status),n=[];e.status==="done"&&e.elapsed_ms!==null?n.push(`done, ${(e.elapsed_ms/1e3).toFixed(1)}s`):e.status==="failed"?n.push("failed"):e.status==="paused"?n.push("paused, waiting for operator input"):e.status==="running"?n.push("running"):e.status==="pending"&&n.push("pending");let s=n.length>0?`(${n.join(", ")})`:"",i=e.is_current?" <- CURRENT":"",o=e.id.padEnd(28);if(t.push(` ${r} ${o} ${s}${i}`.trimEnd()),e.is_current&&e.status==="paused"&&e.prompt!==null){let a=e.prompt.split(/\r?\n/)[0]??"",l=a.length>80?`${a.slice(0,80)}...`:a;t.push(` \u2514 prompt: "${l}"`),e.expected!==null&&t.push(` \u2514 expected: ${e.expected}`)}return t}function Ex(e){switch(e){case"done":return"[x]";case"failed":return"[!]";case"paused":return"[*]";case"running":return"[>]";case"pending":return"[ ]";default:return" "}}function Ji(e,t,r={}){let n=r.nowMs??Date.now(),s=e.query("SELECT * FROM run WHERE id = ?",t)[0];if(s===void 0)return null;let i=e.query("SELECT * FROM workflow WHERE id = ?",s.workflow_id)[0]??null,o=s.workflow_version_id===null?null:e.query("SELECT version FROM workflow_version WHERE id = ?",s.workflow_version_id)[0]??null,a=e.query("SELECT * FROM job WHERE id = ?",s.job_id)[0]??null,l=a===null?null:e.query("SELECT * FROM project WHERE id = ?",a.project_id)[0]??null,c=i!==null?$_(i.definition):{schema:"unknown",nodes:[],nodeTypes:new Map,nameToId:new Map},d=I=>c.schema==="v3"&&c.nameToId.has(I)?c.nameToId.get(I):I,u=e.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",t),f=new Map;for(let I of u)f.set(d(I.state_name),I);let m=e.query("SELECT * FROM interactive_session WHERE run_id = ? ORDER BY id ASC",t),p=new Map;for(let I of m)p.set(d(I.state_name),I);let _=new Map,g=e.query("SELECT MAX(timestamp_ms) AS timestamp_ms FROM session_event WHERE run_id = ? AND step_id IS NULL",t)[0]?.timestamp_ms??null;for(let I of e.query(`SELECT step_id, MAX(timestamp_ms) AS timestamp_ms
1546
1546
  FROM session_event
1547
1547
  WHERE run_id = ? AND step_id IS NOT NULL
1548
1548
  GROUP BY step_id`,t))I.step_id!==null&&_.set(I.step_id,I.timestamp_ms);let h=Tx(c,u,d),S=bx(s.current_state),y=e.query(`SELECT kind, severity, payload
@@ -1550,9 +1550,9 @@ ${r}`:r}function gp(e,t){let r=DN[t.tool];return r?new Promise((n,s)=>{let i=t.b
1550
1550
  WHERE run_id = ?
1551
1551
  AND kind = 'session_hung'
1552
1552
  AND acknowledged_at IS NULL
1553
- ORDER BY id ASC`,t).map(I=>({kind:I.kind,severity:I.severity,payload:Ax(I.payload)})),w=h.map(I=>{let x=f.get(I),U=p.get(I),ue=Sx(s,I,S,x,U),W=x===void 0?null:Date.parse(x.started_at),M=x?.ended_at===null||x===void 0?null:Date.parse(x.ended_at),A=x===void 0||Number.isNaN(W??NaN)?null:M!==null&&!Number.isNaN(M)?M-W:ue==="running"||ue==="paused"?n-W:null,Q=x===void 0?null:_.get(x.id)??null,B=Rx(U?.last_activity_at??null,Q,g),k=i===null||U===void 0?void 0:Ix(e,s.team_id,i.definition,U.state_name,x?.state_name??I);return{step_id:x?.id??null,state_id:I,status:ue,started_at:x?.started_at??null,ended_at:x?.ended_at??null,last_activity_at:B,elapsed_ms:A,...k!==void 0?{member:k}:{},...U!==void 0?{interactive_session:{id:U.id,status:U.status,turn_count:U.turn_count,state_name:U.state_name}}:{}}});return{run_id:t,workflow_name:i?.name??null,workflow_version:o?.version??i?.version??null,workflow_version_id:s.workflow_version_id,project:l?.name??null,status:kx(s,a,w),submitted_at:a?.enqueued_at??s.started_at,nodes:w,current_node_index:vx(w,s.terminal_state!==null),related_attentions:y}}function Ji(e,t={}){let r=t.nowMs??Date.now(),n=[],s=e.workflow_name??"?",i=e.workflow_version!==null?`v${e.workflow_version}`:"v?";n.push(`run ${e.run_id} - ${s}, ${i} - ${e.status}`);let o=`${e.submitted_at} (${T_(Date.parse(e.submitted_at),r)} ago)`;n.push(`project: ${e.project??"?"} | submitted: ${o}`),n.push(""),n.push("timeline:"),n.push(`${E_(e.submitted_at,e.submitted_at)} submit`);for(let a of e.nodes){let l=a.started_at===null?"[ ]":E_(e.submitted_at,a.started_at),c=a.status.padEnd(7),d=a.elapsed_ms===null?"":` elapsed ${Xi(a.elapsed_ms)}`;if(n.push(`${l} ${a.state_id.padEnd(24)} ${c}${d}`.trimEnd()),a.interactive_session!==void 0){let u=a.last_activity_at===null?"last activity unknown":`last activity ${T_(a.last_activity_at,r)} ago`,f=a.member!==void 0?`${a.member.alias} member`:"interactive member";n.push(` ${" ".repeat(24)} ${u}`),n.push(` ${" ".repeat(24)} ${f}, ${a.interactive_session.status}`)}}if(e.related_attentions.length>0){n.push(""),n.push("attentions:");for(let a of e.related_attentions)n.push(`- ${a.kind}${Lx(a.payload)}`)}return`${n.join(`
1553
+ ORDER BY id ASC`,t).map(I=>({kind:I.kind,severity:I.severity,payload:Ax(I.payload)})),w=h.map(I=>{let x=f.get(I),U=p.get(I),ue=Sx(s,I,S,x,U),W=x===void 0?null:Date.parse(x.started_at),M=x?.ended_at===null||x===void 0?null:Date.parse(x.ended_at),A=x===void 0||Number.isNaN(W??NaN)?null:M!==null&&!Number.isNaN(M)?M-W:ue==="running"||ue==="paused"?n-W:null,Q=x===void 0?null:_.get(x.id)??null,B=Rx(U?.last_activity_at??null,Q,g),k=i===null||U===void 0?void 0:Ix(e,s.team_id,i.definition,U.state_name,x?.state_name??I);return{step_id:x?.id??null,state_id:I,status:ue,started_at:x?.started_at??null,ended_at:x?.ended_at??null,last_activity_at:B,elapsed_ms:A,...k!==void 0?{member:k}:{},...U!==void 0?{interactive_session:{id:U.id,status:U.status,turn_count:U.turn_count,state_name:U.state_name}}:{}}});return{run_id:t,workflow_name:i?.name??null,workflow_version:o?.version??i?.version??null,workflow_version_id:s.workflow_version_id,project:l?.name??null,status:kx(s,a,w),submitted_at:a?.enqueued_at??s.started_at,nodes:w,current_node_index:vx(w,s.terminal_state!==null),related_attentions:y}}function Xi(e,t={}){let r=t.nowMs??Date.now(),n=[],s=e.workflow_name??"?",i=e.workflow_version!==null?`v${e.workflow_version}`:"v?";n.push(`run ${e.run_id} - ${s}, ${i} - ${e.status}`);let o=`${e.submitted_at} (${T_(Date.parse(e.submitted_at),r)} ago)`;n.push(`project: ${e.project??"?"} | submitted: ${o}`),n.push(""),n.push("timeline:"),n.push(`${E_(e.submitted_at,e.submitted_at)} submit`);for(let a of e.nodes){let l=a.started_at===null?"[ ]":E_(e.submitted_at,a.started_at),c=a.status.padEnd(7),d=a.elapsed_ms===null?"":` elapsed ${Gi(a.elapsed_ms)}`;if(n.push(`${l} ${a.state_id.padEnd(24)} ${c}${d}`.trimEnd()),a.interactive_session!==void 0){let u=a.last_activity_at===null?"last activity unknown":`last activity ${T_(a.last_activity_at,r)} ago`,f=a.member!==void 0?`${a.member.alias} member`:"interactive member";n.push(` ${" ".repeat(24)} ${u}`),n.push(` ${" ".repeat(24)} ${f}, ${a.interactive_session.status}`)}}if(e.related_attentions.length>0){n.push(""),n.push("attentions:");for(let a of e.related_attentions)n.push(`- ${a.kind}${Lx(a.payload)}`)}return`${n.join(`
1554
1554
  `)}
1555
- `}function Tx(e,t,r){let n=e.nodes.filter(s=>s.startsWith("@terminal:")?!1:e.nodeTypes.get(s)!=="lmctl/terminal"&&e.nodeTypes.get(s)!=="Terminal");for(let s of t){let i=r(s.state_name);n.includes(i)||n.push(i)}return n}function bx(e){return e===null?null:e.startsWith("__paused__:")?e.slice(11):e}function Sx(e,t,r,n,s){return n===void 0?"pending":n.ended_at===null?s?.status==="waiting_operator"||e.paused_at!==null&&r===t?"paused":"running":n.outcome===null?"failed":"done"}function vx(e,t){if(e.length===0)return null;let r=e.findIndex(s=>s.status==="running"||s.status==="paused"||s.status==="failed");if(r>=0)return r;if(t){for(let s=e.length-1;s>=0;s-=1)if(e[s].status==="done")return s}let n=e.findIndex(s=>s.status==="pending");return n>=0?n:e.length-1}function kx(e,t,r){return e.terminal_state!==null?e.terminal_state:e.paused_at!==null?"paused":t?.status==="failed"||r.some(n=>n.status==="failed")?"failed":"running"}function Ix(e,t,r,n,s){let i=Nx(r,n,s);if(i===null)return;let o=e.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",t,i)[0];return o===void 0?void 0:{alias:o.alias,provider:Ue(o)}}function Nx(e,t,r){let n=xx(e);if(n===null)return null;if(Array.isArray(n.steps)){let s=n.steps.find(a=>lr(a)?a.id===t||a.name===t||a.name===r:!1),i=lr(s?.members)?s.members:null,o=i!==null&&lr(i.agent)?i.agent:null;return typeof o?.alias=="string"?o.alias:null}if(lr(n.states)){let s=n.states[t]??n.states[r];if(!lr(s))return null;let i=lr(s.agent)?s.agent:null;return typeof i?.alias=="string"?i.alias:null}return null}function xx(e){try{let t=JSON.parse(e);return lr(t)?t:null}catch{return null}}function Ax(e){if(e===null)return null;try{return JSON.parse(e)}catch{return e}}function lr(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Rx(...e){let t=e.filter(r=>r!==null&&Number.isFinite(r));return t.length===0?null:Math.max(...t)}function E_(e,t){let r=Date.parse(e),n=Date.parse(t);return Number.isNaN(r)||Number.isNaN(n)?"[+? ]":`[+${Xi(Math.max(0,n-r)).padEnd(6)}]`}function T_(e,t){return Number.isNaN(e)?"?":Xi(Math.max(0,t-e))}function Xi(e){let t=Math.max(0,Math.round(e/1e3));if(t<60)return`${t}s`;let r=Math.floor(t/60),n=t%60;if(r<60)return n===0?`${r}m`:`${r}m${n}s`;let s=Math.floor(r/60),i=r%60;return i===0?`${s}h`:`${s}h${i}m`}function Lx(e){if(!lr(e))return"";let t=typeof e.step_id=="number"?` on step ${e.step_id}`:"",r=typeof e.member_alias=="string"?e.member_alias:null,n=typeof e.provider=="string"?e.provider:null,s=typeof e.elapsed_ms=="number"?`, ${Xi(e.elapsed_ms)} elapsed`:"",i=r===null?"":` (${r}${n===null?"":` ${n}`}${s})`;return`${t}${i}`}var R_,Ht=T(()=>{"use strict";Ze();R_=`SELECT a.id AS attention_id,
1555
+ `}function Tx(e,t,r){let n=e.nodes.filter(s=>s.startsWith("@terminal:")?!1:e.nodeTypes.get(s)!=="lmctl/terminal"&&e.nodeTypes.get(s)!=="Terminal");for(let s of t){let i=r(s.state_name);n.includes(i)||n.push(i)}return n}function bx(e){return e===null?null:e.startsWith("__paused__:")?e.slice(11):e}function Sx(e,t,r,n,s){return n===void 0?"pending":n.ended_at===null?s?.status==="waiting_operator"||e.paused_at!==null&&r===t?"paused":"running":n.outcome===null?"failed":"done"}function vx(e,t){if(e.length===0)return null;let r=e.findIndex(s=>s.status==="running"||s.status==="paused"||s.status==="failed");if(r>=0)return r;if(t){for(let s=e.length-1;s>=0;s-=1)if(e[s].status==="done")return s}let n=e.findIndex(s=>s.status==="pending");return n>=0?n:e.length-1}function kx(e,t,r){return e.terminal_state!==null?e.terminal_state:e.paused_at!==null?"paused":t?.status==="failed"||r.some(n=>n.status==="failed")?"failed":"running"}function Ix(e,t,r,n,s){let i=Nx(r,n,s);if(i===null)return;let o=e.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",t,i)[0];return o===void 0?void 0:{alias:o.alias,provider:Ue(o)}}function Nx(e,t,r){let n=xx(e);if(n===null)return null;if(Array.isArray(n.steps)){let s=n.steps.find(a=>lr(a)?a.id===t||a.name===t||a.name===r:!1),i=lr(s?.members)?s.members:null,o=i!==null&&lr(i.agent)?i.agent:null;return typeof o?.alias=="string"?o.alias:null}if(lr(n.states)){let s=n.states[t]??n.states[r];if(!lr(s))return null;let i=lr(s.agent)?s.agent:null;return typeof i?.alias=="string"?i.alias:null}return null}function xx(e){try{let t=JSON.parse(e);return lr(t)?t:null}catch{return null}}function Ax(e){if(e===null)return null;try{return JSON.parse(e)}catch{return e}}function lr(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Rx(...e){let t=e.filter(r=>r!==null&&Number.isFinite(r));return t.length===0?null:Math.max(...t)}function E_(e,t){let r=Date.parse(e),n=Date.parse(t);return Number.isNaN(r)||Number.isNaN(n)?"[+? ]":`[+${Gi(Math.max(0,n-r)).padEnd(6)}]`}function T_(e,t){return Number.isNaN(e)?"?":Gi(Math.max(0,t-e))}function Gi(e){let t=Math.max(0,Math.round(e/1e3));if(t<60)return`${t}s`;let r=Math.floor(t/60),n=t%60;if(r<60)return n===0?`${r}m`:`${r}m${n}s`;let s=Math.floor(r/60),i=r%60;return i===0?`${s}h`:`${s}h${i}m`}function Lx(e){if(!lr(e))return"";let t=typeof e.step_id=="number"?` on step ${e.step_id}`:"",r=typeof e.member_alias=="string"?e.member_alias:null,n=typeof e.provider=="string"?e.provider:null,s=typeof e.elapsed_ms=="number"?`, ${Gi(e.elapsed_ms)} elapsed`:"",i=r===null?"":` (${r}${n===null?"":` ${n}`}${s})`;return`${t}${i}`}var R_,Ht=T(()=>{"use strict";Ze();R_=`SELECT a.id AS attention_id,
1556
1556
  a.kind AS kind,
1557
1557
  a.severity AS severity,
1558
1558
  a.created_at AS created_at,
@@ -1574,10 +1574,10 @@ ${r}`:r}function gp(e,t){let r=DN[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 K_={};ye(K_,{parseApiArgs:()=>P_,readApiClientConfig:()=>Ic,runApi:()=>Dx});import{readFileSync as Ox}from"node:fs";import{basename as $x,extname as Cx}from"node:path";async function Dx(e,t={stdout:process.stdout,stderr:process.stderr}){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(jx),0;if(e[0]==="config")return Fx(e.slice(1),t);let r=G_(e,"--direct");if(r.rest[0]==="escalations")return Ux(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(`${Hx}
1577
+ )`});var K_={};we(K_,{parseApiArgs:()=>P_,readApiClientConfig:()=>Ic,runApi:()=>Dx});import{readFileSync as Ox}from"node:fs";import{basename as $x,extname as Cx}from"node:path";async function Dx(e,t={stdout:process.stdout,stderr:process.stderr}){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(jx),0;if(e[0]==="config")return Fx(e.slice(1),t);let r=G_(e,"--direct");if(r.rest[0]==="escalations")return Ux(r.rest.slice(1),t,r.present);if(r.rest[0]==="workflows"&&r.rest[1]==="verify"&&Yi(r.rest.slice(2)))return t.stdout.write(`${Hx}
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
- `),2):PA(r.rest.slice(2),t);if(r.rest[0]==="run"&&r.rest[1]==="where"&&Ki(r.rest.slice(2)))return t.stdout.write(`${Bx}
1580
- `),0;if(r.rest[0]==="run"&&r.rest[1]==="timeline"&&Ki(r.rest.slice(2)))return t.stdout.write(`${qx}
1579
+ `),2):PA(r.rest.slice(2),t);if(r.rest[0]==="run"&&r.rest[1]==="where"&&Yi(r.rest.slice(2)))return t.stdout.write(`${Bx}
1580
+ `),0;if(r.rest[0]==="run"&&r.rest[1]==="timeline"&&Yi(r.rest.slice(2)))return t.stdout.write(`${qx}
1581
1581
  `),0;if(r.rest[0]==="run"&&r.rest[1]==="where")return r.present?CA(r.rest.slice(2),t):MA(r.rest.slice(2),t);if(r.rest[0]==="run"&&r.rest[1]==="timeline")return r.present?jA(r.rest.slice(2),t):DA(r.rest.slice(2),t);if(r.present)return wA(r.rest,t);let n=P_(e);if(typeof n=="string")return t.stderr.write(`error: ${n}
1582
1582
  `),2;let s=Or(t),i=s.baseUrl,o=dr(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)}
@@ -1589,24 +1589,24 @@ ${r}`:r}function gp(e,t){let r=DN[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 P_(e){let t=W_(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"?lA(i.slice(1),t.format):Vi(i,"/api/workflows",n):s==="workflow"?aA(i,n):s==="upload"?iA(i,n):s==="submit-job"?oA(i,n):s==="issues"?sA(i,n):s==="jobs"?os(i,"--status","/api/jobs","status",n):s==="job"?nA(i,n):s==="project"?cA(i,n):s==="artifact"?fA(i,n):s==="runs"?os(i,"--limit","/api/runs","limit",n,!0):s==="external-objects"?os(i,"--type","/api/external-objects","type",n):s==="external-signals"?M_(i,"--unhandled","/api/external-signals","unhandled",n):s==="attentions"||s==="attention"?i[0]==="ack"?mA(i,n):M_(i,"--unacked","/api/attentions","unacked",n):s==="stats"?pA(i,n):s==="daemon"?_A(i,n):s==="intake"?hA(i,n):s==="session"?gA(i,n):s==="run"?yA(i,t.format):s==="prs"?os(i,"--status","/api/submitted-prs","status",n):s==="pr"?tA(i,n):`unknown subcommand: ${s}`}function dr(e,t){let r={Accept:e};return t!==null&&t.length>0&&(r.Authorization=`Bearer ${t}`),r}function Or(e){if(e.dal!==void 0)return Ic(e.dal,process.env,e);let t=Ie({path:le()});try{return Ic(t,process.env,e)}finally{t.close()}}function Ic(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=Mx;let o=e.getConfig("api.token"),a;o!==null?a=o:t.LMCTL_API_TOKEN!==void 0&&t.LMCTL_API_TOKEN.length>0?(a=t.LMCTL_API_TOKEN,n.push("api.token")):a=null;for(let l of n)r.stderr.write(`note: ${Px(l)} env var read; consider \`lmctl api config set ${l} ...\` to make this DB-canonical.
1592
+ `));return 0}function P_(e){let t=W_(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"?Ki(i,"/api/status",n):s==="projects"?Ki(i,"/api/projects",n):s==="teams"?Ki(i,"/api/teams",n):s==="workflows"?i[0]==="verify"?lA(i.slice(1),t.format):Ki(i,"/api/workflows",n):s==="workflow"?aA(i,n):s==="upload"?iA(i,n):s==="submit-job"?oA(i,n):s==="issues"?sA(i,n):s==="jobs"?os(i,"--status","/api/jobs","status",n):s==="job"?nA(i,n):s==="project"?cA(i,n):s==="artifact"?fA(i,n):s==="runs"?os(i,"--limit","/api/runs","limit",n,!0):s==="external-objects"?os(i,"--type","/api/external-objects","type",n):s==="external-signals"?M_(i,"--unhandled","/api/external-signals","unhandled",n):s==="attentions"||s==="attention"?i[0]==="ack"?mA(i,n):M_(i,"--unacked","/api/attentions","unacked",n):s==="stats"?pA(i,n):s==="daemon"?_A(i,n):s==="intake"?hA(i,n):s==="session"?gA(i,n):s==="run"?yA(i,t.format):s==="prs"?os(i,"--status","/api/submitted-prs","status",n):s==="pr"?tA(i,n):`unknown subcommand: ${s}`}function dr(e,t){let r={Accept:e};return t!==null&&t.length>0&&(r.Authorization=`Bearer ${t}`),r}function Or(e){if(e.dal!==void 0)return Ic(e.dal,process.env,e);let t=Ie({path:le()});try{return Ic(t,process.env,e)}finally{t.close()}}function Ic(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=Mx;let o=e.getConfig("api.token"),a;o!==null?a=o:t.LMCTL_API_TOKEN!==void 0&&t.LMCTL_API_TOKEN.length>0?(a=t.LMCTL_API_TOKEN,n.push("api.token")):a=null;for(let l of n)r.stderr.write(`note: ${Px(l)} env var read; consider \`lmctl api config set ${l} ...\` to make this DB-canonical.
1593
1593
  `);return{baseUrl:i,token:a}}function Px(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 Fx(e,t){let[r,...n]=e;if(r===void 0)return t.stderr.write(`usage: lmctl api config <get|set|list>
1594
1594
  `),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>
1595
- `),2;let o=n[0];if(!Gi.has(o))return t.stderr.write(`error: unsupported config key: ${o} (Phase A keys: ${[...Gi].join(", ")})
1595
+ `),2;let o=n[0];if(!Vi.has(o))return t.stderr.write(`error: unsupported config key: ${o} (Phase A keys: ${[...Vi].join(", ")})
1596
1596
  `),2;let a=i.getConfig(o);return a===null?(t.stderr.write(`error: ${o} is not set
1597
1597
  `),1):(t.stdout.write(`${a}
1598
1598
  `),0)}if(r==="set"){if(n.length!==2)return t.stderr.write(`usage: lmctl api config set <key> <value>
1599
- `),2;let[o,a]=n;if(!Gi.has(o))return t.stderr.write(`error: unsupported config key: ${o} (Phase A keys: ${[...Gi].join(", ")})
1599
+ `),2;let[o,a]=n;if(!Vi.has(o))return t.stderr.write(`error: unsupported config key: ${o} (Phase A keys: ${[...Vi].join(", ")})
1600
1600
  `),2;let l=zx(o,a);return l!==null?(t.stderr.write(`error: ${l}
1601
1601
  `),2):(i.setConfig(o,a),t.stdout.write(`${o} = ${C_(o,a,!1)}
1602
1602
  `),0)}if(r==="list"){let o=!1;for(let c of n){if(c==="--show-secrets"){o=!0;continue}return t.stderr.write(`error: unknown flag: ${c}
1603
1603
  `),2}let a=i.getConfigAll(),l=Object.keys(a).sort();if(l.length===0)return t.stdout.write(`(no config rows)
1604
1604
  `),0;for(let c of l)t.stdout.write(`${c} = ${C_(c,a[c],o)}
1605
1605
  `);return 0}return t.stderr.write(`error: unknown api config verb: ${r}
1606
- `),2}finally{s&&i.close()}}async function Ux(e,t,r){if(Ki(e))return t.stdout.write(`${Wx}
1606
+ `),2}finally{s&&i.close()}}async function Ux(e,t,r){if(Yi(e))return t.stdout.write(`${Wx}
1607
1607
  `),0;let n=G_(e,"--direct"),s=r||n.present,i=n.rest,[o,...a]=i;return o===void 0?(t.stderr.write(`usage: lmctl api escalations <list|show|respond>
1608
1608
  `),2):s?Jx(o,a,t):o==="list"?Gx(a,t):o==="show"?Kx(a,t):o==="respond"?Yx(a,t):(t.stderr.write(`error: unknown api escalations verb: ${o}
1609
- `),2)}function Ki(e){return e.some(t=>t==="--help"||t==="-h")}function Jx(e,t,r){let n=r.dal===void 0,s=r.dal??Ie({path:le()});try{return V_(s,[e,...t],r)}finally{n&&s.close()}}function F_(e){let t,r=!1,n=!1,s;for(let o=0;o<e.length;o+=1){let a=e[o];if(a==="--json"){r=!0;continue}if(a==="--all"){n=!0;continue}if(a==="--project"){let l=e[++o];if(l===void 0||l.startsWith("--"))return"missing value for --project";t=l;continue}if(a==="--since"){let l=e[++o];if(l===void 0||l.startsWith("--"))return"missing value for --since";let c=Xx(l);if(typeof c=="object"&&"error"in c)return c.error;s=c.iso;continue}return re(a)}let i={json:r,all:n};return t!==void 0&&(i.project=t),s!==void 0&&(i.since=s),i}function Xx(e){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.isNaN(r)?{error:`invalid --since value: ${e} (expected ISO8601 or duration like 24h)`}:{iso:new Date(r).toISOString()}}async function Gx(e,t){let r=F_(e);if(typeof r=="string")return t.stderr.write(`error: ${r}
1609
+ `),2)}function Yi(e){return e.some(t=>t==="--help"||t==="-h")}function Jx(e,t,r){let n=r.dal===void 0,s=r.dal??Ie({path:le()});try{return V_(s,[e,...t],r)}finally{n&&s.close()}}function F_(e){let t,r=!1,n=!1,s;for(let o=0;o<e.length;o+=1){let a=e[o];if(a==="--json"){r=!0;continue}if(a==="--all"){n=!0;continue}if(a==="--project"){let l=e[++o];if(l===void 0||l.startsWith("--"))return"missing value for --project";t=l;continue}if(a==="--since"){let l=e[++o];if(l===void 0||l.startsWith("--"))return"missing value for --since";let c=Xx(l);if(typeof c=="object"&&"error"in c)return c.error;s=c.iso;continue}return re(a)}let i={json:r,all:n};return t!==void 0&&(i.project=t),s!==void 0&&(i.since=s),i}function Xx(e){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.isNaN(r)?{error:`invalid --since value: ${e} (expected ISO8601 or duration like 24h)`}:{iso:new Date(r).toISOString()}}async function Gx(e,t){let r=F_(e);if(typeof r=="string")return t.stderr.write(`error: ${r}
1610
1610
  `),2;let n=Or(t),s=dr("application/json",n.token),i=new URLSearchParams;r.project!==void 0&&i.set("project",r.project),r.all&&i.set("all","true"),r.since!==void 0&&i.set("since",r.since);let o=i.toString().length>0?`?${i.toString()}`:"",a;try{a=await fetch(new URL(`/api/escalations${o}`,n.baseUrl),{method:"GET",headers:s})}catch(c){return t.stderr.write(`error: network failure: ${c instanceof Error?c.message:String(c)}
1611
1611
  `),1}if(!a.ok)return t.stderr.write(`error: HTTP ${a.status}: ${await a.text()}
1612
1612
  `),a.status===400?2:1;let l=await a.json();return U_(l,r.json,t)}function U_(e,t,r){if(t)return r.stdout.write(`${JSON.stringify(e,null,2)}
@@ -1632,7 +1632,7 @@ ${r}`:r}function gp(e,t){let r=DN[t.tool];return r?new Promise((n,s)=>{let i=t.b
1632
1632
  `),1;if(!d.ok){let f=await d.text();return t.stderr.write(`error: HTTP ${d.status}: ${f}
1633
1633
  `),d.status===400?2:1}let u=await d.json();return r?t.stdout.write(`${JSON.stringify(u,null,2)}
1634
1634
  `):t.stdout.write(`ok: attention ${i} acknowledged; step ${u.step_id} resumed (session_status=${String(u.session_status)})
1635
- `),0}function C_(e,t,r){return e!=="api.token"||r?t:t.length<=8?"***":`${t.slice(0,8)}\u2026(masked; use --show-secrets to reveal)`}function zx(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=Ox(e),n=r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength),s=new FormData;return s.append("image",new Blob([n],{type:Qx(e)}),$x(e)),t!==void 0&&s.append("project",t),s}function Qx(e){switch(Cx(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 eA(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 tA(e,t){let[r,...n]=e;if(r===void 0)return"usage: lmctl api pr <id|list|get>";if(r==="list")return os(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 W_(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 os(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 M_(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 rA(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 nA(e,t){let[r,...n]=e;if(r!==void 0&&n.length===0&&r!=="enqueue"&&r!=="run")return rA([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=Nc(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 sA(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"?B_(n,t):r==="claim"?q_(n,t):r==="claim-next"?H_(n,t):r==="close"?J_(n,t):r==="reopen"?X_(n,t):"usage: lmctl api issues <list|show|create|claim|claim-next|close|reopen>"}function B_(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=Nc(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 q_(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 H_(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 J_(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 X_(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 iA(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 oA(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 Nc(e){try{return JSON.parse(e)}catch{return e}}function aA(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 lA(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 cA(e,t){let[r,n,...s]=e;return r==="workflow"?dA([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 dA(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=uA(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 uA(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=Nc(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 fA(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 mA(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 pA(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 _A(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 hA(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 gA(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 yA(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 G_(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 wA(e,t){let r=W_(e);if(typeof r=="string")return t.stderr.write(`error: ${r}
1635
+ `),0}function C_(e,t,r){return e!=="api.token"||r?t:t.length<=8?"***":`${t.slice(0,8)}\u2026(masked; use --show-secrets to reveal)`}function zx(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===ji||e===Di){let r=Number(t);if(!Number.isInteger(r)||r<=0)return`invalid ${e}: ${t}`}return null}function Zx(e,t){let r=Ox(e),n=r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength),s=new FormData;return s.append("image",new Blob([n],{type:Qx(e)}),$x(e)),t!==void 0&&s.append("project",t),s}function Qx(e){switch(Cx(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 eA(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 tA(e,t){let[r,...n]=e;if(r===void 0)return"usage: lmctl api pr <id|list|get>";if(r==="list")return os(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 W_(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 Ki(e,t,r){return e.length>0?re(e[0]):{method:"GET",path:t,accept:r?"application/json":"text/html",json:r}}function os(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 M_(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 rA(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 nA(e,t){let[r,...n]=e;if(r!==void 0&&n.length===0&&r!=="enqueue"&&r!=="run")return rA([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=Nc(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 sA(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"?B_(n,t):r==="claim"?q_(n,t):r==="claim-next"?H_(n,t):r==="close"?J_(n,t):r==="reopen"?X_(n,t):"usage: lmctl api issues <list|show|create|claim|claim-next|close|reopen>"}function B_(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=Nc(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 q_(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 H_(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 J_(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 X_(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 iA(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 oA(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 Nc(e){try{return JSON.parse(e)}catch{return e}}function aA(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 lA(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 cA(e,t){let[r,n,...s]=e;return r==="workflow"?dA([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 dA(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=uA(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 uA(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=Nc(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 fA(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 mA(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 pA(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 _A(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 hA(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 gA(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=Ci(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 yA(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 G_(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 wA(e,t){let r=W_(e);if(typeof r=="string")return t.stderr.write(`error: ${r}
1636
1636
  `),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)
1637
1637
  `),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)
1638
1638
  `),2):c==="create"?EA(l,d,t,s):c==="claim"?TA(l,d,t,s):c==="claim-next"?bA(l,d,t,s):c==="close"?SA(l,d,t,s):c==="reopen"?vA(l,d,t,s):c==="list"?xA(l,d,t,s):c==="show"?AA(l,d,t,s):(t.stderr.write(`error: --direct does not support: issues ${c} (supported: list, show, create, claim, claim-next, close, reopen)
@@ -1664,9 +1664,9 @@ ${r}`:r}function gp(e,t){let r=DN[t.tool];return r?new Promise((n,s)=>{let i=t.b
1664
1664
  `),2;let s=ne(t[0],"id");if(typeof s=="string")return r.stderr.write(`error: ${s}
1665
1665
  `),2;let i=e.getIssue(s);return i===null?(r.stderr.write(`error: issue not found: ${s}
1666
1666
  `),1):(Ve(r,i,n),0)}function RA(e,t,r,n){return t.length>0?(r.stderr.write(`error: ${re(t[0])}
1667
- `),2):(Ve(r,Pi(e),n),0)}function LA(e,t,r,n){return t.length>0?(r.stderr.write(`error: ${re(t[0])}
1668
- `),2):(Ve(r,Fi(e),n),0)}function OA(e,t,r,n){return t.length>0?(r.stderr.write(`error: ${re(t[0])}
1669
- `),2):(Ve(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}
1667
+ `),2):(Ve(r,Fi(e),n),0)}function LA(e,t,r,n){return t.length>0?(r.stderr.write(`error: ${re(t[0])}
1668
+ `),2):(Ve(r,Ui(e),n),0)}function OA(e,t,r,n){return t.length>0?(r.stderr.write(`error: ${re(t[0])}
1669
+ `),2):(Ve(r,Wi(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
1670
  `),2;if(o==="--limit"){if(!/^\d+$/.test(a)||Number(a)<=0)return r.stderr.write(`error: invalid --limit: ${a}
1671
1671
  `),2;s=Number(a)}else return r.stderr.write(`error: ${re(o)}
1672
1672
  `),2}return Ve(r,sn(e,s!==void 0?{limit:s}:{}),n),0}function CA(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,7 +1674,7 @@ ${r}`:r}function gp(e,t){let r=DN[t.tool];return r?new Promise((n,s)=>{let i=t.b
1674
1674
  `),2;let s=!1;for(let a of n){if(a==="--json"){s=!0;continue}return t.stderr.write(`error: ${re(a)}
1675
1675
  `),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}
1676
1676
  `),1):(s?t.stdout.write(`${JSON.stringify(a,null,2)}
1677
- `):t.stdout.write(qi(a)),0)}finally{i&&o.close()}}async function MA(e,t){let[r,...n]=e;if(r===void 0)return t.stderr.write(`error: usage: lmctl api run where <run_id> [--json]
1677
+ `):t.stdout.write(Hi(a)),0)}finally{i&&o.close()}}async function MA(e,t){let[r,...n]=e;if(r===void 0)return t.stderr.write(`error: usage: lmctl api run where <run_id> [--json]
1678
1678
  `),2;if(!/^\d+$/.test(r)||Number(r)<=0)return t.stderr.write(`error: invalid run_id: ${r}
1679
1679
  `),2;let s=!1;for(let c of n){if(c==="--json"){s=!0;continue}if(c!=="--text")return t.stderr.write(`error: ${re(c)}
1680
1680
  `),2}let i=Or(t),a=dr(s?"application/json":"text/plain",i.token),l;try{l=await fetch(new URL(`/api/runs/${r}/where`,i.baseUrl),{method:"GET",headers:a})}catch(c){return t.stderr.write(`error: network failure: ${c instanceof Error?c.message:String(c)}
@@ -1684,9 +1684,9 @@ ${r}`:r}function gp(e,t){let r=DN[t.tool];return r?new Promise((n,s)=>{let i=t.b
1684
1684
  `),l.status===404?1:l.status===400?2:1)}function jA(e,t){let[r,...n]=e;if(r===void 0)return t.stderr.write(`error: usage: lmctl api --direct run timeline <run_id> [--json]
1685
1685
  `),2;if(!/^\d+$/.test(r)||Number(r)<=0)return t.stderr.write(`error: invalid run_id: ${r}
1686
1686
  `),2;let s=!1;for(let a of n){if(a==="--json"){s=!0;continue}if(a!=="--text")return t.stderr.write(`error: ${re(a)}
1687
- `),2}let i=t.dal===void 0,o=t.dal??Ie({path:le()});try{let a=Hi(o,Number(r));return a===null?(t.stderr.write(`error: run not found: ${r}
1687
+ `),2}let i=t.dal===void 0,o=t.dal??Ie({path:le()});try{let a=Ji(o,Number(r));return a===null?(t.stderr.write(`error: run not found: ${r}
1688
1688
  `),1):(s?t.stdout.write(`${JSON.stringify(a,null,2)}
1689
- `):t.stdout.write(Ji(a)),0)}finally{i&&o.close()}}async function DA(e,t){let[r,...n]=e;if(r===void 0)return t.stderr.write(`error: usage: lmctl api run timeline <run_id> [--json]
1689
+ `):t.stdout.write(Xi(a)),0)}finally{i&&o.close()}}async function DA(e,t){let[r,...n]=e;if(r===void 0)return t.stderr.write(`error: usage: lmctl api run timeline <run_id> [--json]
1690
1690
  `),2;if(!/^\d+$/.test(r)||Number(r)<=0)return t.stderr.write(`error: invalid run_id: ${r}
1691
1691
  `),2;let s=!1;for(let c of n){if(c==="--json"){s=!0;continue}if(c!=="--text")return t.stderr.write(`error: ${re(c)}
1692
1692
  `),2}let i=Or(t),a=dr(s?"application/json":"text/plain",i.token),l;try{l=await fetch(new URL(`/api/runs/${r}/timeline`,i.baseUrl),{method:"GET",headers:a})}catch(c){return t.stderr.write(`error: network failure: ${c instanceof Error?c.message:String(c)}
@@ -1701,7 +1701,7 @@ ${r}`:r}function gp(e,t){let r=DN[t.tool];return r?new Promise((n,s)=>{let i=t.b
1701
1701
  `),o.status===400?2:1)}function FA(e,t,r,n){let s=!1;for(let i of t){if(i==="--unacked"){s=!0;continue}return r.stderr.write(`error: ${re(i)}
1702
1702
  `),2}return Ve(r,cr(e,{unacked:s}),n),0}function V_(e,t,r){let[n,...s]=t;if(n===void 0)return r.stderr.write(`error: --direct escalations requires a subcommand (list|show|respond)
1703
1703
  `),2;if(n==="list"){let i=F_(s);if(typeof i=="string")return r.stderr.write(`error: ${i}
1704
- `),2;let o={all:i.all};i.project!==void 0&&(o.project=i.project),i.since!==void 0&&(o.since=i.since);let a=Bi(e,o);return U_(a,i.json,r)}if(n==="show"){let i=s.filter(l=>l!=="--json"&&l!=="--text");if(i.length!==1)return r.stderr.write(`usage: lmctl api --direct escalations show <attention_id> [--json|--text]
1704
+ `),2;let o={all:i.all};i.project!==void 0&&(o.project=i.project),i.since!==void 0&&(o.since=i.since);let a=qi(e,o);return U_(a,i.json,r)}if(n==="show"){let i=s.filter(l=>l!=="--json"&&l!=="--text");if(i.length!==1)return r.stderr.write(`usage: lmctl api --direct escalations show <attention_id> [--json|--text]
1705
1705
  `),2;let o=ne(i[0],"attention_id");if(typeof o=="string")return r.stderr.write(`error: ${o}
1706
1706
  `),2;let a=kt(e,o);return a===null?(r.stderr.write(`error: escalation not found: ${o}
1707
1707
  `),1):(r.stdout.write(`${JSON.stringify(a,null,2)}
@@ -1719,12 +1719,12 @@ ${r}`:r}function gp(e,t){let r=DN[t.tool];return r?new Promise((n,s)=>{let i=t.b
1719
1719
  `),2;let d=e.resumeInteractive(l.step_id,a,s);if(!d.resumed)return r.stderr.write(`error: interactive respond failed: ${d.reason} (step_id=${l.step_id})
1720
1720
  `),2;let u=e.acknowledgeAttention(o),f={ok:!0,attention_id:o,step_id:l.step_id,session_status:d.session.status,acknowledged_at:u?.acknowledged_at??null};return n?r.stdout.write(`${JSON.stringify(f,null,2)}
1721
1721
  `):r.stdout.write(`ok: attention ${o} acknowledged; step ${l.step_id} resumed (session_status=${f.session_status})
1722
- `),0}function j_(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 Mx,jx,D_,Gi,Wx,Bx,qx,Hx,NA,Y_=T(()=>{"use strict";Ze();Xe();Ci();Ec();Ht();Mx="http://127.0.0.1:8787",jx=`usage: lmctl api [--direct] <subcommand> ...
1722
+ `),0}function j_(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 Mx,jx,D_,Vi,Wx,Bx,qx,Hx,NA,Y_=T(()=>{"use strict";Ze();Xe();Mi();Ec();Ht();Mx="http://127.0.0.1:8787",jx=`usage: lmctl api [--direct] <subcommand> ...
1723
1723
 
1724
1724
  Call the lmctl HTTP API using the configured daemon URL/token. Some
1725
1725
  workflow shellstep-safe commands also support --direct to use the local DAL
1726
1726
  without an HTTP round trip.
1727
- `,D_=["low","medium","high","critical"];Gi=new Set(["api.url","api.port","api.token","project.docroot",Mi,ji]);Wx=`usage: lmctl api escalations <list|show|respond>
1727
+ `,D_=["low","medium","high","critical"];Vi=new Set(["api.url","api.port","api.token","project.docroot",ji,Di]);Wx=`usage: lmctl api escalations <list|show|respond>
1728
1728
 
1729
1729
  list [--project P] [--all] [--since DURATION] [--json]
1730
1730
  Print pending operator escalations (interactive_waiting_operator
@@ -1749,27 +1749,27 @@ without an HTTP round trip.
1749
1749
 
1750
1750
  Verify every workflows/*.compound.json file: load/validate the workflow graph
1751
1751
  and report the first step that would be started. Default output is the TTY
1752
- table; --json emits the structured WorkflowVerifyReport payload.`;NA=["open","assigned","closed","reopened"]});import z_ from"jexl";function an(e){z_.compile(Z_(e))}async function $r(e,t){return z_.eval(Z_(e),t)}function Z_(e){return e.replace(/([A-Za-z_$][\w$.[\]]*)\.includes\(([^()]+)\)/g,"($2 in $1)")}var as=T(()=>{"use strict"});import{z as E}from"zod";function Cc(e){let t=e.trim();return t.startsWith("={{")&&t.endsWith("}}")?t.slice(3,-2).trim():e}var WA,Q_,xc,Ac,Rc,Lc,Oc,$c,eh,BA,qA,HA,ls,JA,Yi,zi,Zi,Qi,eo,th,XA,GA,VA,KA,to,ln=T(()=>{"use strict";as();WA=E.object({kind:E.enum(["success","neutral","failure"])}),Q_=E.enum(["string","number","boolean","object","array"]),xc=E.object({name:E.string().min(1),type:Q_,required:E.boolean().optional(),default:E.unknown().optional(),description:E.string().optional()}),Ac=E.object({name:E.string().min(1),type:Q_,source_step_id:E.string().min(1),source_field:E.string().min(1),description:E.string().optional()}),Rc=E.object({id:E.string().min(1),type:E.string().min(1),parameters:E.record(E.string(),E.unknown()).default({})}),Lc="__failure__",Oc=E.object({tools:E.array(E.string().min(1)).optional(),auth:E.array(E.string().min(1)).optional()}).strict().optional(),$c=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(),eh=E.object({type:E.literal("AssertRepoClean"),fail_message:E.string().min(1).optional(),next:E.string().min(1)}),BA=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(),qA=E.union([E.string().min(1),BA]),HA=E.union([E.string().min(1),E.object({name:E.string().min(1),content:E.string().min(1)}).strict()]),ls=E.object({team:E.string().min(1),alias:E.string().min(1),prompt_template:E.string().optional(),mcp:E.array(qA).optional(),skills:E.array(HA).optional()}),JA=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:ls,pre_checks:E.array(JA).optional(),reviewers:E.array(ls.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(ls.extend({topic:E.string().min(1)})).optional(),consolidator:ls,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:ls.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()}),th=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(Cc(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}`})}}),XA=E.discriminatedUnion("type",[eh,Yi,zi,Zi,Qi,eo,th]),GA=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:XA,outcomes:E.object({all_ok:E.string().min(1),any_failed:E.string().optional()})}).superRefine((e,t)=>{try{an(Cc(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}`})}}),VA=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(Cc(n))}catch(s){let i=s instanceof Error?s.message:"invalid expression";t.addIssue({code:"custom",path:["inputs",r],message:`invalid jexl expression: ${i}`})}}),KA=E.discriminatedUnion("type",[eh,Yi,zi,Zi,Qi,eo,th,GA,VA]),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),KA),terminals:E.record(E.string().min(1),WA),errors:$c,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(xc).optional(),outputs:E.array(Ac).optional(),triggers:E.array(Rc).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 YA,ro,zA,ZA,QA,It,cn=T(()=>{"use strict";ln();YA=/^s-[a-z0-9-]+-[a-f0-9]{4}$/,ro=K.string().regex(YA),zA=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(zA)))),QA=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:$c,inputs:K.array(xc).optional(),outputs:K.array(Ac).optional(),steps:K.array(QA).min(1),connections:ZA.default({}),entry_step_id:ro,triggers:K.array(Rc).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 jc(e)}function jc(e){if(Array.isArray(e))return e.map(jc);if(e===null||typeof e!="object")return e;let t=e,r={};for(let n of Object.keys(t))r[n]=jc(t[n]);if(typeof r.type=="string"){let n=tR[r.type];n!==void 0&&(r.type=n)}return r}var Mc,eR,tR,Dc=T(()=>{"use strict";Mc="lmctl.builtin.",eR={Review:`${Mc}Review`,Research:`${Mc}Research`,Consolidate:`${Mc}Consolidate`},tR=Object.fromEntries(Object.entries(eR).map(([e,t])=>[t,e]))});import{readFileSync as rR}from"node:fs";function sh(e){return nR(e)}function nR(e){let t=no(oR(e));if(iR(t),ih(t)===3)return sR(t);let r=to.safeParse(t);if(!r.success)throw new Jt({errors:r.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message}))});let n=aR(r.data);if(n.errors.length>0||n.unresolvedRefs.length>0)throw new Jt(n);return r.data}function sR(e){let t=It.safeParse(e);if(!t.success)throw new Jt({errors:t.error.issues.map(r=>({path:r.path.length===0?"$":r.path.map(String).join("."),message:r.message}))});return t.data}function iR(e){if(typeof e!="object"||e===null||!("definition_schema_version"in e))return;let t=ih(e);if(!(t===null||rh.includes(t)))throw new Jt({errors:[{path:"definition_schema_version",message:`unsupported definition_schema_version ${t}; supported versions: ${rh.join(", ")}`}]})}function ih(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 oR(e){if(typeof e!="string")return e;let t=e.trim();return e.includes(`
1752
+ table; --json emits the structured WorkflowVerifyReport payload.`;NA=["open","assigned","closed","reopened"]});import z_ from"jexl";function an(e){z_.compile(Z_(e))}async function $r(e,t){return z_.eval(Z_(e),t)}function Z_(e){return e.replace(/([A-Za-z_$][\w$.[\]]*)\.includes\(([^()]+)\)/g,"($2 in $1)")}var as=T(()=>{"use strict"});import{z as E}from"zod";function Cc(e){let t=e.trim();return t.startsWith("={{")&&t.endsWith("}}")?t.slice(3,-2).trim():e}var WA,Q_,xc,Ac,Rc,Lc,Oc,$c,eh,BA,qA,HA,ls,JA,zi,Zi,Qi,eo,to,th,XA,GA,VA,KA,ro,ln=T(()=>{"use strict";as();WA=E.object({kind:E.enum(["success","neutral","failure"])}),Q_=E.enum(["string","number","boolean","object","array"]),xc=E.object({name:E.string().min(1),type:Q_,required:E.boolean().optional(),default:E.unknown().optional(),description:E.string().optional()}),Ac=E.object({name:E.string().min(1),type:Q_,source_step_id:E.string().min(1),source_field:E.string().min(1),description:E.string().optional()}),Rc=E.object({id:E.string().min(1),type:E.string().min(1),parameters:E.record(E.string(),E.unknown()).default({})}),Lc="__failure__",Oc=E.object({tools:E.array(E.string().min(1)).optional(),auth:E.array(E.string().min(1)).optional()}).strict().optional(),$c=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(),eh=E.object({type:E.literal("AssertRepoClean"),fail_message:E.string().min(1).optional(),next:E.string().min(1)}),BA=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(),qA=E.union([E.string().min(1),BA]),HA=E.union([E.string().min(1),E.object({name:E.string().min(1),content:E.string().min(1)}).strict()]),ls=E.object({team:E.string().min(1),alias:E.string().min(1),prompt_template:E.string().optional(),mcp:E.array(qA).optional(),skills:E.array(HA).optional()}),JA=E.object({kind:E.literal("shell"),command:E.string().min(1),description:E.string().optional()}),zi=E.object({type:E.literal("Review"),state_name:E.string().min(1),coder:ls,pre_checks:E.array(JA).optional(),reviewers:E.array(ls.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(ls.extend({topic:E.string().min(1)})).optional(),consolidator:ls,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()}),Qi=E.object({type:E.literal("Interactive"),state_name:E.string().min(1),agent:ls.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()}),eo=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)}),to=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()}),th=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(Cc(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}`})}}),XA=E.discriminatedUnion("type",[eh,zi,Zi,Qi,eo,to,th]),GA=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:XA,outcomes:E.object({all_ok:E.string().min(1),any_failed:E.string().optional()})}).superRefine((e,t)=>{try{an(Cc(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}`})}}),VA=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(Cc(n))}catch(s){let i=s instanceof Error?s.message:"invalid expression";t.addIssue({code:"custom",path:["inputs",r],message:`invalid jexl expression: ${i}`})}}),KA=E.discriminatedUnion("type",[eh,zi,Zi,Qi,eo,to,th,GA,VA]),ro=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),KA),terminals:E.record(E.string().min(1),WA),errors:$c,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(xc).optional(),outputs:E.array(Ac).optional(),triggers:E.array(Rc).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 YA,no,zA,ZA,QA,It,cn=T(()=>{"use strict";ln();YA=/^s-[a-z0-9-]+-[a-f0-9]{4}$/,no=K.string().regex(YA),zA=K.object({step_id:no,type:K.literal("main"),index:K.number().int().min(0)}),ZA=K.record(no,K.record(K.string().min(1),K.array(K.array(zA)))),QA=K.object({id:no,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:$c,inputs:K.array(xc).optional(),outputs:K.array(Ac).optional(),steps:K.array(QA).min(1),connections:ZA.default({}),entry_step_id:no,triggers:K.array(Rc).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 so(e){return jc(e)}function jc(e){if(Array.isArray(e))return e.map(jc);if(e===null||typeof e!="object")return e;let t=e,r={};for(let n of Object.keys(t))r[n]=jc(t[n]);if(typeof r.type=="string"){let n=tR[r.type];n!==void 0&&(r.type=n)}return r}var Mc,eR,tR,Dc=T(()=>{"use strict";Mc="lmctl.builtin.",eR={Review:`${Mc}Review`,Research:`${Mc}Research`,Consolidate:`${Mc}Consolidate`},tR=Object.fromEntries(Object.entries(eR).map(([e,t])=>[t,e]))});import{readFileSync as rR}from"node:fs";function sh(e){return nR(e)}function nR(e){let t=so(oR(e));if(iR(t),ih(t)===3)return sR(t);let r=ro.safeParse(t);if(!r.success)throw new Jt({errors:r.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message}))});let n=aR(r.data);if(n.errors.length>0||n.unresolvedRefs.length>0)throw new Jt(n);return r.data}function sR(e){let t=It.safeParse(e);if(!t.success)throw new Jt({errors:t.error.issues.map(r=>({path:r.path.length===0?"$":r.path.map(String).join("."),message:r.message}))});return t.data}function iR(e){if(typeof e!="object"||e===null||!("definition_schema_version"in e))return;let t=ih(e);if(!(t===null||rh.includes(t)))throw new Jt({errors:[{path:"definition_schema_version",message:`unsupported definition_schema_version ${t}; supported versions: ${rh.join(", ")}`}]})}function ih(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 oR(e){if(typeof e!="string")return e;let t=e.trim();return e.includes(`
1753
1753
  `)||t.startsWith("{")||t.startsWith("[")?nh(e,"$"):t.endsWith(".json")?nh(rR(t,"utf8"),t):e}function nh(e,t){try{return JSON.parse(e)}catch(r){let n=r instanceof Error?r.message:"invalid JSON";throw new Jt({errors:[{path:t,message:`invalid JSON: ${n}`}]})}}function aR(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"}),lR(e,n,r);for(let[s,i]of Object.entries(e.states))new Set(Object.keys(e.terminals));return{errors:t,unresolvedRefs:r}}function lR(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 rh,Jt,oh=T(()=>{"use strict";ln();cn();Dc();rh=[1,2,3],Jt=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 cR}from"node:crypto";function ah(e,t){let r=dR(t),n=cR("sha1").update(`${e}:${t}`).digest("hex").slice(0,4);return`s-${r}-${n}`}function dR(e){let t=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return t.length>0?t:"step"}var lh=T(()=>{"use strict";cn()});function mR(e,t){let r=fR[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 fh(e){let t=[],r=(k,N)=>{throw new dn([{line:k,message:N}])},n=e.split(`
1754
- `),s=[];for(let k=0;k<n.length;k+=1){let L=hR(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,_=new Map,g=new Map,h=(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=ur(j[1],N,r);for(let z of Object.keys(C))dh.has(z)||r(N,`unknown \`meta\` key \`${z}\` \u2014 only workflow-level runtime metadata is allowed: ${[...dh].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=ch[z];ie===void 0&&r(N,`unknown step type: ${z} (supported \`step\` archetypes: ${Object.keys(ch).join(", ")}; choice/terminal/loop/foreach/call/decide have their own constructs)`);let{params:Te,members:Ct}=mR(ie,ur(_e,N,r));h(C,ie,Te,N,!1,Object.keys(Ct).length>0?Ct: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=uh[z];ie===void 0&&r(N,`unknown trigger type: ${z} (registered trigger archetypes: ${Object.keys(uh).join(", ")})`),p.has(C)&&r(N,`duplicate trigger id: ${C}`),p.set(C,{id:C,type:ie,parameters:ur(_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"?_:g;_e.has(C)&&r(N,`duplicate ${F} declaration: ${C}`);let ie;if(z.startsWith("{")){let Te=ur(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=mh(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}`);h(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],Ct=ie==="->"?"main":ie.slice(1,-2);c.push({srcDeclId:_e,port:Ct,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,Ct=/^when\s+(.+)\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(Te);if(Ct!==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 jn=Ct[2];z.push({when:Ct[1].trim(),next:`@terminal:${jn}`}),c.push({srcDeclId:C,port:jn,dstDeclId:Ct[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 jn=Ha[1];_e=`@terminal:${jn}`,c.push({srcDeclId:C,port:jn,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>\`)`),h(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}`);h(j[1],"lmctl/loop",ur(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=ur(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)"),h(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=ur(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;h(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=ur(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>\`)`),h(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",_],["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=>ah(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);pR.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=_R[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=uR[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 hR(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 ur(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 gR(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]=mh(l)}return s}function gR(e){return e.split(",").map(t=>t.trim()).filter(t=>t.length>0)}function mh(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 uR,fR,ch,dn,pR,_R,dh,uh,ph=T(()=>{"use strict";cn();lh();ln();uR={"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}},fR={"lmctl/review":["coder","reviewers"],"lmctl/consolidate":["researchers","consolidator"],"lmctl/interactive":["agent"]};ch={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:
1754
+ `),s=[];for(let k=0;k<n.length;k+=1){let L=hR(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,_=new Map,g=new Map,h=(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=ur(j[1],N,r);for(let z of Object.keys(C))dh.has(z)||r(N,`unknown \`meta\` key \`${z}\` \u2014 only workflow-level runtime metadata is allowed: ${[...dh].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=ch[z];ie===void 0&&r(N,`unknown step type: ${z} (supported \`step\` archetypes: ${Object.keys(ch).join(", ")}; choice/terminal/loop/foreach/call/decide have their own constructs)`);let{params:Te,members:Ct}=mR(ie,ur(_e,N,r));h(C,ie,Te,N,!1,Object.keys(Ct).length>0?Ct: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=uh[z];ie===void 0&&r(N,`unknown trigger type: ${z} (registered trigger archetypes: ${Object.keys(uh).join(", ")})`),p.has(C)&&r(N,`duplicate trigger id: ${C}`),p.set(C,{id:C,type:ie,parameters:ur(_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"?_:g;_e.has(C)&&r(N,`duplicate ${F} declaration: ${C}`);let ie;if(z.startsWith("{")){let Te=ur(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=mh(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}`);h(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],Ct=ie==="->"?"main":ie.slice(1,-2);c.push({srcDeclId:_e,port:Ct,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,Ct=/^when\s+(.+)\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(Te);if(Ct!==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 jn=Ct[2];z.push({when:Ct[1].trim(),next:`@terminal:${jn}`}),c.push({srcDeclId:C,port:jn,dstDeclId:Ct[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 jn=Ha[1];_e=`@terminal:${jn}`,c.push({srcDeclId:C,port:jn,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>\`)`),h(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}`);h(j[1],"lmctl/loop",ur(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=ur(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)"),h(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=ur(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;h(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=ur(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>\`)`),h(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",_],["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=>ah(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);pR.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=_R[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=uR[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 hR(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 ur(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 gR(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]=mh(l)}return s}function gR(e){return e.split(",").map(t=>t.trim()).filter(t=>t.length>0)}function mh(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 uR,fR,ch,dn,pR,_R,dh,uh,ph=T(()=>{"use strict";cn();lh();ln();uR={"lmctl/review":{v2type:"Review",outcomes:{approve:"_"},schema:zi},"lmctl/consolidate":{v2type:"Consolidate",outcomes:{ok:"_"},schema:Zi},"lmctl/interactive":{v2type:"Interactive",outcomes:{done:"_"},schema:Qi},"lmctl/loop":{v2type:"Loop",outcomes:{ok:"_"},schema:eo},"lmctl/shell-step":{v2type:"ShellStep",outcomes:{},schema:to}},fR={"lmctl/review":["coder","reviewers"],"lmctl/consolidate":["researchers","consolidator"],"lmctl/interactive":["agent"]};ch={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
1755
  ${t.map(r=>` line ${r.line}: ${r.message}`).join(`
1756
1756
  `)}`),this.issues=t,this.name="DslCompileError"}},pR=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"]),_R={"lmctl/consolidate":["ok"],"lmctl/interactive":["done"],"lmctl/loop":["ok"],"lmctl/foreach":["all_ok"]},dh=new Set(["requires","default_task_timeout_ms","errors","concurrency_key","concurrent_limit"]),uh={"trigger-schedule":"lmctl/trigger-schedule","trigger-gh-issue":"lmctl/trigger-gh-issue"}});import{readFileSync as yR}from"node:fs";function wR(){let e=process.env.LMCTL_DSL;return e===void 0?!0:!["0","false","off"].includes(e.trim().toLowerCase())}function ER(e){for(let t of e.split(`
1757
- `)){let r=t.replace(/#.*/,"").trim();if(r.length!==0)return/^workflow\s+\S+\s+v\d+\s*$/.test(r)}return!1}function ct(e){if(typeof e=="string"&&wR()&&ER(e)){let r;try{r=fh(e)}catch(s){throw s instanceof dn?new Xt(s.issues.map(i=>({path:`dsl:${i.line}`,message:i.message}))):s}let n=It.safeParse(r);if(!n.success)throw new Xt(n.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));return n.data}let t=no(bR(e));if(SR(t)&&t.definition_schema_version===3){let r=It.safeParse(t);if(!r.success)throw new Xt(r.error.issues.map(n=>({path:n.path.length===0?"$":n.path.map(String).join("."),message:n.message})));return r.data}return TR(t)}function TR(e){let t=to.safeParse(e);if(!t.success)throw new Xt(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 Xt([{path:`states.${s}`,message:`v2 workflows (primitive_version: 2) may not use v1 primitive type: ${i.type}`}]);try{return sh(r)}catch(s){throw s instanceof Jt?new Pc(s):s}}function bR(e){if(typeof e!="string")return e;let t=e.trim();return e.includes(`
1758
- `)||t.startsWith("{")||t.startsWith("[")?_h(e):t.endsWith(".json")?_h(yR(t,"utf8")):e}function _h(e){return JSON.parse(e)}function SR(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var Pc,Xt,cs=T(()=>{"use strict";ln();oh();Dc();cn();ph();Pc=class extends Error{causeError;constructor(t){super("compiler emitted invalid atomic workflow"),this.causeError=t,this.name="CompilerInvariantError"}},Xt=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:vR(r,{job:{id:e.job.id,kind:e.job.source,source:e.job.source,source_ref:e.job.source_ref,payload:IR(e.job.payload)},project:e.project===null?null:{id:e.project.id,name:e.project.name}}),concurrent_limit:t}}function vR(e,t){return e.replace(/\{\{\s*([^}]+?)\s*\}\}/g,(r,n)=>{let s=kR(t,n.trim());return s==null?"":typeof s=="string"?s:typeof s=="number"||typeof s=="boolean"?String(s):JSON.stringify(s)})}function kR(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 IR(e){if(e===null||e.trim().length===0)return null;try{return JSON.parse(e)}catch{return e}}var Fc=T(()=>{"use strict"});var hh={};ye(hh,{enqueueFromAgentOutput:()=>xR,enqueueFromGitHubIssue:()=>Uc,enqueueManual:()=>NR,enqueueScheduled:()=>AR});function Uc(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 NR(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 xR(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 AR(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=ct(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 Wc=T(()=>{"use strict";cs();Fc()});async function yh(e){let t=e.dal.listProjectWorkflows(e.project.id,{enabled_only:!0});if(t.length===0)return gh(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 RR(i.condition,r))continue;let o=`${e.issue.url}#workflow:${i.workflow_id}`,a={issue:e.issue,...LR(i.parameters_override)},l=gh(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 gh(e,t,r,n,s,i,o){let a=e.findJobBySourceAndDedupe("gh_issue",n);return{jobs:[Uc(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 RR(e,t){if(e===null||e.trim().length===0)return!0;try{return await $r(e,t)===!0}catch{return!1}}function LR(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 wh=T(()=>{"use strict";as();Wc()});import{spawnSync as OR}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=OR(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(!MR(i))throw new Error("gh issue list returned unexpected JSON shape");let o=0;for(let a of i){let l=await yh({dal:e.dal,project:e.project,issue:jR(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=CR(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 CR(e){if(e===null)return{};try{let t=JSON.parse(e);if(!Bc(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 MR(e){return Array.isArray(e)&&e.every(t=>{if(!Bc(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:Bc(n)&&typeof n.name=="string"))})}function jR(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 Bc(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}var qc=T(()=>{"use strict";wh()});function Th(e){return async t=>PR(e.app,t,e.log!==void 0?{log:e.log}:{})}async function PR(e,t,r={}){let n=FR(t.path),s={"content-type":"application/json",...t.headers??{},[lo]:Hc},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 UR(l);if(r.log!==void 0){let d=Date.now()-a;r.log(`[mailbox-dispatch] ${t.method} ${Eh(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} ${Eh(t.path)} \u2192 ERR (${c}ms)`)}throw l}}function Eh(e){let t=e.startsWith("/")?e:`/${e}`,r=t.search(/[?#]/);return r===-1?t:t.slice(0,r)}function FR(e){let t=e.startsWith("/")?e:`/${e}`;return`${DR}${t}`}async function UR(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,Hc,DR,Jc=T(()=>{"use strict";lo="x-mailbox-channel",Hc="1",DR="http://mailbox.local"});import{createHash as bh,createHmac as WR,timingSafeEqual as BR}from"node:crypto";function Sh(){return async(e,t)=>{let r=vh();if(r===null||GR(e.req.path)){await t();return}if(e.req.path.startsWith("/mailbox/")&&e.req.header(lo)===Hc){await t();return}let n=e.req.query("token");if(n!==void 0&&co(n,r)){Gc(e,r),await t();return}if(XR(e,r)){await t();return}return e.req.path.startsWith("/api/")||e.req.path.startsWith("/mailbox/")?e.json({error:"API requires auth; set LMCTL_API_TOKEN"},401):e.redirect("/login",302)}}function vh(){let e=process.env.LMCTL_API_TOKEN;return e&&e.length>0?e:null}function kh(e){let t=vh();return t!==null&&co(e,t)}function Gc(e,t,r=new Date){e.header("Set-Cookie",`${Xc}=${HR(t,r)}; Path=/; HttpOnly; SameSite=Lax`)}function Ih(e){e.header("Set-Cookie",`${Xc}=; Path=/; HttpOnly; SameSite=Lax; Max-Age=0`)}function HR(e,t=new Date){let n=`auth=ok|${new Date(t.getTime()+qR*24*60*60*1e3).toISOString()}`;return Buffer.from(`${n}|${Nh(e,n)}`,"utf8").toString("base64url")}function JR(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],Nh(t,`${s[0]}|${s[1]}`))}function co(e,t){return BR(bh("sha256").update(e).digest(),bh("sha256").update(t).digest())}function XR(e,t){let r=/^Bearer\s+(.+)$/i.exec(e.req.header("authorization")??"")?.[1];if(r!==void 0&&co(r,t))return!0;let n=VR(e.req.header("cookie")??"")[Xc];return n!==void 0&&JR(n,t)}function GR(e){return e==="/login"||e==="/logout"}function VR(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 Nh(e,t){return WR("sha256",e).update(t).digest("hex")}var Xc,qR,xh=T(()=>{"use strict";Jc();Xc="lmctl_next_session",qR=30});import{existsSync as un,mkdirSync as KR,readdirSync as YR,readFileSync as uo,unlinkSync as zR,writeFileSync as Yc}from"node:fs";import{join as Cr}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 Rh(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 rL(a)?{name:e,type:a,description:o?.[1]?.trim()??null,body:s,created_at:Ah,updated_at:Ah}:null}function QR(e,t,r,n){let s=r!==null?`
1757
+ `)){let r=t.replace(/#.*/,"").trim();if(r.length!==0)return/^workflow\s+\S+\s+v\d+\s*$/.test(r)}return!1}function ct(e){if(typeof e=="string"&&wR()&&ER(e)){let r;try{r=fh(e)}catch(s){throw s instanceof dn?new Xt(s.issues.map(i=>({path:`dsl:${i.line}`,message:i.message}))):s}let n=It.safeParse(r);if(!n.success)throw new Xt(n.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));return n.data}let t=so(bR(e));if(SR(t)&&t.definition_schema_version===3){let r=It.safeParse(t);if(!r.success)throw new Xt(r.error.issues.map(n=>({path:n.path.length===0?"$":n.path.map(String).join("."),message:n.message})));return r.data}return TR(t)}function TR(e){let t=ro.safeParse(e);if(!t.success)throw new Xt(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 Xt([{path:`states.${s}`,message:`v2 workflows (primitive_version: 2) may not use v1 primitive type: ${i.type}`}]);try{return sh(r)}catch(s){throw s instanceof Jt?new Pc(s):s}}function bR(e){if(typeof e!="string")return e;let t=e.trim();return e.includes(`
1758
+ `)||t.startsWith("{")||t.startsWith("[")?_h(e):t.endsWith(".json")?_h(yR(t,"utf8")):e}function _h(e){return JSON.parse(e)}function SR(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var Pc,Xt,cs=T(()=>{"use strict";ln();oh();Dc();cn();ph();Pc=class extends Error{causeError;constructor(t){super("compiler emitted invalid atomic workflow"),this.causeError=t,this.name="CompilerInvariantError"}},Xt=class extends Error{issues;constructor(t){super("compound workflow validation failed"),this.issues=t,this.name="CompilerValidationError"}}});function io(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:vR(r,{job:{id:e.job.id,kind:e.job.source,source:e.job.source,source_ref:e.job.source_ref,payload:IR(e.job.payload)},project:e.project===null?null:{id:e.project.id,name:e.project.name}}),concurrent_limit:t}}function vR(e,t){return e.replace(/\{\{\s*([^}]+?)\s*\}\}/g,(r,n)=>{let s=kR(t,n.trim());return s==null?"":typeof s=="string"?s:typeof s=="number"||typeof s=="boolean"?String(s):JSON.stringify(s)})}function kR(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 IR(e){if(e===null||e.trim().length===0)return null;try{return JSON.parse(e)}catch{return e}}var Fc=T(()=>{"use strict"});var hh={};we(hh,{enqueueFromAgentOutput:()=>xR,enqueueFromGitHubIssue:()=>Uc,enqueueManual:()=>NR,enqueueScheduled:()=>AR});function Uc(e,t){return ao(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:oo(t.payload),concurrency_key:t.concurrency_key,priority:t.priority})}function NR(e,t){return ao(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:oo(t.payload),concurrency_key:t.concurrency_key})}function xR(e,t){let r=t.sequence===void 0?`run:${t.parent_run_id}`:`run:${t.parent_run_id}:${t.sequence}`;return ao(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:oo(t.payload),concurrency_key:t.concurrency_key})}function AR(e,t){return ao(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:oo(t.payload),concurrency_key:t.concurrency_key})}function oo(e){return e==null?null:typeof e=="string"?e:JSON.stringify(e)}function ao(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=ct(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=io({workflow:i,job:o,project:n});return e.enqueueJob({...t,concurrency_key:a.concurrency_key})}catch{return e.enqueueJob(t)}}var Wc=T(()=>{"use strict";cs();Fc()});async function yh(e){let t=e.dal.listProjectWorkflows(e.project.id,{enabled_only:!0});if(t.length===0)return gh(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 RR(i.condition,r))continue;let o=`${e.issue.url}#workflow:${i.workflow_id}`,a={issue:e.issue,...LR(i.parameters_override)},l=gh(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 gh(e,t,r,n,s,i,o){let a=e.findJobBySourceAndDedupe("gh_issue",n);return{jobs:[Uc(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 RR(e,t){if(e===null||e.trim().length===0)return!0;try{return await $r(e,t)===!0}catch{return!1}}function LR(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 wh=T(()=>{"use strict";as();Wc()});import{spawnSync as OR}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=OR(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(!MR(i))throw new Error("gh issue list returned unexpected JSON shape");let o=0;for(let a of i){let l=await yh({dal:e.dal,project:e.project,issue:jR(a)});o+=l.new_jobs}return{scanned:i.length,new_jobs:o}}async function lo(e){if(process.env.LMCTL_INTAKE_DISABLED==="1")return[];let t=[];for(let r of e.listProjectsWithIntakeEnabled()){let n=CR(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 CR(e){if(e===null)return{};try{let t=JSON.parse(e);if(!Bc(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 MR(e){return Array.isArray(e)&&e.every(t=>{if(!Bc(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:Bc(n)&&typeof n.name=="string"))})}function jR(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 Bc(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}var qc=T(()=>{"use strict";wh()});function Th(e){return async t=>PR(e.app,t,e.log!==void 0?{log:e.log}:{})}async function PR(e,t,r={}){let n=FR(t.path),s={"content-type":"application/json",...t.headers??{},[co]:Hc},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 UR(l);if(r.log!==void 0){let d=Date.now()-a;r.log(`[mailbox-dispatch] ${t.method} ${Eh(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} ${Eh(t.path)} \u2192 ERR (${c}ms)`)}throw l}}function Eh(e){let t=e.startsWith("/")?e:`/${e}`,r=t.search(/[?#]/);return r===-1?t:t.slice(0,r)}function FR(e){let t=e.startsWith("/")?e:`/${e}`;return`${DR}${t}`}async function UR(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()!==co&&(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 co,Hc,DR,Jc=T(()=>{"use strict";co="x-mailbox-channel",Hc="1",DR="http://mailbox.local"});import{createHash as bh,createHmac as WR,timingSafeEqual as BR}from"node:crypto";function Sh(){return async(e,t)=>{let r=vh();if(r===null||GR(e.req.path)){await t();return}if(e.req.path.startsWith("/mailbox/")&&e.req.header(co)===Hc){await t();return}let n=e.req.query("token");if(n!==void 0&&uo(n,r)){Gc(e,r),await t();return}if(XR(e,r)){await t();return}return e.req.path.startsWith("/api/")||e.req.path.startsWith("/mailbox/")?e.json({error:"API requires auth; set LMCTL_API_TOKEN"},401):e.redirect("/login",302)}}function vh(){let e=process.env.LMCTL_API_TOKEN;return e&&e.length>0?e:null}function kh(e){let t=vh();return t!==null&&uo(e,t)}function Gc(e,t,r=new Date){e.header("Set-Cookie",`${Xc}=${HR(t,r)}; Path=/; HttpOnly; SameSite=Lax`)}function Ih(e){e.header("Set-Cookie",`${Xc}=; Path=/; HttpOnly; SameSite=Lax; Max-Age=0`)}function HR(e,t=new Date){let n=`auth=ok|${new Date(t.getTime()+qR*24*60*60*1e3).toISOString()}`;return Buffer.from(`${n}|${Nh(e,n)}`,"utf8").toString("base64url")}function JR(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:uo(s[2],Nh(t,`${s[0]}|${s[1]}`))}function uo(e,t){return BR(bh("sha256").update(e).digest(),bh("sha256").update(t).digest())}function XR(e,t){let r=/^Bearer\s+(.+)$/i.exec(e.req.header("authorization")??"")?.[1];if(r!==void 0&&uo(r,t))return!0;let n=VR(e.req.header("cookie")??"")[Xc];return n!==void 0&&JR(n,t)}function GR(e){return e==="/login"||e==="/logout"}function VR(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 Nh(e,t){return WR("sha256",e).update(t).digest("hex")}var Xc,qR,xh=T(()=>{"use strict";Jc();Xc="lmctl_next_session",qR=30});import{existsSync as un,mkdirSync as KR,readdirSync as YR,readFileSync as fo,unlinkSync as zR,writeFileSync as Yc}from"node:fs";import{join as Cr}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 Rh(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 rL(a)?{name:e,type:a,description:o?.[1]?.trim()??null,body:s,created_at:Ah,updated_at:Ah}:null}function QR(e,t,r,n){let s=r!==null?`
1759
1759
  description: ${r}`:"";return`---
1760
1760
  name: ${e}${s}
1761
1761
  type: ${t}
1762
1762
  ---
1763
- ${n}`}function eL(e,t,r,n){let s=Cr(e,zc),i=`- [${t}.md](${t}.md)${n!==null?` \u2014 ${n}`:""} (${r})`,o=un(s)?uo(s,"utf8"):"",a=new RegExp(`^- \\[${Lh(t)}\\.md\\].*$`,"m");a.test(o)?o=o.replace(a,i):o=o.length>0&&!o.endsWith(`
1763
+ ${n}`}function eL(e,t,r,n){let s=Cr(e,zc),i=`- [${t}.md](${t}.md)${n!==null?` \u2014 ${n}`:""} (${r})`,o=un(s)?fo(s,"utf8"):"",a=new RegExp(`^- \\[${Lh(t)}\\.md\\].*$`,"m");a.test(o)?o=o.replace(a,i):o=o.length>0&&!o.endsWith(`
1764
1764
  `)?`${o}
1765
1765
  ${i}
1766
1766
  `:`${o}${i}
1767
- `,Yc(s,o,"utf8")}function tL(e,t){let r=Cr(e,zc);if(!un(r))return;let n=uo(r,"utf8"),s=new RegExp(`^- \\[${Lh(t)}\\.md\\].*$\\r?\\n?`,"m");s.test(n)&&Yc(r,n.replace(s,""),"utf8")}function Lh(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function rL(e){return e==="user"||e==="feedback"||e==="project"||e==="reference"}function dt(e,t){return e.durable_memory_mode==="db"?new Kc(t,e.id):new Vc(e.local_path)}var ZR,zc,Ah,Vc,Kc,Zc=T(()=>{"use strict";ZR=/^[a-zA-Z0-9_-]+$/;zc="MEMORY.md",Ah="1970-01-01T00:00:00.000Z",Vc=class{dir;constructor(t){this.dir=Cr(t,"durable-memory")}read(t){et(t);let r=Cr(this.dir,`${t}.md`);if(!un(r))return null;let n=uo(r,"utf8");return Rh(t,n)}write(t){et(t.name),KR(this.dir,{recursive:!0});let r=Cr(this.dir,`${t.name}.md`),n=!un(r),s=QR(t.name,t.type,t.description??null,t.body);return Yc(r,s,"utf8"),eL(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=Cr(this.dir,`${t}.md`);return un(r)?(zR(r),tL(this.dir,t),!0):!1}listFiles(){if(!un(this.dir))return[];let t=YR(this.dir).filter(n=>n.endsWith(".md")&&n!==zc),r=[];for(let n of t){let s=n.slice(0,-3),i=uo(Cr(this.dir,n),"utf8"),o=Rh(s,i);o!==null&&r.push(o)}return r.sort((n,s)=>n.name.localeCompare(s.name))}};Kc=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 $h(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=dt(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=dt(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||!Oh.has(a))return n.json({error:`invalid type: must be one of ${[...Oh].join("|")}`},400);if(l===null)return n.json({error:"missing name"},400);if(c===null)return n.json({error:"missing body"},400);let u=dt(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=dt(i,r),a=n.req.query("type");return n.json(o.list(a))})}var Oh,Ch=T(()=>{"use strict";Zc();Oh=new Set(["user","feedback","project","reference"])});function sL(e){let t=4294967295;for(let r=0;r<e.length;r+=1)t=(nL[(t^e[r])&255]^t>>>8)>>>0;return(t^4294967295)>>>0}function iL(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 Mh(e,t=new Date){let{time:r,date:n}=iL(t),s=[],i=[],o=0,a=new TextEncoder;for(let _ of e){let g=a.encode(_.name),h=sL(_.data),S=_.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,h,!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,_.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,h,!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+_.data.length}let l=o,c=0;for(let _ of i)c+=_.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 _ of s)m.set(_,p),p+=_.length;for(let _ of i)m.set(_,p),p+=_.length;return m.set(d,p),m}var nL,jh=T(()=>{"use strict";nL=(()=>{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 oL,readdirSync as aL,readFileSync as Fh,statSync as lL,unlinkSync as cL,writeFileSync as dL}from"node:fs";import{join as fs}from"node:path";function Uh(e,t){let{dal:r}=t;e.post("/api/projects",async n=>{let s=await ut(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 ut(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 ut(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 ut(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 ut(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=dt(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 ut(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=dt(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=dt(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 ut(n);if(typeof o=="string")return R(n,o,400);let a=dt(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=dt(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(fL(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 ut(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=ds(s.local_path),d=fs(c,`${o}.md`);if(po(d))return R(n,`chapter already exists: ${o}`,409);oL(c,{recursive:!0}),Ph(d,o,l,oe(i,"description"),a);let u=us(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=us(ds(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=ds(s.local_path),a=us(o,i);if(a===null)return R(n,"chapter not found",404);let l=await ut(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);Ph(fs(o,`${i}.md`),i,u,d,c);let f=us(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=fs(ds(s.local_path),`${i}.md`);return po(o)?(cL(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 ut(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(Dh))),e.post("/api/chat/sessions",async n=>{let s=await uL(n);if(typeof s=="string")return R(n,s,400);let i=s!==null?oe(s,"title"):null,o=r.createChatbotSession(Dh,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 ut(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=Lr(r,s),a=[];for(let c of o){let d=pL(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=Fh(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=Mh(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 ut(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 uL(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 ds(e){return fs(e,"ai-test")}function us(e,t){let r=fs(e,`${t}.md`);if(!po(r))return null;let n=Fh(r,"utf8"),s=mL(n),i=lL(r).mtime.toISOString();return{name:t,type:s.type,description:s.description,body:s.body,updated_at:i}}function fL(e){let t=ds(e);return po(t)?aL(t).filter(r=>r.endsWith(".md")&&r!=="index.md").map(r=>r.slice(0,-3)).sort().map(r=>{let n=us(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 Ph(e,t,r,n,s){let i=n!==null&&n.length>0?`
1767
+ `,Yc(s,o,"utf8")}function tL(e,t){let r=Cr(e,zc);if(!un(r))return;let n=fo(r,"utf8"),s=new RegExp(`^- \\[${Lh(t)}\\.md\\].*$\\r?\\n?`,"m");s.test(n)&&Yc(r,n.replace(s,""),"utf8")}function Lh(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function rL(e){return e==="user"||e==="feedback"||e==="project"||e==="reference"}function dt(e,t){return e.durable_memory_mode==="db"?new Kc(t,e.id):new Vc(e.local_path)}var ZR,zc,Ah,Vc,Kc,Zc=T(()=>{"use strict";ZR=/^[a-zA-Z0-9_-]+$/;zc="MEMORY.md",Ah="1970-01-01T00:00:00.000Z",Vc=class{dir;constructor(t){this.dir=Cr(t,"durable-memory")}read(t){et(t);let r=Cr(this.dir,`${t}.md`);if(!un(r))return null;let n=fo(r,"utf8");return Rh(t,n)}write(t){et(t.name),KR(this.dir,{recursive:!0});let r=Cr(this.dir,`${t.name}.md`),n=!un(r),s=QR(t.name,t.type,t.description??null,t.body);return Yc(r,s,"utf8"),eL(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=Cr(this.dir,`${t}.md`);return un(r)?(zR(r),tL(this.dir,t),!0):!1}listFiles(){if(!un(this.dir))return[];let t=YR(this.dir).filter(n=>n.endsWith(".md")&&n!==zc),r=[];for(let n of t){let s=n.slice(0,-3),i=fo(Cr(this.dir,n),"utf8"),o=Rh(s,i);o!==null&&r.push(o)}return r.sort((n,s)=>n.name.localeCompare(s.name))}};Kc=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 $h(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=dt(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=dt(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||!Oh.has(a))return n.json({error:`invalid type: must be one of ${[...Oh].join("|")}`},400);if(l===null)return n.json({error:"missing name"},400);if(c===null)return n.json({error:"missing body"},400);let u=dt(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=dt(i,r),a=n.req.query("type");return n.json(o.list(a))})}var Oh,Ch=T(()=>{"use strict";Zc();Oh=new Set(["user","feedback","project","reference"])});function sL(e){let t=4294967295;for(let r=0;r<e.length;r+=1)t=(nL[(t^e[r])&255]^t>>>8)>>>0;return(t^4294967295)>>>0}function iL(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 Mh(e,t=new Date){let{time:r,date:n}=iL(t),s=[],i=[],o=0,a=new TextEncoder;for(let _ of e){let g=a.encode(_.name),h=sL(_.data),S=_.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,h,!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,_.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,h,!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+_.data.length}let l=o,c=0;for(let _ of i)c+=_.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 _ of s)m.set(_,p),p+=_.length;for(let _ of i)m.set(_,p),p+=_.length;return m.set(d,p),m}var nL,jh=T(()=>{"use strict";nL=(()=>{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 _o,mkdirSync as oL,readdirSync as aL,readFileSync as Fh,statSync as lL,unlinkSync as cL,writeFileSync as dL}from"node:fs";import{join as fs}from"node:path";function Uh(e,t){let{dal:r}=t;e.post("/api/projects",async n=>{let s=await ut(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 ut(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 ut(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 ut(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 ut(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=dt(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 ut(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.includes(l))return R(n,`invalid type: must be one of ${mo.join("|")}`,400);try{et(o)}catch(u){return R(n,u.message,400)}let c=dt(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=dt(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 ut(n);if(typeof o=="string")return R(n,o,400);let a=dt(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(!mo.includes(u))return R(n,`invalid type: must be one of ${mo.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=dt(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(fL(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 ut(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||!po.has(l))return R(n,`invalid type: must be one of ${[...po].join("|")}`,400);try{et(o)}catch(f){return R(n,f.message,400)}let c=ds(s.local_path),d=fs(c,`${o}.md`);if(_o(d))return R(n,`chapter already exists: ${o}`,409);oL(c,{recursive:!0}),Ph(d,o,l,oe(i,"description"),a);let u=us(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=us(ds(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=ds(s.local_path),a=us(o,i);if(a===null)return R(n,"chapter not found",404);let l=await ut(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(!po.has(u))return R(n,`invalid type: must be one of ${[...po].join("|")}`,400);Ph(fs(o,`${i}.md`),i,u,d,c);let f=us(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=fs(ds(s.local_path),`${i}.md`);return _o(o)?(cL(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 ut(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(Dh))),e.post("/api/chat/sessions",async n=>{let s=await uL(n);if(typeof s=="string")return R(n,s,400);let i=s!==null?oe(s,"title"):null,o=r.createChatbotSession(Dh,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 ut(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=Lr(r,s),a=[];for(let c of o){let d=pL(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=Fh(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=Mh(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 ut(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 uL(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 ds(e){return fs(e,"ai-test")}function us(e,t){let r=fs(e,`${t}.md`);if(!_o(r))return null;let n=Fh(r,"utf8"),s=mL(n),i=lL(r).mtime.toISOString();return{name:t,type:s.type,description:s.description,body:s.body,updated_at:i}}function fL(e){let t=ds(e);return _o(t)?aL(t).filter(r=>r.endsWith(".md")&&r!=="index.md").map(r=>r.slice(0,-3)).sort().map(r=>{let n=us(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 Ph(e,t,r,n,s){let i=n!==null&&n.length>0?`
1768
1768
  description: ${n}`:"",o=`---
1769
1769
  name: ${t}${i}
1770
1770
  type: ${r}
1771
1771
  ---
1772
- ${s}`;dL(e,o,"utf8")}function mL(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 pL(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?_L(e.path):hL(e.kind);return`step-${e.step_id}-${t}/${e.id}-${r}${n}`}function _L(e){let t=e.lastIndexOf(".");if(t<0)return"";let r=e.slice(t);return/^\.[A-Za-z0-9]+$/.test(r)?r:""}function hL(e){return e.endsWith("_md")||e.includes("markdown")?".md":e.endsWith("_json")||e.includes("json")?".json":".txt"}var fo,mo,Dh,Wh=T(()=>{"use strict";Ht();jh();Zc();fo=["user","feedback","project","reference"],mo=new Set(["smoke","integration","vision","scenario","regression"]),Dh="operator"});function Re(e,t){return`<!doctype html>
1772
+ ${s}`;dL(e,o,"utf8")}function mL(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 pL(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?_L(e.path):hL(e.kind);return`step-${e.step_id}-${t}/${e.id}-${r}${n}`}function _L(e){let t=e.lastIndexOf(".");if(t<0)return"";let r=e.slice(t);return/^\.[A-Za-z0-9]+$/.test(r)?r:""}function hL(e){return e.endsWith("_md")||e.includes("markdown")?".md":e.endsWith("_json")||e.includes("json")?".json":".txt"}var mo,po,Dh,Wh=T(()=>{"use strict";Ht();jh();Zc();mo=["user","feedback","project","reference"],po=new Set(["smoke","integration","vision","scenario","regression"]),Dh="operator"});function Re(e,t){return`<!doctype html>
1773
1773
  <html lang="en">
1774
1774
  <head>
1775
1775
  <meta charset="utf-8">
@@ -1830,8 +1830,8 @@ ${s}`;dL(e,o,"utf8")}function mL(e){let t=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r
1830
1830
  </nav>
1831
1831
  <main>${t}</main>
1832
1832
  </body>
1833
- </html>`}function b(e){return String(e??"").replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&#39;")}function me(e,t){let r=e.map(s=>`<th>${b(s)}</th>`).join(""),n=t.length===0?`<tr><td colspan="${e.length}"><span class="muted">(empty)</span></td></tr>`:t.map(s=>`<tr>${s.map(i=>`<td>${i}</td>`).join("")}</tr>`).join("");return`<table><thead><tr>${r}</tr></thead><tbody>${n}</tbody></table>`}function de(e){return`<pre>${b(JSON.stringify(e,null,2))}</pre>`}var Qc=T(()=>{"use strict"});import{createHash as gL}from"node:crypto";import{existsSync as ms,mkdirSync as qh,readFileSync as ps,readdirSync as yL,renameSync as wL,statSync as EL,unlinkSync as TL,writeFileSync as _o}from"node:fs";import{homedir as bL}from"node:os";import{dirname as ed,isAbsolute as Bh,join as ft,relative as SL,resolve as fn}from"node:path";import{fileURLToPath as vL}from"node:url";function Jh(e){let t=fn(e);for(;;){let r=ft(t,td);try{if(EL(r).isDirectory())return r}catch{}let n=ed(t);if(n===t)return null;t=n}}function rd(e=process.cwd()){let t=process.env.LMCTL_HOME;if(t!==void 0&&t.trim().length>0)return fn(t);let r=Jh(e);return r!==null?r:ft(Hh(),td)}function Xh(){return fn(ed(vL(import.meta.url)),"..","..","workflows")}function kL(e){let t=ft(e,Gh);try{let r=JSON.parse(ps(t,"utf8"));if(r&&typeof r=="object"&&r.files&&typeof r.files=="object")return{version:String(r.version??""),files:r.files}}catch{}return{version:"",files:{}}}function IL(e,t){qh(e,{recursive:!0});let r=ft(e,Gh),n=`${r}.tmp-${process.pid}`;_o(n,`${JSON.stringify(t,null,2)}
1834
- `,"utf8"),wL(n,r)}function NL(e){if(typeof e=="object"&&e!==null&&"code"in e){let t=e.code;if(typeof t=="string")return t}}function xL(e,t,r,n,s){let i=`${t}.dist-${r}`;for(let o=0;o<1e3;o+=1){let a=o===0?i:`${i}-${o}`,l=ft(e,a);try{return _o(l,n,{flag:"wx"}),a}catch(c){if(NL(c)!=="EEXIST")throw c;if(ho(ps(l))===s)return a}}throw new Error(`could not find available dist shadow path for ${t}`)}function AL(e,t){if(Bh(t)||ed(t)!=="workflows")return null;let r=t.slice(10);if(r.length===0||r.includes("/")||r.includes("\\")||r.includes(".."))return null;let n=fn(e,"templates","workflows"),s=fn(e,"templates",t),i=SL(n,s);return i.length===0||i.startsWith("..")||Bh(i)||i.includes("/")||i.includes("\\")?null:s}function RL(e,t,r){for(let[n,s]of Object.entries(t.files)){if(r.has(n))continue;let i=AL(e,n);if(i===null){delete t.files[n];continue}if(!ms(i)){delete t.files[n];continue}try{if(ho(ps(i))!==s)continue;TL(i),delete t.files[n]}catch{}}}function Vh(e={}){let t=rd(e.cwd),r=ft(t,"templates","workflows"),n=Xh(),s={basedir:t,copied:[],refreshed:[],preserved:[],shadowed:[]};try{let i=ms(n)?yL(n).filter(c=>c.endsWith(".compound.json")||c.endsWith(".lmctl")||c==="index.jsonl"):[];if(i.length===0)return s;qh(r,{recursive:!0});let o=kL(t),a=yt(),l=new Set(i.map(c=>`workflows/${c}`));for(let c of i){let d=`workflows/${c}`,u=ps(ft(n,c)),f=ho(u),m=ft(r,c);if(!ms(m)){try{_o(m,u,{flag:"wx"}),s.copied.push(c)}catch{}o.files[d]=f;continue}let p=ho(ps(m));if(p===f){o.files[d]=f;continue}let _=o.files[d];if(_!==void 0&&p===_)_o(m,u),o.files[d]=f,s.refreshed.push(c);else{let g=xL(r,c,a,u,f);s.preserved.push(c),s.shadowed.push(g)}}RL(t,o,l),IL(t,{version:a,files:o.files})}catch(i){if(e.swallow!==!0)throw i}return s}function nd(e){let t=[],r=process.env.LMCTL_HOME;r!==void 0&&r.trim().length>0&&t.push(fn(r));let n=Jh(e??process.cwd());return n!==null&&t.push(n),t.push(ft(Hh(),td)),t}function go(e,t){let r=nd(t),n=[`${e}.compound.json`,`${e}.lmctl`];for(let s of r)for(let i of n){let o=ft(s,"templates","workflows",i);if(ms(o))return o}for(let s of n){let i=ft(Xh(),s);if(ms(i))return i}return null}var td,Hh,ho,Gh,sd=T(()=>{"use strict";Fn();td=".lmctl",Hh=()=>process.env.HOME??bL(),ho=e=>gL("sha256").update(e).digest("hex");Gh=".dist-manifest.json"});function Kh(e,t){if(t.query(`SELECT sa.id FROM step_artifact sa
1833
+ </html>`}function b(e){return String(e??"").replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&#39;")}function me(e,t){let r=e.map(s=>`<th>${b(s)}</th>`).join(""),n=t.length===0?`<tr><td colspan="${e.length}"><span class="muted">(empty)</span></td></tr>`:t.map(s=>`<tr>${s.map(i=>`<td>${i}</td>`).join("")}</tr>`).join("");return`<table><thead><tr>${r}</tr></thead><tbody>${n}</tbody></table>`}function de(e){return`<pre>${b(JSON.stringify(e,null,2))}</pre>`}var Qc=T(()=>{"use strict"});import{createHash as gL}from"node:crypto";import{existsSync as ms,mkdirSync as qh,readFileSync as ps,readdirSync as yL,renameSync as wL,statSync as EL,unlinkSync as TL,writeFileSync as ho}from"node:fs";import{homedir as bL}from"node:os";import{dirname as ed,isAbsolute as Bh,join as ft,relative as SL,resolve as fn}from"node:path";import{fileURLToPath as vL}from"node:url";function Jh(e){let t=fn(e);for(;;){let r=ft(t,td);try{if(EL(r).isDirectory())return r}catch{}let n=ed(t);if(n===t)return null;t=n}}function rd(e=process.cwd()){let t=process.env.LMCTL_HOME;if(t!==void 0&&t.trim().length>0)return fn(t);let r=Jh(e);return r!==null?r:ft(Hh(),td)}function Xh(){return fn(ed(vL(import.meta.url)),"..","..","workflows")}function kL(e){let t=ft(e,Gh);try{let r=JSON.parse(ps(t,"utf8"));if(r&&typeof r=="object"&&r.files&&typeof r.files=="object")return{version:String(r.version??""),files:r.files}}catch{}return{version:"",files:{}}}function IL(e,t){qh(e,{recursive:!0});let r=ft(e,Gh),n=`${r}.tmp-${process.pid}`;ho(n,`${JSON.stringify(t,null,2)}
1834
+ `,"utf8"),wL(n,r)}function NL(e){if(typeof e=="object"&&e!==null&&"code"in e){let t=e.code;if(typeof t=="string")return t}}function xL(e,t,r,n,s){let i=`${t}.dist-${r}`;for(let o=0;o<1e3;o+=1){let a=o===0?i:`${i}-${o}`,l=ft(e,a);try{return ho(l,n,{flag:"wx"}),a}catch(c){if(NL(c)!=="EEXIST")throw c;if(go(ps(l))===s)return a}}throw new Error(`could not find available dist shadow path for ${t}`)}function AL(e,t){if(Bh(t)||ed(t)!=="workflows")return null;let r=t.slice(10);if(r.length===0||r.includes("/")||r.includes("\\")||r.includes(".."))return null;let n=fn(e,"templates","workflows"),s=fn(e,"templates",t),i=SL(n,s);return i.length===0||i.startsWith("..")||Bh(i)||i.includes("/")||i.includes("\\")?null:s}function RL(e,t,r){for(let[n,s]of Object.entries(t.files)){if(r.has(n))continue;let i=AL(e,n);if(i===null){delete t.files[n];continue}if(!ms(i)){delete t.files[n];continue}try{if(go(ps(i))!==s)continue;TL(i),delete t.files[n]}catch{}}}function Vh(e={}){let t=rd(e.cwd),r=ft(t,"templates","workflows"),n=Xh(),s={basedir:t,copied:[],refreshed:[],preserved:[],shadowed:[]};try{let i=ms(n)?yL(n).filter(c=>c.endsWith(".compound.json")||c.endsWith(".lmctl")||c==="index.jsonl"):[];if(i.length===0)return s;qh(r,{recursive:!0});let o=kL(t),a=yt(),l=new Set(i.map(c=>`workflows/${c}`));for(let c of i){let d=`workflows/${c}`,u=ps(ft(n,c)),f=go(u),m=ft(r,c);if(!ms(m)){try{ho(m,u,{flag:"wx"}),s.copied.push(c)}catch{}o.files[d]=f;continue}let p=go(ps(m));if(p===f){o.files[d]=f;continue}let _=o.files[d];if(_!==void 0&&p===_)ho(m,u),o.files[d]=f,s.refreshed.push(c);else{let g=xL(r,c,a,u,f);s.preserved.push(c),s.shadowed.push(g)}}RL(t,o,l),IL(t,{version:a,files:o.files})}catch(i){if(e.swallow!==!0)throw i}return s}function nd(e){let t=[],r=process.env.LMCTL_HOME;r!==void 0&&r.trim().length>0&&t.push(fn(r));let n=Jh(e??process.cwd());return n!==null&&t.push(n),t.push(ft(Hh(),td)),t}function yo(e,t){let r=nd(t),n=[`${e}.compound.json`,`${e}.lmctl`];for(let s of r)for(let i of n){let o=ft(s,"templates","workflows",i);if(ms(o))return o}for(let s of n){let i=ft(Xh(),s);if(ms(i))return i}return null}var td,Hh,go,Gh,sd=T(()=>{"use strict";Fn();td=".lmctl",Hh=()=>process.env.HOME??bL(),go=e=>gL("sha256").update(e).digest("hex");Gh=".dist-manifest.json"});function Kh(e,t){if(t.query(`SELECT sa.id FROM step_artifact sa
1835
1835
  JOIN step s ON s.id = sa.step_id
1836
1836
  WHERE s.run_id = ? AND sa.kind = 'run_report' LIMIT 1`,e).length>0)return;let n=t.getRun(e);if(n===null)return;let s=t.query("SELECT id FROM step WHERE run_id = ? ORDER BY id DESC LIMIT 1",e);if(s.length===0)return;let i=s[0].id,o=t.query("SELECT id, state_name, outcome, started_at, ended_at FROM step WHERE run_id = ? ORDER BY id ASC",e),a=t.query(`SELECT sa.id, sa.step_id, sa.kind FROM step_artifact sa
1837
1837
  JOIN step s ON s.id = sa.step_id
@@ -1840,40 +1840,40 @@ ${s}`;dL(e,o,"utf8")}function mL(e){let t=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r
1840
1840
  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:_},drift_signals:w,token_totals:U};t.insertStepArtifact({step_id:i,kind:"run_report",content:JSON.stringify(M)})}var Yh=T(()=>{"use strict"});import{spawnSync as Zh}from"node:child_process";function id(e){return LL[e]??`no install hint; ensure '${e}' is on PATH`}function OL(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 zh(e){return Zh("which",[e],{encoding:"utf8"}).status===0}function Qh(e){if(e===void 0)return null;for(let t of e.tools??[])if(!zh(t)){let r=id(t);return{kind:"missing_tool",tool:t,install_hint:r,message:`missing dependency: ${t}; ${r}`}}for(let t of e.auth??[]){if(!zh(t)){let s=id(t);return{kind:"missing_tool",tool:t,install_hint:s,message:`missing dependency: ${t}; ${s}`}}let r=OL(t);if(r===null)continue;let n=Zh(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:id(t),message:`${t} not authenticated; run \`${t} login\` or equivalent`,detail:s.length>0?s:void 0}}}return null}var LL,eg=T(()=>{"use strict";LL={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 CL,readFileSync as ML}from"node:fs";import{join as tg}from"node:path";function jL(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(`
1841
1841
  `).map(i=>i.replace(/^\s*-\s+/,"").trim()).filter(Boolean):[]}function rg(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 ng(e,t){if(t.length===0)return null;let r=tg(e,"durable-memory");if(!$L(r))return null;let n;try{n=CL(r).filter(i=>i.endsWith(".md")&&i!=="index.md")}catch{return null}let s=[];for(let i of n)try{let o=ML(tg(r,i),"utf8");if(jL(o).some(l=>t.includes(l))){let l=rg(o,"name")??i.replace(".md",""),c=rg(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 sg=T(()=>{"use strict"});function ld(e){let t=e.trim().replace(DL,"").trim();for(let r=0;r<4;r+=1){let n=PL.exec(t);if(n===null)break;t=n[2].trim()}return t}function ig(e){let t=e.trim(),r=FL.exec(t);if(r!==null)return r[2];let n=UL.exec(t);return n!==null?n[0]:null}function _s(e,t){let r=e.split(`
1842
1842
  `),n=null,s=-1;for(let o=0;o<r.length;o+=1){let a=ld(r[o]),l=od.exec(a);if(l===null)continue;let c=l[1].trim();if(ad.test(c))continue;let d=ig(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=ld(r[o]),l=od.exec(a);if(l===null)break;let c=ad.exec(l[1].trim());if(c===null)break;i[c[1]]=c[2].trim()}return{outcome:n,evidence:i}}function og(e){let t=e.split(`
1843
- `),r=null;for(let n=0;n<t.length;n+=1){let s=ld(t[n]),i=od.exec(s);if(i===null)continue;let o=i[1].trim();if(ad.test(o))continue;let a=ig(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 DL,PL,od,ad,FL,UL,cd=T(()=>{"use strict";Xn();DL=/^#{1,6}\s+/,PL=/^(```|\*\*|__|`|\*|_)([\s\S]+?)\1$/,od=/^STANCE:\s+(.+)$/,ad=/^([A-Z][A-Z0-9_]*):\s*(.+)$/,FL=/^(```|\*\*|__|`|\*|_)([A-Za-z0-9_-]+)\1/,UL=/^[A-Za-z0-9_-]+/});function ag(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 lg=T(()=>{"use strict"});import{readFileSync as WL}from"node:fs";import{dirname as BL,join as qL}from"node:path";import{fileURLToPath as HL}from"node:url";function GL(e){return e.rules.map(t=>({command:t.command,subcommands:t.argv_patterns.map(r=>r.trim().split(/\s+/)),kind:t.kind}))}function zL(e){let t=[],r=[];for(let n of e)JL.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&&XL.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 QL(e,t){if(e.length===0)return{matched:!1};let r=zL(e);for(let n of r){let s=ZL(n,t);if(s.matched)return s}return{matched:!1}}function dd(e){return QL(e,YL)}function eO(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 ud(e){return eO(e).split(" ").filter(t=>t.length>0)}var JL,XL,VL,KL,YL,cg=T(()=>{"use strict";JL=new Set(["&&","||",";","|",">",">>","<","<<"]),XL=/^[A-Za-z_][A-Za-z0-9_]*=/;VL=BL(HL(import.meta.url)),KL=JSON.parse(WL(qL(VL,"side_effect_classifier.json"),"utf-8")),YL=GL(KL)});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 dg(e,t){try{return await $r(fd(e)??e,yo(t))===!0}catch{return!1}}async function wo(e,t){try{return await $r(fd(e)??e,yo(t))}catch{return}}async function ug(e,t){if(typeof e!="string")return e;let r=fd(e);if(r===null)return e;try{return await $r(r,yo(t))}catch{return}}async function fg(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+=tO(await $r(a,yo(t)))}catch{n+=""}s=o+i[0].length}return n+=e.slice(s),n}function fd(e){let t=e.trim();return!t.startsWith("={{")||!t.endsWith("}}")?null:t.slice(3,-2).trim()}function tO(e){return e==null?"":typeof e=="string"?e:JSON.stringify(e)}var hs=T(()=>{"use strict";as()});import{existsSync as mg,readdirSync as pg,readFileSync as rO,statSync as _g}from"node:fs";import{join as To}from"node:path";function hg(e,t,r,n){return Object.assign(e,{stateId:t,state:r,displayName:n})}function q(e,t){return e.dal.insertStep({...t,parent_step_id:e.parent_step_id})}function J(e,t){return t.startsWith("@terminal:")?{kind:"terminal",terminal:t.slice(10)}:e.states[t]===void 0?{kind:"escalate",token:t,reason:`unknown state ref '${t}'`}:{kind:"state",state:t}}function tt(e,t,r,n,s={}){let i=O(),o=q(e,{run_id:e.run_id,state_name:t.name});e.steps_executed+=1,e.dal.finishStep(o.id,null,`escalation:${n}`.slice(0,480)),e.dal.setRunPausedState(e.run_id,`${gs}${t.id}`,i);let a=e.dal.getRun(e.run_id),l=Vr(r)?"generic":"unhandled";return e.dal.raiseAttention({kind: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:nO(s.agent_output??n),paused_at:i,created_at:i})}),e.dal.pauseJob(e.job.id),{kind:"paused"}}function nO(e){return e.length>8e3?`${e.slice(0,8e3)}
1844
- \u2026[truncated ${e.length-8e3} chars]`:e}function X(e,t,r,n){e.outcomes[t]=n,r!==t&&(e.outcomes[r]=n)}function Y(e){return e.terminals.aborted?.kind==="failure"?"aborted":Object.entries(e.terminals).find(([,r])=>r.kind==="failure")?.[0]??Object.keys(e.terminals)[0]??"aborted"}function gg(e,t){let r=t.trim();if(r.startsWith("[")){try{let n=JSON.parse(r);if(Array.isArray(n)&&n.every(s=>typeof s=="string"))return n}catch{return null}return null}if(r.startsWith("job.payload.")){let n=r.slice(12);if(n.length===0)return null;let i=fr(e.job.payload)?.[n];if(Array.isArray(i)&&i.every(o=>typeof o=="string"))return i}return null}async function Ke(e,t,r){let n=e.replace(/(?<!=)\{\{\s*([a-zA-Z0-9_.]+)\s*\}\}/g,(s,i)=>{if(i==="run_id")return String(t.run_id);if(i==="state_id")return r;if(i==="item")return t.iteration?.item??"";if(i==="index")return t.iteration===null?"":String(t.iteration.index);if(i.startsWith("project.")){let o=i.slice(8);if(o==="id")return String(t.project.id);if(o==="name")return t.project.name;if(o==="local_path")return t.project.local_path;if(o==="default_branch")return t.project.default_branch??"";if(o==="owner"){let a=t.project.name.indexOf("/");return a>0?t.project.name.slice(0,a):""}if(o==="repo"){let a=t.project.name.indexOf("/");return a>0?t.project.name.slice(a+1):t.project.name}if(o==="test_command"){let a=t.project.test_command;return a===null||a===""?"npm test":a}return""}if(i==="job_payload"){let o=fr(t.job.payload);return o===null?"":JSON.stringify(o)}if(i.startsWith("job_payload.")){let o=i.slice(12),l=fr(t.job.payload)?.[o];return l==null?"":String(l)}if(i.startsWith("outcomes.")){let o=sO(t.outcomes,i.slice(9));return o==null?"":typeof o=="string"?o:JSON.stringify(o)}return""});return fg(n,t)}function sO(e,t){let r=e;for(let n of t.split(".")){if(r===null||typeof r!="object"||Array.isArray(r))return;r=r[n]}return r}function fr(e){if(e===null)return null;try{let t=JSON.parse(e);return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:null}catch{return null}}async function ys(e){let{context:t,stateId:r,member:n,prompt:s,stepId:i,timeoutMs:o,writesToProjectPath:a}=e,l=ag(t.dal,t.run_id,()=>i),c=md(t,r),d={violation:null},u=S=>{if(l(S),d.violation===null&&S.kind==="tool_use"&&S.tool==="Bash"&&S.summary){let y=ud(S.summary),w=dd(y);w.matched&&!c&&(d.violation={summary:S.summary,kind:w.kind})}},f=new Date(Date.now()-1),m=0,p=0,_=S=>{u(S),iO(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:_});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})}),oO(t.project,t.dal,f);let h=d.violation;return h!==null?{kind:"g3_violation",summary:h.summary,violationKind:h.kind}:!a&&t.project.local_path.trim().length>0&&pd(t.project.local_path,f)?{kind:"g2_violation"}:{kind:"ok",text:g.text,ms:g.ms,argv:g.argv}}function iO(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 Gt(e,t,r,n){if(r.sessionid===null)return;let s=`${t}:write_back`,i=q(e,{run_id:e.run_id,state_name:s});e.steps_executed+=1;let a=`This state completed successfully.${typeof n=="string"?` Category hint: "${n}".`:""} Did you learn anything worth preserving in durable-memory? If yes, use Write to create/update an entry under <project>/durable-memory/<descriptive-name>.md. Include YAML frontmatter (name/description/type[/tags]). Be brief \u2014 one entry per insight. If you didn't learn anything new, respond with \`STANCE: no_writeback\` and the engine moves on.`;try{let l=await ys({context:e,stateId:s,member:r,prompt:a,stepId:i.id,timeoutMs:e.workflow.default_task_timeout_ms,writesToProjectPath:!1});if(l.kind==="ok"){e.dal.insertStepArtifact({step_id:i.id,kind:"write_back_transcript",content:l.text});let c=!l.text.includes("STANCE: no_writeback");e.dal.finishStep(i.id,c?"wrote_back":"no_writeback","write_back_turn")}else e.dal.finishStep(i.id,null,`write_back_${l.kind}`)}catch{e.dal.finishStep(i.id,null,"write_back_error")}}async function mn(e,t,r,n,s,i,o,a=!1,l){let c=e.membersByAlias.get(r.alias);if(c===void 0||c.sessionid===null)return{outcome:null,text:"",status_detail:`missing_agent:${r.alias}`};let d=q(e,{run_id:e.run_id,state_name:t});e.steps_executed+=1;let u=[];c.prompt_snapshot!==null&&c.prompt_snapshot.length>0&&u.push(c.prompt_snapshot),i&&u.push(Cm(s)),l!=null&&l.length>0&&u.push(l);let f=r.prompt_template!==void 0?await Ke(r.prompt_template,e,t):"";f.length>0&&u.push(f),n!==null&&n.length>0&&u.push(n);let m=u.join(`
1843
+ `),r=null;for(let n=0;n<t.length;n+=1){let s=ld(t[n]),i=od.exec(s);if(i===null)continue;let o=i[1].trim();if(ad.test(o))continue;let a=ig(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 DL,PL,od,ad,FL,UL,cd=T(()=>{"use strict";Xn();DL=/^#{1,6}\s+/,PL=/^(```|\*\*|__|`|\*|_)([\s\S]+?)\1$/,od=/^STANCE:\s+(.+)$/,ad=/^([A-Z][A-Z0-9_]*):\s*(.+)$/,FL=/^(```|\*\*|__|`|\*|_)([A-Za-z0-9_-]+)\1/,UL=/^[A-Za-z0-9_-]+/});function ag(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 lg=T(()=>{"use strict"});import{readFileSync as WL}from"node:fs";import{dirname as BL,join as qL}from"node:path";import{fileURLToPath as HL}from"node:url";function GL(e){return e.rules.map(t=>({command:t.command,subcommands:t.argv_patterns.map(r=>r.trim().split(/\s+/)),kind:t.kind}))}function zL(e){let t=[],r=[];for(let n of e)JL.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&&XL.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 QL(e,t){if(e.length===0)return{matched:!1};let r=zL(e);for(let n of r){let s=ZL(n,t);if(s.matched)return s}return{matched:!1}}function dd(e){return QL(e,YL)}function eO(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 ud(e){return eO(e).split(" ").filter(t=>t.length>0)}var JL,XL,VL,KL,YL,cg=T(()=>{"use strict";JL=new Set(["&&","||",";","|",">",">>","<","<<"]),XL=/^[A-Za-z_][A-Za-z0-9_]*=/;VL=BL(HL(import.meta.url)),KL=JSON.parse(WL(qL(VL,"side_effect_classifier.json"),"utf-8")),YL=GL(KL)});function wo(e){return{context:{outcomes:e.outcomes,inputs:e.inputs,item:e.iteration?.item,index:e.iteration?.index},outcomes:e.outcomes,inputs:e.inputs,item:e.iteration?.item,index:e.iteration?.index}}async function dg(e,t){try{return await $r(fd(e)??e,wo(t))===!0}catch{return!1}}async function Eo(e,t){try{return await $r(fd(e)??e,wo(t))}catch{return}}async function ug(e,t){if(typeof e!="string")return e;let r=fd(e);if(r===null)return e;try{return await $r(r,wo(t))}catch{return}}async function fg(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+=tO(await $r(a,wo(t)))}catch{n+=""}s=o+i[0].length}return n+=e.slice(s),n}function fd(e){let t=e.trim();return!t.startsWith("={{")||!t.endsWith("}}")?null:t.slice(3,-2).trim()}function tO(e){return e==null?"":typeof e=="string"?e:JSON.stringify(e)}var hs=T(()=>{"use strict";as()});import{existsSync as mg,readdirSync as pg,readFileSync as rO,statSync as _g}from"node:fs";import{join as bo}from"node:path";function hg(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,`${gs}${t.id}`,i);let a=e.dal.getRun(e.run_id),l=Vr(r)?"generic":"unhandled";return e.dal.raiseAttention({kind:ti,severity:"attn",project_id:e.project.id,run_id:e.run_id,requires_user:!0,payload:JSON.stringify({run_id:e.run_id,step_id:o.id,project_id:e.project.id,workflow_name:e.workflow.name,workflow_version_id:a?.workflow_version_id??null,step:{id:t.id,name:t.name,type:t.type},tier:l,token:r,reason:n,declared_outcomes:[...s.declared_outcomes??[]],agent_output:nO(s.agent_output??n),paused_at:i,created_at:i})}),e.dal.pauseJob(e.job.id),{kind:"paused"}}function nO(e){return e.length>8e3?`${e.slice(0,8e3)}
1844
+ \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 gg(e,t){let r=t.trim();if(r.startsWith("[")){try{let n=JSON.parse(r);if(Array.isArray(n)&&n.every(s=>typeof s=="string"))return n}catch{return null}return null}if(r.startsWith("job.payload.")){let n=r.slice(12);if(n.length===0)return null;let i=fr(e.job.payload)?.[n];if(Array.isArray(i)&&i.every(o=>typeof o=="string"))return i}return null}async function Ke(e,t,r){let n=e.replace(/(?<!=)\{\{\s*([a-zA-Z0-9_.]+)\s*\}\}/g,(s,i)=>{if(i==="run_id")return String(t.run_id);if(i==="state_id")return r;if(i==="item")return t.iteration?.item??"";if(i==="index")return t.iteration===null?"":String(t.iteration.index);if(i.startsWith("project.")){let o=i.slice(8);if(o==="id")return String(t.project.id);if(o==="name")return t.project.name;if(o==="local_path")return t.project.local_path;if(o==="default_branch")return t.project.default_branch??"";if(o==="owner"){let a=t.project.name.indexOf("/");return a>0?t.project.name.slice(0,a):""}if(o==="repo"){let a=t.project.name.indexOf("/");return a>0?t.project.name.slice(a+1):t.project.name}if(o==="test_command"){let a=t.project.test_command;return a===null||a===""?"npm test":a}return""}if(i==="job_payload"){let o=fr(t.job.payload);return o===null?"":JSON.stringify(o)}if(i.startsWith("job_payload.")){let o=i.slice(12),l=fr(t.job.payload)?.[o];return l==null?"":String(l)}if(i.startsWith("outcomes.")){let o=sO(t.outcomes,i.slice(9));return o==null?"":typeof o=="string"?o:JSON.stringify(o)}return""});return fg(n,t)}function sO(e,t){let r=e;for(let n of t.split(".")){if(r===null||typeof r!="object"||Array.isArray(r))return;r=r[n]}return r}function fr(e){if(e===null)return null;try{let t=JSON.parse(e);return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:null}catch{return null}}async function ys(e){let{context:t,stateId:r,member:n,prompt:s,stepId:i,timeoutMs:o,writesToProjectPath:a}=e,l=ag(t.dal,t.run_id,()=>i),c=md(t,r),d={violation:null},u=S=>{if(l(S),d.violation===null&&S.kind==="tool_use"&&S.tool==="Bash"&&S.summary){let y=ud(S.summary),w=dd(y);w.matched&&!c&&(d.violation={summary:S.summary,kind:w.kind})}},f=new Date(Date.now()-1),m=0,p=0,_=S=>{u(S),iO(S,(y,w)=>{m+=y,p+=w})},g=await Li({sessionid:n.sessionid,sessiondir:n.sessiondir,prompt:s,timeoutMs:o,dal:t.dal,team_member_id:n.id,onProgress:_});t.dal.insertSessionEvent({run_id:t.run_id,step_id:i,kind:"agent_call",timestamp_ms:Date.now(),payload:JSON.stringify({alias:n.alias,provider:Ue(n),model:n.model??"unknown",tokens_in:m,tokens_out:p,wall_time_ms:g.ms})}),oO(t.project,t.dal,f);let h=d.violation;return h!==null?{kind:"g3_violation",summary:h.summary,violationKind:h.kind}:!a&&t.project.local_path.trim().length>0&&pd(t.project.local_path,f)?{kind:"g2_violation"}:{kind:"ok",text:g.text,ms:g.ms,argv:g.argv}}function iO(e,t){let r=e.raw;if(r==null)return;let s=r.message?.usage;if(s!==void 0){let o=To(s.input_tokens),a=To(s.output_tokens);(o>0||a>0)&&t(o,a);return}let i=r.usage;if(i!==void 0){let o=To(i.input_tokens),a=To(i.output_tokens);(o>0||a>0)&&t(o,a)}}function To(e){return typeof e=="number"&&Number.isFinite(e)&&e>=0?e:0}async function Gt(e,t,r,n){if(r.sessionid===null)return;let s=`${t}:write_back`,i=q(e,{run_id:e.run_id,state_name:s});e.steps_executed+=1;let a=`This state completed successfully.${typeof n=="string"?` Category hint: "${n}".`:""} Did you learn anything worth preserving in durable-memory? If yes, use Write to create/update an entry under <project>/durable-memory/<descriptive-name>.md. Include YAML frontmatter (name/description/type[/tags]). Be brief \u2014 one entry per insight. If you didn't learn anything new, respond with \`STANCE: no_writeback\` and the engine moves on.`;try{let l=await ys({context:e,stateId:s,member:r,prompt:a,stepId:i.id,timeoutMs:e.workflow.default_task_timeout_ms,writesToProjectPath:!1});if(l.kind==="ok"){e.dal.insertStepArtifact({step_id:i.id,kind:"write_back_transcript",content:l.text});let c=!l.text.includes("STANCE: no_writeback");e.dal.finishStep(i.id,c?"wrote_back":"no_writeback","write_back_turn")}else e.dal.finishStep(i.id,null,`write_back_${l.kind}`)}catch{e.dal.finishStep(i.id,null,"write_back_error")}}async function mn(e,t,r,n,s,i,o,a=!1,l){let c=e.membersByAlias.get(r.alias);if(c===void 0||c.sessionid===null)return{outcome:null,text:"",status_detail:`missing_agent:${r.alias}`};let d=q(e,{run_id:e.run_id,state_name:t});e.steps_executed+=1;let u=[];c.prompt_snapshot!==null&&c.prompt_snapshot.length>0&&u.push(c.prompt_snapshot),i&&u.push(Cm(s)),l!=null&&l.length>0&&u.push(l);let f=r.prompt_template!==void 0?await Ke(r.prompt_template,e,t):"";f.length>0&&u.push(f),n!==null&&n.length>0&&u.push(n);let m=u.join(`
1845
1845
 
1846
1846
  `);try{let p=await ys({context:e,stateId:t,member:c,prompt:m,stepId:d.id,timeoutMs:o,writesToProjectPath:a});if(p.kind==="g3_violation"||p.kind==="g2_violation"){let g=p.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${p.violationKind}`:"policy_violation:writes_to_project_path";return e.dal.insertSessionEvent({run_id:e.run_id,step_id:d.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(p.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:t,kind:p.violationKind,command_summary:p.summary,message:`State ${t} ran a classified side-effect command (${p.violationKind}) without a preceding approved Pause`}:{violation:"writes_to_project_path",state_id:t,message:`State ${t} wrote to project.local_path without writes_to_project_path: true`})}),e.dal.finishStep(d.id,null,g),{outcome:null,text:"",status_detail:g}}if(e.dal.insertStepArtifact({step_id:d.id,kind:`${t}_transcript`,content:p.text}),e.transcripts[t]=p.text,!i)return e.dal.finishStep(d.id,"done",`chat_ms=${p.ms}`),e.outcomes[t]="done",{outcome:"done",text:p.text,status_detail:`chat_ms=${p.ms}`};let _=_s(p.text,s);return e.dal.finishStep(d.id,_.outcome,_.outcome!==null?`chat_ms=${p.ms}`:_.reason),_.outcome!==null&&(e.outcomes[t]=_.outcome),{outcome:_.outcome,text:p.text,status_detail:_.outcome!==null?`chat_ms=${p.ms}`:_.reason}}catch(p){let _=p instanceof ve?`chat_${p.kind}`:"chat_other";return e.dal.finishStep(d.id,null,_),{outcome:null,text:"",status_detail:_}}}function pn(e,t){return(t?.length??0)>0?ng(e.project.local_path,t):null}function yg(e){return dd(ud(e))}function md(e,t){let r=e.dal.query(`SELECT state_name, outcome FROM step
1847
1847
  WHERE run_id = ? AND state_name != ? AND ended_at IS NOT NULL
1848
- 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 pd(e,t){if(!mg(e))return!1;let r=To(e,"durable-memory");function n(s){let i;try{i=pg(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(_g(a).mtime>t)return!0}catch{}}return!1}return n(e)}function oO(e,t,r){let n=To(e.local_path,"durable-memory");if(!mg(n))return;let s;try{s=pg(n)}catch{return}for(let i of s){if(!i.endsWith(".md")||i==="MEMORY.md")continue;let o=To(n,i),a;try{a=_g(o).mtime}catch{continue}if(a<=r)continue;let l;try{l=rO(o,"utf8")}catch{continue}let c=lO(l);if(c===null){process.stderr.write(`[durable-memory-sync] warning: ${i} has no valid frontmatter, skipping
1849
- `);continue}if(e.durable_memory_mode==="db")try{t.upsertDurableMemory({project_id:e.id,type:c.type,name:c.name,description:c.description,body:c.body})}catch{}}}function lO(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||!aO.has(l)?null:{name:a,type:l,description:o?.[1]?.trim()??null,body:n}}var gs,aO,qe=T(()=>{"use strict";Ze();ln();Li();sg();cd();Xn();lg();cg();hs();gs="__paused__:";aO=new Set(["user","feedback","project","reference"])});import{spawnSync as wg}from"node:child_process";function cO(e,t){let r=e.stateId,n=e.displayName,s=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;let i=e.project.local_path,o=wg("git",["diff","--quiet"],{cwd:i}).status!==0,a=wg("git",["diff","--cached","--quiet"],{cwd:i}).status!==0;if(o||a){let l=t.fail_message??"repository has uncommitted changes";return e.dal.finishStep(s.id,null,l),X(e,r,n,Lc),{kind:"terminal",terminal:Y(e.workflow)}}return e.dal.finishStep(s.id,"clean","repo_clean"),X(e,r,n,"clean"),J(e.workflow,t.next)}var Eg,Tg=T(()=>{"use strict";qe();Eg={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=>cO(e,e.state)}});async function dO(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 dg(i.when,e))return e.dal.finishStep(s.id,"matched",i.when),X(e,r,n,"matched"),J(e.workflow,i.next);return e.dal.finishStep(s.id,"no_match","choice_no_match"),X(e,r,n,"no_match"),t.default_next!==void 0?J(e.workflow,t.default_next):{kind:"terminal",terminal:e.workflow.terminals.no_match?"no_match":Y(e.workflow)}}var bg,Sg=T(()=>{"use strict";qe();hs();bg={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=>dO(e,e.state)}});async function uO(e,t){let r=e.stateId,n=e.displayName,s=e.workflow.default_task_timeout_ms,i=t.researchers??[],o=pn(e,t.durable_memory_tags),a=new Array(i.length).fill(null);await Promise.all(i.map(async(m,p)=>{let _=`${n}:researcher_${m.alias}[${p}]`,g=await mn(e,_,m,`TOPIC: ${m.topic}`,[],!1,s,!1,o);g.text.length>0&&(a[p]=g.text)}));let l=a.map((m,p)=>m!==null?`# Research ${p+1}: ${i[p]?.topic??""}
1848
+ ORDER BY started_at DESC, id DESC LIMIT 1`,e.run_id,t);if(r.length===0)return!1;let n=r[0];return e.workflow.states[n.state_name]?.type==="Interactive"&&n.outcome==="done"}function pd(e,t){if(!mg(e))return!1;let r=bo(e,"durable-memory");function n(s){let i;try{i=pg(s,{withFileTypes:!0})}catch{return!1}for(let o of i){if(o.name===".git")continue;let a=bo(s,o.name);if(a!==r)if(o.isDirectory()){if(n(a))return!0}else try{if(_g(a).mtime>t)return!0}catch{}}return!1}return n(e)}function oO(e,t,r){let n=bo(e.local_path,"durable-memory");if(!mg(n))return;let s;try{s=pg(n)}catch{return}for(let i of s){if(!i.endsWith(".md")||i==="MEMORY.md")continue;let o=bo(n,i),a;try{a=_g(o).mtime}catch{continue}if(a<=r)continue;let l;try{l=rO(o,"utf8")}catch{continue}let c=lO(l);if(c===null){process.stderr.write(`[durable-memory-sync] warning: ${i} has no valid frontmatter, skipping
1849
+ `);continue}if(e.durable_memory_mode==="db")try{t.upsertDurableMemory({project_id:e.id,type:c.type,name:c.name,description:c.description,body:c.body})}catch{}}}function lO(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||!aO.has(l)?null:{name:a,type:l,description:o?.[1]?.trim()??null,body:n}}var gs,aO,qe=T(()=>{"use strict";Ze();ln();Oi();sg();cd();Xn();lg();cg();hs();gs="__paused__:";aO=new Set(["user","feedback","project","reference"])});import{spawnSync as wg}from"node:child_process";function cO(e,t){let r=e.stateId,n=e.displayName,s=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;let i=e.project.local_path,o=wg("git",["diff","--quiet"],{cwd:i}).status!==0,a=wg("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,Lc),{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 Eg,Tg=T(()=>{"use strict";qe();Eg={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=>cO(e,e.state)}});async function dO(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 dg(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 bg,Sg=T(()=>{"use strict";qe();hs();bg={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=>dO(e,e.state)}});async function uO(e,t){let r=e.stateId,n=e.displayName,s=e.workflow.default_task_timeout_ms,i=t.researchers??[],o=pn(e,t.durable_memory_tags),a=new Array(i.length).fill(null);await Promise.all(i.map(async(m,p)=>{let _=`${n}:researcher_${m.alias}[${p}]`,g=await mn(e,_,m,`TOPIC: ${m.topic}`,[],!1,s,!1,o);g.text.length>0&&(a[p]=g.text)}));let l=a.map((m,p)=>m!==null?`# Research ${p+1}: ${i[p]?.topic??""}
1850
1850
  ${m}`:null).filter(m=>m!==null).join(`
1851
1851
 
1852
- `),c=`${n}:consolidator`,d=await mn(e,c,t.consolidator,l.length>0?l:null,["ok","error"],!0,s,!1,o),u=q(e,{run_id:e.run_id,state_name:n});if(e.steps_executed+=1,d.outcome===null||d.outcome==="error"){e.dal.finishStep(u.id,d.outcome,d.status_detail),d.outcome==="error"&&X(e,r,n,"error");let m=t.outcomes.error;return m!==void 0?J(e.workflow,m):{kind:"terminal",terminal:Y(e.workflow)}}let f=t.research_artifact_prefix??n;if(e.dal.insertStepArtifact({step_id:u.id,kind:`${f}_consolidated`,content:d.text}),e.dal.finishStep(u.id,"ok","consolidated"),X(e,r,n,"ok"),t.write_back_durable_memory){let m=e.membersByAlias.get(t.consolidator.alias);m!==void 0&&await Gt(e,n,m,t.write_back_durable_memory)}return J(e.workflow,t.outcomes.ok)}var vg,kg=T(()=>{"use strict";qe();vg={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=>uO(e,e.state)}});async function fO(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=hO(o);if(a===null){e.dal.finishStep(s.id,null,`foreach_invalid_items:${t.items_from}`);let f=t.outcomes.any_failed;return f!==void 0?J(e.workflow,f):{kind:"terminal",terminal:Y(e.workflow)}}let l={routed:null},c=t.mode==="parallel"?await pO(e,t,s.id,a,l):await mO(e,t,s.id,a,l);if(l.routed!==null)return e.dal.finishStep(s.id,null,`foreach_propagated:${l.routed.kind}`),l.routed;let d=c.some(f=>f.outcome===null||f.outcome==="__failure__"),u=d?"any_failed":"all_ok";if(e.dal.finishStep(s.id,u,JSON.stringify({iterations:c,count:a.length})),X(e,r,n,u),d){let f=t.outcomes.any_failed;return f!==void 0?J(e.workflow,f):{kind:"terminal",terminal:Y(e.workflow)}}return J(e.workflow,t.outcomes.all_ok)}finally{e.progress_step_id=i}}async function mO(e,t,r,n,s){let i=[];for(let o=0;o<n.length;o+=1){let a=await Ng(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 pO(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 Ng(e,t,r,n[l],l,s)}});return await Promise.all(a),i}async function Ng(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__":_O(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 _O(e){return e==null?null:typeof e=="string"?e:JSON.stringify(e)}function hO(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 Ig,xg=T(()=>{"use strict";qe();hs();Ig={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=>fO(e,e.state)}});async function gO(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 Gt(e,n,i,t.write_back_durable_memory),J(e.workflow,t.outcomes.done);if(a.status==="waiting_agent"){if(a.turn_count>=t.termination.max_turns){e.dal.finishStep(a.step_id,"timeout",`max_turns=${t.termination.max_turns}`),X(e,r,n,"timeout");let m=t.outcomes.timeout;return m!==void 0?J(e.workflow,m):{kind:"terminal",terminal:Y(e.workflow)}}let f=a.last_operator_input??"";try{let m=await ys({context:e,stateId:n,member:i,prompt:f,stepId:a.step_id,timeoutMs:s,writesToProjectPath:!1});if(m.kind==="g3_violation"||m.kind==="g2_violation"){let p=m.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${m.violationKind}`:"policy_violation:writes_to_project_path";return e.dal.insertSessionEvent({run_id:e.run_id,step_id:a.step_id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(m.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:n,kind:m.violationKind,command_summary:m.summary,message:`State ${n} ran a classified side-effect command (${m.violationKind}) without a preceding approved gate`}:{violation:"writes_to_project_path",state_id:n,message:`State ${n} wrote to project.local_path without writes_to_project_path: true`})}),e.dal.finishStep(a.step_id,null,p),{kind:"terminal",terminal:Y(e.workflow)}}return e.dal.setInteractiveAgentOutput(a.id,m.text,"waiting_operator"),t.termination.agent_signal!==void 0&&m.text.includes(t.termination.agent_signal)?(t.artifact_name!==void 0&&e.dal.insertStepArtifact({step_id:a.step_id,kind:t.artifact_name,content:m.text}),e.dal.finishStep(a.step_id,"done","agent_signal"),X(e,r,n,"done"),t.write_back_durable_memory&&await Gt(e,n,i,t.write_back_durable_memory),J(e.workflow,t.outcomes.done)):(Ag({context:e,state:t,stateId:r,displayName:n,stepId:a.step_id,agentText:m.text}),{kind:"paused"})}catch(m){let p=m instanceof ve?`chat_${m.kind}`:"chat_other";return e.dal.finishStep(a.step_id,null,p),{kind:"terminal",terminal:Y(e.workflow)}}}return{kind:"paused"}}let l=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;let c=e.dal.insertInteractiveSession({run_id:e.run_id,step_id:l.id,state_name:r,status:"waiting_agent"}),d=await Ke(t.agent.initial_prompt_template,e,n),u=o?`${o}
1852
+ `),c=`${n}:consolidator`,d=await mn(e,c,t.consolidator,l.length>0?l:null,["ok","error"],!0,s,!1,o),u=q(e,{run_id:e.run_id,state_name:n});if(e.steps_executed+=1,d.outcome===null||d.outcome==="error"){e.dal.finishStep(u.id,d.outcome,d.status_detail),d.outcome==="error"&&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 Gt(e,n,m,t.write_back_durable_memory)}return X(e.workflow,t.outcomes.ok)}var vg,kg=T(()=>{"use strict";qe();vg={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=>uO(e,e.state)}});async function fO(e,t){let r=e.stateId,n=e.displayName,s=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;let i=e.progress_step_id;e.progress_step_id=s.id;try{let o=await Eo(t.items_from,e),a=hO(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 pO(e,t,s.id,a,l):await mO(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 mO(e,t,r,n,s){let i=[];for(let o=0;o<n.length;o+=1){let a=await Ng(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 pO(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 Ng(e,t,r,n[l],l,s)}});return await Promise.all(a),i}async function Ng(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__":_O(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 _O(e){return e==null?null:typeof e=="string"?e:JSON.stringify(e)}function hO(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 Ig,xg=T(()=>{"use strict";qe();hs();Ig={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=>fO(e,e.state)}});async function gO(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 Gt(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 ys({context:e,stateId:n,member:i,prompt:f,stepId:a.step_id,timeoutMs:s,writesToProjectPath:!1});if(m.kind==="g3_violation"||m.kind==="g2_violation"){let p=m.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${m.violationKind}`:"policy_violation:writes_to_project_path";return e.dal.insertSessionEvent({run_id:e.run_id,step_id:a.step_id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(m.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:n,kind:m.violationKind,command_summary:m.summary,message:`State ${n} ran a classified side-effect command (${m.violationKind}) without a preceding approved gate`}:{violation:"writes_to_project_path",state_id:n,message:`State ${n} wrote to project.local_path without writes_to_project_path: true`})}),e.dal.finishStep(a.step_id,null,p),{kind:"terminal",terminal:Y(e.workflow)}}return e.dal.setInteractiveAgentOutput(a.id,m.text,"waiting_operator"),t.termination.agent_signal!==void 0&&m.text.includes(t.termination.agent_signal)?(t.artifact_name!==void 0&&e.dal.insertStepArtifact({step_id:a.step_id,kind:t.artifact_name,content:m.text}),e.dal.finishStep(a.step_id,"done","agent_signal"),G(e,r,n,"done"),t.write_back_durable_memory&&await Gt(e,n,i,t.write_back_durable_memory),X(e.workflow,t.outcomes.done)):(Ag({context:e,state:t,stateId:r,displayName:n,stepId:a.step_id,agentText:m.text}),{kind:"paused"})}catch(m){let p=m instanceof ve?`chat_${m.kind}`:"chat_other";return e.dal.finishStep(a.step_id,null,p),{kind:"terminal",terminal:Y(e.workflow)}}}return{kind:"paused"}}let l=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;let c=e.dal.insertInteractiveSession({run_id:e.run_id,step_id:l.id,state_name:r,status:"waiting_agent"}),d=await Ke(t.agent.initial_prompt_template,e,n),u=o?`${o}
1853
1853
 
1854
- ${d}`:d;try{let f=await ys({context:e,stateId:n,member:i,prompt:u,stepId:l.id,timeoutMs:s,writesToProjectPath:!1});if(f.kind==="g3_violation"||f.kind==="g2_violation"){let m=f.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${f.violationKind}`:"policy_violation:writes_to_project_path";return e.dal.insertSessionEvent({run_id:e.run_id,step_id:l.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(f.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:n,kind:f.violationKind,command_summary:f.summary,message:`State ${n} ran a classified side-effect command (${f.violationKind}) without a preceding approved gate`}:{violation:"writes_to_project_path",state_id:n,message:`State ${n} wrote to project.local_path without writes_to_project_path: true`})}),e.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:Y(e.workflow)}}return e.dal.setInteractiveAgentOutput(c.id,f.text,"waiting_operator"),t.artifact_name!==void 0&&e.dal.insertStepArtifact({step_id:l.id,kind:t.artifact_name,content:f.text}),t.termination.agent_signal!==void 0&&f.text.includes(t.termination.agent_signal)?(e.dal.finishStep(l.id,"done","agent_signal"),e.outcomes[n]="done",t.write_back_durable_memory&&await Gt(e,n,i,t.write_back_durable_memory),J(e.workflow,t.outcomes.done)):(Ag({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 Ag(e){let{context:t,state:r,stateId:n,displayName:s,stepId:i,agentText:o}=e,a=O();t.dal.setRunPausedState(t.run_id,`${gs}${n}`,a),t.dal.raiseAttention({kind:"interactive_waiting_operator",severity:"attn",project_id:t.project.id,run_id:t.run_id,requires_user:!0,payload:JSON.stringify(yO({context:t,stateId:s,state:r,stepId:i,agentText:o,pausedAt:a}))}),t.dal.pauseJob(t.job.id)}function yO(e){let{context:t,stateId:r,state:n,stepId:s,agentText:i,pausedAt:o}=e,a=t.dal.getRun(t.run_id),l=wO(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:EO(i,3),paused_at:o,created_run_inputs:fr(t.job.payload)}}function wO(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 EO(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 Rg,Lg=T(()=>{"use strict";Li();qe();Rg={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=>gO(e,e.state)}});async function TO(e,t){let r=e.stateId,n=e.displayName,s=gg(e,t.over);if(s===null){let u=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1,e.dal.finishStep(u.id,null,`loop_invalid_items:${t.over}`);let f=t.outcomes.error;return f!==void 0?J(e.workflow,f):{kind:"terminal",terminal:Y(e.workflow)}}let i=e.workflow.states[t.body];if(i===void 0){let u=q(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.finishStep(u.id,null,`loop_body_not_found:${t.body}`),{kind:"terminal",terminal:Y(e.workflow)}}let o=s.slice(0,t.max_items),a=[],l=!1;for(let u=0;u<o.length;u+=1){let f=o[u],m=`${n}[${u}]`,p=e.iteration;e.iteration={item:f,index:u};let _;try{_=await e.dispatchState(m,i,{iteration:{item:f,index:u}})}finally{e.iteration=p}if(_.kind==="paused"||_.kind==="escalate")return _;let g=bO(e.outcomes[m]);if(a.push({index:u,value:f,outcome:g}),g===null&&t.stop_on_error){l=!0;break}}let c=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;let d=l?"error":"ok";if(e.dal.finishStep(c.id,d,JSON.stringify({iterations:a,count:o.length})),X(e,r,n,d),l){let u=t.outcomes.error;return u!==void 0?J(e.workflow,u):{kind:"terminal",terminal:Y(e.workflow)}}return J(e.workflow,t.outcomes.ok)}function bO(e){return e==null?null:typeof e=="string"?e:JSON.stringify(e)}var Og,$g=T(()=>{"use strict";qe();Og={description:{displayName:"Loop",name:"loop",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],builtin:!0},execute:async e=>TO(e,e.state)}});import{createHash as SO}from"node:crypto";import{existsSync as vO,mkdirSync as kO,readFileSync as IO,writeFileSync as NO}from"node:fs";import{dirname as xO,isAbsolute as Mg,normalize as AO,resolve as ws}from"node:path";import{Document as RO,ExternalHyperlink as LO,HeadingLevel as _n,LevelFormat as OO,Packer as $O,Paragraph as mt,Table as CO,TableCell as MO,TableRow as jO,TextRun as pt,WidthType as DO}from"docx";import{marked as PO}from"marked";async function FO(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 UO(e,t,n),o=await WO(e,t),a=await BO(e,t.title),l=await GO(i,a??e.workflow.name);if(l.length===0)throw new Error("rendered DOCX buffer was empty");return kO(xO(o),{recursive:!0}),NO(o,l),e.dal.insertStepArtifact({step_id:s.id,kind:"render_docx",path:o,sha:SO("sha256").update(l).digest("hex"),provider_call_mode:"library"}),e.dal.finishStep(s.id,"done",`wrote:${o}`),X(e,r,n,{output_path:o,path:o,bytes:l.length}),J(e.workflow,t.outcomes?.done??"@terminal:done")}catch(i){let o=i instanceof Error?i.message:String(i);return e.dal.finishStep(s.id,"error",o),X(e,r,n,{error:o}),J(e.workflow,t.outcomes?.error??"@terminal:error")}}async function UO(e,t,r){if(typeof t.markdown_source!="string"||t.markdown_source.trim().length===0)throw new Error("markdown_source is required");let n=(await Ke(t.markdown_source,e,r)).trim(),i=(n.length===0?XO(e,t.markdown_source):null)??n;if(i.length===0)throw new Error("markdown_source resolved empty");let o=HO(e.project.local_path,i);if(o!==null){if(!vO(o))throw new Error(`markdown_source file not found: ${o}`);return bo(IO(o,"utf8"))}return bo(i)}async function WO(e,t){if(typeof t.output_path!="string"||t.output_path.trim().length===0)throw new Error("output_path is required");let r=(await Ke(t.output_path,e,e.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=qO(e.project.local_path,r);if(!n.endsWith(".docx"))throw new Error(`output_path must end with .docx: ${n}`);return n}async function BO(e,t){if(typeof t!="string"||t.trim().length===0)return null;let r=(await Ke(t,e,e.stateId)).trim();return r.length===0?null:r}function qO(e,t){let r=ws(e);return AO(Mg(t)?ws(t):ws(r,t))}function HO(e,t){return JO(t)?Mg(t)?ws(t):ws(e,t):null}function JO(e){return e.endsWith(".md")||e.endsWith(".markdown")||e.startsWith("./")||e.startsWith("../")||e.startsWith("/")}function XO(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
1854
+ ${d}`:d;try{let f=await ys({context:e,stateId:n,member:i,prompt:u,stepId:l.id,timeoutMs:s,writesToProjectPath:!1});if(f.kind==="g3_violation"||f.kind==="g2_violation"){let m=f.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${f.violationKind}`:"policy_violation:writes_to_project_path";return e.dal.insertSessionEvent({run_id:e.run_id,step_id:l.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(f.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:n,kind:f.violationKind,command_summary:f.summary,message:`State ${n} ran a classified side-effect command (${f.violationKind}) without a preceding approved gate`}:{violation:"writes_to_project_path",state_id:n,message:`State ${n} wrote to project.local_path without writes_to_project_path: true`})}),e.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:Y(e.workflow)}}return e.dal.setInteractiveAgentOutput(c.id,f.text,"waiting_operator"),t.artifact_name!==void 0&&e.dal.insertStepArtifact({step_id:l.id,kind:t.artifact_name,content:f.text}),t.termination.agent_signal!==void 0&&f.text.includes(t.termination.agent_signal)?(e.dal.finishStep(l.id,"done","agent_signal"),e.outcomes[n]="done",t.write_back_durable_memory&&await Gt(e,n,i,t.write_back_durable_memory),X(e.workflow,t.outcomes.done)):(Ag({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 Ag(e){let{context:t,state:r,stateId:n,displayName:s,stepId:i,agentText:o}=e,a=O();t.dal.setRunPausedState(t.run_id,`${gs}${n}`,a),t.dal.raiseAttention({kind:"interactive_waiting_operator",severity:"attn",project_id:t.project.id,run_id:t.run_id,requires_user:!0,payload:JSON.stringify(yO({context:t,stateId:s,state:r,stepId:i,agentText:o,pausedAt:a}))}),t.dal.pauseJob(t.job.id)}function yO(e){let{context:t,stateId:r,state:n,stepId:s,agentText:i,pausedAt:o}=e,a=t.dal.getRun(t.run_id),l=wO(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:EO(i,3),paused_at:o,created_run_inputs:fr(t.job.payload)}}function wO(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 EO(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 Rg,Lg=T(()=>{"use strict";Oi();qe();Rg={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=>gO(e,e.state)}});async function TO(e,t){let r=e.stateId,n=e.displayName,s=gg(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 _;try{_=await e.dispatchState(m,i,{iteration:{item:f,index:u}})}finally{e.iteration=p}if(_.kind==="paused"||_.kind==="escalate")return _;let g=bO(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 bO(e){return e==null?null:typeof e=="string"?e:JSON.stringify(e)}var Og,$g=T(()=>{"use strict";qe();Og={description:{displayName:"Loop",name:"loop",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],builtin:!0},execute:async e=>TO(e,e.state)}});import{createHash as SO}from"node:crypto";import{existsSync as vO,mkdirSync as kO,readFileSync as IO,writeFileSync as NO}from"node:fs";import{dirname as xO,isAbsolute as Mg,normalize as AO,resolve as ws}from"node:path";import{Document as RO,ExternalHyperlink as LO,HeadingLevel as _n,LevelFormat as OO,Packer as $O,Paragraph as mt,Table as CO,TableCell as MO,TableRow as jO,TextRun as pt,WidthType as DO}from"docx";import{marked as PO}from"marked";async function FO(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 UO(e,t,n),o=await WO(e,t),a=await BO(e,t.title),l=await GO(i,a??e.workflow.name);if(l.length===0)throw new Error("rendered DOCX buffer was empty");return kO(xO(o),{recursive:!0}),NO(o,l),e.dal.insertStepArtifact({step_id:s.id,kind:"render_docx",path:o,sha:SO("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 UO(e,t,r){if(typeof t.markdown_source!="string"||t.markdown_source.trim().length===0)throw new Error("markdown_source is required");let n=(await Ke(t.markdown_source,e,r)).trim(),i=(n.length===0?XO(e,t.markdown_source):null)??n;if(i.length===0)throw new Error("markdown_source resolved empty");let o=HO(e.project.local_path,i);if(o!==null){if(!vO(o))throw new Error(`markdown_source file not found: ${o}`);return So(IO(o,"utf8"))}return So(i)}async function WO(e,t){if(typeof t.output_path!="string"||t.output_path.trim().length===0)throw new Error("output_path is required");let r=(await Ke(t.output_path,e,e.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=qO(e.project.local_path,r);if(!n.endsWith(".docx"))throw new Error(`output_path must end with .docx: ${n}`);return n}async function BO(e,t){if(typeof t!="string"||t.trim().length===0)return null;let r=(await Ke(t,e,e.stateId)).trim();return r.length===0?null:r}function qO(e,t){let r=ws(e);return AO(Mg(t)?ws(t):ws(r,t))}function HO(e,t){return JO(t)?Mg(t)?ws(t):ws(e,t):null}function JO(e){return e.endsWith(".md")||e.endsWith(".markdown")||e.startsWith("./")||e.startsWith("../")||e.startsWith("/")}function XO(e,t){let n=/context\.outcomes\.([A-Za-z0-9_-]+)\.output/.exec(t)?.[1];if(n===void 0)return null;let s=Object.entries(e.transcripts).filter(([o])=>o.startsWith(`${n}:coder[`)).sort(([o],[a])=>a.localeCompare(o))[0]?.[1];if(s!==void 0)return So(s);let i=e.dal.query(`SELECT sa.content
1855
1855
  FROM step_artifact sa
1856
1856
  JOIN step s ON s.id = sa.step_id
1857
1857
  WHERE s.run_id = ?
1858
1858
  AND s.state_name LIKE ?
1859
1859
  AND sa.content IS NOT NULL
1860
1860
  ORDER BY sa.id DESC
1861
- 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 GO(e,t){let r=Dg(PO.lexer(e,{gfm:!0})),n=new RO({title:t,numbering:{config:[{reference:"ordered-list",levels:[{level:0,format:OO.DECIMAL,text:"%1."}]}]},sections:[{children:r.length===0?[new mt("")]:r}]});return $O.toBuffer(n)}function Dg(e){let t=[];for(let r of e)switch(r.type){case"space":break;case"heading":t.push(new mt({heading:e$(r.depth),children:pr(mr(r))}));break;case"paragraph":t.push(new mt({children:pr(mr(r))}));break;case"text":t.push(new mt({children:mr(r).length===0?[new pt(r.text)]:pr(mr(r))}));break;case"blockquote":t.push(...Dg(mr(r)).map(n=>n instanceof mt?n:new mt({children:[new pt(r.text)]})));break;case"list":zO(r)&&t.push(...VO(r));break;case"table":ZO(r)&&t.push(KO(r));break;case"code":QO(r)&&t.push(...YO(r));break;case"hr":t.push(new mt(""));break;case"html":r.text.trim().length>0&&t.push(new mt({children:[new pt(r.text)]}));break;default:break}return t}function pr(e,t){let r=[];for(let n of e)switch(n.type){case"text":case"escape":r.push(new pt({text:n.text,..._d(t)}));break;case"strong":r.push(...pr(mr(n),{...t,bold:!0}));break;case"em":r.push(...pr(mr(n),{...t,italics:!0}));break;case"codespan":r.push(new pt({text:n.text,..._d({...t,code:!0})}));break;case"link":r.push(new LO({link:n.href,children:pr(mr(n),{...t})}));break;case"br":r.push(new pt({text:"",break:1}));break;case"image":r.push(new pt({text:`[image: ${n.text}]`,italics:!0}));break;case"del":r.push(new pt({text:n.text,strike:!0}));break;default:r.push(new pt({text:n.raw,..._d(t)}));break}return r.length===0?[new pt("")]:r}function _d(e){return{...e?.bold===!0?{bold:!0}:{},...e?.italics===!0?{italics:!0}:{},...e?.code===!0?{font:"Courier New"}:{}}}function VO(e){return e.items.map(t=>new mt({children:pr(t.tokens.length===1&&t.tokens[0]?.type==="text"?[{...t.tokens[0],text:Cg(t)+t.tokens[0].text}]:[{type:"text",raw:t.text,text:Cg(t)+t.text}]),...e.ordered?{numbering:{reference:"ordered-list",level:0}}:{bullet:{level:0}}}))}function Cg(e){return e.task?`[${e.checked?"x":" "}] `:""}function KO(e){let t=[e.header,...e.rows].map(r=>new jO({children:r.map(n=>new MO({children:[new mt({children:pr(n.tokens,n.header?{bold:!0}:void 0)})]}))}));return new CO({width:{size:100,type:DO.PERCENTAGE},rows:t})}function YO(e){return e.text.split(`
1862
- `).map(r=>new mt({children:[new pt({text:r.length===0?" ":r,font:"Courier New"})]}))}function mr(e){let t=e.tokens;return Array.isArray(t)?t:[]}function zO(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 QO(e){return e.type==="code"&&typeof e.text=="string"}function e$(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 jg,Pg=T(()=>{"use strict";qe();jg={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=>FO(e,e.state)}});import{createHash as t$}from"node:crypto";import{existsSync as r$,mkdirSync as n$,readFileSync as Fg,statSync as s$}from"node:fs";import{dirname as i$,isAbsolute as Ug,normalize as o$,resolve as Es}from"node:path";import{marked as a$}from"marked";import l$ from"write-excel-file/node";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;try{let i=await d$(e,t),o=u$(t.input_format),a=await f$(e,t),l=await m$(e,t.title),c=o==="markdown"?b$(i):g$(i);await S$({sheets:c.length===0?[{name:"Sheet1",headers:[],rows:[]}]:c,outputPath:a,title:l??e.workflow.name});let d=s$(a).size;if(d===0)throw new Error("rendered XLSX file was empty");let u=t$("sha256").update(Fg(a)).digest("hex");return e.dal.insertStepArtifact({step_id:s.id,kind:"render_xlsx",path:a,sha:u,provider_call_mode:"library"}),e.dal.finishStep(s.id,"done",`wrote:${a}`),X(e,r,n,{output_path:a,path:a,bytes:d}),J(e.workflow,t.outcomes?.done??"@terminal:done")}catch(i){let o=i instanceof Error?i.message:String(i);return e.dal.finishStep(s.id,"error",o),X(e,r,n,{error:o}),J(e.workflow,t.outcomes?.error??"@terminal:error")}}async function d$(e,t){if(typeof t.source!="string"||t.source.trim().length===0)return"";let r=(await Ke(t.source,e,e.stateId)).trim(),n=_$(e.project.local_path,r);if(n!==null){if(!r$(n))throw new Error(`source file not found: ${n}`);return Fg(n,"utf8")}return r}function u$(e){if(e==null||e==="")return"json";if(e==="json"||e==="markdown")return e;throw new Error(`unsupported input_format: ${String(e)}`)}async function f$(e,t){if(typeof t.output_path!="string"||t.output_path.trim().length===0)throw new Error("output_path is required");let r=(await Ke(t.output_path,e,e.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=p$(e.project.local_path,r);if(!n.endsWith(".xlsx"))throw new Error(`output_path must end with .xlsx: ${n}`);return n}async function m$(e,t){if(typeof t!="string"||t.trim().length===0)return null;let r=(await Ke(t,e,e.stateId)).trim();return r.length===0?null:r}function p$(e,t){let r=Es(e);return o$(Ug(t)?Es(t):Es(r,t))}function _$(e,t){return h$(t)?Ug(t)?Es(t):Es(e,t):null}function h$(e){return e.endsWith(".json")||e.endsWith(".md")||e.endsWith(".markdown")||e.startsWith("./")||e.startsWith("../")||e.startsWith("/")}function g$(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)=>y$(r,n))}function y$(e,t){if(!So(e))throw new Error(`sheets[${t}] must be an object`);let r=w$(e.headers,`sheets[${t}].headers`),n=E$(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:T$(e.styles)}}function w$(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 E$(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 T$(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 b$(e){let t=a$.lexer(e,{gfm:!0}),r=[],n=null;for(let s of t){if(R$(s)){n=s.text;continue}L$(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 S$(e){n$(i$(e.outputPath),{recursive:!0});let t=new Set,r=e.sheets.map(n=>({sheet:N$(n.name,t),data:v$(n),columns:I$(n)}));await l$(r).toFile(e.outputPath)}function v$(e){let t=[];if(e.headers.length>0){let r=A$(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(k$));return t.length===0?[[{}]]:t}function k$(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 I$(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 N$(e,t){let r=x$(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 x$(e){let t=e.replace(/[\[\]:*?/\\]/g," ").trim();return(t.length===0?"Sheet":t).slice(0,31)}function A$(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 R$(e){return e.type==="heading"&&typeof e.text=="string"}function L$(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 Wg,Bg=T(()=>{"use strict";qe();Wg={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=>c$(e,e.state)}});import{spawnSync as O$}from"node:child_process";async function C$(e,t){let r=e.stateId,n=e.displayName,s=e.workflow.default_task_timeout_ms;for(let f of t.pre_checks??[])if(O$("sh",["-c",f.command],{cwd:e.project.local_path}).status!==0){let p=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1,e.dal.finishStep(p.id,"fail_pre_check",`pre_check_failed:${f.description??f.command}`),X(e,r,n,"fail_pre_check");let _=t.outcomes.fail_pre_check;return _!==void 0?J(e.workflow,_):{kind:"terminal",terminal:Y(e.workflow)}}let i=pn(e,t.durable_memory_tags),o=t.reviewers??[],a=null,l=o.length===0&&t.outcomes_from_stance!==void 0,c=l?Object.keys(t.outcomes_from_stance):[];for(let f=0;f<t.max_loops;f+=1){let m=`${n}:coder[${f}]`,p=await mn(e,m,t.coder,a!==null?`PRIOR REVIEW FEEDBACK:
1863
- ${a}`:null,c,l,s,t.writes_to_project_path===!0,i);if(l){let g=og(p.text);if(g!==null){let h=q(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.finishStep(h.id,null,`escalation_vocab:${g.token}`),{kind:"escalate",token:g.token,reason:g.reason.length>0?`${g.token}: ${g.reason}`:g.token}}}if(p.outcome===null){let g=q(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.finishStep(g.id,null,p.status_detail),{kind:"escalate",token:"",reason:`coder_no_outcome:${p.status_detail}`}}if(o.length===0){if(t.outcomes_from_stance!==void 0){let S=Object.keys(t.outcomes_from_stance),y=_s(p.text,S);if(y.outcome===null){let I=q(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.finishStep(I.id,null,`unhandled_stance:${y.reason}`),{kind:"escalate",token:"",reason:`no_stance:${y.reason}`}}let w=q(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.finishStep(w.id,y.outcome,"outcomes_from_stance"),X(e,r,n,y.outcome),J(e.workflow,t.outcomes_from_stance[y.outcome])}let g=_s(p.text,$$);if(g.outcome!==null){let S=q(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.finishStep(S.id,g.outcome,"default_failure_stance"),X(e,r,n,g.outcome),{kind:"escalate",token:g.outcome,reason:`failure_stance:${g.outcome}`}}let h=q(e,{run_id:e.run_id,state_name:n});if(e.steps_executed+=1,e.dal.finishStep(h.id,"approve","no_reviewers"),X(e,r,n,"approve"),t.write_back_durable_memory){let S=e.membersByAlias.get(t.coder.alias);S!==void 0&&await Gt(e,n,S,t.write_back_durable_memory)}return J(e.workflow,t.outcomes.approve)}let _=await Promise.all(o.map(g=>mn(e,`${n}:reviewer_${g.alias}[${f}]`,g,`CODER OUTPUT:
1864
- ${p.text}`,["approve","request_changes"],!0,s,t.writes_to_project_path===!0)));if(_.every(g=>g.outcome==="approve")){let g=q(e,{run_id:e.run_id,state_name:n});if(e.steps_executed+=1,e.dal.finishStep(g.id,"approve",`loop=${f}`),X(e,r,n,"approve"),t.write_back_durable_memory){let h=e.membersByAlias.get(t.coder.alias);h!==void 0&&await Gt(e,n,h,t.write_back_durable_memory)}return J(e.workflow,t.outcomes.approve)}if(a=_.filter(g=>g.outcome==="request_changes").map(g=>g.text).join(`
1861
+ LIMIT 1`,e.run_id,`${n}:coder[%`);return i[0]?.content===void 0?null:So(i[0].content)}function So(e){return e.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}async function GO(e,t){let r=Dg(PO.lexer(e,{gfm:!0})),n=new RO({title:t,numbering:{config:[{reference:"ordered-list",levels:[{level:0,format:OO.DECIMAL,text:"%1."}]}]},sections:[{children:r.length===0?[new mt("")]:r}]});return $O.toBuffer(n)}function Dg(e){let t=[];for(let r of e)switch(r.type){case"space":break;case"heading":t.push(new mt({heading:e$(r.depth),children:pr(mr(r))}));break;case"paragraph":t.push(new mt({children:pr(mr(r))}));break;case"text":t.push(new mt({children:mr(r).length===0?[new pt(r.text)]:pr(mr(r))}));break;case"blockquote":t.push(...Dg(mr(r)).map(n=>n instanceof mt?n:new mt({children:[new pt(r.text)]})));break;case"list":zO(r)&&t.push(...VO(r));break;case"table":ZO(r)&&t.push(KO(r));break;case"code":QO(r)&&t.push(...YO(r));break;case"hr":t.push(new mt(""));break;case"html":r.text.trim().length>0&&t.push(new mt({children:[new pt(r.text)]}));break;default:break}return t}function pr(e,t){let r=[];for(let n of e)switch(n.type){case"text":case"escape":r.push(new pt({text:n.text,..._d(t)}));break;case"strong":r.push(...pr(mr(n),{...t,bold:!0}));break;case"em":r.push(...pr(mr(n),{...t,italics:!0}));break;case"codespan":r.push(new pt({text:n.text,..._d({...t,code:!0})}));break;case"link":r.push(new LO({link:n.href,children:pr(mr(n),{...t})}));break;case"br":r.push(new pt({text:"",break:1}));break;case"image":r.push(new pt({text:`[image: ${n.text}]`,italics:!0}));break;case"del":r.push(new pt({text:n.text,strike:!0}));break;default:r.push(new pt({text:n.raw,..._d(t)}));break}return r.length===0?[new pt("")]:r}function _d(e){return{...e?.bold===!0?{bold:!0}:{},...e?.italics===!0?{italics:!0}:{},...e?.code===!0?{font:"Courier New"}:{}}}function VO(e){return e.items.map(t=>new mt({children:pr(t.tokens.length===1&&t.tokens[0]?.type==="text"?[{...t.tokens[0],text:Cg(t)+t.tokens[0].text}]:[{type:"text",raw:t.text,text:Cg(t)+t.text}]),...e.ordered?{numbering:{reference:"ordered-list",level:0}}:{bullet:{level:0}}}))}function Cg(e){return e.task?`[${e.checked?"x":" "}] `:""}function KO(e){let t=[e.header,...e.rows].map(r=>new jO({children:r.map(n=>new MO({children:[new mt({children:pr(n.tokens,n.header?{bold:!0}:void 0)})]}))}));return new CO({width:{size:100,type:DO.PERCENTAGE},rows:t})}function YO(e){return e.text.split(`
1862
+ `).map(r=>new mt({children:[new pt({text:r.length===0?" ":r,font:"Courier New"})]}))}function mr(e){let t=e.tokens;return Array.isArray(t)?t:[]}function zO(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 QO(e){return e.type==="code"&&typeof e.text=="string"}function e$(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 jg,Pg=T(()=>{"use strict";qe();jg={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=>FO(e,e.state)}});import{createHash as t$}from"node:crypto";import{existsSync as r$,mkdirSync as n$,readFileSync as Fg,statSync as s$}from"node:fs";import{dirname as i$,isAbsolute as Ug,normalize as o$,resolve as Es}from"node:path";import{marked as a$}from"marked";import l$ from"write-excel-file/node";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;try{let i=await d$(e,t),o=u$(t.input_format),a=await f$(e,t),l=await m$(e,t.title),c=o==="markdown"?b$(i):g$(i);await S$({sheets:c.length===0?[{name:"Sheet1",headers:[],rows:[]}]:c,outputPath:a,title:l??e.workflow.name});let d=s$(a).size;if(d===0)throw new Error("rendered XLSX file was empty");let u=t$("sha256").update(Fg(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 d$(e,t){if(typeof t.source!="string"||t.source.trim().length===0)return"";let r=(await Ke(t.source,e,e.stateId)).trim(),n=_$(e.project.local_path,r);if(n!==null){if(!r$(n))throw new Error(`source file not found: ${n}`);return Fg(n,"utf8")}return r}function u$(e){if(e==null||e==="")return"json";if(e==="json"||e==="markdown")return e;throw new Error(`unsupported input_format: ${String(e)}`)}async function f$(e,t){if(typeof t.output_path!="string"||t.output_path.trim().length===0)throw new Error("output_path is required");let r=(await Ke(t.output_path,e,e.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=p$(e.project.local_path,r);if(!n.endsWith(".xlsx"))throw new Error(`output_path must end with .xlsx: ${n}`);return n}async function m$(e,t){if(typeof t!="string"||t.trim().length===0)return null;let r=(await Ke(t,e,e.stateId)).trim();return r.length===0?null:r}function p$(e,t){let r=Es(e);return o$(Ug(t)?Es(t):Es(r,t))}function _$(e,t){return h$(t)?Ug(t)?Es(t):Es(e,t):null}function h$(e){return e.endsWith(".json")||e.endsWith(".md")||e.endsWith(".markdown")||e.startsWith("./")||e.startsWith("../")||e.startsWith("/")}function g$(e){if(e.trim().length===0)return[];let t;try{t=JSON.parse(e)}catch(r){let n=r instanceof Error?r.message:String(r);throw new Error(`invalid JSON source: ${n}`)}if(!vo(t)||!Array.isArray(t.sheets))throw new Error("JSON source must be an object with sheets[]");return t.sheets.map((r,n)=>y$(r,n))}function y$(e,t){if(!vo(e))throw new Error(`sheets[${t}] must be an object`);let r=w$(e.headers,`sheets[${t}].headers`),n=E$(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:T$(e.styles)}}function w$(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 E$(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 T$(e){if(!vo(e)||!vo(e.headers))return;let t={};return e.headers.bold===!0&&(t.bold=!0),typeof e.headers.fill=="string"&&(t.fill=e.headers.fill),Object.keys(t).length===0?void 0:t}function b$(e){let t=a$.lexer(e,{gfm:!0}),r=[],n=null;for(let s of t){if(R$(s)){n=s.text;continue}L$(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 S$(e){n$(i$(e.outputPath),{recursive:!0});let t=new Set,r=e.sheets.map(n=>({sheet:N$(n.name,t),data:v$(n),columns:I$(n)}));await l$(r).toFile(e.outputPath)}function v$(e){let t=[];if(e.headers.length>0){let r=A$(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(k$));return t.length===0?[[{}]]:t}function k$(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 I$(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 N$(e,t){let r=x$(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 x$(e){let t=e.replace(/[\[\]:*?/\\]/g," ").trim();return(t.length===0?"Sheet":t).slice(0,31)}function A$(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 R$(e){return e.type==="heading"&&typeof e.text=="string"}function L$(e){let t=e;return e.type==="table"&&Array.isArray(t.header)&&Array.isArray(t.rows)}function vo(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var Wg,Bg=T(()=>{"use strict";qe();Wg={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=>c$(e,e.state)}});import{spawnSync as O$}from"node:child_process";async function C$(e,t){let r=e.stateId,n=e.displayName,s=e.workflow.default_task_timeout_ms;for(let f of t.pre_checks??[])if(O$("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 _=t.outcomes.fail_pre_check;return _!==void 0?X(e.workflow,_):{kind:"terminal",terminal:Y(e.workflow)}}let i=pn(e,t.durable_memory_tags),o=t.reviewers??[],a=null,l=o.length===0&&t.outcomes_from_stance!==void 0,c=l?Object.keys(t.outcomes_from_stance):[];for(let f=0;f<t.max_loops;f+=1){let m=`${n}:coder[${f}]`,p=await mn(e,m,t.coder,a!==null?`PRIOR REVIEW FEEDBACK:
1863
+ ${a}`:null,c,l,s,t.writes_to_project_path===!0,i);if(l){let g=og(p.text);if(g!==null){let h=q(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.finishStep(h.id,null,`escalation_vocab:${g.token}`),{kind:"escalate",token:g.token,reason:g.reason.length>0?`${g.token}: ${g.reason}`:g.token}}}if(p.outcome===null){let g=q(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.finishStep(g.id,null,p.status_detail),{kind:"escalate",token:"",reason:`coder_no_outcome:${p.status_detail}`}}if(o.length===0){if(t.outcomes_from_stance!==void 0){let S=Object.keys(t.outcomes_from_stance),y=_s(p.text,S);if(y.outcome===null){let I=q(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.finishStep(I.id,null,`unhandled_stance:${y.reason}`),{kind:"escalate",token:"",reason:`no_stance:${y.reason}`}}let w=q(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.finishStep(w.id,y.outcome,"outcomes_from_stance"),G(e,r,n,y.outcome),X(e.workflow,t.outcomes_from_stance[y.outcome])}let g=_s(p.text,$$);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 h=q(e,{run_id:e.run_id,state_name:n});if(e.steps_executed+=1,e.dal.finishStep(h.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 Gt(e,n,S,t.write_back_durable_memory)}return X(e.workflow,t.outcomes.approve)}let _=await Promise.all(o.map(g=>mn(e,`${n}:reviewer_${g.alias}[${f}]`,g,`CODER OUTPUT:
1864
+ ${p.text}`,["approve","request_changes"],!0,s,t.writes_to_project_path===!0)));if(_.every(g=>g.outcome==="approve")){let g=q(e,{run_id:e.run_id,state_name:n});if(e.steps_executed+=1,e.dal.finishStep(g.id,"approve",`loop=${f}`),G(e,r,n,"approve"),t.write_back_durable_memory){let h=e.membersByAlias.get(t.coder.alias);h!==void 0&&await Gt(e,n,h,t.write_back_durable_memory)}return X(e.workflow,t.outcomes.approve)}if(a=_.filter(g=>g.outcome==="request_changes").map(g=>g.text).join(`
1865
1865
 
1866
- `),t.loop_feedback_artifact!==void 0){let g=q(e,{run_id:e.run_id,state_name:`${n}:feedback[${f}]`});e.steps_executed+=1,e.dal.finishStep(g.id,"feedback_captured",`loop=${f}`),e.dal.insertStepArtifact({step_id:g.id,kind:t.loop_feedback_artifact,content:a})}}let d=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1,e.dal.finishStep(d.id,"max_loops_exceeded",`loops=${t.max_loops}`),X(e,r,n,"max_loops_exceeded");let u=t.outcomes.max_loops_exceeded;return u!==void 0?J(e.workflow,u):{kind:"terminal",terminal:Y(e.workflow)}}var $$,qg,Hg=T(()=>{"use strict";cd();qe();$$=["blocked","failed","aborted"],qg={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=>C$(e,e.state)}});import{spawnSync as M$}from"node:child_process";async function j$(e,t){let r=e.stateId,n=e.displayName,s=await Ke(t.command,e,n),i=md(e,n),o=yg(s);if(o.matched&&!i){let _=q(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.insertSessionEvent({run_id:e.run_id,step_id:_.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"side_effect_without_pause",state_id:n,kind:o.kind,command:s,message:`ShellStep ${n} runs a classified side-effect command (${o.kind}) without a preceding approved gate`})}),e.dal.finishStep(_.id,null,`policy_violation:side_effect_without_pause:${o.kind}`),{kind:"terminal",terminal:Y(e.workflow)}}let a=new Date(Date.now()-1),l=typeof t.timeout_ms=="number"&&t.timeout_ms>0,c=M$("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&&pd(e.project.local_path,a))return e.dal.insertSessionEvent({run_id:e.run_id,step_id:d.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"writes_to_project_path",state_id:n,message:`ShellStep ${n} wrote to project.local_path without writes_to_project_path: true`})}),e.dal.finishStep(d.id,null,"policy_violation:writes_to_project_path"),{kind:"terminal",terminal:Y(e.workflow)};if(t.capture_output_to!==void 0){let _=c.stdout??"";e.dal.insertStepArtifact({step_id:d.id,kind:t.capture_output_to,content:_})}let m=String(c.status),p=t.outcomes_from_exit[m]??t.outcomes_from_exit.default;return p===void 0?(e.dal.insertStepArtifact({step_id:d.id,kind:"unhandled_exit",content:m}),e.dal.finishStep(d.id,null,`shell_step_unhandled_exit:${m}`),{kind:"terminal",terminal:"shell_step_unhandled_exit"}):(e.dal.finishStep(d.id,m,`exit=${c.status}`),X(e,r,n,m),J(e.workflow,p))}var Jg,Xg=T(()=>{"use strict";qe();Jg={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=>j$(e,e.state)}});async function D$(e,t){let r=e.stateId,n=e.displayName,s=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;let i=e.dal.getWorkflowByName(t.workflow_name);if(i===null)return e.dal.finishStep(s.id,null,`subflow_missing_workflow:${t.workflow_name}`),{kind:"terminal",terminal:Y(e.workflow)};let o=ct(i.definition),a=await P$(e,t),l=await e.runChildWorkflow(i,o,a);if(l.paused===!0)return e.dal.finishStep(s.id,null,`subflow_paused:${l.run_id}`),{kind:"paused"};let c=l.terminal_state;if(c===null)return e.dal.finishStep(s.id,null,`subflow_no_terminal:${l.run_id}`),{kind:"terminal",terminal:Y(e.workflow)};X(e,r,n,F$(e,l.run_id,o.outputs??[])),e.dal.finishStep(s.id,c,`child_run=${l.run_id}`);let d=t.outcomes[c]??t.outcomes.default;return d===void 0?{kind:"terminal",terminal:Y(e.workflow)}:J(e.workflow,d)}async function P$(e,t){let r={};for(let[n,s]of Object.entries(t.inputs??{})){let i=await ug(s,e);r[n]=i===s?await wo(s,e):i}return r}function F$(e,t,r){let n={};for(let s of r)n[s.name]=U$(e,t,s);return n}function U$(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=W$(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 W$(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 Gg,Vg=T(()=>{"use strict";cs();qe();hs();Gg={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=>D$(e,e.state)}});function B$(e,t){let r=e.stateId,n=e.displayName,s=t.name??n,i=q(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.finishStep(i.id,s,t.kind??"neutral"),X(e,r,n,s),{kind:"terminal",terminal:s}}var Kg,Yg=T(()=>{"use strict";qe();Kg={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=>B$(e,e.state)}});async function q$(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=H$(e.cursor),a=i.filter(J$).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 H$(e){if(e===void 0)return 0;let t=Number(e);return Number.isFinite(t)?t:0}function J$(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 zg,Zg=T(()=>{"use strict";zg={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=>q$(e)}});async function X$(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 Qg,ey=T(()=>{"use strict";Qg={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=>X$(e)}});function ty(e){e.register(Eg),e.register(qg),e.register(vg),e.register(Rg),e.register(Og),e.register(jg),e.register(Wg),e.register(Jg),e.register(bg),e.register(Ig),e.register(Gg),e.register(Kg),e.register(Qg),e.register(zg)}var ry=T(()=>{"use strict";Tg();Sg();kg();xg();Lg();$g();Pg();Bg();Hg();Xg();Vg();Yg();Zg();ey()});function ny(){return vo===null&&(vo=new hd,ty(vo)),vo}var G$,hd,vo,sy=T(()=>{"use strict";ry();G$={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"},hd=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:G$[t];return r?this.types.get(r):void 0}list(){return Array.from(this.types.values())}},vo=null});async function ay(e){fy(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=K$(t.definition,e.workflow),s=e.job.run_id===null?null:e.dal.getRun(e.job.run_id),i=Ts(n)?n.entry_step_id:n.start_at,o=s?.terminal_state===null?s:e.dal.insertRun({job_id:e.job.id,workflow_id:t.id,team_id:e.team.id,current_state:i}),a=n.requires,l=Qh(a);if(l!==null)return e.dal.setRunTerminalState(o.id,"aborted"),e.dal.raiseAttention({kind:"missing_workflow_dependency",severity:"error",project_id:r.id,run_id:o.id,payload:JSON.stringify({run_id:o.id,workflow_name:n.name,kind:l.kind,tool:l.tool,install_hint:l.install_hint,last_error:l.message,detail:l.detail??null})}),{run_id:o.id,terminal_state:"aborted",steps_executed:0};let c=new Map(e.members.map(m=>[m.alias,m]));if(Ts(n)){let m=gd({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:fr(e.job.payload)??{},team_id:e.team.id}),p=await cy(n,m,o.current_state??n.entry_step_id);return oy(e.dal,r.id,o.id,n.name,p),p}let d=s!==null&&o===s?e.dal.listLatestStepOutcomesByState(o.id):{},u=gd({dal:e.dal,workflow:n,job:e.job,project:r,run:o,membersByAlias:c,outcomes:d,inputs:fr(e.job.payload)??{},team_id:e.team.id}),f=await ly(u,o.current_state??n.start_at);return oy(e.dal,r.id,o.id,n.name,f),f}function oy(e,t,r,n,s){if(s.paused===!0)return;let i=s.terminal_state;if(i===null)return;let o="unknown",a=!1;try{let d=e.getRun(r);if(d!==null){let u=e.getWorkflow(d.workflow_id);if(u!==null){let f=JSON.parse(u.definition),p=(f.terminals??{})[i];if(p!==void 0&&typeof p.kind=="string"&&(p.kind==="success"||p.kind==="failure"||p.kind==="neutral")&&(o=p.kind),o==="unknown"&&Array.isArray(f.steps)){for(let g of f.steps)if(g.type==="lmctl/terminal"&&g.parameters!==null&&typeof g.parameters=="object"){let h=g.parameters;if(h.name===i&&(h.kind==="success"||h.kind==="failure"||h.kind==="neutral")){o=h.kind;break}}}let _=f.errors;if(_!==null&&typeof _=="object"){let g=_;(g.on_unhandled_failure!==void 0||g.on_unhandled_failure_state!==void 0)&&(a=!0)}}}}catch{}if(o==="success"||o==="failure"&&a)return;let l=null;try{l=e.query("SELECT status_detail FROM step WHERE run_id = ? ORDER BY id DESC LIMIT 1",r)[0]?.status_detail??null}catch{l=null}let c=o==="failure"?"workflow_failed":"workflow_has_issues";e.raiseAttention({kind:c,severity:o==="failure"?"error":"warn",project_id:t,run_id:r,payload:JSON.stringify({run_id:r,workflow_name:n,terminal_state:i,terminal_kind:o,last_error:l})})}function gd(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 yd(t,r,n,s?.display_name??r)}finally{t.parent_step_id=i,t.iteration=o}},runChildWorkflow:async(r,n,s)=>{fy(n);let i=Ts(n)?n.entry_step_id:n.start_at,o=e.dal.insertRun({job_id:e.job.id,workflow_id:r.id,team_id:e.team_id,current_state:i,parent_run_id:t.run_id}),a=gd({dal:e.dal,workflow:Ts(n)?Io(n):n,job:e.job,project:e.project,run:o,membersByAlias:e.membersByAlias,outcomes:{},inputs:s,team_id:e.team_id});return Ts(n)?cy(n,a,o.current_state??n.entry_step_id):ly(a,o.current_state??n.start_at)}};return t}async function ly(e,t){let r=t;if(r.startsWith(gs))return{run_id:e.run_id,terminal_state:null,steps_executed:0,paused:!0};for(let s=0;s<1e3;s+=1){if(r.startsWith("@terminal:"))return Vt(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 Vt(e,l.terminal);r=l.state;continue}let o,a=uy(e,r);if(a!==null){let l=q(e,{run_id:e.run_id,state_name:r});if(e.steps_executed+=1,e.dal.finishStep(l.id,a,"escalation_resume"),X(e,r,r,a),a===Jn)return Vt(e,il);let c=i.outcomes?.[a];o=c!==void 0?J(e.workflow,c):tt(e,{id:r,name:r,type:i.type},a,`no declared edge for resumed outcome '${a}' from state '${r}'`)}else o=await yd(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 Vt(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"?Vt(e,n.terminal):Vt(e,Y(e.workflow))}async function cy(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=uy(t,a.id);if(l!==null){let m=q(t,{run_id:t.run_id,state_name:a.name});if(t.steps_executed+=1,t.dal.finishStep(m.id,l,"escalation_resume"),X(t,a.id,a.name,l),l===Jn)return Vt(t,il);let p=Object.keys(e.connections[a.id]??{}),_=e.connections[a.id]?.[l]?.[0]?.[0]?.step_id??e.connections[a.id]?.main?.[0]?.[0]?.step_id;if(_===void 0)return tt(t,{id:a.id,name:a.name,type:a.type},l,`no declared edge for resumed outcome '${l}' from step '${a.id}'`,{declared_outcomes:p}),Me(t);i=_;continue}let c=await V$(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 Vt(t,p.terminal);let _=s.get(p.state);if(_===void 0)return tt(t,{id:a.id,name:a.name,type:a.type},"",`internal:unknown v3 error handler step '${p.state}'`),Me(t);i=_.id;continue}finally{t.workflow=m}}if(Vr(u))return tt(t,{id:a.id,name:a.name,type:a.type},u,`generic escalation '${u}' from step '${a.id}'`,{declared_outcomes:d}),Me(t);let f=e.connections[a.id]?.[u]?.[0]?.[0]?.step_id??e.connections[a.id]?.main?.[0]?.[0]?.step_id;if(f===void 0)return tt(t,{id:a.id,name:a.name,type:a.type},u,`no declared edge for outcome '${u}' from step '${a.id}'`,{declared_outcomes:d}),Me(t);i=f}return t.dal.raiseAttention({kind:"engine_step_limit_exceeded",severity:"error",project_id:t.project.id,run_id:t.run_id,payload:JSON.stringify({run_id:t.run_id})}),Vt(t,"aborted")}async function V$(e,t,r){let n=dy(t,r),s=e.workflow;e.workflow=Io(t,r);try{return await yd(e,r.id,n,r.name)}finally{e.workflow=s}}function dy(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 yd(e,t,r,n){let s=ny().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(hg(e,t,r,n??t))}finally{e.emit_progress=i,e.progress_step_id=o}}function K$(e,t){try{let r=JSON.parse(e);if(z$(r)&&r.definition_schema_version===3)return It.parse(r)}catch{return t}return t}function Ts(e){return e.definition_schema_version===3}function 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]=dy(e,i))}return t?.type==="lmctl/terminal"&&typeof t.parameters.name=="string"&&(n[t.parameters.name]={kind:Y$(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 Y$(e){return e==="success"||e==="failure"||e==="neutral"?e:"neutral"}function z$(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 Vt(e,t){e.dal.setRunTerminalState(e.run_id,t);try{Kh(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 uy(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(!Q$(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&&eC(e,t,r.on_unhandled_failure),{kind:"terminal",terminal:t}))}function Q$(e,t){return e.definition_schema_version===2&&e.terminals[t]?.kind==="failure"}function eC(e,t,r){let n=tC(e),s=r.capture_evidence&&n!==null?rC(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 tC(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 rC(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 fy(e){if(!iy.includes(e.definition_schema_version))throw new Error(`unsupported definition_schema_version ${e.definition_schema_version}; supported versions: ${iy.join(", ")}`)}var iy,my=T(()=>{"use strict";cn();Yh();eg();qe();sy();Xn();iy=[1,2,3]});import{readFileSync as nC,readdirSync as sC}from"node:fs";import{basename as iC,join as oC,resolve as aC}from"node:path";function hy(e={}){let t=aC(e.workflowsDir??"workflows"),r=sC(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=>lC(oC(t,n)))}}function lC(e){let t=iC(e);try{let r=nC(e,"utf8"),n=ct(r);return wy(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:Ey(r)}}}function gy(e,t){try{let r=ct(t);return wy(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:Ey(r)}}}function yy(e){let t=[];t.push(`workflow verification - ${e.generated_at}`),t.push(`dir: ${e.workflows_dir}`),t.push(""),t.push(`${"status".padEnd(17)} ${"workflow".padEnd(36)} ${"first step".padEnd(52)} note`),t.push(`${"-".repeat(17)} ${"-".repeat(36)} ${"-".repeat(52)} ${"-".repeat(30)}`);for(let i of e.rows){let o=(i.workflow_name??i.file).slice(0,36).padEnd(36),a=`${i.first_step_id??"-"}${i.first_step_type===null?"":` (${i.first_step_type})`}`;t.push(`${i.status.padEnd(17)} ${o} ${a.slice(0,52).padEnd(52)} ${i.note}`)}let r=e.rows.filter(i=>i.status==="PASS").length,n=e.rows.filter(i=>i.status==="PASS_NEEDS_INPUTS").length,s=e.rows.filter(i=>i.status==="FAIL").length;return t.push(""),t.push(`summary: ${r} pass, ${n} pass_needs_inputs, ${s} fail`),`${t.join(`
1866
+ `),t.loop_feedback_artifact!==void 0){let g=q(e,{run_id:e.run_id,state_name:`${n}:feedback[${f}]`});e.steps_executed+=1,e.dal.finishStep(g.id,"feedback_captured",`loop=${f}`),e.dal.insertStepArtifact({step_id:g.id,kind:t.loop_feedback_artifact,content:a})}}let d=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1,e.dal.finishStep(d.id,"max_loops_exceeded",`loops=${t.max_loops}`),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 $$,qg,Hg=T(()=>{"use strict";cd();qe();$$=["blocked","failed","aborted"],qg={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=>C$(e,e.state)}});import{spawnSync as M$}from"node:child_process";async function j$(e,t){let r=e.stateId,n=e.displayName,s=await Ke(t.command,e,n),i=md(e,n),o=yg(s);if(o.matched&&!i){let _=q(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.insertSessionEvent({run_id:e.run_id,step_id:_.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"side_effect_without_pause",state_id:n,kind:o.kind,command:s,message:`ShellStep ${n} runs a classified side-effect command (${o.kind}) without a preceding approved gate`})}),e.dal.finishStep(_.id,null,`policy_violation:side_effect_without_pause:${o.kind}`),{kind:"terminal",terminal:Y(e.workflow)}}let a=new Date(Date.now()-1),l=typeof t.timeout_ms=="number"&&t.timeout_ms>0,c=M$("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&&pd(e.project.local_path,a))return e.dal.insertSessionEvent({run_id:e.run_id,step_id:d.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"writes_to_project_path",state_id:n,message:`ShellStep ${n} wrote to project.local_path without writes_to_project_path: true`})}),e.dal.finishStep(d.id,null,"policy_violation:writes_to_project_path"),{kind:"terminal",terminal:Y(e.workflow)};if(t.capture_output_to!==void 0){let _=c.stdout??"";e.dal.insertStepArtifact({step_id:d.id,kind:t.capture_output_to,content:_})}let m=String(c.status),p=t.outcomes_from_exit[m]??t.outcomes_from_exit.default;return p===void 0?(e.dal.insertStepArtifact({step_id:d.id,kind:"unhandled_exit",content:m}),e.dal.finishStep(d.id,null,`shell_step_unhandled_exit:${m}`),{kind:"terminal",terminal:"shell_step_unhandled_exit"}):(e.dal.finishStep(d.id,m,`exit=${c.status}`),G(e,r,n,m),X(e.workflow,p))}var Jg,Xg=T(()=>{"use strict";qe();Jg={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=>j$(e,e.state)}});async function D$(e,t){let r=e.stateId,n=e.displayName,s=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;let i=e.dal.getWorkflowByName(t.workflow_name);if(i===null)return e.dal.finishStep(s.id,null,`subflow_missing_workflow:${t.workflow_name}`),{kind:"terminal",terminal:Y(e.workflow)};let o=ct(i.definition),a=await P$(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,F$(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 P$(e,t){let r={};for(let[n,s]of Object.entries(t.inputs??{})){let i=await ug(s,e);r[n]=i===s?await Eo(s,e):i}return r}function F$(e,t,r){let n={};for(let s of r)n[s.name]=U$(e,t,s);return n}function U$(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=W$(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 W$(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 Gg,Vg=T(()=>{"use strict";cs();qe();hs();Gg={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=>D$(e,e.state)}});function B$(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 Kg,Yg=T(()=>{"use strict";qe();Kg={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=>B$(e,e.state)}});async function q$(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=H$(e.cursor),a=i.filter(J$).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 H$(e){if(e===void 0)return 0;let t=Number(e);return Number.isFinite(t)?t:0}function J$(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 zg,Zg=T(()=>{"use strict";zg={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=>q$(e)}});async function X$(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 Qg,ey=T(()=>{"use strict";Qg={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=>X$(e)}});function ty(e){e.register(Eg),e.register(qg),e.register(vg),e.register(Rg),e.register(Og),e.register(jg),e.register(Wg),e.register(Jg),e.register(bg),e.register(Ig),e.register(Gg),e.register(Kg),e.register(Qg),e.register(zg)}var ry=T(()=>{"use strict";Tg();Sg();kg();xg();Lg();$g();Pg();Bg();Hg();Xg();Vg();Yg();Zg();ey()});function ny(){return ko===null&&(ko=new hd,ty(ko)),ko}var G$,hd,ko,sy=T(()=>{"use strict";ry();G$={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"},hd=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:G$[t];return r?this.types.get(r):void 0}list(){return Array.from(this.types.values())}},ko=null});async function ay(e){fy(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=K$(t.definition,e.workflow),s=e.job.run_id===null?null:e.dal.getRun(e.job.run_id),i=Ts(n)?n.entry_step_id:n.start_at,o=s?.terminal_state===null?s:e.dal.insertRun({job_id:e.job.id,workflow_id:t.id,team_id:e.team.id,current_state:i}),a=n.requires,l=Qh(a);if(l!==null)return e.dal.setRunTerminalState(o.id,"aborted"),e.dal.raiseAttention({kind:"missing_workflow_dependency",severity:"error",project_id:r.id,run_id:o.id,payload:JSON.stringify({run_id:o.id,workflow_name:n.name,kind:l.kind,tool:l.tool,install_hint:l.install_hint,last_error:l.message,detail:l.detail??null})}),{run_id:o.id,terminal_state:"aborted",steps_executed:0};let c=new Map(e.members.map(m=>[m.alias,m]));if(Ts(n)){let m=gd({dal:e.dal,workflow:No(n),job:e.job,project:r,run:o,membersByAlias:c,outcomes:s!==null&&o===s?e.dal.listLatestStepOutcomesByState(o.id):{},inputs:fr(e.job.payload)??{},team_id:e.team.id}),p=await cy(n,m,o.current_state??n.entry_step_id);return oy(e.dal,r.id,o.id,n.name,p),p}let d=s!==null&&o===s?e.dal.listLatestStepOutcomesByState(o.id):{},u=gd({dal:e.dal,workflow:n,job:e.job,project:r,run:o,membersByAlias:c,outcomes:d,inputs:fr(e.job.payload)??{},team_id:e.team.id}),f=await ly(u,o.current_state??n.start_at);return oy(e.dal,r.id,o.id,n.name,f),f}function oy(e,t,r,n,s){if(s.paused===!0)return;let i=s.terminal_state;if(i===null)return;let o="unknown",a=!1;try{let d=e.getRun(r);if(d!==null){let u=e.getWorkflow(d.workflow_id);if(u!==null){let f=JSON.parse(u.definition),p=(f.terminals??{})[i];if(p!==void 0&&typeof p.kind=="string"&&(p.kind==="success"||p.kind==="failure"||p.kind==="neutral")&&(o=p.kind),o==="unknown"&&Array.isArray(f.steps)){for(let g of f.steps)if(g.type==="lmctl/terminal"&&g.parameters!==null&&typeof g.parameters=="object"){let h=g.parameters;if(h.name===i&&(h.kind==="success"||h.kind==="failure"||h.kind==="neutral")){o=h.kind;break}}}let _=f.errors;if(_!==null&&typeof _=="object"){let g=_;(g.on_unhandled_failure!==void 0||g.on_unhandled_failure_state!==void 0)&&(a=!0)}}}}catch{}if(o==="success"||o==="failure"&&a)return;let l=null;try{l=e.query("SELECT status_detail FROM step WHERE run_id = ? ORDER BY id DESC LIMIT 1",r)[0]?.status_detail??null}catch{l=null}let c=o==="failure"?"workflow_failed":"workflow_has_issues";e.raiseAttention({kind:c,severity:o==="failure"?"error":"warn",project_id:t,run_id:r,payload:JSON.stringify({run_id:r,workflow_name:n,terminal_state:i,terminal_kind:o,last_error:l})})}function gd(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 yd(t,r,n,s?.display_name??r)}finally{t.parent_step_id=i,t.iteration=o}},runChildWorkflow:async(r,n,s)=>{fy(n);let i=Ts(n)?n.entry_step_id:n.start_at,o=e.dal.insertRun({job_id:e.job.id,workflow_id:r.id,team_id:e.team_id,current_state:i,parent_run_id:t.run_id}),a=gd({dal:e.dal,workflow:Ts(n)?No(n):n,job:e.job,project:e.project,run:o,membersByAlias:e.membersByAlias,outcomes:{},inputs:s,team_id:e.team_id});return Ts(n)?cy(n,a,o.current_state??n.entry_step_id):ly(a,o.current_state??n.start_at)}};return t}async function ly(e,t){let r=t;if(r.startsWith(gs))return{run_id:e.run_id,terminal_state:null,steps_executed:0,paused:!0};for(let s=0;s<1e3;s+=1){if(r.startsWith("@terminal:"))return Vt(e,r.slice(10));e.dal.setRunCurrentState(e.run_id,r),e.last_state_id=r;let i=e.workflow.states[r];if(i===void 0){let l=Io(e,Y(e.workflow));if(l.kind==="paused")return Me(e);if(l.kind==="escalate")return tt(e,{id:r,name:r,type:"unknown"},l.token,l.reason),Me(e);if(l.kind==="terminal")return Vt(e,l.terminal);r=l.state;continue}let o,a=uy(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===Jn)return Vt(e,il);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 yd(e,r,i);if(o.kind==="paused")return Me(e);if(o.kind==="escalate")return tt(e,{id:r,name:r,type:i.type},o.token,o.reason),Me(e);if(o.kind==="terminal"){let l=Io(e,o.terminal);if(l.kind==="paused")return Me(e);if(l.kind==="escalate")return tt(e,{id:r,name:r,type:i.type},l.token,l.reason),Me(e);if(l.kind==="terminal")return Vt(e,l.terminal);r=l.state;continue}r=o.state}e.dal.raiseAttention({kind:"engine_step_limit_exceeded",severity:"error",project_id:e.project.id,run_id:e.run_id,payload:JSON.stringify({run_id:e.run_id})});let n=Io(e,Y(e.workflow));return n.kind==="terminal"?Vt(e,n.terminal):Vt(e,Y(e.workflow))}async function cy(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=uy(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===Jn)return Vt(t,il);let p=Object.keys(e.connections[a.id]??{}),_=e.connections[a.id]?.[l]?.[0]?.[0]?.step_id??e.connections[a.id]?.main?.[0]?.[0]?.step_id;if(_===void 0)return tt(t,{id:a.id,name:a.name,type:a.type},l,`no declared edge for resumed outcome '${l}' from step '${a.id}'`,{declared_outcomes:p}),Me(t);i=_;continue}let c=await V$(t,e,a);if(c.kind==="paused")return Me(t);let d=Object.keys(e.connections[a.id]??{});if(c.kind==="escalate")return tt(t,{id:a.id,name:a.name,type:a.type},c.token,c.reason,{declared_outcomes:d}),Me(t);let u=c.kind==="terminal"?c.terminal:c.state;if(a.type==="lmctl/terminal"){let m=t.workflow;t.workflow=No(e,a);try{let p=Io(t,u);if(p.kind==="paused")return Me(t);if(p.kind==="escalate")return tt(t,{id:a.id,name:a.name,type:a.type},p.token,p.reason),Me(t);if(p.kind==="terminal")return Vt(t,p.terminal);let _=s.get(p.state);if(_===void 0)return tt(t,{id:a.id,name:a.name,type:a.type},"",`internal:unknown v3 error handler step '${p.state}'`),Me(t);i=_.id;continue}finally{t.workflow=m}}if(Vr(u))return tt(t,{id:a.id,name:a.name,type:a.type},u,`generic escalation '${u}' from step '${a.id}'`,{declared_outcomes:d}),Me(t);let f=e.connections[a.id]?.[u]?.[0]?.[0]?.step_id??e.connections[a.id]?.main?.[0]?.[0]?.step_id;if(f===void 0)return tt(t,{id:a.id,name:a.name,type:a.type},u,`no declared edge for outcome '${u}' from step '${a.id}'`,{declared_outcomes:d}),Me(t);i=f}return t.dal.raiseAttention({kind:"engine_step_limit_exceeded",severity:"error",project_id:t.project.id,run_id:t.run_id,payload:JSON.stringify({run_id:t.run_id})}),Vt(t,"aborted")}async function V$(e,t,r){let n=dy(t,r),s=e.workflow;e.workflow=No(t,r);try{return await yd(e,r.id,n,r.name)}finally{e.workflow=s}}function dy(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 yd(e,t,r,n){let s=ny().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(hg(e,t,r,n??t))}finally{e.emit_progress=i,e.progress_step_id=o}}function K$(e,t){try{let r=JSON.parse(e);if(z$(r)&&r.definition_schema_version===3)return It.parse(r)}catch{return t}return t}function Ts(e){return e.definition_schema_version===3}function No(e,t){let r=t===void 0?[]:Object.keys(e.connections[t.id]??{}),n=Object.fromEntries(r.map(i=>[i,{kind:i==="aborted"?"failure":"neutral"}])),s={};if(t?.type==="lmctl/loop"&&typeof t.parameters.body=="string"){let i=e.steps.find(o=>o.name===t.parameters.body);i!==void 0&&(s[t.parameters.body]=dy(e,i))}return t?.type==="lmctl/terminal"&&typeof t.parameters.name=="string"&&(n[t.parameters.name]={kind:Y$(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 Y$(e){return e==="success"||e==="failure"||e==="neutral"?e:"neutral"}function z$(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 Vt(e,t){e.dal.setRunTerminalState(e.run_id,t);try{Kh(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 uy(e,t){let n=e.dal.getRun(e.run_id)?.pending_escalation_decision??null;if(n===null)return null;let s;try{let a=JSON.parse(n);if(a===null||typeof a!="object"||Array.isArray(a))return null;s=a}catch{return null}let i=s[t];if(typeof i!="string")return null;delete s[t];let o=Object.keys(s).length>0?JSON.stringify(s):null;return e.dal.setRunPendingEscalationDecision(e.run_id,o),i}function Io(e,t){if(!Q$(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&&eC(e,t,r.on_unhandled_failure),{kind:"terminal",terminal:t}))}function Q$(e,t){return e.definition_schema_version===2&&e.terminals[t]?.kind==="failure"}function eC(e,t,r){let n=tC(e),s=r.capture_evidence&&n!==null?rC(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 tC(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 rC(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 fy(e){if(!iy.includes(e.definition_schema_version))throw new Error(`unsupported definition_schema_version ${e.definition_schema_version}; supported versions: ${iy.join(", ")}`)}var iy,my=T(()=>{"use strict";cn();Yh();eg();qe();sy();Xn();iy=[1,2,3]});import{readFileSync as nC,readdirSync as sC}from"node:fs";import{basename as iC,join as oC,resolve as aC}from"node:path";function hy(e={}){let t=aC(e.workflowsDir??"workflows"),r=sC(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=>lC(oC(t,n)))}}function lC(e){let t=iC(e);try{let r=nC(e,"utf8"),n=ct(r);return wy(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:Ey(r)}}}function gy(e,t){try{let r=ct(t);return wy(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:Ey(r)}}}function yy(e){let t=[];t.push(`workflow verification - ${e.generated_at}`),t.push(`dir: ${e.workflows_dir}`),t.push(""),t.push(`${"status".padEnd(17)} ${"workflow".padEnd(36)} ${"first step".padEnd(52)} note`),t.push(`${"-".repeat(17)} ${"-".repeat(36)} ${"-".repeat(52)} ${"-".repeat(30)}`);for(let i of e.rows){let o=(i.workflow_name??i.file).slice(0,36).padEnd(36),a=`${i.first_step_id??"-"}${i.first_step_type===null?"":` (${i.first_step_type})`}`;t.push(`${i.status.padEnd(17)} ${o} ${a.slice(0,52).padEnd(52)} ${i.note}`)}let r=e.rows.filter(i=>i.status==="PASS").length,n=e.rows.filter(i=>i.status==="PASS_NEEDS_INPUTS").length,s=e.rows.filter(i=>i.status==="FAIL").length;return t.push(""),t.push(`summary: ${r} pass, ${n} pass_needs_inputs, ${s} fail`),`${t.join(`
1867
1867
  `)}
1868
- `}function wy(e,t){let r=dC(t),n=uC(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=cC(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 cC(e){return(e??[]).filter(t=>t.required===!0&&t.default===void 0).map(t=>t.name)}function dC(e){return wd(e)?e.entry_step_id:e.start_at}function uC(e){return wd(e)?e.steps.find(t=>t.id===e.entry_step_id)?.type??null:e.states[e.start_at]?.type??null}function wd(e){return e.definition_schema_version===3}function Ey(e){return e instanceof Xt?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 Ty(e){let t=new Set;if(wd(e))for(let r of e.steps){let n=r.members??{};py(n,t)}else for(let r of Object.values(e.states))py(r,t);return[...t].sort()}function py(e,t){let r=["coder","agent","consolidator"],n=["reviewers","researchers"];for(let s of r){let i=e[s],o=_y(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=_y(o);a!==null&&t.add(a)}}}function _y(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";cs()});function fC({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}=mC(e,r,o);if(a<20)continue;let c=o??"initial",d=`${bs}:${r.id}:${c}`;e.enqueueJob({project_id:r.id,source:xo,source_ref:bs,payload:JSON.stringify({kind:bs,project_id:r.id,completed_sessions:a,max_run_id:l,since_run_id:o}),dedupe_key:d})}}function mC(e,t,r){let n=e.query(`SELECT COUNT(*) AS cnt, MAX(r.id) AS max_id
1868
+ `}function wy(e,t){let r=dC(t),n=uC(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=cC(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 cC(e){return(e??[]).filter(t=>t.required===!0&&t.default===void 0).map(t=>t.name)}function dC(e){return wd(e)?e.entry_step_id:e.start_at}function uC(e){return wd(e)?e.steps.find(t=>t.id===e.entry_step_id)?.type??null:e.states[e.start_at]?.type??null}function wd(e){return e.definition_schema_version===3}function Ey(e){return e instanceof Xt?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 Ty(e){let t=new Set;if(wd(e))for(let r of e.steps){let n=r.members??{};py(n,t)}else for(let r of Object.values(e.states))py(r,t);return[...t].sort()}function py(e,t){let r=["coder","agent","consolidator"],n=["reviewers","researchers"];for(let s of r){let i=e[s],o=_y(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=_y(o);a!==null&&t.add(a)}}}function _y(e){if(e===null||typeof e!="object")return null;let t=e.alias;return typeof t=="string"&&t.length>0?t:null}var xo=T(()=>{"use strict";cs()});function fC({dal:e}){let t=e.listProjects();for(let r of t){let s=e.query("SELECT * FROM job WHERE project_id = ? AND source = ? ORDER BY id DESC LIMIT 1",r.id,Ao)[0]??null;if(s!==null&&(s.status==="queued"||s.status==="running"))continue;let o=(s?.payload?JSON.parse(s.payload):null)?.max_run_id??null,{count:a,maxRunId:l}=mC(e,r,o);if(a<20)continue;let c=o??"initial",d=`${bs}:${r.id}:${c}`;e.enqueueJob({project_id:r.id,source:Ao,source_ref:bs,payload:JSON.stringify({kind:bs,project_id:r.id,completed_sessions:a,max_run_id:l,since_run_id:o}),dedupe_key:d})}}function mC(e,t,r){let n=e.query(`SELECT COUNT(*) AS cnt, MAX(r.id) AS max_id
1869
1869
  FROM run r
1870
1870
  JOIN job j ON j.id = r.job_id
1871
1871
  WHERE j.project_id = ?
1872
1872
  AND r.terminal_state IS NOT NULL
1873
- ${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 by(e){for(let t of pC)try{t(e)}catch{}}var xo,bs,pC,Ed=T(()=>{"use strict";xo="memory_policy",bs="memory_consolidation_request";pC=[fC]});var xy={};ye(xy,{getOrInsertConsolidationWorkflow:()=>vy,runJobById:()=>wC,runOnce:()=>jr,startWorker:()=>EC});import{createHash as _C}from"node:crypto";import{readFileSync as hC}from"node:fs";import{pathToFileURL as gC}from"node:url";function vy(e,t="durable-memory-consolidation-v2"){let r=e.getWorkflowByName(t);if(r!==null)return r;try{Vh({swallow:!0});let n=go(t);if(n===null)return null;let s=hC(n,"utf8"),i=ct(s);return e.insertWorkflow({name:t,version:i.version,definition_schema_version:i.definition_schema_version,definition:s,source_uri:gC(n).href,source_sha256:_C("sha256").update(s).digest("hex")})}catch{return null}}async function jr(e){let t=Date.now(),r=null;try{return r=e.dal.claimNextJobWithConcurrency({worker_id:e.worker_id,lease_ms:e.lease_ms??Sy,evaluator:n=>Iy(e.dal,n)}),r===null?null:await ky(e.dal,r,t)}catch(n){if(r!==null)return _r(e.dal,r,"worker_run_failed",Mr(n),t);try{e.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:Ao(Mr(n))})})}catch{}return null}finally{e.max_concurrent}}async function wC(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??Sy,evaluator:s=>Iy(e.dal,s)});return n.claimed?(r=n.job,{claimed:!0,...await ky(e.dal,r,t)}):n}catch(n){if(r!==null)return{claimed:!0,..._r(e.dal,r,"worker_run_failed",Mr(n),t)};try{e.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:Ao(Mr(n)),job_id:e.job_id})})}catch{}return{claimed:!1,reason:"not_claimable",job_id:e.job_id}}finally{e.max_concurrent}}async function ky(e,t,r){let n=e.getProjectByJob(t.id);if(n===null)return _r(e,t,"worker_project_missing","project_not_found",r);let s=t.source===xo&&t.source_ref===bs,i=t.run_id===null?null:e.getRun(t.run_id),o;if(i!==null?o=e.getWorkflow(i.workflow_id):s?o=vy(e):o=Ny(e,t,n),o===null)return _r(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 _r(e,t,"worker_team_missing","team_not_found",r,n);let c;try{c=ct(o.definition)}catch(u){return _r(e,t,"worker_workflow_invalid",Mr(u),r,n)}let d=TC(c,l);if(d.length>0)return _r(e,t,"worker_team_missing_aliases",`missing_aliases:${d.join(",")}`,r,n,a);try{let u=await ay({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 _r(e,t,"worker_run_failed",Mr(u),r,n,a)}}function Iy(e,t){let r=e.getProjectByJob(t.id);if(r===null)return{concurrency_key:t.concurrency_key_resolved,concurrent_limit:1};let n=Ny(e,t,r);if(n===null)return{concurrency_key:t.concurrency_key_resolved,concurrent_limit:1};let s=null;try{s=ct(n.definition)}catch{s=null}return so({workflow:s,job:t,project:r})}function Ny(e,t,r){return t.workflow_id_override!==null?e.getWorkflow(t.workflow_id_override):e.getWorkflowByName(r.workflow_name)}async function EC(e){let t=!1,r=null,n=Promise.resolve(),s=async()=>{if(!t){try{let i;do i=await jr(e);while(!t&&i!==null)}catch(i){try{e.dal.raiseAttention({kind:"worker_loop_error",severity:"error",payload:JSON.stringify({error:Ao(Mr(i))})})}catch{}}t||(r=setTimeout(()=>{n=s()},e.poll_interval_ms??yC))}};return n=s(),{stop:async()=>{t=!0,r!==null&&clearTimeout(r),await n.catch(()=>{})}}}function _r(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 Mr(e){return e instanceof Error?e.message:String(e)}function Ao(e){return e.length>4096?e.slice(0,4096):e}function TC(e,t){let r=Ty(e);if(r.length===0)return[];let n=new Set(t.map(s=>s.alias));return r.filter(s=>!n.has(s))}var Sy,yC,Ro=T(()=>{"use strict";sd();my();cs();No();Fc();Ed();Sy=6e5,yC=5e3});import{existsSync as bC,readFileSync as SC}from"node:fs";import{marked as vC}from"marked";function Oy(e,t){e.get("/layman",r=>r.html(Re("Layman Home",kC(t.dal)))),e.get("/api/layman",r=>r.json(jy(t.dal))),e.get("/layman/start/:workflow",r=>{let n=Ly(r);return n===null?r.notFound():r.html(Re(`Start ${hn(n)}`,xC(t.dal,n)))}),e.post("/layman/start/:workflow",async r=>{let n=Ly(r);return n===null?r.notFound():n==="newspaper"?Ay(r,t.dal):AC(r,t.dal,n)}),e.get("/layman/run/:id",r=>{let n=Rr(t.dal,Lo(r,"id"));return n===null?r.notFound():r.html(Re(`Run ${n.id}`,OC(t.dal,n)))}),e.get("/api/layman/run/:id",r=>{let n=Rr(t.dal,Lo(r,"id"));return n===null?r.notFound():r.json(qC(t.dal,n))}),e.post("/layman/run/:id/respond",async r=>CC(r,t.dal)),e.get("/layman/newspaper",r=>r.html(Re("Newspaper Subscriptions",WC(t.dal)))),e.post("/layman/newspaper",r=>Ay(r,t.dal)),e.delete("/layman/newspaper/:id",r=>Ry(r,t.dal)),e.post("/layman/newspaper/:id/delete",r=>Ry(r,t.dal))}function kC(e){let t=jy(e);return`<section class="layman-home">
1873
+ ${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 by(e){for(let t of pC)try{t(e)}catch{}}var Ao,bs,pC,Ed=T(()=>{"use strict";Ao="memory_policy",bs="memory_consolidation_request";pC=[fC]});var xy={};we(xy,{getOrInsertConsolidationWorkflow:()=>vy,runJobById:()=>wC,runOnce:()=>jr,startWorker:()=>EC});import{createHash as _C}from"node:crypto";import{readFileSync as hC}from"node:fs";import{pathToFileURL as gC}from"node:url";function vy(e,t="durable-memory-consolidation-v2"){let r=e.getWorkflowByName(t);if(r!==null)return r;try{Vh({swallow:!0});let n=yo(t);if(n===null)return null;let s=hC(n,"utf8"),i=ct(s);return e.insertWorkflow({name:t,version:i.version,definition_schema_version:i.definition_schema_version,definition:s,source_uri:gC(n).href,source_sha256:_C("sha256").update(s).digest("hex")})}catch{return null}}async function jr(e){let t=Date.now(),r=null;try{return r=e.dal.claimNextJobWithConcurrency({worker_id:e.worker_id,lease_ms:e.lease_ms??Sy,evaluator:n=>Iy(e.dal,n)}),r===null?null:await ky(e.dal,r,t)}catch(n){if(r!==null)return _r(e.dal,r,"worker_run_failed",Mr(n),t);try{e.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:Ro(Mr(n))})})}catch{}return null}finally{e.max_concurrent}}async function wC(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??Sy,evaluator:s=>Iy(e.dal,s)});return n.claimed?(r=n.job,{claimed:!0,...await ky(e.dal,r,t)}):n}catch(n){if(r!==null)return{claimed:!0,..._r(e.dal,r,"worker_run_failed",Mr(n),t)};try{e.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:Ro(Mr(n)),job_id:e.job_id})})}catch{}return{claimed:!1,reason:"not_claimable",job_id:e.job_id}}finally{e.max_concurrent}}async function ky(e,t,r){let n=e.getProjectByJob(t.id);if(n===null)return _r(e,t,"worker_project_missing","project_not_found",r);let s=t.source===Ao&&t.source_ref===bs,i=t.run_id===null?null:e.getRun(t.run_id),o;if(i!==null?o=e.getWorkflow(i.workflow_id):s?o=vy(e):o=Ny(e,t,n),o===null)return _r(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 _r(e,t,"worker_team_missing","team_not_found",r,n);let c;try{c=ct(o.definition)}catch(u){return _r(e,t,"worker_workflow_invalid",Mr(u),r,n)}let d=TC(c,l);if(d.length>0)return _r(e,t,"worker_team_missing_aliases",`missing_aliases:${d.join(",")}`,r,n,a);try{let u=await ay({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 _r(e,t,"worker_run_failed",Mr(u),r,n,a)}}function Iy(e,t){let r=e.getProjectByJob(t.id);if(r===null)return{concurrency_key:t.concurrency_key_resolved,concurrent_limit:1};let n=Ny(e,t,r);if(n===null)return{concurrency_key:t.concurrency_key_resolved,concurrent_limit:1};let s=null;try{s=ct(n.definition)}catch{s=null}return io({workflow:s,job:t,project:r})}function Ny(e,t,r){return t.workflow_id_override!==null?e.getWorkflow(t.workflow_id_override):e.getWorkflowByName(r.workflow_name)}async function EC(e){let t=!1,r=null,n=Promise.resolve(),s=async()=>{if(!t){try{let i;do i=await jr(e);while(!t&&i!==null)}catch(i){try{e.dal.raiseAttention({kind:"worker_loop_error",severity:"error",payload:JSON.stringify({error:Ro(Mr(i))})})}catch{}}t||(r=setTimeout(()=>{n=s()},e.poll_interval_ms??yC))}};return n=s(),{stop:async()=>{t=!0,r!==null&&clearTimeout(r),await n.catch(()=>{})}}}function _r(e,t,r,n,s,i,o){let a=Ro(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 Mr(e){return e instanceof Error?e.message:String(e)}function Ro(e){return e.length>4096?e.slice(0,4096):e}function TC(e,t){let r=Ty(e);if(r.length===0)return[];let n=new Set(t.map(s=>s.alias));return r.filter(s=>!n.has(s))}var Sy,yC,Lo=T(()=>{"use strict";sd();my();cs();xo();Fc();Ed();Sy=6e5,yC=5e3});import{existsSync as bC,readFileSync as SC}from"node:fs";import{marked as vC}from"marked";function Oy(e,t){e.get("/layman",r=>r.html(Re("Layman Home",kC(t.dal)))),e.get("/api/layman",r=>r.json(jy(t.dal))),e.get("/layman/start/:workflow",r=>{let n=Ly(r);return n===null?r.notFound():r.html(Re(`Start ${hn(n)}`,xC(t.dal,n)))}),e.post("/layman/start/:workflow",async r=>{let n=Ly(r);return n===null?r.notFound():n==="newspaper"?Ay(r,t.dal):AC(r,t.dal,n)}),e.get("/layman/run/:id",r=>{let n=Rr(t.dal,Oo(r,"id"));return n===null?r.notFound():r.html(Re(`Run ${n.id}`,OC(t.dal,n)))}),e.get("/api/layman/run/:id",r=>{let n=Rr(t.dal,Oo(r,"id"));return n===null?r.notFound():r.json(qC(t.dal,n))}),e.post("/layman/run/:id/respond",async r=>CC(r,t.dal)),e.get("/layman/newspaper",r=>r.html(Re("Newspaper Subscriptions",WC(t.dal)))),e.post("/layman/newspaper",r=>Ay(r,t.dal)),e.delete("/layman/newspaper/:id",r=>Ry(r,t.dal)),e.post("/layman/newspaper/:id/delete",r=>Ry(r,t.dal))}function kC(e){let t=jy(e);return`<section class="layman-home">
1874
1874
  <h1>Welcome</h1>
1875
1875
  <p class="muted">Choose a workflow and answer a few plain-language prompts.</p>
1876
- <div class="grid">${Oo.map(IC).join("")}</div>
1876
+ <div class="grid">${$o.map(IC).join("")}</div>
1877
1877
  <h2>Recent Activity</h2>
1878
1878
  ${NC(t.recent_runs)}
1879
1879
  <section class="metric">
@@ -1914,7 +1914,7 @@ ${p.text}`,["approve","request_changes"],!0,s,t.writes_to_project_path===!0)));i
1914
1914
  <button type="submit" name="done" value="false">Send response</button>
1915
1915
  <button type="submit" name="done" value="true">Done with this stage</button>
1916
1916
  </form>
1917
- </section>`}async function CC(e,t){let r=Lo(e,"id"),n=await e.req.parseBody(),s=Number(Ye(n.step_id)),i=Ye(n.input),o=Ye(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?(MC(t,a.run.id),await jr({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 MC(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(!bd(s)||s.definition_schema_version!==3||!Array.isArray(s.steps))return;let i=s.steps.find(o=>bd(o)&&o.name===r.current_state&&typeof o.id=="string");bd(i)&&typeof i.id=="string"&&e.setRunCurrentState(r.id,i.id)}catch{return}}function jC(e,t,r){let n=GC(t.terminal_state);return`<section class="metric terminal-run">
1917
+ </section>`}async function CC(e,t){let r=Oo(e,"id"),n=await e.req.parseBody(),s=Number(Ye(n.step_id)),i=Ye(n.input),o=Ye(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?(MC(t,a.run.id),await jr({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 MC(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(!bd(s)||s.definition_schema_version!==3||!Array.isArray(s.steps))return;let i=s.steps.find(o=>bd(o)&&o.name===r.current_state&&typeof o.id=="string");bd(i)&&typeof i.id=="string"&&e.setRunCurrentState(r.id,i.id)}catch{return}}function jC(e,t,r){let n=GC(t.terminal_state);return`<section class="metric terminal-run">
1918
1918
  <h2>${n?"Complete":"Stopped"}</h2>
1919
1919
  <p>Status: <strong>${b(t.terminal_state)}</strong></p>
1920
1920
  ${n?DC(e,t,r):FC(t)}
@@ -1937,7 +1937,7 @@ ${p.text}`,["approve","request_changes"],!0,s,t.writes_to_project_path===!0)));i
1937
1937
  <label>Custom cron<input name="cron" placeholder="0 6 * * *"></label>
1938
1938
  <label>Output directory<input name="output_dir" value="digests"></label>
1939
1939
  <button type="submit">Create subscription</button>
1940
- </form>`}async function Ay(e,t){let r=await e.req.parseBody(),n=Fy(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=Ye(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:Ye(r.output_dir).trim()||"digests",schedule:JC(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 Ry(e,t){let r=Lo(e,"id");return t.removeProjectWorkflow(r)?e.redirect("/layman/newspaper?removed=1",302):e.notFound()}function BC(e){return me(["id","project","topics","status","action"],e.map(t=>{let r=zC(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 jy(e){let t=Dy(e);return{workflows:Oo,recent_runs:HC(e),newspaper_subscriptions:t.length}}function qC(e,t){let r=Py(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 HC(e){return e.query(`SELECT r.*, w.name AS workflow_name
1940
+ </form>`}async function Ay(e,t){let r=await e.req.parseBody(),n=Fy(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=Ye(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:Ye(r.output_dir).trim()||"digests",schedule:JC(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 Ry(e,t){let r=Oo(e,"id");return t.removeProjectWorkflow(r)?e.redirect("/layman/newspaper?removed=1",302):e.notFound()}function BC(e){return me(["id","project","topics","status","action"],e.map(t=>{let r=zC(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 jy(e){let t=Dy(e);return{workflows:$o,recent_runs:HC(e),newspaper_subscriptions:t.length}}function qC(e,t){let r=Py(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 HC(e){return e.query(`SELECT r.*, w.name AS workflow_name
1941
1941
  FROM run r
1942
1942
  JOIN workflow w ON w.id = r.workflow_id
1943
1943
  WHERE w.name IN (${Sd.map(()=>"?").join(",")})
@@ -1947,21 +1947,21 @@ ${p.text}`,["approve","request_changes"],!0,s,t.writes_to_project_path===!0)));i
1947
1947
  JOIN workflow w ON w.id = pw.workflow_id
1948
1948
  JOIN project p ON p.id = pw.project_id
1949
1949
  WHERE w.name = ?
1950
- ORDER BY pw.id DESC`,"newspaper")}function Py(e,t){for(let r of[...t.steps].reverse()){let n=e.getInteractiveSessionByStepId(r.id);if(n!==null)return n}return null}function Fy(e,t){let r=Number(Ye(t.project_id));return Number.isInteger(r)?e.getProject(r):null}function JC(e){let t=Ye(e.schedule)||"daily";return t==="weekly"?{preset:t,cron:"0 6 * * 1"}:t==="custom"?{preset:t,cron:Ye(e.cron).trim()||"0 6 * * *"}:{preset:"daily",cron:"0 6 * * *"}}function Ly(e){let t=e.req.param("workflow");return Sd.includes(t)?t:null}function hn(e){return Oo.find(t=>t.name===e)?.title??e}function XC(e){return e.split(/[_:-]/).filter(Boolean).map(t=>`${t[0]?.toUpperCase()??""}${t.slice(1)}`).join(" ")}function kd(e){return vC.parse(e,{async:!1})}function GC(e){return e==="done"||e==="pr_ready"||e==="merged"}function VC(e){return e.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}function KC(e,t){return e.split(`
1950
+ ORDER BY pw.id DESC`,"newspaper")}function Py(e,t){for(let r of[...t.steps].reverse()){let n=e.getInteractiveSessionByStepId(r.id);if(n!==null)return n}return null}function Fy(e,t){let r=Number(Ye(t.project_id));return Number.isInteger(r)?e.getProject(r):null}function JC(e){let t=Ye(e.schedule)||"daily";return t==="weekly"?{preset:t,cron:"0 6 * * 1"}:t==="custom"?{preset:t,cron:Ye(e.cron).trim()||"0 6 * * *"}:{preset:"daily",cron:"0 6 * * *"}}function Ly(e){let t=e.req.param("workflow");return Sd.includes(t)?t:null}function hn(e){return $o.find(t=>t.name===e)?.title??e}function XC(e){return e.split(/[_:-]/).filter(Boolean).map(t=>`${t[0]?.toUpperCase()??""}${t.slice(1)}`).join(" ")}function kd(e){return vC.parse(e,{async:!1})}function GC(e){return e==="done"||e==="pr_ready"||e==="merged"}function VC(e){return e.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}function KC(e,t){return e.split(`
1951
1951
  `).slice(0,t).join(`
1952
- `)}function YC(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function Ye(e){return typeof e=="string"?e:""}function zC(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 bd(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Lo(e,t){return Number(e.req.param(t))}var Oo,Sd,Uy=T(()=>{"use strict";Ro();Ht();Qc();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."}],Sd=Oo.map(e=>e.name)});function QC(e){return e.replace(/^\/+/,"")}function Wy(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=QC(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 Wy(e.userId)&&Wy(e.deviceId)?`${e.userId}/${e.deviceId}/`:`${ZC}/${e.identityId}/`}function tM(e){return String(Math.max(0,Math.floor(e))).padStart(eM,"0")}function Id(e,t,r){return`${e}${t}${tM(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,eM,Mo=T(()=>{"use strict";ZC="mailbox";eM=12});function Kt(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 xd(e,t){return!Number.isFinite(e)||e<=0?t:e}function Ad(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 Xy(e){return e.conversation_id===Jy&&sM(e.payload)}function sM(e){return typeof e=="object"&&e!==null&&e.kind==="heartbeat"}function iM(e){let t=typeof e.hb=="string"&&e.hb!==""?e.hb:Xy(e)?e.timestamp:void 0;if(t===void 0)return;let r=Date.parse(t);return Number.isFinite(r)?r:void 0}var By,qy,Hy,rM,Jy,nM,Nd,Dr,Po=T(()=>{"use strict";Mo();Do();By=3e3,qy=1e4,Hy=12e3,rM=1e3,Jy="__lmctl_heartbeat__",nM={kind:"heartbeat"},Nd={setTimeout:(e,t)=>setTimeout(e,t),clearTimeout:e=>clearTimeout(e)},Dr=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=xd(t.readIntervalMs??t.pollIntervalMs??By,By),this.heartbeatIdleMs=xd(t.heartbeatIdleMs??qy,qy),this.backoffReadIntervalMs=xd(t.backoffReadIntervalMs??t.pollIntervalMs??Hy,Hy)}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??Nd;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:rM,...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:Kt(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=Id(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??Nd;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=Id(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(Ad(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),Xy(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=iM(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??Nd;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(Jy,nM)}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 oM}from"@hono/node-server/conninfo";function Gy(e,t){let r=t.bucket??aM,n=t.remoteAddressOf??(i=>cM(i)),s=i=>{let o=n(i);return dM(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=Rd(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 Ad(l)?i.json({error:"not_found"},404):i.json({error:"internal",message:Ld(l)},500)}}),e.put("/local-mailbox/object",async i=>{let o=s(i);if(o!==null)return o;let a=Rd(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:Ld(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=Rd(a,{allowEmpty:!0});if(typeof l!="string")return i.json({error:"bad_request",message:l.error},400);let c=lM(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:Ld(u)},500)}})}function Rd(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 lM(e){if(e===void 0||e==="")return;let t=Number(e);return Number.isInteger(t)&&t>0?t:void 0}function cM(e){try{return oM(e).remote.address}catch{return}}function dM(e){return e===void 0||e===""?!1:!!(e==="127.0.0.1"||e==="::1"||e.startsWith("::ffff:127.")||e.startsWith("127."))}function Ld(e){return e instanceof Error?e.message:String(e)}var aM,Vy=T(()=>{"use strict";Po();aM="local"});function Ky(e,t){e.get("/mailbox/workspace",r=>mM(r,t)),e.get("/mailbox/projects",r=>pM(r,t)),e.get("/mailbox/projects/:id",r=>_M(r,t)),e.post("/mailbox/projects",r=>hM(r,t)),e.patch("/mailbox/projects/:id",r=>gM(r,t)),e.delete("/mailbox/projects/:id",r=>yM(r,t)),e.post("/mailbox/projects/:project_id/prompts",r=>wM(r,t)),e.get("/mailbox/prompts/:id",r=>EM(r,t))}function mM(e,t){t.dal.ensureWorkspace({id:wn,name:Od});let r=Yy(t.dal),n={id:wn,name:Od,created_at:fM,projects:r};return e.json({workspace:n})}function pM(e,t){return e.json({projects:Yy(t.dal)})}function _M(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=$d(t.dal,r);return s===null||s.deleted_at!==null?e.json({project:null},404):e.json({project:Wo(s)})}let n=Zy(t.dal,r);return n===null?e.json({project:null},404):e.json({project:zy(n)})}async function hM(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 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);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=$d(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 yM(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=$d(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 wM(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=Zy(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=`${uM}${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 TM({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 EM(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=bM(t.dal,r);return e.json({result:n})}function Yy(e){let t=e.listProjects().map(zy),r=e.listWebProjectsActive(wn).map(Wo);return[...t,...r].sort(OM)}function zy(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 $d(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 Zy(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 TM(e){let{enqueueManual:t}=await Promise.resolve().then(()=>(Wc(),hh));return{id:t(e.dal,{project_id:e.project_id,source_ref:e.source_ref,payload:e.payload}).id}}function bM(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=AM(e,i?.team_id??null),a=xM(s),l=RM(n,a,o.length>0),c=LM(r.created_at,s),d=i===null?{totalEstimatedMs:void 0,perStep:new Map}:SM(e,i.workflow_name),u=d.totalEstimatedMs,f=Qy(r.created_at),m=i?.workflow_name,p=d.perStep.size>0?d.perStep.size:void 0,_=s===null?[]:vM(e,s.id),g=kM(s,a,_,d.perStep,o),h=IM(_,d.perStep),S=NM(g,h,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 SM(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 vM(e,t){try{return e.listStepsForRun(t)}catch{return[]}}function kM(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=Qy(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 IM(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 NM(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 Qy(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 xM(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 AM(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 RM(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 LM(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 OM(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,uM,wn,Od,fM,ew=T(()=>{"use strict";Uo="project:",yn="web_project:",uM="prompt:",wn="default",Od="Default workspace",fM=new Date(0).toISOString()});import{Buffer as tw}from"node:buffer";function rw(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 nw(e){return MM[e]}function sw(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,CM,Bo,MM,Cd=T(()=>{"use strict";$M=1e4,CM=256*1024,Bo=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(t){this.opts=t,this.pushWindowMs=rw(t.pushWindowMs,process.env.LMCTL_TERMINAL_PUSH_WINDOW_MS,$M),this.pushByteCap=rw(t.pushByteCap,process.env.LMCTL_TERMINAL_PUSH_BYTE_CAP,CM),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+=tw.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=${tw.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
1952
+ `)}function YC(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function Ye(e){return typeof e=="string"?e:""}function zC(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 bd(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Oo(e,t){return Number(e.req.param(t))}var $o,Sd,Uy=T(()=>{"use strict";Lo();Ht();Qc();$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."}],Sd=$o.map(e=>e.name)});function QC(e){return e.replace(/^\/+/,"")}function Wy(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=QC(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 Wy(e.userId)&&Wy(e.deviceId)?`${e.userId}/${e.deviceId}/`:`${ZC}/${e.identityId}/`}function tM(e){return String(Math.max(0,Math.floor(e))).padStart(eM,"0")}function Id(e,t,r){return`${e}${t}${tM(r)}.json`}function Co(e,t){return`${e}${t}`}function Mo(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,eM,jo=T(()=>{"use strict";ZC="mailbox";eM=12});function Kt(e,t){let r=Math.floor(e),n="",s=r;for(let d=0;d<12;d++)n=Do[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=Do[a&15]+o,a=a>>4;let l=Do[8|Math.floor(t()*4)&3],c="";for(let d=0;d<15;d++)c+=Do[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 Do,Po=T(()=>{"use strict";Do="0123456789abcdef"});function xd(e,t){return!Number.isFinite(e)||e<=0?t:e}function Ad(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 Xy(e){return e.conversation_id===Jy&&sM(e.payload)}function sM(e){return typeof e=="object"&&e!==null&&e.kind==="heartbeat"}function iM(e){let t=typeof e.hb=="string"&&e.hb!==""?e.hb:Xy(e)?e.timestamp:void 0;if(t===void 0)return;let r=Date.parse(t);return Number.isFinite(r)?r:void 0}var By,qy,Hy,rM,Jy,nM,Nd,Dr,Fo=T(()=>{"use strict";jo();Po();By=3e3,qy=1e4,Hy=12e3,rM=1e3,Jy="__lmctl_heartbeat__",nM={kind:"heartbeat"},Nd={setTimeout:(e,t)=>setTimeout(e,t),clearTimeout:e=>clearTimeout(e)},Dr=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=xd(t.readIntervalMs??t.pollIntervalMs??By,By),this.heartbeatIdleMs=xd(t.heartbeatIdleMs??qy,qy),this.backoffReadIntervalMs=xd(t.backoffReadIntervalMs??t.pollIntervalMs??Hy,Hy)}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??Nd;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=Co(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:rM,...s!==void 0&&{ContinuationToken:s}}));this.opts.onS3Op?.("list");for(let o of i.Contents??[]){let a=Mo(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:Kt(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=Id(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??Nd;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=Id(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(Ad(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),Xy(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=iM(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??Nd;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(Jy,nM)}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 oM}from"@hono/node-server/conninfo";function Gy(e,t){let r=t.bucket??aM,n=t.remoteAddressOf??(i=>cM(i)),s=i=>{let o=n(i);return dM(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=Rd(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 Ad(l)?i.json({error:"not_found"},404):i.json({error:"internal",message:Ld(l)},500)}}),e.put("/local-mailbox/object",async i=>{let o=s(i);if(o!==null)return o;let a=Rd(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:Ld(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=Rd(a,{allowEmpty:!0});if(typeof l!="string")return i.json({error:"bad_request",message:l.error},400);let c=lM(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:Ld(u)},500)}})}function Rd(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 lM(e){if(e===void 0||e==="")return;let t=Number(e);return Number.isInteger(t)&&t>0?t:void 0}function cM(e){try{return oM(e).remote.address}catch{return}}function dM(e){return e===void 0||e===""?!1:!!(e==="127.0.0.1"||e==="::1"||e.startsWith("::ffff:127.")||e.startsWith("127."))}function Ld(e){return e instanceof Error?e.message:String(e)}var aM,Vy=T(()=>{"use strict";Fo();aM="local"});function Ky(e,t){e.get("/mailbox/workspace",r=>mM(r,t)),e.get("/mailbox/projects",r=>pM(r,t)),e.get("/mailbox/projects/:id",r=>_M(r,t)),e.post("/mailbox/projects",r=>hM(r,t)),e.patch("/mailbox/projects/:id",r=>gM(r,t)),e.delete("/mailbox/projects/:id",r=>yM(r,t)),e.post("/mailbox/projects/:project_id/prompts",r=>wM(r,t)),e.get("/mailbox/prompts/:id",r=>EM(r,t))}function mM(e,t){t.dal.ensureWorkspace({id:wn,name:Od});let r=Yy(t.dal),n={id:wn,name:Od,created_at:fM,projects:r};return e.json({workspace:n})}function pM(e,t){return e.json({projects:Yy(t.dal)})}function _M(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=$d(t.dal,r);return s===null||s.deleted_at!==null?e.json({project:null},404):e.json({project:Bo(s)})}let n=Zy(t.dal,r);return n===null?e.json({project:null},404):e.json({project:zy(n)})}async function hM(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:Bo(s)},201)}async 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);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=$d(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:Bo(o)})}return e.json({error:"project_not_found",message:`project not found: ${r}`},404)}function yM(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=$d(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 wM(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=Zy(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=`${uM}${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 TM({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:`${Wo}${o.id}`,text:s.text,status:"pending",created_at:new Date().toISOString(),completed_at:null};return e.json({prompt:u},201)}function EM(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=bM(t.dal,r);return e.json({result:n})}function Yy(e){let t=e.listProjects().map(zy),r=e.listWebProjectsActive(wn).map(Bo);return[...t,...r].sort(OM)}function zy(e){return{id:`${Wo}${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 Bo(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 $d(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 Zy(e,t){if(t.startsWith(Wo)){let n=t.slice(Wo.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 TM(e){let{enqueueManual:t}=await Promise.resolve().then(()=>(Wc(),hh));return{id:t(e.dal,{project_id:e.project_id,source_ref:e.source_ref,payload:e.payload}).id}}function bM(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=AM(e,i?.team_id??null),a=xM(s),l=RM(n,a,o.length>0),c=LM(r.created_at,s),d=i===null?{totalEstimatedMs:void 0,perStep:new Map}:SM(e,i.workflow_name),u=d.totalEstimatedMs,f=Qy(r.created_at),m=i?.workflow_name,p=d.perStep.size>0?d.perStep.size:void 0,_=s===null?[]:vM(e,s.id),g=kM(s,a,_,d.perStep,o),h=IM(_,d.perStep),S=NM(g,h,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,...Uo(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,...Uo(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,...Uo(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,...Uo(u,f),...S},errors_json:null,duration_ms:c}}function SM(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 vM(e,t){try{return e.listStepsForRun(t)}catch{return[]}}function kM(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=Qy(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 IM(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 NM(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 Qy(e){let t=Date.parse(e);return Number.isNaN(t)?0:Math.max(0,Date.now()-t)}function Uo(e,t){return e===void 0?{elapsed_ms:t}:{elapsed_ms:t,estimated_duration_ms:e}}function xM(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 AM(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 RM(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 LM(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 OM(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 Wo,yn,uM,wn,Od,fM,ew=T(()=>{"use strict";Wo="project:",yn="web_project:",uM="prompt:",wn="default",Od="Default workspace",fM=new Date(0).toISOString()});import{Buffer as tw}from"node:buffer";function rw(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 nw(e){return MM[e]}function sw(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,CM,qo,MM,Cd=T(()=>{"use strict";$M=1e4,CM=256*1024,qo=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(t){this.opts=t,this.pushWindowMs=rw(t.pushWindowMs,process.env.LMCTL_TERMINAL_PUSH_WINDOW_MS,$M),this.pushByteCap=rw(t.pushByteCap,process.env.LMCTL_TERMINAL_PUSH_BYTE_CAP,CM),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+=tw.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=${tw.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
1953
  [process exited with code ${r.exitCode}${r.signal!==void 0?` signal ${r.signal}`:""}]\r
1954
- `,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)}};MM={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 ow(e,t){e.post("/mailbox/terminal/launch",r=>jM(r,t)),e.post("/mailbox/terminal/end/:session_id",r=>DM(r,t)),e.get("/mailbox/terminal/sessions",r=>PM(r,t))}async function jM(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"||!iw.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=sw(n.command_line),o===void 0)return e.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=nw(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 DM(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||!iw.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 PM(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 iw,aw=T(()=>{"use strict";Cd();iw=/^[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 FM}from"node:buffer";function BM(e){try{return FM.byteLength(JSON.stringify(e),"utf8")}catch{return 256}}function lw(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 cw(e){return qM[e]}function dw(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 UM,WM,qo,qM,Md=T(()=>{"use strict";UM=2e3,WM=64*1024,qo=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(t){this.opts=t,this.pushWindowMs=lw(t.pushWindowMs,process.env.LMCTL_PROVIDER_PUSH_WINDOW_MS,UM),this.pushByteCap=lw(t.pushByteCap,process.env.LMCTL_PROVIDER_PUSH_BYTE_CAP,WM),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=BM(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")))})}};qM={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 fw(e,t){e.post("/mailbox/chat/launch",r=>HM(r,t)),e.post("/mailbox/chat/end/:session_id",r=>JM(r,t)),e.get("/mailbox/chat/sessions",r=>XM(r,t))}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 (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"||!uw.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=dw(n.command_line),o===void 0)return e.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=cw(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 JM(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||!uw.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 XM(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 uw,mw=T(()=>{"use strict";Md();uw=/^[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 GM}from"node:fs";function _w(e){let t=e.artifacts.find(r=>r.kind===`${e.state_name}_transcript`);if(t?.content!==void 0&&t.content!==null)return pw(t.content);if(t?.path===void 0||t.path===null)return[];try{let r=GM(t.path,{encoding:"utf8"});return pw(r)}catch{return[]}}function pw(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 hw=T(()=>{"use strict"});function gw(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
1954
+ `,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)}};MM={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 ow(e,t){e.post("/mailbox/terminal/launch",r=>jM(r,t)),e.post("/mailbox/terminal/end/:session_id",r=>DM(r,t)),e.get("/mailbox/terminal/sessions",r=>PM(r,t))}async function jM(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"||!iw.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=sw(n.command_line),o===void 0)return e.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=nw(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 DM(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||!iw.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 PM(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 iw,aw=T(()=>{"use strict";Cd();iw=/^[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 FM}from"node:buffer";function BM(e){try{return FM.byteLength(JSON.stringify(e),"utf8")}catch{return 256}}function lw(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 cw(e){return qM[e]}function dw(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 UM,WM,Ho,qM,Md=T(()=>{"use strict";UM=2e3,WM=64*1024,Ho=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(t){this.opts=t,this.pushWindowMs=lw(t.pushWindowMs,process.env.LMCTL_PROVIDER_PUSH_WINDOW_MS,UM),this.pushByteCap=lw(t.pushByteCap,process.env.LMCTL_PROVIDER_PUSH_BYTE_CAP,WM),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=BM(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")))})}};qM={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 fw(e,t){e.post("/mailbox/chat/launch",r=>HM(r,t)),e.post("/mailbox/chat/end/:session_id",r=>JM(r,t)),e.get("/mailbox/chat/sessions",r=>XM(r,t))}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 (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"||!uw.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=dw(n.command_line),o===void 0)return e.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=cw(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 JM(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||!uw.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 XM(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 uw,mw=T(()=>{"use strict";Md();uw=/^[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 GM}from"node:fs";function _w(e){let t=e.artifacts.find(r=>r.kind===`${e.state_name}_transcript`);if(t?.content!==void 0&&t.content!==null)return pw(t.content);if(t?.path===void 0||t.path===null)return[];try{let r=GM(t.path,{encoding:"utf8"});return pw(r)}catch{return[]}}function pw(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 hw=T(()=>{"use strict"});function gw(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 Jo(e,t){let r=e.query(`SELECT id, kind FROM attention
1955
1955
  WHERE run_id = ?
1956
1956
  AND acknowledged_at IS NULL
1957
1957
  AND requires_user = 1
1958
- ORDER BY id DESC LIMIT 1`,t);return r.length===0?null:{kind:r[0].kind,attention_id:r[0].id}}var Jo=T(()=>{"use strict"});function Nw(e,t){e.all("/runtime/*",r=>VM(r.req.raw,t))}async function VM(e,t){try{return Response.json(await KM(e,t))}catch(r){if(r instanceof se)return Response.json({error:r.message},{status:r.status});let n=r instanceof Error?r.message:String(r);return Response.json({error:n},{status:500})}}async function KM(e,t){let r=new URL(e.url),n=rj(t),s=r.pathname.split("/").filter(Boolean).map(decodeURIComponent);if(e.method==="GET"&&r.pathname==="/runtime/workspaces")return jd(e),[{id:n.id,name:n.name}];if(e.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="workspaces")return Xo(e,n.id,s[2]),YM(t.dal,n);if(e.method==="GET"&&s.length===5&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"){Xo(e,n.id,s[2]);let i=ww(t.dal,s[4]);return yw(t.dal,n,i)}if(e.method==="GET"&&r.pathname==="/runtime/lead-teams")return jd(e),t.dal.listTeams().map(i=>tj(i));if(e.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="chat"){let i=Ew(t.dal,Tw(s[2])),o=await e.json();if(o.teamId!==`team:${i.name}`)throw new se(400,"runtime lead chat body does not match route team");return Sw(e,n.id,o.context),bw(i,o.context)}if(e.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="messages"){let i=Ew(t.dal,Tw(s[2])),o=await e.json();if(o.teamId!==`team:${i.name}`)throw new se(400,"runtime lead message body does not match route team");Sw(e,n.id,o.context);let a=o.draft?.body;if(typeof a!="string"||a.length===0)throw new se(400,"runtime lead message requires draft.body");return bw(i,o.context,a)}if(e.method==="POST"&&s.length===6&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"&&s[5]==="workflow-message"){Xo(e,n.id,s[2]);let i=ww(t.dal,s[4]),o=await e.json();if(o.workspaceId!==n.id||o.projectId!==i.name)throw new se(400,"runtime request body does not match route workspace/project");let a=o.draft?.body;if(typeof a!="string"||a.length===0)throw new se(400,"runtime workflow message requires draft.body");return QM(t.dal,i,a),yw(t.dal,n,i)}if(e.method==="GET"&&r.pathname==="/runtime/templates")return Ss(e,n.id),t.dal.listWorkflows().map(i=>nj(i));if(e.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="templates"){Ss(e,n.id);let i=ij(t.dal,s[2]);return sj(i)}if(e.method==="GET"&&r.pathname==="/runtime/runs"){Ss(e,n.id);let i=r.searchParams.get("project"),o=r.searchParams.get("template");if(i!==null&&o!==null)throw new se(400,"conflicting_filters: ?project= and ?template= are mutually exclusive");return oj(t.dal,i,o).map(l=>kw(t.dal,l))}if(e.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="runs"){Ss(e,n.id);let i=vw(t.dal,s[2]);return kw(t.dal,i)}if(e.method==="GET"&&s.length===4&&s[0]==="runtime"&&s[1]==="runs"&&s[3]==="events"){Ss(e,n.id);let i=vw(t.dal,s[2]),o=lj(t.dal,i);return{runId:Wd(i),events:o,...o.length>0?{cursor:o[o.length-1].id}:{}}}throw new se(404,`unknown runtime request: ${e.method} ${r.pathname}`)}function YM(e,t){return{id:t.id,name:t.name,projects:e.listProjects().map(r=>xw(e,t,r))}}function yw(e,t,r){let n=xw(e,t,r);return{...n,managedWorkflow:{...n.managedWorkflow,instance:zM(e,r),composerTarget:{kind:"workflow-initial",label:`Project Workflow: ${r.workflow_name}`,templateId:`template:${r.workflow_name}`,runId:n.managedWorkflow.runId}},workflowMessages:ZM(e,r)}}function xw(e,t,r){let n=Aw(e,r.id),s=Pd(n);return{id:r.name,workspaceId:t.id,name:r.name,...r.description===null?{}:{description:r.description},status:s,managedWorkflow:{templateId:`template:${r.workflow_name}`,templateName:r.workflow_name,runId:n===null?`project:${r.id}:no-run`:`run:${n.id}`,status:s}}}function zM(e,t){let r=Aw(e,t.id),n=r?.current_state??null;return{id:r===null?`project:${t.id}:no-run`:`run:${r.id}`,templateId:`template:${t.workflow_name}`,label:t.workflow_name,status:Pd(r),currentStepIds:n===null?[]:[n],...r?.started_at===void 0?{}:{createdAt:r.started_at},...r?.ended_at===null||r?.ended_at===void 0?{}:{updatedAt:r.ended_at}}}function ZM(e,t){return e.query("SELECT * FROM attention WHERE project_id = ? ORDER BY id ASC LIMIT 50",t.id).map(n=>({id:`attention:${n.id}`,role:"event",author:"lmctl",timestamp:n.created_at,body:n.kind}))}function QM(e,t,r){let n=ej(e,t.id);if(n!==null){let s=Ho(e,n.id);if(s?.kind==="workflow_escalation"){let i=e.resumeEscalation(s.attention_id,r);if(!i.resumed)throw new se(409,`workflow escalation resume failed: ${i.reason}`);return}if(s?.kind==="interactive_waiting_operator"){let i=kt(e,s.attention_id);if(i?.step_id===null||i?.step_id===void 0)throw new se(409,"interactive resume failed: missing step");let o=e.resumeInteractive(i.step_id,r,!0);if(!o.resumed)throw new se(409,`interactive resume failed: ${o.reason}`);return}}e.enqueueJob({project_id:t.id,source:"runtime-workflow-message",payload:JSON.stringify({prompt:r}),priority:0})}function Aw(e,t){return e.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? ORDER BY r.id DESC LIMIT 1",t)[0]??null}function ej(e,t){return e.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? AND r.terminal_state IS NULL ORDER BY r.id DESC LIMIT 1",t)[0]??null}function Pd(e){return e===null?"queued":e.terminal_state===null?"running":e.terminal_state==="done"||e.terminal_state==="success"?"succeeded":e.terminal_state==="cancelled"||e.terminal_state==="aborted"?"cancelled":"failed"}function ww(e,t){let r=e.findProjectByName(t);if(r===null)throw new se(404,`project not found: ${t}`);return r}function Ew(e,t){let r=e.listTeams().find(n=>n.name===t);if(r===void 0)throw new se(404,`team not found: ${t}`);return r}function Tw(e){return e.startsWith("team:")?e.slice(5):e}function tj(e){return{id:`team:${e.name}`,name:e.name,teamfile:"",hasLead:!0,kind:e.name.toLowerCase().includes("manager")?"global-manager":"custom-ai-led"}}function bw(e,t,r){let n=new Date().toISOString(),s=r===void 0?[]:[{id:`lead:${e.id}:user:${Date.now()}`,role:"user",author:"operator",timestamp:n,body:r},{id:`lead:${e.id}:event:${Date.now()}`,role:"event",author:"lmctl",timestamp:n,body:"Lead-team mailbox request accepted by the runtime dispatcher."}];return{id:`lead-chat:${e.name}:${t?.scope??"global-admin"}:${t?.workspaceId??Iw}`,teamId:`team:${e.name}`,title:`${e.name} Lead`,messages:s,...t===void 0?{}:{context:t}}}function rj(e){let t=e.workspaceName??Dt()??Sr.default;return{id:t,name:t}}function jd(e){if(e.headers.get("x-lmctl-workspace-id")!==Iw)throw new se(400,"runtime request requires global-admin workspace identity")}function Xo(e,t,r){let n=e.headers.get("x-lmctl-workspace-id");if(n===null)throw new se(400,"runtime request requires workspace identity");if(r!==t||n!==t)throw new se(400,"runtime workspace identity does not match route")}function Ss(e,t){let r=e.headers.get("x-lmctl-workspace-id");if(r===null)throw new se(400,"runtime request requires workspace identity");if(r!==t)throw new se(400,"runtime workspace identity does not match server workspace")}function Sw(e,t,r){if(r?.scope==="workspace"){if(r.workspaceId===void 0)throw new se(400,"workspace manager context requires workspace identity");Xo(e,t,r.workspaceId);return}jd(e)}function Fd(e){return`${En}${Ud(e.name)}`}function Ud(e){return e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"item"}function Wd(e){return`${Dd}${e.id}`}function nj(e){let t=Go(e.definition);return{id:Fd(e),name:e.name,...t.description===null?{}:{description:t.description}}}function sj(e){let t=Go(e.definition);return{id:Fd(e),name:e.name,...t.description===null?{}:{description:t.description},graph:t.graph}}function Go(e){let t;try{t=JSON.parse(e)}catch{return{description:null,graph:null,stepIds:[],nameToId:new Map}}if(t===null||typeof t!="object")return{description:null,graph:t,stepIds:[],nameToId:new Map};let r=t,n=typeof r.description=="string"?r.description:null,s=[],i=new Map;if(r.schema_version==="lmctl/v3"&&Array.isArray(r.steps)){let o=typeof r.entry_step_id=="string"?r.entry_step_id:null;for(let a of r.steps){let l=typeof a.id=="string"?a.id:null;l!==null&&(s.push(l),typeof a.name=="string"&&a.name.length>0&&i.set(a.name,l))}o!==null&&s.includes(o)&&s.sort((a,l)=>a===o?-1:l===o?1:0)}return{description:n,graph:t,stepIds:s,nameToId:i}}function ij(e,t){if(!t.startsWith(En))throw new se(404,`template not found: ${t}`);let r=t.slice(En.length),n=e.listWorkflows().filter(s=>Ud(s.name)===r);if(n.length===0)throw new se(404,`template not found: ${t}`);if(n.length>1){let s=n.map(i=>i.name).join(", ");throw new se(409,`template_id_ambiguous: ${t} matches multiple workflow names [${s}]; rename to ensure unique slugs`)}return n[0]}function vw(e,t){if(!t.startsWith(Dd))throw new se(404,`run not found: ${t}`);let r=t.slice(Dd.length);if(!/^[1-9]\d*$/.test(r))throw new se(404,`run not found: ${t}`);let n=Number.parseInt(r,10);if(!Number.isFinite(n)||n<=0||String(n)!==r)throw new se(404,`run not found: ${t}`);let s=e.getRun(n);if(s===null)throw new se(404,`run not found: ${t}`);return s}function oj(e,t,r){if(r!==null){if(!r.startsWith(En))return[];let s=r.slice(En.length),i=e.listWorkflows().filter(a=>Ud(a.name)===s).map(a=>a.id);if(i.length===0)return[];let o=i.map(()=>"?").join(", ");return e.query(`SELECT * FROM run WHERE workflow_id IN (${o}) ORDER BY id DESC LIMIT 200`,...i)}if(t===null)return e.query("SELECT * FROM run ORDER BY id DESC LIMIT 200");let n=e.findProjectByName(t);return n===null?[]:e.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? ORDER BY r.id DESC LIMIT 200",n.id)}function kw(e,t){let r=e.getWorkflow(t.workflow_id),n=Pd(t),s=aj(r,t);return{id:Wd(t),templateId:r===null?`${En}unknown`:Fd(r),label:r===null?`run ${t.id}`:`${r.name} #${t.id}`,status:n,createdAt:t.started_at,...t.ended_at===null?{}:{updatedAt:t.ended_at},currentStepIds:s}}function aj(e,t){if(t.current_state===null)return[];let r=t.current_state.startsWith("__paused__:")?t.current_state.slice(11):t.current_state;return e===null?[r]:[Go(e.definition).nameToId.get(r)??r]}function lj(e,t){let r=e.getWorkflow(t.workflow_id),n=r===null?{stepIds:[],nameToId:new Map}:Go(r.definition),s=c=>n.nameToId.get(c)??c,i=Wd(t),o=[];o.push({timestamp:t.started_at,type:"run.started",message:"Run started"});let a=e.listStepsForRun(t.id);for(let c of a){let d=s(c.state_name);if(o.push({timestamp:c.started_at,type:"step.started",stepId:d,message:`step ${c.state_name} started`}),c.ended_at!==null){let u=cj(c);o.push({timestamp:c.ended_at,type:u,stepId:d,...c.outcome===null?{}:{message:c.outcome},...c.status_detail===null?{}:{payload:{status_detail:c.status_detail}}})}else t.paused_at!==null&&c.id===a[a.length-1]?.id&&o.push({timestamp:t.paused_at,type:"step.paused",stepId:d})}let l=e.listSessionEvents(t.id);for(let c of l){let d=c.step_id===null?void 0:(()=>{let m=a.find(p=>p.id===c.step_id);return m===void 0?void 0:s(m.state_name)})(),u=new Date(c.timestamp_ms).toISOString(),f={kind:c.kind,session_event_id:c.id};if(c.payload.length>0)try{let m=JSON.parse(c.payload);m!==null&&typeof m=="object"&&!Array.isArray(m)&&(f={...f,...m})}catch{}o.push({timestamp:u,type:"message",...d===void 0?{}:{stepId:d},payload:f})}if(t.terminal_state!==null){let c=t.terminal_state==="done"||t.terminal_state==="success"?"run.completed":t.terminal_state==="cancelled"||t.terminal_state==="aborted"?"run.cancelled":"run.failed";o.push({timestamp:t.ended_at??t.started_at,type:c,message:t.terminal_state})}return o.sort((c,d)=>c.timestamp.localeCompare(d.timestamp)),o.map((c,d)=>({id:`${i}:evt:${d+1}`,runId:i,sequence:d+1,timestamp:c.timestamp,type:c.type,...c.stepId===void 0?{}:{stepId:c.stepId},...c.message===void 0?{}:{message:c.message},...c.payload===void 0?{}:{payload:c.payload}}))}function cj(e){if(e.outcome===null)return"step.failed";let t=e.status_detail;return t==="failed"||t==="error"||t==="aborted"?"step.failed":"step.completed"}var Iw,En,Dd,se,Rw=T(()=>{"use strict";Xe();Jo();Ht();Iw="global-admin";En="template:",Dd="run:";se=class extends Error{status;constructor(t,r){super(r),this.status=t}}});import{mkdirSync as dj,writeFileSync as uj}from"node:fs";import{randomUUID as Lw}from"node:crypto";import{dirname as fj,resolve as Vo,sep as Ow}from"node:path";async function Cw(e,t){let r;try{r=await e.req.parseBody({all:!1})}catch{return e.text("invalid multipart body",400)}let n=r.image;if(!gj(n))return e.text("missing image file",400);if(n.size>mj)return e.text("upload too large",413);let s=Buffer.from(await n.arrayBuffer()),i=yj(s);if(i===null||!(i in $w))return e.text("unsupported upload MIME type",415);if(n.type.length>0&&n.type!==i)return e.text("upload MIME type does not match file content",415);let o=pj(t,r.project);if(typeof o=="string")return e.text(o,404);let a=o===null?Vo(hj()):Vo(o.local_path),l=Vo(a,"uploads",Lw()),c=Vo(l,`${Lw()}${$w[i]}`);if(!_j(c,a))return e.text("invalid upload path",400);dj(l,{recursive:!0});let d=new Uint8Array(s.buffer,s.byteOffset,s.byteLength);uj(c,d);let u={path:c,size:s.byteLength,mime:i,project:o?.name??null};return e.json(u)}function pj(e,t){return t==null||t===""?null:typeof t!="string"?"invalid project":e.findProjectByName(t)??`project not found: ${t}`}function _j(e,t){let r=t.endsWith(Ow)?t:`${t}${Ow}`;return e.startsWith(r)}function hj(){return fj(le())}function gj(e){return typeof File<"u"&&e instanceof File}function yj(e){return e.length>=8&&e[0]===137&&e[1]===80&&e[2]===78&&e[3]===71&&e[4]===13&&e[5]===10&&e[6]===26&&e[7]===10?"image/png":e.length>=3&&e[0]===255&&e[1]===216&&e[2]===255?"image/jpeg":e.length>=12&&e.subarray(0,4).toString("ascii")==="RIFF"&&e.subarray(8,12).toString("ascii")==="WEBP"?"image/webp":e.length>=12&&e.subarray(4,8).toString("ascii")==="ftyp"&&["heic","heix","hevc","hevx","mif1","msf1"].includes(e.subarray(8,12).toString("ascii"))?"image/heic":e.length>=5&&e.subarray(0,5).toString("ascii")==="%PDF-"?"application/pdf":null}var mj,$w,Mw=T(()=>{"use strict";Xe();mj=10*1024*1024,$w={"image/png":".png","image/jpeg":".jpg","image/webp":".webp","image/heic":".heic","application/pdf":".pdf"}});import{existsSync as Ko}from"node:fs";import{basename as wj,dirname as Ej,extname as Tj,isAbsolute as bj,join as Sj,relative as vj}from"node:path";import{fileURLToPath as kj}from"node:url";import{Hono as Ij}from"hono";import{serveStatic as Nt}from"@hono/node-server/serve-static";function Bw(e){let t=new Ij,r=[],n=e.localWebui!==void 0?qd(e.localWebui.webuiDir):Nj();if(e.localWebui!==void 0&&Gy(t,{s3:e.localWebui.localMailbox.s3,commands:e.localWebui.localMailbox.commands}),n!==null){let s=xj();e.localWebui!==void 0?t.get("/config.json",s,i=>i.json({workspaceFetchMode:"local-mailbox",localMailbox:{base:"/local-mailbox",userId:"local",deviceId:"local"},mailboxPolling:{readIntervalSeconds:1,heartbeatIdleSeconds:1,backoffReadIntervalSeconds:1}})):e.webuiRuntimeConfig!==void 0&&t.get("/config.json",s,i=>i.json(e.webuiRuntimeConfig)),t.use("/dist/*",s,Nt({root:n})),t.use("/vendor/*",s,Nt({root:n})),t.use("/src/*",s,Nt({root:n})),t.get("/",s,Nt({root:n,path:"index.html"})),t.get("/admin",s,Nt({root:n,path:"index.html"})),t.get("/admin/*",s,Nt({root:n,path:"index.html"})),t.get("/terminal",s,Nt({root:n,path:"index.html"})),t.get("/terminal/*",s,Nt({root:n,path:"index.html"})),t.get("/chat",s,Nt({root:n,path:"index.html"})),t.get("/chat/*",s,Nt({root:n,path:"index.html"}))}else t.get("/",s=>s.html('<!doctype html><meta charset="utf-8"><title>lmctl</title><body style="font-family:system-ui;max-width:40rem;margin:4rem auto;padding:0 1rem;line-height:1.5"><h1>lmctl daemon</h1><p>This build does not bundle the local web console; the HTTP API is running on this port.</p><p>Open the hosted console at <a href="https://lmctl.ai/">https://lmctl.ai/</a> \u2014 it connects to this daemon via the cloud mailbox.</p></body>'));return t.use("*",Sh()),t.get("/login",s=>s.html(Re("Login",`
1958
+ ORDER BY id DESC LIMIT 1`,t);return r.length===0?null:{kind:r[0].kind,attention_id:r[0].id}}var Xo=T(()=>{"use strict"});function Nw(e,t){e.all("/runtime/*",r=>VM(r.req.raw,t))}async function VM(e,t){try{return Response.json(await KM(e,t))}catch(r){if(r instanceof se)return Response.json({error:r.message},{status:r.status});let n=r instanceof Error?r.message:String(r);return Response.json({error:n},{status:500})}}async function KM(e,t){let r=new URL(e.url),n=rj(t),s=r.pathname.split("/").filter(Boolean).map(decodeURIComponent);if(e.method==="GET"&&r.pathname==="/runtime/workspaces")return jd(e),[{id:n.id,name:n.name}];if(e.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="workspaces")return Go(e,n.id,s[2]),YM(t.dal,n);if(e.method==="GET"&&s.length===5&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"){Go(e,n.id,s[2]);let i=ww(t.dal,s[4]);return yw(t.dal,n,i)}if(e.method==="GET"&&r.pathname==="/runtime/lead-teams")return jd(e),t.dal.listTeams().map(i=>tj(i));if(e.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="chat"){let i=Ew(t.dal,Tw(s[2])),o=await e.json();if(o.teamId!==`team:${i.name}`)throw new se(400,"runtime lead chat body does not match route team");return Sw(e,n.id,o.context),bw(i,o.context)}if(e.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="messages"){let i=Ew(t.dal,Tw(s[2])),o=await e.json();if(o.teamId!==`team:${i.name}`)throw new se(400,"runtime lead message body does not match route team");Sw(e,n.id,o.context);let a=o.draft?.body;if(typeof a!="string"||a.length===0)throw new se(400,"runtime lead message requires draft.body");return bw(i,o.context,a)}if(e.method==="POST"&&s.length===6&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"&&s[5]==="workflow-message"){Go(e,n.id,s[2]);let i=ww(t.dal,s[4]),o=await e.json();if(o.workspaceId!==n.id||o.projectId!==i.name)throw new se(400,"runtime request body does not match route workspace/project");let a=o.draft?.body;if(typeof a!="string"||a.length===0)throw new se(400,"runtime workflow message requires draft.body");return QM(t.dal,i,a),yw(t.dal,n,i)}if(e.method==="GET"&&r.pathname==="/runtime/templates")return Ss(e,n.id),t.dal.listWorkflows().map(i=>nj(i));if(e.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="templates"){Ss(e,n.id);let i=ij(t.dal,s[2]);return sj(i)}if(e.method==="GET"&&r.pathname==="/runtime/runs"){Ss(e,n.id);let i=r.searchParams.get("project"),o=r.searchParams.get("template");if(i!==null&&o!==null)throw new se(400,"conflicting_filters: ?project= and ?template= are mutually exclusive");return oj(t.dal,i,o).map(l=>kw(t.dal,l))}if(e.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="runs"){Ss(e,n.id);let i=vw(t.dal,s[2]);return kw(t.dal,i)}if(e.method==="GET"&&s.length===4&&s[0]==="runtime"&&s[1]==="runs"&&s[3]==="events"){Ss(e,n.id);let i=vw(t.dal,s[2]),o=lj(t.dal,i);return{runId:Wd(i),events:o,...o.length>0?{cursor:o[o.length-1].id}:{}}}throw new se(404,`unknown runtime request: ${e.method} ${r.pathname}`)}function YM(e,t){return{id:t.id,name:t.name,projects:e.listProjects().map(r=>xw(e,t,r))}}function yw(e,t,r){let n=xw(e,t,r);return{...n,managedWorkflow:{...n.managedWorkflow,instance:zM(e,r),composerTarget:{kind:"workflow-initial",label:`Project Workflow: ${r.workflow_name}`,templateId:`template:${r.workflow_name}`,runId:n.managedWorkflow.runId}},workflowMessages:ZM(e,r)}}function xw(e,t,r){let n=Aw(e,r.id),s=Pd(n);return{id:r.name,workspaceId:t.id,name:r.name,...r.description===null?{}:{description:r.description},status:s,managedWorkflow:{templateId:`template:${r.workflow_name}`,templateName:r.workflow_name,runId:n===null?`project:${r.id}:no-run`:`run:${n.id}`,status:s}}}function zM(e,t){let r=Aw(e,t.id),n=r?.current_state??null;return{id:r===null?`project:${t.id}:no-run`:`run:${r.id}`,templateId:`template:${t.workflow_name}`,label:t.workflow_name,status:Pd(r),currentStepIds:n===null?[]:[n],...r?.started_at===void 0?{}:{createdAt:r.started_at},...r?.ended_at===null||r?.ended_at===void 0?{}:{updatedAt:r.ended_at}}}function ZM(e,t){return e.query("SELECT * FROM attention WHERE project_id = ? ORDER BY id ASC LIMIT 50",t.id).map(n=>({id:`attention:${n.id}`,role:"event",author:"lmctl",timestamp:n.created_at,body:n.kind}))}function QM(e,t,r){let n=ej(e,t.id);if(n!==null){let s=Jo(e,n.id);if(s?.kind==="workflow_escalation"){let i=e.resumeEscalation(s.attention_id,r);if(!i.resumed)throw new se(409,`workflow escalation resume failed: ${i.reason}`);return}if(s?.kind==="interactive_waiting_operator"){let i=kt(e,s.attention_id);if(i?.step_id===null||i?.step_id===void 0)throw new se(409,"interactive resume failed: missing step");let o=e.resumeInteractive(i.step_id,r,!0);if(!o.resumed)throw new se(409,`interactive resume failed: ${o.reason}`);return}}e.enqueueJob({project_id:t.id,source:"runtime-workflow-message",payload:JSON.stringify({prompt:r}),priority:0})}function Aw(e,t){return e.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? ORDER BY r.id DESC LIMIT 1",t)[0]??null}function ej(e,t){return e.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? AND r.terminal_state IS NULL ORDER BY r.id DESC LIMIT 1",t)[0]??null}function Pd(e){return e===null?"queued":e.terminal_state===null?"running":e.terminal_state==="done"||e.terminal_state==="success"?"succeeded":e.terminal_state==="cancelled"||e.terminal_state==="aborted"?"cancelled":"failed"}function ww(e,t){let r=e.findProjectByName(t);if(r===null)throw new se(404,`project not found: ${t}`);return r}function Ew(e,t){let r=e.listTeams().find(n=>n.name===t);if(r===void 0)throw new se(404,`team not found: ${t}`);return r}function Tw(e){return e.startsWith("team:")?e.slice(5):e}function tj(e){return{id:`team:${e.name}`,name:e.name,teamfile:"",hasLead:!0,kind:e.name.toLowerCase().includes("manager")?"global-manager":"custom-ai-led"}}function bw(e,t,r){let n=new Date().toISOString(),s=r===void 0?[]:[{id:`lead:${e.id}:user:${Date.now()}`,role:"user",author:"operator",timestamp:n,body:r},{id:`lead:${e.id}:event:${Date.now()}`,role:"event",author:"lmctl",timestamp:n,body:"Lead-team mailbox request accepted by the runtime dispatcher."}];return{id:`lead-chat:${e.name}:${t?.scope??"global-admin"}:${t?.workspaceId??Iw}`,teamId:`team:${e.name}`,title:`${e.name} Lead`,messages:s,...t===void 0?{}:{context:t}}}function rj(e){let t=e.workspaceName??Dt()??Sr.default;return{id:t,name:t}}function jd(e){if(e.headers.get("x-lmctl-workspace-id")!==Iw)throw new se(400,"runtime request requires global-admin workspace identity")}function Go(e,t,r){let n=e.headers.get("x-lmctl-workspace-id");if(n===null)throw new se(400,"runtime request requires workspace identity");if(r!==t||n!==t)throw new se(400,"runtime workspace identity does not match route")}function Ss(e,t){let r=e.headers.get("x-lmctl-workspace-id");if(r===null)throw new se(400,"runtime request requires workspace identity");if(r!==t)throw new se(400,"runtime workspace identity does not match server workspace")}function Sw(e,t,r){if(r?.scope==="workspace"){if(r.workspaceId===void 0)throw new se(400,"workspace manager context requires workspace identity");Go(e,t,r.workspaceId);return}jd(e)}function Fd(e){return`${En}${Ud(e.name)}`}function Ud(e){return e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"item"}function Wd(e){return`${Dd}${e.id}`}function nj(e){let t=Vo(e.definition);return{id:Fd(e),name:e.name,...t.description===null?{}:{description:t.description}}}function sj(e){let t=Vo(e.definition);return{id:Fd(e),name:e.name,...t.description===null?{}:{description:t.description},graph:t.graph}}function Vo(e){let t;try{t=JSON.parse(e)}catch{return{description:null,graph:null,stepIds:[],nameToId:new Map}}if(t===null||typeof t!="object")return{description:null,graph:t,stepIds:[],nameToId:new Map};let r=t,n=typeof r.description=="string"?r.description:null,s=[],i=new Map;if(r.schema_version==="lmctl/v3"&&Array.isArray(r.steps)){let o=typeof r.entry_step_id=="string"?r.entry_step_id:null;for(let a of r.steps){let l=typeof a.id=="string"?a.id:null;l!==null&&(s.push(l),typeof a.name=="string"&&a.name.length>0&&i.set(a.name,l))}o!==null&&s.includes(o)&&s.sort((a,l)=>a===o?-1:l===o?1:0)}return{description:n,graph:t,stepIds:s,nameToId:i}}function ij(e,t){if(!t.startsWith(En))throw new se(404,`template not found: ${t}`);let r=t.slice(En.length),n=e.listWorkflows().filter(s=>Ud(s.name)===r);if(n.length===0)throw new se(404,`template not found: ${t}`);if(n.length>1){let s=n.map(i=>i.name).join(", ");throw new se(409,`template_id_ambiguous: ${t} matches multiple workflow names [${s}]; rename to ensure unique slugs`)}return n[0]}function vw(e,t){if(!t.startsWith(Dd))throw new se(404,`run not found: ${t}`);let r=t.slice(Dd.length);if(!/^[1-9]\d*$/.test(r))throw new se(404,`run not found: ${t}`);let n=Number.parseInt(r,10);if(!Number.isFinite(n)||n<=0||String(n)!==r)throw new se(404,`run not found: ${t}`);let s=e.getRun(n);if(s===null)throw new se(404,`run not found: ${t}`);return s}function oj(e,t,r){if(r!==null){if(!r.startsWith(En))return[];let s=r.slice(En.length),i=e.listWorkflows().filter(a=>Ud(a.name)===s).map(a=>a.id);if(i.length===0)return[];let o=i.map(()=>"?").join(", ");return e.query(`SELECT * FROM run WHERE workflow_id IN (${o}) ORDER BY id DESC LIMIT 200`,...i)}if(t===null)return e.query("SELECT * FROM run ORDER BY id DESC LIMIT 200");let n=e.findProjectByName(t);return n===null?[]:e.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? ORDER BY r.id DESC LIMIT 200",n.id)}function kw(e,t){let r=e.getWorkflow(t.workflow_id),n=Pd(t),s=aj(r,t);return{id:Wd(t),templateId:r===null?`${En}unknown`:Fd(r),label:r===null?`run ${t.id}`:`${r.name} #${t.id}`,status:n,createdAt:t.started_at,...t.ended_at===null?{}:{updatedAt:t.ended_at},currentStepIds:s}}function aj(e,t){if(t.current_state===null)return[];let r=t.current_state.startsWith("__paused__:")?t.current_state.slice(11):t.current_state;return e===null?[r]:[Vo(e.definition).nameToId.get(r)??r]}function lj(e,t){let r=e.getWorkflow(t.workflow_id),n=r===null?{stepIds:[],nameToId:new Map}:Vo(r.definition),s=c=>n.nameToId.get(c)??c,i=Wd(t),o=[];o.push({timestamp:t.started_at,type:"run.started",message:"Run started"});let a=e.listStepsForRun(t.id);for(let c of a){let d=s(c.state_name);if(o.push({timestamp:c.started_at,type:"step.started",stepId:d,message:`step ${c.state_name} started`}),c.ended_at!==null){let u=cj(c);o.push({timestamp:c.ended_at,type:u,stepId:d,...c.outcome===null?{}:{message:c.outcome},...c.status_detail===null?{}:{payload:{status_detail:c.status_detail}}})}else t.paused_at!==null&&c.id===a[a.length-1]?.id&&o.push({timestamp:t.paused_at,type:"step.paused",stepId:d})}let l=e.listSessionEvents(t.id);for(let c of l){let d=c.step_id===null?void 0:(()=>{let m=a.find(p=>p.id===c.step_id);return m===void 0?void 0:s(m.state_name)})(),u=new Date(c.timestamp_ms).toISOString(),f={kind:c.kind,session_event_id:c.id};if(c.payload.length>0)try{let m=JSON.parse(c.payload);m!==null&&typeof m=="object"&&!Array.isArray(m)&&(f={...f,...m})}catch{}o.push({timestamp:u,type:"message",...d===void 0?{}:{stepId:d},payload:f})}if(t.terminal_state!==null){let c=t.terminal_state==="done"||t.terminal_state==="success"?"run.completed":t.terminal_state==="cancelled"||t.terminal_state==="aborted"?"run.cancelled":"run.failed";o.push({timestamp:t.ended_at??t.started_at,type:c,message:t.terminal_state})}return o.sort((c,d)=>c.timestamp.localeCompare(d.timestamp)),o.map((c,d)=>({id:`${i}:evt:${d+1}`,runId:i,sequence:d+1,timestamp:c.timestamp,type:c.type,...c.stepId===void 0?{}:{stepId:c.stepId},...c.message===void 0?{}:{message:c.message},...c.payload===void 0?{}:{payload:c.payload}}))}function cj(e){if(e.outcome===null)return"step.failed";let t=e.status_detail;return t==="failed"||t==="error"||t==="aborted"?"step.failed":"step.completed"}var Iw,En,Dd,se,Rw=T(()=>{"use strict";Xe();Xo();Ht();Iw="global-admin";En="template:",Dd="run:";se=class extends Error{status;constructor(t,r){super(r),this.status=t}}});import{mkdirSync as dj,writeFileSync as uj}from"node:fs";import{randomUUID as Lw}from"node:crypto";import{dirname as fj,resolve as Ko,sep as Ow}from"node:path";async function Cw(e,t){let r;try{r=await e.req.parseBody({all:!1})}catch{return e.text("invalid multipart body",400)}let n=r.image;if(!gj(n))return e.text("missing image file",400);if(n.size>mj)return e.text("upload too large",413);let s=Buffer.from(await n.arrayBuffer()),i=yj(s);if(i===null||!(i in $w))return e.text("unsupported upload MIME type",415);if(n.type.length>0&&n.type!==i)return e.text("upload MIME type does not match file content",415);let o=pj(t,r.project);if(typeof o=="string")return e.text(o,404);let a=o===null?Ko(hj()):Ko(o.local_path),l=Ko(a,"uploads",Lw()),c=Ko(l,`${Lw()}${$w[i]}`);if(!_j(c,a))return e.text("invalid upload path",400);dj(l,{recursive:!0});let d=new Uint8Array(s.buffer,s.byteOffset,s.byteLength);uj(c,d);let u={path:c,size:s.byteLength,mime:i,project:o?.name??null};return e.json(u)}function pj(e,t){return t==null||t===""?null:typeof t!="string"?"invalid project":e.findProjectByName(t)??`project not found: ${t}`}function _j(e,t){let r=t.endsWith(Ow)?t:`${t}${Ow}`;return e.startsWith(r)}function hj(){return fj(le())}function gj(e){return typeof File<"u"&&e instanceof File}function yj(e){return e.length>=8&&e[0]===137&&e[1]===80&&e[2]===78&&e[3]===71&&e[4]===13&&e[5]===10&&e[6]===26&&e[7]===10?"image/png":e.length>=3&&e[0]===255&&e[1]===216&&e[2]===255?"image/jpeg":e.length>=12&&e.subarray(0,4).toString("ascii")==="RIFF"&&e.subarray(8,12).toString("ascii")==="WEBP"?"image/webp":e.length>=12&&e.subarray(4,8).toString("ascii")==="ftyp"&&["heic","heix","hevc","hevx","mif1","msf1"].includes(e.subarray(8,12).toString("ascii"))?"image/heic":e.length>=5&&e.subarray(0,5).toString("ascii")==="%PDF-"?"application/pdf":null}var mj,$w,Mw=T(()=>{"use strict";Xe();mj=10*1024*1024,$w={"image/png":".png","image/jpeg":".jpg","image/webp":".webp","image/heic":".heic","application/pdf":".pdf"}});import{existsSync as Yo}from"node:fs";import{basename as wj,dirname as Ej,extname as Tj,isAbsolute as bj,join as Sj,relative as vj}from"node:path";import{fileURLToPath as kj}from"node:url";import{Hono as Ij}from"hono";import{serveStatic as Nt}from"@hono/node-server/serve-static";function Bw(e){let t=new Ij,r=[],n=e.localWebui!==void 0?qd(e.localWebui.webuiDir):Nj();if(e.localWebui!==void 0&&Gy(t,{s3:e.localWebui.localMailbox.s3,commands:e.localWebui.localMailbox.commands}),n!==null){let s=xj();e.localWebui!==void 0?t.get("/config.json",s,i=>i.json({workspaceFetchMode:"local-mailbox",localMailbox:{base:"/local-mailbox",userId:"local",deviceId:"local"},mailboxPolling:{readIntervalSeconds:1,heartbeatIdleSeconds:1,backoffReadIntervalSeconds:1}})):e.webuiRuntimeConfig!==void 0&&t.get("/config.json",s,i=>i.json(e.webuiRuntimeConfig)),t.use("/dist/*",s,Nt({root:n})),t.use("/vendor/*",s,Nt({root:n})),t.use("/src/*",s,Nt({root:n})),t.get("/",s,Nt({root:n,path:"index.html"})),t.get("/admin",s,Nt({root:n,path:"index.html"})),t.get("/admin/*",s,Nt({root:n,path:"index.html"})),t.get("/terminal",s,Nt({root:n,path:"index.html"})),t.get("/terminal/*",s,Nt({root:n,path:"index.html"})),t.get("/chat",s,Nt({root:n,path:"index.html"})),t.get("/chat/*",s,Nt({root:n,path:"index.html"}))}else t.get("/",s=>s.html('<!doctype html><meta charset="utf-8"><title>lmctl</title><body style="font-family:system-ui;max-width:40rem;margin:4rem auto;padding:0 1rem;line-height:1.5"><h1>lmctl daemon</h1><p>This build does not bundle the local web console; the HTTP API is running on this port.</p><p>Open the hosted console at <a href="https://lmctl.ai/">https://lmctl.ai/</a> \u2014 it connects to this daemon via the cloud mailbox.</p></body>'));return t.use("*",Sh()),t.get("/login",s=>s.html(Re("Login",`
1959
1959
  <h1>Login</h1>
1960
1960
  <form method="post" action="/login">
1961
1961
  <label>Token <input name="token" type="password"></label>
1962
1962
  <button type="submit">Login</button>
1963
1963
  </form>
1964
- `))),t.post("/login",async s=>{let i=await s.req.parseBody(),o=typeof i.token=="string"?i.token:"";return kh(o)?(Gc(s,o),s.redirect("/",302)):s.html(Re("Login","<p>Invalid token</p>"),401)}),t.post("/logout",s=>(Ih(s),s.redirect("/login",302))),Oy(t,{dal:e.dal}),Nw(t,{dal:e.dal}),Ky(t,{dal:e.dal}),ow(t,{terminalSessionManager:e.terminalSessionManager}),fw(t,{persistentSessionManager:e.persistentSessionManager}),t.post("/api/teams/:team_name/refresh",async s=>{let i=is(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 gc(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>`)}),$h(t,{dal:e.dal}),Uh(t,{dal:e.dal}),t.get("/api/status",s=>D(s,Pi(e.dal),Mj)),t.get("/api/projects",s=>D(s,Fi(e.dal),jj)),t.get("/api/teams",s=>D(s,b_(e.dal),Fj)),t.get("/api/workflows",s=>D(s,Ui(e.dal),Uj)),t.get("/api/workflows/verify",s=>{let i=hy();return s.req.header("accept")?.includes("text/plain")?s.text(yy(i)):s.json(i)}),t.get("/api/jobs",s=>D(s,S_(e.dal,{status:s.req.query("status")}),Wj)),t.post("/api/uploads",s=>Cw(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(),xy)),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),Dj)}),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=Lj(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=Dw(s.req.query("status"),Oj);if(typeof o=="string")return s.text(o,400);let a=Dw(s.req.query("severity"),Hw);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")}:{}}),Pj)}),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=Cj(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=Lr(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=Lr(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=Aj(l.path);if(Rj(u)){let _=d(l.path,"utf8");return s.body(_,200,{"Content-Type":u})}let f=d(l.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength),p=wj(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:Bd(s,"limit")??100}),Bj)),t.get("/api/runs/:id",s=>{let i=Rr(e.dal,ee(s,"id"));return i===null?s.notFound():D(s,i,qj)}),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,Pw)):D(s,o,Pw,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=>jw(s,e.dal,i=>D(s,i,Jj))),t.get("/api/runs/:id/steps/:step_id/transcript",s=>{let i=N_(e.dal,ee(s,"id"),ee(s,"step_id"));return i===null?s.notFound():qw(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=>jw(s,e.dal,i=>{let o=_w(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,x_(e.dal,{type:s.req.query("type")}),Xj)),t.get("/api/external-signals",s=>D(s,A_(e.dal,{unhandled:s.req.query("unhandled")==="true"}),Gj)),t.get("/api/attentions",s=>D(s,cr(e.dal,{unacked:s.req.query("unacked")==="true"}),Vj)),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=cr(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=cr(e.dal).find(_=>_.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=v_(e.dal,{status:o,pr_url:i});return D(s,a,Kj)}),t.get("/api/submitted-prs/:id",s=>{let i=ee(s,"id"),o=k_(e.dal,i);return o===null?s.notFound():D(s,o,Yj)}),t.get("/api/sessions",s=>D(s,e.dal.latestSessionSizes(),Fw)),t.get("/api/sessions/:team_name/:alias/history",s=>{let i=is(s.req.param("team_name"));return D(s,e.dal.sessionSizeHistory(i,s.req.param("alias")),Fw)}),t.post("/api/sessions/:team_name/:alias/compact",async s=>{let i=is(s.req.param("team_name"));try{let o=await __(e.dal,i,s.req.param("alias"));return D(s,o,a=>Uw("compacted",a.row))}catch(o){if(o instanceof ss)return s.text(o.message,409);throw o}}),t.post("/api/sessions/:team_name/:alias/refresh",async s=>{let i=is(s.req.param("team_name")),o=await gc(e.dal,i,s.req.param("alias"));return D(s,o,a=>Uw(`refreshed ${a.sessionid}`,a.row))}),t.get("/api/intake/state",s=>D(s,r,Ww)),t.post("/api/intake/scan",async s=>(r=await ao(e.dal),D(s,r,Ww))),t.get("/api/stats/run-throughput",s=>D(s,O_(e.dal),zj)),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=vc(e.dal,i),l=kc(e.dal,{project_id:i});return s.html(Re(`Metrics \u2014 ${o.name}`,Qj(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=Bd(s,"since_days");return s.json(vc(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=Bd(s,"since_days");return s.json(kc(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 jw(e,t,r){let n=Sc(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 qw(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 qw(e){let t=e.req.header("accept")??"";return t.includes("text/html")&&!t.includes("application/json")}function Nj(){let e=process.env.LMCTL_WEBUI_DIST;if(e!==void 0)return Ko(`${e}/index.html`)?qd(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=Sj(Ej(kj(import.meta.url)),"webui-dist");return Ko(`${n}/index.html`)?qd(n):null}function qd(e){if(!bj(e))return e;let t=vj(process.cwd(),e);return t.length===0?".":t}function xj(){return async(e,t)=>{await t(),e.header("Cache-Control","no-store")}}function ee(e,t){return Number(e.req.param(t))}function Bd(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 Aj(e){switch(Tj(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 Rj(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 Lj(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 Dw(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"&&Hw.includes(e)?e:{error:`invalid severity: ${String(e)}`}}function Cj(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 Mj(e){return`<h1>Status</h1><div class="grid">
1964
+ `))),t.post("/login",async s=>{let i=await s.req.parseBody(),o=typeof i.token=="string"?i.token:"";return kh(o)?(Gc(s,o),s.redirect("/",302)):s.html(Re("Login","<p>Invalid token</p>"),401)}),t.post("/logout",s=>(Ih(s),s.redirect("/login",302))),Oy(t,{dal:e.dal}),Nw(t,{dal:e.dal}),Ky(t,{dal:e.dal}),ow(t,{terminalSessionManager:e.terminalSessionManager}),fw(t,{persistentSessionManager:e.persistentSessionManager}),t.post("/api/teams/:team_name/refresh",async s=>{let i=is(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 gc(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>`)}),$h(t,{dal:e.dal}),Uh(t,{dal:e.dal}),t.get("/api/status",s=>D(s,Fi(e.dal),Mj)),t.get("/api/projects",s=>D(s,Ui(e.dal),jj)),t.get("/api/teams",s=>D(s,b_(e.dal),Fj)),t.get("/api/workflows",s=>D(s,Wi(e.dal),Uj)),t.get("/api/workflows/verify",s=>{let i=hy();return s.req.header("accept")?.includes("text/plain")?s.text(yy(i)):s.json(i)}),t.get("/api/jobs",s=>D(s,S_(e.dal,{status:s.req.query("status")}),Wj)),t.post("/api/uploads",s=>Cw(s,e.dal)),t.get("/api/jobs/:id",s=>{let i=Bi(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(()=>(Lo(),xy)),o=Bi(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),Dj)}),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=Lj(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=Dw(s.req.query("status"),Oj);if(typeof o=="string")return s.text(o,400);let a=Dw(s.req.query("severity"),Hw);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")}:{}}),Pj)}),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=Cj(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=Lr(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=Lr(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=Aj(l.path);if(Rj(u)){let _=d(l.path,"utf8");return s.body(_,200,{"Content-Type":u})}let f=d(l.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength),p=wj(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:Bd(s,"limit")??100}),Bj)),t.get("/api/runs/:id",s=>{let i=Rr(e.dal,ee(s,"id"));return i===null?s.notFound():D(s,i,qj)}),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(Hi(i)):s.json(i)}),t.get("/api/runs/:id/timeline",s=>{let i=Ji(e.dal,ee(s,"id"));return i===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(Xi(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?(zo(e.daemon),D(s,o,Pw)):D(s,o,Pw,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?(zo(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=>jw(s,e.dal,i=>D(s,i,Jj))),t.get("/api/runs/:id/steps/:step_id/transcript",s=>{let i=N_(e.dal,ee(s,"id"),ee(s,"step_id"));return i===null?s.notFound():qw(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=>jw(s,e.dal,i=>{let o=_w(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,x_(e.dal,{type:s.req.query("type")}),Xj)),t.get("/api/external-signals",s=>D(s,A_(e.dal,{unhandled:s.req.query("unhandled")==="true"}),Gj)),t.get("/api/attentions",s=>D(s,cr(e.dal,{unacked:s.req.query("unacked")==="true"}),Vj)),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=qi(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=cr(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);zo(e.daemon);let p=cr(e.dal).find(_=>_.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 zo(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=v_(e.dal,{status:o,pr_url:i});return D(s,a,Kj)}),t.get("/api/submitted-prs/:id",s=>{let i=ee(s,"id"),o=k_(e.dal,i);return o===null?s.notFound():D(s,o,Yj)}),t.get("/api/sessions",s=>D(s,e.dal.latestSessionSizes(),Fw)),t.get("/api/sessions/:team_name/:alias/history",s=>{let i=is(s.req.param("team_name"));return D(s,e.dal.sessionSizeHistory(i,s.req.param("alias")),Fw)}),t.post("/api/sessions/:team_name/:alias/compact",async s=>{let i=is(s.req.param("team_name"));try{let o=await __(e.dal,i,s.req.param("alias"));return D(s,o,a=>Uw("compacted",a.row))}catch(o){if(o instanceof ss)return s.text(o.message,409);throw o}}),t.post("/api/sessions/:team_name/:alias/refresh",async s=>{let i=is(s.req.param("team_name")),o=await gc(e.dal,i,s.req.param("alias"));return D(s,o,a=>Uw(`refreshed ${a.sessionid}`,a.row))}),t.get("/api/intake/state",s=>D(s,r,Ww)),t.post("/api/intake/scan",async s=>(r=await lo(e.dal),D(s,r,Ww))),t.get("/api/stats/run-throughput",s=>D(s,O_(e.dal),zj)),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=vc(e.dal,i),l=kc(e.dal,{project_id:i});return s.html(Re(`Metrics \u2014 ${o.name}`,Qj(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=Bd(s,"since_days");return s.json(vc(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=Bd(s,"since_days");return s.json(kc(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 jw(e,t,r){let n=Sc(t,ee(e,"id"),ee(e,"step_id"));return n===null?e.notFound():r(n)}function zo(e){e!==void 0&&e.runCycle().catch(()=>{})}function D(e,t,r,n=200){return qw(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 qw(e){let t=e.req.header("accept")??"";return t.includes("text/html")&&!t.includes("application/json")}function Nj(){let e=process.env.LMCTL_WEBUI_DIST;if(e!==void 0)return Yo(`${e}/index.html`)?qd(e):null;let t="src/serve/webui-dist";if(Yo(`${t}/index.html`))return t;let r="dist/serve/webui-dist";if(Yo(`${r}/index.html`))return r;let n=Sj(Ej(kj(import.meta.url)),"webui-dist");return Yo(`${n}/index.html`)?qd(n):null}function qd(e){if(!bj(e))return e;let t=vj(process.cwd(),e);return t.length===0?".":t}function xj(){return async(e,t)=>{await t(),e.header("Cache-Control","no-store")}}function ee(e,t){return Number(e.req.param(t))}function Bd(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 Aj(e){switch(Tj(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 Rj(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 Lj(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 Dw(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"&&Hw.includes(e)?e:{error:`invalid severity: ${String(e)}`}}function Cj(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 Mj(e){return`<h1>Status</h1><div class="grid">
1965
1965
  <div class="metric"><strong>${e.jobs.queued}</strong><br>queued jobs</div>
1966
1966
  <div class="metric"><strong>${e.jobs.done}</strong><br>done jobs</div>
1967
1967
  <div class="metric"><strong>${e.runs.active}</strong><br>active runs</div>
@@ -1995,7 +1995,7 @@ ${p.text}`,["approve","request_changes"],!0,s,t.writes_to_project_path===!0)));i
1995
1995
  <dt>submitted_at</dt><dd>${b(e.submitted_at)}</dd>
1996
1996
  <dt>last_scanned_at</dt><dd>${b(e.last_scanned_at??"\u2014")}</dd>
1997
1997
  <dt>last_known_state</dt><dd>${b(e.last_known_state??"\u2014")}</dd>
1998
- </dl>`}function Fw(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 Uw(e,t){return t===null?`<span>${b(e)}</span>`:`<span>${b(e)} ${b(t.team_name)}/${b(t.alias)}</span>`}function zj(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 Ww(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 Qj(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>
1998
+ </dl>`}function Fw(e){return`<h1>Sessions</h1>${me(["team","alias","session","input","cache","output","total","observed","actions"],e.map(t=>{let r=Ci(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 Uw(e,t){return t===null?`<span>${b(e)}</span>`:`<span>${b(e)} ${b(t.team_name)}/${b(t.alias)}</span>`}function zj(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 Ww(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 Qj(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
1999
  <h2>Request-changes rate</h2>
2000
2000
  <p>Total: ${b(n.request_changes)} of ${b(n.total)} steps (${b(n.rate_pct)})</p>
2001
2001
  ${me(["state","total steps","request_changes","rate"],s)}
@@ -2004,7 +2004,7 @@ ${p.text}`,["approve","request_changes"],!0,s,t.writes_to_project_path===!0)));i
2004
2004
  <h2>Retry counts (runs with &gt;1 attempt per state)</h2>
2005
2005
  ${me(["state","retried runs","avg attempts"],o)}
2006
2006
  <h2>Tool efficacy</h2>
2007
- ${me(["tool","invocations","successes (status=ok)","hit rate","avg latency ms","p50 ms","p95 ms"],a)}`}var Oj,Hw,Jw=T(()=>{"use strict";qc();as();xh();Ch();Wh();Ht();Qc();Uy();Vy();ew();aw();mw();hw();Rw();Ci();Mw();No();Oj=["open","assigned","closed","reopened"],Hw=["low","medium","high","critical"]});function eD(e){return Math.floor(e/6e4)*6e4}function tD(e){e.db.transaction(()=>{let t=e.getRollupCursor(),r=e.listSessionEventsSince(t);if(r.length!==0){for(let n of r)rD(e,n);e.setRollupCursor(r[r.length-1].id)}})()}function rD(e,t){let r=Date.now(),n=eD(t.timestamp_ms),s=n+6e4;if(t.kind==="tool_use"){e.addRollupValue({run_id:t.run_id,step_id:t.step_id,metric_kind:"tool_calls_count",value:1,bucket_start_ms:n,bucket_end_ms:s,updated_at:r});return}if(t.kind==="tool_result"){let i={};try{i=JSON.parse(t.payload)}catch{}let o=typeof i.elapsedMs=="number"&&i.elapsedMs>0?i.elapsedMs:0;o>0&&e.addRollupValue({run_id:t.run_id,step_id:t.step_id,metric_kind:"time_in_tool_use_ms",value:o,bucket_start_ms:n,bucket_end_ms:s,updated_at:r});return}if(t.kind==="text"){let i=Buffer.byteLength(t.payload,"utf8");e.addRollupValue({run_id:t.run_id,step_id:t.step_id,metric_kind:"message_delta_bytes",value:i,bucket_start_ms:n,bucket_end_ms:s,updated_at:r})}}function Xw(e,t=250){let r=setInterval(()=>{try{tD(e)}catch{}},t);return{stop(){clearInterval(r)}}}var Gw=T(()=>{"use strict"});function sD({dal:e}){let t=e.listProjects();for(let r of t){let n=e.query(`SELECT r.id, r.team_id
2007
+ ${me(["tool","invocations","successes (status=ok)","hit rate","avg latency ms","p50 ms","p95 ms"],a)}`}var Oj,Hw,Jw=T(()=>{"use strict";qc();as();xh();Ch();Wh();Ht();Qc();Uy();Vy();ew();aw();mw();hw();Rw();Mi();Mw();xo();Oj=["open","assigned","closed","reopened"],Hw=["low","medium","high","critical"]});function eD(e){return Math.floor(e/6e4)*6e4}function tD(e){e.db.transaction(()=>{let t=e.getRollupCursor(),r=e.listSessionEventsSince(t);if(r.length!==0){for(let n of r)rD(e,n);e.setRollupCursor(r[r.length-1].id)}})()}function rD(e,t){let r=Date.now(),n=eD(t.timestamp_ms),s=n+6e4;if(t.kind==="tool_use"){e.addRollupValue({run_id:t.run_id,step_id:t.step_id,metric_kind:"tool_calls_count",value:1,bucket_start_ms:n,bucket_end_ms:s,updated_at:r});return}if(t.kind==="tool_result"){let i={};try{i=JSON.parse(t.payload)}catch{}let o=typeof i.elapsedMs=="number"&&i.elapsedMs>0?i.elapsedMs:0;o>0&&e.addRollupValue({run_id:t.run_id,step_id:t.step_id,metric_kind:"time_in_tool_use_ms",value:o,bucket_start_ms:n,bucket_end_ms:s,updated_at:r});return}if(t.kind==="text"){let i=Buffer.byteLength(t.payload,"utf8");e.addRollupValue({run_id:t.run_id,step_id:t.step_id,metric_kind:"message_delta_bytes",value:i,bucket_start_ms:n,bucket_end_ms:s,updated_at:r})}}function Xw(e,t=250){let r=setInterval(()=>{try{tD(e)}catch{}},t);return{stop(){clearInterval(r)}}}var Gw=T(()=>{"use strict"});function sD({dal:e}){let t=e.listProjects();for(let r of t){let n=e.query(`SELECT r.id, r.team_id
2008
2008
  FROM run r
2009
2009
  JOIN job j ON j.id = r.job_id
2010
2010
  WHERE j.project_id = ?
@@ -2017,56 +2017,56 @@ ${p.text}`,["approve","request_changes"],!0,s,t.writes_to_project_path===!0)));i
2017
2017
  AND status = 'running'
2018
2018
  AND launch_source = 'terminal'
2019
2019
  ORDER BY started_at DESC, id DESC
2020
- LIMIT 1`,t,r)[0];return s===void 0?null:s.holder_pid!==null&&(s.holder_host===null||s.holder_host===Hd())?rr(s.holder_pid)?s:null:Qw(s)?s:null}function Qw(e){let t=Date.parse(e.last_heartbeat_at??e.started_at);return Number.isFinite(t)?Date.now()-t<=rE():!1}function tE(e,t){return e.holder_pid===null?e.started_at<t:!rr(e.holder_pid)}function rE(e=process.env){let t=e.LMCTL_INFLIGHT_TTL_MS;if(t===void 0||t.trim()==="")return zw;let r=Number(t);return!Number.isFinite(r)||r<=0?zw:r}function lD(e=process.env){let t=e.LMCTL_TERMINAL_LOCK_STALE_MS;if(t===void 0||t.trim()==="")return Zw;let r=Number(t);return!Number.isFinite(r)||r<=0?Zw:r}var zw,Zw,Fr=T(()=>{"use strict";sl();zw=8*60*60*1e3,Zw=12e4});async function $(e,t){if(e.dal!==void 0)return t(e.dal);let r=Ie({path:le()});try{return await t(r)}finally{r.close()}}function Z(e,t,r=["--json"]){let n=new Set(t),s=new Set(r),i=[],o={};for(let a=0;a<e.length;a+=1){let l=e[a];if(!l.startsWith("--")){i.push(l);continue}if(s.has(l)){o[l]=!0;continue}if(!n.has(l))return{positionals:i,flags:o,error:`unknown flag: ${l}`};let c=e[a+1];if(c===void 0||c.startsWith("--"))return{positionals:i,flags:o,error:`missing value for ${l}`};o[l]=c,a+=1}return{positionals:i,flags:o}}function P(e,t){let r=e.flags[t];return typeof r=="string"?r:void 0}function G(e,t){return e.flags[t]===!0}function ae(e,t){e.stdout.write(`${JSON.stringify(t,null,2)}
2020
+ LIMIT 1`,t,r)[0];return s===void 0?null:s.holder_pid!==null&&(s.holder_host===null||s.holder_host===Hd())?rr(s.holder_pid)?s:null:Qw(s)?s:null}function Qw(e){let t=Date.parse(e.last_heartbeat_at??e.started_at);return Number.isFinite(t)?Date.now()-t<=rE():!1}function tE(e,t){return e.holder_pid===null?e.started_at<t:!rr(e.holder_pid)}function rE(e=process.env){let t=e.LMCTL_INFLIGHT_TTL_MS;if(t===void 0||t.trim()==="")return zw;let r=Number(t);return!Number.isFinite(r)||r<=0?zw:r}function lD(e=process.env){let t=e.LMCTL_TERMINAL_LOCK_STALE_MS;if(t===void 0||t.trim()==="")return Zw;let r=Number(t);return!Number.isFinite(r)||r<=0?Zw:r}var zw,Zw,Fr=T(()=>{"use strict";sl();zw=8*60*60*1e3,Zw=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)}
2021
2021
  `)}function v(e,t){return e.stderr.write(`error: ${t}
2022
2022
  `),1}function je(e,t){let r=t instanceof Error?t.message:String(t);return e.stderr.write(`internal error: ${r}
2023
- `),2}var Le=T(()=>{"use strict";Ze();Xe()});import{hostname as iE}from"node:os";async function Zo(e){let t=e.finalize??"auto";await cE(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,iE())),s=cD(n,e.newMessage,{newMessageFrom:e.newMessageFrom??lE(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 sE(e.io,n.map(_=>_.id));let p=m instanceof Error?m.message:String(m);if(t==="caller")return{status:"error",receipt:p,prompt:s,queued:n,deliveredIds:[],wroteDelta:i,error:p};throw m}if(o&&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 sE(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 oE(e){await cE(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,iE())),n=dD(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
- ${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 cD(e,t,r={}){let n=e.map((s,i)=>[`--- queued message ${i+1} (mail #${s.id}, from ${aE(s)}, sent ${s.created_at}) ---`,s.payload].join(`
2023
+ `),2}var Le=T(()=>{"use strict";Ze();Xe()});import{hostname as iE}from"node:os";async function Qo(e){let t=e.finalize??"auto";await cE(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,iE())),s=cD(n,e.newMessage,{newMessageFrom:e.newMessageFrom??lE(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 sE(e.io,n.map(_=>_.id));let p=m instanceof Error?m.message:String(m);if(t==="caller")return{status:"error",receipt:p,prompt:s,queued:n,deliveredIds:[],wroteDelta:i,error:p};throw m}if(o&&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 sE(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 oE(e){await cE(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,iE())),n=dD(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
+ ${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 cD(e,t,r={}){let n=e.map((s,i)=>[`--- queued message ${i+1} (mail #${s.id}, from ${aE(s)}, sent ${s.created_at}) ---`,s.payload].join(`
2025
2025
  `));return t!==void 0&&n.push([`--- new message (from ${r.newMessageFrom??"operator"}) ---`,t].join(`
2026
2026
  `)),n.join(`
2027
2027
 
2028
2028
  `)}function dD(e){return e.map((r,n)=>[`--- queued response ${n+1} (mail #${r.id}, from ${aE(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(`
2029
2029
  `)).join(`
2030
2030
 
2031
- `)}function aE(e){return e.sender_teamfile===null||e.sender_alias===null?"operator":lE({teamfile:e.sender_teamfile,alias:e.sender_alias})}function lE(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)}
2031
+ `)}function aE(e){return e.sender_teamfile===null||e.sender_alias===null?"operator":lE({teamfile:e.sender_teamfile,alias:e.sender_alias})}function lE(e){return`${e.teamfile}:${e.alias}`}async function Zo(e,t,r){if(t.length!==0)try{await $(e,n=>{n.markMailDelivered(t,r,new Date().toISOString())})}catch(n){e.stderr.write(`warning: failed to mark queued mailbox mail delivered: ${n instanceof Error?n.message:String(n)}
2032
2032
  `)}}async function sE(e,t){if(t.length!==0)try{await $(e,r=>{r.clearMailDelivery(t)})}catch(r){e.stderr.write(`warning: failed to clear queued mailbox delivery marker: ${r instanceof Error?r.message:String(r)}
2033
- `)}}async function cE(e,t){try{await $(e,r=>{r.reclaimStaleMailboxDeliveries(new Date(Date.now()-uD(t)).toISOString())})}catch{}}function uD(e){let t=e.LMCTL_MAILBOX_DELIVERY_STALE_MS;if(t===void 0||t.trim()==="")return nE;let r=Number(t);return!Number.isFinite(r)||r<=0?nE:r}var nE,Xd=T(()=>{"use strict";vt();we();Le();nE=8*60*60*1e3});import{basename as fD}from"node:path";function fE(e,t){let r=new Date(t.now.getTime()-gr()).toISOString(),n=_E(e,r).filter(f=>!f.sender.teamfile.startsWith("prompt:")),s=_D(t.sender,n),i=hD(t.sender,n);i!==null&&i.teamfile===t.root&&!uE(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=>uE(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<mD;return{stop:l.length>=1&&d,chain:gD(a)}}function mE(e,t){let r=new Date(t.now.getTime()-gr()).toISOString(),n=_E(e,r),s=hE(t.sender,n);if(s.length===0)return null;let i=s[0];return i.sender.teamfile.startsWith("prompt:")?i.receiver.teamfile:i.sender.teamfile}function gr(e=process.env){let t=e.LMCTL_INFLIGHT_TTL_MS;if(t===void 0||t.trim()==="")return dE;let r=Number(t);return!Number.isFinite(r)||r<=0?dE:r}function pE(e){return`cross-team cycle detected (${e}); stopping to prevent a runaway loop.`}function pD(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 _E(e,t){return e.clearAgentInflightOlderThan(t),e.listAgentInflight().map(pD).filter(r=>Number.isFinite(r.at)&&new Date(r.at).toISOString()>=t).sort((r,n)=>r.at-n.at)}function _D(e,t,r={}){let n=new Map;for(let a of t)n.set(Ur(a.receiver),a);let s=[{...e,at:null}],i=e,o=new Set([Ur(e)]);for(let a=0;a<64;a+=1){let l=n.get(Ur(i));if(l===void 0)break;s[0]={...s[0],at:s[0].at??l.at};let c={...l.sender,at:l.at};if(l.sender.teamfile.startsWith("prompt:")&&r.includePromptSender!==!0)break;let d=Ur(l.sender);if(o.has(d))break;s.unshift(c),o.add(d),i=l.sender}return s}function hE(e,t){let r=Ur(e),n=new Set([r]),s=[r],i=[];for(let o=0;s.length>0&&o<128;o+=1){let a=s.shift();for(let l of t){let c=Ur(l.sender),d=Ur(l.receiver);c!==a&&d!==a||(i.includes(l)||i.push(l),n.has(c)||(n.add(c),s.push(c)),n.has(d)||(n.add(d),s.push(d)))}}return i.sort((o,a)=>o.at-a.at)}function hD(e,t){let r=hE(e,t);if(r.length===0)return null;let n=r[0];return n.sender.teamfile.startsWith("prompt:")?n.receiver:n.sender}function uE(e,t){return e.teamfile===t.teamfile&&e.alias===t.alias}function Ur(e){return`${e.teamfile}\0${e.alias}`}function gD(e){return e.map(t=>`${fD(t.teamfile)}:${t.alias}`).join(" \u2192 ")}var mD,dE,Qo=T(()=>{"use strict";mD=6e4,dE=8*60*60*1e3});function gE(e){if(e.length===0||!e.startsWith("---"))throw new xt("frontmatter must start at line 1 with `---` on its own line");let t=e.split(`
2034
- `);if(t[0]!=="---")throw new xt("frontmatter must start at line 1 with `---` on its own line");let r={},n=-1;for(let o=1;o<t.length;o++){let a=t[o];if(a==="---"){n=o;break}if(a.trim()==="")continue;let l=a.match(/^([a-zA-Z][a-zA-Z0-9_-]*)\s*:\s*(.*)$/);if(!l)throw new xt(`malformed frontmatter line ${o+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let c=l[1],d=l[2].trim();if(!yD.has(c))throw new xt(`unknown frontmatter key "${c}" \u2014 allowed keys: ${ea.join(", ")}`);r[c]=d}if(n===-1)throw new xt("frontmatter not closed (missing trailing `---` on its own line)");for(let o of ea)if(r[o]===void 0)throw new xt(`missing required frontmatter key "${o}" \u2014 required: ${ea.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 ea,yD,xt,yE=T(()=>{"use strict";ea=["title","description","members"],yD=new Set(ea),xt=class extends Error{constructor(t){super(t),this.name="FrontmatterError"}}});import{readFileSync as wD,writeFileSync as Y8,renameSync as z8,existsSync as EE}from"node:fs";import{basename as ED,resolve as bn,dirname as Gd}from"node:path";function bD(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 SD(e){return/^\s*_MEMBER_\s+\S/.test(e)}function vD(e){return/^\s*_SESSION_\s+\S/.test(e)}function kD(e){return/^\s*_SKILL_(?:\s|$)/.test(e)}function ta(e){let t=ED(e);return t.endsWith(".lmctl")?t.slice(0,-6):t}function De(e){let t=wD(e,"utf-8"),r=Gd(bn(e)),n=Kd(t,ta(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(`
2033
+ `)}}async function cE(e,t){try{await $(e,r=>{r.reclaimStaleMailboxDeliveries(new Date(Date.now()-uD(t)).toISOString())})}catch{}}function uD(e){let t=e.LMCTL_MAILBOX_DELIVERY_STALE_MS;if(t===void 0||t.trim()==="")return nE;let r=Number(t);return!Number.isFinite(r)||r<=0?nE:r}var nE,Xd=T(()=>{"use strict";vt();he();Le();nE=8*60*60*1e3});import{basename as fD}from"node:path";function fE(e,t){let r=new Date(t.now.getTime()-gr()).toISOString(),n=_E(e,r).filter(f=>!f.sender.teamfile.startsWith("prompt:")),s=_D(t.sender,n),i=hD(t.sender,n);i!==null&&i.teamfile===t.root&&!uE(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=>uE(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<mD;return{stop:l.length>=1&&d,chain:gD(a)}}function mE(e,t){let r=new Date(t.now.getTime()-gr()).toISOString(),n=_E(e,r),s=hE(t.sender,n);if(s.length===0)return null;let i=s[0];return i.sender.teamfile.startsWith("prompt:")?i.receiver.teamfile:i.sender.teamfile}function gr(e=process.env){let t=e.LMCTL_INFLIGHT_TTL_MS;if(t===void 0||t.trim()==="")return dE;let r=Number(t);return!Number.isFinite(r)||r<=0?dE:r}function pE(e){return`cross-team cycle detected (${e}); stopping to prevent a runaway loop.`}function pD(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 _E(e,t){return e.clearAgentInflightOlderThan(t),e.listAgentInflight().map(pD).filter(r=>Number.isFinite(r.at)&&new Date(r.at).toISOString()>=t).sort((r,n)=>r.at-n.at)}function _D(e,t,r={}){let n=new Map;for(let a of t)n.set(Ur(a.receiver),a);let s=[{...e,at:null}],i=e,o=new Set([Ur(e)]);for(let a=0;a<64;a+=1){let l=n.get(Ur(i));if(l===void 0)break;s[0]={...s[0],at:s[0].at??l.at};let c={...l.sender,at:l.at};if(l.sender.teamfile.startsWith("prompt:")&&r.includePromptSender!==!0)break;let d=Ur(l.sender);if(o.has(d))break;s.unshift(c),o.add(d),i=l.sender}return s}function hE(e,t){let r=Ur(e),n=new Set([r]),s=[r],i=[];for(let o=0;s.length>0&&o<128;o+=1){let a=s.shift();for(let l of t){let c=Ur(l.sender),d=Ur(l.receiver);c!==a&&d!==a||(i.includes(l)||i.push(l),n.has(c)||(n.add(c),s.push(c)),n.has(d)||(n.add(d),s.push(d)))}}return i.sort((o,a)=>o.at-a.at)}function hD(e,t){let r=hE(e,t);if(r.length===0)return null;let n=r[0];return n.sender.teamfile.startsWith("prompt:")?n.receiver:n.sender}function uE(e,t){return e.teamfile===t.teamfile&&e.alias===t.alias}function Ur(e){return`${e.teamfile}\0${e.alias}`}function gD(e){return e.map(t=>`${fD(t.teamfile)}:${t.alias}`).join(" \u2192 ")}var mD,dE,ea=T(()=>{"use strict";mD=6e4,dE=8*60*60*1e3});function gE(e){if(e.length===0||!e.startsWith("---"))throw new xt("frontmatter must start at line 1 with `---` on its own line");let t=e.split(`
2034
+ `);if(t[0]!=="---")throw new xt("frontmatter must start at line 1 with `---` on its own line");let r={},n=-1;for(let o=1;o<t.length;o++){let a=t[o];if(a==="---"){n=o;break}if(a.trim()==="")continue;let l=a.match(/^([a-zA-Z][a-zA-Z0-9_-]*)\s*:\s*(.*)$/);if(!l)throw new xt(`malformed frontmatter line ${o+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let c=l[1],d=l[2].trim();if(!yD.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,yD,xt,yE=T(()=>{"use strict";ta=["title","description","members"],yD=new Set(ta),xt=class extends Error{constructor(t){super(t),this.name="FrontmatterError"}}});import{readFileSync as wD,writeFileSync as Q8,renameSync as eY,existsSync as EE}from"node:fs";import{basename as ED,resolve as bn,dirname as Gd}from"node:path";function bD(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 SD(e){return/^\s*_MEMBER_\s+\S/.test(e)}function vD(e){return/^\s*_SESSION_\s+\S/.test(e)}function kD(e){return/^\s*_SKILL_(?:\s|$)/.test(e)}function ra(e){let t=ED(e);return t.endsWith(".lmctl")?t.slice(0,-6):t}function De(e){let t=wD(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(`
2035
2035
  `);i=l>=0?i.slice(l+1):""}let o=null;if(i.startsWith("---"))try{o=gE(i)}catch(l){if(l instanceof xt)s.push(`frontmatter: ${l.message}`);else throw l}let a=e.split(`
2036
2036
  `);for(let l=0;l<a.length;l++){let c=a[l],d=l+1;if(vD(c))throw new Error(`line ${d}: _SESSION_ is the legacy prefix. Rename to _MEMBER_. (line: ${c.trim()})`);if(kD(c)||!SD(c))continue;let u=bD(c);for(let p of Object.keys(u))if(!wE.includes(p))throw new Error(`line ${d}: unknown key "${p}" on _MEMBER_ line: ${c.trim()}
2037
- allowed keys: ${wE.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(!EE(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 TD.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),!EE(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 ra(e,t){return e.members.find(r=>r.alias===t)??e.members.find(r=>r.alias.toLowerCase()===t.toLowerCase())}var Vd,TD,wE,Yt=T(()=>{"use strict";yE();Vd="Lead",TD=new Set(["claude","codex","opencode","lmplayer","gemini","copilot","qwen","agy","ClaudeMock"]);wE=["alias","provider","sessionid","sessiondir","teamfile","model","effort"]});import{createHash as ID}from"node:crypto";import{existsSync as vs,mkdirSync as ND,readFileSync as SE,realpathSync as xD,writeFileSync as AD}from"node:fs";import{basename as TE,dirname as vE,resolve as kE}from"node:path";function Ee(e,t){let r=kE(e);if(vs(r))return xD(r);if(t!==void 0){let n=OD(e,r,t);if(n!==null)return n}return r}function bE(e,t){let r=vE(t),n=Kd(e,ta(t),{baseDir:r});for(let s of n.members)s.sessiondir!==void 0&&!s.sessiondir.startsWith("/")&&(s.sessiondir=kE(r,s.sessiondir));return n}function Pe(e,t){let r=Ee(e,LD(t)?t:void 0);if(t!==void 0){let n=t.getRootTeam(r);if(n!==null)return!vs(r)&&"upsertRootTeam"in t&&(ND(vE(r),{recursive:!0}),AD(r,n.raw_text,"utf8")),bE(n.raw_text,r);if(vs(r)){let s=SE(r,"utf8"),i=bE(s,r);return"upsertRootTeam"in t&&$D(i)&&CD(t,r,i,s),i}throw new Error(`teamfile not found: ${e}`)}if(!vs(r))throw new Error(`teamfile not found: ${e}`);return De(r)}function IE(e,t,r){let n=Ee(e,t),s=t.getRootTeam(n);s===null||!vs(n)||SE(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 LD(e){return typeof e=="object"&&e!==null&&"getRootTeam"in e&&"listRootTeams"in e}function OD(e,t,r){let n=r.getRootTeam(e)??r.getRootTeam(t);if(n!==null)return n.teamfile_path;let s=TE(e),i=ta(e),o=r.listRootTeams().filter(l=>TE(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>=RD)}function CD(e,t,r,n){let s=new Date().toISOString(),i={teamfile_path:t,name:r.name,raw_text:n,raw_sha256:ID("sha256").update(n).digest("hex"),registered_at:s,last_seeded_at:s};e.upsertRootTeam(i)}var RD,Rt=T(()=>{"use strict";Yt();RD=5});import{existsSync as MD}from"node:fs";import{dirname as NE}from"node:path";function PD(e){return jD.test(e)||DD.test(e)}function xE(e){return na.test(e)}function Wr(e){if(!e.includes(":"))return null;let t=e.lastIndexOf(":"),r=e.slice(0,t),n=e.slice(t+1);return!r.endsWith(".lmctl")||!na.test(n)?null:{teamfile:r,alias:n}}function He(e,t,r){if(!e.endsWith(".lmctl"))throw new ge(`lmctl: "${e}" doesn't look like a teamfile (expected .lmctl extension).`);if(!xE(t))throw new ge(`lmctl: "${t}" is not a valid alias (must match ${na.source}).`);let n=Ee(e,r);if(r===void 0&&!MD(n))throw new ge(`lmctl: teamfile not found: ${e}`);let s;try{s=Pe(n,r)}catch(o){throw new ge(`lmctl: ${e}: ${o instanceof Error?o.message:String(o)}`)}if(s.parseErrors.length>0)throw new ge(`lmctl: ${e}: ${s.parseErrors.join("; ")}`);let i=ra(s,t);if(i===void 0){let o=s.members.map(a=>a.alias).join(", ")||"(none)";throw new ge(`lmctl: alias "${t}" not found in ${e}.
2038
- Known aliases: ${o}`)}if(i.teamfile!==void 0){let o=zd(i,NE(n));return{teamfile:n,alias:i.alias,provider:o.provider,sessionid:o.session,sessiondir:o.sessiondir,isLead:!0,...o.model??i.model?{model:o.model??i.model}:{},...o.effort??i.effort?{effort:o.effort??i.effort}:{}}}if(i.session===void 0)throw new ge(`lmctl: alias "${i.alias}" in ${e} has no session ID yet.
2039
- Run: lmctl seed ${e}`);return{teamfile:n,alias:i.alias,provider:i.provider,sessionid:i.session,sessiondir:i.sessiondir??NE(n),isLead:At(s)?.alias===i.alias,...i.model!==void 0?{model:i.model}:{},...i.effort!==void 0?{effort:i.effort}:{}}}function yr(e,t){let{target:r,alias:n,flags:s}=t;if(s.run!==void 0||s.project!==void 0||s.workflow!==void 0){if(r!==void 0)return{mode:"error",message:`lmctl ${e.name}: --run/--project/--workflow (managed mode) are mutually exclusive with a positional target "${r}" \u2014 pick one form.`};let o={mode:"managed"};return s.run!==void 0&&(o.run=s.run),s.project!==void 0&&(o.project=s.project),s.workflow!==void 0&&(o.workflow=s.workflow),o}if(r!==void 0){let o=Wr(r);if(o!==null)return n!==void 0&&n!==o.alias?{mode:"error",message:`lmctl ${e.name}: got "${r}" AND second positional "${n}" \u2014 pick one form.`}:{mode:"ai-team",teamfile:o.teamfile,alias:o.alias};if(r.endsWith(".lmctl"))return n!==void 0?xE(n)?{mode:"ai-team",teamfile:r,alias:n}:{mode:"error",message:`lmctl ${e.name}: "${n}" is not a valid alias (must match ${na.source}).`}:e.allowsBareTeamfile?{mode:"ai-team",teamfile:r}:{mode:"error",message:`lmctl ${e.name}: alias required.
2037
+ allowed keys: ${wE.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(!EE(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 TD.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),!EE(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,TD,wE,Yt=T(()=>{"use strict";yE();Vd="Lead",TD=new Set(["claude","codex","opencode","lmplayer","gemini","copilot","qwen","agy","ClaudeMock"]);wE=["alias","provider","sessionid","sessiondir","teamfile","model","effort"]});import{createHash as ID}from"node:crypto";import{existsSync as vs,mkdirSync as ND,readFileSync as SE,realpathSync as xD,writeFileSync as AD}from"node:fs";import{basename as TE,dirname as vE,resolve as kE}from"node:path";function Ee(e,t){let r=kE(e);if(vs(r))return xD(r);if(t!==void 0){let n=OD(e,r,t);if(n!==null)return n}return r}function bE(e,t){let r=vE(t),n=Kd(e,ra(t),{baseDir:r});for(let s of n.members)s.sessiondir!==void 0&&!s.sessiondir.startsWith("/")&&(s.sessiondir=kE(r,s.sessiondir));return n}function Pe(e,t){let r=Ee(e,LD(t)?t:void 0);if(t!==void 0){let n=t.getRootTeam(r);if(n!==null)return!vs(r)&&"upsertRootTeam"in t&&(ND(vE(r),{recursive:!0}),AD(r,n.raw_text,"utf8")),bE(n.raw_text,r);if(vs(r)){let s=SE(r,"utf8"),i=bE(s,r);return"upsertRootTeam"in t&&$D(i)&&CD(t,r,i,s),i}throw new Error(`teamfile not found: ${e}`)}if(!vs(r))throw new Error(`teamfile not found: ${e}`);return De(r)}function IE(e,t,r){let n=Ee(e,t),s=t.getRootTeam(n);s===null||!vs(n)||SE(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 LD(e){return typeof e=="object"&&e!==null&&"getRootTeam"in e&&"listRootTeams"in e}function OD(e,t,r){let n=r.getRootTeam(e)??r.getRootTeam(t);if(n!==null)return n.teamfile_path;let s=TE(e),i=ra(e),o=r.listRootTeams().filter(l=>TE(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>=RD)}function CD(e,t,r,n){let s=new Date().toISOString(),i={teamfile_path:t,name:r.name,raw_text:n,raw_sha256:ID("sha256").update(n).digest("hex"),registered_at:s,last_seeded_at:s};e.upsertRootTeam(i)}var RD,Rt=T(()=>{"use strict";Yt();RD=5});import{existsSync as MD}from"node:fs";import{dirname as NE}from"node:path";function PD(e){return jD.test(e)||DD.test(e)}function xE(e){return sa.test(e)}function Wr(e){if(!e.includes(":"))return null;let t=e.lastIndexOf(":"),r=e.slice(0,t),n=e.slice(t+1);return!r.endsWith(".lmctl")||!sa.test(n)?null:{teamfile:r,alias:n}}function He(e,t,r){if(!e.endsWith(".lmctl"))throw new ye(`lmctl: "${e}" doesn't look like a teamfile (expected .lmctl extension).`);if(!xE(t))throw new ye(`lmctl: "${t}" is not a valid alias (must match ${sa.source}).`);let n=Ee(e,r);if(r===void 0&&!MD(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
+ Known aliases: ${o}`)}if(i.teamfile!==void 0){let o=zd(i,NE(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.
2039
+ Run: lmctl seed ${e}`);return{teamfile:n,alias:i.alias,provider:i.provider,sessionid:i.session,sessiondir:i.sessiondir??NE(n),isLead:At(s)?.alias===i.alias,...i.model!==void 0?{model:i.model}:{},...i.effort!==void 0?{effort:i.effort}:{}}}function yr(e,t){let{target:r,alias:n,flags:s}=t;if(s.run!==void 0||s.project!==void 0||s.workflow!==void 0){if(r!==void 0)return{mode:"error",message:`lmctl ${e.name}: --run/--project/--workflow (managed mode) are mutually exclusive with a positional target "${r}" \u2014 pick one form.`};let o={mode:"managed"};return s.run!==void 0&&(o.run=s.run),s.project!==void 0&&(o.project=s.project),s.workflow!==void 0&&(o.workflow=s.workflow),o}if(r!==void 0){let o=Wr(r);if(o!==null)return n!==void 0&&n!==o.alias?{mode:"error",message:`lmctl ${e.name}: got "${r}" AND second positional "${n}" \u2014 pick one form.`}:{mode:"ai-team",teamfile:o.teamfile,alias:o.alias};if(r.endsWith(".lmctl"))return n!==void 0?xE(n)?{mode:"ai-team",teamfile:r,alias:n}:{mode:"error",message:`lmctl ${e.name}: "${n}" is not a valid alias (must match ${sa.source}).`}:e.allowsBareTeamfile?{mode:"ai-team",teamfile:r}:{mode:"error",message:`lmctl ${e.name}: alias required.
2040
2040
  Use: lmctl ${e.name} ${r}:<alias> or lmctl ${e.name} ${r} <alias>`};if(PD(r)){if(n!==void 0)return{mode:"error",message:`lmctl ${e.name}: got a second positional "${n}" but "${r}" is not a teamfile path.`};if(!e.supportsRaw)return{mode:"error",message:`lmctl ${e.name}: "${r}" is a bare sessionid, but ${e.name} is teamfile-only (a sessionid carries no provider resume incantation).`};let a={mode:"ai-team-raw",sessionid:r};return s.provider!==void 0&&(a.provider=s.provider),a}return n!==void 0?{mode:"error",message:`lmctl ${e.name}: got a second positional "${n}" but "${r}" is not a teamfile path.
2041
2041
  Either drop the second arg, or pass <teamfile>.lmctl as the first arg.`}:{mode:"error",message:`lmctl ${e.name}: can't infer target type from "${r}".
2042
2042
  Expected one of: <path>.lmctl, <path>.lmctl:<alias>, <sessionid>.`}}if(s.session!==void 0){if(!e.supportsRaw)return{mode:"error",message:`lmctl ${e.name}: --session (raw mode) is not supported by ${e.name}.`};let o={mode:"ai-team-raw",sessionid:s.session};return s.provider!==void 0&&(o.provider=s.provider),o}return{mode:"error",message:`lmctl ${e.name}: a target is required.
2043
- Use: <path>.lmctl[:<alias>] | <path>.lmctl <alias> | <sessionid> | --run <id>`}}var ge,jD,DD,na,Lt=T(()=>{"use strict";Yt();Rt();ge=class extends Error{constructor(t){super(t),this.name="ChatTargetError"}},jD=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,DD=/^ses_[A-Za-z0-9_-]+$/,na=/^[A-Za-z][A-Za-z0-9_-]*$/});function FD(e=process.env){let t=e.LMCTL_DAEMON_MAILBOX_RELAY_MAX_BATCHES;if(t===void 0||t.trim()==="")return AE;let r=Number(t);return!Number.isFinite(r)||r<=0?AE:Math.max(1,Math.trunc(r))}async function LE(e){let t=e.env??process.env,r=e.maxBatches??FD(t),n=XD(e.dal),s={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0};JD(e.dal,t);let i=new Set;for(;s.scanned<r;){let o=e.dal.listRelayMailboxLanes(r).find(l=>!i.has(RE(l)));if(o===void 0)break;i.add(RE(o)),s.scanned+=1;let a=await UD(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 RE(e){return JSON.stringify([e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias])}async function UD(e,t,r,n){let s={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0},i=Pr(e,n.receiver_teamfile,n.receiver_alias);if(i.busy)return i.reason==="terminal-held"?{...s,skipped_terminal:1}:{...s,skipped_busy:1};let o=null;try{let a=He(n.receiver_teamfile,n.receiver_alias,e),l=hr(e,{receiver_teamfile:n.receiver_teamfile,receiver_alias:n.receiver_alias,sender_teamfile:n.sender_teamfile,sender_alias:n.sender_alias,ttlMs:gr()});if(!l.acquired)return{...s,skipped_busy:1};if(o=l.lease,n.message_type==="response"){let d=await oE({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 qD(d)}let c=await Zo({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 BD(e,c)}catch(a){return WD(e,n,`relay delivery error: ${a instanceof Error?a.message:String(a)}`)}finally{if(o!==null)try{e.releaseAgentInflight(o)}catch{}}}function WD(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 BD(e,t){let r={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0},n=HD(t),s=new Date().toISOString(),{marked:i}=e.markRelayRequestDeliveredAndEnqueueResponses(t.queued,n,s);return{...r,delivered:i,errors:t.status==="ok"?0:1}}function qD(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 HD(e){return e.status==="ok"?e.receipt:e.status==="stalled"?`relay delivery error: provider stalled${e.stalledAfterMs!==void 0?` after ${e.stalledAfterMs}ms`:""}
2044
- ${e.receipt}`:`relay delivery error: ${e.error}`}function JD(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 XD(e){return{stdout:{write:()=>{}},stderr:{write:()=>{}},dal:e}}var AE,OE=T(()=>{"use strict";Fr();Xd();Qo();Lt();AE=10});function ks(){let e=process.env.LMCTL_DAEMON_INTERVAL_MS;if(e===void 0||e.trim().length===0)return 5e3;let t=Number(e);return Number.isFinite(t)&&t>0?t:5e3}function VD(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($E);GD.has(s)&&r.add(s)}}return r}function CE(e){let t=e.intervalMs??ks(),r=e.runOnceFn??jr,n=new Set(e.features??VD()),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??Xw)(e.dal));let d=m=>{s.running&&(i=setTimeout(()=>{f.runCycle().finally(()=>d(t))},m))},u=m=>{s.running&&(o=setTimeout(()=>{l===null&&(l=ME(e.dal,n,e.monitorSessionActivityFn??yc,t,s).finally(()=>{l=null})),l.finally(()=>u(wc(e.dal,t)))},m))},f={state:s,runCycle:async()=>(a!==null||(a=KD(e.dal,r,e.collectSessionSizesFn??p_,e.scanIntakeFn??ao,e.monitorSessionActivityFn??yc,e.mailboxRelayFn??LE,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 KD(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,_=YD();try{if(l.has("durable-memory-policies")&&by({dal:e}),l.has("drift-detectors")&&Kw({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")&&(_=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 ME(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,h)=>g+h.scanned,0),c.last_intake_new_jobs=m.reduce((g,h)=>g+h.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=_.scanned,c.last_mailbox_relay_delivered=_.delivered,c.last_mailbox_relay_errors=_.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:_}}function YD(){return{scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0}}async function ME(e,t,r,n,s){if(!t.has("session-monitor"))return null;let i=wc(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 $E,GD,Zd=T(()=>{"use strict";qc();Ro();Ed();Ci();Gw();Yw();Ec();OE();$E=["durable-memory-policies","drift-detectors","intake","job-worker","mailbox-relay","session-size","session-monitor","rollup-updater"],GD=new Set($E)});function jE(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 DE=T(()=>{"use strict"});import{mkdirSync as zD,readFileSync as ZD,readdirSync as QD,statSync as eP,writeFileSync as tP}from"node:fs";import{dirname as rP,join as FE,sep as PE}from"node:path";function sa(e){return{s3:{async send(n){let s=n;switch(s._localfsTag){case UE:return nP(e,s.input);case WE:return sP(e,s.input);case BE:return iP(e,s.input);default:throw new Error("createLocalFsS3Client: unknown command")}}},commands:{ListObjectsV2Command:tu,GetObjectCommand:eu,PutObjectCommand:Qd}}}function nP(e,t){let r=qE(e,t.Key);return zD(rP(r),{recursive:!0}),tP(r,t.Body),{}}function sP(e,t){let r=qE(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 iP(e,t){let r=t.Prefix??"";HE(r);let s=oP(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 qE(e,t){return HE(t),FE(e,t)}function HE(e){if(e.split("/").includes(".."))throw new Error(`localfs-s3-client: refusing key/prefix with '..': ${e}`)}function oP(e){let t=[],r=(n,s)=>{let i;try{i=QD(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=FE(n,o.name);if(o.isDirectory())r(l,a);else if(o.isFile()){let c=PE==="/"?a:a.split(PE).join("/");t.push({key:c,lastModified:eP(l).mtime})}}};return r(e,""),t}var UE,WE,BE,Qd,eu,tu,ru=T(()=>{"use strict";UE="localfs-put",WE="localfs-get",BE="localfs-list",Qd=class{input;_localfsTag=UE;constructor(t){this.input=t}},eu=class{input;_localfsTag=WE;constructor(t){this.input=t}},tu=class{input;_localfsTag=BE;constructor(t){this.input=t}}});function JE(){return{put:0,get:0,list:0}}function nu(e,t=aP){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 aP,ia,iu=T(()=>{"use strict";aP={putUsd:5e-6,getUsd:40000000000000003e-23,listUsd:5e-6};ia=class{counts=JE();record(t,r=1){this.counts[t]+=r}peek(){return{...this.counts}}drain(){let t={...this.counts};return this.counts=JE(),t}estimateCostUsd(t){return nu(this.counts,t)}}});function XE(e){let t=e.now??Date.now,r=e.timers??lP,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(_){e.log?.(`[usage] publish rollup failed: ${_ instanceof Error?_.message:String(_)}`)}let m=f;if(e.readUserTotal!==void 0)try{m=await e.readUserTotal(c)}catch(_){e.log?.(`[usage] read user total failed: ${_ instanceof Error?_.message:String(_)}`),m=f}let p=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(_){e.log?.(`[usage] onQuotaExceeded threw: ${_ instanceof Error?_.message:String(_)}`)}}}function o(){return s=(s??Promise.resolve()).then(()=>i()).catch(()=>{}),s}let a=r.setInterval(()=>{o()},e.intervalMs);return{stop(){r.clearInterval(a)},flushNow(){return o()},isOverQuota(){return n!==null&&n===su(t())}}}var lP,GE=T(()=>{"use strict";iu();lP={setInterval:(e,t)=>setInterval(e,t),clearInterval:e=>clearInterval(e)}});var ou=T(()=>{"use strict";Mo();Do();Do()});function cP(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 dP(e){return e.reply_to!==void 0&&e.response!==void 0}function uP(e){if(typeof e!="object"||e===null)return;let t=e.conversation_id;return typeof t=="string"?t:void 0}function VE(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 oa,Is,KE=T(()=>{"use strict";ou();oa=class extends Error{name="MailboxFetchStoppedError";code="mailbox_fetch_stopped";constructor(t="MailboxFetchClient stopped before a response arrived"){super(t)}},Is=class{client;log;now;random;pending=new Map;requestHandler=null;stopped=!1;constructor(t){this.client=t.client,this.log=t.log??(()=>{}),this.now=t.now??Date.now,this.random=t.random??Math.random}onRequest(t){if(this.requestHandler!==null)throw new Error("MailboxFetchClient: onRequest handler already registered");this.requestHandler=t}async fetch(t,r){if(this.stopped)throw new oa("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=Kt(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(VE(c));return}d=()=>{this.pending.has(s)&&(this.pending.delete(s),l(VE(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 oa;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=cP(t);if(n===null){this.log("MailboxFetchClient: dropping non-envelope inbound payload");return}if(dP(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??uP(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:Kt(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 YE=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 zE=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,ZE=T(()=>{"use strict";cu="daemon:events"});function eT(e){return{kind:"prompt",prompt_id:e.prompt_id??Kt(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 QE,fu=T(()=>{"use strict";ou();QE="prompt:root"});function Ns(e){let t=e.split(".");if(t.length<2||t[1]===void 0||t[1]==="")return null;try{let r=JSON.parse(rT(t[1]));return typeof r.sub=="string"&&r.sub!==""?r.sub:null}catch{return null}}function fP(e){let t=e.split(".");if(t.length<2||t[1]===void 0||t[1]==="")return null;try{let r=JSON.parse(rT(t[1]));return typeof r.exp=="number"&&Number.isFinite(r.exp)?r.exp:null}catch{return null}}function tT(e,t=60){if(typeof e!="string"||e==="")return!0;let r=fP(e);return r===null?!0:Date.now()/1e3>=r-t}function rT(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 aa(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":mP},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 mP,pu=T(()=>{"use strict";mP="AWSCognitoIdentityProviderService.InitiateAuth"});import{chmodSync as nT,mkdirSync as sT,readFileSync as iT,writeFileSync as oT}from"node:fs";import{homedir as aT}from"node:os";import{dirname as lT,join as cT}from"node:path";function xs(){return process.env.LMCTL_DEVICE_AUTH_PATH??cT(aT(),".lmctl","device-auth.json")}function dT(){return process.env.LMCTL_TOKEN_PATH??cT(aT(),".lmctl","cli-tokens.json")}function _u(e=xs()){try{let t=JSON.parse(iT(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 uT(e,t=xs()){sT(lT(t),{recursive:!0,mode:448}),oT(t,JSON.stringify(e,null,2));try{nT(t,384)}catch{}}function hu(e,t=dT()){let r={};try{r=JSON.parse(iT(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};sT(lT(t),{recursive:!0,mode:448}),oT(t,JSON.stringify(s,null,2));try{nT(t,384)}catch{}}async function fT(e){let t=e.deviceAuthPath??xs(),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 aa({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??dT()),{idToken:n.idToken,userId:r.userId}}var gu=T(()=>{"use strict";pu()});import{existsSync as pP,realpathSync as _P}from"node:fs";import{dirname as hP}from"node:path";function yu(e){gP(e).catch(t=>{e.log?.(`[mailbox] prompt trigger failed: ${t instanceof Error?t.message:String(t)}`)})}async function gP(e){let t=e.payload.root_teamfile;try{t=_P(e.payload.root_teamfile)}catch(s){let i=`prompt root missing/unreadable: ${e.payload.root_teamfile}: ${s instanceof Error?s.message:String(s)}`;return await Sn(e.store,{rootTeamfile:e.payload.root_teamfile,receiverTeamfile:e.payload.root_teamfile,receiverAlias:"Lead",message:e.payload.text,response:null,status:"error",error_detail:i,log:e.log}),e.log?.(`[mailbox] ${i}`),{status:"error",response:null,error_detail:i}}if(e.store.getRootTeam(t)===null){let s=`prompt root is not registered: ${t}`;return await Sn(e.store,{rootTeamfile:t,receiverTeamfile:t,receiverAlias:"Lead",message:e.payload.text,response:null,status:"error",error_detail:s,log:e.log}),e.log?.(`[mailbox] ${s}`),{status:"error",response:null,error_detail:s}}let r=yP(t);if("error"in r)return await Sn(e.store,{rootTeamfile:t,receiverTeamfile:t,receiverAlias:"Lead",message:e.payload.text,response:null,status:"error",error_detail:r.error,log:e.log}),e.log?.(`[mailbox] ${r.error}`),{status:"error",response:null,error_detail:r.error};let n=hr(e.store,{receiver_teamfile:t,receiver_alias:r.alias,sender_teamfile:`prompt:${e.payload.prompt_id}`,sender_alias:"operator",ttlMs:TP(e.env??process.env)});if(!n.acquired){let s=EP(r.alias,n.current);return await Sn(e.store,{rootTeamfile:t,receiverTeamfile:t,receiverAlias:r.alias,message:e.payload.text,response:null,status:"error",error_detail:s,log:e.log}),e.log?.(`[mailbox] prompt rejected: ${s}`),{status:"error",response:null,error_detail:s}}try{let i=await(e.chat??St)({provider:r.provider,sessionId:r.sessionid,cwd:r.sessiondir,prompt:e.payload.text,env:e.env??process.env,alias:r.alias,permissionMode:"yolo",...e.timeoutMs!==void 0?{timeoutMs:e.timeoutMs}:{}}),o=i.status==="stalled",a=!o&&i.text.trim()==="",l=o?`provider stalled${i.stalledAfterMs!==void 0?` after ${i.stalledAfterMs}ms`:""}`:a?"provider returned empty response":null,c=o||a?"error":"ok";return await Sn(e.store,{rootTeamfile:t,receiverTeamfile:t,receiverAlias:r.alias,message:e.payload.text,response:c==="error"?null:i.text,status:c,error_detail:l,log:e.log}),{status:c,response:c==="error"?null:i.text,error_detail:l}}catch(s){let i=s instanceof Error?s.message:String(s);return await Sn(e.store,{rootTeamfile:t,receiverTeamfile:t,receiverAlias:r.alias,message:e.payload.text,response:null,status:"error",error_detail:i,log:e.log}),e.log?.(`[mailbox] prompt provider error: ${i}`),{status:"error",response:null,error_detail:i}}finally{try{e.store.releaseAgentInflight(n.lease)}catch(s){e.log?.(`[mailbox] failed to release prompt in-flight slot: ${s instanceof Error?s.message:String(s)}`)}}}function yP(e){if(!pP(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??hP(e)}}async function Sn(e,t){let r=_T(t.message),n=t.response===null?null:_T(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 _T(e){return e.length<=mT?{text:e,truncated:!1}:{text:e.slice(0,mT),truncated:!0}}function wP(e,t){return`${e} is servicing ${t.sender_alias} (${t.sender_teamfile}) since ${t.started_at}`}function EP(e,t){return t.sender_teamfile.startsWith("prompt:")?`${e} is busy servicing another prompt since ${t.started_at}`:wP(e,t)}function TP(e=process.env){let t=e.LMCTL_INFLIGHT_TTL_MS;if(t===void 0||t.trim()==="")return pT;let r=Number(t);return!Number.isFinite(r)||r<=0?pT:r}var mT,pT,hT=T(()=>{"use strict";vt();Yt();Fr();mT=256*1024,pT=30*60*1e3});import{chmodSync as bT,existsSync as bP,mkdirSync as ST,readFileSync as ua,writeFileSync as vT}from"node:fs";import{dirname as wu,resolve as la,join as kT}from"node:path";import{fileURLToPath as SP}from"node:url";import{homedir as IT}from"node:os";import{CognitoIdentityClient as vP,GetIdCommand as kP}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as gT}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as IP,ListObjectsV2Command as NP,PutObjectCommand as xP,S3Client as yT}from"@aws-sdk/client-s3";function Rs(e={}){let t=e.env??process.env,r=e.tfstatePath!==void 0?[e.tfstatePath]:$P(e.selfUrl),n={},s;for(let I of r)if(bP(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)??AP,a=i(t.LMCTL_NEXT_COGNITO_USER_POOL_ID,n.LMCTL_NEXT_COGNITO_USER_POOL_ID)??RP,l=i(t.LMCTL_NEXT_MAILBOX_BUCKET,t.LMCTL_NEXT_POLICY_BUCKET,n.LMCTL_NEXT_MAILBOX_BUCKET,n.LMCTL_NEXT_POLICY_BUCKET)??LP,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)??fa,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,_=da(t.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),g=da(t.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),h=da(t.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),S=da(t.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),y=i(t.LMCTL_MAILBOX_KEY),w=i(t.LMCTL_TOKEN_PATH);return f.config={identityPoolId:o,cognitoUserPoolId:a,cognitoClientId:d,region:c,mailboxBucket:l,...typeof p=="number"&&Number.isFinite(p)&&p>=100?{pollIntervalMs:p}:{},..._!==void 0?{readIntervalMs:_}:{},...g!==void 0?{heartbeatIdleMs:g}:{},...h!==void 0?{backoffReadIntervalMs:h}:{},...S!==void 0?{chatLogPollIntervalMs:S}:{},...y!==void 0?{mailboxKey:y}:{},...w!==void 0?{tokenPath:w}:{}},f}function OP(e){try{let t=ua(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 $P(e){let t=wu(SP(e??import.meta.url));return[la(t,"..","..","..","..","infra","terraform","terraform.tfstate"),la(t,"..","..","..","..","..","infra","terraform","terraform.tfstate"),la(t,"..","..","..","infra","terraform","terraform.tfstate"),la(t,"..","..","infra","terraform","terraform.tfstate")]}function da(e){if(e===void 0||e==="")return;let t=Number(e);if(!(!Number.isFinite(t)||t<=0))return t*1e3}function CP(e){let t=MP(e.intervalMs)??NT,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 MP(e){return typeof e=="number"&&Number.isFinite(e)&&e>0?e:void 0}async function xT(e){let t=e.tokenPath??kT(IT(),".lmctl","cli-tokens.json"),r=ET(e.tokenPath);if(tT(r.cognito?.idToken)&&_u()!==null)try{await fT({region:e.region,clientId:e.cognitoClientId??fa,cliTokensPath:t}),r=ET(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 TT({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=gT({identityId:i,logins:{[s]:n},clientConfig:{region:e.region}}),l=new yT({region:e.region,credentials:a}),c={ListObjectsV2Command:NP,GetObjectCommand:IP,PutObjectCommand:xP},d=Ns(n),u=d??i,f=e.deviceId,m=gn({identityId:i,userId:d,deviceId:f,mailboxKey:e.mailboxKey}),p=e.cursorStore,_;if(p!==void 0){let A=p.loadMailboxCursor(u,m);if(A!==null)_=A.last_processed_seq??void 0,e.log?.(`[mx-mailbox] resumed seq cursor=${_??"(sentinel)"} for user_id=${u}`);else{let Q=!1,B=0;for(;!Q&&B<2;){B+=1;try{let k=$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);_=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&&PP(k)){e.log?.(`[mx-mailbox] cached identityId rejected by cognito (${N}); clearing + refreshing`),DP(t),o=!1,i=await TT({tokenPath:t,region:e.region,identityPoolId:e.identityPoolId,idpProvider:s,idToken:n,log:e.log}),a=gT({identityId:i,logins:{[s]:n},clientConfig:{region:e.region}}),l=new yT({region:e.region,credentials:a}),m=gn({identityId:i,userId:d,deviceId:f,mailboxKey:e.mailboxKey});continue}e.log?.(`[mx-mailbox] cold start seq probe failed: ${N}`);break}}p.saveMailboxCursor({user_id:u,mailbox_key:m,last_processed_version_id:null,last_processed_seq:_??null,last_processed_at:new Date().toISOString()})}}let g=null,h=e.terminalSessionManager,S=e.persistentSessionManager,y=e.promptTriggerStore,w=new ia,I=new Dr({bucket:e.mailboxBucket,identityId:i,...d!==null?{userId:d}:{},...f!==void 0?{deviceId:f}:{},...e.mailboxKey!==void 0?{mailboxKey:e.mailboxKey}:{},s3:l,commands:c,selfRole:"agent",onS3Op:A=>w.record(A),onMessage:async A=>{if(h!==void 0&&au(A.payload)){h.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()})}}:{},..._!==void 0?{cursor:_}:{},...e.pollIntervalMs!==void 0?{pollIntervalMs:e.pollIntervalMs}:{},...e.readIntervalMs!==void 0?{readIntervalMs:e.readIntervalMs}:{},...e.heartbeatIdleMs!==void 0?{heartbeatIdleMs:e.heartbeatIdleMs}:{},...e.backoffReadIntervalMs!==void 0?{backoffReadIntervalMs:e.backoffReadIntervalMs}:{}});g=new Is({client:I,...e.log!==void 0?{log:e.log}:{}}),h!==void 0&&h.setPublish(async A=>I.putMessage({conversation_id:`terminal:${A.session_id}`,payload:A})),S!==void 0&&S.setPublish(async A=>I.putMessage({conversation_id:`provider:${A.session_id}`,payload:A}));let x=A=>I.putMessage({conversation_id:cu,payload:A});I.start();let U=e.chatLogTailStore===void 0?void 0:CP({store:e.chatLogTailStore,publishDaemonEvent:x,cursorKey:m,intervalMs:e.chatLogPollIntervalMs??e.readIntervalMs??e.pollIntervalMs??NT,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:XE({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 AT(e){let t=e.s3!==void 0&&e.commands!==void 0?{s3:e.s3,commands:e.commands}:sa(e.rootDir),r=gn({identityId:As,userId:As,deviceId:wT}),n=null,s=e.terminalSessionManager,i=e.persistentSessionManager,o=e.promptTriggerStore,a=new Dr({bucket:"local",identityId:As,userId:As,deviceId:wT,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??ca,readIntervalMs:e.readIntervalMs??ca,heartbeatIdleMs:e.heartbeatIdleMs??ca,backoffReadIntervalMs:e.backoffReadIntervalMs??ca});n=new Is({client:a,...e.log!==void 0?{log:e.log}:{}}),s!==void 0&&s.setPublish(async c=>a.putMessage({conversation_id:`terminal:${c.session_id}`,payload:c})),i!==void 0&&i.setPublish(async c=>a.putMessage({conversation_id:`provider:${c.session_id}`,payload:c}));let l=c=>a.putMessage({conversation_id:cu,payload:c});return a.start(),e.log?.(`[local-webui] agent polling ${r} (local-fs ${e.rootDir})`),{identityId:As,mailbox:a,fetchClient:n,publishDaemonEvent:l,async stop(){await n.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function ET(e){let t=e??kT(IT(),".lmctl","cli-tokens.json");try{let r=ua(t,"utf8");return JSON.parse(r)}catch{return{}}}function jP(e,t){if(t===void 0||t==="")return;let r={};try{let s=ua(e,"utf8");r=JSON.parse(s)}catch{}if(r.cognito===void 0)return;let n={...r,cognito:{...r.cognito,identityId:t}};ST(wu(e),{recursive:!0,mode:448}),vT(e,JSON.stringify(n,null,2));try{bT(e,384)}catch{}}function DP(e){let t={};try{let n=ua(e,"utf8");t=JSON.parse(n)}catch{return}if(t.cognito===void 0)return;let r={...t,cognito:{...t.cognito}};delete r.cognito.identityId,ST(wu(e),{recursive:!0,mode:448}),vT(e,JSON.stringify(r,null,2));try{bT(e,384)}catch{}}async function TT(e){e.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let r=await new vP({region:e.region}).send(new kP({IdentityPoolId:e.identityPoolId,Logins:{[e.idpProvider]:e.idToken}}));if(r.IdentityId===void 0||r.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{jP(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 PP(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 NT,ca,fa,AP,RP,LP,As,wT,Eu=T(()=>{"use strict";Po();ru();iu();GE();KE();YE();zE();ZE();fu();Mo();mu();gu();hT();NT=3e3,ca=1e3,fa="79u5jhkk46qofog661c9i0bdcs",AP="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",RP="us-east-1_4iUdFggDn",LP="lmctl-next-preview-mailbox-254332045686";As="local",wT="local"});import{spawn as vu}from"node:child_process";import{createInterface as RT}from"node:readline";var Tu,bu,Su,LT,OT=T(()=>{"use strict";fi();we();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=RT({input:n.stdout}),this.rl.on("line",s=>{r.generation===r.currentGeneration()&&this.handleLine(s)}),n.stderr?.on("data",s=>{if(r.generation!==r.currentGeneration())return;let i=s instanceof Buffer?s.toString("utf8"):String(s);r.emit({event_type:"notification",payload:{source:"stderr",text:i}})}),await this.rpc("initialize",{clientInfo:{name:"lmctl-dt3",title:"lmctl DT-3",version:"0.1.0"},capabilities:{experimentalApi:!1}}),this.notify("initialized",{}),this.threadId!==void 0&&this.threadId!=="")try{await this.rpc("thread/resume",{threadId:this.threadId,approvalPolicy:"never",sandbox:"danger-full-access"}),r.emit({event_type:"thread_started",payload:{thread_id:this.threadId,resumed:!0}})}catch{let i=(await this.rpc("thread/start",{cwd:t.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,o=typeof i?.id=="string"?i.id:void 0;this.threadId=o,r.emit({event_type:"thread_started",payload:{thread_id:o,resumed:!1}})}else{let i=(await this.rpc("thread/start",{cwd:t.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,o=typeof i?.id=="string"?i.id:void 0;this.threadId=o,r.emit({event_type:"thread_started",payload:{thread_id:o,resumed:!1}})}return n}async sendTurn(t){if(this.closed)throw new Error("codex_session_closed");if(this.threadId===void 0||this.threadId==="")throw new Error("codex_no_thread_id");let r=`local-${this.nextLocalTurnId++}`;this.ctx?.turnMap.set(r,{startedAt:Date.now()});try{let s=(await this.rpc("turn/start",{threadId:this.threadId,input:[{type:"text",text:t}]})).result?.turn,i=typeof s?.id=="string"?s.id:void 0;if(i!==void 0){let o=this.ctx?.turnMap.get(r);this.ctx?.turnMap.delete(r),o!==void 0&&this.ctx?.turnMap.set(i,o)}}catch(n){throw this.ctx?.turnMap.delete(r),n}}async stop(){if(this.closed=!0,this.rl!==void 0&&(this.rl.close(),this.rl=void 0),this.child?.stdin!==null&&this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}for(let t of this.pending.values())t.reject(new Error("codex_session_stopping"));this.pending.clear()}async rpc(t,r){if(this.child?.stdin===null||this.child===void 0)throw new Error("codex_child_unavailable");return new Promise((n,s)=>{let i=this.nextRpcId++;this.pending.set(i,{resolve:n,reject:s});let o=JSON.stringify({jsonrpc:"2.0",id:i,method:t,params:r});try{this.child.stdin.write(o+`
2043
+ Use: <path>.lmctl[:<alias>] | <path>.lmctl <alias> | <sessionid> | --run <id>`}}var ye,jD,DD,sa,Lt=T(()=>{"use strict";Yt();Rt();ye=class extends Error{constructor(t){super(t),this.name="ChatTargetError"}},jD=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,DD=/^ses_[A-Za-z0-9_-]+$/,sa=/^[A-Za-z][A-Za-z0-9_-]*$/});function FD(e=process.env){let t=e.LMCTL_DAEMON_MAILBOX_RELAY_MAX_BATCHES;if(t===void 0||t.trim()==="")return AE;let r=Number(t);return!Number.isFinite(r)||r<=0?AE:Math.max(1,Math.trunc(r))}async function LE(e){let t=e.env??process.env,r=e.maxBatches??FD(t),n=XD(e.dal),s={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0};JD(e.dal,t);let i=new Set;for(;s.scanned<r;){let o=e.dal.listRelayMailboxLanes(r).find(l=>!i.has(RE(l)));if(o===void 0)break;i.add(RE(o)),s.scanned+=1;let a=await UD(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 RE(e){return JSON.stringify([e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias])}async function UD(e,t,r,n){let s={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0},i=Pr(e,n.receiver_teamfile,n.receiver_alias);if(i.busy)return i.reason==="terminal-held"?{...s,skipped_terminal:1}:{...s,skipped_busy:1};let o=null;try{let a=He(n.receiver_teamfile,n.receiver_alias,e),l=hr(e,{receiver_teamfile:n.receiver_teamfile,receiver_alias:n.receiver_alias,sender_teamfile:n.sender_teamfile,sender_alias:n.sender_alias,ttlMs:gr()});if(!l.acquired)return{...s,skipped_busy:1};if(o=l.lease,n.message_type==="response"){let d=await oE({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 qD(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 BD(e,c)}catch(a){return WD(e,n,`relay delivery error: ${a instanceof Error?a.message:String(a)}`)}finally{if(o!==null)try{e.releaseAgentInflight(o)}catch{}}}function WD(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 BD(e,t){let r={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0},n=HD(t),s=new Date().toISOString(),{marked:i}=e.markRelayRequestDeliveredAndEnqueueResponses(t.queued,n,s);return{...r,delivered:i,errors:t.status==="ok"?0:1}}function qD(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 HD(e){return e.status==="ok"?e.receipt:e.status==="stalled"?`relay delivery error: provider stalled${e.stalledAfterMs!==void 0?` after ${e.stalledAfterMs}ms`:""}
2044
+ ${e.receipt}`:`relay delivery error: ${e.error}`}function JD(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 XD(e){return{stdout:{write:()=>{}},stderr:{write:()=>{}},dal:e}}var AE,OE=T(()=>{"use strict";Fr();Xd();ea();Lt();AE=10});function ks(){let e=process.env.LMCTL_DAEMON_INTERVAL_MS;if(e===void 0||e.trim().length===0)return 5e3;let t=Number(e);return Number.isFinite(t)&&t>0?t:5e3}function VD(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($E);GD.has(s)&&r.add(s)}}return r}function CE(e){let t=e.intervalMs??ks(),r=e.runOnceFn??jr,n=new Set(e.features??VD()),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??Xw)(e.dal));let d=m=>{s.running&&(i=setTimeout(()=>{f.runCycle().finally(()=>d(t))},m))},u=m=>{s.running&&(o=setTimeout(()=>{l===null&&(l=ME(e.dal,n,e.monitorSessionActivityFn??yc,t,s).finally(()=>{l=null})),l.finally(()=>u(wc(e.dal,t)))},m))},f={state:s,runCycle:async()=>(a!==null||(a=KD(e.dal,r,e.collectSessionSizesFn??p_,e.scanIntakeFn??lo,e.monitorSessionActivityFn??yc,e.mailboxRelayFn??LE,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 KD(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,_=YD();try{if(l.has("durable-memory-policies")&&by({dal:e}),l.has("drift-detectors")&&Kw({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")&&(_=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 ME(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,h)=>g+h.scanned,0),c.last_intake_new_jobs=m.reduce((g,h)=>g+h.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=_.scanned,c.last_mailbox_relay_delivered=_.delivered,c.last_mailbox_relay_errors=_.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:_}}function YD(){return{scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0}}async function ME(e,t,r,n,s){if(!t.has("session-monitor"))return null;let i=wc(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 $E,GD,Zd=T(()=>{"use strict";qc();Lo();Ed();Mi();Gw();Yw();Ec();OE();$E=["durable-memory-policies","drift-detectors","intake","job-worker","mailbox-relay","session-size","session-monitor","rollup-updater"],GD=new Set($E)});function jE(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 DE=T(()=>{"use strict"});import{mkdirSync as zD,readFileSync as ZD,readdirSync as QD,statSync as eP,writeFileSync as tP}from"node:fs";import{dirname as rP,join as FE,sep as PE}from"node:path";function ia(e){return{s3:{async send(n){let s=n;switch(s._localfsTag){case UE:return nP(e,s.input);case WE:return sP(e,s.input);case BE:return iP(e,s.input);default:throw new Error("createLocalFsS3Client: unknown command")}}},commands:{ListObjectsV2Command:tu,GetObjectCommand:eu,PutObjectCommand:Qd}}}function nP(e,t){let r=qE(e,t.Key);return zD(rP(r),{recursive:!0}),tP(r,t.Body),{}}function sP(e,t){let r=qE(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 iP(e,t){let r=t.Prefix??"";HE(r);let s=oP(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 qE(e,t){return HE(t),FE(e,t)}function HE(e){if(e.split("/").includes(".."))throw new Error(`localfs-s3-client: refusing key/prefix with '..': ${e}`)}function oP(e){let t=[],r=(n,s)=>{let i;try{i=QD(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=FE(n,o.name);if(o.isDirectory())r(l,a);else if(o.isFile()){let c=PE==="/"?a:a.split(PE).join("/");t.push({key:c,lastModified:eP(l).mtime})}}};return r(e,""),t}var UE,WE,BE,Qd,eu,tu,ru=T(()=>{"use strict";UE="localfs-put",WE="localfs-get",BE="localfs-list",Qd=class{input;_localfsTag=UE;constructor(t){this.input=t}},eu=class{input;_localfsTag=WE;constructor(t){this.input=t}},tu=class{input;_localfsTag=BE;constructor(t){this.input=t}}});function JE(){return{put:0,get:0,list:0}}function nu(e,t=aP){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 aP,oa,iu=T(()=>{"use strict";aP={putUsd:5e-6,getUsd:40000000000000003e-23,listUsd:5e-6};oa=class{counts=JE();record(t,r=1){this.counts[t]+=r}peek(){return{...this.counts}}drain(){let t={...this.counts};return this.counts=JE(),t}estimateCostUsd(t){return nu(this.counts,t)}}});function XE(e){let t=e.now??Date.now,r=e.timers??lP,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(_){e.log?.(`[usage] publish rollup failed: ${_ instanceof Error?_.message:String(_)}`)}let m=f;if(e.readUserTotal!==void 0)try{m=await e.readUserTotal(c)}catch(_){e.log?.(`[usage] read user total failed: ${_ instanceof Error?_.message:String(_)}`),m=f}let p=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(_){e.log?.(`[usage] onQuotaExceeded threw: ${_ instanceof Error?_.message:String(_)}`)}}}function o(){return s=(s??Promise.resolve()).then(()=>i()).catch(()=>{}),s}let a=r.setInterval(()=>{o()},e.intervalMs);return{stop(){r.clearInterval(a)},flushNow(){return o()},isOverQuota(){return n!==null&&n===su(t())}}}var lP,GE=T(()=>{"use strict";iu();lP={setInterval:(e,t)=>setInterval(e,t),clearInterval:e=>clearInterval(e)}});var ou=T(()=>{"use strict";jo();Po();Po()});function cP(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 dP(e){return e.reply_to!==void 0&&e.response!==void 0}function uP(e){if(typeof e!="object"||e===null)return;let t=e.conversation_id;return typeof t=="string"?t:void 0}function VE(e){let t=e.reason;if(t!==void 0)return t;try{return new DOMException("Aborted","AbortError")}catch{let r=new Error("Aborted");return r.name="AbortError",r}}var aa,Is,KE=T(()=>{"use strict";ou();aa=class extends Error{name="MailboxFetchStoppedError";code="mailbox_fetch_stopped";constructor(t="MailboxFetchClient stopped before a response arrived"){super(t)}},Is=class{client;log;now;random;pending=new Map;requestHandler=null;stopped=!1;constructor(t){this.client=t.client,this.log=t.log??(()=>{}),this.now=t.now??Date.now,this.random=t.random??Math.random}onRequest(t){if(this.requestHandler!==null)throw new Error("MailboxFetchClient: onRequest handler already registered");this.requestHandler=t}async fetch(t,r){if(this.stopped)throw new aa("MailboxFetchClient.fetch after stop()");if(typeof t.path!="string"||t.path==="")throw new Error("MailboxFetchClient.fetch: request.path is required");let n=t.method;if(typeof n!="string"||n==="")throw new Error("MailboxFetchClient.fetch: request.method is required");let s=Kt(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(VE(c));return}d=()=>{this.pending.has(s)&&(this.pending.delete(s),l(VE(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=cP(t);if(n===null){this.log("MailboxFetchClient: dropping non-envelope inbound payload");return}if(dP(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??uP(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:Kt(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 YE=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 zE=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,ZE=T(()=>{"use strict";cu="daemon:events"});function eT(e){return{kind:"prompt",prompt_id:e.prompt_id??Kt(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 QE,fu=T(()=>{"use strict";ou();QE="prompt:root"});function Ns(e){let t=e.split(".");if(t.length<2||t[1]===void 0||t[1]==="")return null;try{let r=JSON.parse(rT(t[1]));return typeof r.sub=="string"&&r.sub!==""?r.sub:null}catch{return null}}function fP(e){let t=e.split(".");if(t.length<2||t[1]===void 0||t[1]==="")return null;try{let r=JSON.parse(rT(t[1]));return typeof r.exp=="number"&&Number.isFinite(r.exp)?r.exp:null}catch{return null}}function tT(e,t=60){if(typeof e!="string"||e==="")return!0;let r=fP(e);return r===null?!0:Date.now()/1e3>=r-t}function rT(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":mP},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 mP,pu=T(()=>{"use strict";mP="AWSCognitoIdentityProviderService.InitiateAuth"});import{chmodSync as nT,mkdirSync as sT,readFileSync as iT,writeFileSync as oT}from"node:fs";import{homedir as aT}from"node:os";import{dirname as lT,join as cT}from"node:path";function xs(){return process.env.LMCTL_DEVICE_AUTH_PATH??cT(aT(),".lmctl","device-auth.json")}function dT(){return process.env.LMCTL_TOKEN_PATH??cT(aT(),".lmctl","cli-tokens.json")}function _u(e=xs()){try{let t=JSON.parse(iT(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 uT(e,t=xs()){sT(lT(t),{recursive:!0,mode:448}),oT(t,JSON.stringify(e,null,2));try{nT(t,384)}catch{}}function hu(e,t=dT()){let r={};try{r=JSON.parse(iT(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};sT(lT(t),{recursive:!0,mode:448}),oT(t,JSON.stringify(s,null,2));try{nT(t,384)}catch{}}async function fT(e){let t=e.deviceAuthPath??xs(),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??dT()),{idToken:n.idToken,userId:r.userId}}var gu=T(()=>{"use strict";pu()});import{existsSync as pP,realpathSync as _P}from"node:fs";import{dirname as hP}from"node:path";function yu(e){gP(e).catch(t=>{e.log?.(`[mailbox] prompt trigger failed: ${t instanceof Error?t.message:String(t)}`)})}async function gP(e){let t=e.payload.root_teamfile;try{t=_P(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=wP(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=hr(e.store,{receiver_teamfile:t,receiver_alias:r.alias,sender_teamfile:`prompt:${e.payload.prompt_id}`,sender_alias:"operator",ttlMs:SP(e.env??process.env)});if(!n.acquired){let s=bP(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 EP(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:yP(e.message)})}function yP(e){let t=e.replace(/\s+/gu," ").trim();return t.length<=500?t:`${t.slice(0,497)}...`}function wP(e){if(!pP(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??hP(e)}}async function EP(e,t){let r=_T(t.message),n=t.response===null?null:_T(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 _T(e){return e.length<=mT?{text:e,truncated:!1}:{text:e.slice(0,mT),truncated:!0}}function TP(e,t){return`${e} is servicing ${t.sender_alias} (${t.sender_teamfile}) since ${t.started_at}`}function bP(e,t){return t.sender_teamfile.startsWith("prompt:")?`${e} is busy servicing another prompt since ${t.started_at}`:TP(e,t)}function SP(e=process.env){let t=e.LMCTL_INFLIGHT_TTL_MS;if(t===void 0||t.trim()==="")return pT;let r=Number(t);return!Number.isFinite(r)||r<=0?pT:r}var mT,pT,hT=T(()=>{"use strict";vt();Yt();he();Fr();mT=256*1024,pT=30*60*1e3});import{chmodSync as bT,existsSync as vP,mkdirSync as ST,readFileSync as fa,writeFileSync as vT}from"node:fs";import{dirname as wu,resolve as ca,join as kT}from"node:path";import{fileURLToPath as kP}from"node:url";import{homedir as IT}from"node:os";import{CognitoIdentityClient as IP,GetIdCommand as NP}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as gT}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as xP,ListObjectsV2Command as AP,PutObjectCommand as RP,S3Client as yT}from"@aws-sdk/client-s3";function Rs(e={}){let t=e.env??process.env,r=e.tfstatePath!==void 0?[e.tfstatePath]:MP(e.selfUrl),n={},s;for(let I of r)if(vP(I)){n=CP(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)??LP,a=i(t.LMCTL_NEXT_COGNITO_USER_POOL_ID,n.LMCTL_NEXT_COGNITO_USER_POOL_ID)??OP,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,_=ua(t.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),g=ua(t.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),h=ua(t.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),S=ua(t.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),y=i(t.LMCTL_MAILBOX_KEY),w=i(t.LMCTL_TOKEN_PATH);return f.config={identityPoolId:o,cognitoUserPoolId:a,cognitoClientId:d,region:c,mailboxBucket:l,...typeof p=="number"&&Number.isFinite(p)&&p>=100?{pollIntervalMs:p}:{},..._!==void 0?{readIntervalMs:_}:{},...g!==void 0?{heartbeatIdleMs:g}:{},...h!==void 0?{backoffReadIntervalMs:h}:{},...S!==void 0?{chatLogPollIntervalMs:S}:{},...y!==void 0?{mailboxKey:y}:{},...w!==void 0?{tokenPath:w}:{}},f}function CP(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 MP(e){let t=wu(kP(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 jP(e){let t=DP(e.intervalMs)??NT,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 DP(e){return typeof e=="number"&&Number.isFinite(e)&&e>0?e:void 0}async function xT(e){let t=e.tokenPath??kT(IT(),".lmctl","cli-tokens.json"),r=ET(e.tokenPath);if(tT(r.cognito?.idToken)&&_u()!==null)try{await fT({region:e.region,clientId:e.cognitoClientId??ma,cliTokensPath:t}),r=ET(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 TT({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=gT({identityId:i,logins:{[s]:n},clientConfig:{region:e.region}}),l=new yT({region:e.region,credentials:a}),c={ListObjectsV2Command:AP,GetObjectCommand:xP,PutObjectCommand:RP},d=Ns(n),u=d??i,f=e.deviceId,m=gn({identityId:i,userId:d,deviceId:f,mailboxKey:e.mailboxKey}),p=e.cursorStore,_;if(p!==void 0){let A=p.loadMailboxCursor(u,m);if(A!==null)_=A.last_processed_seq??void 0,e.log?.(`[mx-mailbox] resumed seq cursor=${_??"(sentinel)"} for user_id=${u}`);else{let Q=!1,B=0;for(;!Q&&B<2;){B+=1;try{let k=Co(m,"web"),N=0,L;do{let F=await l.send(new c.ListObjectsV2Command({Bucket:e.mailboxBucket,Prefix:k,MaxKeys:1e3,...L!==void 0?{ContinuationToken:L}:{}}));for(let j of F.Contents??[]){let C=Mo(j.Key??"",m,"web");C!==void 0&&C>N&&(N=C)}L=F.IsTruncated===!0?F.NextContinuationToken:void 0}while(L!==void 0);_=N,e.log?.(`[mx-mailbox] cold start: seeded seq cursor=${N} for user_id=${u}`),Q=!0}catch(k){let N=k instanceof Error?k.message:String(k);if(o&&B===1&&UP(k)){e.log?.(`[mx-mailbox] cached identityId rejected by cognito (${N}); clearing + refreshing`),FP(t),o=!1,i=await TT({tokenPath:t,region:e.region,identityPoolId:e.identityPoolId,idpProvider:s,idToken:n,log:e.log}),a=gT({identityId:i,logins:{[s]:n},clientConfig:{region:e.region}}),l=new yT({region:e.region,credentials:a}),m=gn({identityId:i,userId:d,deviceId:f,mailboxKey:e.mailboxKey});continue}e.log?.(`[mx-mailbox] cold start seq probe failed: ${N}`);break}}p.saveMailboxCursor({user_id:u,mailbox_key:m,last_processed_version_id:null,last_processed_seq:_??null,last_processed_at:new Date().toISOString()})}}let g=null,h=e.terminalSessionManager,S=e.persistentSessionManager,y=e.promptTriggerStore,w=new oa,I=new Dr({bucket:e.mailboxBucket,identityId:i,...d!==null?{userId:d}:{},...f!==void 0?{deviceId:f}:{},...e.mailboxKey!==void 0?{mailboxKey:e.mailboxKey}:{},s3:l,commands:c,selfRole:"agent",onS3Op:A=>w.record(A),onMessage:async A=>{if(h!==void 0&&au(A.payload)){h.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()})}}:{},..._!==void 0?{cursor:_}:{},...e.pollIntervalMs!==void 0?{pollIntervalMs:e.pollIntervalMs}:{},...e.readIntervalMs!==void 0?{readIntervalMs:e.readIntervalMs}:{},...e.heartbeatIdleMs!==void 0?{heartbeatIdleMs:e.heartbeatIdleMs}:{},...e.backoffReadIntervalMs!==void 0?{backoffReadIntervalMs:e.backoffReadIntervalMs}:{}});g=new Is({client:I,...e.log!==void 0?{log:e.log}:{}}),h!==void 0&&h.setPublish(async A=>I.putMessage({conversation_id:`terminal:${A.session_id}`,payload:A})),S!==void 0&&S.setPublish(async A=>I.putMessage({conversation_id:`provider:${A.session_id}`,payload:A}));let x=A=>I.putMessage({conversation_id:cu,payload:A});I.start();let U=e.chatLogTailStore===void 0?void 0:jP({store:e.chatLogTailStore,publishDaemonEvent:x,cursorKey:m,intervalMs:e.chatLogPollIntervalMs??e.readIntervalMs??e.pollIntervalMs??NT,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:XE({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 AT(e){let t=e.s3!==void 0&&e.commands!==void 0?{s3:e.s3,commands:e.commands}:ia(e.rootDir),r=gn({identityId:As,userId:As,deviceId:wT}),n=null,s=e.terminalSessionManager,i=e.persistentSessionManager,o=e.promptTriggerStore,a=new Dr({bucket:"local",identityId:As,userId:As,deviceId:wT,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 Is({client:a,...e.log!==void 0?{log:e.log}:{}}),s!==void 0&&s.setPublish(async c=>a.putMessage({conversation_id:`terminal:${c.session_id}`,payload:c})),i!==void 0&&i.setPublish(async c=>a.putMessage({conversation_id:`provider:${c.session_id}`,payload:c}));let l=c=>a.putMessage({conversation_id:cu,payload:c});return a.start(),e.log?.(`[local-webui] agent polling ${r} (local-fs ${e.rootDir})`),{identityId:As,mailbox:a,fetchClient:n,publishDaemonEvent:l,async stop(){await n.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function ET(e){let t=e??kT(IT(),".lmctl","cli-tokens.json");try{let r=fa(t,"utf8");return JSON.parse(r)}catch{return{}}}function PP(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}};ST(wu(e),{recursive:!0,mode:448}),vT(e,JSON.stringify(n,null,2));try{bT(e,384)}catch{}}function FP(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,ST(wu(e),{recursive:!0,mode:448}),vT(e,JSON.stringify(r,null,2));try{bT(e,384)}catch{}}async function TT(e){e.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let r=await new IP({region:e.region}).send(new NP({IdentityPoolId:e.identityPoolId,Logins:{[e.idpProvider]:e.idToken}}));if(r.IdentityId===void 0||r.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{PP(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 UP(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 NT,da,ma,LP,OP,$P,As,wT,Eu=T(()=>{"use strict";Fo();ru();iu();GE();KE();YE();zE();ZE();fu();jo();mu();gu();hT();NT=3e3,da=1e3,ma="79u5jhkk46qofog661c9i0bdcs",LP="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",OP="us-east-1_4iUdFggDn",$P="lmctl-next-preview-mailbox-254332045686";As="local",wT="local"});import{spawn as vu}from"node:child_process";import{createInterface as RT}from"node:readline";var Tu,bu,Su,LT,OT=T(()=>{"use strict";mi();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=RT({input:n.stdout}),this.rl.on("line",s=>{r.generation===r.currentGeneration()&&this.handleLine(s)}),n.stderr?.on("data",s=>{if(r.generation!==r.currentGeneration())return;let i=s instanceof Buffer?s.toString("utf8"):String(s);r.emit({event_type:"notification",payload:{source:"stderr",text:i}})}),await this.rpc("initialize",{clientInfo:{name:"lmctl-dt3",title:"lmctl DT-3",version:"0.1.0"},capabilities:{experimentalApi:!1}}),this.notify("initialized",{}),this.threadId!==void 0&&this.threadId!=="")try{await this.rpc("thread/resume",{threadId:this.threadId,approvalPolicy:"never",sandbox:"danger-full-access"}),r.emit({event_type:"thread_started",payload:{thread_id:this.threadId,resumed:!0}})}catch{let i=(await this.rpc("thread/start",{cwd:t.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,o=typeof i?.id=="string"?i.id:void 0;this.threadId=o,r.emit({event_type:"thread_started",payload:{thread_id:o,resumed:!1}})}else{let i=(await this.rpc("thread/start",{cwd:t.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,o=typeof i?.id=="string"?i.id:void 0;this.threadId=o,r.emit({event_type:"thread_started",payload:{thread_id:o,resumed:!1}})}return n}async sendTurn(t){if(this.closed)throw new Error("codex_session_closed");if(this.threadId===void 0||this.threadId==="")throw new Error("codex_no_thread_id");let r=`local-${this.nextLocalTurnId++}`;this.ctx?.turnMap.set(r,{startedAt:Date.now()});try{let s=(await this.rpc("turn/start",{threadId:this.threadId,input:[{type:"text",text:t}]})).result?.turn,i=typeof s?.id=="string"?s.id:void 0;if(i!==void 0){let o=this.ctx?.turnMap.get(r);this.ctx?.turnMap.delete(r),o!==void 0&&this.ctx?.turnMap.set(i,o)}}catch(n){throw this.ctx?.turnMap.delete(r),n}}async stop(){if(this.closed=!0,this.rl!==void 0&&(this.rl.close(),this.rl=void 0),this.child?.stdin!==null&&this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}for(let t of this.pending.values())t.reject(new Error("codex_session_stopping"));this.pending.clear()}async rpc(t,r){if(this.child?.stdin===null||this.child===void 0)throw new Error("codex_child_unavailable");return new Promise((n,s)=>{let i=this.nextRpcId++;this.pending.set(i,{resolve:n,reject:s});let o=JSON.stringify({jsonrpc:"2.0",id:i,method:t,params:r});try{this.child.stdin.write(o+`
2045
2045
  `)}catch(a){this.pending.delete(i),s(a instanceof Error?a:new Error(String(a)))}})}notify(t,r){if(this.child?.stdin===null||this.child===void 0)return;let n=JSON.stringify({jsonrpc:"2.0",method:t,params:r});try{this.child.stdin.write(n+`
2046
2046
  `)}catch{}}handleLine(t){if(t.trim()==="")return;let r;try{r=JSON.parse(t)}catch{return}if(typeof r.id=="number"&&this.pending.has(r.id)){let o=this.pending.get(r.id);if(this.pending.delete(r.id),r.error!==void 0){let a=r.error,l=typeof a?.message=="string"&&a.message!==""?a.message:JSON.stringify(r.error);o.reject(new Error(`codex_rpc_error: ${l}`))}else o.resolve(r);return}let n=typeof r.method=="string"?r.method:void 0;if(n===void 0)return;let s=r.params??{},i=this.normalizeNotification(n,s);i!==void 0&&this.ctx?.emit(i)}normalizeNotification(t,r){if(t==="thread/started"){let n=r.thread;return typeof n?.id=="string"&&(this.threadId=n.id),{event_type:"thread_started",payload:{thread_id:this.threadId,raw:r}}}if(t==="turn/started")return{event_type:"turn_started",payload:{turn_id:r.turn?.id,thread_id:this.threadId}};if(t==="item/agentMessage/delta")return{event_type:"assistant_message_delta",payload:{text:typeof r.delta=="string"?r.delta:""}};if(t==="item/started"||t==="item/completed"){let n=r.item;return n?.type!==void 0&&n.type!=="agentMessage"&&n.type!=="userMessage"?{event_type:"tool_call",payload:{name:n.name??n.type,status:t==="item/started"?"started":"completed",item:n}}:{event_type:"notification",payload:{method:t,params:r}}}if(t==="turn/completed"){let n=r.turn;return typeof n?.id=="string"&&this.ctx?.turnMap.delete(n.id),{event_type:"turn_complete",payload:r}}if(t==="error"){let n=r.error;return{event_type:"error",payload:{message:typeof n?.message=="string"?n.message:JSON.stringify(r),raw:r}}}return{event_type:"notification",payload:{method:t,params:r}}}},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(`
2047
2047
  `);this.buffer=o.pop()??"";for(let a of o)this.handleLine(a)}),n.stderr?.on("data",s=>{if(r.generation!==r.currentGeneration())return;let i=s instanceof Buffer?s.toString("utf8"):String(s);r.emit({event_type:"notification",payload:{source:"stderr",text:i}})}),n}async sendTurn(t){if(this.closed)throw new Error("claude_session_closed");if(this.child===void 0||this.child.stdin===null)throw new Error("claude_child_unavailable");let r=`claude-${Date.now()}`;this.ctx?.turnMap.set(r,{startedAt:Date.now()});let n=JSON.stringify({type:"user",message:{role:"user",content:t}});try{this.child.stdin.write(n+`
2048
- `)}catch(s){throw this.ctx?.turnMap.delete(r),s instanceof Error?s:new Error(String(s))}}async stop(){if(this.closed=!0,this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}}handleLine(t){if(t.trim()==="")return;let r;try{r=JSON.parse(t)}catch{return}let n=typeof r.type=="string"?r.type:"";if(n==="system"&&r.subtype==="init"){let s=typeof r.session_id=="string"?r.session_id:void 0;s!==void 0&&s!==this.sessionIdSeen&&(this.sessionIdSeen=s,this.ctx?.emit({event_type:"thread_started",payload:{thread_id:s,raw:r}}));return}if(n==="assistant"){let i=r.message?.content;if(Array.isArray(i))for(let o of i)o.type==="text"&&typeof o.text=="string"&&o.text!==""&&this.ctx?.emit({event_type:"assistant_message_delta",payload:{text:o.text}});return}if(n==="result"){let s=typeof r.session_id=="string"?r.session_id:void 0;for(let i of Array.from(this.ctx?.turnMap.keys()??[]))this.ctx?.turnMap.delete(i);this.ctx?.emit({event_type:"turn_complete",payload:{result:r.result,session_id:s,raw:r}});return}this.ctx?.emit({event_type:"notification",payload:{method:n,params:r}})}},Su=class{child;ctx;rl;nextRpcId=1;pending=new Map;sessionId;closed=!1;async start(t,r){this.ctx=r;let n=t.cwd??process.cwd();if(t.provider==="opencode")try{ui(n)}catch(a){V({event:"opencode_config_install_failed",cwd:n,error_message:a instanceof Error?a.message:String(a)})}let s=vu(t.command,t.args,{cwd:n,env:t.env??process.env,stdio:["pipe","pipe","pipe"]});this.child=s,this.rl=RT({input:s.stdout}),this.rl.on("line",a=>{r.generation===r.currentGeneration()&&this.handleLine(a)}),s.stderr?.on("data",a=>{if(r.generation!==r.currentGeneration())return;let l=a instanceof Buffer?a.toString("utf8"):String(a);r.emit({event_type:"notification",payload:{source:"stderr",text:l}})}),await this.rpc("initialize",{protocolVersion:1,clientInfo:{name:"lmctl-dt3",version:"0.1.0"},clientCapabilities:{}}),this.notify("notifications/initialized",{});let o=(await this.rpc("session/new",{cwd:t.cwd??process.cwd(),mcpServers:[]})).result;return this.sessionId=typeof o?.sessionId=="string"?o.sessionId:void 0,r.emit({event_type:"thread_started",payload:{thread_id:this.sessionId,raw:o}}),s}async sendTurn(t){if(this.closed)throw new Error("acp_session_closed");if(this.sessionId===void 0)throw new Error("acp_no_session_id");let r=`acp-${Date.now()}`;this.ctx?.turnMap.set(r,{startedAt:Date.now()});try{let s=(await this.rpc("session/prompt",{sessionId:this.sessionId,prompt:[{type:"text",text:t}]})).result;this.ctx?.emit({event_type:"turn_complete",payload:{stopReason:s?.stopReason,raw:s}})}finally{this.ctx?.turnMap.delete(r)}}async stop(){if(this.closed=!0,this.rl!==void 0&&(this.rl.close(),this.rl=void 0),this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}for(let t of this.pending.values())t.reject(new Error("acp_session_stopping"));this.pending.clear()}async rpc(t,r){if(this.child?.stdin===null||this.child===void 0)throw new Error("acp_child_unavailable");return new Promise((n,s)=>{let i=this.nextRpcId++;this.pending.set(i,{resolve:n,reject:s});let o=JSON.stringify({jsonrpc:"2.0",id:i,method:t,params:r});try{this.child.stdin.write(o+`
2048
+ `)}catch(s){throw this.ctx?.turnMap.delete(r),s instanceof Error?s:new Error(String(s))}}async stop(){if(this.closed=!0,this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}}handleLine(t){if(t.trim()==="")return;let r;try{r=JSON.parse(t)}catch{return}let n=typeof r.type=="string"?r.type:"";if(n==="system"&&r.subtype==="init"){let s=typeof r.session_id=="string"?r.session_id:void 0;s!==void 0&&s!==this.sessionIdSeen&&(this.sessionIdSeen=s,this.ctx?.emit({event_type:"thread_started",payload:{thread_id:s,raw:r}}));return}if(n==="assistant"){let i=r.message?.content;if(Array.isArray(i))for(let o of i)o.type==="text"&&typeof o.text=="string"&&o.text!==""&&this.ctx?.emit({event_type:"assistant_message_delta",payload:{text:o.text}});return}if(n==="result"){let s=typeof r.session_id=="string"?r.session_id:void 0;for(let i of Array.from(this.ctx?.turnMap.keys()??[]))this.ctx?.turnMap.delete(i);this.ctx?.emit({event_type:"turn_complete",payload:{result:r.result,session_id:s,raw:r}});return}this.ctx?.emit({event_type:"notification",payload:{method:n,params:r}})}},Su=class{child;ctx;rl;nextRpcId=1;pending=new Map;sessionId;closed=!1;async start(t,r){this.ctx=r;let n=t.cwd??process.cwd();if(t.provider==="opencode")try{fi(n)}catch(a){H({event:"opencode_config_install_failed",cwd:n,error_message:a instanceof Error?a.message:String(a)})}let s=vu(t.command,t.args,{cwd:n,env:t.env??process.env,stdio:["pipe","pipe","pipe"]});this.child=s,this.rl=RT({input:s.stdout}),this.rl.on("line",a=>{r.generation===r.currentGeneration()&&this.handleLine(a)}),s.stderr?.on("data",a=>{if(r.generation!==r.currentGeneration())return;let l=a instanceof Buffer?a.toString("utf8"):String(a);r.emit({event_type:"notification",payload:{source:"stderr",text:l}})}),await this.rpc("initialize",{protocolVersion:1,clientInfo:{name:"lmctl-dt3",version:"0.1.0"},clientCapabilities:{}}),this.notify("notifications/initialized",{});let o=(await this.rpc("session/new",{cwd:t.cwd??process.cwd(),mcpServers:[]})).result;return this.sessionId=typeof o?.sessionId=="string"?o.sessionId:void 0,r.emit({event_type:"thread_started",payload:{thread_id:this.sessionId,raw:o}}),s}async sendTurn(t){if(this.closed)throw new Error("acp_session_closed");if(this.sessionId===void 0)throw new Error("acp_no_session_id");let r=`acp-${Date.now()}`;this.ctx?.turnMap.set(r,{startedAt:Date.now()});try{let s=(await this.rpc("session/prompt",{sessionId:this.sessionId,prompt:[{type:"text",text:t}]})).result;this.ctx?.emit({event_type:"turn_complete",payload:{stopReason:s?.stopReason,raw:s}})}finally{this.ctx?.turnMap.delete(r)}}async stop(){if(this.closed=!0,this.rl!==void 0&&(this.rl.close(),this.rl=void 0),this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}for(let t of this.pending.values())t.reject(new Error("acp_session_stopping"));this.pending.clear()}async rpc(t,r){if(this.child?.stdin===null||this.child===void 0)throw new Error("acp_child_unavailable");return new Promise((n,s)=>{let i=this.nextRpcId++;this.pending.set(i,{resolve:n,reject:s});let o=JSON.stringify({jsonrpc:"2.0",id:i,method:t,params:r});try{this.child.stdin.write(o+`
2049
2049
  `)}catch(a){this.pending.delete(i),s(a instanceof Error?a:new Error(String(a)))}})}notify(t,r){if(this.child?.stdin===null||this.child===void 0)return;let n=JSON.stringify({jsonrpc:"2.0",method:t,params:r});try{this.child.stdin.write(n+`
2050
2050
  `)}catch{}}handleLine(t){if(t.trim()==="")return;let r;try{r=JSON.parse(t)}catch{return}if(typeof r.id=="number"&&this.pending.has(r.id)){let s=this.pending.get(r.id);if(this.pending.delete(r.id),r.error!==void 0){let i=r.error,o=typeof i?.message=="string"&&i.message!==""?i.message:JSON.stringify(r.error);s.reject(new Error(`acp_rpc_error: ${o}`))}else s.resolve(r);return}let n=typeof r.method=="string"?r.method:void 0;if(n!==void 0){if(typeof r.id=="number"){let s=JSON.stringify({jsonrpc:"2.0",id:r.id,error:{code:-32601,message:`Method not found: ${n} (lmctl dt-3 does not implement server-side ACP methods)`}});try{this.child?.stdin?.write(s+`
2051
- `)}catch{}this.ctx?.emit({event_type:"notification",payload:{kind:"unhandled_request",method:n,id:r.id,params:r.params}});return}if(n==="session/update"){let s=r.params,i=s?.update;if((typeof i?.sessionUpdate=="string"?i.sessionUpdate:"")==="agent_message_chunk"){let a=i?.content,l=typeof a?.text=="string"?a.text:"";if(l!==""){this.ctx?.emit({event_type:"assistant_message_delta",payload:{text:l}});return}}this.ctx?.emit({event_type:"notification",payload:{method:n,params:s}});return}this.ctx?.emit({event_type:"notification",payload:{method:n,params:r.params}})}}},LT=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 FP}from"node:crypto";import{existsSync as Lz,mkdirSync as UP,readFileSync as WP,writeFileSync as BP}from"node:fs";import{homedir as qP}from"node:os";import{dirname as HP,join as JP}from"node:path";function ma(){return process.env.LMCTL_DEVICE_FILE??JP(qP(),".lmctl","device.json")}function Br(e=ma()){let t=process.env.LMCTL_DEVICE_ID;if(t!==void 0&&t!=="")return{device_id:t,created_at:"env"};try{let r=JSON.parse(WP(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=ma()){let t=Br(e);if(t!==null&&t.created_at!=="env")return t;let r={device_id:FP(),created_at:new Date().toISOString()};return UP(HP(e),{recursive:!0}),BP(e,`${JSON.stringify(r,null,2)}
2052
- `,{encoding:"utf8",mode:384}),r}var Iu=T(()=>{"use strict"});import*as $T from"node:child_process";function GP(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[VP]==="1",n=t.spawnSync??$T.spawnSync,s=new Set,i=[];for(let o of e){if(s.has(o))continue;s.add(o);let a=pa[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=GP(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 CT(e){if(e.binary==="<unknown>")return`unknown provider "${e.provider}" \u2014 no binary mapping (allowed: ${Object.keys(pa).join(", ")})`;let t=XP[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 pa,XP,VP,MT=T(()=>{"use strict";pa={claude:"claude",codex:"codex",copilot:"copilot",gemini:"gemini",opencode:"opencode",lmplayer:"lmplayer",qwen:"qwen",agy:"agy"},XP={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"};VP="LMCTL_SKIP_BINARY_CHECK"});var JT={};ye(JT,{ProviderBinaryPreflightError:()=>_a,__setProviderBinaryCheckForTest:()=>nF,bootstrapAgentRestMailbox:()=>PT,publishRegisteredWorkflowsOnStart:()=>DT,resolveLocalMailboxDir:()=>qT,resolveLocalWebuiDir:()=>BT,resolveServeConfig:()=>FT,runProviderBinaryPreflight:()=>WT,runServe:()=>QP,validateServeArgs:()=>HT});import{randomBytes as KP}from"node:crypto";import{existsSync as YP}from"node:fs";import{homedir as zP}from"node:os";import{isAbsolute as jT,resolve as xu}from"node:path";async function QP(e,t={stdout:process.stdout,stderr:process.stderr}){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(ZP),0;let r=HT(e,process.env);if(typeof r=="string")return t.stderr.write(`error: ${r}
2053
- `),2;try{WT(t)}catch(y){return 1}let n=Ie({path:le()}),s={portCli:sF(e)},i;try{i=FT({dal:n,cli:s,env:process.env,parsed:r,io:t})}catch(y){return n.close(),t.stderr.write(`error: ${y instanceof Error?y.message:String(y)}
2054
- `),2}process.env.LMCTL_API_URL=i.apiUrl,process.env.LMCTL_API_TOKEN=i.apiToken,process.env.LMCTL_API_PORT=String(i.port),jE(n);let o;if(r.localWebui!==void 0){let y=BT(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=qT(process.env),{s3:I,commands:x}=sa(w);o={webuiDir:y,rootDir:w,s3:I,commands:x},t.stdout.write(`local webui: serving SPA from ${y}; mailbox store ${w}
2051
+ `)}catch{}this.ctx?.emit({event_type:"notification",payload:{kind:"unhandled_request",method:n,id:r.id,params:r.params}});return}if(n==="session/update"){let s=r.params,i=s?.update;if((typeof i?.sessionUpdate=="string"?i.sessionUpdate:"")==="agent_message_chunk"){let a=i?.content,l=typeof a?.text=="string"?a.text:"";if(l!==""){this.ctx?.emit({event_type:"assistant_message_delta",payload:{text:l}});return}}this.ctx?.emit({event_type:"notification",payload:{method:n,params:s}});return}this.ctx?.emit({event_type:"notification",payload:{method:n,params:r.params}})}}},LT=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 WP}from"node:crypto";import{existsSync as Mz,mkdirSync as BP,readFileSync as qP,writeFileSync as HP}from"node:fs";import{homedir as JP}from"node:os";import{dirname as XP,join as GP}from"node:path";function pa(){return process.env.LMCTL_DEVICE_FILE??GP(JP(),".lmctl","device.json")}function Br(e=pa()){let t=process.env.LMCTL_DEVICE_ID;if(t!==void 0&&t!=="")return{device_id:t,created_at:"env"};try{let r=JSON.parse(qP(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=Br(e);if(t!==null&&t.created_at!=="env")return t;let r={device_id:WP(),created_at:new Date().toISOString()};return BP(XP(e),{recursive:!0}),HP(e,`${JSON.stringify(r,null,2)}
2052
+ `,{encoding:"utf8",mode:384}),r}var Iu=T(()=>{"use strict"});import*as $T from"node:child_process";function KP(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[YP]==="1",n=t.spawnSync??$T.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=KP(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 CT(e){if(e.binary==="<unknown>")return`unknown provider "${e.provider}" \u2014 no binary mapping (allowed: ${Object.keys(_a).join(", ")})`;let t=VP[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,VP,YP,MT=T(()=>{"use strict";_a={claude:"claude",codex:"codex",copilot:"copilot",gemini:"gemini",opencode:"opencode",lmplayer:"lmplayer",qwen:"qwen",agy:"agy"},VP={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"};YP="LMCTL_SKIP_BINARY_CHECK"});var JT={};we(JT,{ProviderBinaryPreflightError:()=>ha,__setProviderBinaryCheckForTest:()=>iF,bootstrapAgentRestMailbox:()=>PT,publishRegisteredWorkflowsOnStart:()=>DT,resolveLocalMailboxDir:()=>qT,resolveLocalWebuiDir:()=>BT,resolveServeConfig:()=>FT,runProviderBinaryPreflight:()=>WT,runServe:()=>tF,validateServeArgs:()=>HT});import{randomBytes as zP}from"node:crypto";import{existsSync as ZP}from"node:fs";import{homedir as QP}from"node:os";import{isAbsolute as jT,resolve as xu}from"node:path";async function tF(e,t={stdout:process.stdout,stderr:process.stderr}){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(eF),0;let r=HT(e,process.env);if(typeof r=="string")return t.stderr.write(`error: ${r}
2053
+ `),2;try{WT(t)}catch(y){return 1}let n=Ie({path:le()}),s={portCli:oF(e)},i;try{i=FT({dal:n,cli:s,env:process.env,parsed:r,io:t})}catch(y){return n.close(),t.stderr.write(`error: ${y instanceof Error?y.message:String(y)}
2054
+ `),2}process.env.LMCTL_API_URL=i.apiUrl,process.env.LMCTL_API_TOKEN=i.apiToken,process.env.LMCTL_API_PORT=String(i.port),jE(n);let o;if(r.localWebui!==void 0){let y=BT(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=qT(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}
2055
2055
  `)}let a=r.noDaemon?void 0:CE({dal:n,intervalMs:ks()}),l=o!==void 0?{missing:[],tfstateCandidatesChecked:[]}:Rs({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)`)+`
2056
- `);let c=await rF({log:y=>t.stderr.write(`${y}
2057
- `)}),d=new qo({adapterFactory:LT,publish:async()=>{throw new Error("persistent_publish_not_wired: mailbox runtime has not bound the publish hook yet")},log:y=>t.stderr.write(`${y}
2058
- `)}),u=Br()?.device_id,f=Bw({dal:n,daemon:a,...l.config!==void 0?{webuiRuntimeConfig:eF(l.config,u)}:{},...c!==void 0?{terminalSessionManager:c}:{},persistentSessionManager:d,...o!==void 0?{localWebui:{webuiDir:o.webuiDir,localMailbox:{s3:o.s3,commands:o.commands}}}:{}}),m=process.env.LMCTL_USAGE_QUOTA_USD,p=m!==void 0&&m!==""?Number(m):NaN,_=Number.isFinite(p)&&p>0?p:void 0,g=await PT({dal:n,app:f,io:t,mailbox:l.config===void 0?void 0:{...l.config,cursorStore:n,chatLogTailStore:n,promptTriggerStore:n,usageStore:n,..._!==void 0?{usageQuotaUsd:_}:{},...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 DT({dal:n,mailbox:g.mailbox,io:t});let{serve:h}=await import("@hono/node-server"),S=h({fetch:f.fetch,port:i.port,hostname:r.bind});return t.stdout.write(`listening on ${r.bind}:${i.port}
2059
- `),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 eF(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 DT(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)}
2056
+ `);let c=await sF({log:y=>t.stderr.write(`${y}
2057
+ `)}),d=new Ho({adapterFactory:LT,publish:async()=>{throw new Error("persistent_publish_not_wired: mailbox runtime has not bound the publish hook yet")},log:y=>t.stderr.write(`${y}
2058
+ `)}),u=Br()?.device_id,f=Bw({dal:n,daemon:a,...l.config!==void 0?{webuiRuntimeConfig:rF(l.config,u)}:{},...c!==void 0?{terminalSessionManager:c}:{},persistentSessionManager:d,...o!==void 0?{localWebui:{webuiDir:o.webuiDir,localMailbox:{s3:o.s3,commands:o.commands}}}:{}}),m=process.env.LMCTL_USAGE_QUOTA_USD,p=m!==void 0&&m!==""?Number(m):NaN,_=Number.isFinite(p)&&p>0?p:void 0,g=await PT({dal:n,app:f,io:t,mailbox:l.config===void 0?void 0:{...l.config,cursorStore:n,chatLogTailStore:n,promptTriggerStore:n,usageStore:n,..._!==void 0?{usageQuotaUsd:_}:{},...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 DT({dal:n,mailbox:g.mailbox,io:t});let{serve:h}=await import("@hono/node-server"),S=h({fetch:f.fetch,port:i.port,hostname:r.bind});return t.stdout.write(`listening on ${r.bind}:${i.port}
2059
+ `),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 rF(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 DT(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)}
2060
2060
  `)}}async function PT(e){let t;if(e.mailbox!==void 0||e.localMailbox!==void 0)try{t=e.localMailbox!==void 0?await AT({...e.localMailbox,log:r=>e.io?.stderr.write(`${r}
2061
2061
  `),...e.terminalSessionManager!==void 0?{terminalSessionManager:e.terminalSessionManager}:{},...e.persistentSessionManager!==void 0?{persistentSessionManager:e.persistentSessionManager}:{}}):await xT({...e.mailbox,log:r=>e.io?.stderr.write(`${r}
2062
2062
  `),...e.terminalSessionManager!==void 0?{terminalSessionManager:e.terminalSessionManager}:{},...e.persistentSessionManager!==void 0?{persistentSessionManager:e.persistentSessionManager}:{}}),t.fetchClient.onRequest(Th({app:e.app,log:r=>e.io?.stderr.write(`${r}
2063
2063
  `)})),e.io?.stderr.write(`[mailbox] dg-2 agent runtime started (identity=${t.identityId})
2064
2064
  `)}catch(r){let n=r instanceof Error?r.message:String(r);e.io?.stderr.write(`[mailbox] dg-2 agent runtime NOT started: ${n}
2065
- `)}return{...t!==void 0?{mailbox:t}:{},async stop(){t!==void 0&&await t.stop()}}}function FT(e){let{dal:t,cli:r,env:n,parsed:s,io:i}=e,o=[],a,l=t.getConfig("api.port");if(r.portCli!==void 0)a=r.portCli;else if(l!==null){let m=Number(l);if(!Number.isInteger(m)||m<=0||m>65535)throw new Error(`invalid api.port in lmctl_config: ${l}`);a=m}else if(n.LMCTL_API_PORT!==void 0&&n.LMCTL_API_PORT.length>0){let m=Number(n.LMCTL_API_PORT);if(!Number.isInteger(m)||m<=0||m>65535)throw new Error(`invalid LMCTL_API_PORT: ${n.LMCTL_API_PORT}`);a=m,o.push("api.port")}else a=s.port;let c,d=t.getConfig("api.token");d!==null?c=d:n.LMCTL_API_TOKEN!==void 0&&n.LMCTL_API_TOKEN.length>0?(c=n.LMCTL_API_TOKEN,o.push("api.token")):(c=KP(32).toString("hex"),t.setConfig("api.token",c),i.stdout.write("Generated initial api.token; view via `lmctl api config get api.token`\n"));let u,f=t.getConfig("api.url");f!==null?u=f:n.LMCTL_API_URL!==void 0&&n.LMCTL_API_URL.length>0?(u=n.LMCTL_API_URL,o.push("api.url")):(u=`http://127.0.0.1:${a}`,t.setConfig("api.url",u));for(let m of o)i.stderr.write(`note: ${tF(m)} env var used as fallback for ${m}; consider \`lmctl api config set ${m} ...\` to make this DB-canonical.
2066
- `);return{port:a,apiUrl:u,apiToken:c}}function tF(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 rF(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 nF(e){UT=e??Nu}function WT(e){let t=Object.keys(pa),r=UT(t),n=r.filter(i=>!i.found);if(n.length>0){for(let i of n)e.stderr.write(`error: ${CT(i)}
2065
+ `)}return{...t!==void 0?{mailbox:t}:{},async stop(){t!==void 0&&await t.stop()}}}function FT(e){let{dal:t,cli:r,env:n,parsed:s,io:i}=e,o=[],a,l=t.getConfig("api.port");if(r.portCli!==void 0)a=r.portCli;else if(l!==null){let m=Number(l);if(!Number.isInteger(m)||m<=0||m>65535)throw new Error(`invalid api.port in lmctl_config: ${l}`);a=m}else if(n.LMCTL_API_PORT!==void 0&&n.LMCTL_API_PORT.length>0){let m=Number(n.LMCTL_API_PORT);if(!Number.isInteger(m)||m<=0||m>65535)throw new Error(`invalid LMCTL_API_PORT: ${n.LMCTL_API_PORT}`);a=m,o.push("api.port")}else a=s.port;let c,d=t.getConfig("api.token");d!==null?c=d:n.LMCTL_API_TOKEN!==void 0&&n.LMCTL_API_TOKEN.length>0?(c=n.LMCTL_API_TOKEN,o.push("api.token")):(c=zP(32).toString("hex"),t.setConfig("api.token",c),i.stdout.write("Generated initial api.token; view via `lmctl api config get api.token`\n"));let u,f=t.getConfig("api.url");f!==null?u=f:n.LMCTL_API_URL!==void 0&&n.LMCTL_API_URL.length>0?(u=n.LMCTL_API_URL,o.push("api.url")):(u=`http://127.0.0.1:${a}`,t.setConfig("api.url",u));for(let m of o)i.stderr.write(`note: ${nF(m)} env var used as fallback for ${m}; consider \`lmctl api config set ${m} ...\` to make this DB-canonical.
2066
+ `);return{port:a,apiUrl:u,apiToken:c}}function nF(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 sF(e){let t;try{t=await import("node-pty")}catch(r){let n=r instanceof Error?r.message:String(r);e.log(`[dt-2] node-pty not available; terminal routes will return 503 (${n})`);return}return new qo({pty:{spawn:t.spawn.bind(t)},publish:async()=>{throw new Error("terminal_publish_not_wired: mailbox runtime has not bound the publish hook yet")},log:e.log})}function iF(e){UT=e??Nu}function WT(e){let t=Object.keys(_a),r=UT(t),n=r.filter(i=>!i.found);if(n.length>0){for(let i of n)e.stderr.write(`error: ${CT(i)}
2067
2067
  `);throw e.stderr.write(`error: agent refusing to start; ensure missing provider CLIs are on PATH
2068
- `),new _a(n)}let s=r.map(i=>i.provider).join(", ");e.stdout.write(`providers ready: ${s}
2069
- `)}function BT(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=jT(r)?r:xu(process.cwd(),r);return YP(`${n}/index.html`)?n:null}function qT(e){let t=e.LMCTL_LOCAL_MAILBOX_DIR;return t!==void 0&&t!==""?jT(t)?t:xu(process.cwd(),t):xu(zP(),".lmctl","local-mailbox")}function sF(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 HT(e,t=process.env){let r=iF(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 iF(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 ZP,_a,UT,XT=T(()=>{"use strict";Ze();Jw();Zd();DE();Jc();Eu();ru();Cd();Md();OT();Iu();MT();Xe();ZP=`usage: lmctl serve [--port N] [--bind HOST] [--no-daemon] [--insecure-no-auth] [--webui [DIR]]
2068
+ `),new ha(n)}let s=r.map(i=>i.provider).join(", ");e.stdout.write(`providers ready: ${s}
2069
+ `)}function BT(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=jT(r)?r:xu(process.cwd(),r);return ZP(`${n}/index.html`)?n:null}function qT(e){let t=e.LMCTL_LOCAL_MAILBOX_DIR;return t!==void 0&&t!==""?jT(t)?t:xu(process.cwd(),t):xu(QP(),".lmctl","local-mailbox")}function oF(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 HT(e,t=process.env){let r=aF(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 aF(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 eF,ha,UT,XT=T(()=>{"use strict";Ze();Jw();Zd();DE();Jc();Eu();ru();Cd();Md();OT();Iu();MT();Xe();eF=`usage: lmctl serve [--port N] [--bind HOST] [--no-daemon] [--insecure-no-auth] [--webui [DIR]]
2070
2070
 
2071
2071
  Start the local HTTP API, web UI, queue daemon, terminal manager, and agent
2072
2072
  services. Help exits before any port binding or daemon startup.
@@ -2076,24 +2076,24 @@ services. Help exits before any port binding or daemon startup.
2076
2076
  against the local filesystem (no S3, no Cognito) with a fixed
2077
2077
  local identity. Mailbox store defaults to
2078
2078
  ~/.lmctl/local-mailbox/ ($LMCTL_LOCAL_MAILBOX_DIR overrides).
2079
- `;_a=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}},UT=Nu});import{existsSync as oF,mkdirSync as aF,readFileSync as lF,renameSync as cF,unlinkSync as dF,writeFileSync as uF}from"node:fs";import{homedir as VT}from"node:os";import{dirname as Ls,join as _t,resolve as fF}from"node:path";function In(e,t,r){let n=Ls(fF(r)),s=new Set,i=new Map;for(let o of t.members){if(s.add(o.provider),o.teamfile!==void 0)continue;let a=o.sessiondir??n,l=i.get(a)??new Set;l.add(o.provider),i.set(a,l)}for(let[o,a]of i.entries())wr(_t(o,".mcp.json"),"mcpServers",[vn(),kn()]),a.has("opencode")&&wr(_t(o,".opencode","opencode.json"),"mcp",[ZT(),QT()]);for(let o of s)_F(o)}function Au(e=KT??VT()){return _t(e,".copilot","mcp-config.json")}function YT(e,t){let r={};if(Je.existsSync(e)){let i=JSON.parse(Je.readFileSync(e,"utf8"));if(!Ot(i))throw new Error(`${e} is not a JSON object`);r=i}let n=Ot(r.mcpServers)?{...r.mcpServers}:{},s=!1;for(let[i,o]of Object.entries(t)){let a=Ot(n[i])?n[i]:void 0;NF(a,o)||(n[i]=o,s=!0)}return s?(r.mcpServers=n,zT(e,r),{changed:!0}):{changed:!1}}function zT(e,t){Je.mkdirSync(Ls(e),{recursive:!0});let r=_t(Ls(e),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{Je.writeFileSync(r,`${JSON.stringify(t,null,2)}
2080
- `,"utf8"),Je.renameSync(r,e)}catch(n){try{Je.unlinkSync(r)}catch{}throw n}}function pF(e,t){Je.mkdirSync(Ls(e),{recursive:!0});let r=_t(Ls(e),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{Je.writeFileSync(r,t,"utf8"),Je.renameSync(r,e)}catch(n){try{Je.unlinkSync(r)}catch{}throw n}}function wr(e,t,r){try{if(!Je.existsSync(e))return;let n=JSON.parse(Je.readFileSync(e,"utf8"));if(!Ot(n)||!Ot(n[t]))return;let s={...n[t]},i=[];for(let{name:o,shouldRemove:a}of r)Object.prototype.hasOwnProperty.call(s,o)&&a(s[o])&&(delete s[o],i.push(o));if(i.length===0)return;n[t]=s,zT(e,n),V({event:"mcp_cleanup",path:e,removed:i})}catch{}}function vn(){return{name:ga,shouldRemove:SF}}function ZT(){return{name:ga,shouldRemove:vF}}function kn(){return{name:ha,shouldRemove:TF}}function QT(){return{name:ha,shouldRemove:bF}}function _F(e){let t=KT??VT();switch(e){case"copilot":wr(Au(t),"mcpServers",[vn(),kn()]);return;case"claude":wr(_t(t,".claude.json"),"mcpServers",[vn(),kn()]);return;case"gemini":wr(_t(t,".gemini","settings.json"),"mcpServers",[vn(),kn()]);return;case"qwen":wr(_t(t,".qwen","settings.json"),"mcpServers",[vn(),kn()]);return;case"agy":wr(_t(t,".gemini","antigravity-cli","settings.json"),"mcpServers",[vn(),kn()]);return;case"opencode":wr(_t(t,".config","opencode","opencode.json"),"mcp",[ZT(),QT()]);return;case"codex":hF(_t(t,".codex","config.toml"));return;default:return}}function hF(e){try{if(!Je.existsSync(e))return;let t=Je.readFileSync(e,"utf8"),r=gF(t);if(r===null)return;let n=t.split(/\n/),s=[],i=new Set,o=!1,a;for(let l of n){let c=eb(l);if(c===null)return;if(c!==void 0){if(GT(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=wF(l);if(d===null)return;if(d!==void 0&&GT(d,r)){i.add(d[1]);continue}s.push(l)}if(i.size===0)return;pF(e,s.join(`
2081
- `)),V({event:"mcp_cleanup",path:e,removed:[...i]})}catch{}}function GT(e,t){return e.length<2||e[0]!=="mcp_servers"?!1:t.has(e[1])}function gF(e){let t=new Map,r;for(let s of e.split(/\n/)){let i=eb(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=yF(a,r);if(c===null)return null;if(c===void 0||c.length!==3||c[0]!=="mcp_servers"||c[1]!==ha&&c[1]!==ga)continue;let d=t.get(c[1])??{};if(c[2]==="command"){let u=tb(l);if(u===null)return null;d.command=u}else if(c[2]==="args"){let u=EF(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===ha&&nb(i.command,i.args)&&n.add(s),s===ga&&sb(i.command,i.args)&&n.add(s);return n}function yF(e,t){if(e.startsWith("mcp_servers"))return ya(e);if(t===void 0||t.length<2||t[0]!=="mcp_servers")return;let r=ya(e);return r===null?null:[...t,...r]}function eb(e){if(!/^\s*\[/.test(e))return;let t=/^\s*\[([^\]\r\n]+)\]\s*(?:#.*)?$/.exec(e);return t===null?null:ya(t[1])}function wF(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 ya(r)}function ya(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 tb(e){let t=rb(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 EF(e){let t=rb(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=>tb(s.trim()));return n.some(s=>s===null)?null:n}function rb(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 TF(e){return Ot(e)?e.type==="stdio"&&typeof e.command=="string"&&nb(e.command,e.args):!1}function bF(e){return!Ot(e)||!Array.isArray(e.command)?!1:e.command.length===2&&typeof e.command[0]=="string"&&typeof e.command[1]=="string"&&ob(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"&&ib(e.command[0],[e.command[1],e.command[2]])}function SF(e){return Ot(e)?e.type==="stdio"&&sb(e.command,e.args):!1}function vF(e){return!Ot(e)||!Array.isArray(e.command)?!1:e.command.length===2&&typeof e.command[0]=="string"&&typeof e.command[1]=="string"&&ab(e.command[0])&&e.command[1]==="mcp"}function nb(e,t){return ob(e)&&lb(t)||ib(e,t)}function sb(e,t){return ab(e)&&lb(t)}function ib(e,t){return kF(e)&&Array.isArray(t)&&t.length===2&&IF(t[0])&&t[1]==="mcp"}function ob(e){return typeof e=="string"&&Ru(e)==="lmctl"}function ab(e){return typeof e=="string"&&Ru(e)==="lmctl0"}function kF(e){if(typeof e!="string")return!1;let t=Ru(e).toLowerCase();return t==="node"||t==="node.exe"}function IF(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 Ru(e){let t=e.replace(/\\/g,"/");return t.split("/").filter(n=>n.length>0).at(-1)??t}function lb(e){return Array.isArray(e)&&e.length===1&&e[0]==="mcp"}function NF(e,t){return e!==void 0&&wa(e)===wa(t)}function wa(e){return Array.isArray(e)?`[${e.map(t=>wa(t)).join(",")}]`:Ot(e)?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${wa(e[t])}`).join(",")}}`:JSON.stringify(e)}function Ot(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var ha,ga,mF,Je,KT,Os=T(()=>{"use strict";we();ha="lmctl",ga="lmctl0",mF={existsSync:oF,mkdirSync:aF,readFileSync:lF,writeFileSync:uF,renameSync:cF,unlinkSync:dF},Je=mF});function ub(e){let t=cb(e.registry,e.fromTeamfile);if(t===void 0)return Nn(`sender team is not registered in policy graph: ${e.fromTeamfile}`);if(!db(t,e.fromAlias))return Nn(`sender alias "${e.fromAlias}" not found in ${e.fromTeamfile}`);let r=cb(e.registry,e.toTeamfile);return r===void 0?Nn(`target team is not registered in policy graph: ${e.toTeamfile}`):db(r,e.toAlias)?e.toTeamfile===e.fromTeamfile?{allowed:!0,outOfPolicy:!1,reason:"same team"}:t.leadAlias===null?Nn(`sender team has no Lead: ${e.fromTeamfile}`):e.fromAlias!==t.leadAlias?Nn(`cross-team sends may only originate from Lead; got "${e.fromAlias}" in ${e.fromTeamfile}`):{allowed:!0,outOfPolicy:!1,reason:"cross-team send from Lead"}:Nn(`target alias "${e.toAlias}" not found in ${e.toTeamfile}`)}function cb(e,t){return e.teams.find(r=>r.teamfile===t)}function db(e,t){return e.aliases.some(r=>r===t)}function Nn(e){return{allowed:!1,outOfPolicy:!0,reason:e}}var fb=T(()=>{"use strict"});import{randomUUID as xF}from"node:crypto";import{hostname as mb,networkInterfaces as AF}from"node:os";function pb(e){let t=(e.now??new Date).toISOString();return{lock_id:xF(),teamfile:e.teamfile,alias:e.alias,holder_pid:e.pid??process.pid,holder_host:e.host??mb(),holder_ips:e.ips??CF(),started_at:t,last_heartbeat:t}}function _b(e=process.env){return hb(e.LMCTL_TERMINAL_LOCK_HEARTBEAT_MS,RF)}function OF(e=process.env){return hb(e.LMCTL_TERMINAL_LOCK_STALE_MS,LF)}function Lu(e,t={}){let r=t.now??new Date,n=t.localHost??mb(),s=t.staleMs??OF();if(e.holder_host===n)return(t.isProcessAlive??$F)(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 Ou(e){return`${e.alias} is held by a terminal on ${e.holder_host} since ${e.started_at}; retry later`}function hb(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 $F(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 CF(){let e=new Set;for(let t of Object.values(AF()))for(let r of t??[])r.internal||e.add(r.address);return[...e].sort()}var RF,LF,$u=T(()=>{"use strict";RF=15e3,LF=12e4});function MF(e){return`lmctl ${e}: LMCTL_SELF_SESSIONID is not set \u2014 it looks like you are running lmctl
2079
+ `;ha=class extends Error{missing;constructor(t){let r=t.map(n=>n.provider).join(", ");super(`provider binary pre-flight failed: ${r}`),this.name="ProviderBinaryPreflightError",this.missing=t}},UT=Nu});import{existsSync as lF,mkdirSync as cF,readFileSync as dF,renameSync as uF,unlinkSync as fF,writeFileSync as mF}from"node:fs";import{homedir as VT}from"node:os";import{dirname as Ls,join as _t,resolve as pF}from"node:path";function In(e,t,r){let n=Ls(pF(r)),s=new Set,i=new Map;for(let o of t.members){if(s.add(o.provider),o.teamfile!==void 0)continue;let a=o.sessiondir??n,l=i.get(a)??new Set;l.add(o.provider),i.set(a,l)}for(let[o,a]of i.entries())wr(_t(o,".mcp.json"),"mcpServers",[vn(),kn()]),a.has("opencode")&&wr(_t(o,".opencode","opencode.json"),"mcp",[ZT(),QT()]);for(let o of s)gF(o)}function Au(e=KT??VT()){return _t(e,".copilot","mcp-config.json")}function YT(e,t){let r={};if(Je.existsSync(e)){let i=JSON.parse(Je.readFileSync(e,"utf8"));if(!Ot(i))throw new Error(`${e} is not a JSON object`);r=i}let n=Ot(r.mcpServers)?{...r.mcpServers}:{},s=!1;for(let[i,o]of Object.entries(t)){let a=Ot(n[i])?n[i]:void 0;AF(a,o)||(n[i]=o,s=!0)}return s?(r.mcpServers=n,zT(e,r),{changed:!0}):{changed:!1}}function zT(e,t){Je.mkdirSync(Ls(e),{recursive:!0});let r=_t(Ls(e),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{Je.writeFileSync(r,`${JSON.stringify(t,null,2)}
2080
+ `,"utf8"),Je.renameSync(r,e)}catch(n){try{Je.unlinkSync(r)}catch{}throw n}}function hF(e,t){Je.mkdirSync(Ls(e),{recursive:!0});let r=_t(Ls(e),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{Je.writeFileSync(r,t,"utf8"),Je.renameSync(r,e)}catch(n){try{Je.unlinkSync(r)}catch{}throw n}}function wr(e,t,r){try{if(!Je.existsSync(e))return;let n=JSON.parse(Je.readFileSync(e,"utf8"));if(!Ot(n)||!Ot(n[t]))return;let s={...n[t]},i=[];for(let{name:o,shouldRemove:a}of r)Object.prototype.hasOwnProperty.call(s,o)&&a(s[o])&&(delete s[o],i.push(o));if(i.length===0)return;n[t]=s,zT(e,n),H({event:"mcp_cleanup",path:e,removed:i})}catch{}}function vn(){return{name:ya,shouldRemove:kF}}function ZT(){return{name:ya,shouldRemove:IF}}function kn(){return{name:ga,shouldRemove:SF}}function QT(){return{name:ga,shouldRemove:vF}}function gF(e){let t=KT??VT();switch(e){case"copilot":wr(Au(t),"mcpServers",[vn(),kn()]);return;case"claude":wr(_t(t,".claude.json"),"mcpServers",[vn(),kn()]);return;case"gemini":wr(_t(t,".gemini","settings.json"),"mcpServers",[vn(),kn()]);return;case"qwen":wr(_t(t,".qwen","settings.json"),"mcpServers",[vn(),kn()]);return;case"agy":wr(_t(t,".gemini","antigravity-cli","settings.json"),"mcpServers",[vn(),kn()]);return;case"opencode":wr(_t(t,".config","opencode","opencode.json"),"mcp",[ZT(),QT()]);return;case"codex":yF(_t(t,".codex","config.toml"));return;default:return}}function yF(e){try{if(!Je.existsSync(e))return;let t=Je.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=eb(l);if(c===null)return;if(c!==void 0){if(GT(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&&GT(d,r)){i.add(d[1]);continue}s.push(l)}if(i.size===0)return;hF(e,s.join(`
2081
+ `)),H({event:"mcp_cleanup",path:e,removed:[...i]})}catch{}}function GT(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=eb(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=tb(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&&nb(i.command,i.args)&&n.add(s),s===ya&&sb(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 eb(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 tb(e){let t=rb(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=rb(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=>tb(s.trim()));return n.some(s=>s===null)?null:n}function rb(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 Ot(e)?e.type==="stdio"&&typeof e.command=="string"&&nb(e.command,e.args):!1}function vF(e){return!Ot(e)||!Array.isArray(e.command)?!1:e.command.length===2&&typeof e.command[0]=="string"&&typeof e.command[1]=="string"&&ob(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"&&ib(e.command[0],[e.command[1],e.command[2]])}function kF(e){return Ot(e)?e.type==="stdio"&&sb(e.command,e.args):!1}function IF(e){return!Ot(e)||!Array.isArray(e.command)?!1:e.command.length===2&&typeof e.command[0]=="string"&&typeof e.command[1]=="string"&&ab(e.command[0])&&e.command[1]==="mcp"}function nb(e,t){return ob(e)&&lb(t)||ib(e,t)}function sb(e,t){return ab(e)&&lb(t)}function ib(e,t){return NF(e)&&Array.isArray(t)&&t.length===2&&xF(t[0])&&t[1]==="mcp"}function ob(e){return typeof e=="string"&&Ru(e)==="lmctl"}function ab(e){return typeof e=="string"&&Ru(e)==="lmctl0"}function NF(e){if(typeof e!="string")return!1;let t=Ru(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 Ru(e){let t=e.replace(/\\/g,"/");return t.split("/").filter(n=>n.length>0).at(-1)??t}function lb(e){return Array.isArray(e)&&e.length===1&&e[0]==="mcp"}function AF(e,t){return e!==void 0&&Ea(e)===Ea(t)}function Ea(e){return Array.isArray(e)?`[${e.map(t=>Ea(t)).join(",")}]`:Ot(e)?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Ea(e[t])}`).join(",")}}`:JSON.stringify(e)}function Ot(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var ga,ya,_F,Je,KT,Os=T(()=>{"use strict";he();ga="lmctl",ya="lmctl0",_F={existsSync:lF,mkdirSync:cF,readFileSync:dF,writeFileSync:mF,renameSync:uF,unlinkSync:fF},Je=_F});function ub(e){let t=cb(e.registry,e.fromTeamfile);if(t===void 0)return Nn(`sender team is not registered in policy graph: ${e.fromTeamfile}`);if(!db(t,e.fromAlias))return Nn(`sender alias "${e.fromAlias}" not found in ${e.fromTeamfile}`);let r=cb(e.registry,e.toTeamfile);return r===void 0?Nn(`target team is not registered in policy graph: ${e.toTeamfile}`):db(r,e.toAlias)?e.toTeamfile===e.fromTeamfile?{allowed:!0,outOfPolicy:!1,reason:"same team"}:t.leadAlias===null?Nn(`sender team has no Lead: ${e.fromTeamfile}`):e.fromAlias!==t.leadAlias?Nn(`cross-team sends may only originate from Lead; got "${e.fromAlias}" in ${e.fromTeamfile}`):{allowed:!0,outOfPolicy:!1,reason:"cross-team send from Lead"}:Nn(`target alias "${e.toAlias}" not found in ${e.toTeamfile}`)}function cb(e,t){return e.teams.find(r=>r.teamfile===t)}function db(e,t){return e.aliases.some(r=>r===t)}function Nn(e){return{allowed:!1,outOfPolicy:!0,reason:e}}var fb=T(()=>{"use strict"});import{randomUUID as RF}from"node:crypto";import{hostname as mb,networkInterfaces as LF}from"node:os";function pb(e){let t=(e.now??new Date).toISOString();return{lock_id:RF(),teamfile:e.teamfile,alias:e.alias,holder_pid:e.pid??process.pid,holder_host:e.host??mb(),holder_ips:e.ips??jF(),started_at:t,last_heartbeat:t}}function _b(e=process.env){return hb(e.LMCTL_TERMINAL_LOCK_HEARTBEAT_MS,OF)}function CF(e=process.env){return hb(e.LMCTL_TERMINAL_LOCK_STALE_MS,$F)}function Lu(e,t={}){let r=t.now??new Date,n=t.localHost??mb(),s=t.staleMs??CF();if(e.holder_host===n)return(t.isProcessAlive??MF)(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 Ou(e){return`${e.alias} is held by a terminal on ${e.holder_host} since ${e.started_at}; retry later`}function hb(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 MF(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 jF(){let e=new Set;for(let t of Object.values(LF()))for(let r of t??[])r.internal||e.add(r.address);return[...e].sort()}var OF,$F,$u=T(()=>{"use strict";OF=15e3,$F=12e4});function DF(e){return`lmctl ${e}: LMCTL_SELF_SESSIONID is not set \u2014 it looks like you are running lmctl
2082
2082
  manually, outside a member session that lmctl started. Running lmctl this way is
2083
2083
  not officially supported.
2084
2084
  To experiment with it manually: https://lmctl.com/lmctl/docs/manual-invocation`}function $s(e){return`lmctl ${e}: LMCTL_SELF_SESSIONID is set but does not match any member of a registered team.
2085
2085
  The session marker may be stale or the team may not be registered in this lmctl database.
2086
- Consulted ${Vs(Dt(),le())}
2086
+ Consulted ${Ks(Dt(),le())}
2087
2087
  To experiment with it manually: https://lmctl.com/lmctl/docs/manual-invocation`}function gb(e){return`unknown option --from
2088
- ${MF(e)}`}function yb(e,t){let r=Cu(e,t);return r.ok?{ok:!0,identity:r.identity,source:"session"}:r}function Cu(e,t){let r=e[Kn];if(r===void 0||r.length===0)return{ok:!1,reason:"unset"};let n=[];for(let i of t.listRootTeams()){let o=Pe(i.teamfile_path,t);for(let a of o.members)a.teamfile===void 0&&a.session===r&&n.push(`${i.teamfile_path}:${a.alias}`)}let s=[...new Set(n)];if(s.length===0)return{ok:!1,reason:"not-found"};if(s.length>1)throw new Error("LMCTL_SELF_SESSIONID matches multiple team members; the team registry is ambiguous");return{ok:!0,identity:s[0]}}var Ea=T(()=>{"use strict";it();Xe();Rt()});function qr(e){let t=Wr(e);if(t===null)throw new Error(`invalid agent identity: ${e}`);return{teamfile:t.teamfile,alias:t.alias,value:e}}var Mu=T(()=>{"use strict";Lt()});async function va(e){let t=e.onEvent??(()=>{}),r=DF(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=>JF(w,e.env??process.env)),f=u.sender,m=await XF(r,{explicitRoot:e.rootFlag,sender:f,receiverTeamfile:d,operatorOrigin:u.origin==="operator"}),p=f===null?null:await GF(r,{rootTeamfile:m,sender:f,receiverTeamfile:d,receiverAlias:c.alias});p!==null&&!p.allowed&&t({kind:"warning",message:`warning: out-of-policy chat send: ${p.reason}
2089
- `}),i=await UF(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=qF(r,i);try{In(r,De(d),d)}catch{}n={root_teamfile:m,sender_teamfile:f?.teamfile??null,sender_alias:f?.alias??null,receiver_teamfile:d,receiver_alias:c.alias,origin:u.origin,policy:p};let _=await bb(r,d,c.alias);if(_!==null){let w=Ou(_);if(f!==null){let x=await ju(r,{sender:f,receiverTeamfile:d,receiverAlias:c.alias,rootTeamfile:m,payload:e.prompt});return a=Ta(`enqueued mailbox message ${x.id}`,null),Du(x.id,f,d,c.alias)}let I=await xn(r,{...n,message:e.prompt,response:null,status:"error",error_detail:w});return a=Pu(w,I),{status:"busy",message:w,teamChatLogId:I}}if(await PF(r,d,c.alias)){if(f!==null){let x=await ju(r,{sender:f,receiverTeamfile:d,receiverAlias:c.alias,rootTeamfile:m,payload:e.prompt});return a=Ta(`enqueued mailbox message ${x.id}`,null),Du(x.id,f,d,c.alias)}let w=await FF(r,d,c.alias),I=await xn(r,{...n,message:e.prompt,response:null,status:"error",error_detail:w});return a=Pu(w,I),{status:"busy",message:w,teamChatLogId:I}}if(f!==null&&f.teamfile!==d){let w=await $(r,I=>fE(I,{root:m,sender:f,receiverTeamfile:d,receiverAlias:c.alias,now:new Date}));if(w.stop){let I=pE(w.chain),x=await xn(r,{...n,message:e.prompt,response:null,status:"error",error_detail:I});return a=ba(I,x),{status:"error",errorKind:"cycle",message:I,teamChatLogId:x}}}let g=await YF(r,{receiver_teamfile:d,receiver_alias:c.alias,sender_teamfile:f?.teamfile??d,sender_alias:f?.alias??"operator"});if(!g.acquired){let w=Sb(d,c.alias,g.current);if(f!==null){let x=await ju(r,{sender:f,receiverTeamfile:d,receiverAlias:c.alias,rootTeamfile:m,payload:e.prompt});return a=Ta(`enqueued mailbox message ${x.id}`,null),Du(x.id,f,d,c.alias)}let I=await xn(r,{...n,message:e.prompt,response:null,status:"error",error_detail:w});return a=Pu(w,I),{status:"busy",message:w,teamChatLogId:I}}s=g.lease;let h=await Zo({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 BF(r,i,w)}});l=h.prompt;let S=h.status==="stalled",y=await xn(r,{...n,message:l,response:S?null:h.receipt,status:n.policy?.outOfPolicy===!0?"out_of_policy":S?"error":"ok",error_detail:n.policy?.outOfPolicy===!0?n.policy.reason:S?`provider stalled${h.stalledAfterMs!==void 0?` after ${h.stalledAfterMs}ms`:""}`:null});return a=S?ba(`provider stalled${h.stalledAfterMs!==void 0?` after ${h.stalledAfterMs}ms`:""}`,y,h.receipt):Ta(h.receipt,y),{status:S?"stalled":"ok",replyText:h.receipt,wroteDelta:h.wroteDelta,teamChatLogId:y,durationMs:h.durationMs}}catch(c){let d=c instanceof Error?c.message:String(c),u=n===null?null:await xn(r,{...n,message:l,response:null,status:n.policy?.outOfPolicy===!0?"out_of_policy":"error",error_detail:n.policy?.outOfPolicy===!0?`${n.policy.reason}; provider error: ${d}`:d});return a=ba(d,u),{status:"error",errorKind:c instanceof ge?"target":"provider",message:d,teamChatLogId:u}}finally{o!==void 0&&clearInterval(o),s!==null&&await zF(r,s),i!==null&&await WF(r,i,a??ba("chat turn exited without a terminal outcome",null))}}function DF(e,t){return{...e,stdout:{write:()=>{}},stderr:{write:r=>{t({kind:"warning",message:r})}}}}async function PF(e,t,r){return await $(e,n=>eE(n,t,r))}async function FF(e,t,r){let n=await bb(e,t,r);if(n!==null)return Ou(n);let s=await $(e,i=>i.getAgentInflight(t,r));return s!==null?Sb(t,r,s):`${r} is busy; wait and retry`}async function ju(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 Du(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 UF(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:HF(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 WF(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 BF(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 qF(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)}))})},jF);return r.unref?.(),r}function Ta(e,t){return{status:"done",result_summary:Sa(e),error:null,team_chat_log_id:t}}function Pu(e,t){return{status:"busy",result_summary:Sa(e),error:e,team_chat_log_id:t}}function ba(e,t,r){return{status:"error",result_summary:Sa(r===void 0?e:r),error:e,team_chat_log_id:t}}function Sa(e){let t=e.replace(/\s+/gu," ").trim();return t.length<=500?t:`${t.slice(0,497)}...`}function HF(e,t,r){return`lmctl chat ${JSON.stringify(e)} ${t} ${JSON.stringify(r)}`}function JF(e,t){let r=yb(t,e);if(r.ok)return{sender:qr(r.identity),origin:"agent"};if(r.reason==="unset")return{sender:null,origin:"operator"};throw new Error($s("chat"))}async function XF(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=>mE(n,{sender:r,now:new Date})??t.receiverTeamfile)}async function GF(e,t){return await $(e,r=>ub({rootTeamfile:t.rootTeamfile,fromTeamfile:t.sender.teamfile,fromAlias:t.sender.alias,toTeamfile:t.receiverTeamfile,toAlias:t.receiverAlias,registry:VF(r,t.sender.teamfile,t.receiverTeamfile)}))}function VF(e,t,r){return{teams:[t,r].map(s=>KF(s,e))}}function KF(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 YF(e,t){return await $(e,r=>{let n=ce(),s=hr(r,{receiver_teamfile:t.receiver_teamfile,receiver_alias:t.receiver_alias,sender_teamfile:t.sender_teamfile,sender_alias:t.sender_alias,ttlMs:gr()});return s.acquired?(n&&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:Eb(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:Eb(s.current)})),{acquired:!1,current:s.current})})}async function bb(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(Lu(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:Lu(s).live?s:null})}function Eb(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)}
2090
- `)}}function Sb(e,t,r){return`${t} is servicing ${r.sender_alias} (${r.sender_teamfile}) since ${r.started_at} \u2014 wait and retry, or inspect without waking it: lmctl tail "${e}" ${t}`}async function xn(e,t){let r=Tb(t.message),n=t.response===null?null:Tb(t.response);try{return await $(e,s=>s.insertTeamChatLog({root_teamfile:t.root_teamfile,sender_teamfile:t.sender_teamfile,sender_alias:t.sender_alias,receiver_teamfile:t.receiver_teamfile,receiver_alias:t.receiver_alias,message:r.text,response:n?.text??null,origin:t.origin,status:t.status,error_detail:t.error_detail,truncated:r.truncated||n?.truncated?1:0,created_at:new Date().toISOString()}))}catch(s){return e.stderr.write(`warning: failed to record chat log: ${s instanceof Error?s.message:String(s)}
2091
- `),null}}function Tb(e){return e.length<=wb?{text:e,truncated:!1}:{text:e.slice(0,wb),truncated:!0}}var wb,jF,Fu=T(()=>{"use strict";Lt();Yt();Os();fb();Rt();Qo();we();Le();Fr();$u();Ea();Mu();Xd();wb=256*1024,jF=3e4});var Nb={};ye(Nb,{parseIdleTimeoutMs:()=>kb,runChat:()=>QF});async function QF(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(`${vb}
2092
- `),e.length===0?2:0;let n=e1(e);if(typeof n=="string")return t.stderr.write(`error: ${n}
2088
+ ${DF(e)}`}function yb(e,t){let r=Cu(e,t);return r.ok?{ok:!0,identity:r.identity,source:"session"}:r}function Cu(e,t){let r=e[Kn];if(r===void 0||r.length===0)return{ok:!1,reason:"unset"};let n=[];for(let i of t.listRootTeams()){let o=Pe(i.teamfile_path,t);for(let a of o.members)a.teamfile===void 0&&a.session===r&&n.push(`${i.teamfile_path}:${a.alias}`)}let s=[...new Set(n)];if(s.length===0)return{ok:!1,reason:"not-found"};if(s.length>1)throw new Error("LMCTL_SELF_SESSIONID matches multiple team members; the team registry is ambiguous");return{ok:!0,identity:s[0]}}var Ta=T(()=>{"use strict";it();Xe();Rt()});function qr(e){let t=Wr(e);if(t===null)throw new Error(`invalid agent identity: ${e}`);return{teamfile:t.teamfile,alias:t.alias,value:e}}var Mu=T(()=>{"use strict";Lt()});async function va(e){let t=e.onEvent??(()=>{}),r=FF(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=>GF(w,e.env??process.env)),f=u.sender,m=await VF(r,{explicitRoot:e.rootFlag,sender:f,receiverTeamfile:d,operatorOrigin:u.origin==="operator"}),p=f===null?null:await KF(r,{rootTeamfile:m,sender:f,receiverTeamfile:d,receiverAlias:c.alias});p!==null&&!p.allowed&&t({kind:"warning",message:`warning: out-of-policy chat send: ${p.reason}
2089
+ `}),i=await BF(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=JF(r,i);try{In(r,De(d),d)}catch{}n={root_teamfile:m,sender_teamfile:f?.teamfile??null,sender_alias:f?.alias??null,receiver_teamfile:d,receiver_alias:c.alias,origin:u.origin,policy:p};let _=await bb(r,d,c.alias);if(_!==null){let w=Ou(_);if(f!==null){let I=await ju(r,{sender:f,receiverTeamfile:d,receiverAlias:c.alias,rootTeamfile:m,payload:e.prompt});return a=ba(`enqueued mailbox message ${I.id}`,null),Du(I.id,f,d,c.alias)}return xn(i,n,e.prompt,w,"unavailable"),a=Pu(w,null),{status:"busy",message:w,teamChatLogId:null}}if(await UF(r,d,c.alias)){if(f!==null){let I=await ju(r,{sender:f,receiverTeamfile:d,receiverAlias:c.alias,rootTeamfile:m,payload:e.prompt});return a=ba(`enqueued mailbox message ${I.id}`,null),Du(I.id,f,d,c.alias)}let w=await WF(r,d,c.alias);return xn(i,n,e.prompt,w,"unavailable"),a=Pu(w,null),{status:"busy",message:w,teamChatLogId:null}}if(f!==null&&f.teamfile!==d){let w=await $(r,I=>fE(I,{root:m,sender:f,receiverTeamfile:d,receiverAlias:c.alias,now:new Date}));if(w.stop){let I=pE(w.chain);return xn(i,n,e.prompt,I,"cycle"),a=Sa(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=Sb(d,c.alias,g.current);if(f!==null){let I=await ju(r,{sender:f,receiverTeamfile:d,receiverAlias:c.alias,rootTeamfile:m,payload:e.prompt});return a=ba(`enqueued mailbox message ${I.id}`,null),Du(I.id,f,d,c.alias)}return xn(i,n,e.prompt,w,"unavailable"),a=Pu(w,null),{status:"busy",message:w,teamChatLogId:null}}s=g.lease;let h=await Qo({sender:f??{teamfile:d,alias:"operator"},receiver:{teamfile:d,alias:c.alias,provider:c.provider,sessionId:c.sessionid,cwd:c.sessiondir,...c.model!==void 0?{model:c.model}:{},...c.effort!==void 0?{effort:c.effort}:{},...c.isLead!==void 0?{isLead:c.isLead}:{}},newMessage:e.prompt,newMessageFrom:f===null?"operator":`${f.teamfile}:${f.alias}`,io:r,permissionMode:e.permissionMode,env:e.env??process.env,...e.idleTimeoutMs!==void 0?{idleTimeoutMs:e.idleTimeoutMs}:{},onDelta:w=>t({kind:"delta",chunk:w}),onProgress:w=>t({kind:"progress",alias:c.alias,event:w}),onPromptBuilt:w=>{if(l=w,i!==null)return HF(r,i,w)}});l=h.prompt;let S=h.status==="stalled",y=null;if(S){let w=`provider stalled${h.stalledAfterMs!==void 0?` after ${h.stalledAfterMs}ms`:""}`;xn(i,n,l,w,"error"),a=Sa(w,null,h.receipt)}else y=await e1(r,{...n,message:l,response:h.receipt,status:n.policy?.outOfPolicy===!0?"out_of_policy":"ok",error_detail:n.policy?.outOfPolicy===!0?n.policy.reason:null}),a=ba(h.receipt,y);return{status:S?"stalled":"ok",replyText:h.receipt,wroteDelta:h.wroteDelta,teamChatLogId:y,durationMs:h.durationMs}}catch(c){let d=c instanceof Error?c.message:String(c);return xn(i,n,l,d,"error"),a=Sa(d,null),{status:"error",errorKind:c instanceof ye?"target":"provider",message:d,teamChatLogId:null}}finally{o!==void 0&&clearInterval(o),s!==null&&await QF(r,s),i!==null&&await qF(r,i,a??Sa("chat turn exited without a terminal outcome",null))}}function FF(e,t){return{...e,stdout:{write:()=>{}},stderr:{write:r=>{t({kind:"warning",message:r})}}}}async function UF(e,t,r){return await $(e,n=>eE(n,t,r))}async function WF(e,t,r){let n=await bb(e,t,r);if(n!==null)return Ou(n);let s=await $(e,i=>i.getAgentInflight(t,r));return s!==null?Sb(t,r,s):`${r} is busy; wait and retry`}async function ju(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 Du(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 BF(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:XF(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 qF(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 HF(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 JF(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)}))})},PF);return r.unref?.(),r}function ba(e,t){return{status:"done",result_summary:Cs(e),error:null,team_chat_log_id:t}}function Pu(e,t){return{status:"busy",result_summary:Cs(e),error:e,team_chat_log_id:t}}function Sa(e,t,r){return{status:"error",result_summary:Cs(r===void 0?e:r),error:e,team_chat_log_id:t}}function Cs(e){let t=e.replace(/\s+/gu," ").trim();return t.length<=500?t:`${t.slice(0,497)}...`}function XF(e,t,r){return`lmctl chat ${JSON.stringify(e)} ${t} ${JSON.stringify(r)}`}function GF(e,t){let r=yb(t,e);if(r.ok)return{sender:qr(r.identity),origin:"agent"};if(r.reason==="unset")return{sender:null,origin:"operator"};throw new Error($s("chat"))}async function VF(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=>mE(n,{sender:r,now:new Date})??t.receiverTeamfile)}async function KF(e,t){return await $(e,r=>ub({rootTeamfile:t.rootTeamfile,fromTeamfile:t.sender.teamfile,fromAlias:t.sender.alias,toTeamfile:t.receiverTeamfile,toAlias:t.receiverAlias,registry:YF(r,t.sender.teamfile,t.receiverTeamfile)}))}function YF(e,t,r){return{teams:[t,r].map(s=>zF(s,e))}}function zF(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=hr(r,{receiver_teamfile:t.receiver_teamfile,receiver_alias:t.receiver_alias,sender_teamfile:t.sender_teamfile,sender_alias:t.sender_alias,ttlMs:gr()});return s.acquired?(n&&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:Eb(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:Eb(s.current)})),{acquired:!1,current:s.current})})}async function bb(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(Lu(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:Lu(s).live?s:null})}function Eb(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 QF(e,t){try{await $(e,r=>{r.releaseAgentInflight(t)})}catch(r){e.stderr.write(`warning: failed to release chat in-flight slot: ${r instanceof Error?r.message:String(r)}
2090
+ `)}}function Sb(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 e1(e,t){let r=Tb(t.message),n=t.response===null?null:Tb(t.response);try{return await $(e,s=>s.insertTeamChatLog({root_teamfile:t.root_teamfile,sender_teamfile:t.sender_teamfile,sender_alias:t.sender_alias,receiver_teamfile:t.receiver_teamfile,receiver_alias:t.receiver_alias,message:r.text,response:n?.text??null,origin:t.origin,status:t.status,error_detail:t.error_detail,truncated:r.truncated||n?.truncated?1:0,created_at:new Date().toISOString()}))}catch(s){return e.stderr.write(`warning: failed to record chat log: ${s instanceof Error?s.message:String(s)}
2091
+ `),null}}function xn(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:Cs(r)})}function Tb(e){return e.length<=wb?{text:e,truncated:!1}:{text:e.slice(0,wb),truncated:!0}}var wb,PF,Fu=T(()=>{"use strict";Lt();Yt();Os();fb();Rt();ea();he();Le();Fr();$u();Ta();Mu();Xd();wb=256*1024,PF=3e4});var Nb={};we(Nb,{parseIdleTimeoutMs:()=>kb,runChat:()=>r1});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(`${vb}
2092
+ `),e.length===0?2:0;let n=n1(e);if(typeof n=="string")return t.stderr.write(`error: ${n}
2093
2093
  ${vb}
2094
2094
  `),2;if(n.runFlag!==void 0){let u=Number.parseInt(n.runFlag,10);return!Number.isFinite(u)||u<=0||String(u)!==n.runFlag?(t.stderr.write(`error: invalid --run "${n.runFlag}" (expected a positive integer run id)
2095
2095
  `),2):await $(t,async f=>{let m=f.getRun(u);if(m===null)return t.stderr.write(`error: run ${u}: not found
2096
- `),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)
2096
+ `),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=Jo(f,u);if(p===null)return t.stderr.write(`error: run ${u}: no pending operator-answerable attention (chat --run only resumes paused runs)
2097
2097
  `),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)
2098
2098
  `),2;let _=f.resumeEscalation(p.attention_id,n.prompt);return _.resumed===!0?(t.stdout.write(`run ${u}: escalation resumed (decision: ${n.prompt})
2099
2099
  `),0):(t.stderr.write(`error: run ${u}: resumeEscalation failed (${_.reason})
@@ -2101,10 +2101,10 @@ ${vb}
2101
2101
  `),1;let g=f.resumeInteractive(_.step_id,n.prompt,n.done===!0);return g.resumed===!0?(t.stdout.write(`run ${u}: interactive resumed (step ${_.step_id}${n.done===!0?", done":""})
2102
2102
  `),0):(t.stderr.write(`error: run ${u}: resumeInteractive failed (${g.reason})
2103
2103
  `),1)}return t.stderr.write(`error: run ${u}: pending attention kind "${p.kind}" is not operator-answerable
2104
- `),1})}let s=yr(ZF,{target:n.target,alias:n.alias,flags:{session:n.sessionFlag,provider:n.providerFlag}});if(s.mode==="error")return t.stderr.write(`error: ${s.message}
2104
+ `),1})}let s=yr(t1,{target:n.target,alias:n.alias,flags:{session:n.sessionFlag,provider:n.providerFlag}});if(s.mode==="error")return t.stderr.write(`error: ${s.message}
2105
2105
  `),2;if(s.mode==="managed")return t.stderr.write(`error: chat managed mode requires --run <id>
2106
2106
  `),2;let i;if(s.mode==="ai-team"){if(s.alias===void 0)return t.stderr.write(`error: chat: alias required (internal)
2107
- `),2;let u=await va({teamfile:s.teamfile,alias:s.alias,prompt:n.prompt,permissionMode:n.permissionMode,...n.idleTimeoutMs!==void 0?{idleTimeoutMs:n.idleTimeoutMs}:{},...n.rootFlag!==void 0?{rootFlag:n.rootFlag}:{},env:r,io:t,onEvent:f=>r1(t,f)});return n.json===!0?u.status==="enqueued"?(t.stdout.write(`${JSON.stringify({status:"enqueued",path:"enqueued",id:u.id,sender:u.sender,receiver:u.receiver})}
2107
+ `),2;let u=await va({teamfile:s.teamfile,alias:s.alias,prompt:n.prompt,permissionMode:n.permissionMode,...n.idleTimeoutMs!==void 0?{idleTimeoutMs:n.idleTimeoutMs}:{},...n.rootFlag!==void 0?{rootFlag:n.rootFlag}:{},env:r,io:t,onEvent:f=>i1(t,f)});return n.json===!0?u.status==="enqueued"?(t.stdout.write(`${JSON.stringify({status:"enqueued",path:"enqueued",id:u.id,sender:u.sender,receiver:u.receiver})}
2108
2108
  `),0):u.status==="busy"?(t.stdout.write(`${JSON.stringify({status:"busy",message:u.message,teamChatLogId:u.teamChatLogId})}
2109
2109
  `),1):u.status==="error"?(t.stdout.write(`${JSON.stringify({status:"error",errorKind:u.errorKind,message:u.message,teamChatLogId:u.teamChatLogId})}
2110
2110
  `),1):(t.stdout.write(`${JSON.stringify({status:u.status,replyText:u.replyText,teamChatLogId:u.teamChatLogId})}
@@ -2117,15 +2117,15 @@ ${vb}
2117
2117
  `):t.stdout.write(`${u.replyText}${u.replyText.endsWith(`
2118
2118
  `)?"":`
2119
2119
  `}`),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>
2120
- `),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=>Ib(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:t1(f.text,200)}));let m=f.status==="stalled";return o?f.text.endsWith(`
2120
+ `),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=>Ib(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:s1(f.text,200)}));let m=f.status==="stalled";return o?f.text.endsWith(`
2121
2121
  `)||t.stdout.write(`
2122
2122
  `):t.stdout.write(`${f.text}${f.text.endsWith(`
2123
2123
  `)?"":`
2124
2124
  `}`),f.status==="stalled"?1:0}catch(u){let f=u instanceof Error?u.message:String(u);return t.stderr.write(`error: ${f}
2125
- `),1}}function e1(e){let t=[],r="yolo",n,s,i,o,a,l=!1,c=!1;for(let p=0;p<e.length;p+=1){let _=e[p];if(_==="--permission-mode"){let g=e[++p];if(g===void 0||g.startsWith("--"))return"missing value for --permission-mode";if(g!=="plan"&&g!=="yolo")return`--permission-mode must be one of plan|yolo (got "${g}")`;r=g;continue}if(_==="--idle-timeout"){let g=e[++p];if(g===void 0||g.startsWith("--"))return"missing value for --idle-timeout";let h=kb(g);if(typeof h=="string")return h;n=h;continue}if(_==="--session"){let g=e[++p];if(g===void 0||g.startsWith("--"))return"missing value for --session";s=g;continue}if(_==="--provider"){let g=e[++p];if(g===void 0||g.startsWith("--"))return"missing value for --provider";i=g;continue}if(_==="--from"||_.startsWith("--from="))return gb("chat");if(_.startsWith("I_am="))return`unknown argument: ${_}`;if(_==="--root"){let g=e[++p];if(g===void 0||g.startsWith("--"))return"missing value for --root";o=g;continue}if(_==="--force"||_.startsWith("--force="))return"unknown option --force (a dead holder auto-reclaims; for a live holder use lmctl chat)";if(_==="--json"){c=!0;continue}if(_==="--run"){let g=e[++p];if(g===void 0||g.startsWith("--"))return"missing value for --run";a=g;continue}if(_==="--done"){l=!0;continue}if(_.startsWith("--"))return`unknown flag: ${_}`;t.push(_)}if(a!==void 0)return s!==void 0?"--run is mutually exclusive with --session":i!==void 0?"--run is mutually exclusive with --provider":o!==void 0?"--run is mutually exclusive with --root":t.length===0?"a prompt (answer) is required with --run":t.length>1?`--run takes exactly one positional (the answer); got ${t.length}`:{prompt:t[0],permissionMode:r,runFlag:a,done:l,json:c};let d,u,f;if(t.length===0)return"a prompt is required";if(t.length===1){if(s===void 0)return'expected <teamfile>:<alias> "<prompt>" | <teamfile> <alias> "<prompt>" | <sessionid> "<prompt>" | --session <id> "<prompt>"';f=t[0]}else if(t.length===2)d=t[0],f=t[1];else if(t.length===3)d=t[0],u=t[1],f=t[2];else return`too many positionals (${t.length}); expected at most <teamfile> <alias> <prompt>`;if(l)return"--done requires --run";let m={prompt:f,permissionMode:r};return d!==void 0&&(m.target=d),u!==void 0&&(m.alias=u),n!==void 0&&(m.idleTimeoutMs=n),s!==void 0&&(m.sessionFlag=s),i!==void 0&&(m.providerFlag=i),o!==void 0&&(m.rootFlag=o),c&&(m.json=c),m}function kb(e){if(e==="0")return 0;if(/^\d+$/.test(e))return Number(e);let t=/^(\d+)([smhd])$/.exec(e);if(t===null)return`invalid --idle-timeout "${e}" (expected <n>(s|m|h|d), integer ms, or 0)`;let r=Number(t[1]),n=t[2];return r*(n==="s"?1e3:n==="m"?6e4:n==="h"?36e5:864e5)}function Ib(e,t,r){r.kind==="tool_use"?e.stderr.write(`[${t}] tool_use ${r.tool??"tool"}${r.summary?`: ${r.summary}`:""}
2125
+ `),1}}function n1(e){let t=[],r="yolo",n,s,i,o,a,l=!1,c=!1;for(let p=0;p<e.length;p+=1){let _=e[p];if(_==="--permission-mode"){let g=e[++p];if(g===void 0||g.startsWith("--"))return"missing value for --permission-mode";if(g!=="plan"&&g!=="yolo")return`--permission-mode must be one of plan|yolo (got "${g}")`;r=g;continue}if(_==="--idle-timeout"){let g=e[++p];if(g===void 0||g.startsWith("--"))return"missing value for --idle-timeout";let h=kb(g);if(typeof h=="string")return h;n=h;continue}if(_==="--session"){let g=e[++p];if(g===void 0||g.startsWith("--"))return"missing value for --session";s=g;continue}if(_==="--provider"){let g=e[++p];if(g===void 0||g.startsWith("--"))return"missing value for --provider";i=g;continue}if(_==="--from"||_.startsWith("--from="))return gb("chat");if(_.startsWith("I_am="))return`unknown argument: ${_}`;if(_==="--root"){let g=e[++p];if(g===void 0||g.startsWith("--"))return"missing value for --root";o=g;continue}if(_==="--force"||_.startsWith("--force="))return"unknown option --force (a dead holder auto-reclaims; for a live holder use lmctl chat)";if(_==="--json"){c=!0;continue}if(_==="--run"){let g=e[++p];if(g===void 0||g.startsWith("--"))return"missing value for --run";a=g;continue}if(_==="--done"){l=!0;continue}if(_.startsWith("--"))return`unknown flag: ${_}`;t.push(_)}if(a!==void 0)return s!==void 0?"--run is mutually exclusive with --session":i!==void 0?"--run is mutually exclusive with --provider":o!==void 0?"--run is mutually exclusive with --root":t.length===0?"a prompt (answer) is required with --run":t.length>1?`--run takes exactly one positional (the answer); got ${t.length}`:{prompt:t[0],permissionMode:r,runFlag:a,done:l,json:c};let d,u,f;if(t.length===0)return"a prompt is required";if(t.length===1){if(s===void 0)return'expected <teamfile>:<alias> "<prompt>" | <teamfile> <alias> "<prompt>" | <sessionid> "<prompt>" | --session <id> "<prompt>"';f=t[0]}else if(t.length===2)d=t[0],f=t[1];else if(t.length===3)d=t[0],u=t[1],f=t[2];else return`too many positionals (${t.length}); expected at most <teamfile> <alias> <prompt>`;if(l)return"--done requires --run";let m={prompt:f,permissionMode:r};return d!==void 0&&(m.target=d),u!==void 0&&(m.alias=u),n!==void 0&&(m.idleTimeoutMs=n),s!==void 0&&(m.sessionFlag=s),i!==void 0&&(m.providerFlag=i),o!==void 0&&(m.rootFlag=o),c&&(m.json=c),m}function kb(e){if(e==="0")return 0;if(/^\d+$/.test(e))return Number(e);let t=/^(\d+)([smhd])$/.exec(e);if(t===null)return`invalid --idle-timeout "${e}" (expected <n>(s|m|h|d), integer ms, or 0)`;let r=Number(t[1]),n=t[2];return r*(n==="s"?1e3:n==="m"?6e4:n==="h"?36e5:864e5)}function Ib(e,t,r){r.kind==="tool_use"?e.stderr.write(`[${t}] tool_use ${r.tool??"tool"}${r.summary?`: ${r.summary}`:""}
2126
2126
  `):r.kind==="tool_result"?e.stderr.write(`[${t}] tool_result${r.status?` ${r.status}`:""}${r.summary?`: ${r.summary}`:""}
2127
2127
  `):r.kind==="api_retry"&&e.stderr.write(`[${t}] api_retry${r.summary?`: ${r.summary}`:""}
2128
- `)}function t1(e,t){return e.slice(-t)}function r1(e,t){t.kind==="delta"?e.stdout.write(t.chunk):t.kind==="progress"?Ib(e,t.alias,t.event):e.stderr.write(t.message)}var ZF,vb,xb=T(()=>{"use strict";vt();Le();Lt();Fu();Ea();we();Jo();Ht();ZF={name:"chat",allowsBareTeamfile:!1,supportsRaw:!0},vb=`usage: lmctl chat <teamfile>:<alias> "<prompt>"
2128
+ `)}function s1(e,t){return e.slice(-t)}function i1(e,t){t.kind==="delta"?e.stdout.write(t.chunk):t.kind==="progress"?Ib(e,t.alias,t.event):e.stderr.write(t.message)}var t1,vb,xb=T(()=>{"use strict";vt();Le();Lt();Fu();Ta();he();Xo();Ht();t1={name:"chat",allowsBareTeamfile:!1,supportsRaw:!0},vb=`usage: lmctl chat <teamfile>:<alias> "<prompt>"
2129
2129
  lmctl chat <teamfile> <alias> "<prompt>"
2130
2130
  lmctl chat <sessionid> "<prompt>" --provider <name>
2131
2131
  lmctl chat --provider <name> --session <id> "<prompt>"
@@ -2133,40 +2133,40 @@ ${vb}
2133
2133
  [--permission-mode plan|yolo] [--idle-timeout <duration>]
2134
2134
  [--root <teamfile>] [--json]
2135
2135
 
2136
- Send a prompt to a team member or raw provider session, or answer a paused run.`});function Cs(e){for(let t=e.length-1;t>=0;t-=1){let r=e[t],n=n1.exec(r.content);if(n===null){if(r.role==="assistant"&&r.content.trim().length>0)return null;continue}let s=Number.parseInt(n[1],10),i=n[2]===void 0?0:Number.parseInt(n[2],10),o=n[3].toLowerCase(),a=n[4]?.trim()??null,l=`${n[1]}${n[2]!==void 0?`:${n[2]}`:""}${o}`;return{state:"LIMITED",resets_at:a===null?null:s1(r.timestamp,s,i,o,a),reset_time:l,timezone:a,detected_at:r.timestamp.toISOString()}}return null}function s1(e,t,r,n,s){if(!Number.isFinite(e.getTime())||t<1||t>12||r<0||r>59)return null;let i=i1(t,n);try{let o=o1(e,s),a=Ab(o.year,o.month,o.day,i,r,s);if(a.getTime()<=e.getTime()){let l=d1(o,1);a=Ab(l.year,l.month,l.day,i,r,s)}return a.toISOString()}catch{return null}}function i1(e,t){return t==="am"?e===12?0:e:e===12?12:e+12}function o1(e,t){let r=Rb(t,!1).formatToParts(e);return{year:zt(r,"year"),month:zt(r,"month"),day:zt(r,"day")}}function Ab(e,t,r,n,s,i){let o=Date.UTC(e,t-1,r,n,s,0,0);for(let a=0;a<3;a+=1){let l=a1(new Date(o),i);o=Date.UTC(e,t-1,r,n,s,0,0)-l}return new Date(o)}function a1(e,t){let r=Rb(t,!0).formatToParts(e);return Date.UTC(zt(r,"year"),zt(r,"month")-1,zt(r,"day"),zt(r,"hour"),zt(r,"minute"),zt(r,"second"),0)-e.getTime()}function Rb(e,t){let r=t?c1:l1,n=r.get(e);if(n!==void 0)return n;let s=new Intl.DateTimeFormat("en-US",{timeZone:e,hourCycle:"h23",year:"numeric",month:"2-digit",day:"2-digit",...t?{hour:"2-digit",minute:"2-digit",second:"2-digit"}:{}});return r.set(e,s),s}function zt(e,t){let r=e.find(n=>n.type===t)?.value;if(r===void 0)throw new Error(`missing ${t}`);return Number.parseInt(r,10)}function d1(e,t){let r=new Date(Date.UTC(e.year,e.month-1,e.day+t));return{year:r.getUTCFullYear(),month:r.getUTCMonth()+1,day:r.getUTCDate()}}var n1,l1,c1,Uu=T(()=>{"use strict";n1=/you['\u2019]ve hit your session limit\s*(?:\u00b7|-|:)?\s*resets\s+([0-9]{1,2})(?::([0-9]{2}))?\s*(am|pm)\s*(?:\(([^)]+)\))?/i;l1=new Map,c1=new Map});function ka(e){return f1.has(e)}function Bu(){return Wu===null&&(Wu=Et(bt())),Wu}function qu(e,t,r={}){if(!ka(e))return null;try{let n=Bu().getAdapter?.(e);if(n===void 0)return null;let s=n.resumeCommand(t).trim();if(s.length===0)return null;let i=s.split(/\s+/),o=e==="codex"&&r.isLead===!0?ci({warn:()=>{}}):[],a=r.model!==void 0&&r.model.trim().length>0?u1[e]?.(r.model):void 0;return r.model!==void 0&&r.model.trim().length>0&&a===void 0&&r.onModelIgnored?.({provider:e,model:r.model,reason:`${e} terminal resume does not implement per-session model selection`}),[...i,...a??[],...o,...Lb[e]??[]]}catch{return null}}function Ia(e,t,r={}){let n=qu(e,t,r);return n===null?null:n.join(" ")}function Zt(e,t){return Bu().getSession(e,t)}async function Na(e){return(await Bu().resolveSessions(e)).map(r=>r.provider.name)}var Lb,u1,f1,Ob,Wu,An=T(()=>{"use strict";vt();_l();Lb={claude:["--dangerously-skip-permissions"],codex:["--dangerously-bypass-approvals-and-sandbox"],gemini:["-y"],copilot:["--yolo"],opencode:[],qwen:["--approval-mode","yolo"],agy:[],lmplayer:[]},u1={claude:e=>["--model",e],codex:e=>["--model",e],gemini:e=>["--model",e],opencode:e=>["--model",e],qwen:e=>["--model",e],agy:e=>["--model",e],lmplayer:e=>["--model",e]},f1=new Set(Object.keys(Lb)),Ob=/^[\w.:-]+$/;Wu=null});var Mb={};ye(Mb,{runRecover:()=>p1});import{dirname as $b,resolve as Cb}from"node:path";async function p1(e,t,r={}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(`${Hu}
2136
+ Send a prompt to a team member or raw provider session, or answer a paused run.`});function Ms(e){for(let t=e.length-1;t>=0;t-=1){let r=e[t],n=o1.exec(r.content);if(n===null){if(r.role==="assistant"&&r.content.trim().length>0)return null;continue}let s=Number.parseInt(n[1],10),i=n[2]===void 0?0:Number.parseInt(n[2],10),o=n[3].toLowerCase(),a=n[4]?.trim()??null,l=`${n[1]}${n[2]!==void 0?`:${n[2]}`:""}${o}`;return{state:"LIMITED",resets_at:a===null?null:a1(r.timestamp,s,i,o,a),reset_time:l,timezone:a,detected_at:r.timestamp.toISOString()}}return null}function a1(e,t,r,n,s){if(!Number.isFinite(e.getTime())||t<1||t>12||r<0||r>59)return null;let i=l1(t,n);try{let o=c1(e,s),a=Ab(o.year,o.month,o.day,i,r,s);if(a.getTime()<=e.getTime()){let l=m1(o,1);a=Ab(l.year,l.month,l.day,i,r,s)}return a.toISOString()}catch{return null}}function l1(e,t){return t==="am"?e===12?0:e:e===12?12:e+12}function c1(e,t){let r=Rb(t,!1).formatToParts(e);return{year:zt(r,"year"),month:zt(r,"month"),day:zt(r,"day")}}function Ab(e,t,r,n,s,i){let o=Date.UTC(e,t-1,r,n,s,0,0);for(let a=0;a<3;a+=1){let l=d1(new Date(o),i);o=Date.UTC(e,t-1,r,n,s,0,0)-l}return new Date(o)}function d1(e,t){let r=Rb(t,!0).formatToParts(e);return Date.UTC(zt(r,"year"),zt(r,"month")-1,zt(r,"day"),zt(r,"hour"),zt(r,"minute"),zt(r,"second"),0)-e.getTime()}function Rb(e,t){let r=t?f1:u1,n=r.get(e);if(n!==void 0)return n;let s=new Intl.DateTimeFormat("en-US",{timeZone:e,hourCycle:"h23",year:"numeric",month:"2-digit",day:"2-digit",...t?{hour:"2-digit",minute:"2-digit",second:"2-digit"}:{}});return r.set(e,s),s}function zt(e,t){let r=e.find(n=>n.type===t)?.value;if(r===void 0)throw new Error(`missing ${t}`);return Number.parseInt(r,10)}function m1(e,t){let r=new Date(Date.UTC(e.year,e.month-1,e.day+t));return{year:r.getUTCFullYear(),month:r.getUTCMonth()+1,day:r.getUTCDate()}}var o1,u1,f1,Uu=T(()=>{"use strict";o1=/you['\u2019]ve hit your session limit\s*(?:\u00b7|-|:)?\s*resets\s+([0-9]{1,2})(?::([0-9]{2}))?\s*(am|pm)\s*(?:\(([^)]+)\))?/i;u1=new Map,f1=new Map});function ka(e){return _1.has(e)}function Bu(){return Wu===null&&(Wu=Et(bt())),Wu}function qu(e,t,r={}){if(!ka(e))return null;try{let n=Bu().getAdapter?.(e);if(n===void 0)return null;let s=n.resumeCommand(t).trim();if(s.length===0)return null;let i=s.split(/\s+/),o=e==="codex"&&r.isLead===!0?di({warn:()=>{}}):[],a=r.model!==void 0&&r.model.trim().length>0?p1[e]?.(r.model):void 0;return r.model!==void 0&&r.model.trim().length>0&&a===void 0&&r.onModelIgnored?.({provider:e,model:r.model,reason:`${e} terminal resume does not implement per-session model selection`}),[...i,...a??[],...o,...Lb[e]??[]]}catch{return null}}function Ia(e,t,r={}){let n=qu(e,t,r);return n===null?null:n.join(" ")}function Zt(e,t){return Bu().getSession(e,t)}async function Na(e){return(await Bu().resolveSessions(e)).map(r=>r.provider.name)}var Lb,p1,_1,Ob,Wu,An=T(()=>{"use strict";vt();_l();Lb={claude:["--dangerously-skip-permissions"],codex:["--dangerously-bypass-approvals-and-sandbox"],gemini:["-y"],copilot:["--yolo"],opencode:[],qwen:["--approval-mode","yolo"],agy:[],lmplayer:[]},p1={claude:e=>["--model",e],codex:e=>["--model",e],gemini:e=>["--model",e],opencode:e=>["--model",e],qwen:e=>["--model",e],agy:e=>["--model",e],lmplayer:e=>["--model",e]},_1=new Set(Object.keys(Lb)),Ob=/^[\w.:-]+$/;Wu=null});var Mb={};we(Mb,{runRecover:()=>g1});import{dirname as $b,resolve as Cb}from"node:path";async function g1(e,t,r={}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(`${Hu}
2137
2137
  `),0;let n=Z(e.filter(p=>p!=="--"),[],["--all","--dry-run","--json"]);if(n.error!==void 0)return v(t,`${n.error}
2138
2138
 
2139
2139
  ${Hu}`);if(n.positionals.length===0)return v(t,`recover requires a <teamfile>
2140
2140
 
2141
- ${Hu}`);if(n.positionals.length>2)return v(t,`unexpected argument: ${n.positionals[2]}`);let s=n.positionals[0],i=Wr(s),o=i?.teamfile??s,a=n.positionals[1],l=i?.alias??a;if(i!==null&&a!==void 0)return v(t,"recover alias was provided twice; use either <teamfile>:<alias> or <teamfile> <alias>");if(G(n,"--all")&&l!==void 0)return v(t,"recover --all is mutually exclusive with <alias>");let c;try{c=await _1(t,o,l)}catch(p){if(p instanceof ge)return v(t,p.message);throw p}let d=r.now??new Date,u=G(n,"--dry-run"),f=[];for(let p of c)f.push(await h1(t,p,{now:d,dryRun:u}));let m={checked:f.length,recovered:f.filter(p=>p.action==="recovered").length,wouldRecover:f.filter(p=>p.action==="would_recover").length,skipped:f.filter(p=>p.action!=="recovered"&&p.action!=="would_recover").length,errors:f.filter(p=>p.action==="load_error"||p.action==="send_error").length};if(G(n,"--json"))ae(t,{dryRun:u,now:d.toISOString(),summary:m,members:f});else{for(let p of f)t.stdout.write(g1(p));t.stdout.write(`Recover checked ${m.checked}: ${u?`${m.wouldRecover} would recover`:`${m.recovered} recovered`}, ${m.skipped} skipped, ${m.errors} error(s).
2142
- `)}return m.errors>0?1:0}async function _1(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 ge(`lmctl: ${t}: ${i.parseErrors.join("; ")}`);let o=ra(i,r);return o?.teamfile!==void 0?Ju(Cb($b(s),o.teamfile),n,new Set):[He(t,r,n)]}return Ju(s,n,new Set)})}function Ju(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 ge(`lmctl: ${n}: ${s.parseErrors.join("; ")}`);let i=[];for(let o of s.members){if(o.teamfile!==void 0){i.push(...Ju(Cb($b(n),o.teamfile),t,r));continue}o.session!==void 0&&i.push(He(n,o.alias,t))}return i}async function h1(e,t,r){let n;try{let a=await Zt(t.sessionid,t.provider);if(a===null)return $t(t,"session_not_found",null,"session detail not found");n=Cs(a.messages)}catch(a){return $t(t,"load_error",null,a instanceof Error?a.message:String(a))}if(n===null)return $t(t,"not_limited",null,"no current session-limit marker");if(n.resets_at===null)return $t(t,"unknown_reset",n,"reset time could not be parsed");let s=Date.parse(n.resets_at);if(!Number.isFinite(s))return $t(t,"unknown_reset",n,"reset time could not be parsed");if(s>r.now.getTime())return $t(t,"not_due",n,`resets_at ${n.resets_at} is in the future`);let i=await $(e,a=>a.getAgentInflight(t.teamfile,t.alias));if(i!==null)return $t(t,"busy",n,`in-flight since ${i.started_at}`);if(r.dryRun)return $t(t,"would_recover",n,null);let o=await va({teamfile:t.teamfile,alias:t.alias,prompt:m1,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 g1(e){let t=e.sessionLimit?.resets_at??"unknown",r=e.reason===null?"":` (${e.reason})`;return`${e.alias}: ${e.action} resets_at=${t}${r}
2143
- `}var m1,Hu,jb=T(()=>{"use strict";Uu();An();Yt();Rt();Lt();Fu();Le();m1="Your session limit reset time has passed. Continue your work from the last actionable point.",Hu=["usage: lmctl recover <teamfile> [--all|<alias>] [--dry-run] [--json]","","Wake team members whose latest provider output is a session-limit message","and whose resets_at time has passed. Defaults to the full teamfile report","subtree. A busy/in-flight member is skipped."].join(`
2144
- `)});var Ms,V6,Xu=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}],V6=Ms.length});import{spawn as y1}from"node:child_process";async function Pb(e,t,r){let n=E1.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 T1(n.name,s)}function T1(e,t){return e==="lmctl_chat"?b1(t):{status:"error",code:404,message:`unknown local tool: ${e}`}}function b1(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})),S1(s,process.cwd())}function S1(e,t){return new Promise(r=>{let n=!1,s,i=d=>{n||(n=!0,s!==void 0&&clearTimeout(s),r(d))},o=y1("lmctl",e,{cwd:t,env:process.env,stdio:["ignore","pipe","pipe"]}),a=v1(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(`
2145
- `).length})),i({status:"ok",data:{text:l.trim()||"(empty response)"}});return}i({status:"error",code:d??1,message:c.trim()||`lmctl chat exited with code ${d}`})})})}function v1(e){let t=e.LMCTL_MCP_CHAT_TIMEOUT_MS;if(t===void 0||t.trim().length===0)return Db;let r=Number(t);return!Number.isFinite(r)||r<=0?Db:r}function Gu(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:w1),i=e.getConfig("api.token")??(t.LMCTL_API_TOKEN!==void 0&&t.LMCTL_API_TOKEN.length>0?t.LMCTL_API_TOKEN:null);return{baseUrl:n,token:i}}var w1,Db,E1,Vu=T(()=>{"use strict";Xu();we();w1="http://127.0.0.1:8787",Db=30*60*1e3,E1=new Map(Ms.map(e=>[e.name,e]))});async function x1(e,t){let r=e.id===void 0,n=e.id??null;if(e.method==="exit")return r||t.io.write(Ku({jsonrpc:"2.0",id:n,result:null})),{kind:"exit"};if(e.method==="initialize")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{protocolVersion:k1,capabilities:{tools:{listChanged:!1}},serverInfo:{name:I1,version:N1}}}};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 Pb(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 Ku(e){return`${JSON.stringify(e)}
2146
- `}async function Fb(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(Ku({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 x1(l,e);c.kind==="response"?e.io.write(Ku(c.message)):c.kind==="exit"&&(s=!0)};return new Promise(o=>{let a=Promise.resolve(),l=!1,c=u=>{l||(l=!0,o(u))},d=()=>{let u=n.indexOf(`
2141
+ ${Hu}`);if(n.positionals.length>2)return v(t,`unexpected argument: ${n.positionals[2]}`);let s=n.positionals[0],i=Wr(s),o=i?.teamfile??s,a=n.positionals[1],l=i?.alias??a;if(i!==null&&a!==void 0)return v(t,"recover alias was provided twice; use either <teamfile>:<alias> or <teamfile> <alias>");if(V(n,"--all")&&l!==void 0)return v(t,"recover --all is mutually exclusive with <alias>");let c;try{c=await y1(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 w1(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(E1(p));t.stdout.write(`Recover checked ${m.checked}: ${u?`${m.wouldRecover} would recover`:`${m.recovered} recovered`}, ${m.skipped} skipped, ${m.errors} error(s).
2142
+ `)}return m.errors>0?1:0}async function y1(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?Ju(Cb($b(s),o.teamfile),n,new Set):[He(t,r,n)]}return Ju(s,n,new Set)})}function Ju(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(...Ju(Cb($b(n),o.teamfile),t,r));continue}o.session!==void 0&&i.push(He(n,o.alias,t))}return i}async function w1(e,t,r){let n;try{let a=await Zt(t.sessionid,t.provider);if(a===null)return $t(t,"session_not_found",null,"session detail not found");n=Ms(a.messages)}catch(a){return $t(t,"load_error",null,a instanceof Error?a.message:String(a))}if(n===null)return $t(t,"not_limited",null,"no current session-limit marker");if(n.resets_at===null)return $t(t,"unknown_reset",n,"reset time could not be parsed");let s=Date.parse(n.resets_at);if(!Number.isFinite(s))return $t(t,"unknown_reset",n,"reset time could not be parsed");if(s>r.now.getTime())return $t(t,"not_due",n,`resets_at ${n.resets_at} is in the future`);let i=await $(e,a=>a.getAgentInflight(t.teamfile,t.alias));if(i!==null)return $t(t,"busy",n,`in-flight since ${i.started_at}`);if(r.dryRun)return $t(t,"would_recover",n,null);let o=await va({teamfile:t.teamfile,alias:t.alias,prompt:h1,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 E1(e){let t=e.sessionLimit?.resets_at??"unknown",r=e.reason===null?"":` (${e.reason})`;return`${e.alias}: ${e.action} resets_at=${t}${r}
2143
+ `}var h1,Hu,jb=T(()=>{"use strict";Uu();An();Yt();Rt();Lt();Fu();Le();h1="Your session limit reset time has passed. Continue your work from the last actionable point.",Hu=["usage: lmctl recover <teamfile> [--all|<alias>] [--dry-run] [--json]","","Wake team members whose latest provider output is a session-limit message","and whose resets_at time has passed. Defaults to the full teamfile report","subtree. A busy/in-flight member is skipped."].join(`
2144
+ `)});var js,Z6,Xu=T(()=>{"use strict";js=[{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}],Z6=js.length});import{spawn as T1}from"node:child_process";async function Pb(e,t,r){let n=S1.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 v1(n.name,s)}function v1(e,t){return e==="lmctl_chat"?k1(t):{status:"error",code:404,message:`unknown local tool: ${e}`}}function k1(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})),I1(s,process.cwd())}function I1(e,t){return new Promise(r=>{let n=!1,s,i=d=>{n||(n=!0,s!==void 0&&clearTimeout(s),r(d))},o=T1("lmctl",e,{cwd:t,env:process.env,stdio:["ignore","pipe","pipe"]}),a=N1(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(`
2145
+ `).length})),i({status:"ok",data:{text:l.trim()||"(empty response)"}});return}i({status:"error",code:d??1,message:c.trim()||`lmctl chat exited with code ${d}`})})})}function N1(e){let t=e.LMCTL_MCP_CHAT_TIMEOUT_MS;if(t===void 0||t.trim().length===0)return Db;let r=Number(t);return!Number.isFinite(r)||r<=0?Db:r}function Gu(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:b1),i=e.getConfig("api.token")??(t.LMCTL_API_TOKEN!==void 0&&t.LMCTL_API_TOKEN.length>0?t.LMCTL_API_TOKEN:null);return{baseUrl:n,token:i}}var b1,Db,S1,Vu=T(()=>{"use strict";Xu();he();b1="http://127.0.0.1:8787",Db=30*60*1e3,S1=new Map(js.map(e=>[e.name,e]))});async function L1(e,t){let r=e.id===void 0,n=e.id??null;if(e.method==="exit")return r||t.io.write(Ku({jsonrpc:"2.0",id:n,result:null})),{kind:"exit"};if(e.method==="initialize")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{protocolVersion:x1,capabilities:{tools:{listChanged:!1}},serverInfo:{name:A1,version:R1}}}};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:js.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 Pb(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 Ku(e){return`${JSON.stringify(e)}
2146
+ `}async function Fb(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(Ku({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 L1(l,e);c.kind==="response"?e.io.write(Ku(c.message)):c.kind==="exit"&&(s=!0)};return new Promise(o=>{let a=Promise.resolve(),l=!1,c=u=>{l||(l=!0,o(u))},d=()=>{let u=n.indexOf(`
2147
2147
  `);for(;u!==-1;){let f=n.slice(0,u);n=n.slice(u+1),a=a.then(()=>i(f)).then(()=>{s&&c(0)}),u=n.indexOf(`
2148
2148
  `)}};t.setEncoding("utf8"),t.on("data",u=>{n+=u,d()}),t.on("end",()=>{n.trim().length>0&&(a=a.then(()=>i(n))),a.finally(()=>c(0))}),t.on("error",u=>{e.io.log?.(`mcp: stdin error: ${u.message}
2149
- `),a.finally(()=>c(1))})})}var k1,I1,N1,Ub=T(()=>{"use strict";Xu();Vu();k1="2025-06-18",I1="lmctl",N1="0.0.1"});var Bb={};ye(Bb,{runMcp:()=>R1});async function R1(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(A1),0;if(e.length>0)return t.stderr.write(`usage: lmctl mcp
2150
- `),2;V({event:"mcp_bridge_start",pid:process.pid});let n=t.dal===void 0,s=t.dal??L1(),i=1;try{let o=s===void 0?Gu({getConfig:()=>null},process.env):Gu(s,process.env);return i=await Fb({io:{write:l=>t.stdout.write(l),log:l=>t.stderr.write(l)},dispatch:{config:o,...s!==void 0?{dal:s}:{}}},r),i}finally{V({event:"mcp_bridge_exit",pid:process.pid,exit_code:i}),n&&s!==void 0&&s.close()}}function L1(){let e=le(),t=3;for(let r=1;r<=t;r+=1)try{return Ie({path:e})}catch(n){let s=n instanceof Error?n.message:String(n);if(V({event:"mcp_bridge_db_open_failed",pid:process.pid,attempt:r,db_path:e,error_message:s}),r<t&&Wb(s))O1(50*r);else if(!Wb(s))break}}function Wb(e){return/SQLITE_BUSY|database is locked|database is busy/i.test(e)}function O1(e){let t=new Int32Array(new SharedArrayBuffer(4));Atomics.wait(t,0,0,e)}var A1,qb=T(()=>{"use strict";Ze();Vu();Ub();we();Xe();A1=`usage: lmctl mcp
2149
+ `),a.finally(()=>c(1))})})}var x1,A1,R1,Ub=T(()=>{"use strict";Xu();Vu();x1="2025-06-18",A1="lmctl",R1="0.0.1"});var Bb={};we(Bb,{runMcp:()=>$1});async function $1(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
2150
+ `),2;H({event:"mcp_bridge_start",pid:process.pid});let n=t.dal===void 0,s=t.dal??C1(),i=1;try{let o=s===void 0?Gu({getConfig:()=>null},process.env):Gu(s,process.env);return i=await Fb({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 C1(){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&&Wb(s))M1(50*r);else if(!Wb(s))break}}function Wb(e){return/SQLITE_BUSY|database is locked|database is busy/i.test(e)}function M1(e){let t=new Int32Array(new SharedArrayBuffer(4));Atomics.wait(t,0,0,e)}var O1,qb=T(()=>{"use strict";Ze();Vu();Ub();he();Xe();O1=`usage: lmctl mcp
2151
2151
 
2152
2152
  Start the stdio MCP bridge. The bridge resolves api.url and api.token from
2153
2153
  local config, then uses stdin/stdout for JSON-RPC frames.
2154
- `});var Hb={};ye(Hb,{runDevice:()=>q1});import{readFileSync as $1}from"node:fs";import{homedir as C1}from"node:os";import{join as M1}from"node:path";import{CognitoIdentityClient as j1,GetIdCommand as D1}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as P1}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as F1,ListObjectsV2Command as U1,PutObjectCommand as W1,S3Client as B1}from"@aws-sdk/client-s3";async function q1(e,t={stdout:process.stdout,stderr:process.stderr}){let[r]=e;if(r===void 0||r==="--help"||r==="-h"||r==="help")return t.stdout.write(Yu),0;if(r==="init"){let n=ku();return t.stdout.write(`${n.device_id}
2155
- `),0}if(r==="id"){let n=Br();return n===null?(t.stderr.write(`error: no device id initialized at ${ma()}; run 'lmctl device init'
2154
+ `});var Hb={};we(Hb,{runDevice:()=>X1});import{readFileSync as j1}from"node:fs";import{homedir as D1}from"node:os";import{join as P1}from"node:path";import{CognitoIdentityClient as F1,GetIdCommand as U1}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as W1}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as B1,ListObjectsV2Command as q1,PutObjectCommand as H1,S3Client as J1}from"@aws-sdk/client-s3";async function X1(e,t={stdout:process.stdout,stderr:process.stderr}){let[r]=e;if(r===void 0||r==="--help"||r==="-h"||r==="help")return t.stdout.write(Yu),0;if(r==="init"){let n=ku();return t.stdout.write(`${n.device_id}
2155
+ `),0}if(r==="id"){let n=Br();return n===null?(t.stderr.write(`error: no device id initialized at ${pa()}; run 'lmctl device init'
2156
2156
  `),1):(t.stdout.write(`${n.device_id}
2157
- `),0)}return r==="login"?await H1(e.slice(1),t):r==="prompt"?await X1(e.slice(1),t):(t.stderr.write(`usage: lmctl device <id|init|login|prompt>
2158
- `),1)}async function H1(e,t){let r=J1(e);if(typeof r=="string")return t.stderr.write(`error: ${r}
2157
+ `),0)}return r==="login"?await G1(e.slice(1),t):r==="prompt"?await K1(e.slice(1),t):(t.stderr.write(`usage: lmctl device <id|init|login|prompt>
2158
+ `),1)}async function G1(e,t){let r=V1(e);if(typeof r=="string")return t.stderr.write(`error: ${r}
2159
2159
  ${Yu}`),2;let n=Rs();if(n.config===void 0)return t.stderr.write(`error: mailbox is not configured; missing ${n.missing.join(", ")}
2160
- `),1;uT({userId:r.userId,refreshToken:r.accessKey});let s,i,o;try{let c=await aa({region:n.config.region,clientId:n.config.cognitoClientId??fa,refreshToken:r.accessKey});s=c.idToken,i=c.accessToken,o=c.expiresAt}catch(c){let d=c instanceof Error?c.message:String(c);return t.stderr.write(`error: could not authenticate access key: ${d}
2160
+ `),1;uT({userId:r.userId,refreshToken:r.accessKey});let s,i,o;try{let c=await la({region:n.config.region,clientId:n.config.cognitoClientId??ma,refreshToken:r.accessKey});s=c.idToken,i=c.accessToken,o=c.expiresAt}catch(c){let d=c instanceof Error?c.message:String(c);return t.stderr.write(`error: could not authenticate access key: ${d}
2161
2161
  `),1}let a=Ns(s);if(a!==null&&a!==r.userId)return t.stderr.write(`error: access key belongs to user-id ${a}, not ${r.userId}
2162
2162
  `),1;hu({idToken:s,...i!==void 0?{accessToken:i}:{},refreshToken:r.accessKey,...o!==void 0?{expiresAt:o}:{}});let l=Br()??ku();return t.stdout.write(`logged in as ${r.userId}
2163
2163
  device id: ${l.device_id}
2164
2164
  mailbox prefix: ${r.userId}/${l.device_id}/
2165
2165
  access key stored at ${xs()}
2166
- `),0}function J1(e){let t,r;for(let n=0;n<e.length;n+=1){let s=e[n];if(s==="--user-id"){let i=e[++n];if(i===void 0||i.startsWith("--"))return"missing value for --user-id";t=i;continue}if(s==="--access-key"){let i=e[++n];if(i===void 0||i.startsWith("--"))return"missing value for --access-key";r=i;continue}return`unknown argument: ${s}`}return t===void 0?"missing --user-id <sub>":r===void 0?"missing --access-key <refreshToken>":{userId:t,accessKey:r}}async function X1(e,t){let r=G1(e);if(typeof r=="string")return t.stderr.write(`error: ${r}
2166
+ `),0}function V1(e){let t,r;for(let n=0;n<e.length;n+=1){let s=e[n];if(s==="--user-id"){let i=e[++n];if(i===void 0||i.startsWith("--"))return"missing value for --user-id";t=i;continue}if(s==="--access-key"){let i=e[++n];if(i===void 0||i.startsWith("--"))return"missing value for --access-key";r=i;continue}return`unknown argument: ${s}`}return t===void 0?"missing --user-id <sub>":r===void 0?"missing --access-key <refreshToken>":{userId:t,accessKey:r}}async function K1(e,t){let r=Y1(e);if(typeof r=="string")return t.stderr.write(`error: ${r}
2167
2167
  ${Yu}`),2;let n=Rs();if(n.config===void 0)return t.stderr.write(`error: mailbox is not configured; missing ${n.missing.join(", ")}
2168
- `),1;let s=K1();if(s===null)return t.stderr.write("error: no Cognito id token found; run `webcli login` or `lmctl device login` first\n"),1;let i=s.cognito?.idToken;if(typeof i!="string"||i.length===0)return t.stderr.write("error: no Cognito id token found; run `webcli login` or `lmctl device login` first\n"),1;let o=`cognito-idp.${n.config.region}.amazonaws.com/${n.config.cognitoUserPoolId}`,a=typeof s.cognito?.identityId=="string"&&s.cognito.identityId.length>0?s.cognito.identityId:await V1({region:n.config.region,identityPoolId:n.config.identityPoolId,idpProvider:o,idToken:i}),l=P1({identityId:a,logins:{[o]:i},clientConfig:{region:n.config.region}}),c=n.config.deviceId??Br()?.device_id,d=Ns(i)??void 0,u=new Dr({bucket:n.config.mailboxBucket,identityId:a,...d!==void 0?{userId:d}:{},...c!==void 0?{deviceId:c}:{},...n.config.mailboxKey!==void 0?{mailboxKey:n.config.mailboxKey}:{},s3:new B1({region:n.config.region,credentials:l}),commands:{ListObjectsV2Command:U1,GetObjectCommand:F1,PutObjectCommand:W1},selfRole:"browser",onMessage:async()=>{}}),f=eT({root_teamfile:r.root,text:r.text,...r.promptId!==void 0?{prompt_id:r.promptId}:{}}),m=await u.putMessage({conversation_id:QE,payload:f});return t.stdout.write(JSON.stringify({prompt_id:f.prompt_id,mailbox_key:u.getMailboxBasePrefix(),object_key:m},null,2)+`
2169
- `),0}function G1(e){let t,r,n;for(let s=0;s<e.length;s+=1){let i=e[s];if(i==="--root"){let o=e[++s];if(o===void 0||o.startsWith("--"))return"missing value for --root";t=o;continue}if(i==="--text"){let o=e[++s];if(o===void 0||o.startsWith("--"))return"missing value for --text";r=o;continue}if(i==="--prompt-id"){let o=e[++s];if(o===void 0||o.startsWith("--"))return"missing value for --prompt-id";n=o;continue}return`unknown argument: ${i}`}return t===void 0?"missing --root <teamfile>":r===void 0?"missing --text <prompt>":{root:t,text:r,...n!==void 0?{promptId:n}:{}}}async function V1(e){let r=await new j1({region:e.region}).send(new D1({IdentityPoolId:e.identityPoolId,Logins:{[e.idpProvider]:e.idToken}}));if(r.IdentityId===void 0||r.IdentityId.length===0)throw new Error("Cognito GetId returned no IdentityId");return r.IdentityId}function K1(e=process.env.LMCTL_TOKEN_PATH??M1(C1(),".lmctl","cli-tokens.json")){try{return JSON.parse($1(e,"utf8"))}catch{return null}}var Yu,Jb=T(()=>{"use strict";Iu();Eu();Po();fu();mu();gu();pu();Yu=`usage: lmctl device <id|init|login|prompt>
2168
+ `),1;let s=Z1();if(s===null)return t.stderr.write("error: no Cognito id token found; run `webcli login` or `lmctl device login` first\n"),1;let i=s.cognito?.idToken;if(typeof i!="string"||i.length===0)return t.stderr.write("error: no Cognito id token found; run `webcli login` or `lmctl device login` first\n"),1;let o=`cognito-idp.${n.config.region}.amazonaws.com/${n.config.cognitoUserPoolId}`,a=typeof s.cognito?.identityId=="string"&&s.cognito.identityId.length>0?s.cognito.identityId:await z1({region:n.config.region,identityPoolId:n.config.identityPoolId,idpProvider:o,idToken:i}),l=W1({identityId:a,logins:{[o]:i},clientConfig:{region:n.config.region}}),c=n.config.deviceId??Br()?.device_id,d=Ns(i)??void 0,u=new Dr({bucket:n.config.mailboxBucket,identityId:a,...d!==void 0?{userId:d}:{},...c!==void 0?{deviceId:c}:{},...n.config.mailboxKey!==void 0?{mailboxKey:n.config.mailboxKey}:{},s3:new J1({region:n.config.region,credentials:l}),commands:{ListObjectsV2Command:q1,GetObjectCommand:B1,PutObjectCommand:H1},selfRole:"browser",onMessage:async()=>{}}),f=eT({root_teamfile:r.root,text:r.text,...r.promptId!==void 0?{prompt_id:r.promptId}:{}}),m=await u.putMessage({conversation_id:QE,payload:f});return t.stdout.write(JSON.stringify({prompt_id:f.prompt_id,mailbox_key:u.getMailboxBasePrefix(),object_key:m},null,2)+`
2169
+ `),0}function Y1(e){let t,r,n;for(let s=0;s<e.length;s+=1){let i=e[s];if(i==="--root"){let o=e[++s];if(o===void 0||o.startsWith("--"))return"missing value for --root";t=o;continue}if(i==="--text"){let o=e[++s];if(o===void 0||o.startsWith("--"))return"missing value for --text";r=o;continue}if(i==="--prompt-id"){let o=e[++s];if(o===void 0||o.startsWith("--"))return"missing value for --prompt-id";n=o;continue}return`unknown argument: ${i}`}return t===void 0?"missing --root <teamfile>":r===void 0?"missing --text <prompt>":{root:t,text:r,...n!==void 0?{promptId:n}:{}}}async function z1(e){let r=await new F1({region:e.region}).send(new U1({IdentityPoolId:e.identityPoolId,Logins:{[e.idpProvider]:e.idToken}}));if(r.IdentityId===void 0||r.IdentityId.length===0)throw new Error("Cognito GetId returned no IdentityId");return r.IdentityId}function Z1(e=process.env.LMCTL_TOKEN_PATH??P1(D1(),".lmctl","cli-tokens.json")){try{return JSON.parse(j1(e,"utf8"))}catch{return null}}var Yu,Jb=T(()=>{"use strict";Iu();Eu();Fo();fu();mu();gu();pu();Yu=`usage: lmctl device <id|init|login|prompt>
2170
2170
  lmctl device login --user-id <sub> --access-key <refreshToken>
2171
2171
  lmctl device prompt --root <teamfile> --text <prompt> [--prompt-id <id>]
2172
2172
 
@@ -2176,7 +2176,7 @@ addressing. The id is stored in ~/.lmctl/device.json by default.
2176
2176
  'lmctl device login' authenticates this machine's 'lmctl serve' daemon to the
2177
2177
  cloud mailbox using your user-id (Cognito sub) and an access key (refresh
2178
2178
  token). The access key is stored in ~/.lmctl/device-auth.json (chmod 600).
2179
- `});import{existsSync as Xb,mkdirSync as Y1,readdirSync as z1,readFileSync as Gb,writeFileSync as Z1}from"node:fs";import{join as Rn}from"node:path";import{fileURLToPath as Q1}from"node:url";function Zu(e){try{return eU.some(t=>Xb(Rn(e,t)))}catch{return!1}}function tU(e){let t=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(t===null)return null;let r=t[1],n=t[2].trimStart(),s=r.match(/^name:\s*(.+)$/m),i=r.match(/^type:\s*(.+)$/m),o=r.match(/^description:\s*(.+)$/m),a=s?.[1]?.trim(),l=i?.[1]?.trim();return!a||!l?null:{name:a,type:l,description:o?.[1]?.trim()??null,body:n}}function Vb(e,t){e.durable_memory_mode!=="db"?rU(e):nU(e,t)}function Kb(e){let t=Zu(e),r;try{r=z1(zu).filter(n=>n.endsWith(".template")).sort()}catch{return[]}return r.filter(n=>n==="skills_lmprobe.md.template"||n==="skills_lmdebug.md.template"?t:!0)}function rU(e){let t=e.local_path;if(!t){console.warn("[bootstrap] skipping: project has no local_path");return}let r=Rn(t,"durable-memory");try{Y1(r,{recursive:!0})}catch(i){console.error("[bootstrap] failed to create durable-memory directory:",i);return}let n=Kb(t),s=[];for(let i of n){let o=i.replace(/\.template$/,""),a=Rn(r,o);if(!Xb(a))try{let l=Gb(Rn(zu,i),"utf8");Z1(a,l,"utf8"),s.push(o)}catch(l){console.error(`[bootstrap] failed to copy ${i}:`,l)}}s.length>0&&console.log(`[bootstrap] filled durable-memory stubs at ${r}: ${s.join(", ")}`)}function nU(e,t){let r=e.local_path??"",n=Kb(r),s=[];for(let i of n){let o=Rn(zu,i),a;try{a=Gb(o,"utf8")}catch(c){console.error(`[bootstrap] failed to read ${i}:`,c);continue}let l=tU(a);if(l===null){console.error(`[bootstrap] failed to parse frontmatter in ${i}`);continue}if(t.getDurableMemoryByName(e.id,l.name)===null)try{t.upsertDurableMemory({project_id:e.id,type:l.type,name:l.name,description:l.description,body:l.body}),s.push(l.name)}catch(c){console.error(`[bootstrap] failed to upsert ${l.name}:`,c)}}s.length>0&&console.log(`[bootstrap] filled durable-memory DB stubs for project ${e.name}: ${s.join(", ")}`)}var zu,eU,Qu=T(()=>{"use strict";zu=Rn(Q1(import.meta.url),"../../config/durable_memory_templates"),eU=[".git","package.json","Cargo.toml","pyproject.toml","go.mod","Gemfile","pom.xml","build.gradle","composer.json","Pipfile"]});import{existsSync as sU,mkdirSync as iU,readdirSync as oU,readFileSync as aU,writeFileSync as lU}from"node:fs";import{join as xa}from"node:path";import{fileURLToPath as cU}from"node:url";function zb(e){let t=e.local_path;if(!t){console.warn("[bootstrap] skipping ai-test: project has no local_path");return}if(!Zu(t))return;let r=xa(t,"ai-test");try{iU(r,{recursive:!0})}catch(s){console.error("[bootstrap] failed to create ai-test directory:",s);return}let n=[];for(let s of dU()){let i=s.replace(/\.template$/,""),o=xa(r,i);if(!sU(o))try{lU(o,uU(s),"utf8"),n.push(i)}catch(a){console.error(`[bootstrap] failed to copy ai-test ${s}:`,a)}}n.length>0&&console.log(`[bootstrap] filled ai-test stubs at ${r}: ${n.join(", ")}`)}function dU(){try{return oU(Yb).filter(e=>e.endsWith(".template")).sort()}catch{return["example-test.md.template","index.md.template"]}}function uU(e){try{return aU(xa(Yb,e),"utf8")}catch{return fU(e)}}function fU(e){let t=e.replace(/\.template$/,"");return t==="index.md"?`# AI Test Suite - index
2179
+ `});import{existsSync as Xb,mkdirSync as Q1,readdirSync as eU,readFileSync as Gb,writeFileSync as tU}from"node:fs";import{join as Rn}from"node:path";import{fileURLToPath as rU}from"node:url";function Zu(e){try{return nU.some(t=>Xb(Rn(e,t)))}catch{return!1}}function sU(e){let t=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(t===null)return null;let r=t[1],n=t[2].trimStart(),s=r.match(/^name:\s*(.+)$/m),i=r.match(/^type:\s*(.+)$/m),o=r.match(/^description:\s*(.+)$/m),a=s?.[1]?.trim(),l=i?.[1]?.trim();return!a||!l?null:{name:a,type:l,description:o?.[1]?.trim()??null,body:n}}function Vb(e,t){e.durable_memory_mode!=="db"?iU(e):oU(e,t)}function Kb(e){let t=Zu(e),r;try{r=eU(zu).filter(n=>n.endsWith(".template")).sort()}catch{return[]}return r.filter(n=>n==="skills_lmprobe.md.template"||n==="skills_lmdebug.md.template"?t:!0)}function iU(e){let t=e.local_path;if(!t){console.warn("[bootstrap] skipping: project has no local_path");return}let r=Rn(t,"durable-memory");try{Q1(r,{recursive:!0})}catch(i){console.error("[bootstrap] failed to create durable-memory directory:",i);return}let n=Kb(t),s=[];for(let i of n){let o=i.replace(/\.template$/,""),a=Rn(r,o);if(!Xb(a))try{let l=Gb(Rn(zu,i),"utf8");tU(a,l,"utf8"),s.push(o)}catch(l){console.error(`[bootstrap] failed to copy ${i}:`,l)}}s.length>0&&console.log(`[bootstrap] filled durable-memory stubs at ${r}: ${s.join(", ")}`)}function oU(e,t){let r=e.local_path??"",n=Kb(r),s=[];for(let i of n){let o=Rn(zu,i),a;try{a=Gb(o,"utf8")}catch(c){console.error(`[bootstrap] failed to read ${i}:`,c);continue}let l=sU(a);if(l===null){console.error(`[bootstrap] failed to parse frontmatter in ${i}`);continue}if(t.getDurableMemoryByName(e.id,l.name)===null)try{t.upsertDurableMemory({project_id:e.id,type:l.type,name:l.name,description:l.description,body:l.body}),s.push(l.name)}catch(c){console.error(`[bootstrap] failed to upsert ${l.name}:`,c)}}s.length>0&&console.log(`[bootstrap] filled durable-memory DB stubs for project ${e.name}: ${s.join(", ")}`)}var zu,nU,Qu=T(()=>{"use strict";zu=Rn(rU(import.meta.url),"../../config/durable_memory_templates"),nU=[".git","package.json","Cargo.toml","pyproject.toml","go.mod","Gemfile","pom.xml","build.gradle","composer.json","Pipfile"]});import{existsSync as aU,mkdirSync as lU,readdirSync as cU,readFileSync as dU,writeFileSync as uU}from"node:fs";import{join as xa}from"node:path";import{fileURLToPath as fU}from"node:url";function zb(e){let t=e.local_path;if(!t){console.warn("[bootstrap] skipping ai-test: project has no local_path");return}if(!Zu(t))return;let r=xa(t,"ai-test");try{lU(r,{recursive:!0})}catch(s){console.error("[bootstrap] failed to create ai-test directory:",s);return}let n=[];for(let s of mU()){let i=s.replace(/\.template$/,""),o=xa(r,i);if(!aU(o))try{uU(o,pU(s),"utf8"),n.push(i)}catch(a){console.error(`[bootstrap] failed to copy ai-test ${s}:`,a)}}n.length>0&&console.log(`[bootstrap] filled ai-test stubs at ${r}: ${n.join(", ")}`)}function mU(){try{return cU(Yb).filter(e=>e.endsWith(".template")).sort()}catch{return["example-test.md.template","index.md.template"]}}function pU(e){try{return dU(xa(Yb,e),"utf8")}catch{return _U(e)}}function _U(e){let t=e.replace(/\.template$/,"");return t==="index.md"?`# AI Test Suite - index
2180
2180
 
2181
2181
  Add test chapters in this directory.
2182
2182
  `:`---
@@ -2198,9 +2198,9 @@ last_run_id: 0
2198
2198
  ## Expected
2199
2199
 
2200
2200
  ## Cleanup
2201
- `}var Yb,Zb=T(()=>{"use strict";Qu();Yb=xa(cU(import.meta.url),"../../config/ai_test_templates")});import{createHash as mU}from"node:crypto";import{existsSync as pU,mkdirSync as _U,writeFileSync as hU}from"node:fs";import{dirname as gU,join as Ln}from"node:path";function Aa(e){return typeof e=="string"&&e.startsWith(Qb)}function SU(e){if(!Aa(e))throw new ht(`not an lmctl:// URI: ${e}`,"malformed");let t=e.slice(Qb.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(!TU.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 vU(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 nd(r)){let i=Ln(s,n);if(pU(i))return i}return null}function kU(e,t,r){let n=Ln(rd(r),wU,e);return e==="skill"?Ln(n,t,"SKILL.md"):Ln(n,`${t}${e==="workflow"?".compound.json":".json"}`)}function IU(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 ef(e,t){let{kind:r,name:n,ref:s}=SU(e),i=vU(r,n,t);if(i!==null)return i;let o=`${yU}${r}/${n}`,a;try{a=await fetch(o,{signal:AbortSignal.timeout(EU)})}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=bU.exec(s);if(d!==null){let u=mU("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(!IU(r,l))throw new ht(`lmctl:// '${e}' remote artifact failed shape validation for ${r} \u2014 discarded, NOT cached.`,"validation-failure");let c=kU(r,n,t);return _U(gU(c),{recursive:!0}),hU(c,l,"utf8"),c}var Qb,yU,wU,EU,TU,ht,bU,eS=T(()=>{"use strict";sd();Qb="lmctl://",yU="https://lmctl.com/templates/",wU=".cache",EU=8e3,TU=new Set(["workflow","mcp","skill"]),ht=class extends Error{reason;constructor(t,r="malformed"){super(t),this.reason=r,this.name="LmctlUriError"}},bU=/^(?:sha256[:-])?([0-9a-f]{64})$/i});import{spawnSync as oS}from"node:child_process";import{cpSync as tS,existsSync as nf,mkdirSync as aS,mkdtempSync as NU,readFileSync as lS,statSync as xU,writeFileSync as tf}from"node:fs";import{homedir as AU,tmpdir as RU}from"node:os";import{basename as rS,join as rt}from"node:path";function Qt(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function rf(e,t,r){if(Array.isArray(e)){for(let n of e)rf(n,t,r);return}if(Qt(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))rf(n,t,r)}}function CU(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(!(!Qt(a)||!Array.isArray(a.steps)))for(let l of a.steps)Qt(l)&&l.members!==void 0&&rf(l.members,t.alias,r)}let s=i=>{let o=new Map;for(let a of i)o.set($U(a),a);return[...o.values()]};return{mcp:s(r.mcp),skills:s(r.skills)}}function MU(e,t){return e.listProjects().find(r=>r.team_id===t.team_id)?.local_path}async function cS(e,t){let r;try{r=await fetch(e,{signal:AbortSignal.timeout(LU)})}catch(s){throw new nt(t,`fetch ${e} failed: ${s.message}`)}if(!r.ok)throw new nt(t,`fetch ${e} \u2192 HTTP ${r.status}`);let n=await r.text();if(n.length>nS)throw new nt(t,`fetched ${e} exceeds ${nS} bytes`);return n}async function jU(e,t){if(typeof e!="string")return[e];Aa(e)&&(e=await ef(e));let r;if(sf.test(e))r=await cS(e,t);else{if(!nf(e))throw new nt(t,`mcp file not found: ${e}`);r=lS(e,"utf8")}let n;try{n=JSON.parse(r)}catch{throw new nt(t,`mcp source is not JSON: ${e}`)}if(Qt(n)&&Qt(n.mcpServers))return Object.entries(n.mcpServers).map(([s,i])=>({name:s,...Qt(i)?i:{}}));if(Qt(n)&&typeof n.name=="string")return[n];throw new nt(t,`mcp source ${e} is neither {mcpServers:{\u2026}} nor a {name,\u2026} server`)}function La(e){return e.type==="http"||e.type==="sse"||e.url!==void 0&&e.command===void 0}function Ra(e,t,r,n){let s=oS(e,t,{cwd:r,env:Ft(void 0,r),encoding:"utf8",timeout:6e4});if(s.error)throw new nt(n,`spawn ${e} failed: ${s.error.message}`);if(s.status!==0)throw new nt(n,`${e} ${t.slice(0,3).join(" ")} exited ${s.status}: ${(s.stderr??"").trim().slice(0,200)}`)}function DU(e,t,r){oS(e,t,{cwd:r,env:Ft(void 0,r),encoding:"utf8",timeout:6e4})}function PU(e,t){return e==="claude"?["mcp","remove",t,"--scope","user"]:["mcp","remove",t]}function FU(e){let t=["mcp","add"];if(La(e)){t.push("-t",e.type==="sse"?"sse":"http");for(let[r,n]of Object.entries(e.headers??{}))t.push("-H",`${r}: ${n}`);t.push(e.name,e.url??"")}else{for(let[r,n]of Object.entries(e.env??{}))t.push("-e",`${r}=${n}`);t.push(e.name,e.command??"",...e.args??[])}return t}function UU(e){if(La(e))return["mcp","add",e.name,"--url",e.url??""];let t=["mcp","add",e.name];for(let[r,n]of Object.entries(e.env??{}))t.push("--env",`${r}=${n}`);return t.push("--",e.command??"",...e.args??[]),t}function WU(e){let t=rt(process.env.XDG_CONFIG_HOME??rt(On(),".config"),"opencode"),r=rt(t,"opencode.json"),n={};if(nf(r))try{let i=JSON.parse(lS(r,"utf8"));Qt(i)&&(n=i)}catch{}let s=Qt(n.mcp)?{...n.mcp}:{};for(let i of e){let{name:o,...a}=i;s[o]=La(i)?{type:"remote",url:a.url,enabled:!0,...a.headers?{headers:a.headers}:{}}:{type:"local",command:[a.command??"",...a.args??[]],enabled:!0,...a.env?{environment:a.env}:{}}}n.mcp=s,n.permission===void 0&&(n.permission="allow"),aS(t,{recursive:!0}),tf(r,`${JSON.stringify(n,null,2)}
2202
- `,"utf8")}function BU(e,t){let r={};for(let n of e)r[n.name]=La(n)?{type:n.type==="sse"?"sse":"http",url:n.url,...n.headers?{headers:n.headers}:{}}:{type:"stdio",command:n.command,args:n.args??[],...n.env?{env:n.env}:{}};try{YT(Au(On()),r)}catch(n){throw new nt(t,`copilot MCP config install failed: ${n instanceof Error?n.message:String(n)}`)}}function qU(e){if(typeof e!="string")return e.name;let t=rS(e.replace(/\/+$/,""));return t.toLowerCase()==="skill.md"?rS(e.replace(/\/skill\.md$/i,"")):t}async function sS(e,t,r){let n=qU(e),s=rt(t,n);if(aS(s,{recursive:!0}),typeof e!="string")return tf(rt(s,"SKILL.md"),e.content,"utf8"),{name:n,dir:s};if(Aa(e)&&(e=await ef(e)),sf.test(e))return tf(rt(s,"SKILL.md"),await cS(e,r),"utf8"),{name:n,dir:s};if(!nf(e))throw new nt(r,`skill path not found: ${e}`);return xU(e).isDirectory()?(tS(e,s,{recursive:!0}),{name:n,dir:s}):(tS(e,rt(s,"SKILL.md")),{name:n,dir:s})}async function dS(e){let{dal:t,member:r,stderr:n}=e,s=CU(t,r);if(s.mcp.length===0&&s.skills.length===0)return;let i=Ue(r),o=r.sessiondir||e.baseDir||MU(t,r)||process.cwd(),a=l=>{n.write(`[seed:${r.alias}] ${l}
2203
- `)};if(s.mcp.length>0){let l=[];for(let c of s.mcp)l.push(...await jU(c,r.alias));if(i==="opencode")WU(l);else if(i==="copilot")BU(l,r.alias);else if(i==="claude"||i==="gemini"||i==="qwen"||i==="agy"||i==="codex")for(let c of l)if(DU(i,PU(i,c.name),o),i==="claude"){let{name:d,...u}=c;Ra("claude",["mcp","add-json",d,JSON.stringify(u),"--scope","user"],o,r.alias)}else i==="codex"?Ra("codex",UU(c),o,r.alias):Ra(i,FU(c),o,r.alias);else a(`provider ${i} has no known MCP install mechanism \u2014 ${l.length} declared server(s) NOT installed.`);["opencode","claude","gemini","qwen","agy","codex","copilot"].includes(i)&&a(`installed ${l.length} MCP server(s) into ${i} (idempotent).`)}if(s.skills.length>0)if(OU.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=NU(rt(RU(),`lmctl-skill-${r.alias}-`));for(let c of s.skills){let d=typeof c=="string"&&!sf.test(c)?c:(await sS(c,l,r.alias)).dir;Ra(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(iS[i]!==void 0){let l=iS[i]();for(let c of s.skills)await sS(c,l,r.alias);a(`installed ${s.skills.length} skill(s) \u2192 ${l}/<name>/SKILL.md (idempotent overwrite).`)}else a(`provider ${i} has no verified skills mechanism \u2014 ${s.skills.length} declared skill(s) NOT installed.`)}var nt,sf,LU,nS,OU,$U,On,iS,uS=T(()=>{"use strict";Ze();eS();it();Os();nt=class extends Error{alias;constructor(t,r){super(`capability install failed for ${t}: ${r}`),this.alias=t,this.name="CapabilityInstallError"}},sf=/^https?:\/\//i,LU=8e3,nS=1e6,OU=new Set(["opencode"]),$U=e=>JSON.stringify(e),On=()=>process.env.HOME??AU();iS={claude:()=>rt(On(),".claude","skills"),qwen:()=>rt(On(),".qwen","skills"),codex:()=>rt(On(),".codex","skills"),copilot:()=>rt(On(),".copilot","skills")}});var of,fS=T(()=>{"use strict";of=`---
2201
+ `}var Yb,Zb=T(()=>{"use strict";Qu();Yb=xa(fU(import.meta.url),"../../config/ai_test_templates")});import{createHash as hU}from"node:crypto";import{existsSync as gU,mkdirSync as yU,writeFileSync as wU}from"node:fs";import{dirname as EU,join as Ln}from"node:path";function Aa(e){return typeof e=="string"&&e.startsWith(Qb)}function IU(e){if(!Aa(e))throw new ht(`not an lmctl:// URI: ${e}`,"malformed");let t=e.slice(Qb.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(!vU.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 NU(e,t,r){if(e==="workflow")return yo(t,r);let n=e==="mcp"?Ln("templates","mcp",`${t}.json`):Ln("templates","skills",t,"SKILL.md");for(let s of nd(r)){let i=Ln(s,n);if(gU(i))return i}return null}function xU(e,t,r){let n=Ln(rd(r),bU,e);return e==="skill"?Ln(n,t,"SKILL.md"):Ln(n,`${t}${e==="workflow"?".compound.json":".json"}`)}function AU(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 ef(e,t){let{kind:r,name:n,ref:s}=IU(e),i=NU(r,n,t);if(i!==null)return i;let o=`${TU}${r}/${n}`,a;try{a=await fetch(o,{signal:AbortSignal.timeout(SU)})}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=kU.exec(s);if(d!==null){let u=hU("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(!AU(r,l))throw new ht(`lmctl:// '${e}' remote artifact failed shape validation for ${r} \u2014 discarded, NOT cached.`,"validation-failure");let c=xU(r,n,t);return yU(EU(c),{recursive:!0}),wU(c,l,"utf8"),c}var Qb,TU,bU,SU,vU,ht,kU,eS=T(()=>{"use strict";sd();Qb="lmctl://",TU="https://lmctl.com/templates/",bU=".cache",SU=8e3,vU=new Set(["workflow","mcp","skill"]),ht=class extends Error{reason;constructor(t,r="malformed"){super(t),this.reason=r,this.name="LmctlUriError"}},kU=/^(?:sha256[:-])?([0-9a-f]{64})$/i});import{spawnSync as oS}from"node:child_process";import{cpSync as tS,existsSync as nf,mkdirSync as aS,mkdtempSync as RU,readFileSync as lS,statSync as LU,writeFileSync as tf}from"node:fs";import{homedir as OU,tmpdir as $U}from"node:os";import{basename as rS,join as rt}from"node:path";function Qt(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function rf(e,t,r){if(Array.isArray(e)){for(let n of e)rf(n,t,r);return}if(Qt(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))rf(n,t,r)}}function DU(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(!(!Qt(a)||!Array.isArray(a.steps)))for(let l of a.steps)Qt(l)&&l.members!==void 0&&rf(l.members,t.alias,r)}let s=i=>{let o=new Map;for(let a of i)o.set(jU(a),a);return[...o.values()]};return{mcp:s(r.mcp),skills:s(r.skills)}}function PU(e,t){return e.listProjects().find(r=>r.team_id===t.team_id)?.local_path}async function cS(e,t){let r;try{r=await fetch(e,{signal:AbortSignal.timeout(CU)})}catch(s){throw new nt(t,`fetch ${e} failed: ${s.message}`)}if(!r.ok)throw new nt(t,`fetch ${e} \u2192 HTTP ${r.status}`);let n=await r.text();if(n.length>nS)throw new nt(t,`fetched ${e} exceeds ${nS} bytes`);return n}async function FU(e,t){if(typeof e!="string")return[e];Aa(e)&&(e=await ef(e));let r;if(sf.test(e))r=await cS(e,t);else{if(!nf(e))throw new nt(t,`mcp file not found: ${e}`);r=lS(e,"utf8")}let n;try{n=JSON.parse(r)}catch{throw new nt(t,`mcp source is not JSON: ${e}`)}if(Qt(n)&&Qt(n.mcpServers))return Object.entries(n.mcpServers).map(([s,i])=>({name:s,...Qt(i)?i:{}}));if(Qt(n)&&typeof n.name=="string")return[n];throw new nt(t,`mcp source ${e} is neither {mcpServers:{\u2026}} nor a {name,\u2026} server`)}function La(e){return e.type==="http"||e.type==="sse"||e.url!==void 0&&e.command===void 0}function Ra(e,t,r,n){let s=oS(e,t,{cwd:r,env:Ft(void 0,r),encoding:"utf8",timeout:6e4});if(s.error)throw new nt(n,`spawn ${e} failed: ${s.error.message}`);if(s.status!==0)throw new nt(n,`${e} ${t.slice(0,3).join(" ")} exited ${s.status}: ${(s.stderr??"").trim().slice(0,200)}`)}function UU(e,t,r){oS(e,t,{cwd:r,env:Ft(void 0,r),encoding:"utf8",timeout:6e4})}function WU(e,t){return e==="claude"?["mcp","remove",t,"--scope","user"]:["mcp","remove",t]}function BU(e){let t=["mcp","add"];if(La(e)){t.push("-t",e.type==="sse"?"sse":"http");for(let[r,n]of Object.entries(e.headers??{}))t.push("-H",`${r}: ${n}`);t.push(e.name,e.url??"")}else{for(let[r,n]of Object.entries(e.env??{}))t.push("-e",`${r}=${n}`);t.push(e.name,e.command??"",...e.args??[])}return t}function qU(e){if(La(e))return["mcp","add",e.name,"--url",e.url??""];let t=["mcp","add",e.name];for(let[r,n]of Object.entries(e.env??{}))t.push("--env",`${r}=${n}`);return t.push("--",e.command??"",...e.args??[]),t}function HU(e){let t=rt(process.env.XDG_CONFIG_HOME??rt(On(),".config"),"opencode"),r=rt(t,"opencode.json"),n={};if(nf(r))try{let i=JSON.parse(lS(r,"utf8"));Qt(i)&&(n=i)}catch{}let s=Qt(n.mcp)?{...n.mcp}:{};for(let i of e){let{name:o,...a}=i;s[o]=La(i)?{type:"remote",url:a.url,enabled:!0,...a.headers?{headers:a.headers}:{}}:{type:"local",command:[a.command??"",...a.args??[]],enabled:!0,...a.env?{environment:a.env}:{}}}n.mcp=s,n.permission===void 0&&(n.permission="allow"),aS(t,{recursive:!0}),tf(r,`${JSON.stringify(n,null,2)}
2202
+ `,"utf8")}function JU(e,t){let r={};for(let n of e)r[n.name]=La(n)?{type:n.type==="sse"?"sse":"http",url:n.url,...n.headers?{headers:n.headers}:{}}:{type:"stdio",command:n.command,args:n.args??[],...n.env?{env:n.env}:{}};try{YT(Au(On()),r)}catch(n){throw new nt(t,`copilot MCP config install failed: ${n instanceof Error?n.message:String(n)}`)}}function XU(e){if(typeof e!="string")return e.name;let t=rS(e.replace(/\/+$/,""));return t.toLowerCase()==="skill.md"?rS(e.replace(/\/skill\.md$/i,"")):t}async function sS(e,t,r){let n=XU(e),s=rt(t,n);if(aS(s,{recursive:!0}),typeof e!="string")return tf(rt(s,"SKILL.md"),e.content,"utf8"),{name:n,dir:s};if(Aa(e)&&(e=await ef(e)),sf.test(e))return tf(rt(s,"SKILL.md"),await cS(e,r),"utf8"),{name:n,dir:s};if(!nf(e))throw new nt(r,`skill path not found: ${e}`);return LU(e).isDirectory()?(tS(e,s,{recursive:!0}),{name:n,dir:s}):(tS(e,rt(s,"SKILL.md")),{name:n,dir:s})}async function dS(e){let{dal:t,member:r,stderr:n}=e,s=DU(t,r);if(s.mcp.length===0&&s.skills.length===0)return;let i=Ue(r),o=r.sessiondir||e.baseDir||PU(t,r)||process.cwd(),a=l=>{n.write(`[seed:${r.alias}] ${l}
2203
+ `)};if(s.mcp.length>0){let l=[];for(let c of s.mcp)l.push(...await FU(c,r.alias));if(i==="opencode")HU(l);else if(i==="copilot")JU(l,r.alias);else if(i==="claude"||i==="gemini"||i==="qwen"||i==="agy"||i==="codex")for(let c of l)if(UU(i,WU(i,c.name),o),i==="claude"){let{name:d,...u}=c;Ra("claude",["mcp","add-json",d,JSON.stringify(u),"--scope","user"],o,r.alias)}else i==="codex"?Ra("codex",qU(c),o,r.alias):Ra(i,BU(c),o,r.alias);else a(`provider ${i} has no known MCP install mechanism \u2014 ${l.length} declared server(s) NOT installed.`);["opencode","claude","gemini","qwen","agy","codex","copilot"].includes(i)&&a(`installed ${l.length} MCP server(s) into ${i} (idempotent).`)}if(s.skills.length>0)if(MU.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=RU(rt($U(),`lmctl-skill-${r.alias}-`));for(let c of s.skills){let d=typeof c=="string"&&!sf.test(c)?c:(await sS(c,l,r.alias)).dir;Ra(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(iS[i]!==void 0){let l=iS[i]();for(let c of s.skills)await sS(c,l,r.alias);a(`installed ${s.skills.length} skill(s) \u2192 ${l}/<name>/SKILL.md (idempotent overwrite).`)}else a(`provider ${i} has no verified skills mechanism \u2014 ${s.skills.length} declared skill(s) NOT installed.`)}var nt,sf,CU,nS,MU,jU,On,iS,uS=T(()=>{"use strict";Ze();eS();it();Os();nt=class extends Error{alias;constructor(t,r){super(`capability install failed for ${t}: ${r}`),this.alias=t,this.name="CapabilityInstallError"}},sf=/^https?:\/\//i,CU=8e3,nS=1e6,MU=new Set(["opencode"]),jU=e=>JSON.stringify(e),On=()=>process.env.HOME??OU();iS={claude:()=>rt(On(),".claude","skills"),qwen:()=>rt(On(),".qwen","skills"),codex:()=>rt(On(),".codex","skills"),copilot:()=>rt(On(),".copilot","skills")}});var of,fS=T(()=>{"use strict";of=`---
2204
2204
 
2205
2205
  # Durable memory \u2014 how to use it
2206
2206
 
@@ -2211,22 +2211,22 @@ ON EVERY NEW TASK:
2211
2211
  2. Pull only the chapters relevant to your current task. Don't load everything.
2212
2212
  3. If you learn something durable (a project convention, a decision, a fact worth preserving), write it back: create/update \`<project>/durable-memory/<descriptive-name>.md\` with YAML frontmatter (name/description/type) + body. The engine syncs the write automatically.
2213
2213
 
2214
- Don't dump all of durable-memory into your context. The pattern is index-first, chapter-on-demand.`});var pS={};ye(pS,{runTeam:()=>XU});import{join as HU}from"node:path";async function XU(e,t){let[r,...n]=e;if(r==="--help"||r==="-h"||r==="help")return t.stdout.write(JU),0;try{return await $(t,async s=>{switch(r){case"create":return VU(n,t,s);case"list":return KU(n,t,s);case"show":return YU(n,t,s);case"add-member":return zU(n,t,s);case"seed":return mS(n,t,s,!1);case"refresh":return mS(n,t,s,!0);case"companion":return QU(n,t,s);case"list-roots":return GU(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 GU(e,t,r){let n=Z(e,[]);if(n.error!==void 0)return v(t,n.error);if(n.positionals.length>0)return v(t,"usage: team list-roots [--json]");let s=r.listRootTeams();return G(n,"--json")?ae(t,s):t.stdout.write(s.map(i=>`${i.name??"(unnamed)"} ${i.teamfile_path} ${i.last_seeded_at??""}`).join(`
2214
+ Don't dump all of durable-memory into your context. The pattern is index-first, chapter-on-demand.`});var pS={};we(pS,{runTeam:()=>KU});import{join as GU}from"node:path";async function KU(e,t){let[r,...n]=e;if(r==="--help"||r==="-h"||r==="help")return t.stdout.write(VU),0;try{return await $(t,async s=>{switch(r){case"create":return zU(n,t,s);case"list":return ZU(n,t,s);case"show":return QU(n,t,s);case"add-member":return eW(n,t,s);case"seed":return mS(n,t,s,!1);case"refresh":return mS(n,t,s,!0);case"companion":return rW(n,t,s);case"list-roots":return YU(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 YU(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(`
2215
2215
  `)+(s.length>0?`
2216
- `:"")),0}function VU(e,t,r){let[n]=e;if(n===void 0)return v(t,"usage: team create <name>");let s=r.insertTeam({name:n});return t.stdout.write(`created team ${s.name}
2217
- `),0}function KU(e,t,r){let n=Z(e,[]);if(n.error!==void 0)return v(t,n.error);let s=r.listTeams();return G(n,"--json")?ae(t,s):t.stdout.write(`${s.map(i=>`${i.id} ${i.name}`).join(`
2216
+ `:"")),0}function zU(e,t,r){let[n]=e;if(n===void 0)return v(t,"usage: team create <name>");let s=r.insertTeam({name:n});return t.stdout.write(`created team ${s.name}
2217
+ `),0}function 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(`
2218
2218
  `)}${s.length>0?`
2219
- `:""}`),0}function YU(e,t,r){let n=Z(e,[]);if(n.error!==void 0)return v(t,n.error);let[s]=n.positionals;if(s===void 0)return v(t,"usage: team show <name> [--json]");let i=r.findTeamByName(s);if(i===null)return v(t,`team not found: ${s}`);let o=r.listTeamMembers(i.id);if(G(n,"--json"))ae(t,{team:i,members:o});else{t.stdout.write(`team ${i.name}
2219
+ `:""}`),0}function QU(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}
2220
2220
  `);for(let a of o)t.stdout.write(`- ${a.alias} ${Ue(a)} ${a.sessionid??"(unseeded)"}
2221
- `)}return 0}function zU(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")??HU(br(),"sessions",i.name,o)});return G(n,"--json")?ae(t,l):t.stdout.write(`added member ${l.alias} to ${i.name}
2222
- `),0}async function mS(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=ZU(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=gy(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))Vb(f,r),zb(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 _=p.role_prompt??"",g=_.length>0?`${_}
2221
+ `)}return 0}function eW(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")??GU(br(),"sessions",i.name,o)});return V(n,"--json")?ae(t,l):t.stdout.write(`added member ${l.alias} to ${i.name}
2222
+ `),0}async function mS(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=tW(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=gy(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))Vb(f,r),zb(f);let d=[],u=!1;for(let f of l){let m=await $i({member:f,dal:r}),p=r.updateTeamMemberSession(f.id,m.sessionid);if(p!==null){let _=p.role_prompt??"",g=_.length>0?`${_}
2223
2223
 
2224
2224
  ${of}`:of;r.setMemberPromptSnapshot(f.id,g),d.push(p);let h=Ia(Ue(p),m.sessionid);h!==null&&t.stderr.write(`[seeded ${p.alias}] customize/compact in its native TUI:
2225
2225
  ${h}
2226
2226
  `);try{await dS({dal:r,member:p,stderr:t.stderr})}catch(S){u=!0,t.stderr.write(`error: ${S instanceof Error?S.message:String(S)}
2227
- `)}}}return G(s,"--json")?ae(t,d):t.stdout.write(`seeded ${d.length} member(s)
2228
- `),u?1:0}function ZU(e,t,r){return e.filter(n=>t!==void 0&&n.alias!==t?!1:r||n.sessionid===null)}function QU(e,t,r){let n=Z(e,["--interpreter","--of"]);if(n.error!==void 0)return v(t,n.error);let[s]=n.positionals;if(s===void 0)return v(t,"usage: team companion <team-name> --interpreter A --of B[,C]");let i=r.findTeamByName(s);if(i===null)return v(t,`team not found: ${s}`);let o=P(n,"--interpreter"),a=P(n,"--of")?.split(",").map(c=>c.trim()).filter(Boolean);if(o===void 0||a===void 0||a.length===0)return v(t,"team companion requires --interpreter and --of");let l=r.findTeamMemberByAlias(i.id,o);if(l===null)return v(t,`member not found: ${o}`);for(let c of a){let d=r.findTeamMemberByAlias(i.id,c);if(d===null)return v(t,`member not found: ${c}`);r.insertTeamMemberCompanion({interpreter_id:l.id,companion_id:d.id})}return t.stdout.write(`recorded ${a.length} companion link(s)
2229
- `),0}var JU,_S=T(()=>{"use strict";Xe();hc();Qu();Zb();Ze();An();uS();No();Le();fS();JU=`usage: lmctl team create <name>
2227
+ `)}}}return V(s,"--json")?ae(t,d):t.stdout.write(`seeded ${d.length} member(s)
2228
+ `),u?1:0}function tW(e,t,r){return e.filter(n=>t!==void 0&&n.alias!==t?!1:r||n.sessionid===null)}function rW(e,t,r){let n=Z(e,["--interpreter","--of"]);if(n.error!==void 0)return v(t,n.error);let[s]=n.positionals;if(s===void 0)return v(t,"usage: team companion <team-name> --interpreter A --of B[,C]");let i=r.findTeamByName(s);if(i===null)return v(t,`team not found: ${s}`);let o=P(n,"--interpreter"),a=P(n,"--of")?.split(",").map(c=>c.trim()).filter(Boolean);if(o===void 0||a===void 0||a.length===0)return v(t,"team companion requires --interpreter and --of");let l=r.findTeamMemberByAlias(i.id,o);if(l===null)return v(t,`member not found: ${o}`);for(let c of a){let d=r.findTeamMemberByAlias(i.id,c);if(d===null)return v(t,`member not found: ${c}`);r.insertTeamMemberCompanion({interpreter_id:l.id,companion_id:d.id})}return t.stdout.write(`recorded ${a.length} companion link(s)
2229
+ `),0}var VU,_S=T(()=>{"use strict";Xe();hc();Qu();Zb();Ze();An();uS();xo();Le();fS();VU=`usage: lmctl team create <name>
2230
2230
  lmctl team list [--json]
2231
2231
  lmctl team show <name> [--json]
2232
2232
  lmctl team add-member <team-name> --alias A --provider P [--model M] [--role R] [--sessiondir D] [--json]
@@ -2237,8 +2237,8 @@ ${of}`:of;r.setMemberPromptSnapshot(f.id,g),d.push(p);let h=Ia(Ue(p),m.sessionid
2237
2237
 
2238
2238
  Manage DB-backed teams, members, and provider session lifecycle. Use seed or
2239
2239
  refresh to create/update native provider sessions for team members.
2240
- `});var bS={};ye(bS,{applyMaxBytes:()=>Oa,renderMessage:()=>ES,runTail:()=>sW});async function sW(e,t={stdout:process.stdout,stderr:process.stderr}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(`${nW}
2241
- `),0;let r=Z(e,["--lines","--max-bytes","--watch-interval","--provider","--session","--run"],["--watch","--help"]);if(r.error!==void 0)return v(t,r.error);let n=P(r,"--lines"),s=P(r,"--max-bytes");if(n!==void 0&&s!==void 0)return v(t,"--lines and --max-bytes are mutually exclusive (choose one)");let i;if(n!==void 0){let m=Number.parseInt(n,10);if(!Number.isFinite(m)||m<1||String(m)!==n)return v(t,`invalid --lines "${n}" (expected a positive integer)`);i={kind:"lines",lines:m}}else{let m=s===void 0?tW:Number.parseInt(s,10);if(!Number.isFinite(m)||m<0||s!==void 0&&String(m)!==s)return v(t,`invalid --max-bytes "${s}" (expected a non-negative integer)`);i={kind:"bytes",maxBytes:m}}let o=G(r,"--watch"),a=P(r,"--watch-interval"),l=a===void 0?rW: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=>iW(t,p,m,i,o,l))}catch(p){return je(t,p)}}let d=yr(eW,{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 _=At(p);if(_===void 0)return v(t,`tail: ${d.teamfile} has no Lead member; pass <tf>:<alias>`);try{let g=await $(t,h=>He(d.teamfile,_.alias,h));u={provider:g.provider,sessionId:g.sessionid,cwd:g.sessiondir}}catch(g){return g instanceof ge?v(t,g.message):je(t,g)}}else try{let m=await $(t,p=>He(d.teamfile,d.alias,p));u={provider:m.provider,sessionId:m.sessionid,cwd:m.sessiondir}}catch(m){return m instanceof ge?v(t,m.message):je(t,m)}else{let m=d.sessionid,p=d.provider;if(p===void 0){let _=await Na(m);if(_.length===0)return v(t,`tail: session "${m}" not found in any provider store`);if(_.length>1)return v(t,`tail: session "${m}" matches multiple providers (${_.join(", ")}); pass --provider`);p=_[0]}u={provider:p,sessionId:m}}let f=await hS(t,u.provider,u.sessionId,i,-1);return f<0?1:o?await new Promise(m=>{let p=async()=>{try{let h=await hS(t,u.provider,u.sessionId,i,f);h>=0&&(f=h)}catch(h){t.stderr.write(`tail: ${h instanceof Error?h.message:String(h)}
2240
+ `});var bS={};we(bS,{applyMaxBytes:()=>Oa,renderMessage:()=>ES,runTail:()=>aW});async function aW(e,t={stdout:process.stdout,stderr:process.stderr}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(`${oW}
2241
+ `),0;let r=Z(e,["--lines","--max-bytes","--watch-interval","--provider","--session","--run"],["--watch","--help"]);if(r.error!==void 0)return v(t,r.error);let n=P(r,"--lines"),s=P(r,"--max-bytes");if(n!==void 0&&s!==void 0)return v(t,"--lines and --max-bytes are mutually exclusive (choose one)");let i;if(n!==void 0){let m=Number.parseInt(n,10);if(!Number.isFinite(m)||m<1||String(m)!==n)return v(t,`invalid --lines "${n}" (expected a positive integer)`);i={kind:"lines",lines:m}}else{let m=s===void 0?sW: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?iW: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=>lW(t,p,m,i,o,l))}catch(p){return je(t,p)}}let d=yr(nW,{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 _=At(p);if(_===void 0)return v(t,`tail: ${d.teamfile} has no Lead member; pass <tf>:<alias>`);try{let g=await $(t,h=>He(d.teamfile,_.alias,h));u={provider:g.provider,sessionId:g.sessionid,cwd:g.sessiondir}}catch(g){return g instanceof 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 _=await Na(m);if(_.length===0)return v(t,`tail: session "${m}" not found in any provider store`);if(_.length>1)return v(t,`tail: session "${m}" matches multiple providers (${_.join(", ")}); pass --provider`);p=_[0]}u={provider:p,sessionId:m}}let f=await hS(t,u.provider,u.sessionId,i,-1);return f<0?1:o?await new Promise(m=>{let p=async()=>{try{let h=await hS(t,u.provider,u.sessionId,i,f);h>=0&&(f=h)}catch(h){t.stderr.write(`tail: ${h instanceof Error?h.message:String(h)}
2242
2242
  `)}},_=setInterval(()=>{p()},l*1e3),g=()=>{clearInterval(_),m(0)};process.once("SIGINT",g),process.once("SIGTERM",g)}):0}async function hS(e,t,r,n,s){let i;try{i=await Zt(r,t)}catch(c){return e.stderr.write(`tail: failed to load session: ${c instanceof Error?c.message:String(c)}
2243
2243
  `),-1}if(i===null)return e.stderr.write(`tail: session not found: ${r} (provider=${t})
2244
2244
  `),-1;let o=i.messages??[],a=s<0&&n.kind==="lines"?Math.max(0,o.length-n.lines):s+1;if(a>=o.length)return o.length-1;let l="";for(let c=a;c<o.length;c+=1)l+=`${ES(o[c])}
@@ -2247,18 +2247,18 @@ refresh to create/update native provider sessions for team members.
2247
2247
  `).split(`
2248
2248
  `),i=s[0]??"",o=s.slice(1);return o.length===0?`${r}: ${i}`:`${r}: ${i}
2249
2249
  ${o.map(a=>` ${a}`).join(`
2250
- `)}`}async function iW(e,t,r,n,s,i){if(t.getRun(r)===null)return v(e,`tail: run ${r}: not found`);let a=t.listSessionEvents(r),c=(n.kind==="lines"?a.slice(Math.max(0,a.length-n.lines)):a).map(u=>`${wS(u)}
2250
+ `)}`}async function lW(e,t,r,n,s,i){if(t.getRun(r)===null)return v(e,`tail: run ${r}: not found`);let a=t.listSessionEvents(r),c=(n.kind==="lines"?a.slice(Math.max(0,a.length-n.lines)):a).map(u=>`${wS(u)}
2251
2251
  `).join("");e.stdout.write(n.kind==="bytes"?Oa(c,n.maxBytes):c);let d=a.length>0?a[a.length-1].id:0;return s?await new Promise(u=>{let m=setInterval(()=>{try{let _=t.listSessionEvents(r,d),g="";for(let h of _)g+=`${wS(h)}
2252
2252
  `,d=h.id;g.length>0&&e.stdout.write(n.kind==="bytes"?Oa(g,n.maxBytes):g)}catch(_){e.stderr.write(`tail: ${_ instanceof Error?_.message:String(_)}
2253
- `)}},i*1e3),p=()=>{clearInterval(m),u(0)};process.once("SIGINT",p),process.once("SIGTERM",p)}):0}function Oa(e,t){if(t===0||Buffer.byteLength(e,"utf8")<=t)return e;let n=Buffer.byteLength(gS,"utf8");if(n>=t)return yS(e,t);let s=t-n,i=yS(e,s);return`${gS}${i}`}function yS(e,t){if(t<=0)return"";let r=Buffer.from(e,"utf8"),n=Math.max(0,r.length-t);for(;n<r.length&&(r[n]&192)===128;)n+=1;return r.subarray(n).toString("utf8")}function wS(e){let t=TS(new Date(e.timestamp_ms))??"",r="";try{let i=JSON.parse(e.payload);typeof i.alias=="string"&&(r=`alias=${i.alias}`),typeof i.provider=="string"&&(r+=`${r?" ":""}provider=${i.provider}`),typeof i.tool=="string"&&(r+=`${r?" ":""}tool=${i.tool}`),typeof i.status=="string"&&(r+=`${r?" ":""}status=${i.status}`),(typeof i.tokens_in=="number"||typeof i.tokens_out=="number")&&(r+=`${r?" ":""}tokens=${i.tokens_in??0}/${i.tokens_out??0}`)}catch{}let n=r!==""?r:e.payload.slice(0,200),s=e.step_id===null?"":` step=${e.step_id}`;return`${t} ${e.kind}${s}: ${n}`}function TS(e){if(e===void 0)return;let t=e instanceof Date?e:new Date(e);if(Number.isNaN(t.getTime()))return;let r=n=>String(n).padStart(2,"0");return`${t.getFullYear()}-${r(t.getMonth()+1)}-${r(t.getDate())} ${r(t.getHours())}:${r(t.getMinutes())}:${r(t.getSeconds())}`}var eW,tW,rW,nW,gS,SS=T(()=>{"use strict";An();Le();Lt();Yt();Rt();eW={name:"tail",allowsBareTeamfile:!0,supportsRaw:!0},tW=4096,rW=2,nW=`usage: lmctl tail [target] [alias]
2253
+ `)}},i*1e3),p=()=>{clearInterval(m),u(0)};process.once("SIGINT",p),process.once("SIGTERM",p)}):0}function Oa(e,t){if(t===0||Buffer.byteLength(e,"utf8")<=t)return e;let n=Buffer.byteLength(gS,"utf8");if(n>=t)return yS(e,t);let s=t-n,i=yS(e,s);return`${gS}${i}`}function yS(e,t){if(t<=0)return"";let r=Buffer.from(e,"utf8"),n=Math.max(0,r.length-t);for(;n<r.length&&(r[n]&192)===128;)n+=1;return r.subarray(n).toString("utf8")}function wS(e){let t=TS(new Date(e.timestamp_ms))??"",r="";try{let i=JSON.parse(e.payload);typeof i.alias=="string"&&(r=`alias=${i.alias}`),typeof i.provider=="string"&&(r+=`${r?" ":""}provider=${i.provider}`),typeof i.tool=="string"&&(r+=`${r?" ":""}tool=${i.tool}`),typeof i.status=="string"&&(r+=`${r?" ":""}status=${i.status}`),(typeof i.tokens_in=="number"||typeof i.tokens_out=="number")&&(r+=`${r?" ":""}tokens=${i.tokens_in??0}/${i.tokens_out??0}`)}catch{}let n=r!==""?r:e.payload.slice(0,200),s=e.step_id===null?"":` step=${e.step_id}`;return`${t} ${e.kind}${s}: ${n}`}function TS(e){if(e===void 0)return;let t=e instanceof Date?e:new Date(e);if(Number.isNaN(t.getTime()))return;let r=n=>String(n).padStart(2,"0");return`${t.getFullYear()}-${r(t.getMonth()+1)}-${r(t.getDate())} ${r(t.getHours())}:${r(t.getMinutes())}:${r(t.getSeconds())}`}var nW,sW,iW,oW,gS,SS=T(()=>{"use strict";An();Le();Lt();Yt();Rt();nW={name:"tail",allowsBareTeamfile:!0,supportsRaw:!0},sW=4096,iW=2,oW=`usage: lmctl tail [target] [alias]
2254
2254
  lmctl tail --session <id> [--provider <name>]
2255
2255
  lmctl tail --run <id>
2256
2256
  [--lines N | --max-bytes N] [--watch] [--watch-interval Ns] [--provider <name>]
2257
2257
 
2258
2258
  Print or watch provider session messages, or follow a managed run timeline.
2259
2259
  --lines and --max-bytes are mutually exclusive. Default: --max-bytes 4096.`;gS=`\u2026 [truncated older output \u2014 raise with --max-bytes]
2260
- `});var LS={};ye(LS,{runInfo:()=>dW});import{execFileSync as af}from"node:child_process";import{dirname as vS,resolve as oW}from"node:path";function cW(e){return e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${Math.round(e/1e3)}K`:String(e)}async function dW(e,t={stdout:process.stdout,stderr:process.stderr}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(`${lW}
2261
- `),0;let r=Z(e,["--provider","--run"],["--json","--help"]);if(r.error!==void 0)return v(t,r.error);if(r.positionals.length>2)return v(t,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let n=G(r,"--json"),s=P(r,"--run");if(s!==void 0){if(r.positionals.length>0)return v(t,"--run is mutually exclusive with positional [target] [alias]");if(P(r,"--provider")!==void 0)return v(t,"--run is mutually exclusive with --provider");let d=Number.parseInt(s,10);if(!Number.isFinite(d)||d<=0||String(d)!==s)return v(t,`invalid --run "${s}" (expected a positive integer run id)`);try{return await $(t,async u=>fW(t,u,d,n))}catch(u){return je(t,u)}}let i=yr(aW,{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 mW(t,d,n)}let o,a,l,c;if(i.mode==="ai-team")try{let d=await $(t,u=>He(i.teamfile,i.alias,u));o=d.provider,a=d.sessionid,l=d.alias,c={teamfile:d.teamfile,alias:d.alias}}catch(d){return d instanceof ge?v(t,d.message):je(t,d)}else if(a=i.sessionid,i.provider!==void 0)o=i.provider;else{let d=await Na(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 uW(t,o,a,l,n,c)}async function uW(e,t,r,n,s,i){let o;try{o=await Zt(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 pW(e,i,o),c={provider:o.provider,sessionId:o.sessionId,sessionid:o.sessionId,cwd:o.cwd,messageCount:o.messageCount??null,...o.model!==void 0?{model:o.model}:{},...n!==void 0?{alias:n}:{},...l??{},totalInputTokens:o.totalInputTokens??null,totalOutputTokens:o.totalOutputTokens??null,...o.totalCachedInputTokens!==void 0?{totalCachedInputTokens:o.totalCachedInputTokens}:{},sessionLimit:a,createdAt:o.createdAt.toISOString(),modifiedAt:o.modifiedAt.toISOString()};return s?(ae(e,c),0):(e.stdout.write(`Session: ${o.sessionId}
2260
+ `});var LS={};we(LS,{runInfo:()=>mW});import{execFileSync as af}from"node:child_process";import{dirname as vS,resolve as cW}from"node:path";function fW(e){return e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${Math.round(e/1e3)}K`:String(e)}async function mW(e,t={stdout:process.stdout,stderr:process.stderr}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(`${uW}
2261
+ `),0;let r=Z(e,["--provider","--run"],["--json","--help"]);if(r.error!==void 0)return v(t,r.error);if(r.positionals.length>2)return v(t,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let n=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=>_W(t,u,d,n))}catch(u){return je(t,u)}}let i=yr(dW,{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 hW(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 Na(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 pW(t,o,a,l,n,c)}async function pW(e,t,r,n,s,i){let o;try{o=await Zt(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=Ms(o.messages),l=i===void 0?null:await gW(e,i,o),c={provider:o.provider,sessionId:o.sessionId,sessionid:o.sessionId,cwd:o.cwd,messageCount:o.messageCount??null,...o.model!==void 0?{model:o.model}:{},...n!==void 0?{alias:n}:{},...l??{},totalInputTokens:o.totalInputTokens??null,totalOutputTokens:o.totalOutputTokens??null,...o.totalCachedInputTokens!==void 0?{totalCachedInputTokens:o.totalCachedInputTokens}:{},sessionLimit:a,createdAt:o.createdAt.toISOString(),modifiedAt:o.modifiedAt.toISOString()};return s?(ae(e,c),0):(e.stdout.write(`Session: ${o.sessionId}
2262
2262
  `),e.stdout.write(` Provider: ${o.provider}
2263
2263
  `),n!==void 0&&e.stdout.write(` Alias: ${n}
2264
2264
  `),l!==null&&e.stdout.write(` Liveness: ${lf(l.liveness)}
@@ -2270,7 +2270,7 @@ Print or watch provider session messages, or follow a managed run timeline.
2270
2270
  `),a!==null&&e.stdout.write(` SessionLimit: LIMITED resets_at=${NS(a)}
2271
2271
  `),e.stdout.write(` Created: ${c.createdAt}
2272
2272
  `),e.stdout.write(` Modified: ${c.modifiedAt}
2273
- `),0)}async function fW(e,t,r,n){let s=Rr(t,r);if(s===null)return v(e,`health: run ${r}: not found`);let i=on(t,r),o=t.agentCallTokenTotals(r),a=new Map;for(let l of s.steps){let c=l.outcome===null?`${l.state_name}:pending`:`${l.state_name}:${l.outcome}`;a.set(c,(a.get(c)??0)+1)}return n?(ae(e,{run_id:s.id,workflow:s.workflow?.name??null,team:s.team?.name??null,current_state:s.current_state,terminal_state:s.terminal_state,paused:i?.paused??!1,started_at:s.started_at,ended_at:s.ended_at,step_count:s.steps.length,totalInputTokens:o.totalInputTokens,totalOutputTokens:o.totalOutputTokens,agent_call_count:o.agentCallCount}),0):(e.stdout.write(`RUN: ${s.id}
2273
+ `),0)}async function _W(e,t,r,n){let s=Rr(t,r);if(s===null)return v(e,`health: run ${r}: not found`);let i=on(t,r),o=t.agentCallTokenTotals(r),a=new Map;for(let l of s.steps){let c=l.outcome===null?`${l.state_name}:pending`:`${l.state_name}:${l.outcome}`;a.set(c,(a.get(c)??0)+1)}return n?(ae(e,{run_id:s.id,workflow:s.workflow?.name??null,team:s.team?.name??null,current_state:s.current_state,terminal_state:s.terminal_state,paused:i?.paused??!1,started_at:s.started_at,ended_at:s.ended_at,step_count:s.steps.length,totalInputTokens:o.totalInputTokens,totalOutputTokens:o.totalOutputTokens,agent_call_count:o.agentCallCount}),0):(e.stdout.write(`RUN: ${s.id}
2274
2274
  `),e.stdout.write(` Workflow: ${s.workflow?.name??"(unknown)"}
2275
2275
  `),e.stdout.write(` Team: ${s.team?.name??"(unknown)"}
2276
2276
  `),e.stdout.write(` State: ${s.current_state??"(none)"}${s.terminal_state!==null?` (terminal: ${s.terminal_state})`:""}
@@ -2280,64 +2280,64 @@ Print or watch provider session messages, or follow a managed run timeline.
2280
2280
  `),e.stdout.write(` Steps: ${s.steps.length}
2281
2281
  `),e.stdout.write(` AgentCalls: ${o.agentCallCount}
2282
2282
  `),e.stdout.write(` Tokens: ${o.totalInputTokens} in / ${o.totalOutputTokens} out
2283
- `),0)}async function mW(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:kS(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=xS(t),o=i.kind==="repo"?i:null,a=await IS(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 Zt(y.sessionid,y.provider)}catch(W){e.stderr.write(`warning: failed to load session "${y.sessionid}" for ${y.reportPath} (${y.provider}): ${W instanceof Error?W.message:String(W)}
2284
- `)}let I=w?.messageCount,x=o===null?void 0:w===null?null:AS(w,o.since),U=o===null?void 0:w===null?null:RS(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(cf(y.teamfile,y.alias))??df(),sessionLimit:w===null?null:Cs(w.messages),...o!==null?{activitySinceLastCommit:ue,cumulativeTokens:U}:{}}),I===void 0?c=void 0:c!==void 0&&(c+=I),o!==null&&(x==null?d=void 0:d!==void 0&&(d+=x),U==null||U==="n/a"?u=void 0:u!==void 0&&(u+=U))}if(r)return ae(e,{team:s,git:o===null?null:{teamDir:o.teamDir,commits:o.commits.map(y=>({ref:y.ref,timestamp:y.timestamp.toISOString()})),since:o.since.toISOString(),working:o.working},members:l.map(({detailLoaded:y,cumulativeTokens:w,...I})=>({...I,lastContext:I.lastContext??null,...w!==void 0?{cumulativeTokens:w==="n/a"?null:w}:{}})),total:{messageCount:c??null}}),0;let f=Math.max(7,...l.map(y=>y.sessionid.length)),m=Math.max(5,...l.map(y=>y.reportPath.length))+1,p=Math.max(8,...l.map(y=>y.provider.length))+1,_=Math.max(5,...l.map(y=>y.model.length))+1,g=Math.max(4,...l.map(y=>lf(y.liveness).length))+1;if(e.stdout.write(`TEAM: ${s}
2283
+ `),0)}async function hW(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:kS(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=xS(t),o=i.kind==="repo"?i:null,a=await IS(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 Zt(y.sessionid,y.provider)}catch(W){e.stderr.write(`warning: failed to load session "${y.sessionid}" for ${y.reportPath} (${y.provider}): ${W instanceof Error?W.message:String(W)}
2284
+ `)}let I=w?.messageCount,x=o===null?void 0:w===null?null:AS(w,o.since),U=o===null?void 0:w===null?null:RS(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(cf(y.teamfile,y.alias))??df(),sessionLimit:w===null?null:Ms(w.messages),...o!==null?{activitySinceLastCommit:ue,cumulativeTokens:U}:{}}),I===void 0?c=void 0:c!==void 0&&(c+=I),o!==null&&(x==null?d=void 0:d!==void 0&&(d+=x),U==null||U==="n/a"?u=void 0:u!==void 0&&(u+=U))}if(r)return ae(e,{team:s,git:o===null?null:{teamDir:o.teamDir,commits:o.commits.map(y=>({ref:y.ref,timestamp:y.timestamp.toISOString()})),since:o.since.toISOString(),working:o.working},members:l.map(({detailLoaded:y,cumulativeTokens:w,...I})=>({...I,lastContext:I.lastContext??null,...w!==void 0?{cumulativeTokens:w==="n/a"?null:w}:{}})),total:{messageCount:c??null}}),0;let f=Math.max(7,...l.map(y=>y.sessionid.length)),m=Math.max(5,...l.map(y=>y.reportPath.length))+1,p=Math.max(8,...l.map(y=>y.provider.length))+1,_=Math.max(5,...l.map(y=>y.model.length))+1,g=Math.max(4,...l.map(y=>lf(y.liveness).length))+1;if(e.stdout.write(`TEAM: ${s}
2285
2285
  `),i.kind==="repo"){e.stdout.write(`Git progress:
2286
2286
  `);for(let y of i.commits)e.stdout.write(` ${y.ref}: ${y.timestamp.toISOString()}
2287
2287
  `);e.stdout.write(` Uncommitted: ${gt(i.working.uncommittedTracked)} changed (tracked), ${gt(i.working.untracked)} untracked
2288
2288
  `)}else i.reason==="no-commits"?e.stdout.write(`Git progress: git repository in ${i.teamDir} has no commits (no commit-based progress to report)
2289
2289
  `):e.stdout.write(`Git progress: no git repository in ${i.teamDir} (no commit-based progress to report)
2290
2290
  `);e.stdout.write(` ${"SESSION".padEnd(f)} ${"ALIAS".padEnd(m)}${"PROVIDER".padEnd(p)}${"MODEL".padEnd(_)}${"LIVE".padEnd(g)}${"MSGS".padStart(6)} ${"LAST CONTEXT".padStart(12)}`+(o!==null?` ${"MSGS SINCE COMMIT".padStart(17)} ${"TOKENS SINCE COMMIT".padStart(19)} ${"TOKENS (cumulative)".padStart(19)}`:"")+`
2291
- `);let h=!1,S=l.filter(y=>y.sessionLimit!==null);for(let y of l){let w=gW(y.lastContext,y.detailLoaded,cW);(w==="n/a"||y.cumulativeTokens==="n/a")&&(h=!0),e.stdout.write(` ${y.sessionid.padEnd(f)} ${y.reportPath.padEnd(m)}${y.provider.padEnd(p)}${y.model.padEnd(_)}${lf(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)} ${hW(y.cumulativeTokens).padStart(19)}`:"")+`
2291
+ `);let h=!1,S=l.filter(y=>y.sessionLimit!==null);for(let y of l){let w=EW(y.lastContext,y.detailLoaded,fW);(w==="n/a"||y.cumulativeTokens==="n/a")&&(h=!0),e.stdout.write(` ${y.sessionid.padEnd(f)} ${y.reportPath.padEnd(m)}${y.provider.padEnd(p)}${y.model.padEnd(_)}${lf(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)} ${wW(y.cumulativeTokens).padStart(19)}`:"")+`
2292
2292
  `)}if(e.stdout.write(` ${"TOTAL".padEnd(f)} ${"".padEnd(m)}${"".padEnd(p)}${"".padEnd(_)}${"".padEnd(g)}${gt(c).padStart(6)}`+(o!==null?` ${"".padStart(12)} ${gt(d).padStart(17)} ${gt(null).padStart(19)} ${gt(u).padStart(19)}`:"")+`
2293
2293
  `),h&&e.stdout.write(`n/a = this provider does not expose a context/token total; absence is not a health signal.
2294
2294
  `),S.length>0){e.stdout.write(`Session limits:
2295
2295
  `);for(let y of S)e.stdout.write(` ${y.reportPath}: LIMITED resets_at=${NS(y.sessionLimit)}
2296
- `)}return 0}function kS(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(...kS(oW(vS(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 pW(e,t,r){let n=await IS(e,[{teamfile:t.teamfile,alias:t.alias}]),s=xS(t.teamfile),i=s.kind==="repo"?s:null;return{teamfile:t.teamfile,reportPath:t.alias,lastContext:r.lastInputTokens??null,liveness:n.get(cf(t.teamfile,t.alias))??df(),...i!==null?{activitySinceLastCommit:{messageCount:AS(r,i.since),tokens:null},cumulativeTokens:RS(r)??"n/a"}:{}}}async function IS(e,t){try{let r=await $(e,n=>t.map(s=>{let i=Pr(n,s.teamfile,s.alias);return[cf(s.teamfile,s.alias),_W(i)]}));return new Map(r)}catch{return new Map}}function cf(e,t){return`${e}\0${t.toLowerCase()}`}function _W(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}:df()}function df(){return{state:"idle",reason:null,inFlight:null,terminalLock:null,terminalInvocation:null}}function lf(e){return e.state==="idle"?"idle":`busy (${e.reason})`}function NS(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 hW(e){return e==="n/a"?e:gt(e)}function gW(e,t,r=String){return e!==void 0?r(e):t?"n/a":"unknown"}function xS(e){let t=vS(e),r;try{af("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=af("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:yW(t)}}function yW(e){let t;try{t=af("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 AS(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 RS(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 aW,lW,OS=T(()=>{"use strict";An();Le();Lt();Rt();Fr();Ht();Uu();aW={name:"health",allowsBareTeamfile:!0,supportsRaw:!0},lW=`usage: lmctl health [target] [alias]
2296
+ `)}return 0}function kS(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(...kS(cW(vS(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 gW(e,t,r){let n=await IS(e,[{teamfile:t.teamfile,alias:t.alias}]),s=xS(t.teamfile),i=s.kind==="repo"?s:null;return{teamfile:t.teamfile,reportPath:t.alias,lastContext:r.lastInputTokens??null,liveness:n.get(cf(t.teamfile,t.alias))??df(),...i!==null?{activitySinceLastCommit:{messageCount:AS(r,i.since),tokens:null},cumulativeTokens:RS(r)??"n/a"}:{}}}async function IS(e,t){try{let r=await $(e,n=>t.map(s=>{let i=Pr(n,s.teamfile,s.alias);return[cf(s.teamfile,s.alias),yW(i)]}));return new Map(r)}catch{return new Map}}function cf(e,t){return`${e}\0${t.toLowerCase()}`}function yW(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}:df()}function df(){return{state:"idle",reason:null,inFlight:null,terminalLock:null,terminalInvocation:null}}function lf(e){return e.state==="idle"?"idle":`busy (${e.reason})`}function NS(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 wW(e){return e==="n/a"?e:gt(e)}function EW(e,t,r=String){return e!==void 0?r(e):t?"n/a":"unknown"}function xS(e){let t=vS(e),r;try{af("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=af("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:TW(t)}}function TW(e){let t;try{t=af("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 AS(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 RS(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 dW,uW,OS=T(()=>{"use strict";An();Le();Lt();Rt();Fr();Ht();Uu();dW={name:"health",allowsBareTeamfile:!0,supportsRaw:!0},uW=`usage: lmctl health [target] [alias]
2297
2297
  lmctl health <teamfile> # team rollup
2298
2298
  lmctl health <sessionid> [--provider <name>]
2299
2299
  [--json]
2300
2300
 
2301
- Show provider session details, team rollups, or managed run state/token totals.`});var CS={};ye(CS,{runLs:()=>bW});import{resolve as uf}from"node:path";function TW(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 bW(e,t={stdout:process.stdout,stderr:process.stderr}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(`${wW}
2302
- `),0;let r=Z(e,["--provider","--sessiondir","--format","--limit"],["--recursive","--all","--json","--runs","--help"]);if(r.error!==void 0)return v(t,r.error);if(r.positionals.length>0)return v(t,"ls does not accept positional targets (use --provider/--sessiondir/--all to filter)");let n=P(r,"--format"),s=G(r,"--json");if(G(r,"--runs")){for(let h of["--provider","--sessiondir"])if(P(r,h)!==void 0)return v(t,`--runs is mutually exclusive with ${h}`);for(let h of["--recursive","--all"])if(G(r,h))return v(t,`--runs is mutually exclusive with ${h}`);if(n==="teamfile")return v(t,"--runs is mutually exclusive with --format teamfile (runs are not teamfile members)");let p=P(r,"--limit"),_=EW;if(p!==void 0){let h=Number.parseInt(p,10);if(!Number.isFinite(h)||h<1||String(h)!==p)return v(t,`invalid --limit "${p}" (expected a positive integer)`);if(h>$S)return v(t,`--limit ${h} exceeds maximum (${$S})`);_=h}let g=n==="json"||s===!0?"json":"table";try{return await $(t,async h=>SW(t,h,_,g))}catch(h){return je(t,h)}}let o=vW(n,s);if("error"in o)return v(t,o.error);let a=o.format,l=P(r,"--provider"),c=P(r,"--sessiondir"),d=G(r,"--recursive"),u=G(r,"--all"),f;try{f=await lc(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?uf(c):uf(process.cwd());f=f.filter(_=>{let g=uf(_.cwd);return d?g===p||g.startsWith(`${p}/`):g===p})}if(f=TW(f),a==="json")return ae(t,f.map(p=>({provider:p.provider,sessionId:p.sessionId,cwd:p.cwd,messageCount:p.messageCount,modifiedAt:p.modifiedAt.toISOString(),...p.model!==void 0?{model:p.model}:{}}))),0;if(f.length===0){if(a==="table"){let p=u?"(all)":c??process.cwd(),_=d?"under":"in";t.stdout.write(`No native sessions found ${_} ${p}.
2301
+ Show provider session details, team rollups, or managed run state/token totals.`});var CS={};we(CS,{runLs:()=>kW});import{resolve as uf}from"node:path";function vW(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 kW(e,t={stdout:process.stdout,stderr:process.stderr}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(`${bW}
2302
+ `),0;let r=Z(e,["--provider","--sessiondir","--format","--limit"],["--recursive","--all","--json","--runs","--help"]);if(r.error!==void 0)return v(t,r.error);if(r.positionals.length>0)return v(t,"ls does not accept positional targets (use --provider/--sessiondir/--all to filter)");let n=P(r,"--format"),s=V(r,"--json");if(V(r,"--runs")){for(let h of["--provider","--sessiondir"])if(P(r,h)!==void 0)return v(t,`--runs is mutually exclusive with ${h}`);for(let h of["--recursive","--all"])if(V(r,h))return v(t,`--runs is mutually exclusive with ${h}`);if(n==="teamfile")return v(t,"--runs is mutually exclusive with --format teamfile (runs are not teamfile members)");let p=P(r,"--limit"),_=SW;if(p!==void 0){let h=Number.parseInt(p,10);if(!Number.isFinite(h)||h<1||String(h)!==p)return v(t,`invalid --limit "${p}" (expected a positive integer)`);if(h>$S)return v(t,`--limit ${h} exceeds maximum (${$S})`);_=h}let g=n==="json"||s===!0?"json":"table";try{return await $(t,async h=>IW(t,h,_,g))}catch(h){return je(t,h)}}let o=NW(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 lc(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?uf(c):uf(process.cwd());f=f.filter(_=>{let g=uf(_.cwd);return d?g===p||g.startsWith(`${p}/`):g===p})}if(f=vW(f),a==="json")return ae(t,f.map(p=>({provider:p.provider,sessionId:p.sessionId,cwd:p.cwd,messageCount:p.messageCount,modifiedAt:p.modifiedAt.toISOString(),...p.model!==void 0?{model:p.model}:{}}))),0;if(f.length===0){if(a==="table"){let p=u?"(all)":c??process.cwd(),_=d?"under":"in";t.stdout.write(`No native sessions found ${_} ${p}.
2303
2303
  `)}return 0}if(a==="teamfile"){for(let p of f)t.stdout.write(`_MEMBER_ alias=- provider=${p.provider} sessionid=${p.sessionId} sessiondir=${p.cwd}
2304
2304
  `);return 0}let m=Math.max(14,...f.map(p=>p.sessionId.length));t.stdout.write(`${"SESSION".padEnd(m)} ${"PROVIDER".padEnd(10)} ${"SESSIONDIR".padEnd(36)} MODIFIED
2305
2305
  `);for(let p of f){let _=p.cwd.length>36?`\u2026${p.cwd.slice(-35)}`:p.cwd;t.stdout.write(`${p.sessionId.padEnd(m)} ${p.provider.padEnd(10)} ${_.padEnd(36)} ${p.modifiedAt.toISOString()}
2306
- `)}return 0}async function SW(e,t,r,n){let s=sn(t,{limit:r});if(n==="json")return ae(e,s.map(i=>({id:i.id,job_id:i.job_id,workflow_id:i.workflow_id,team_id:i.team_id,current_state:i.current_state,terminal_state:i.terminal_state,started_at:i.started_at,ended_at:i.ended_at,paused_at:i.paused_at}))),0;if(s.length===0)return e.stdout.write(`No runs found.
2306
+ `)}return 0}async function IW(e,t,r,n){let s=sn(t,{limit:r});if(n==="json")return ae(e,s.map(i=>({id:i.id,job_id:i.job_id,workflow_id:i.workflow_id,team_id:i.team_id,current_state:i.current_state,terminal_state:i.terminal_state,started_at:i.started_at,ended_at:i.ended_at,paused_at:i.paused_at}))),0;if(s.length===0)return e.stdout.write(`No runs found.
2307
2307
  `),0;e.stdout.write(`${"RUN_ID".padEnd(8)} ${"WORKFLOW".padEnd(8)} ${"TEAM".padEnd(8)} ${"STATE".padEnd(20)} ${"TERMINAL".padEnd(20)} STARTED
2308
2308
  `);for(let i of s){let o=(i.current_state??"").padEnd(20),a=(i.terminal_state??"").padEnd(20);e.stdout.write(`${String(i.id).padEnd(8)} ${String(i.workflow_id).padEnd(8)} ${String(i.team_id).padEnd(8)} ${o} ${a} ${i.started_at}
2309
- `)}return 0}function vW(e,t){return e===void 0?{format:t?"json":"teamfile"}:e==="table"||e==="teamfile"||e==="json"?{format:e}:{error:`invalid --format "${e}" (expected: table | teamfile | json)`}}var wW,EW,$S,MS=T(()=>{"use strict";vt();Le();Ht();wW=`usage: lmctl ls [--provider <name>] [--sessiondir <path>]
2309
+ `)}return 0}function NW(e,t){return e===void 0?{format:t?"json":"teamfile"}:e==="table"||e==="teamfile"||e==="json"?{format:e}:{error:`invalid --format "${e}" (expected: table | teamfile | json)`}}var bW,SW,$S,MS=T(()=>{"use strict";vt();Le();Ht();bW=`usage: lmctl ls [--provider <name>] [--sessiondir <path>]
2310
2310
  [--recursive] [--all] [--format table|teamfile|json] [--json]
2311
2311
  lmctl ls --runs [--limit N] [--format table|json] [--json]
2312
2312
 
2313
- List native provider sessions in scope, or list recent managed runs with --runs.`,EW=50,$S=500});import{existsSync as Ds,readFileSync as jS}from"node:fs";import{homedir as kW}from"node:os";import{dirname as DS,resolve as $n}from"node:path";import{fileURLToPath as IW}from"node:url";function pf(e,t={}){let r=[],n=AW(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=MW(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}": `+(Ca??"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: ${DW(o)}`)}return r}function AW(e){if(!e&&js)return js;let t=new Map,r,n=e??RW();if(!Ds(n))return r=`${n} not found`,e||ff(t),e||(js=t),e||(Ca=r),t;let s;try{s=jS(n,"utf-8")}catch(i){return r=`${n} could not be read: ${i instanceof Error?i.message:String(i)}`,e||ff(t),e||(js=t),e||(Ca=r),t}for(let[i,o]of Object.entries(NW)){let a=$W(s,o),l=CW(a);l.length>0&&t.set(i,l)}return t.size===0&&(r=`${n} has no tested model rows`),!e&&t.size===0&&ff(t),e||(js=t),e||(Ca=r),t}function RW(){return LW(DS(IW(import.meta.url)))}function LW(e){let t=OW(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 OW(e){let t=$n(e);for(;;){if(Ds($n(t,"package.json")))return t;let r=DS(t);if(r===t)return null;t=r}}function ff(e){for(let[t,r]of Object.entries(xW))e.set(t,r)}function $W(e,t){let n=new RegExp(`^## ${PW(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 CW(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 MW(e){let t=e??$n(kW(),".config","opencode","opencode.json");if(!Ds(t))return{available:!0,models:[]};let r;try{r=JSON.parse(jS(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:jW(r)}}function jW(e){if(!mf(e))return[];let t=$a(e.provider)??$a(e.providers);if(!t)return[];let r=new Set;for(let[n,s]of Object.entries(t)){if(!mf(s))continue;let i=$a(s.models)??$a(s.model);if(i)for(let o of Object.keys(i))r.add(o.startsWith(`${n}/`)?o:`${n}/${o}`)}return[...r].sort()}function $a(e){return mf(e)?e:null}function mf(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function DW(e){return e.length>0?e.join(", "):"(none)"}function PW(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var NW,xW,js,Ca,PS=T(()=>{"use strict";NW={claude:"Claude",codex:"Codex",gemini:"Gemini",qwen:"Qwen",agy:"Antigravity"},xW={claude:["claude-opus-4-6","claude-opus-4-7","claude-opus-4-8","claude-sonnet-4-6","claude-sonnet-5","claude-haiku-4-5","claude-fable-5"],codex:["gpt-5.2","gpt-5.4","gpt-5.5","gpt-5.4-mini","gpt-5.3-codex","gpt-5.3-codex-spark"],gemini:["gemini-3.1-pro-preview","gemini-3-flash-preview","gemini-3.1-flash-lite-preview","gemini-2.5-flash","gemini-2.5-flash-lite"],qwen:["qwen3.5-plus","qwen3.6-plus"],agy:["gemini-1.5-flash","gemini-1.5-pro","gemini-3.5-flash","gemini-3.1-pro","gpt-oss-120b","gpt-4-turbo","gpt-4","gpt-3.5-turbo","claude-3-opus","claude-3-sonnet","claude-3-haiku"]},js=null});import{homedir as FW}from"node:os";import{basename as UW}from"node:path";function Ma(e,t){let r=new Set;return{text:e.replace(BW,(s,i)=>{let o=i.trim(),a=WW[o];return a===void 0?(r.add(o),s):a(t)}),unknownNames:[...r].sort()}}function ja(e){return{workdir:e.workdir,teamfile:e.teamfile,date:qW(e.date)}}function qW(e){return e.toISOString().slice(0,10)}var WW,BW,_f=T(()=>{"use strict";WW={workdir:e=>e.workdir,teamfile:e=>e.teamfile,teamname:e=>{let t=UW(e.teamfile);return t.endsWith(".lmctl")?t.slice(0,-6):t},home:()=>FW(),date:e=>e.date},BW=/{{\s*([A-Za-z0-9_-]+)\s*}}/g});var Us={};ye(Us,{GEMINI_PROVIDER_NOTICE:()=>BS,_setLintSessiondirFsOpsForTests:()=>zW,_setTeamfileSeedForTests:()=>YW,buildRootTeamRegistrationRow:()=>GS,registerRootTeam:()=>VS,runHire:()=>iB,runLint:()=>sB,runRefresh:()=>oB,runSeed:()=>JS,sha256Text:()=>XS});import{createHash as HW}from"node:crypto";import{accessSync as JW,constants as FS,existsSync as XW,readFileSync as Fa,realpathSync as yf,statSync as GW,writeFileSync as Pa}from"node:fs";import{dirname as Jr,resolve as WS}from"node:path";function YW(e){qS=e??(async t=>{let{seed:r}=await Promise.resolve().then(()=>(vt(),dc)),n=await r(t);return n.success?{sessionId:n.sessionId,warnings:n.warnings}:{error:n.error??"provider seed failed"}})}function zW(e){Hr=e===null?wf:{...wf,...e}}function ZW(e,t){let r=Jr(t),n=new Set,s=[];for(let i of e){if(i.teamfile!==void 0)continue;let o=i.sessiondir??r,a=WS(o);if(n.has(a))continue;let l=QW(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 QW(e){try{if(Hr.existsSync(e)){if(!Hr.statSync(e).isDirectory())return"ENOTDIR";Hr.accessSync(e,FS.W_OK);return}let t=rB(e);if(t===void 0)return;if(!Hr.statSync(t).isDirectory())return"ENOTDIR";Hr.accessSync(t,FS.W_OK);return}catch(t){return nB(t)??"permission check failed"}}function eB(e,t){let r=[];for(let n of e)n.teamfile!==void 0||n.sessiondir===void 0||HS(n.sessiondir,t)&&r.push(`${n.alias}: sessiondir equals the teamfile directory and is redundant; lmctl seed will remove it`);return r}function tB(e,t,r,n){let s=!1;for(let i of e){if(i.teamfile!==void 0||i.sessiondir===void 0||!HS(i.sessiondir,n))continue;let o=r.get(i.alias.toLowerCase());if(o===void 0)continue;let a=KS(t[o],"sessiondir");a!==t[o]&&(t[o]=a,s=!0),i.sessiondir=void 0}return s}function HS(e,t){return US(e)===US(t)}function US(e){let t=WS(e);try{return yf(t)}catch{return t}}function rB(e){let t=e;for(;;){try{if(Hr.existsSync(t))return t}catch{return}let r=Jr(t);if(r===t)return;t=r}}function nB(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 sB(e,t={stdout:process.stdout,stderr:process.stderr}){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(VW),0;if(e.length!==1)return t.stderr.write(`usage: lmctl lint <teamfile.lmctl>
2314
- `),2;let r=e[0],n;try{n=await $(t,c=>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,Jr(n)),o=pf(s.members),a=Fa(n,"utf8"),l=Ma(a,ja({workdir:Jr(n),teamfile:n,date:new Date})).unknownNames;l.length>0&&o.push(`unknown template placeholder${l.length===1?"":"s"}: ${l.map(c=>`{{${c}}}`).join(", ")}`),o.push(...Sl(s.members,Jr(n))),o.push(...ZW(s.members,n)),o.push(...eB(s.members,Jr(n)));for(let c of i)t.stderr.write(`error: ${c.field}: ${c.message}
2315
- `);for(let c of s.members)Tf([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}
2313
+ List native provider sessions in scope, or list recent managed runs with --runs.`,SW=50,$S=500});import{existsSync as Ps,readFileSync as jS}from"node:fs";import{homedir as xW}from"node:os";import{dirname as DS,resolve as $n}from"node:path";import{fileURLToPath as AW}from"node:url";function pf(e,t={}){let r=[],n=OW(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=PW(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}": `+(Ca??"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: ${UW(o)}`)}return r}function OW(e){if(!e&&Ds)return Ds;let t=new Map,r,n=e??$W();if(!Ps(n))return r=`${n} not found`,e||ff(t),e||(Ds=t),e||(Ca=r),t;let s;try{s=jS(n,"utf-8")}catch(i){return r=`${n} could not be read: ${i instanceof Error?i.message:String(i)}`,e||ff(t),e||(Ds=t),e||(Ca=r),t}for(let[i,o]of Object.entries(RW)){let a=jW(s,o),l=DW(a);l.length>0&&t.set(i,l)}return t.size===0&&(r=`${n} has no tested model rows`),!e&&t.size===0&&ff(t),e||(Ds=t),e||(Ca=r),t}function $W(){return CW(DS(AW(import.meta.url)))}function CW(e){let t=MW(e);if(t){let n=$n(t,"durable-memory","model_selection.md");if(Ps(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(Ps(n))return n;return r[r.length-1]}function MW(e){let t=$n(e);for(;;){if(Ps($n(t,"package.json")))return t;let r=DS(t);if(r===t)return null;t=r}}function ff(e){for(let[t,r]of Object.entries(LW))e.set(t,r)}function jW(e,t){let n=new RegExp(`^## ${WW(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 DW(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 PW(e){let t=e??$n(xW(),".config","opencode","opencode.json");if(!Ps(t))return{available:!0,models:[]};let r;try{r=JSON.parse(jS(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:FW(r)}}function FW(e){if(!mf(e))return[];let t=$a(e.provider)??$a(e.providers);if(!t)return[];let r=new Set;for(let[n,s]of Object.entries(t)){if(!mf(s))continue;let i=$a(s.models)??$a(s.model);if(i)for(let o of Object.keys(i))r.add(o.startsWith(`${n}/`)?o:`${n}/${o}`)}return[...r].sort()}function $a(e){return mf(e)?e:null}function mf(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function UW(e){return e.length>0?e.join(", "):"(none)"}function WW(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var RW,LW,Ds,Ca,PS=T(()=>{"use strict";RW={claude:"Claude",codex:"Codex",gemini:"Gemini",qwen:"Qwen",agy:"Antigravity"},LW={claude:["claude-opus-4-6","claude-opus-4-7","claude-opus-4-8","claude-sonnet-4-6","claude-sonnet-5","claude-haiku-4-5","claude-fable-5"],codex:["gpt-5.2","gpt-5.4","gpt-5.5","gpt-5.4-mini","gpt-5.3-codex","gpt-5.3-codex-spark"],gemini:["gemini-3.1-pro-preview","gemini-3-flash-preview","gemini-3.1-flash-lite-preview","gemini-2.5-flash","gemini-2.5-flash-lite"],qwen:["qwen3.5-plus","qwen3.6-plus"],agy:["gemini-1.5-flash","gemini-1.5-pro","gemini-3.5-flash","gemini-3.1-pro","gpt-oss-120b","gpt-4-turbo","gpt-4","gpt-3.5-turbo","claude-3-opus","claude-3-sonnet","claude-3-haiku"]},Ds=null});import{homedir as BW}from"node:os";import{basename as qW}from"node:path";function Ma(e,t){let r=new Set;return{text:e.replace(JW,(s,i)=>{let o=i.trim(),a=HW[o];return a===void 0?(r.add(o),s):a(t)}),unknownNames:[...r].sort()}}function ja(e){return{workdir:e.workdir,teamfile:e.teamfile,date:XW(e.date)}}function XW(e){return e.toISOString().slice(0,10)}var HW,JW,_f=T(()=>{"use strict";HW={workdir:e=>e.workdir,teamfile:e=>e.teamfile,teamname:e=>{let t=qW(e.teamfile);return t.endsWith(".lmctl")?t.slice(0,-6):t},home:()=>BW(),date:e=>e.date},JW=/{{\s*([A-Za-z0-9_-]+)\s*}}/g});var Ws={};we(Ws,{GEMINI_PROVIDER_NOTICE:()=>BS,_setLintSessiondirFsOpsForTests:()=>eB,_setTeamfileSeedForTests:()=>QW,buildRootTeamRegistrationRow:()=>GS,registerRootTeam:()=>VS,runHire:()=>lB,runLint:()=>aB,runRefresh:()=>cB,runSeed:()=>JS,sha256Text:()=>XS});import{createHash as GW}from"node:crypto";import{accessSync as VW,constants as FS,existsSync as KW,readFileSync as Fa,realpathSync as yf,statSync as YW,writeFileSync as Pa}from"node:fs";import{dirname as Jr,resolve as WS}from"node:path";function QW(e){qS=e??(async t=>{let{seed:r}=await Promise.resolve().then(()=>(vt(),dc)),n=await r(t);return n.success?{sessionId:n.sessionId,warnings:n.warnings}:{error:n.error??"provider seed failed"}})}function eB(e){Hr=e===null?wf:{...wf,...e}}function tB(e,t){let r=Jr(t),n=new Set,s=[];for(let i of e){if(i.teamfile!==void 0)continue;let o=i.sessiondir??r,a=WS(o);if(n.has(a))continue;let l=rB(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 rB(e){try{if(Hr.existsSync(e)){if(!Hr.statSync(e).isDirectory())return"ENOTDIR";Hr.accessSync(e,FS.W_OK);return}let t=iB(e);if(t===void 0)return;if(!Hr.statSync(t).isDirectory())return"ENOTDIR";Hr.accessSync(t,FS.W_OK);return}catch(t){return oB(t)??"permission check failed"}}function nB(e,t){let r=[];for(let n of e)n.teamfile!==void 0||n.sessiondir===void 0||HS(n.sessiondir,t)&&r.push(`${n.alias}: sessiondir equals the teamfile directory and is redundant; lmctl seed will remove it`);return r}function sB(e,t,r,n){let s=!1;for(let i of e){if(i.teamfile!==void 0||i.sessiondir===void 0||!HS(i.sessiondir,n))continue;let o=r.get(i.alias.toLowerCase());if(o===void 0)continue;let a=KS(t[o],"sessiondir");a!==t[o]&&(t[o]=a,s=!0),i.sessiondir=void 0}return s}function HS(e,t){return US(e)===US(t)}function US(e){let t=WS(e);try{return yf(t)}catch{return t}}function iB(e){let t=e;for(;;){try{if(Hr.existsSync(t))return t}catch{return}let r=Jr(t);if(r===t)return;t=r}}function oB(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 aB(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 lint <teamfile.lmctl>
2314
+ `),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,Jr(n)),o=pf(s.members),a=Fa(n,"utf8"),l=Ma(a,ja({workdir:Jr(n),teamfile:n,date:new Date})).unknownNames;l.length>0&&o.push(`unknown template placeholder${l.length===1?"":"s"}: ${l.map(c=>`{{${c}}}`).join(", ")}`),o.push(...Sl(s.members,Jr(n))),o.push(...tB(s.members,n)),o.push(...nB(s.members,Jr(n)));for(let c of i)t.stderr.write(`error: ${c.field}: ${c.message}
2315
+ `);for(let c of s.members)Tf([c],t),c.session!==void 0&&c.session.length<Fs&&o.push(`${c.alias}: sessionid is shorter than ${Fs} chars; run lmctl seed to refresh it`);for(let c of o)t.stderr.write(`warning: ${c}
2316
2316
  `);return await $(t,c=>{IE(n,c,d=>t.stderr.write(`${d}
2317
2317
  `))}),i.length>0?1:(t.stdout.write(`ok
2318
- `),0)}async function JS(e,t={stdout:process.stdout,stderr:process.stderr}){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(KW),0;if(e.length!==1)return t.stderr.write(`usage: lmctl seed <teamfile.lmctl>
2318
+ `),0)}async function JS(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>
2319
2319
  `),2;let r=e[0],n;try{n=await $(t,h=>Ee(r,h))}catch(h){return $e(t,`${r}: ${h instanceof Error?h.message:String(h)}`)}let s;try{s=yf(n)}catch(h){return $e(t,`${r}: ${h instanceof Error?h.message:String(h)}`)}let i=Jr(n),o;try{o=De(n)}catch(h){return $e(t,`${r}: ${h instanceof Error?h.message:String(h)}`)}let l=Fa(n,"utf8").split(`
2320
- `),c=cB(l),d=tB(o.members,l,c,i),u=Yd(o,i);if(u.length>0){Tf(o.members,t);for(let h of u)t.stderr.write(`error: ${h.field}: ${h.message}
2320
+ `),c=fB(l),d=sB(o.members,l,c,i),u=Yd(o,i);if(u.length>0){Tf(o.members,t);for(let h of u)t.stderr.write(`error: ${h.field}: ${h.message}
2321
2321
  `);return 1}try{In(t,o,n)}catch{}Tf(o.members,t);for(let h of pf(o.members))t.stderr.write(`warning: ${h}
2322
2322
  `);for(let h of Sl(o.members,i))t.stderr.write(`warning: ${h}
2323
- `);let f=0,m=o.members.filter(h=>h.teamfile!==void 0?!1:h.session===void 0||h.session.length<Ps);for(let h of m)if(!YS(h.provider))return t.stderr.write(`error: ${h.alias}: invalid provider "${h.provider}"
2324
- `),1;for(let h of o.members){if(h.teamfile!==void 0)continue;if(h.session!==void 0&&h.session.length>=Ps){t.stderr.write(`warning: ${h.alias}: existing sessionid preserved; skipping
2325
- `);continue}let S=h.sessiondir??i,y=await qS({provider:h.provider,cwd:S,...h.model!==void 0?{model:h.model}:{},...h.effort!==void 0?{effort:h.effort}:{},...h.alias.toLowerCase()==="lead"?{prompt:aB(n,l.join(`
2323
+ `);let f=0,m=o.members.filter(h=>h.teamfile!==void 0?!1:h.session===void 0||h.session.length<Fs);for(let h of m)if(!YS(h.provider))return t.stderr.write(`error: ${h.alias}: invalid provider "${h.provider}"
2324
+ `),1;for(let h of o.members){if(h.teamfile!==void 0)continue;if(h.session!==void 0&&h.session.length>=Fs){t.stderr.write(`warning: ${h.alias}: existing sessionid preserved; skipping
2325
+ `);continue}let S=h.sessiondir??i,y=await qS({provider:h.provider,cwd:S,...h.model!==void 0?{model:h.model}:{},...h.effort!==void 0?{effort:h.effort}:{},...h.alias.toLowerCase()==="lead"?{prompt:dB(n,l.join(`
2326
2326
  `),o.members)}:{}});for(let x of y.warnings??[])t.stderr.write(`warning: ${h.alias}: ${x}
2327
- `);if(y.error!==void 0||y.sessionId===void 0||y.sessionId.length<Ps){let x=`provider did not report a sessionid; no new session was found for ${S} (possible provider workspace/cwd mismatch)`;return t.stderr.write(`error: ${h.alias}: seed failed${y.error!==void 0?`: ${y.error}`:`; ${x}`}
2327
+ `);if(y.error!==void 0||y.sessionId===void 0||y.sessionId.length<Fs){let x=`provider did not report a sessionid; no new session was found for ${S} (possible provider workspace/cwd mismatch)`;return t.stderr.write(`error: ${h.alias}: seed failed${y.error!==void 0?`: ${y.error}`:`; ${x}`}
2328
2328
  `),1}let w=c.get(h.alias.toLowerCase());if(w===void 0)return t.stderr.write(`error: ${h.alias}: could not find matching _MEMBER_ line to update
2329
- `),1;let I=mB(l[w],"sessionid",y.sessionId);l[w]=I,f+=1,Pa(n,l.join(`
2329
+ `),1;let I=hB(l[w],"sessionid",y.sessionId);l[w]=I,f+=1,Pa(n,l.join(`
2330
2330
  `),"utf8"),t.stdout.write(`${h.alias}: seeded ${y.sessionId} provider=${h.provider} sessiondir=${S}
2331
2331
  `)}let p=l.join(`
2332
- `),_=_B(p,yf(n));(_!==p||d)&&Pa(n,_,"utf8"),f===0&&t.stdout.write(`no members needed seeding
2333
- `);let g=new Date().toISOString();return await $(t,h=>{VS(h,{teamfilePath:s,name:o.name,rawText:_,now:g})}),0}async function iB(e,t={stdout:process.stdout,stderr:process.stderr}){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(Da),0;let r=Z(e,["--provider","--sessiondir"],[]);if(r.error!==void 0)return gf(t,r.error,Da);if(r.positionals.length!==2)return gf(t,"expected <teamfile.lmctl> and <alias>",Da);let[n,s]=r.positionals;if(!fB(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 gf(t,"missing value for --provider",Da);if(!YS(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=Fa(o,"utf8")}catch(u){return $e(t,`${n}: ${u instanceof Error?u.message:String(u)}`)}if(uB(a,s))return $e(t,`${s}: alias already exists in ${o}`);let l=P(r,"--sessiondir"),c=[`_MEMBER_ alias=${Ef(s)} provider=${i}`,...l===void 0?[]:[`sessiondir=${Ef(l)}`]].join(" "),d=pB(a,c);return Pa(o,d,"utf8"),t.stdout.write(`Hired ${s} (${i}) -> ${o}
2332
+ `),_=yB(p,yf(n));(_!==p||d)&&Pa(n,_,"utf8"),f===0&&t.stdout.write(`no members needed seeding
2333
+ `);let g=new Date().toISOString();return await $(t,h=>{VS(h,{teamfilePath:s,name:o.name,rawText:_,now:g})}),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(Da),0;let r=Z(e,["--provider","--sessiondir"],[]);if(r.error!==void 0)return gf(t,r.error,Da);if(r.positionals.length!==2)return gf(t,"expected <teamfile.lmctl> and <alias>",Da);let[n,s]=r.positionals;if(!_B(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 gf(t,"missing value for --provider",Da);if(!YS(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=Fa(o,"utf8")}catch(u){return $e(t,`${n}: ${u instanceof Error?u.message:String(u)}`)}if(pB(a,s))return $e(t,`${s}: alias already exists in ${o}`);let l=P(r,"--sessiondir"),c=[`_MEMBER_ alias=${Ef(s)} provider=${i}`,...l===void 0?[]:[`sessiondir=${Ef(l)}`]].join(" "),d=gB(a,c);return Pa(o,d,"utf8"),t.stdout.write(`Hired ${s} (${i}) -> ${o}
2334
2334
  `),t.stdout.write(`Run: lmctl seed ${o}
2335
- `),0}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(hf),0;let r,n;if(e.length===1){let u=Wr(e[0]);if(u===null)return t.stderr.write(hf),2;r=u.teamfile,n=u.alias}else if(e.length===2)[r,n]=e;else return t.stderr.write(hf),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=Fa(s,"utf8")}catch(u){return $e(t,`${r}: ${u instanceof Error?u.message:String(u)}`)}let o=i.split(`
2336
- `),a=dB(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)[Kn],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]=KS(l,"sessionid"),a>0&&/^\s*#CreationTime:/u.test(o[a-1])&&o.splice(a-1,1),Pa(s,o.join(`
2337
- `),"utf8"),JS([s],t))}function XS(e){return HW("sha256").update(e).digest("hex")}function GS(e,t){return{teamfile_path:t.teamfilePath,name:t.name,raw_text:t.rawText,raw_sha256:XS(t.rawText),registered_at:e?.registered_at??t.now,last_seeded_at:t.now}}function VS(e,t){let r=GS(e.getRootTeam(t.teamfilePath),t);return e.upsertRootTeam(r),r}function aB(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(`
2338
- `):"- (no non-Lead members)",i=r.find(a=>a.alias.toLowerCase()==="lead")?.provider??"",o=lB(i,e);return["lmctl seed initial connection only. Create or pin this provider session, then stop.","Do not inspect files, run commands, infer a task, delegate, edit, or begin work.","",`Teamfile path: ${e}`,"You are alias Lead for this AI-managed .lmctl team.","","Delegating work:",`- Blocking command shape: lmctl chat "${e}" <alias> "your task here"`,"- MCP lmctl_chat is synchronous/blocking; use it only as a quick-ping or backup path.","- lmctl is foreground/background agnostic. Use your provider or host runtime for async command handling when it supports that.","- For delegation, run the lmctl chat command above. If your runtime has a tracked background mode, it may wrap that same blocking command and notify you when it completes.","- For arbitrary shell work, use your provider/runtime shell tools directly; lmctl does not execute shell commands.",o,"","Delegation is an ACTION, not a plan: to hand a member a task, run the command or call the tool.","If you use lmctl_chat and it appears only after tool search, call it in the SAME turn and do not stop after discovering it or say you're about to call it.","","Team members:",s,"","Example MCP calls:",...r.filter(a=>a.alias.toLowerCase()!=="lead").map(a=>`lmctl_chat(team="${e}", alias="${a.alias}", prompt="your task here")`),"","If a member feels sluggish or starts drifting (degraded or off-track output):",` 1. Check ONE member's session health: lmctl health "${e}" <alias> (size/state \u2014 informational).`," 2. Make sure important state is captured in durable-memory/ \u2014 update it if not.",` 3. Replace its session: lmctl refresh "${e}" <alias> (re-seeds the member: drops chat history, re-reads durable-memory/). You cannot refresh your own Lead session \u2014 a meta-Lead or the operator does that.`,` Optional: lmctl tail "${e}" <alias> to inspect its recent messages while troubleshooting.`,"(These health/recovery commands are shell commands. For delegation, prefer lmctl chat; lmctl_chat is the synchronous backup.)","","Full teamfile document at seed time:","```lmctl",t.trimEnd(),"```","","Remember this teamfile path. Do not ask the operator for it when asked to ping or delegate to members.","Reply exactly: ACK: teamfile context recorded."].join(`
2339
- `)}function lB(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 cB(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 dB(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 uB(e,t){for(let r of e.split(`
2340
- `))if(/^\s*#?\s*_MEMBER_\s+\S/u.test(r)&&Fs(r,"alias")===t)return!0;return!1}function fB(e){return/^[A-Za-z][A-Za-z0-9_-]*$/u.test(e)}function Fs(e,t){let n=new RegExp(`(?:^|\\s)${t}=(?:"([^"]*)"|(\\S*))`).exec(e);return n===null?void 0:n[1]??n[2]??""}function mB(e,t,r){let n=`${t}=${Ef(r)}`,s=new RegExp(`(^|\\s)${t}=(?:"[^"]*"|\\S*)`);return s.test(e)?e.replace(s,(i,o)=>`${o}${n}`):`${e.trimEnd()} ${n}`}function KS(e,t){let r=new RegExp(`(^|\\s)${t}=(?:"[^"]*"|\\S*)`);return e.replace(r,"").replace(/\s+/gu," ").trimEnd()}function Ef(e){return/[\s"]/u.test(e)?`"${e.replace(/"/g,'\\"')}"`:e}function pB(e,t){let r=e.split(`
2335
+ `),0}async function cB(e,t={stdout:process.stdout,stderr:process.stderr}){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(hf),0;let r,n;if(e.length===1){let u=Wr(e[0]);if(u===null)return t.stderr.write(hf),2;r=u.teamfile,n=u.alias}else if(e.length===2)[r,n]=e;else return t.stderr.write(hf),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=Fa(s,"utf8")}catch(u){return $e(t,`${r}: ${u instanceof Error?u.message:String(u)}`)}let o=i.split(`
2336
+ `),a=mB(o,n);if(a===void 0)return $e(t,`${n}: no active _MEMBER_ entry found`);let l=o[a];if(Us(l,"teamfile")!==void 0)return $e(t,`${n}: refresh only applies to provider-backed members, not teamfile= members`);let c=(t.env??process.env)[Kn],d=Us(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]=KS(l,"sessionid"),a>0&&/^\s*#CreationTime:/u.test(o[a-1])&&o.splice(a-1,1),Pa(s,o.join(`
2337
+ `),"utf8"),JS([s],t))}function XS(e){return GW("sha256").update(e).digest("hex")}function GS(e,t){return{teamfile_path:t.teamfilePath,name:t.name,raw_text:t.rawText,raw_sha256:XS(t.rawText),registered_at:e?.registered_at??t.now,last_seeded_at:t.now}}function VS(e,t){let r=GS(e.getRootTeam(t.teamfilePath),t);return e.upsertRootTeam(r),r}function dB(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(`
2338
+ `):"- (no non-Lead members)",i=r.find(a=>a.alias.toLowerCase()==="lead")?.provider??"",o=uB(i,e);return["lmctl seed initial connection only. Create or pin this provider session, then stop.","Do not inspect files, run commands, infer a task, delegate, edit, or begin work.","",`Teamfile path: ${e}`,"You are alias Lead for this AI-managed .lmctl team.","","Delegating work:",`- Blocking command shape: lmctl chat "${e}" <alias> "your task here"`,"- MCP lmctl_chat is synchronous/blocking; use it only as a quick-ping or backup path.","- lmctl is foreground/background agnostic. Use your provider or host runtime for async command handling when it supports that.","- For delegation, run the lmctl chat command above. If your runtime has a tracked background mode, it may wrap that same blocking command and notify you when it completes.","- For arbitrary shell work, use your provider/runtime shell tools directly; lmctl does not execute shell commands.",o,"","Delegation is an ACTION, not a plan: to hand a member a task, run the command or call the tool.","If you use lmctl_chat and it appears only after tool search, call it in the SAME turn and do not stop after discovering it or say you're about to call it.","","Team members:",s,"","Example MCP calls:",...r.filter(a=>a.alias.toLowerCase()!=="lead").map(a=>`lmctl_chat(team="${e}", alias="${a.alias}", prompt="your task here")`),"","If a member feels sluggish or starts drifting (degraded or off-track output):",` 1. Check ONE member's session health: lmctl health "${e}" <alias> (size/state \u2014 informational).`," 2. Make sure important state is captured in durable-memory/ \u2014 update it if not.",` 3. Replace its session: lmctl refresh "${e}" <alias> (re-seeds the member: drops chat history, re-reads durable-memory/). You cannot refresh your own Lead session \u2014 a meta-Lead or the operator does that.`,` Optional: lmctl tail "${e}" <alias> to inspect its recent messages while troubleshooting.`,"(These health/recovery commands are shell commands. For delegation, prefer lmctl chat; lmctl_chat is the synchronous backup.)","","Full teamfile document at seed time:","```lmctl",t.trimEnd(),"```","","Remember this teamfile path. Do not ask the operator for it when asked to ping or delegate to members.","Reply exactly: ACK: teamfile context recorded."].join(`
2339
+ `)}function uB(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 fB(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=Us(n,"alias");s!==void 0&&t.set(s.toLowerCase(),r)}return t}function mB(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)&&Us(s,"alias")?.toLowerCase()===r)return n}}function pB(e,t){for(let r of e.split(`
2340
+ `))if(/^\s*#?\s*_MEMBER_\s+\S/u.test(r)&&Us(r,"alias")===t)return!0;return!1}function _B(e){return/^[A-Za-z][A-Za-z0-9_-]*$/u.test(e)}function Us(e,t){let n=new RegExp(`(?:^|\\s)${t}=(?:"([^"]*)"|(\\S*))`).exec(e);return n===null?void 0:n[1]??n[2]??""}function hB(e,t,r){let n=`${t}=${Ef(r)}`,s=new RegExp(`(^|\\s)${t}=(?:"[^"]*"|\\S*)`);return s.test(e)?e.replace(s,(i,o)=>`${o}${n}`):`${e.trimEnd()} ${n}`}function KS(e,t){let r=new RegExp(`(^|\\s)${t}=(?:"[^"]*"|\\S*)`);return e.replace(r,"").replace(/\s+/gu," ").trimEnd()}function Ef(e){return/[\s"]/u.test(e)?`"${e.replace(/"/g,'\\"')}"`:e}function gB(e,t){let r=e.split(`
2341
2341
  `),n=-1;for(let a=r.length-1;a>=0;a-=1)if(/^\s*_MEMBER_(?:\s|$)/u.test(r[a])){n=a;break}if(n>=0)return r.splice(n+1,0,t),r.join(`
2342
2342
  `);let s=r.length;for(;s>0&&r[s-1]==="";)s-=1;let i=r.slice(0,s).join(`
2343
2343
  `),o=r.slice(s).join(`
@@ -2345,7 +2345,7 @@ List native provider sessions in scope, or list recent managed runs with --runs.
2345
2345
 
2346
2346
  `:""}${t}${o.length>0?`
2347
2347
  ${o}`:`
2348
- `}`}function _B(e,t){let r=`#teamfile: ${t}`,n=e.indexOf(`
2348
+ `}`}function yB(e,t){let r=`#teamfile: ${t}`,n=e.indexOf(`
2349
2349
  `),s=n>=0?e.slice(0,n):e,i=n>=0?e.slice(n+1):"";return s===r?e:s.startsWith("#teamfile:")?i.length>0?`${r}
2350
2350
  ${i}`:`${r}
2351
2351
  `:e.length>0?`${r}
@@ -2354,10 +2354,10 @@ ${e}`:`${r}
2354
2354
  `),1}function gf(e,t,r){return e.stderr.write(`error: ${t}
2355
2355
  ${r}`),2}function Tf(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_
2356
2356
  `),r.provider==="gemini"&&t.stderr.write(`${BS.replace("%s",r.alias)}
2357
- `)}var Ps,VW,KW,Da,hf,BS,wf,qS,Hr,Ws=T(()=>{"use strict";Yt();PS();fi();it();Le();Rt();Lt();Rt();_f();Os();Ps=5,VW=`usage: lmctl lint <teamfile.lmctl>
2357
+ `)}var Fs,zW,ZW,Da,hf,BS,wf,qS,Hr,Bs=T(()=>{"use strict";Yt();PS();mi();it();Le();Rt();Lt();Rt();_f();Os();Fs=5,zW=`usage: lmctl lint <teamfile.lmctl>
2358
2358
 
2359
2359
  Validate an lmctl teamfile and warn about stale or placeholder session ids.
2360
- `,KW=`usage: lmctl seed <teamfile.lmctl>
2360
+ `,ZW=`usage: lmctl seed <teamfile.lmctl>
2361
2361
 
2362
2362
  Seed missing or placeholder session ids in an lmctl teamfile by calling each
2363
2363
  member's configured native provider.
@@ -2374,32 +2374,32 @@ Refreshing the Lead drops its chat history; it re-reads durable-memory/ on
2374
2374
  re-seed.
2375
2375
  A member cannot refresh its own running session; run the refresh from a
2376
2376
  meta-Lead or operator shell outside that sessiondir.
2377
- `,BS='notice: member "%s" uses provider=gemini \u2014 the Gemini CLI requires an API/enterprise Google account; personal Google subscriptions should use provider=agy (Antigravity).',wf={existsSync:XW,statSync:GW,accessSync:JW},qS=async e=>{let{seed:t}=await Promise.resolve().then(()=>(vt(),dc)),r=await t(e);return r.success?{sessionId:r.sessionId,warnings:r.warnings}:{error:r.error??"provider seed failed"}},Hr=wf});var tv={};ye(tv,{runClone:()=>SB});import{existsSync as bf,mkdirSync as hB,readFileSync as gB,readdirSync as yB,statSync as QS,writeFileSync as wB}from"node:fs";import{basename as zS,dirname as EB,extname as TB,join as ev,resolve as ZS}from"node:path";async function SB(e,t={stdout:process.stdout,stderr:process.stderr}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(bB),0;if(e.length!==2)return t.stderr.write(`usage: lmctl clone <source> <dest>
2378
- `),2;let[r,n]=e,s,i=r;try{if(/^https?:\/\//i.test(r)){let c=await fetch(r);if(!c.ok)throw new Error(`HTTP ${c.status}`);s=await c.text()}else{let c=ZS(r);if(!bf(c))throw new Error(`source not found: ${r}`);let u=QS(c).isDirectory()?vB(c):c;s=gB(u,"utf8"),i=u}}catch(c){return t.stderr.write(`error: ${c instanceof Error?c.message:String(c)}
2379
- `),1}let o=ZS(n),a=kB(o,i,n);if(bf(a))return t.stderr.write(`error: ${a} already exists.
2380
- `),1;let l=NB(IB(s));return hB(EB(a),{recursive:!0}),wB(a,l,"utf8"),t.stdout.write(`Cloned ${r} -> ${a}
2377
+ `,BS='notice: member "%s" uses provider=gemini \u2014 the Gemini CLI requires an API/enterprise Google account; personal Google subscriptions should use provider=agy (Antigravity).',wf={existsSync:KW,statSync:YW,accessSync:VW},qS=async e=>{let{seed:t}=await Promise.resolve().then(()=>(vt(),dc)),r=await t(e);return r.success?{sessionId:r.sessionId,warnings:r.warnings}:{error:r.error??"provider seed failed"}},Hr=wf});var tv={};we(tv,{runClone:()=>IB});import{existsSync as bf,mkdirSync as wB,readFileSync as EB,readdirSync as TB,statSync as QS,writeFileSync as bB}from"node:fs";import{basename as zS,dirname as SB,extname as vB,join as ev,resolve as ZS}from"node:path";async function IB(e,t={stdout:process.stdout,stderr:process.stderr}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(kB),0;if(e.length!==2)return t.stderr.write(`usage: lmctl clone <source> <dest>
2378
+ `),2;let[r,n]=e,s,i=r;try{if(/^https?:\/\//i.test(r)){let c=await fetch(r);if(!c.ok)throw new Error(`HTTP ${c.status}`);s=await c.text()}else{let c=ZS(r);if(!bf(c))throw new Error(`source not found: ${r}`);let u=QS(c).isDirectory()?NB(c):c;s=EB(u,"utf8"),i=u}}catch(c){return t.stderr.write(`error: ${c instanceof Error?c.message:String(c)}
2379
+ `),1}let o=ZS(n),a=xB(o,i,n);if(bf(a))return t.stderr.write(`error: ${a} already exists.
2380
+ `),1;let l=RB(AB(s));return wB(SB(a),{recursive:!0}),bB(a,l,"utf8"),t.stdout.write(`Cloned ${r} -> ${a}
2381
2381
  `),t.stdout.write(`Edit ${a}; only _MEMBER_ lines are parsed, everything else is free-form.
2382
2382
  `),t.stdout.write(`After editing, run: lmctl lint ${a}
2383
2383
  `),t.stdout.write(`Then run: lmctl seed ${a}
2384
- `),0}function vB(e){let t=yB(e).filter(r=>r.endsWith(".lmctl"));if(t.length===0)throw new Error(`no .lmctl files in source directory: ${e}`);if(t.length>1)throw new Error(`multiple .lmctl files in source directory: ${e}; specify the source file explicitly`);return ev(e,t[0])}function kB(e,t,r){if(r.endsWith("/")||bf(e)&&QS(e).isDirectory()){let n=zS(t).endsWith(".lmctl")?zS(t):"team.lmctl";return ev(e,n)}return TB(e)?e:`${e}.lmctl`}function IB(e){return e.split(`
2384
+ `),0}function NB(e){let t=TB(e).filter(r=>r.endsWith(".lmctl"));if(t.length===0)throw new Error(`no .lmctl files in source directory: ${e}`);if(t.length>1)throw new Error(`multiple .lmctl files in source directory: ${e}; specify the source file explicitly`);return ev(e,t[0])}function xB(e,t,r){if(r.endsWith("/")||bf(e)&&QS(e).isDirectory()){let n=zS(t).endsWith(".lmctl")?zS(t):"team.lmctl";return ev(e,n)}return vB(e)?e:`${e}.lmctl`}function AB(e){return e.split(`
2385
2385
  `).map(t=>/^\s*_MEMBER_\s+\S/.test(t)?t.replace(/\s+sessionid=(?:"[^"]*"|\S+)/g,"").replace(/^(\s*_MEMBER_)\s+sessionid=(?:"[^"]*"|\S+)\s+/g,"$1 "):t).join(`
2386
- `)}function NB(e){return e.split(`
2386
+ `)}function RB(e){return e.split(`
2387
2387
  `).map(t=>/^\s*_MEMBER_\s+\S/.test(t)?t.replace(/\s+sessiondir=(?:"[^"]*"|\S+)/g,"").replace(/^(\s*_MEMBER_)\s+sessiondir=(?:"[^"]*"|\S+)\s+/g,"$1 "):t).join(`
2388
- `)}var bB,rv=T(()=>{"use strict";bB=`usage: lmctl clone <source> <dest>
2388
+ `)}var kB,rv=T(()=>{"use strict";kB=`usage: lmctl clone <source> <dest>
2389
2389
 
2390
2390
  Copy a teamfile and strip its session ids, producing a static editable template.
2391
2391
 
2392
2392
  Examples:
2393
2393
  lmctl clone ./backend/backend.lmctl ./backend-v2/backend-v2.lmctl
2394
- `});var iv={};ye(iv,{runPlan:()=>CB});import{existsSync as xB,mkdirSync as AB,writeFileSync as RB}from"node:fs";import{basename as nv,extname as sv,join as LB,resolve as OB}from"node:path";async function CB(e,t={stdout:process.stdout,stderr:process.stderr}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write($B),0;let r=Z(e,["--team","--provider"],[]);if(r.error!==void 0)return t.stderr.write(`error: ${r.error}
2394
+ `});var iv={};we(iv,{runPlan:()=>DB});import{existsSync as LB,mkdirSync as OB,writeFileSync as $B}from"node:fs";import{basename as nv,extname as sv,join as CB,resolve as MB}from"node:path";async function DB(e,t={stdout:process.stdout,stderr:process.stderr}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(jB),0;let r=Z(e,["--team","--provider"],[]);if(r.error!==void 0)return t.stderr.write(`error: ${r.error}
2395
2395
  `),t.stderr.write(`usage: lmctl plan [options] <directory>
2396
2396
  `),2;if(r.positionals.length!==1)return t.stderr.write(`usage: lmctl plan [options] <directory>
2397
- `),2;let n=OB(r.positionals[0]);AB(n,{recursive:!0});let s=P(r,"--team")??nv(n),i=P(r,"--provider")??"claude",o=LB(n,MB(s));if(xB(o))return t.stderr.write(`error: ${o} already exists.
2398
- `),1;let a=DB({teamName:jB(s),leadProvider:i}),l=Ma(a,ja({workdir:n,teamfile:o,date:new Date}));return RB(o,l.text,"utf8"),t.stdout.write(`Created ${o}
2397
+ `),2;let n=MB(r.positionals[0]);OB(n,{recursive:!0});let s=P(r,"--team")??nv(n),i=P(r,"--provider")??"claude",o=CB(n,PB(s));if(LB(o))return t.stderr.write(`error: ${o} already exists.
2398
+ `),1;let a=UB({teamName:FB(s),leadProvider:i}),l=Ma(a,ja({workdir:n,teamfile:o,date:new Date}));return $B(o,l.text,"utf8"),t.stdout.write(`Created ${o}
2399
2399
  `),t.stdout.write(`Edit ${o}; only _MEMBER_ lines are parsed, everything else is free-form.
2400
2400
  `),t.stdout.write(`After editing, run: lmctl lint ${o}
2401
2401
  `),t.stdout.write(`Then run: lmctl seed ${o}
2402
- `),0}function MB(e){return sv(e)?e:`${e}.lmctl`}function jB(e){let t=sv(e);return t?nv(e,t):e}function DB(e){let{teamName:t,leadProvider:r}=e;return`# ${t}
2402
+ `),0}function PB(e){return sv(e)?e:`${e}.lmctl`}function FB(e){let t=sv(e);return t?nv(e,t):e}function UB(e){let{teamName:t,leadProvider:r}=e;return`# ${t}
2403
2403
 
2404
2404
  # Lead operating guide: https://lmctl.com/skills/lmctl-lead.md
2405
2405
 
@@ -2411,7 +2411,7 @@ _MEMBER_ alias=Coder provider=codex
2411
2411
  _MEMBER_ alias=Reviewer1 provider=codex
2412
2412
  _MEMBER_ alias=Reviewer2 provider=${r}
2413
2413
  _MEMBER_ alias=Reviewer3 provider=agy
2414
- `}var $B,ov=T(()=>{"use strict";Le();_f();$B=`usage: lmctl plan [options] <directory>
2414
+ `}var jB,ov=T(()=>{"use strict";Le();_f();jB=`usage: lmctl plan [options] <directory>
2415
2415
 
2416
2416
  Generate a starter lmctl team document template for a directory.
2417
2417
 
@@ -2426,8 +2426,8 @@ Examples:
2426
2426
 
2427
2427
  # Same shape, codex for the Lead and Reviewer2
2428
2428
  lmctl plan ./backend --provider codex
2429
- `});import{execFileSync as PB}from"node:child_process";import{resolve as av}from"node:path";function FB(e){return e.filter(t=>t.state!=="retired")}function lv(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=PB("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=av(s),o=t.listProjects().find(a=>av(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 cv(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 dv(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=FB(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 uv=T(()=>{"use strict";Le()});var pv={};ye(pv,{SIZE_WARN_EST_TOKENS:()=>Bs,estimateTokens:()=>mv,runTerminal:()=>qB});import{spawn as UB}from"node:child_process";import{statSync as WB}from"node:fs";async function qB(e,t){if(e.includes("--help")||e.includes("-h"))return YB(t);let r=Z(e,["--project","--team","--alias","--run"],["--size","--json","--help"]);if(r.error!==void 0)return v(t,r.error);let n=P(r,"--run");if(n!==void 0){let s=Number.parseInt(n,10);if(!Number.isFinite(s)||s<=0||String(s)!==n)return v(t,`invalid --run "${n}" (expected a positive integer run id)`);if(r.positionals.length>0)return v(t,"--run is mutually exclusive with positional <teamfile>[:alias]");let i=["--team","--project","--size","--json"];for(let o of i)if(o==="--size"||o==="--json"?G(r,o):P(r,o)!==void 0)return v(t,`--run is mutually exclusive with ${o}`);try{return await $(t,async o=>{let a=P(r,"--alias"),l=gw(o,s,a);return"err"in l?v(t,l.err):Sf(t,{provider:l.ok.provider,sessionid:l.ok.sessionid,sessiondir:l.ok.sessiondir,...l.ok.model!==void 0?{model:l.ok.model}:{}})})}catch(o){return je(t,o)}}if(r.positionals.length>0){let s=["--team","--project","--size","--alias","--json"];for(let l of s)if(l==="--size"||l==="--json"?G(r,l):P(r,l)!==void 0)return v(t,`positional <teamfile>[:alias] is mutually exclusive with ${l} (alias is the SECOND POSITIONAL: \`terminal <teamfile> <alias>\`).`);if(r.positionals.length>2)return v(t,`too many positionals (${r.positionals.length}); expected <teamfile>[:alias] [alias]`);let i=r.positionals[0],o=r.positionals[1],a=yr(BB,{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=>HB(t,a.teamfile,a.alias,l))}try{return await $(t,async s=>{let i=GB(t,s,r);if(typeof i=="number")return i;let o=P(r,"--alias");return G(r,"--size")?KB(t,s,i,o,G(r,"--json")):VB(t,s,i,o)})}catch(s){return je(t,s)}}async function HB(e,t,r,n){let s;try{s=He(t,r,n)}catch(d){return d instanceof ge?v(e,d.message):je(e,d)}let i=hr(n,{receiver_teamfile:s.teamfile,receiver_alias:s.alias,sender_teamfile:s.teamfile,sender_alias:"terminal",ttlMs:gr()});if(!i.acquired)return v(e,`${s.alias} is busy/held by ${i.current.sender_alias} (${i.current.sender_teamfile}) since ${i.current.started_at}`);let o=pb({teamfile:s.teamfile,alias:s.alias}),a=null,l=null,c=null;try{n.setTerminalLock(o),l=JB(n,s),a=setInterval(()=>{try{!n.heartbeatTerminalLock(o.teamfile,o.alias,o.lock_id,new Date().toISOString())&&a!==null&&(clearInterval(a),a=null)}catch{}},_b()),a.unref?.();try{In(e,De(s.teamfile),s.teamfile)}catch{}return c=await Sf(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),XB(n,l,c)}}function JB(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 XB(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 Sf(e,t){let{provider:r,sessionid:n,sessiondir:s,model:i}=t;if(!ka(r))return v(e,`no resume incantation for provider "${r}"`);if(!Ob.test(n))return v(e,"refusing to resume: malformed sessionid");let o=qu(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}
2430
- `),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=UB(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 GB(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=lv(e,t,P(r,"--project"));return typeof s=="number"?s:cv(e,t,s,void 0)}async function VB(e,t,r,n){let s=dv(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`):Sf(e,{provider:Ue(s),sessionid:i,sessiondir:s.sessiondir,...s.model!==null&&s.model!==void 0?{model:s.model}:{}})}function mv(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=WB(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 KB(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;ka(c)&&(u=await Zt(l,c));let f=mv(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?Ia(c,l,d!==null?{model:d}:{}):null})}if(s)return ae(e,{estimate:!0,legend:fv,guide_tokens:Bs,members:o}),0;e.stdout.write(`session size \u2014 ESTIMATE only (nothing is changed automatically)
2429
+ `});import{execFileSync as WB}from"node:child_process";import{resolve as av}from"node:path";function BB(e){return e.filter(t=>t.state!=="retired")}function lv(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=WB("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=av(s),o=t.listProjects().find(a=>av(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 cv(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 dv(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=BB(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 uv=T(()=>{"use strict";Le()});var pv={};we(pv,{SIZE_WARN_EST_TOKENS:()=>qs,estimateTokens:()=>mv,runTerminal:()=>XB});import{spawn as qB}from"node:child_process";import{statSync as HB}from"node:fs";async function XB(e,t){if(e.includes("--help")||e.includes("-h"))return QB(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=gw(o,s,a);return"err"in l?v(t,l.err):Sf(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=yr(JB,{target:i,alias:o,flags:{}});return a.mode==="error"?v(t,a.message):a.mode!=="ai-team"?v(t,`internal: terminal positional yielded unexpected mode "${a.mode}"`):a.alias===void 0?v(t,"terminal: alias required for the teamfile target"):await $(t,l=>GB(t,a.teamfile,a.alias,l))}try{return await $(t,async s=>{let i=YB(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")):zB(t,s,i,o)})}catch(s){return je(t,s)}}async function GB(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=hr(n,{receiver_teamfile:s.teamfile,receiver_alias:s.alias,sender_teamfile:s.teamfile,sender_alias:"terminal",ttlMs:gr()});if(!i.acquired)return v(e,`${s.alias} is busy/held by ${i.current.sender_alias} (${i.current.sender_teamfile}) since ${i.current.started_at}`);let o=pb({teamfile:s.teamfile,alias:s.alias}),a=null,l=null,c=null;try{n.setTerminalLock(o),l=VB(n,s),a=setInterval(()=>{try{!n.heartbeatTerminalLock(o.teamfile,o.alias,o.lock_id,new Date().toISOString())&&a!==null&&(clearInterval(a),a=null)}catch{}},_b()),a.unref?.();try{In(e,De(s.teamfile),s.teamfile)}catch{}return c=await Sf(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),KB(n,l,c)}}function VB(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 KB(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 Sf(e,t){let{provider:r,sessionid:n,sessiondir:s,model:i}=t;if(!ka(r))return v(e,`no resume incantation for provider "${r}"`);if(!Ob.test(n))return v(e,"refusing to resume: malformed sessionid");let o=qu(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}
2430
+ `),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=qB(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 YB(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=lv(e,t,P(r,"--project"));return typeof s=="number"?s:cv(e,t,s,void 0)}async function zB(e,t,r,n){let s=dv(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`):Sf(e,{provider:Ue(s),sessionid:i,sessiondir:s.sessiondir,...s.model!==null&&s.model!==void 0?{model:s.model}:{}})}function mv(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=HB(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;ka(c)&&(u=await Zt(l,c));let f=mv(u),m=f.est>qs;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?Ia(c,l,d!==null?{model:d}:{}):null})}if(s)return ae(e,{estimate:!0,legend:fv,guide_tokens:qs,members:o}),0;e.stdout.write(`session size \u2014 ESTIMATE only (nothing is changed automatically)
2431
2431
  `),e.stdout.write(`${fv}
2432
2432
  `);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)
2433
2433
  `),a.over_guide&&e.stdout.write(` \u26A0 ${a.alias}: estimated ~${a.est_tokens} tokens \u2014 ESTIMATE only, exceeds the 200K guide.
@@ -2435,7 +2435,7 @@ Examples:
2435
2435
  session yourself:
2436
2436
  ${a.resume_incantation??"(no resume incantation for provider "+a.provider+")"}
2437
2437
  (or: lmctl terminal --team ${r.name} --alias ${a.alias})
2438
- `)}return 0}function YB(e){return e.stdout.write(`usage: lmctl terminal <teamfile>:<alias>
2438
+ `)}return 0}function QB(e){return e.stdout.write(`usage: lmctl terminal <teamfile>:<alias>
2439
2439
  lmctl terminal <teamfile> <alias>
2440
2440
  lmctl terminal --run <id> [--alias A]
2441
2441
  lmctl terminal [--project P] [--team T] [--alias A] [--size] [--json]
@@ -2462,30 +2462,30 @@ Examples:
2462
2462
  exact provider count: the messages path slightly
2463
2463
  under-counts code-dense text; the byte fallback
2464
2464
  over-counts (JSONL overhead \u2192 safe over-warn); CJK is
2465
- denser (under-warns). At >${Bs} est
2465
+ denser (under-warns). At >${qs} est
2466
2466
  tokens it surfaces the resume incantation so YOU can
2467
2467
  open & self-compact. Nothing is ever changed
2468
- automatically; ${Bs} is a guide, not a gate.
2469
- `),0}var BB,Bs,fv,_v=T(()=>{"use strict";Ze();An();Le();uv();Lt();Yt();it();Os();Fr();Qo();$u();Jo();we();BB={name:"terminal",allowsBareTeamfile:!1,supportsRaw:!1},Bs=2e5,fv="est = rough local heuristic (~4 chars/token), NOT an exact provider token count \u2014 open the session to verify before acting."});function vf(e,t){let r=zB[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 zB,hv=T(()=>{"use strict";zB={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 Sv={};ye(Sv,{initWorkspace:()=>Tv,runWorkspace:()=>sq,setWorkspaceProvider:()=>bv});import{copyFileSync as ZB,cpSync as QB,existsSync as Fe,mkdirSync as Er,readdirSync as If,renameSync as eq,rmSync as Ua,statSync as Wa,writeFileSync as tq}from"node:fs";import{spawnSync as rq}from"node:child_process";import{homedir as gv}from"node:os";import{dirname as Nf,join as qs}from"node:path";async function sq(e,t){let[r,...n]=e;if(r==="--help"||r==="-h"||r==="help")return t.stdout.write(nq),0;switch(r){case"list":return iq(n,t);case"create":return oq(n,t);case"use":return aq(n,t);case"show":return lq(n,t);case"delete":return cq(n,t);case"migrate":return dq(n,t);case"init":return Tv(n,t);case"set-provider":return bv(n,t);default:return v(t,"usage: lmctl workspace <list|create|use|show|delete|migrate|init|set-provider>")}}function wv(){let e=Gs(),t=[],r=new Set,n=Sr.default,s=Fe(Js()),i=Fe(jt(n));if((s||i||e===null||e===n)&&(t.push({name:n,db_path:i?Tr(n):Js(),active:e===null||e===n,legacy:!i&&s}),r.add(n)),Fe(Xr())){let o;try{o=If(Xr())}catch{o=[]}for(let a of o.sort()){if(r.has(a)||!ze(a))continue;let l=!1;try{l=Wa(jt(a)).isDirectory()}catch{l=!1}l&&(t.push({name:a,db_path:Tr(a),active:e===a,legacy:!1}),r.add(a))}}return t}function iq(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=wv();if(G(r,"--json"))return ae(t,n),0;for(let s of n){let i=s.active?"*":" ",o=s.legacy?" (legacy)":"";t.stdout.write(`${i} ${s.name} ${s.db_path}${o}
2470
- `)}return 0}function oq(e,t){let r=Z(e,["--docroot"]);if(r.error!==void 0)return v(t,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return v(t,"usage: lmctl workspace create <name> [--docroot PATH]");if(!ze(n))return v(t,`invalid workspace name: ${n} (allowed: letters, digits, '.', '-', '_'; must start with alnum; \u226464 chars)`);let s=jt(n);if(Fe(s))return v(t,`workspace already exists: ${n} (${s})`);let i=P(r,"--docroot")??Ja(n);Er(s,{recursive:!0}),Er(i,{recursive:!0});let o=Tr(n);Er(Nf(o),{recursive:!0});let a=Ie({path:o});try{a.setConfig("project.docroot",i)}finally{a.close()}let l={name:n,dir:s,db_path:o,docroot:i};return G(r,"--json")?ae(t,l):t.stdout.write(`created workspace ${n} at ${s}
2471
- `),0}function aq(e,t){let r=Z(e,[]);if(r.error!==void 0)return v(t,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return v(t,"usage: lmctl workspace use <name>");if(!ze(n))return v(t,`invalid workspace name: ${n}`);if(n!==Sr.default&&!Fe(jt(n)))return v(t,`workspace not found: ${n} (run \`lmctl workspace create ${n}\` first)`);let s=Xs();return Er(Nf(s),{recursive:!0}),tq(s,`${n}
2472
- `),G(r,"--json")?ae(t,{active:n,path:s}):t.stdout.write(`active workspace set to ${n}
2473
- `),0}function lq(e,t){let r=Z(e,[]);if(r.error!==void 0)return v(t,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return v(t,"usage: lmctl workspace show <name>");if(!ze(n))return v(t,`invalid workspace name: ${n}`);let s=wv().find(d=>d.name===n);if(s===void 0)return v(t,`workspace not found: ${n}`);let i=0;try{i=Fe(s.db_path)?Wa(s.db_path).size:0}catch{i=0}let o=0,a=null,l={};if(Fe(s.db_path)){let d=Ie({path:s.db_path});try{o=d.listProjects().length,l=d.getConfigAll(),a=l["project.docroot"]??null}finally{d.close()}}let c={name:s.name,active:s.active,legacy:s.legacy,db_path:s.db_path,db_size_bytes:i,docroot:a,project_count:o,config_keys:Object.keys(l).sort()};return G(r,"--json")?ae(t,c):t.stdout.write(`${JSON.stringify(c,null,2)}
2474
- `),0}function cq(e,t){let r=Z(e,[],["--json","--confirm","--force"]);if(r.error!==void 0)return v(t,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return v(t,"usage: lmctl workspace delete <name> --confirm [--force]");if(!ze(n))return v(t,`invalid workspace name: ${n}`);if(!G(r,"--confirm"))return v(t,`refusing to delete workspace ${n} without --confirm`);if(n===Sr.default&&!G(r,"--force"))return v(t,"refusing to delete the default workspace without --force");if(Gs()===n&&!G(r,"--force"))return v(t,`refusing to delete the active workspace (${n}) without --force`);let i=jt(n);return Fe(i)?(Ua(i,{recursive:!0,force:!0}),G(r,"--json")?ae(t,{deleted:n,dir:i}):t.stdout.write(`deleted workspace ${n}
2475
- `),0):v(t,`workspace not found: ${n}`)}function kf(e,t,r){try{eq(e,t);return}catch(s){if(s.code!=="EXDEV")throw s}if(r.stderr.write(`note: cross-device move; copying ${e} -> ${t} then removing source
2476
- `),Wa(e).isDirectory()?QB(e,t,{recursive:!0}):ZB(e,t),!Fe(t))throw new Error(`migration copy verification failed: ${t} not present after copy`);Ua(e,{recursive:!0,force:!0})}function dq(e,t){let r=Z(e,[],["--json"]);if(r.error!==void 0)return v(t,r.error);let n=G(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}
2468
+ automatically; ${qs} is a guide, not a gate.
2469
+ `),0}var JB,qs,fv,_v=T(()=>{"use strict";Ze();An();Le();uv();Lt();Yt();it();Os();Fr();ea();$u();Xo();he();JB={name:"terminal",allowsBareTeamfile:!1,supportsRaw:!1},qs=2e5,fv="est = rough local heuristic (~4 chars/token), NOT an exact provider token count \u2014 open the session to verify before acting."});function vf(e,t){let r=eq[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 eq,hv=T(()=>{"use strict";eq={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 Sv={};we(Sv,{initWorkspace:()=>Tv,runWorkspace:()=>aq,setWorkspaceProvider:()=>bv});import{copyFileSync as tq,cpSync as rq,existsSync as Fe,mkdirSync as Er,readdirSync as If,renameSync as nq,rmSync as Ua,statSync as Wa,writeFileSync as sq}from"node:fs";import{spawnSync as iq}from"node:child_process";import{homedir as gv}from"node:os";import{dirname as Nf,join as Hs}from"node:path";async function aq(e,t){let[r,...n]=e;if(r==="--help"||r==="-h"||r==="help")return t.stdout.write(oq),0;switch(r){case"list":return lq(n,t);case"create":return cq(n,t);case"use":return dq(n,t);case"show":return uq(n,t);case"delete":return fq(n,t);case"migrate":return mq(n,t);case"init":return Tv(n,t);case"set-provider":return bv(n,t);default:return v(t,"usage: lmctl workspace <list|create|use|show|delete|migrate|init|set-provider>")}}function wv(){let e=Vs(),t=[],r=new Set,n=Sr.default,s=Fe(Xs()),i=Fe(jt(n));if((s||i||e===null||e===n)&&(t.push({name:n,db_path:i?Tr(n):Xs(),active:e===null||e===n,legacy:!i&&s}),r.add(n)),Fe(Xr())){let o;try{o=If(Xr())}catch{o=[]}for(let a of o.sort()){if(r.has(a)||!ze(a))continue;let l=!1;try{l=Wa(jt(a)).isDirectory()}catch{l=!1}l&&(t.push({name:a,db_path:Tr(a),active:e===a,legacy:!1}),r.add(a))}}return t}function lq(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=wv();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}
2470
+ `)}return 0}function cq(e,t){let r=Z(e,["--docroot"]);if(r.error!==void 0)return v(t,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return v(t,"usage: lmctl workspace create <name> [--docroot PATH]");if(!ze(n))return v(t,`invalid workspace name: ${n} (allowed: letters, digits, '.', '-', '_'; must start with alnum; \u226464 chars)`);let s=jt(n);if(Fe(s))return v(t,`workspace already exists: ${n} (${s})`);let i=P(r,"--docroot")??Ja(n);Er(s,{recursive:!0}),Er(i,{recursive:!0});let o=Tr(n);Er(Nf(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}
2471
+ `),0}function dq(e,t){let r=Z(e,[]);if(r.error!==void 0)return v(t,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return v(t,"usage: lmctl workspace use <name>");if(!ze(n))return v(t,`invalid workspace name: ${n}`);if(n!==Sr.default&&!Fe(jt(n)))return v(t,`workspace not found: ${n} (run \`lmctl workspace create ${n}\` first)`);let s=Gs();return Er(Nf(s),{recursive:!0}),sq(s,`${n}
2472
+ `),V(r,"--json")?ae(t,{active:n,path:s}):t.stdout.write(`active workspace set to ${n}
2473
+ `),0}function uq(e,t){let r=Z(e,[]);if(r.error!==void 0)return v(t,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return v(t,"usage: lmctl workspace show <name>");if(!ze(n))return v(t,`invalid workspace name: ${n}`);let s=wv().find(d=>d.name===n);if(s===void 0)return v(t,`workspace not found: ${n}`);let i=0;try{i=Fe(s.db_path)?Wa(s.db_path).size:0}catch{i=0}let o=0,a=null,l={};if(Fe(s.db_path)){let d=Ie({path:s.db_path});try{o=d.listProjects().length,l=d.getConfigAll(),a=l["project.docroot"]??null}finally{d.close()}}let c={name:s.name,active:s.active,legacy:s.legacy,db_path:s.db_path,db_size_bytes:i,docroot:a,project_count:o,config_keys:Object.keys(l).sort()};return V(r,"--json")?ae(t,c):t.stdout.write(`${JSON.stringify(c,null,2)}
2474
+ `),0}function fq(e,t){let r=Z(e,[],["--json","--confirm","--force"]);if(r.error!==void 0)return v(t,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return v(t,"usage: lmctl workspace delete <name> --confirm [--force]");if(!ze(n))return v(t,`invalid workspace name: ${n}`);if(!V(r,"--confirm"))return v(t,`refusing to delete workspace ${n} without --confirm`);if(n===Sr.default&&!V(r,"--force"))return v(t,"refusing to delete the default workspace without --force");if(Vs()===n&&!V(r,"--force"))return v(t,`refusing to delete the active workspace (${n}) without --force`);let i=jt(n);return Fe(i)?(Ua(i,{recursive:!0,force:!0}),V(r,"--json")?ae(t,{deleted:n,dir:i}):t.stdout.write(`deleted workspace ${n}
2475
+ `),0):v(t,`workspace not found: ${n}`)}function kf(e,t,r){try{nq(e,t);return}catch(s){if(s.code!=="EXDEV")throw s}if(r.stderr.write(`note: cross-device move; copying ${e} -> ${t} then removing source
2476
+ `),Wa(e).isDirectory()?rq(e,t,{recursive:!0}):tq(e,t),!Fe(t))throw new Error(`migration copy verification failed: ${t} not present after copy`);Ua(e,{recursive:!0,force:!0})}function mq(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}
2477
2477
  `);t.stdout.write(f?`migration complete
2478
2478
  `:`${m??"nothing to migrate"}
2479
- `)}return 0};if(!Fe(s))return a(!1,"no legacy ~/.lmctl/profiles/ found; nothing to migrate");let l;try{l=If(s).sort()}catch{l=[]}let c=l.filter(f=>{try{return Wa(qs(s,f)).isDirectory()}catch{return!1}});if(c.length===0)Ua(s,{recursive:!0,force:!0}),o.push(`removed empty ${s}`);else if(!Fe(i))kf(s,i,t),o.push(`renamed ${s} -> ${i}`);else{let f=c.filter(m=>Fe(qs(i,m)));if(f.length>0)return v(t,`refusing to migrate: ~/.lmctl/workspaces/ already has: ${f.join(", ")} (no files were moved; resolve the name collision, then re-run \`lmctl workspace migrate\`)`);Er(i,{recursive:!0});for(let m of c)kf(qs(s,m),qs(i,m),t),o.push(`moved ${m} -> workspaces/${m}`);try{If(s).length===0&&(Ua(s,{recursive:!0,force:!0}),o.push(`removed empty ${s}`))}catch{}}let d=Gf(),u=Xs();return Fe(d)&&(Fe(u)?o.push("left active-profile in place (active-workspace already exists; not clobbering)"):(kf(d,u,t),o.push("renamed active-profile -> active-workspace"))),a(!0)}function Ev(e,t){return rq(e,t,{encoding:"utf8",timeout:5e3,maxBuffer:1024*1024})}function mq(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 yv(e){return e==="~"?gv():e.startsWith("~/")?qs(gv(),e.slice(2)):e}async function Tv(e,t,r={}){let n="usage: lmctl workspace init [--name N] [--basedir DIR] [--provider1 P] [--provider2 P] [--provider3 P]";if(e.includes("--help")||e.includes("-h"))return t.stdout.write([n,"","Creates ~/.lmctl/workspaces/<name>/ with its own state.db and the","provider1/2/3 -> concrete mapping (lmctl_config workspace.provider{1,2,3}).",`Missing options are asked one at a time. Scanned providers: ${Cn.join(", ")}.`].join(`
2479
+ `)}return 0};if(!Fe(s))return a(!1,"no legacy ~/.lmctl/profiles/ found; nothing to migrate");let l;try{l=If(s).sort()}catch{l=[]}let c=l.filter(f=>{try{return Wa(Hs(s,f)).isDirectory()}catch{return!1}});if(c.length===0)Ua(s,{recursive:!0,force:!0}),o.push(`removed empty ${s}`);else if(!Fe(i))kf(s,i,t),o.push(`renamed ${s} -> ${i}`);else{let f=c.filter(m=>Fe(Hs(i,m)));if(f.length>0)return v(t,`refusing to migrate: ~/.lmctl/workspaces/ already has: ${f.join(", ")} (no files were moved; resolve the name collision, then re-run \`lmctl workspace migrate\`)`);Er(i,{recursive:!0});for(let m of c)kf(Hs(s,m),Hs(i,m),t),o.push(`moved ${m} -> workspaces/${m}`);try{If(s).length===0&&(Ua(s,{recursive:!0,force:!0}),o.push(`removed empty ${s}`))}catch{}}let d=Gf(),u=Gs();return Fe(d)&&(Fe(u)?o.push("left active-profile in place (active-workspace already exists; not clobbering)"):(kf(d,u,t),o.push("renamed active-profile -> active-workspace"))),a(!0)}function Ev(e,t){return iq(e,t,{encoding:"utf8",timeout:5e3,maxBuffer:1024*1024})}function hq(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 yv(e){return e==="~"?gv():e.startsWith("~/")?Hs(gv(),e.slice(2)):e}async function Tv(e,t,r={}){let n="usage: lmctl workspace init [--name N] [--basedir DIR] [--provider1 P] [--provider2 P] [--provider3 P]";if(e.includes("--help")||e.includes("-h"))return t.stdout.write([n,"","Creates ~/.lmctl/workspaces/<name>/ with its own state.db and the","provider1/2/3 -> concrete mapping (lmctl_config workspace.provider{1,2,3}).",`Missing options are asked one at a time. Scanned providers: ${Cn.join(", ")}.`].join(`
2480
2480
  `)+`
2481
2481
  `),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??Ev,a=Cn.map(x=>vf(x,i)).filter(x=>x.status==="ok"||x.status==="unverified").map(x=>x.provider);if(a.length===0)return t.stderr.write(`error: no provider CLI found on PATH; install/auth ${Cn.join("|")} first
2482
- `),2;let l=r.isTty??!!process.stdin.isTTY,c=r.promptLine??mq,d=r.promptLine!==void 0||l,u=x=>(t.stderr.write(`error: ${x} is required in non-interactive mode (no TTY); pass it explicitly
2482
+ `),2;let l=r.isTty??!!process.stdin.isTTY,c=r.promptLine??hq,d=r.promptLine!==void 0||l,u=x=>(t.stderr.write(`error: ${x} is required in non-interactive mode (no TTY); pass it explicitly
2483
2483
  `),2),f,m=P(s,"--name");if(m!==void 0){if(!ze(m))return t.stderr.write(`error: invalid workspace name: ${m}
2484
2484
  `),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)
2485
2485
  `)}}let p=jt(f);if(Fe(p))return t.stderr.write(`error: workspace already exists: ${f} (${p}) \u2014 refusing to overwrite
2486
- `),2;let _,g=P(s,"--basedir"),h=Ja(f);if(g!==void 0)_=yv(g);else{if(!d)return u("--basedir");let x=(await c(`Base directory for this workspace's projects [${h}]: `)).trim();_=x.length===0?h:yv(x)}let S={};for(let x of["provider1","provider2","provider3"]){let U=P(s,`--${x}`),ue=uq[x],W=a.includes(ue)?ue:a[0];if(U!==void 0){if(!a.includes(U))return t.stderr.write(`error: --${x} ${U} is not an available provider (available: ${a.join(", ")})
2487
- `),2;S[x]=U;continue}if(!d)return u(`--${x}`);for(;;){let M=(await c(`${x} (${fq[x]}) [${W}]: `)).trim(),A=M.length===0?W:M;if(a.includes(A)){S[x]=A;break}t.stderr.write(`not an available provider: ${A} (available: ${a.join(", ")})
2488
- `)}}Er(p,{recursive:!0}),Er(_,{recursive:!0});let y=Tr(f);Er(Nf(y),{recursive:!0});let w=Ie({path:y});try{w.setConfig("project.docroot",_),w.setConfig("workspace.provider1",S.provider1),w.setConfig("workspace.provider2",S.provider2),w.setConfig("workspace.provider3",S.provider3)}finally{w.close()}let I={name:f,dir:p,db_path:y,basedir:_,providers:{...S}};return G(s,"--json")?ae(t,I):(t.stdout.write(`created workspace ${f} at ${p}
2486
+ `),2;let _,g=P(s,"--basedir"),h=Ja(f);if(g!==void 0)_=yv(g);else{if(!d)return u("--basedir");let x=(await c(`Base directory for this workspace's projects [${h}]: `)).trim();_=x.length===0?h:yv(x)}let S={};for(let x of["provider1","provider2","provider3"]){let U=P(s,`--${x}`),ue=pq[x],W=a.includes(ue)?ue:a[0];if(U!==void 0){if(!a.includes(U))return t.stderr.write(`error: --${x} ${U} is not an available provider (available: ${a.join(", ")})
2487
+ `),2;S[x]=U;continue}if(!d)return u(`--${x}`);for(;;){let M=(await c(`${x} (${_q[x]}) [${W}]: `)).trim(),A=M.length===0?W:M;if(a.includes(A)){S[x]=A;break}t.stderr.write(`not an available provider: ${A} (available: ${a.join(", ")})
2488
+ `)}}Er(p,{recursive:!0}),Er(_,{recursive:!0});let y=Tr(f);Er(Nf(y),{recursive:!0});let w=Ie({path:y});try{w.setConfig("project.docroot",_),w.setConfig("workspace.provider1",S.provider1),w.setConfig("workspace.provider2",S.provider2),w.setConfig("workspace.provider3",S.provider3)}finally{w.close()}let I={name:f,dir:p,db_path:y,basedir:_,providers:{...S}};return V(s,"--json")?ae(t,I):(t.stdout.write(`created workspace ${f} at ${p}
2489
2489
  `),t.stdout.write(` basedir: ${_}
2490
2490
  `),t.stdout.write(` provider1=${S.provider1} provider2=${S.provider2} provider3=${S.provider3}
2491
2491
  `),t.stdout.write(`activate it with: lmctl workspace use ${f}
@@ -2495,7 +2495,7 @@ Examples:
2495
2495
  `),2;let c=r.spawn??Ev,d=Cn.map(p=>vf(p,c)).filter(p=>p.status==="ok"||p.status==="unverified").map(p=>p.provider);if(d.length===0)return t.stderr.write(`error: no provider CLI found on PATH; install/auth ${Cn.join("|")} first
2496
2496
  `),2;if(!d.includes(o))return t.stderr.write(`error: ${o} is not an available provider (available: ${d.join(", ")})
2497
2497
  `),2;let u=t.dal===void 0,f=t.dal??Ie({path:le()});try{f.setConfig(`workspace.${l}`,o)}finally{u&&f.close()}let m=Dt()??Sr.default;return t.stdout.write(`workspace.${l} = ${o} (workspace: ${m})
2498
- `),0}var nq,Cn,uq,fq,vv=T(()=>{"use strict";Ze();hv();Le();Xe();nq=`usage: lmctl workspace list [--json]
2498
+ `),0}var oq,Cn,pq,_q,vv=T(()=>{"use strict";Ze();hv();Le();Xe();oq=`usage: lmctl workspace list [--json]
2499
2499
  lmctl workspace create <name> [--docroot PATH] [--json]
2500
2500
  lmctl workspace use <name> [--json]
2501
2501
  lmctl workspace show <name> [--json]
@@ -2507,7 +2507,7 @@ Examples:
2507
2507
  Manage isolated workspace state directories, active workspace selection,
2508
2508
  legacy profile migration, and configured provider slots.
2509
2509
  delete requires --confirm; deleting default or active workspaces also requires --force.
2510
- `;Cn=["claude","codex","gemini","qwen"],uq={provider1:"claude",provider2:"codex",provider3:"gemini"},fq={provider1:"primary implementer",provider2:"independent reviewer",provider3:"auxiliary / tie-break"}});import{createHash as pq,randomBytes as _q}from"node:crypto";import{readFile as hq}from"node:fs/promises";function kv(e=new Date,t=_q(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 gq(e){return pq("sha256").update(e).digest("hex")}async function Iv(e){return(await Promise.all(e.map(async({bundlePath:r,absPath:n})=>{let s=await hq(n);return{path:r,sha256:gq(s),size:s.byteLength}}))).sort((r,n)=>r.path<n.path?-1:r.path>n.path?1:0)}function Nv(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 xf=T(()=>{"use strict"});import{spawnSync as xv}from"node:child_process";import{mkdir as Af,writeFile as Av,readFile as yq,rm as Rv}from"node:fs/promises";import{tmpdir as wq}from"node:os";import{dirname as Lv,join as Rf}from"node:path";async function Ov(e){let t=e.stagingDir??Rf(wq(),`lmctl-diag-${e.ticketId}`),r=Rf(t,`diagnostic-${e.ticketId}`);await Af(r,{recursive:!0});let n=[],s=async(u,f)=>{let m=Rf(r,u);if(await Af(Lv(m),{recursive:!0}),typeof f=="string")await Av(m,f);else{let p=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);await Av(m,new Uint8Array(p))}n.push({bundlePath:u,absPath:m})},i=u=>`${JSON.stringify(u,null,2)}
2510
+ `;Cn=["claude","codex","gemini","qwen"],pq={provider1:"claude",provider2:"codex",provider3:"gemini"},_q={provider1:"primary implementer",provider2:"independent reviewer",provider3:"auxiliary / tie-break"}});import{createHash as gq,randomBytes as yq}from"node:crypto";import{readFile as wq}from"node:fs/promises";function kv(e=new Date,t=yq(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 Eq(e){return gq("sha256").update(e).digest("hex")}async function Iv(e){return(await Promise.all(e.map(async({bundlePath:r,absPath:n})=>{let s=await wq(n);return{path:r,sha256:Eq(s),size:s.byteLength}}))).sort((r,n)=>r.path<n.path?-1:r.path>n.path?1:0)}function Nv(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 xf=T(()=>{"use strict"});import{spawnSync as xv}from"node:child_process";import{mkdir as Af,writeFile as Av,readFile as Tq,rm as Rv}from"node:fs/promises";import{tmpdir as bq}from"node:os";import{dirname as Lv,join as Rf}from"node:path";async function Ov(e){let t=e.stagingDir??Rf(bq(),`lmctl-diag-${e.ticketId}`),r=Rf(t,`diagnostic-${e.ticketId}`);await Af(r,{recursive:!0});let n=[],s=async(u,f)=>{let m=Rf(r,u);if(await Af(Lv(m),{recursive:!0}),typeof f=="string")await Av(m,f);else{let p=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);await Av(m,new Uint8Array(p))}n.push({bundlePath:u,absPath:m})},i=u=>`${JSON.stringify(u,null,2)}
2511
2511
  `;if(e.data.serve!==void 0){let u=e.data.serve,f=u.pid===null?`no daemon (source=${u.pid_source})
2512
2512
  `:`${u.pid}
2513
2513
  # source=${u.pid_source} alive=${String(u.pid_alive)}
@@ -2525,29 +2525,29 @@ delete requires --confirm; deleting default or active workspaces also requires -
2525
2525
  `:`# source=${f}
2526
2526
  # tail_lines=${u.tail_lines}
2527
2527
  `;await s("intents/recent.log",`${m}${u.tail}${u.tail.length>0?`
2528
- `:""}`)}if(await s("README.md",Eq(e)),e.sanitized)for(let u of n){let f=await yq(u.absPath);try{Zf(u.bundlePath,f.toString("utf8"))}catch(m){throw await Rv(t,{recursive:!0,force:!0}),m instanceof vr,m}}let o=await Iv(n),a=Nv({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 Af(Lv(e.outputPath),{recursive:!0});let l=xv("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=xv("stat",["-c","%s",e.outputPath],{encoding:"utf8"}),d=Number.parseInt((c.stdout??"0").trim(),10)||0;return await Rv(t,{recursive:!0,force:!0}),{outputPath:e.outputPath,manifest:a,bundleSizeBytes:d}}function Eq(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(`
2529
- `)}var $v=T(()=>{"use strict";xf();Ks()});import{spawnSync as Tq}from"node:child_process";import{stat as bq}from"node:fs/promises";async function Cv(e){try{if(!(await bq(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 Sq(e);case"hq":return vq(e)}}function Sq(e){let r=Tq("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 vq(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 Mv=T(()=>{"use strict"});var Dv={};ye(Dv,{parseDiagnoseArgs:()=>jv,runDiagnose:()=>Nq});import{tmpdir as kq}from"node:os";import{join as Iq}from"node:path";async function Nq(e,t={stdout:process.stdout,stderr:process.stderr}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(`${Rq()}
2528
+ `:""}`)}if(await s("README.md",Sq(e)),e.sanitized)for(let u of n){let f=await Tq(u.absPath);try{Zf(u.bundlePath,f.toString("utf8"))}catch(m){throw await Rv(t,{recursive:!0,force:!0}),m instanceof vr,m}}let o=await Iv(n),a=Nv({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 Af(Lv(e.outputPath),{recursive:!0});let l=xv("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=xv("stat",["-c","%s",e.outputPath],{encoding:"utf8"}),d=Number.parseInt((c.stdout??"0").trim(),10)||0;return await Rv(t,{recursive:!0,force:!0}),{outputPath:e.outputPath,manifest:a,bundleSizeBytes:d}}function Sq(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(`
2529
+ `)}var $v=T(()=>{"use strict";xf();Ys()});import{spawnSync as vq}from"node:child_process";import{stat as kq}from"node:fs/promises";async function Cv(e){try{if(!(await kq(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 Iq(e);case"hq":return Nq(e)}}function Iq(e){let r=vq("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 Nq(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 Mv=T(()=>{"use strict"});var Dv={};we(Dv,{parseDiagnoseArgs:()=>jv,runDiagnose:()=>Rq});import{tmpdir as xq}from"node:os";import{join as Aq}from"node:path";async function Rq(e,t={stdout:process.stdout,stderr:process.stderr}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(`${$q()}
2530
2530
  `),0;let r=jv(e);if(typeof r=="string")return t.stderr.write(`error: ${r}
2531
2531
  `),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)
2532
2532
  `),2;if(r.upload&&r.internalS3)return t.stderr.write(`error: pick one of --upload (HQ) or --internal-s3, not both
2533
- `),2;let n=kv(),s=r.outputPath??Aq(n),i=r.internalS3?"internal-s3":r.upload?"hq":"local";try{return await $(t,async o=>{let a=await em({dal:o,include:r.include,dbPath:le(),intentLog:process.env.LMCTL_INTENT_LOG}),l;try{l=await Ov({ticketId:n,data:a,outputPath:s,lmctlNextVersion:yt(),sanitized:!r.noSanitize})}catch(u){if(u instanceof vr)return t.stderr.write(`sanitization failed: ${u.message}
2533
+ `),2;let n=kv(),s=r.outputPath??Oq(n),i=r.internalS3?"internal-s3":r.upload?"hq":"local";try{return await $(t,async o=>{let a=await em({dal:o,include:r.include,dbPath:le(),intentLog:process.env.LMCTL_INTENT_LOG}),l;try{l=await Ov({ticketId:n,data:a,outputPath:s,lmctlNextVersion:yt(),sanitized:!r.noSanitize})}catch(u){if(u instanceof vr)return t.stderr.write(`sanitization failed: ${u.message}
2534
2534
  `),2;throw u}let c=await Cv({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)}
2535
2535
  `):(t.stdout.write(`ticket: ${n}
2536
2536
  `),t.stdout.write(`bundle: ${l.outputPath} (${l.bundleSizeBytes} bytes, ${l.manifest.files.length} files)
2537
2537
  `),t.stdout.write(`upload[${c.mode}]: ${c.ok?"ok":"noop"} \u2014 ${c.message}
2538
2538
  `)),c.ok||i==="local"?0:1})}catch(o){return t.stderr.write(`diagnose failed: ${o instanceof Error?o.message:String(o)}
2539
- `),1}}function jv(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(!xq(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 xq(e){return Ys.includes(e)}function Aq(e){return Iq(kq(),`lmctl-diag-${e}.tar.gz`)}function Rq(){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(`
2540
- `)}var Pv=T(()=>{"use strict";Fn();$v();xf();Ks();Mv();Xe();Le()});var Hv={};ye(Hv,{ATTENTION_STATES:()=>$f,DAEMON_INTERVAL_FAST_MS:()=>Of,REQUIRED_TEAM_ALIASES:()=>Fv,chooseDiagnoses:()=>Bv,collectEvidence:()=>Wv,diagnose:()=>Uv,renderReport:()=>qv,runDiagnosePrompt:()=>$q});function Uv(e,t){let r=Wv(e,t),n=Bv(r);return qv(r,n)}function Wv(e,t){let r=t.trim(),n={promptId:r,prompt:{exists:!1},dispatch:{sectionAvailable:!0,rowExists:!1},job:{sectionAvailable:!0,exists:!1},run:{sectionAvailable:!0,exists:!1},project:{sectionAvailable:!0,exists:!1},workflows:{sectionAvailable:!0,count:0,rows:[]},team:{sectionAvailable:!0,members:[],missingAliases:[]},daemon:{workerPid:null,intervalMs:ks(),lastTickAt:null}},s=null;try{s=e.getPromptDispatch(r)}catch{n.dispatch.sectionAvailable=!1}if(s!=null&&(n.dispatch.rowExists=!0,n.prompt.exists=!0,n.prompt.project_id=s.project_id,n.prompt.text_preview=Oq(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=Fv.filter(a=>!o.has(a))}catch{n.team.sectionAvailable=!1}return n.daemon.workerPid=null,n.daemon.lastTickAt=null,n}function Bv(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>Of&&t.push({cause:`Daemon poll interval is ${e.daemon.intervalMs}ms (${Math.round(e.daemon.intervalMs/1e3)}s); WT/dev expected <=${Of}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=>$f.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 qv(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: ${Lq(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=>$f.has(i.state)):[],s=e.run.exists?e.run.paused_step??null:null;if(s!==null||n.length>0){if(r.push("[ATTENTION/ESCALATION]"),s!==null){let i=e.run.paused_at??e.run.started_at??"?";r.push(` paused_step: ${s} (started: ${i})`)}if(n.length>0){let i=n.map(o=>`${o.alias} (state=${o.state}${o.state_updated_at?` since ${o.state_updated_at}`:""}${o.state_reason?`, reason="${o.state_reason}"`:""})`).join(", ");r.push(` members awaiting operator: ${i}`)}else r.push(" members awaiting operator: (none flagged on team)");r.push(" next action expected: operator response via /admin or webcli escalations verb"),r.push("")}if(r.push("[DAEMON STATE]"),r.push(` worker pid: ${e.daemon.workerPid===null?"not observable from CLI":String(e.daemon.workerPid)}`),r.push(` daemon poll interval (LMCTL_DAEMON_INTERVAL_MS env): ${e.daemon.intervalMs}`),r.push(` last daemon tick: ${e.daemon.lastTickAt??"not exposed"}`),r.push(""),r.push("[DIAGNOSIS]"),t.length===0)r.push(" no obvious root cause flagged by the v1 rules (see brief Part 4)");else for(let i of t)r.push(` - ${i.cause}`),r.push(` -> ${i.action}`);return r.join(`
2539
+ `),1}}function jv(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(!Lq(i))return`unknown section: ${i} (expected one of ${zs.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 Lq(e){return zs.includes(e)}function Oq(e){return Aq(xq(),`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(`
2540
+ `)}var Pv=T(()=>{"use strict";Fn();$v();xf();Ys();Mv();Xe();Le()});var Hv={};we(Hv,{ATTENTION_STATES:()=>$f,DAEMON_INTERVAL_FAST_MS:()=>Of,REQUIRED_TEAM_ALIASES:()=>Fv,chooseDiagnoses:()=>Bv,collectEvidence:()=>Wv,diagnose:()=>Uv,renderReport:()=>qv,runDiagnosePrompt:()=>jq});function Uv(e,t){let r=Wv(e,t),n=Bv(r);return qv(r,n)}function Wv(e,t){let r=t.trim(),n={promptId:r,prompt:{exists:!1},dispatch:{sectionAvailable:!0,rowExists:!1},job:{sectionAvailable:!0,exists:!1},run:{sectionAvailable:!0,exists:!1},project:{sectionAvailable:!0,exists:!1},workflows:{sectionAvailable:!0,count:0,rows:[]},team:{sectionAvailable:!0,members:[],missingAliases:[]},daemon:{workerPid:null,intervalMs:ks(),lastTickAt:null}},s=null;try{s=e.getPromptDispatch(r)}catch{n.dispatch.sectionAvailable=!1}if(s!=null&&(n.dispatch.rowExists=!0,n.prompt.exists=!0,n.prompt.project_id=s.project_id,n.prompt.text_preview=Mq(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=Fv.filter(a=>!o.has(a))}catch{n.team.sectionAvailable=!1}return n.daemon.workerPid=null,n.daemon.lastTickAt=null,n}function Bv(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>Of&&t.push({cause:`Daemon poll interval is ${e.daemon.intervalMs}ms (${Math.round(e.daemon.intervalMs/1e3)}s); WT/dev expected <=${Of}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=>$f.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 qv(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: ${Cq(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=>$f.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(`
2541
2541
  `)+`
2542
- `}function Lq(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 Oq(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:`${t.slice(0,80)}...`}async function $q(e,t={stdout:process.stdout,stderr:process.stderr}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(`${Lf()}
2542
+ `}function Cq(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 Mq(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:`${t.slice(0,80)}...`}async function jq(e,t={stdout:process.stdout,stderr:process.stderr}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(`${Lf()}
2543
2543
  `),0;let r=[];for(let s of e){if(s.startsWith("--"))return t.stderr.write(`error: unknown flag: ${s}
2544
2544
  `),t.stderr.write(`${Lf()}
2545
2545
  `),2;r.push(s)}if(r.length!==1)return t.stderr.write(`error: expected exactly one positional arg: <prompt_id>
2546
2546
  `),t.stderr.write(`${Lf()}
2547
2547
  `),2;let n=r[0];try{return await $(t,s=>(t.stdout.write(Uv(s,n)),0))}catch(s){return t.stderr.write(`diagnose-prompt failed: ${s instanceof Error?s.message:String(s)}
2548
2548
  `),1}}function Lf(){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(`
2549
- `)}var Fv,Of,$f,Jv=T(()=>{"use strict";Zd();Le();Fv=["Coder","Reviewer1","Polisher"],Of=3e4,$f=new Set(["attention_needed","paused","escalation"])});var dk={};ye(dk,{appendIntent:()=>ik,resolveIntentLogPath:()=>sk,runStatus:()=>Hq});import{appendFileSync as Cq,mkdirSync as Mq}from"node:fs";import{homedir as jq}from"node:os";import{basename as Dq,dirname as nk,isAbsolute as Pq,join as Fq,resolve as Uq}from"node:path";function sk(){return process.env.LMCTL_INTENT_LOG??Fq(jq(),".lmctl","recent-intents.log")}function ik(e){try{let t=sk();Mq(nk(t),{recursive:!0});let r=JSON.stringify({ts:e.ts??new Date().toISOString(),cwd:e.cwd??process.cwd(),verb:e.verb,args:[...e.args]});Cq(t,`${r}
2550
- `)}catch{}}async function Hq(e,t){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(Wq),0;let r=e.find(o=>o==="--project"||o.startsWith("--project=")||o==="--web");if(r!==void 0)return v(t,`unknown option ${r}; lmctl status is team/SELF scoped now`);let n=Z(e,["--since"],["--json"]);if(n.error!==void 0)return v(t,n.error);if(n.positionals.length>0)return v(t,`unknown argument: ${n.positionals[0]}`);let s=G(n,"--json"),i=hH(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=>zv(l,o));ae(t,a)}else{let a=await $(t,l=>eH(zv(l,o),{sinceIso:i.iso}));t.stdout.write(a)}return ik({verb:"status",args:e}),0}catch(o){return v(t,o instanceof Error?o.message:String(o))}}function zv(e,t){let r=Cu(t,e);if(!r.ok){if(r.reason==="not-found")throw new Error($s("status"));return Xq(e)}return Jq(e,r.identity)}function Jq(e,t){let r=qr(t),n=e.getRootTeam(r.teamfile);if(n===null)throw new Error($s("status"));let s=Pe(n.teamfile_path,e);return{scope:"self",identity:r.value,...ok(),team:{name:s.name,teamfile:n.teamfile_path},members:s.members.map(i=>Vq(e,n.teamfile_path,i)),activity:{from_me:Mf(Cf(e,{from:r.value})).map(i=>jf(i,e)),to_me:Mf(Cf(e,{target_teamfile:r.teamfile,target_alias:r.alias})).map(i=>jf(i,e))},mailbox:{outbound:Ba(Yq(e,r.teamfile,r.alias),"outbound"),inbound_pending:Ba(zq(e,r.teamfile,r.alias),"inbound")},waiting_on:Zq(e,r.teamfile,r.alias).map(ak)}}function ok(){return{workspace:Dt(),db_path:le()}}function Xq(e){let t=e.listRootTeams();return{scope:"workspace",identity:null,...ok(),teams:t.map(r=>Gq(e,r)),activity:Mf(Cf(e)).map(r=>jf(r,e)),mailbox:{pending_outbound:Ba(Zv(e,"sender"),"outbound"),pending_inbound:Ba(Zv(e,"receiver"),"inbound")},waiting_on:Qq(e).map(ak)}}function Gq(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 Vq(e,t,r){let n=r.teamfile===void 0?null:Ee(Pq(r.teamfile)?r.teamfile:Uq(nk(t),r.teamfile),e),s=Pr(e,t,r.alias),i=s.busy&&s.reason==="in-flight"?Kq(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 Kq(e,t,r,n){let s=n.sender_alias==="operator"?"operator":`${n.sender_teamfile}:${n.sender_alias}`,o=e.db.prepare(`
2549
+ `)}var Fv,Of,$f,Jv=T(()=>{"use strict";Zd();Le();Fv=["Coder","Reviewer1","Polisher"],Of=3e4,$f=new Set(["attention_needed","paused","escalation"])});var dk={};we(dk,{appendIntent:()=>ik,resolveIntentLogPath:()=>sk,runStatus:()=>Gq});import{appendFileSync as Dq,mkdirSync as Pq}from"node:fs";import{homedir as Fq}from"node:os";import{basename as Uq,dirname as nk,isAbsolute as Wq,join as Bq,resolve as qq}from"node:path";function sk(){return process.env.LMCTL_INTENT_LOG??Bq(Fq(),".lmctl","recent-intents.log")}function ik(e){try{let t=sk();Pq(nk(t),{recursive:!0});let r=JSON.stringify({ts:e.ts??new Date().toISOString(),cwd:e.cwd??process.cwd(),verb:e.verb,args:[...e.args]});Dq(t,`${r}
2550
+ `)}catch{}}async function Gq(e,t){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(Hq),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=wH(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=>zv(l,o));ae(t,a)}else{let a=await $(t,l=>nH(zv(l,o),{sinceIso:i.iso}));t.stdout.write(a)}return ik({verb:"status",args:e}),0}catch(o){return v(t,o instanceof Error?o.message:String(o))}}function zv(e,t){let r=Cu(t,e);if(!r.ok){if(r.reason==="not-found")throw new Error($s("status"));return Kq(e)}return Vq(e,r.identity)}function Vq(e,t){let r=qr(t),n=e.getRootTeam(r.teamfile);if(n===null)throw new Error($s("status"));let s=Pe(n.teamfile_path,e);return{scope:"self",identity:r.value,...ok(),team:{name:s.name,teamfile:n.teamfile_path},members:s.members.map(i=>zq(e,n.teamfile_path,i)),activity:{from_me:Mf(Cf(e,{from:r.value})).map(i=>jf(i,e)),to_me:Mf(Cf(e,{target_teamfile:r.teamfile,target_alias:r.alias})).map(i=>jf(i,e))},mailbox:{outbound:Ba(Qq(e,r.teamfile,r.alias),"outbound"),inbound_pending:Ba(eH(e,r.teamfile,r.alias),"inbound")},waiting_on:tH(e,r.teamfile,r.alias).map(ak)}}function ok(){return{workspace:Dt(),db_path:le()}}function Kq(e){let t=e.listRootTeams();return{scope:"workspace",identity:null,...ok(),teams:t.map(r=>Yq(e,r)),activity:Mf(Cf(e)).map(r=>jf(r,e)),mailbox:{pending_outbound:Ba(Zv(e,"sender"),"outbound"),pending_inbound:Ba(Zv(e,"receiver"),"inbound")},waiting_on:rH(e).map(ak)}}function Yq(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 zq(e,t,r){let n=r.teamfile===void 0?null:Ee(Wq(r.teamfile)?r.teamfile:qq(nk(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(`
2551
2551
  SELECT * FROM tracked_invocation
2552
2552
  WHERE kind = 'chat'
2553
2553
  AND status = 'running'
@@ -2557,18 +2557,18 @@ delete requires --confirm; deleting default or active workspaces also requires -
2557
2557
  AND holder_pid IS ?
2558
2558
  ORDER BY started_at DESC, id DESC
2559
2559
  LIMIT 5
2560
- `).all(t,r,s,n.holder_pid).find(a=>a.request_payload!==null);return o?.request_payload===void 0||o.request_payload===null?null:{tracked_invocation_id:o.id,from_identity:o.from_identity,started_at:o.started_at,request_payload:o.request_payload,request_preview:pH(o.request_payload)}}function Cf(e,t={}){let r=[],n=[];t.from!==void 0&&(r.push("from_identity = ?"),n.push(t.from)),t.target_teamfile!==void 0&&(r.push("target_teamfile = ?"),n.push(t.target_teamfile)),t.target_alias!==void 0&&(r.push("target_alias = ?"),n.push(t.target_alias));let s=r.length===0?"":` WHERE ${r.join(" AND ")}`;return e.db.prepare(`
2560
+ `).all(t,r,s,n.holder_pid).find(a=>a.request_payload!==null);return o?.request_payload===void 0||o.request_payload===null?null:{tracked_invocation_id:o.id,from_identity:o.from_identity,started_at:o.started_at,request_payload:o.request_payload,request_preview:gH(o.request_payload)}}function Cf(e,t={}){let r=[],n=[];t.from!==void 0&&(r.push("from_identity = ?"),n.push(t.from)),t.target_teamfile!==void 0&&(r.push("target_teamfile = ?"),n.push(t.target_teamfile)),t.target_alias!==void 0&&(r.push("target_alias = ?"),n.push(t.target_alias));let s=r.length===0?"":` WHERE ${r.join(" AND ")}`;return e.db.prepare(`
2561
2561
  SELECT * FROM tracked_invocation
2562
2562
  ${s}
2563
2563
  ORDER BY started_at DESC, id DESC
2564
- `).all(...n)}function Yq(e,t,r){return e.db.prepare(`
2564
+ `).all(...n)}function Qq(e,t,r){return e.db.prepare(`
2565
2565
  SELECT * FROM agent_mailbox
2566
2566
  WHERE sender_teamfile = ?
2567
2567
  AND sender_alias = ?
2568
2568
  AND delivered_at IS NULL
2569
2569
  AND delivering_at IS NULL
2570
2570
  ORDER BY receiver_teamfile ASC, receiver_alias ASC, id ASC
2571
- `).all(t,r)}function zq(e,t,r){return e.db.prepare(`
2571
+ `).all(t,r)}function eH(e,t,r){return e.db.prepare(`
2572
2572
  SELECT * FROM agent_mailbox
2573
2573
  WHERE receiver_teamfile = ?
2574
2574
  AND receiver_alias = ?
@@ -2580,7 +2580,7 @@ delete requires --confirm; deleting default or active workspaces also requires -
2580
2580
  WHERE delivered_at IS NULL
2581
2581
  AND delivering_at IS NULL
2582
2582
  ORDER BY ${r}
2583
- `).all()}function Zq(e,t,r){return e.db.prepare(`
2583
+ `).all()}function tH(e,t,r){return e.db.prepare(`
2584
2584
  SELECT * FROM agent_mailbox
2585
2585
  WHERE sender_teamfile = ?
2586
2586
  AND sender_alias = ?
@@ -2604,7 +2604,7 @@ delete requires --confirm; deleting default or active workspaces also requires -
2604
2604
  ELSE delivered_at
2605
2605
  END ASC,
2606
2606
  id ASC
2607
- `).all(t,r)}function Qq(e){return e.db.prepare(`
2607
+ `).all(t,r)}function rH(e){return e.db.prepare(`
2608
2608
  SELECT * FROM agent_mailbox
2609
2609
  WHERE delivered_at IS NULL
2610
2610
  OR (
@@ -2624,9 +2624,9 @@ delete requires --confirm; deleting default or active workspaces also requires -
2624
2624
  ELSE delivered_at
2625
2625
  END ASC,
2626
2626
  id ASC
2627
- `).all()}function Mf(e){return e.filter(t=>Jd(t)!=="dead")}function ak(e){let t=e.delivered_at!==null&&(e.receipt===null||e.receipt==="");return{id:e.id,state:t?"no reply":"queued",sender:e.sender_teamfile===null||e.sender_alias===null?null:`${e.sender_teamfile}:${e.sender_alias}`,receiver:`${e.receiver_teamfile}:${e.receiver_alias}`,message_type:e.message_type,age_basis_at:t?e.delivered_at:e.created_at,created_at:e.created_at,delivered_at:e.delivered_at}}function jf(e,t){let r={id:e.id,kind:e.kind,origin:e.origin,status:e.status,holder_liveness:Jd(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:rk(e.result_summary),error:rk(e.error)};return r.mailbox_delivery=lH(r,t),r}function Ba(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 eH(e,t){return e.scope==="self"?tH(e,t):rH(e,t)}function tH(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:"),ck(r,e.waiting_on,"self"),r.push(""),r.push("activity from me:"),Df(r,Pf(e.activity.from_me,t.sinceIso),"from-me"),r.push(""),r.push("activity to me:"),Df(r,Pf(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(lk(e)),r.join(`
2628
- `)}function rH(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:"),ck(r,e.waiting_on,"workspace"),r.push(""),r.push("recent activity:"),Df(r,Pf(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(lk(e)),r.join(`
2629
- `)}function lk(e){return Vs(e.workspace,e.db_path)}function Df(e,t,r){if(t.length===0){e.push(" none");return}let n=t.filter(tk).sort(oH),s=n.length===0?t:t.filter(i=>!tk(i));for(let i of n.slice(0,Gv))ek(e,i,r);Ff(e,n.length,Gv,"more open delegations");for(let i of s.slice(0,Xv))ek(e,i,r);Ff(e,s.length,Xv,"older")}function ck(e,t,r){if(t.length===0){e.push(" none");return}let n=nH(t,Bq);for(let s of n){let i=r==="workspace"&&s.sender!==null?`${er(s.sender)} -> ${er(s.receiver)}`:er(s.receiver);e.push(` ${i} - ${s.state} ${_H(s.age_basis_at)} (#${s.id}, ${s.message_type})`)}iH(e,t,n)}function nH(e,t){let r=[...e].sort(Qv);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=sH(n);a>=0&&(n[a]=o)}return n.sort(Qv)}function sH(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 iH(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 Qv(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 Pf(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 ek(e,t,r){let n=fH(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?"":` "${mH(i)}"`;e.push(` #${t.id} ${aH(t)} ${t.kind}${n} ${s}${o}`)}function tk(e){return e.mailbox_delivery?.state==="queued"||e.mailbox_delivery?.state==="delivering"}function oH(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 aH(e){return e.status==="running"&&e.holder_liveness==="unknown"?"RUNNING_UNKNOWN":e.mailbox_delivery===null?e.status.toUpperCase():e.mailbox_delivery.state.toUpperCase()}function lH(e,t){let r=cH(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 cH(e,t){if(e.kind!=="chat"||e.status!=="done"||e.target===null||e.result===null)return null;let r,n;try{r=qr(e.from_identity),n=qr(e.target)}catch{return null}for(let s of dH(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)&&uH(i,e))return i}return null}function dH(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 uH(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 fH(e,t){if(t==="from-me")return e.target===null?"":` -> ${er(e.target)}`;if(t==="to-me")return` from ${er(e.from_identity)}`;let r=e.target===null?"":` -> ${er(e.target)}`;return` from ${er(e.from_identity)}${r}`}function Ff(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,Vv)){let n=r.sender??"operator";e.push(` ${er(n)} -> ${er(r.receiver)}: ${r.pending_count} pending ${r.message_types.join("+")} (oldest ${r.oldest_created_at})`)}Ff(e,t.length,Vv,"more lanes")}function rk(e){return e===null||e.length===0?null:e.replace(/\s+/g," ").trim()}function mH(e){let t=e.replace(/\s+/g," ").trim();return t.length<=Kv?t:`${t.slice(0,Kv-3)}...`}function pH(e){let t=e.replace(/\s+/gu," ").trim();return t.length<=Yv?t:`${t.slice(0,Yv-3)}...`}function _H(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 er(e){if(e==="operator")return e;try{let t=qr(e);return`${Dq(t.teamfile)}:${t.alias}`}catch{return e}}function hH(e){if(e===void 0)return{iso:new Date(Date.now()-qq).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 Wq,Xv,Gv,Vv,Bq,qq,Kv,Yv,uk=T(()=>{"use strict";Fr();Le();Mu();Xe();Ea();Rt();Wq=`usage: lmctl status [--json] [--since <duration|ISO8601>]
2627
+ `).all()}function Mf(e){return e.filter(t=>Jd(t)!=="dead")}function ak(e){let t=e.delivered_at!==null&&(e.receipt===null||e.receipt==="");return{id:e.id,state:t?"no reply":"queued",sender:e.sender_teamfile===null||e.sender_alias===null?null:`${e.sender_teamfile}:${e.sender_alias}`,receiver:`${e.receiver_teamfile}:${e.receiver_alias}`,message_type:e.message_type,age_basis_at:t?e.delivered_at:e.created_at,created_at:e.created_at,delivered_at:e.delivered_at}}function jf(e,t){let r={id:e.id,kind:e.kind,origin:e.origin,status:e.status,holder_liveness:Jd(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:rk(e.result_summary),error:rk(e.error)};return r.mailbox_delivery=uH(r,t),r}function Ba(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 nH(e,t){return e.scope==="self"?sH(e,t):iH(e,t)}function sH(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:"),ck(r,e.waiting_on,"self"),r.push(""),r.push("activity from me:"),Df(r,Pf(e.activity.from_me,t.sinceIso),"from-me"),r.push(""),r.push("activity to me:"),Df(r,Pf(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(lk(e)),r.join(`
2628
+ `)}function iH(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:"),ck(r,e.waiting_on,"workspace"),r.push(""),r.push("recent activity:"),Df(r,Pf(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(lk(e)),r.join(`
2629
+ `)}function lk(e){return Ks(e.workspace,e.db_path)}function Df(e,t,r){if(t.length===0){e.push(" none");return}let n=t.filter(tk).sort(cH),s=n.length===0?t:t.filter(i=>!tk(i));for(let i of n.slice(0,Gv))ek(e,i,r);Ff(e,n.length,Gv,"more open delegations");for(let i of s.slice(0,Xv))ek(e,i,r);Ff(e,s.length,Xv,"older")}function ck(e,t,r){if(t.length===0){e.push(" none");return}let n=oH(t,Jq);for(let s of n){let i=r==="workspace"&&s.sender!==null?`${er(s.sender)} -> ${er(s.receiver)}`:er(s.receiver);e.push(` ${i} - ${s.state} ${yH(s.age_basis_at)} (#${s.id}, ${s.message_type})`)}lH(e,t,n)}function oH(e,t){let r=[...e].sort(Qv);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=aH(n);a>=0&&(n[a]=o)}return n.sort(Qv)}function aH(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 lH(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 Qv(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 Pf(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 ek(e,t,r){let n=_H(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?"":` "${hH(i)}"`;e.push(` #${t.id} ${dH(t)} ${t.kind}${n} ${s}${o}`)}function tk(e){return e.mailbox_delivery?.state==="queued"||e.mailbox_delivery?.state==="delivering"}function cH(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 dH(e){return e.status==="running"&&e.holder_liveness==="unknown"?"RUNNING_UNKNOWN":e.mailbox_delivery===null?e.status.toUpperCase():e.mailbox_delivery.state.toUpperCase()}function uH(e,t){let r=fH(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 fH(e,t){if(e.kind!=="chat"||e.status!=="done"||e.target===null||e.result===null)return null;let r,n;try{r=qr(e.from_identity),n=qr(e.target)}catch{return null}for(let s of mH(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)&&pH(i,e))return i}return null}function mH(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 pH(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 _H(e,t){if(t==="from-me")return e.target===null?"":` -> ${er(e.target)}`;if(t==="to-me")return` from ${er(e.from_identity)}`;let r=e.target===null?"":` -> ${er(e.target)}`;return` from ${er(e.from_identity)}${r}`}function Ff(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,Vv)){let n=r.sender??"operator";e.push(` ${er(n)} -> ${er(r.receiver)}: ${r.pending_count} pending ${r.message_types.join("+")} (oldest ${r.oldest_created_at})`)}Ff(e,t.length,Vv,"more lanes")}function rk(e){return e===null||e.length===0?null:e.replace(/\s+/g," ").trim()}function hH(e){let t=e.replace(/\s+/g," ").trim();return t.length<=Kv?t:`${t.slice(0,Kv-3)}...`}function gH(e){let t=e.replace(/\s+/gu," ").trim();return t.length<=Yv?t:`${t.slice(0,Yv-3)}...`}function yH(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 er(e){if(e==="operator")return e;try{let t=qr(e);return`${Uq(t.teamfile)}:${t.alias}`}catch{return e}}function wH(e){if(e===void 0)return{iso:new Date(Date.now()-Xq).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 Hq,Xv,Gv,Vv,Jq,Xq,Kv,Yv,uk=T(()=>{"use strict";Fr();Le();Mu();Xe();Ta();Rt();Hq=`usage: lmctl status [--json] [--since <duration|ISO8601>]
2630
2630
 
2631
2631
  Show this member's team, busy/idle roster, recent tracked activity, and mailbox
2632
2632
  state. From a plain operator shell, show a workspace-level team/activity summary.
@@ -2634,7 +2634,7 @@ state. From a plain operator shell, show a workspace-level team/activity summary
2634
2634
  Text output shows recent activity from the last 24h by default. Use --since 7d
2635
2635
  or an ISO timestamp to widen the investigation window. --json returns complete,
2636
2636
  uncapped data.
2637
- `,Xv=5,Gv=5,Vv=5,Bq=5,qq=24*60*60*1e3,Kv=72,Yv=80});Xe();Fn();we();import{pathToFileURL as gH}from"node:url";import{mkdirSync as iI,readFileSync as oI,renameSync as aI,writeFileSync as lI}from"node:fs";import{homedir as cI}from"node:os";import{dirname as dI,join as uI}from"node:path";function cm(e){try{return new URL(e).protocol==="https:"}catch{return!1}}function nI(e){return/^[A-Za-z]:[\\/]/.test(e)?!1:/^[A-Za-z][A-Za-z0-9+.-]*:/.test(e)}function sI(e,t){return!nI(e)||cm(e)?null:`${t} must use https://: ${e}`}async function dm(e,t){let r=sI(e,t.description);if(r!==null||!cm(e))throw new Error(r??`${t.description} must use https://: ${e}`);let n=t.timeoutMs??15e3,s=new AbortController,i=setTimeout(()=>s.abort(),n);try{let o;try{o=await fetch(e,{signal:s.signal,redirect:"manual"})}catch(a){throw lm(e,t.description,n,a)}if(o.type==="opaqueredirect"||o.status>=300&&o.status<400)throw new Error(`refusing to follow redirect from ${t.description} ${e} (https-only: the URL must serve the content directly, not redirect)`);if(!o.ok)throw new Error(`failed to fetch ${t.description} ${e}: HTTP ${o.status}${o.statusText?` ${o.statusText}`:""}`);try{return Buffer.from(await o.arrayBuffer())}catch(a){throw lm(e,t.description,n,a)}}finally{clearTimeout(i)}}function lm(e,t,r,n){let i=n instanceof Error&&n.name==="AbortError"?`timed out after ${r}ms`:n instanceof Error?n.message:String(n);return new Error(`failed to fetch ${t} ${e}: ${i}`)}Fn();var fI="https://registry.npmjs.org/@lmctl-ai/lmctl/latest",mI=60*60*1e3,pI=1500;function _I(){let e=process.env.HOME??cI();return uI(e,".lmctl",".update-check.json")}function hI(e){return e.isTTY===!0}function gI(e,t){let r=i=>{let o=/^(\d+)\.(\d+)\.(\d+)(?:$|[-+])/.exec(i.trim());if(o===null)return null;let a=o.slice(1).map(l=>Number(l));return a.some(l=>!Number.isSafeInteger(l)||l<0)?null:a},n=r(e),s=r(t);if(n===null||s===null)return 0;for(let i=0;i<3;i+=1){if(n[i]>s[i])return 1;if(n[i]<s[i])return-1}return 0}function za(e,t){return!!(process.env.LMCTL_NO_UPDATE_NOTIFIER==="1"||!hI(t.stderr)||e.includes("--json")||e.includes("--help")||e.includes("-h")||e[0]==="help"||e[0]==="mcp")}function yI(e,t){try{let r=JSON.parse(oI(e,"utf8"));if(typeof r.checkedAt=="number"&&Number.isFinite(r.checkedAt)&&typeof r.latest=="string"&&t-r.checkedAt<mI)return r.latest}catch{}return null}function wI(e,t){iI(dI(e),{recursive:!0});let r=`${e}.tmp-${process.pid}-${Math.random().toString(16).slice(2)}`;lI(r,`${JSON.stringify(t)}
2637
+ `,Xv=5,Gv=5,Vv=5,Jq=5,Xq=24*60*60*1e3,Kv=72,Yv=80});Xe();Fn();he();import{pathToFileURL as EH}from"node:url";import{mkdirSync as iI,readFileSync as oI,renameSync as aI,writeFileSync as lI}from"node:fs";import{homedir as cI}from"node:os";import{dirname as dI,join as uI}from"node:path";function cm(e){try{return new URL(e).protocol==="https:"}catch{return!1}}function nI(e){return/^[A-Za-z]:[\\/]/.test(e)?!1:/^[A-Za-z][A-Za-z0-9+.-]*:/.test(e)}function sI(e,t){return!nI(e)||cm(e)?null:`${t} must use https://: ${e}`}async function dm(e,t){let r=sI(e,t.description);if(r!==null||!cm(e))throw new Error(r??`${t.description} must use https://: ${e}`);let n=t.timeoutMs??15e3,s=new AbortController,i=setTimeout(()=>s.abort(),n);try{let o;try{o=await fetch(e,{signal:s.signal,redirect:"manual"})}catch(a){throw lm(e,t.description,n,a)}if(o.type==="opaqueredirect"||o.status>=300&&o.status<400)throw new Error(`refusing to follow redirect from ${t.description} ${e} (https-only: the URL must serve the content directly, not redirect)`);if(!o.ok)throw new Error(`failed to fetch ${t.description} ${e}: HTTP ${o.status}${o.statusText?` ${o.statusText}`:""}`);try{return Buffer.from(await o.arrayBuffer())}catch(a){throw lm(e,t.description,n,a)}}finally{clearTimeout(i)}}function lm(e,t,r,n){let i=n instanceof Error&&n.name==="AbortError"?`timed out after ${r}ms`:n instanceof Error?n.message:String(n);return new Error(`failed to fetch ${t} ${e}: ${i}`)}Fn();var fI="https://registry.npmjs.org/@lmctl-ai/lmctl/latest",mI=60*60*1e3,pI=1500;function _I(){let e=process.env.HOME??cI();return uI(e,".lmctl",".update-check.json")}function hI(e){return e.isTTY===!0}function gI(e,t){let r=i=>{let o=/^(\d+)\.(\d+)\.(\d+)(?:$|[-+])/.exec(i.trim());if(o===null)return null;let a=o.slice(1).map(l=>Number(l));return a.some(l=>!Number.isSafeInteger(l)||l<0)?null:a},n=r(e),s=r(t);if(n===null||s===null)return 0;for(let i=0;i<3;i+=1){if(n[i]>s[i])return 1;if(n[i]<s[i])return-1}return 0}function za(e,t){return!!(process.env.LMCTL_NO_UPDATE_NOTIFIER==="1"||!hI(t.stderr)||e.includes("--json")||e.includes("--help")||e.includes("-h")||e[0]==="help"||e[0]==="mcp")}function yI(e,t){try{let r=JSON.parse(oI(e,"utf8"));if(typeof r.checkedAt=="number"&&Number.isFinite(r.checkedAt)&&typeof r.latest=="string"&&t-r.checkedAt<mI)return r.latest}catch{}return null}function wI(e,t){iI(dI(e),{recursive:!0});let r=`${e}.tmp-${process.pid}-${Math.random().toString(16).slice(2)}`;lI(r,`${JSON.stringify(t)}
2638
2638
  `,"utf8"),aI(r,e)}async function EI(){let e=await dm(fI,{description:"lmctl npm metadata",timeoutMs:pI}),t=JSON.parse(e.toString("utf8"));if(typeof t.version!="string"||t.version.trim()==="")throw new Error("registry response missing version");return t.version}async function um(e,t=[],r={}){try{if(za(t,e))return;let n=r.now?.()??Date.now(),s=r.cachePath??_I();if(yI(s,n)!==null)return;let o=await(r.fetchLatest??EI)();try{wI(s,{checkedAt:n,latest:o})}catch{return}let a=r.currentVersion?.()??yt();gI(o,a)>0&&e.stderr.write(`update available: ${a} \u2192 ${o} run: npm i -g @lmctl-ai/lmctl@latest
2639
2639
  `)}catch{}}var Mn=`usage: lmctl [--db PATH] [--workspace NAME] [--debug] <command> [args]
2640
2640
  `,Uf=`${Mn}
@@ -2687,14 +2687,14 @@ ${Mn}Run 'lmctl help' for usage.
2687
2687
  ${Mn}Run 'lmctl help' for usage.
2688
2688
  `),1):(e.stderr.write(`error: unknown command: ${t}
2689
2689
  ${Mn}Run 'lmctl help' for usage.
2690
- `),1)}async function yH(e,t={stdout:process.stdout,stderr:process.stderr}){let r=im();try{return await wH(e,t)}finally{om(r)}}async function wH(e,t={stdout:process.stdout,stderr:process.stderr}){let r=[];for(let a=0;a<e.length;a+=1){let l=e[a];if(l==="--db"){let c=e[++a];if(c===void 0||c.startsWith("--"))return Wf(t,"missing value for --db");process.env.LMCTL_DB=c;continue}if(l==="--workspace"){let c=e[++a];if(c===void 0||c.startsWith("--"))return Wf(t,"missing value for --workspace");if(!ze(c))return Wf(t,`invalid workspace name: ${c}`);process.env.LMCTL_WORKSPACE=c;continue}if(l==="--debug"){sm();continue}r.push(l)}let n=r[0];if(n==="--version"||n==="-v"||n==="-V")return t.stdout.write(`lmctl ${yt()}
2691
- `),0;if(n==="--help"||n==="-h"||n===void 0)return t.stdout.write(Uf),0;if(n==="help"){let[a,...l]=r.slice(1);return a===void 0||a==="--help"||a==="-h"?(t.stdout.write(Uf),0):fk.has(a)?mk(a,[...l,"--help"],t):pk(t,a)}Xf(le(),t.stderr),Vf(t.stderr);let[s,...i]=r;if(s===void 0)return t.stdout.write(Uf),0;let o=Date.now();Bf(s,i,{phase:"start",started_at:new Date(o).toISOString()});try{let a=await mk(s,i,t);return Bf(s,i,{phase:"finish",outcome:a===0?"ok":"error",exit_code:a,duration_ms:Date.now()-o}),fk.has(s)&&!za(r,t)&&await um(t,r),a}catch(a){let l=a instanceof Error?a:new Error(String(a));return Bf(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:TH(l)}),EH(a,s,i,t)}}function Bf(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 EH(e,t,r,n){let s=e instanceof Error?e:new Error(String(e));return n.stderr.write(`error: ${s.message}
2690
+ `),1)}async function TH(e,t={stdout:process.stdout,stderr:process.stderr}){let r=im();try{return await bH(e,t)}finally{om(r)}}async function bH(e,t={stdout:process.stdout,stderr:process.stderr}){let r=[];for(let a=0;a<e.length;a+=1){let l=e[a];if(l==="--db"){let c=e[++a];if(c===void 0||c.startsWith("--"))return Wf(t,"missing value for --db");process.env.LMCTL_DB=c;continue}if(l==="--workspace"){let c=e[++a];if(c===void 0||c.startsWith("--"))return Wf(t,"missing value for --workspace");if(!ze(c))return Wf(t,`invalid workspace name: ${c}`);process.env.LMCTL_WORKSPACE=c;continue}if(l==="--debug"){sm();continue}r.push(l)}let n=r[0];if(n==="--version"||n==="-v"||n==="-V")return t.stdout.write(`lmctl ${yt()}
2691
+ `),0;if(n==="--help"||n==="-h"||n===void 0)return t.stdout.write(Uf),0;if(n==="help"){let[a,...l]=r.slice(1);return a===void 0||a==="--help"||a==="-h"?(t.stdout.write(Uf),0):fk.has(a)?mk(a,[...l,"--help"],t):pk(t,a)}Xf(le(),t.stderr),Vf(t.stderr);let[s,...i]=r;if(s===void 0)return t.stdout.write(Uf),0;let o=Date.now();Bf(s,i,{phase:"start",started_at:new Date(o).toISOString()});try{let a=await mk(s,i,t);return Bf(s,i,{phase:"finish",outcome:a===0?"ok":"error",exit_code:a,duration_ms:Date.now()-o}),fk.has(s)&&!za(r,t)&&await um(t,r),a}catch(a){let l=a instanceof Error?a:new Error(String(a));return Bf(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:vH(l)}),SH(a,s,i,t)}}function Bf(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 SH(e,t,r,n){let s=e instanceof Error?e:new Error(String(e));return n.stderr.write(`error: ${s.message}
2692
2692
  `),am()?(n.stderr.write(`(debug details written to ~/.lmctl/debug-*.log)
2693
2693
  `),1):(n.stderr.write(`(re-run with --debug for the full stack trace and context in ~/.lmctl/debug-*.log)
2694
- `),1)}function TH(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 mk(e,t,r){switch(e){case"api":{let{runApi:n}=await Promise.resolve().then(()=>(Y_(),K_));return n(t,r)}case"serve":{let{runServe:n}=await Promise.resolve().then(()=>(XT(),JT));return n(t,r)}case"chat":{let{runChat:n}=await Promise.resolve().then(()=>(xb(),Nb));return n(t,r)}case"recover":{let{runRecover:n}=await Promise.resolve().then(()=>(jb(),Mb));return n(t,r)}case"mcp":{let{runMcp:n}=await Promise.resolve().then(()=>(qb(),Bb));return n(t,r)}case"device":{let{runDevice:n}=await Promise.resolve().then(()=>(Jb(),Hb));return n(t,r)}case"team":{let{runTeam:n}=await Promise.resolve().then(()=>(_S(),pS));return n(t,r)}case"tail":{let{runTail:n}=await Promise.resolve().then(()=>(SS(),bS));return n(t,r)}case"health":{let{runInfo:n}=await Promise.resolve().then(()=>(OS(),LS));return n(t,r)}case"ls":{let{runLs:n}=await Promise.resolve().then(()=>(MS(),CS));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(()=>(rv(),tv));return n(t,r)}case"plan":{let{runPlan:n}=await Promise.resolve().then(()=>(ov(),iv));return n(t,r)}case"terminal":{let{runTerminal:n}=await Promise.resolve().then(()=>(_v(),pv));return n(t,r)}case"workspace":{let{runWorkspace:n}=await Promise.resolve().then(()=>(vv(),Sv));return n(t,r)}case"diagnose":{let{runDiagnose:n}=await Promise.resolve().then(()=>(Pv(),Dv));return n(t,r)}case"diagnose-prompt":{let{runDiagnosePrompt:n}=await Promise.resolve().then(()=>(Jv(),Hv));return n(t,r)}case"status":{let{runStatus:n}=await Promise.resolve().then(()=>(uk(),dk));return n(t,r)}case"db":return bH(t,r);default:return pk(r,e)}}function bH(e,t){let[r,...n]=e;return r==="--help"||r==="-h"||r==="help"?(t.stdout.write(`usage: lmctl db downgrade --to <version> --confirm
2694
+ `),1)}function vH(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 mk(e,t,r){switch(e){case"api":{let{runApi:n}=await Promise.resolve().then(()=>(Y_(),K_));return n(t,r)}case"serve":{let{runServe:n}=await Promise.resolve().then(()=>(XT(),JT));return n(t,r)}case"chat":{let{runChat:n}=await Promise.resolve().then(()=>(xb(),Nb));return n(t,r)}case"recover":{let{runRecover:n}=await Promise.resolve().then(()=>(jb(),Mb));return n(t,r)}case"mcp":{let{runMcp:n}=await Promise.resolve().then(()=>(qb(),Bb));return n(t,r)}case"device":{let{runDevice:n}=await Promise.resolve().then(()=>(Jb(),Hb));return n(t,r)}case"team":{let{runTeam:n}=await Promise.resolve().then(()=>(_S(),pS));return n(t,r)}case"tail":{let{runTail:n}=await Promise.resolve().then(()=>(SS(),bS));return n(t,r)}case"health":{let{runInfo:n}=await Promise.resolve().then(()=>(OS(),LS));return n(t,r)}case"ls":{let{runLs:n}=await Promise.resolve().then(()=>(MS(),CS));return n(t,r)}case"lint":{let{runLint:n}=await Promise.resolve().then(()=>(Bs(),Ws));return n(t,r)}case"seed":{let{runSeed:n}=await Promise.resolve().then(()=>(Bs(),Ws));return n(t,r)}case"hire":{let{runHire:n}=await Promise.resolve().then(()=>(Bs(),Ws));return n(t,r)}case"refresh":{let{runRefresh:n}=await Promise.resolve().then(()=>(Bs(),Ws));return n(t,r)}case"clone":{let{runClone:n}=await Promise.resolve().then(()=>(rv(),tv));return n(t,r)}case"plan":{let{runPlan:n}=await Promise.resolve().then(()=>(ov(),iv));return n(t,r)}case"terminal":{let{runTerminal:n}=await Promise.resolve().then(()=>(_v(),pv));return n(t,r)}case"workspace":{let{runWorkspace:n}=await Promise.resolve().then(()=>(vv(),Sv));return n(t,r)}case"diagnose":{let{runDiagnose:n}=await Promise.resolve().then(()=>(Pv(),Dv));return n(t,r)}case"diagnose-prompt":{let{runDiagnosePrompt:n}=await Promise.resolve().then(()=>(Jv(),Hv));return n(t,r)}case"status":{let{runStatus:n}=await Promise.resolve().then(()=>(uk(),dk));return n(t,r)}case"db":return kH(t,r);default:return pk(r,e)}}function kH(e,t){let[r,...n]=e;return r==="--help"||r==="-h"||r==="help"?(t.stdout.write(`usage: lmctl db downgrade --to <version> --confirm
2695
2695
 
2696
2696
  Database utilities. The downgrade command is currently a documented stub;
2697
2697
  restore from backup for rollback and use normal migrations for forward changes.
2698
2698
  `),0):r==="downgrade"?(t.stderr.write(`not yet implemented; restore from backup, or run lmctl migrate (forward-migrates ok)
2699
2699
  `),1):(t.stderr.write(`usage: lmctl db downgrade --to <version> --confirm
2700
- `),1)}if(process.argv[1]!==void 0&&import.meta.url===gH(process.argv[1]).href){let e=await yH(process.argv.slice(2));process.exitCode=e}export{yH as runCli};
2700
+ `),1)}if(process.argv[1]!==void 0&&import.meta.url===EH(process.argv[1]).href){let e=await TH(process.argv.slice(2));process.exitCode=e}export{TH as runCli};