@lmctl-ai/lmctl 0.1.118 → 0.1.119

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli/index.js CHANGED
@@ -1,8 +1,8 @@
1
- var Nv=Object.defineProperty;var T=(t,e)=>()=>(t&&(e=t(t=0)),e);var ae=(t,e)=>{for(var r in e)Nv(t,r,{get:e[r],enumerable:!0})};import{existsSync as qr,readdirSync as xv,readFileSync as Av}from"node:fs";import{homedir as Rv,platform as gm}from"node:os";import{join as Lt}from"node:path";function Tr(){let t=process.env.LMCTL_HOME;return t!==void 0&&t.length>0?t:Lt(Rv(),$v)}function Bn(){return Lt(Tr(),ym)}function br(){return Lt(Tr(),jv)}function Ot(t){return Lt(br(),t)}function er(t){return Lt(Ot(t),ym)}function ml(){let t=[],e=new Set,r=o=>{qr(o.db_path)&&(e.has(o.db_path)||(e.add(o.db_path),t.push(o)))};r({workspace_name:null,db_path:Bn(),kind:"legacy"});let n=br();if(!qr(n))return t;let s;try{s=xv(n)}catch{return t}for(let o of s.sort())Je(o)&&r({workspace_name:o,db_path:er(o),kind:"workspace"});return t}function pl(t){return Lt(Ot(t),"projects")}function io(){return Lt(Tr(),Lv)}function Je(t){return!(t.length===0||t.length>64||!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(t)||t==="."||t==="..")}function ao(){let t=io();if(!qr(t))return null;try{let e=Av(t,"utf8").trim();return e.length===0||!Je(e)?null:e}catch{return null}}function Hn(){let t=process.env.LMCTL_WORKSPACE;return t!==void 0&&t.length>0&&Je(t)?t:ao()}function de(t){if(t!==void 0&&t.length>0)return t;if(process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0)return process.env.LMCTL_DB;let e=Hn();if(e!==null)return er(e);let r=Bn();return qr(r)||!qr(br())?r:er(wm)}function Mv(t,e=gm()){return e!=="linux"?!1:t.startsWith("/mnt/c/")||t==="/mnt/c"}function Em(t,e=process.stderr,r=gm()){Mv(t,r)&&e.write(`warning: DB on /mnt/c is slow; consider moving to ~/.lmctl/state.db (set LMCTL_DB or use --db)
2
- `)}function hl(){return Lt(Tr(),Ov)}function Tm(){return Lt(Tr(),Cv)}function Dv(){try{return qr(hl())}catch{return!1}}function bm(t=process.stderr){Dv()&&t.write(`note: legacy ~/.lmctl/profiles/ detected \u2014 run 'lmctl workspace migrate' to move it to ~/.lmctl/workspaces/
3
- `)}var $v,ym,jv,Lv,wm,Ov,Cv,Sr,ze=T(()=>{"use strict";$v=".lmctl",ym="state.db",jv="workspaces",Lv="active-workspace",wm="default",Ov="profiles",Cv="active-profile";Sr={default:wm}});function Wv(t){for(let e of Uv)if(t.startsWith(e))return!0;if(t.startsWith("172.")){let e=Number(t.split(".")[1]);if(Number.isFinite(e)&&e>=16&&e<=31)return!0}return!!t.startsWith("169.254.")}function Bv(t){let e=t.toLowerCase();return!!(e==="::1"||e==="::"||e.startsWith("fe80:")||e.startsWith("fe80::"))}function Jv(t){let e=t.split(".");if(e.length!==4)return!1;for(let r of e){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 qn(t){let e=t;for(let{re:r,replacement:n}of Fv)e=e.replace(r,n);return e=e.replace(Hv,r=>!Jv(r)||Wv(r)?r:Sm),e=e.replace(qv,r=>Bv(r)?r:Sm),e}function Jn(t){return t.split(`
1
+ var Nv=Object.defineProperty;var T=(t,e)=>()=>(t&&(e=t(t=0)),e);var le=(t,e)=>{for(var r in e)Nv(t,r,{get:e[r],enumerable:!0})};import{existsSync as qr,readdirSync as xv,readFileSync as Av}from"node:fs";import{homedir as Rv,platform as gm}from"node:os";import{join as jt}from"node:path";function Tr(){let t=process.env.LMCTL_HOME;return t!==void 0&&t.length>0?t:jt(Rv(),$v)}function Bn(){return jt(Tr(),ym)}function br(){return jt(Tr(),Lv)}function Ot(t){return jt(br(),t)}function er(t){return jt(Ot(t),ym)}function ml(){let t=[],e=new Set,r=o=>{qr(o.db_path)&&(e.has(o.db_path)||(e.add(o.db_path),t.push(o)))};r({workspace_name:null,db_path:Bn(),kind:"legacy"});let n=br();if(!qr(n))return t;let s;try{s=xv(n)}catch{return t}for(let o of s.sort())Je(o)&&r({workspace_name:o,db_path:er(o),kind:"workspace"});return t}function pl(t){return jt(Ot(t),"projects")}function ao(){return jt(Tr(),jv)}function Je(t){return!(t.length===0||t.length>64||!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(t)||t==="."||t==="..")}function lo(){let t=ao();if(!qr(t))return null;try{let e=Av(t,"utf8").trim();return e.length===0||!Je(e)?null:e}catch{return null}}function Hn(){let t=process.env.LMCTL_WORKSPACE;return t!==void 0&&t.length>0&&Je(t)?t:lo()}function de(t){if(t!==void 0&&t.length>0)return t;if(process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0)return process.env.LMCTL_DB;let e=Hn();if(e!==null)return er(e);let r=Bn();return qr(r)||!qr(br())?r:er(wm)}function Mv(t,e=gm()){return e!=="linux"?!1:t.startsWith("/mnt/c/")||t==="/mnt/c"}function Em(t,e=process.stderr,r=gm()){Mv(t,r)&&e.write(`warning: DB on /mnt/c is slow; consider moving to ~/.lmctl/state.db (set LMCTL_DB or use --db)
2
+ `)}function hl(){return jt(Tr(),Ov)}function Tm(){return jt(Tr(),Cv)}function Dv(){try{return qr(hl())}catch{return!1}}function bm(t=process.stderr){Dv()&&t.write(`note: legacy ~/.lmctl/profiles/ detected \u2014 run 'lmctl workspace migrate' to move it to ~/.lmctl/workspaces/
3
+ `)}var $v,ym,Lv,jv,wm,Ov,Cv,Sr,ze=T(()=>{"use strict";$v=".lmctl",ym="state.db",Lv="workspaces",jv="active-workspace",wm="default",Ov="profiles",Cv="active-profile";Sr={default:wm}});function Wv(t){for(let e of Uv)if(t.startsWith(e))return!0;if(t.startsWith("172.")){let e=Number(t.split(".")[1]);if(Number.isFinite(e)&&e>=16&&e<=31)return!0}return!!t.startsWith("169.254.")}function Bv(t){let e=t.toLowerCase();return!!(e==="::1"||e==="::"||e.startsWith("fe80:")||e.startsWith("fe80::"))}function Jv(t){let e=t.split(".");if(e.length!==4)return!1;for(let r of e){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 qn(t){let e=t;for(let{re:r,replacement:n}of Fv)e=e.replace(r,n);return e=e.replace(Hv,r=>!Jv(r)||Wv(r)?r:Sm),e=e.replace(qv,r=>Bv(r)?r:Sm),e}function Jn(t){return t.split(`
4
4
  `).map(e=>qn(e)).join(`
5
- `)}function vm(t,e){let r=t.toUpperCase();return r.includes("TOKEN")||r.includes("SECRET")||r.includes("KEY")||r.includes("PASSWORD")||r.includes("PASSWD")||r.includes("CREDENTIAL")||r.includes("AUTH")?{key:t,value:at}:{key:t,value:qn(e)}}function tr(t){if(typeof t=="string")return qn(t);if(Array.isArray(t))return t.map(e=>tr(e));if(t!==null&&typeof t=="object"){let e={};for(let[r,n]of Object.entries(t)){let s=r.toUpperCase();s.includes("TOKEN")||s.includes("SECRET")||s.includes("KEY")||s.includes("PASSWORD")||s.includes("PASSWD")||s.includes("CREDENTIAL")?e[r]=typeof n=="string"?at:tr(n):e[r]=tr(n)}return e}return t}function Im(t,e){for(let{name:r,re:n}of Xv){let s=e.match(n);if(s!==null&&!s[0].includes(at))throw new kr(t,r)}}var at,Pv,Sm,km,Fv,Uv,Hv,qv,Xv,kr,lo=T(()=>{"use strict";at="[REDACTED]",Pv="[REDACTED_EMAIL]",Sm="[REDACTED_IP]",km="[USER]",Fv=[{re:/(authorization\s*[:=]\s*)(bearer\s+[^\s,;"']+)/gi,replacement:`$1Bearer ${at}`},{re:/(authorization\s*[:=]\s*)(basic\s+[^\s,;"']+)/gi,replacement:`$1Basic ${at}`},{re:/\b(Bearer\s+)[A-Za-z0-9_\-./+=]{8,}/g,replacement:`$1${at}`},{re:/\bsk-ant-[A-Za-z0-9_\-]{8,}/g,replacement:at},{re:/\bsk-[A-Za-z0-9_\-]{16,}/g,replacement:at},{re:/\bgh[pousr]_[A-Za-z0-9]{30,}/g,replacement:at},{re:/\bAKIA[0-9A-Z]{16}\b/g,replacement:at},{re:/\b(api[_-]?key|token|secret|password|passwd)(\s*[:=]\s*"?)([A-Za-z0-9_\-./+=]{8,})("?)/gi,replacement:`$1$2${at}$4`},{re:/(\/home\/)[^/\s"'`]+/g,replacement:`$1${km}`},{re:/(\/Users\/)[^/\s"'`]+/g,replacement:`$1${km}`},{re:/\b[A-Za-z0-9._%+\-]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,}\b/g,replacement:Pv}],Uv=["127.","10.","192.168.","0.0.0.0"];Hv=/\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/g,qv=/\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;Xv=[{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"'`]+/}],kr=class extends Error{bundlePath;patternName;constructor(e,r){super(`sanitization failed: ${r} pattern matched in ${e}`),this.bundlePath=e,this.patternName=r,this.name="SanitizationError"}}});import{spawnSync as _l}from"node:child_process";import{readFileSync as Gv}from"node:fs";import{readFile as yl,stat as Nm}from"node:fs/promises";import{homedir as Kv}from"node:os";import{join as Vv}from"node:path";import{fileURLToPath as Yv}from"node:url";function wt(){try{let t=new URL("../../package.json",import.meta.url),e=JSON.parse(Gv(Yv(t),"utf8"));if(typeof e.version=="string")return e.version}catch{}return"0.0.0"}async function xm(t){let e=new Set(t.include??co),r={};return e.has("serve")&&(r.serve=await Zv(t)),e.has("db")&&(r.db=Qv(t)),e.has("runs")&&(r.runs=eI(t)),e.has("jobs")&&(r.jobs=tI(t)),e.has("attentions")&&(r.attentions=rI(t)),e.has("env")&&(r.env=await nI(t)),e.has("intents")&&(r.intents=await oI(t)),r}async function Zv(t){let e=t.pidFile??process.env.LMCTL_PID_FILE,r=t.serveLog??process.env.LMCTL_SERVE_LOG,n=t.logTailLines??1e3,s=null,o="none";if(e!==void 0)try{let u=(await yl(e,"utf8")).trim(),d=Number.parseInt(u,10);Number.isInteger(d)&&d>0&&(s=d,o="pidfile")}catch{}let i=null;if(s!==null)try{process.kill(s,0),i=!0}catch{i=!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 d=(await yl(r,"utf8")).split(`
5
+ `)}function vm(t,e){let r=t.toUpperCase();return r.includes("TOKEN")||r.includes("SECRET")||r.includes("KEY")||r.includes("PASSWORD")||r.includes("PASSWD")||r.includes("CREDENTIAL")||r.includes("AUTH")?{key:t,value:at}:{key:t,value:qn(e)}}function tr(t){if(typeof t=="string")return qn(t);if(Array.isArray(t))return t.map(e=>tr(e));if(t!==null&&typeof t=="object"){let e={};for(let[r,n]of Object.entries(t)){let s=r.toUpperCase();s.includes("TOKEN")||s.includes("SECRET")||s.includes("KEY")||s.includes("PASSWORD")||s.includes("PASSWD")||s.includes("CREDENTIAL")?e[r]=typeof n=="string"?at:tr(n):e[r]=tr(n)}return e}return t}function Im(t,e){for(let{name:r,re:n}of Xv){let s=e.match(n);if(s!==null&&!s[0].includes(at))throw new kr(t,r)}}var at,Pv,Sm,km,Fv,Uv,Hv,qv,Xv,kr,co=T(()=>{"use strict";at="[REDACTED]",Pv="[REDACTED_EMAIL]",Sm="[REDACTED_IP]",km="[USER]",Fv=[{re:/(authorization\s*[:=]\s*)(bearer\s+[^\s,;"']+)/gi,replacement:`$1Bearer ${at}`},{re:/(authorization\s*[:=]\s*)(basic\s+[^\s,;"']+)/gi,replacement:`$1Basic ${at}`},{re:/\b(Bearer\s+)[A-Za-z0-9_\-./+=]{8,}/g,replacement:`$1${at}`},{re:/\bsk-ant-[A-Za-z0-9_\-]{8,}/g,replacement:at},{re:/\bsk-[A-Za-z0-9_\-]{16,}/g,replacement:at},{re:/\bgh[pousr]_[A-Za-z0-9]{30,}/g,replacement:at},{re:/\bAKIA[0-9A-Z]{16}\b/g,replacement:at},{re:/\b(api[_-]?key|token|secret|password|passwd)(\s*[:=]\s*"?)([A-Za-z0-9_\-./+=]{8,})("?)/gi,replacement:`$1$2${at}$4`},{re:/(\/home\/)[^/\s"'`]+/g,replacement:`$1${km}`},{re:/(\/Users\/)[^/\s"'`]+/g,replacement:`$1${km}`},{re:/\b[A-Za-z0-9._%+\-]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,}\b/g,replacement:Pv}],Uv=["127.","10.","192.168.","0.0.0.0"];Hv=/\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/g,qv=/\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;Xv=[{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"'`]+/}],kr=class extends Error{bundlePath;patternName;constructor(e,r){super(`sanitization failed: ${r} pattern matched in ${e}`),this.bundlePath=e,this.patternName=r,this.name="SanitizationError"}}});import{spawnSync as _l}from"node:child_process";import{readFileSync as Gv}from"node:fs";import{readFile as yl,stat as Nm}from"node:fs/promises";import{homedir as Kv}from"node:os";import{join as Vv}from"node:path";import{fileURLToPath as Yv}from"node:url";function wt(){try{let t=new URL("../../package.json",import.meta.url),e=JSON.parse(Gv(Yv(t),"utf8"));if(typeof e.version=="string")return e.version}catch{}return"0.0.0"}async function xm(t){let e=new Set(t.include??uo),r={};return e.has("serve")&&(r.serve=await Zv(t)),e.has("db")&&(r.db=Qv(t)),e.has("runs")&&(r.runs=eI(t)),e.has("jobs")&&(r.jobs=tI(t)),e.has("attentions")&&(r.attentions=rI(t)),e.has("env")&&(r.env=await nI(t)),e.has("intents")&&(r.intents=await oI(t)),r}async function Zv(t){let e=t.pidFile??process.env.LMCTL_PID_FILE,r=t.serveLog??process.env.LMCTL_SERVE_LOG,n=t.logTailLines??1e3,s=null,o="none";if(e!==void 0)try{let u=(await yl(e,"utf8")).trim(),d=Number.parseInt(u,10);Number.isInteger(d)&&d>0&&(s=d,o="pidfile")}catch{}let i=null;if(s!==null)try{process.kill(s,0),i=!0}catch{i=!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 d=(await yl(r,"utf8")).split(`
6
6
  `),f=d.slice(Math.max(0,d.length-n));c=f.length,a=Jn(f.join(`
7
7
  `))}catch(u){l=`serve log unreadable: ${u instanceof Error?u.message:String(u)}`}return{pid:s,pid_source:o,pid_alive:i,log_tail_lines:c,log_tail:a,log_note:l}}function Qv(t){let{dal:e}=t,r="unknown";try{r=e.query("PRAGMA integrity_check;").map(i=>i.integrity_check??JSON.stringify(i)).join(`
8
8
  `)}catch(o){r=`integrity_check failed: ${o instanceof Error?o.message:String(o)}`}let n=0;try{n=e.query("PRAGMA user_version;")[0]?.user_version??0}catch{n=0}let s={};try{let o=e.query("SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' ORDER BY name");for(let{name:i}of o)try{let a=e.query(`SELECT COUNT(*) AS c FROM "${i.replace(/"/g,'""')}"`);s[i]=a[0]?.c??0}catch{s[i]=-1}}catch{}return{integrity_check:r,schema_version:n,table_counts:s}}function eI(t){let{dal:e}=t,r=(t.now??new Date).toISOString(),n=(t.staleThresholdMin??60)*6e4,s=new Date(Date.parse(r)-n).toISOString(),o=e.query(`SELECT ${gl} FROM run ORDER BY id DESC LIMIT 50`),i=e.query(`SELECT ${gl} FROM run WHERE paused_at IS NOT NULL AND terminal_state IS NULL ORDER BY paused_at DESC LIMIT 50`),a=e.query(`SELECT ${gl} FROM run
@@ -12,9 +12,9 @@ var Nv=Object.defineProperty;var T=(t,e)=>()=>(t&&(e=t(t=0)),e);var ae=(t,e)=>{f
12
12
  FROM attention WHERE acknowledged_at IS NULL ORDER BY created_at DESC LIMIT 100`);return{unacked:tr(r)}}async function nI(t){let e=wt(),r=process.version,n=_l("uname",["-a"],{encoding:"utf8"}),s=Jn((n.stdout??"").trim()),o=[],i=t.dbPath??process.env.LMCTL_DB;if(i!==void 0)try{await Nm(i);let u=_l("du",["-sh",i],{encoding:"utf8"});u.status===0&&o.push(u.stdout.trim())}catch{}let a=t.sessiondir??process.env.LMCTL_SESSIONDIR;if(a!==void 0)try{await Nm(a);let u=_l("du",["-sh",a],{encoding:"utf8"});u.status===0&&o.push(u.stdout.trim())}catch{}let l=o.length===0?"(no paths configured)":Jn(o.join(`
13
13
  `)),c=[];for(let u of zv){let d=process.env[u];if(d===void 0){c.push({key:u,value:"(unset)"});continue}c.push(vm(u,d))}return{lmctl_next_version:e,node_version:r,os_info:s,disk_usage:l,env_keys_present:c}}function sI(){return process.env.LMCTL_INTENT_LOG??Vv(Kv(),".lmctl","recent-intents.log")}async function oI(t){let e=t.intentLog??sI(),r=t.intentLogTailLines??500;try{let s=(await yl(e,"utf8")).split(`
14
14
  `).filter(i=>i.length>0),o=s.slice(Math.max(0,s.length-r));return{source_path:e,tail_lines:o.length,tail:Jn(o.join(`
15
- `)),note:null}}catch(n){return n.code==="ENOENT"?{source_path:e,tail_lines:0,tail:"",note:"no intent log present (status never run on this host)"}:{source_path:e,tail_lines:0,tail:"",note:`intent log unreadable: ${n instanceof Error?n.message:String(n)}`}}}var co,zv,gl,Xn=T(()=>{"use strict";lo();co=["serve","db","runs","jobs","attentions","env","intents"];zv=["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"];gl=["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 $m,appendFileSync as iI,mkdirSync as aI,existsSync as Nq,readdirSync as xq,unlinkSync as Aq}from"node:fs";import{join as fo,dirname as lI}from"node:path";import{homedir as cI}from"node:os";function wl(){return fo(cI(),".lmctl")}function jm(){Jr=!0,process.env.LMCTL_DEBUG="1"}function Lm(){return{cliDebug:Jr,lmctlDebugEnv:process.env.LMCTL_DEBUG}}function Om(t){Jr=t.cliDebug,t.lmctlDebugEnv===void 0?delete process.env.LMCTL_DEBUG:process.env.LMCTL_DEBUG=t.lmctlDebugEnv}function fe(){if(Jr||process.env.LMCTL_DEBUG==="1")return!0;let t=Date.now();return t-Rm>=uI&&(Am=mI(),Rm=t),Am}function Cm(){return Jr||process.env.LMCTL_DEBUG==="1"}function dI(){let t=new Date,e=t.getTimezoneOffset(),r=e<=0?"+":"-",n=String(Math.floor(Math.abs(e)/60)).padStart(2,"0"),s=String(Math.abs(e)%60).padStart(2,"0");return new Date(t.getTime()-e*6e4).toISOString().replace("Z",`${r}${n}:${s}`)}function Xe(t,e){if(e?.verbose){if(!Jr)return}else if(!e?.always&&!fe())return;try{fI();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,...t};iI(uo,JSON.stringify(r)+`
16
- `)}catch{}}function fI(){if(!uo){let e=dI().slice(0,13).replace("T","-");uo=fo(wl(),`debug-${e}.log`)}aI(lI(uo),{recursive:!0})}function Oe(...t){Xe({event:"legacy",msg:t.join(" ")})}function Et(...t){Xe({event:"legacy",msg:t.join(" ")},{verbose:!0})}function Y(t){Xe(t,{always:!0})}function mI(){return pI()||hI()}function pI(){try{let t=$m(fo(wl(),"config.toml"),"utf-8");for(let e of t.split(`
17
- `)){let r=e.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 hI(){try{let t=$m(fo(wl(),"config.json"),"utf-8"),e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)&&e.debug===!0}catch{}return!1}var Jr,Am,Rm,uI,uo,Ie=T(()=>{"use strict";Jr=!1,Am=!1,Rm=0,uI=5e3;uo=null});function Gn(t){try{return new URL(t).protocol==="https:"}catch{return!1}}function El(t){return/^[A-Za-z]:[\\/]/.test(t)?!1:/^[A-Za-z][A-Za-z0-9+.-]*:/.test(t)}function Kn(t,e){return!El(t)||Gn(t)?null:`${e} must use https://: ${t}`}async function mo(t,e){let r=Kn(t,e.description);if(r!==null||!Gn(t))throw new Error(r??`${e.description} must use https://: ${t}`);let n=e.timeoutMs??15e3,s=new AbortController,o=setTimeout(()=>s.abort(),n);try{let i;try{i=await fetch(t,{signal:s.signal,redirect:"manual"})}catch(a){throw Mm(t,e.description,n,a)}if(i.type==="opaqueredirect"||i.status>=300&&i.status<400)throw new Error(`refusing to follow redirect from ${e.description} ${t} (https-only: the URL must serve the content directly, not redirect)`);if(!i.ok)throw new Error(`failed to fetch ${e.description} ${t}: HTTP ${i.status}${i.statusText?` ${i.statusText}`:""}`);try{return Buffer.from(await i.arrayBuffer())}catch(a){throw Mm(t,e.description,n,a)}}finally{clearTimeout(o)}}function Mm(t,e,r,n){let o=n instanceof Error&&n.name==="AbortError"?`timed out after ${r}ms`:n instanceof Error?n.message:String(n);return new Error(`failed to fetch ${e} ${t}: ${o}`)}var Tl=T(()=>{"use strict"});import{existsSync as jI}from"node:fs";import{createRequire as LI}from"node:module";function OI(){return Sl===null&&(Sl=LI(import.meta.url)("node:sqlite").DatabaseSync),Sl}function kl(t){return t.length===1&&CI(t[0])?[t[0]]:t}function CI(t){if(!Nl(t))return!1;let e=Object.getPrototypeOf(t);return e===Object.prototype||e===null}function Nl(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Sl,vl,po,Il,xl=T(()=>{"use strict";Sl=null;vl=class{name;handle;transactionDepth=0;savepointId=0;constructor(e,r={}){if(r.fileMustExist===!0&&e!==":memory:"&&!jI(e))throw new Error("unable to open database file");this.name=e,this.handle=new(OI())(e,{readOnly:r.readonly===!0}),this.exec("PRAGMA busy_timeout = 5000")}prepare(e){return new Il(this.handle.prepare(e))}exec(e){this.handle.exec(e),this.updateTransactionDepth(e)}pragma(e,r){let n=`PRAGMA ${e}`;if(e.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(e){return(...r)=>{if(this.transactionDepth===0){this.exec("BEGIN");try{let s=e(...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=e(...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(e){let r=e.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(e.trim())&&(this.transactionDepth=0)}}},po=vl,Il=class{handle;rawMode=!1;constructor(e){this.handle=e,this.handle.setAllowBareNamedParameters(!0)}get(...e){let r=this.handle.get(...kl(e));return this.normalizeRow(r)}all(...e){return this.handle.all(...kl(e)).map(r=>this.normalizeRow(r))}run(...e){let r=this.handle.run(...kl(e));return{changes:Number(r.changes),lastInsertRowid:Number(r.lastInsertRowid)}}raw(){return this.rawMode=!0,this}normalizeRow(e){return e==null?e:this.rawMode&&Nl(e)?Object.values(e):Nl(e)?{...e}:e}}});import{existsSync as MI,mkdirSync as DI,readFileSync as Fm}from"node:fs";import{homedir as PI}from"node:os";import{dirname as Um,join as FI,resolve as Wm}from"node:path";import{fileURLToPath as UI,pathToFileURL as WI}from"node:url";function Rl(t){t.dbPath!==":memory:"&&DI(Um(t.dbPath),{recursive:!0});let e=new po(t.dbPath);e.pragma("journal_mode = WAL"),e.pragma("synchronous = NORMAL"),e.pragma("foreign_keys = ON");let r=qm(e);return r===0&&(e.exec(Fm(Hm,"utf8")),e.pragma(`user_version = ${Al}`)),HI(e,r),e}function HI(t,e){let r=e;if(r<2&&r!==0&&(t.exec(`
15
+ `)),note:null}}catch(n){return n.code==="ENOENT"?{source_path:e,tail_lines:0,tail:"",note:"no intent log present (status never run on this host)"}:{source_path:e,tail_lines:0,tail:"",note:`intent log unreadable: ${n instanceof Error?n.message:String(n)}`}}}var uo,zv,gl,Xn=T(()=>{"use strict";co();uo=["serve","db","runs","jobs","attentions","env","intents"];zv=["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"];gl=["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 $m,appendFileSync as iI,mkdirSync as aI,existsSync as Aq,readdirSync as Rq,unlinkSync as $q}from"node:fs";import{join as mo,dirname as lI}from"node:path";import{homedir as cI}from"node:os";function wl(){return mo(cI(),".lmctl")}function Lm(){Jr=!0,process.env.LMCTL_DEBUG="1"}function jm(){return{cliDebug:Jr,lmctlDebugEnv:process.env.LMCTL_DEBUG}}function Om(t){Jr=t.cliDebug,t.lmctlDebugEnv===void 0?delete process.env.LMCTL_DEBUG:process.env.LMCTL_DEBUG=t.lmctlDebugEnv}function fe(){if(Jr||process.env.LMCTL_DEBUG==="1")return!0;let t=Date.now();return t-Rm>=uI&&(Am=mI(),Rm=t),Am}function Cm(){return Jr||process.env.LMCTL_DEBUG==="1"}function dI(){let t=new Date,e=t.getTimezoneOffset(),r=e<=0?"+":"-",n=String(Math.floor(Math.abs(e)/60)).padStart(2,"0"),s=String(Math.abs(e)%60).padStart(2,"0");return new Date(t.getTime()-e*6e4).toISOString().replace("Z",`${r}${n}:${s}`)}function Xe(t,e){if(e?.verbose){if(!Jr)return}else if(!e?.always&&!fe())return;try{fI();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,...t};iI(fo,JSON.stringify(r)+`
16
+ `)}catch{}}function fI(){if(!fo){let e=dI().slice(0,13).replace("T","-");fo=mo(wl(),`debug-${e}.log`)}aI(lI(fo),{recursive:!0})}function Oe(...t){Xe({event:"legacy",msg:t.join(" ")})}function Et(...t){Xe({event:"legacy",msg:t.join(" ")},{verbose:!0})}function Y(t){Xe(t,{always:!0})}function mI(){return pI()||hI()}function pI(){try{let t=$m(mo(wl(),"config.toml"),"utf-8");for(let e of t.split(`
17
+ `)){let r=e.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 hI(){try{let t=$m(mo(wl(),"config.json"),"utf-8"),e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)&&e.debug===!0}catch{}return!1}var Jr,Am,Rm,uI,fo,Ie=T(()=>{"use strict";Jr=!1,Am=!1,Rm=0,uI=5e3;fo=null});function Gn(t){try{return new URL(t).protocol==="https:"}catch{return!1}}function El(t){return/^[A-Za-z]:[\\/]/.test(t)?!1:/^[A-Za-z][A-Za-z0-9+.-]*:/.test(t)}function Kn(t,e){return!El(t)||Gn(t)?null:`${e} must use https://: ${t}`}async function po(t,e){let r=Kn(t,e.description);if(r!==null||!Gn(t))throw new Error(r??`${e.description} must use https://: ${t}`);let n=e.timeoutMs??15e3,s=new AbortController,o=setTimeout(()=>s.abort(),n);try{let i;try{i=await fetch(t,{signal:s.signal,redirect:"manual"})}catch(a){throw Mm(t,e.description,n,a)}if(i.type==="opaqueredirect"||i.status>=300&&i.status<400)throw new Error(`refusing to follow redirect from ${e.description} ${t} (https-only: the URL must serve the content directly, not redirect)`);if(!i.ok)throw new Error(`failed to fetch ${e.description} ${t}: HTTP ${i.status}${i.statusText?` ${i.statusText}`:""}`);try{return Buffer.from(await i.arrayBuffer())}catch(a){throw Mm(t,e.description,n,a)}}finally{clearTimeout(o)}}function Mm(t,e,r,n){let o=n instanceof Error&&n.name==="AbortError"?`timed out after ${r}ms`:n instanceof Error?n.message:String(n);return new Error(`failed to fetch ${e} ${t}: ${o}`)}var Tl=T(()=>{"use strict"});import{existsSync as LI}from"node:fs";import{createRequire as jI}from"node:module";function OI(){return Sl===null&&(Sl=jI(import.meta.url)("node:sqlite").DatabaseSync),Sl}function kl(t){return t.length===1&&CI(t[0])?[t[0]]:t}function CI(t){if(!Nl(t))return!1;let e=Object.getPrototypeOf(t);return e===Object.prototype||e===null}function Nl(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Sl,vl,ho,Il,xl=T(()=>{"use strict";Sl=null;vl=class{name;handle;transactionDepth=0;savepointId=0;constructor(e,r={}){if(r.fileMustExist===!0&&e!==":memory:"&&!LI(e))throw new Error("unable to open database file");this.name=e,this.handle=new(OI())(e,{readOnly:r.readonly===!0}),this.exec("PRAGMA busy_timeout = 5000")}prepare(e){return new Il(this.handle.prepare(e))}exec(e){this.handle.exec(e),this.updateTransactionDepth(e)}pragma(e,r){let n=`PRAGMA ${e}`;if(e.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(e){return(...r)=>{if(this.transactionDepth===0){this.exec("BEGIN");try{let s=e(...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=e(...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(e){let r=e.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(e.trim())&&(this.transactionDepth=0)}}},ho=vl,Il=class{handle;rawMode=!1;constructor(e){this.handle=e,this.handle.setAllowBareNamedParameters(!0)}get(...e){let r=this.handle.get(...kl(e));return this.normalizeRow(r)}all(...e){return this.handle.all(...kl(e)).map(r=>this.normalizeRow(r))}run(...e){let r=this.handle.run(...kl(e));return{changes:Number(r.changes),lastInsertRowid:Number(r.lastInsertRowid)}}raw(){return this.rawMode=!0,this}normalizeRow(e){return e==null?e:this.rawMode&&Nl(e)?Object.values(e):Nl(e)?{...e}:e}}});import{existsSync as MI,mkdirSync as DI,readFileSync as Fm}from"node:fs";import{homedir as PI}from"node:os";import{dirname as Um,join as FI,resolve as Wm}from"node:path";import{fileURLToPath as UI,pathToFileURL as WI}from"node:url";function Rl(t){t.dbPath!==":memory:"&&DI(Um(t.dbPath),{recursive:!0});let e=new ho(t.dbPath);e.pragma("journal_mode = WAL"),e.pragma("synchronous = NORMAL"),e.pragma("foreign_keys = ON");let r=qm(e);return r===0&&(e.exec(Fm(Hm,"utf8")),e.pragma(`user_version = ${Al}`)),HI(e,r),e}function HI(t,e){let r=e;if(r<2&&r!==0&&(t.exec(`
18
18
  CREATE TABLE IF NOT EXISTS session_size (
19
19
  id INTEGER PRIMARY KEY AUTOINCREMENT,
20
20
  team_name TEXT NOT NULL,
@@ -91,7 +91,7 @@ var Nv=Object.defineProperty;var T=(t,e)=>()=>(t&&(e=t(t=0)),e);var ae=(t,e)=>{f
91
91
  );
92
92
  CREATE INDEX IF NOT EXISTS idx_pr_followup_event_pr ON pr_followup_event(submitted_pr_id);
93
93
  CREATE INDEX IF NOT EXISTS idx_pr_followup_event_kind ON pr_followup_event(event_kind);
94
- `),t.pragma("user_version = 7"),r=7),r<8&&r!==0&&(t.prepare("PRAGMA table_info(step_artifact)").all().some(s=>s.name==="provider_call_mode")||t.exec("ALTER TABLE step_artifact ADD COLUMN provider_call_mode TEXT"),t.pragma("user_version = 8"),r=8),r<9&&r!==0){let n=le(t,"team_member");n.has("state")||t.exec("ALTER TABLE team_member ADD COLUMN state TEXT NOT NULL DEFAULT 'idle' CHECK(state IN ('idle','in_chat','attention_needed','retired'))"),n.has("state_reason")||t.exec("ALTER TABLE team_member ADD COLUMN state_reason TEXT"),n.has("state_updated_at")||t.exec("ALTER TABLE team_member ADD COLUMN state_updated_at TEXT"),n.has("role_prompt")||t.exec("ALTER TABLE team_member ADD COLUMN role_prompt TEXT"),n.has("prompt_snapshot")||t.exec("ALTER TABLE team_member ADD COLUMN prompt_snapshot TEXT"),le(t,"team").has("lead_seed_prompt")||t.exec("ALTER TABLE team ADD COLUMN lead_seed_prompt TEXT"),le(t,"run").has("parent_run_id")||t.exec("ALTER TABLE run ADD COLUMN parent_run_id INTEGER REFERENCES run(id)"),le(t,"project").has("memory_mode")||t.exec("ALTER TABLE project ADD COLUMN memory_mode TEXT NOT NULL DEFAULT 'folder' CHECK(memory_mode IN ('folder','db'))"),t.pragma("user_version = 9"),r=9}if(r<10&&r!==0&&(t.exec(`
94
+ `),t.pragma("user_version = 7"),r=7),r<8&&r!==0&&(t.prepare("PRAGMA table_info(step_artifact)").all().some(s=>s.name==="provider_call_mode")||t.exec("ALTER TABLE step_artifact ADD COLUMN provider_call_mode TEXT"),t.pragma("user_version = 8"),r=8),r<9&&r!==0){let n=ie(t,"team_member");n.has("state")||t.exec("ALTER TABLE team_member ADD COLUMN state TEXT NOT NULL DEFAULT 'idle' CHECK(state IN ('idle','in_chat','attention_needed','retired'))"),n.has("state_reason")||t.exec("ALTER TABLE team_member ADD COLUMN state_reason TEXT"),n.has("state_updated_at")||t.exec("ALTER TABLE team_member ADD COLUMN state_updated_at TEXT"),n.has("role_prompt")||t.exec("ALTER TABLE team_member ADD COLUMN role_prompt TEXT"),n.has("prompt_snapshot")||t.exec("ALTER TABLE team_member ADD COLUMN prompt_snapshot TEXT"),ie(t,"team").has("lead_seed_prompt")||t.exec("ALTER TABLE team ADD COLUMN lead_seed_prompt TEXT"),ie(t,"run").has("parent_run_id")||t.exec("ALTER TABLE run ADD COLUMN parent_run_id INTEGER REFERENCES run(id)"),ie(t,"project").has("memory_mode")||t.exec("ALTER TABLE project ADD COLUMN memory_mode TEXT NOT NULL DEFAULT 'folder' CHECK(memory_mode IN ('folder','db'))"),t.pragma("user_version = 9"),r=9}if(r<10&&r!==0&&(t.exec(`
95
95
  CREATE TABLE IF NOT EXISTS memory (
96
96
  id INTEGER PRIMARY KEY AUTOINCREMENT,
97
97
  project_id INTEGER NOT NULL REFERENCES project(id),
@@ -180,7 +180,7 @@ var Nv=Object.defineProperty;var T=(t,e)=>()=>(t&&(e=t(t=0)),e);var ae=(t,e)=>{f
180
180
  UNIQUE(workflow_id, version)
181
181
  );
182
182
  CREATE INDEX IF NOT EXISTS idx_workflow_version_wf ON workflow_version(workflow_id, version DESC);
183
- `),le(t,"workflow").has("active_version_id")||t.exec("ALTER TABLE workflow ADD COLUMN active_version_id INTEGER REFERENCES workflow_version(id)"),le(t,"run").has("workflow_version_id")||t.exec("ALTER TABLE run ADD COLUMN workflow_version_id INTEGER REFERENCES workflow_version(id)"),t.pragma("user_version = 15"),r=15),r<16&&r!==0&&(t.exec(`
183
+ `),ie(t,"workflow").has("active_version_id")||t.exec("ALTER TABLE workflow ADD COLUMN active_version_id INTEGER REFERENCES workflow_version(id)"),ie(t,"run").has("workflow_version_id")||t.exec("ALTER TABLE run ADD COLUMN workflow_version_id INTEGER REFERENCES workflow_version(id)"),t.pragma("user_version = 15"),r=15),r<16&&r!==0&&(t.exec(`
184
184
  CREATE TABLE IF NOT EXISTS trigger_instance (
185
185
  id INTEGER PRIMARY KEY AUTOINCREMENT,
186
186
  workflow_id INTEGER NOT NULL REFERENCES workflow(id),
@@ -197,7 +197,7 @@ var Nv=Object.defineProperty;var T=(t,e)=>()=>(t&&(e=t(t=0)),e);var ae=(t,e)=>{f
197
197
  );
198
198
  CREATE INDEX IF NOT EXISTS idx_trigger_instance_wf ON trigger_instance(workflow_id);
199
199
  CREATE INDEX IF NOT EXISTS idx_trigger_instance_enabled ON trigger_instance(enabled) WHERE enabled = 1;
200
- `),le(t,"step").has("parent_step_id")||t.exec("ALTER TABLE step ADD COLUMN parent_step_id INTEGER REFERENCES step(id)"),t.exec("CREATE INDEX IF NOT EXISTS idx_step_parent ON step(parent_step_id)"),t.pragma("user_version = 16"),r=16),r<17&&r!==0&&(t.exec(`
200
+ `),ie(t,"step").has("parent_step_id")||t.exec("ALTER TABLE step ADD COLUMN parent_step_id INTEGER REFERENCES step(id)"),t.exec("CREATE INDEX IF NOT EXISTS idx_step_parent ON step(parent_step_id)"),t.pragma("user_version = 16"),r=16),r<17&&r!==0&&(t.exec(`
201
201
  CREATE TABLE IF NOT EXISTS project_workflow (
202
202
  id INTEGER PRIMARY KEY AUTOINCREMENT,
203
203
  project_id INTEGER NOT NULL REFERENCES project(id),
@@ -210,7 +210,7 @@ var Nv=Object.defineProperty;var T=(t,e)=>()=>(t&&(e=t(t=0)),e);var ae=(t,e)=>{f
210
210
  UNIQUE(project_id, workflow_id, condition)
211
211
  );
212
212
  CREATE INDEX IF NOT EXISTS idx_project_workflow_project ON project_workflow(project_id, enabled);
213
- `),le(t,"job").has("workflow_id_override")||t.exec("ALTER TABLE job ADD COLUMN workflow_id_override INTEGER REFERENCES workflow(id)"),t.pragma("user_version = 17"),r=17),r<18&&r!==0&&(t.exec(`
213
+ `),ie(t,"job").has("workflow_id_override")||t.exec("ALTER TABLE job ADD COLUMN workflow_id_override INTEGER REFERENCES workflow(id)"),t.pragma("user_version = 17"),r=17),r<18&&r!==0&&(t.exec(`
214
214
  CREATE TABLE IF NOT EXISTS project_issue (
215
215
  id INTEGER PRIMARY KEY AUTOINCREMENT,
216
216
  project_id INTEGER NOT NULL REFERENCES project(id),
@@ -272,7 +272,7 @@ var Nv=Object.defineProperty;var T=(t,e)=>()=>(t&&(e=t(t=0)),e);var ae=(t,e)=>{f
272
272
  value TEXT NOT NULL,
273
273
  updated_at TEXT NOT NULL
274
274
  );
275
- `),t.pragma("user_version = 20"),r=20),r<21&&r!==0){let n=le(t,"project");n.has("active_run_id")||t.exec("ALTER TABLE project ADD COLUMN active_run_id INTEGER REFERENCES run(id)"),n.has("active_locked_at")||t.exec("ALTER TABLE project ADD COLUMN active_locked_at TEXT"),n.has("active_locked_by")||t.exec("ALTER TABLE project ADD COLUMN active_locked_by TEXT"),t.pragma("user_version = 21"),r=21}if(r<22&&r!==0&&(le(t,"project").has("active_locked_expires_at")||t.exec("ALTER TABLE project ADD COLUMN active_locked_expires_at TEXT"),t.exec("CREATE INDEX IF NOT EXISTS idx_project_active_lock_expires ON project(active_locked_expires_at) WHERE active_locked_expires_at IS NOT NULL"),t.pragma("user_version = 22"),r=22),r<23&&r!==0){t.exec("DROP INDEX IF EXISTS idx_project_active_lock_expires");let n=le(t,"project");n.has("active_locked_expires_at")&&t.exec("ALTER TABLE project DROP COLUMN active_locked_expires_at"),n.has("active_locked_by")&&t.exec("ALTER TABLE project DROP COLUMN active_locked_by"),n.has("active_locked_at")&&t.exec("ALTER TABLE project DROP COLUMN active_locked_at"),n.has("active_run_id")&&t.exec("ALTER TABLE project DROP COLUMN active_run_id"),t.pragma("user_version = 23"),r=23}if(r<24&&r!==0){let n=le(t,"team_member");n.size>0&&!n.has("provider_resolved")&&t.exec("ALTER TABLE team_member ADD COLUMN provider_resolved TEXT"),t.pragma("user_version = 24"),r=24}if(r<25&&r!==0&&(t.exec(`
275
+ `),t.pragma("user_version = 20"),r=20),r<21&&r!==0){let n=ie(t,"project");n.has("active_run_id")||t.exec("ALTER TABLE project ADD COLUMN active_run_id INTEGER REFERENCES run(id)"),n.has("active_locked_at")||t.exec("ALTER TABLE project ADD COLUMN active_locked_at TEXT"),n.has("active_locked_by")||t.exec("ALTER TABLE project ADD COLUMN active_locked_by TEXT"),t.pragma("user_version = 21"),r=21}if(r<22&&r!==0&&(ie(t,"project").has("active_locked_expires_at")||t.exec("ALTER TABLE project ADD COLUMN active_locked_expires_at TEXT"),t.exec("CREATE INDEX IF NOT EXISTS idx_project_active_lock_expires ON project(active_locked_expires_at) WHERE active_locked_expires_at IS NOT NULL"),t.pragma("user_version = 22"),r=22),r<23&&r!==0){t.exec("DROP INDEX IF EXISTS idx_project_active_lock_expires");let n=ie(t,"project");n.has("active_locked_expires_at")&&t.exec("ALTER TABLE project DROP COLUMN active_locked_expires_at"),n.has("active_locked_by")&&t.exec("ALTER TABLE project DROP COLUMN active_locked_by"),n.has("active_locked_at")&&t.exec("ALTER TABLE project DROP COLUMN active_locked_at"),n.has("active_run_id")&&t.exec("ALTER TABLE project DROP COLUMN active_run_id"),t.pragma("user_version = 23"),r=23}if(r<24&&r!==0){let n=ie(t,"team_member");n.size>0&&!n.has("provider_resolved")&&t.exec("ALTER TABLE team_member ADD COLUMN provider_resolved TEXT"),t.pragma("user_version = 24"),r=24}if(r<25&&r!==0&&(t.exec(`
276
276
  CREATE TABLE IF NOT EXISTS composition_unit (
277
277
  id INTEGER PRIMARY KEY AUTOINCREMENT,
278
278
  name TEXT NOT NULL,
@@ -285,7 +285,7 @@ var Nv=Object.defineProperty;var T=(t,e)=>()=>(t&&(e=t(t=0)),e);var ae=(t,e)=>{f
285
285
  UNIQUE(name, version)
286
286
  );
287
287
  CREATE INDEX IF NOT EXISTS idx_composition_unit_name ON composition_unit(name, version DESC);
288
- `),t.pragma("user_version = 25"),r=25),r<26&&r!==0){let n=le(t,"workflow");n.size>0&&!n.has("source_uri")&&t.exec("ALTER TABLE workflow ADD COLUMN source_uri TEXT"),n.size>0&&!n.has("source_sha256")&&t.exec("ALTER TABLE workflow ADD COLUMN source_sha256 TEXT"),t.pragma("user_version = 26"),r=26}if(r<27&&r!==0){let n=le(t,"run");n.size>0&&!n.has("pending_escalation_decision")&&t.exec("ALTER TABLE run ADD COLUMN pending_escalation_decision TEXT"),t.pragma("user_version = 27"),r=27}if(r<28&&r!==0&&(t.exec(`
288
+ `),t.pragma("user_version = 25"),r=25),r<26&&r!==0){let n=ie(t,"workflow");n.size>0&&!n.has("source_uri")&&t.exec("ALTER TABLE workflow ADD COLUMN source_uri TEXT"),n.size>0&&!n.has("source_sha256")&&t.exec("ALTER TABLE workflow ADD COLUMN source_sha256 TEXT"),t.pragma("user_version = 26"),r=26}if(r<27&&r!==0){let n=ie(t,"run");n.size>0&&!n.has("pending_escalation_decision")&&t.exec("ALTER TABLE run ADD COLUMN pending_escalation_decision TEXT"),t.pragma("user_version = 27"),r=27}if(r<28&&r!==0&&(t.exec(`
289
289
  CREATE TABLE IF NOT EXISTS prompt_dispatch (
290
290
  prompt_id TEXT PRIMARY KEY,
291
291
  project_id INTEGER NOT NULL REFERENCES project(id),
@@ -364,7 +364,7 @@ var Nv=Object.defineProperty;var T=(t,e)=>()=>(t&&(e=t(t=0)),e);var ae=(t,e)=>{f
364
364
  started_at TEXT NOT NULL,
365
365
  PRIMARY KEY(receiver_teamfile, receiver_alias)
366
366
  );
367
- `),t.pragma("user_version = 32"),r=32),r<33&&r!==0&&(le(t,"mailbox_cursor").has("mailbox_key")?t.exec(`
367
+ `),t.pragma("user_version = 32"),r=32),r<33&&r!==0&&(ie(t,"mailbox_cursor").has("mailbox_key")?t.exec(`
368
368
  CREATE TABLE IF NOT EXISTS mailbox_cursor_v33 (
369
369
  user_id TEXT NOT NULL,
370
370
  mailbox_key TEXT NOT NULL,
@@ -417,7 +417,7 @@ var Nv=Object.defineProperty;var T=(t,e)=>()=>(t&&(e=t(t=0)),e);var ae=(t,e)=>{f
417
417
  last_pushed_id INTEGER NOT NULL,
418
418
  updated_at TEXT NOT NULL
419
419
  );
420
- `),t.pragma("user_version = 34"),r=34),r<35&&r!==0&&(le(t,"mailbox_cursor").has("last_processed_seq")||t.exec("ALTER TABLE mailbox_cursor ADD COLUMN last_processed_seq INTEGER;"),t.pragma("user_version = 35"),r=35),r<36&&r!==0&&(t.exec(`
420
+ `),t.pragma("user_version = 34"),r=34),r<35&&r!==0&&(ie(t,"mailbox_cursor").has("last_processed_seq")||t.exec("ALTER TABLE mailbox_cursor ADD COLUMN last_processed_seq INTEGER;"),t.pragma("user_version = 35"),r=35),r<36&&r!==0&&(t.exec(`
421
421
  CREATE TABLE IF NOT EXISTS usage_meter (
422
422
  user_id TEXT NOT NULL,
423
423
  device_id TEXT NOT NULL,
@@ -428,7 +428,7 @@ var Nv=Object.defineProperty;var T=(t,e)=>()=>(t&&(e=t(t=0)),e);var ae=(t,e)=>{f
428
428
  updated_at TEXT NOT NULL,
429
429
  PRIMARY KEY(user_id, device_id, period)
430
430
  );
431
- `),t.pragma("user_version = 36"),r=36),r<37&&r!==0&&(Vn(t,"team_connection")&&t.exec(`
431
+ `),t.pragma("user_version = 36"),r=36),r<37&&r!==0&&(Yn(t,"team_connection")&&t.exec(`
432
432
  CREATE TABLE IF NOT EXISTS team_connection_v37 (
433
433
  id INTEGER PRIMARY KEY AUTOINCREMENT,
434
434
  source_teamfile TEXT NOT NULL,
@@ -454,7 +454,7 @@ var Nv=Object.defineProperty;var T=(t,e)=>()=>(t&&(e=t(t=0)),e);var ae=(t,e)=>{f
454
454
  ORDER BY id ASC;
455
455
  DROP TABLE team_connection;
456
456
  ALTER TABLE team_connection_v37 RENAME TO team_connection;
457
- `),t.pragma("user_version = 37"),r=37),r<38&&r!==0&&(le(t,"agent_inflight").has("active_count")||t.exec("ALTER TABLE agent_inflight ADD COLUMN active_count INTEGER NOT NULL DEFAULT 1;"),t.exec("DROP TABLE IF EXISTS team_connection;"),t.pragma("user_version = 38"),r=38),r<39&&r!==0&&(le(t,"agent_inflight").has("holder_pid")||t.exec("ALTER TABLE agent_inflight ADD COLUMN holder_pid INTEGER;"),t.pragma("user_version = 39"),r=39),r<40&&r!==0&&(t.exec(`
457
+ `),t.pragma("user_version = 37"),r=37),r<38&&r!==0&&(ie(t,"agent_inflight").has("active_count")||t.exec("ALTER TABLE agent_inflight ADD COLUMN active_count INTEGER NOT NULL DEFAULT 1;"),t.exec("DROP TABLE IF EXISTS team_connection;"),t.pragma("user_version = 38"),r=38),r<39&&r!==0&&(ie(t,"agent_inflight").has("holder_pid")||t.exec("ALTER TABLE agent_inflight ADD COLUMN holder_pid INTEGER;"),t.pragma("user_version = 39"),r=39),r<40&&r!==0&&(t.exec(`
458
458
  CREATE TABLE IF NOT EXISTS delegation_job (
459
459
  id INTEGER PRIMARY KEY AUTOINCREMENT,
460
460
  teamfile TEXT NOT NULL,
@@ -490,7 +490,7 @@ var Nv=Object.defineProperty;var T=(t,e)=>()=>(t&&(e=t(t=0)),e);var ae=(t,e)=>{f
490
490
  );
491
491
  CREATE INDEX IF NOT EXISTS idx_delegation_event_job_id
492
492
  ON delegation_event(delegation_job_id, id);
493
- `),t.pragma("user_version = 40"),r=40),r<41&&r!==0){let n=le(t,"delegation_job");n.has("permission_mode")||t.exec("ALTER TABLE delegation_job ADD COLUMN permission_mode TEXT;"),n.has("idle_timeout_ms")||t.exec("ALTER TABLE delegation_job ADD COLUMN idle_timeout_ms INTEGER;"),t.pragma("user_version = 41"),r=41}if(r<42&&r!==0&&(le(t,"delegation_job").has("delivered_at")||t.exec("ALTER TABLE delegation_job ADD COLUMN delivered_at TEXT;"),t.pragma("user_version = 42"),r=42),r<43&&r!==0&&(le(t,"delegation_job").has("meta")||t.exec("ALTER TABLE delegation_job ADD COLUMN meta TEXT;"),t.exec(`
493
+ `),t.pragma("user_version = 40"),r=40),r<41&&r!==0){let n=ie(t,"delegation_job");n.has("permission_mode")||t.exec("ALTER TABLE delegation_job ADD COLUMN permission_mode TEXT;"),n.has("idle_timeout_ms")||t.exec("ALTER TABLE delegation_job ADD COLUMN idle_timeout_ms INTEGER;"),t.pragma("user_version = 41"),r=41}if(r<42&&r!==0&&(ie(t,"delegation_job").has("delivered_at")||t.exec("ALTER TABLE delegation_job ADD COLUMN delivered_at TEXT;"),t.pragma("user_version = 42"),r=42),r<43&&r!==0&&(ie(t,"delegation_job").has("meta")||t.exec("ALTER TABLE delegation_job ADD COLUMN meta TEXT;"),t.exec(`
494
494
  CREATE TABLE IF NOT EXISTS runtime_state (
495
495
  scope TEXT NOT NULL,
496
496
  key TEXT NOT NULL,
@@ -553,7 +553,7 @@ var Nv=Object.defineProperty;var T=(t,e)=>()=>(t&&(e=t(t=0)),e);var ae=(t,e)=>{f
553
553
  ON agent_mailbox(sender_teamfile, sender_alias, created_at);
554
554
  CREATE INDEX IF NOT EXISTS idx_agent_mailbox_created
555
555
  ON agent_mailbox(created_at);
556
- `),t.pragma("user_version = 45"),r=45),r<46&&r!==0&&(Vn(t,"team_chat_log")?Pm(t):t.exec(`
556
+ `),t.pragma("user_version = 45"),r=45),r<46&&r!==0&&(Yn(t,"team_chat_log")?Pm(t):t.exec(`
557
557
  CREATE TABLE IF NOT EXISTS team_chat_log (
558
558
  id INTEGER PRIMARY KEY AUTOINCREMENT,
559
559
  root_teamfile TEXT NOT NULL,
@@ -572,18 +572,18 @@ var Nv=Object.defineProperty;var T=(t,e)=>()=>(t&&(e=t(t=0)),e);var ae=(t,e)=>{f
572
572
  `),t.exec(`
573
573
  CREATE INDEX IF NOT EXISTS idx_team_chat_log_root_time
574
574
  ON team_chat_log(root_teamfile, created_at);
575
- `),t.pragma("user_version = 46"),r=46),r>=46&&Vn(t,"team_chat_log")&&!le(t,"team_chat_log").has("origin")&&Pm(t),r<47&&r!==0){ho(t,"agent_mailbox"),ho(t,"tracked_invocation");let n=le(t,"agent_mailbox");n.has("delivered_at")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN delivered_at TEXT;"),n.has("receipt")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN receipt TEXT;");let s=le(t,"tracked_invocation");s.has("notified_by")||t.exec("ALTER TABLE tracked_invocation ADD COLUMN notified_by TEXT;"),s.has("notified_at")||t.exec("ALTER TABLE tracked_invocation ADD COLUMN notified_at TEXT;"),t.pragma("user_version = 47"),r=47}if(r<48&&r!==0){ho(t,"agent_mailbox");let n=le(t,"agent_mailbox");n.has("delivering_at")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN delivering_at TEXT;"),n.has("delivery_holder_pid")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN delivery_holder_pid INTEGER;"),n.has("delivery_holder_host")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN delivery_holder_host TEXT;"),n.has("waited_at")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN waited_at TEXT;"),n.has("waited_by")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN waited_by TEXT;"),t.exec(`
575
+ `),t.pragma("user_version = 46"),r=46),r>=46&&Yn(t,"team_chat_log")&&!ie(t,"team_chat_log").has("origin")&&Pm(t),r<47&&r!==0){Vn(t,"agent_mailbox"),Vn(t,"tracked_invocation");let n=ie(t,"agent_mailbox");n.has("delivered_at")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN delivered_at TEXT;"),n.has("receipt")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN receipt TEXT;");let s=ie(t,"tracked_invocation");s.has("notified_by")||t.exec("ALTER TABLE tracked_invocation ADD COLUMN notified_by TEXT;"),s.has("notified_at")||t.exec("ALTER TABLE tracked_invocation ADD COLUMN notified_at TEXT;"),t.pragma("user_version = 47"),r=47}if(r<48&&r!==0){Vn(t,"agent_mailbox");let n=ie(t,"agent_mailbox");n.has("delivering_at")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN delivering_at TEXT;"),n.has("delivery_holder_pid")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN delivery_holder_pid INTEGER;"),n.has("delivery_holder_host")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN delivery_holder_host TEXT;"),n.has("waited_at")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN waited_at TEXT;"),n.has("waited_by")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN waited_by TEXT;"),t.exec(`
576
576
  CREATE INDEX IF NOT EXISTS idx_agent_mailbox_sender_delivery_wait
577
577
  ON agent_mailbox(sender_teamfile, sender_alias, delivered_at, waited_at, id);
578
578
  CREATE INDEX IF NOT EXISTS idx_agent_mailbox_lane_delivery
579
579
  ON agent_mailbox(sender_teamfile, sender_alias, receiver_teamfile, receiver_alias, delivered_at, delivering_at, id);
580
- `),t.pragma("user_version = 48"),r=48}r<49&&r!==0&&(ho(t,"tracked_invocation"),t.exec(`
580
+ `),t.pragma("user_version = 48"),r=48}r<49&&r!==0&&(Vn(t,"tracked_invocation"),t.exec(`
581
581
  UPDATE tracked_invocation
582
582
  SET notified_by = 'migration-baseline',
583
583
  notified_at = COALESCE(ended_at, started_at)
584
584
  WHERE status IN ('done', 'error', 'busy', 'cancelled')
585
585
  AND notified_by IS NULL;
586
- `),t.pragma("user_version = 49"),r=49),MI(BI)}function le(t,e){let r=t.prepare(`PRAGMA table_info(${e})`).all();return new Set(r.map(n=>n.name))}function Vn(t,e){return t.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?").get(e)!==void 0}function ho(t,e){if(!Vn(t,e)&&(t.exec(Fm(Hm,"utf8")),!Vn(t,e)))throw new Error(`schema.sql did not create expected table: ${e}`)}function Pm(t){let e=le(t,"team_chat_log");t.pragma("foreign_keys = OFF");try{t.exec(`
586
+ `),t.pragma("user_version = 49"),r=49),r<50&&r!==0&&(Vn(t,"tracked_invocation"),ie(t,"tracked_invocation").has("launch_source")||t.exec("ALTER TABLE tracked_invocation ADD COLUMN launch_source TEXT;"),t.pragma("user_version = 50"),r=50),MI(BI)}function ie(t,e){let r=t.prepare(`PRAGMA table_info(${e})`).all();return new Set(r.map(n=>n.name))}function Yn(t,e){return t.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?").get(e)!==void 0}function Vn(t,e){if(!Yn(t,e)&&(t.exec(Fm(Hm,"utf8")),!Yn(t,e)))throw new Error(`schema.sql did not create expected table: ${e}`)}function Pm(t){let e=ie(t,"team_chat_log");t.pragma("foreign_keys = OFF");try{t.exec(`
587
587
  DROP TABLE IF EXISTS team_chat_log_v46;
588
588
  CREATE TABLE team_chat_log_v46 (
589
589
  id INTEGER PRIMARY KEY AUTOINCREMENT,
@@ -612,7 +612,7 @@ var Nv=Object.defineProperty;var T=(t,e)=>()=>(t&&(e=t(t=0)),e);var ae=(t,e)=>{f
612
612
  FROM team_chat_log;
613
613
  DROP TABLE team_chat_log;
614
614
  ALTER TABLE team_chat_log_v46 RENAME TO team_chat_log;
615
- `)}finally{t.pragma("foreign_keys = ON")}}function qm(t){let e=t.pragma("user_version",{simple:!0});return typeof e=="number"?e:0}function qI(){return process.env.LMCTL_DB??FI(PI(),".lmctl","state.db")}var Bm,Hm,BI,Al,$l=T(()=>{"use strict";xl();Bm=Um(UI(import.meta.url)),Hm=Wm(Bm,"schema.sql"),BI=Wm(Bm,"migrations"),Al=49;if(process.argv[1]&&import.meta.url===WI(process.argv[1]).href){let t=Rl({dbPath:process.argv[2]??qI()});try{process.stdout.write(`migrated user_version=${qm(t)}
615
+ `)}finally{t.pragma("foreign_keys = ON")}}function qm(t){let e=t.pragma("user_version",{simple:!0});return typeof e=="number"?e:0}function qI(){return process.env.LMCTL_DB??FI(PI(),".lmctl","state.db")}var Bm,Hm,BI,Al,$l=T(()=>{"use strict";xl();Bm=Um(UI(import.meta.url)),Hm=Wm(Bm,"schema.sql"),BI=Wm(Bm,"migrations"),Al=50;if(process.argv[1]&&import.meta.url===WI(process.argv[1]).href){let t=Rl({dbPath:process.argv[2]??qI()});try{process.stdout.write(`migrated user_version=${qm(t)}
616
616
  `)}finally{t.close()}}});function Jm(t){return{getAgentInflight:t.prepare("SELECT * FROM agent_inflight WHERE receiver_teamfile = ? AND receiver_alias = ?"),listAgentInflight:t.prepare("SELECT * FROM agent_inflight ORDER BY started_at ASC, receiver_teamfile ASC, receiver_alias ASC"),acquireAgentInflight:t.prepare(`
617
617
  INSERT INTO agent_inflight (receiver_teamfile, receiver_alias, sender_teamfile, sender_alias, started_at, active_count, holder_pid)
618
618
  VALUES (@receiver_teamfile, @receiver_alias, @sender_teamfile, @sender_alias, @started_at, 1, @holder_pid)
@@ -753,9 +753,9 @@ var Nv=Object.defineProperty;var T=(t,e)=>()=>(t&&(e=t(t=0)),e);var ae=(t,e)=>{f
753
753
  INSERT INTO tracked_invocation (
754
754
  kind, origin, scope_teamfile, from_identity, target_teamfile, target_alias,
755
755
  root_teamfile, cwd, command, status, started_at, holder_pid, holder_host,
756
- last_heartbeat_at, meta
756
+ last_heartbeat_at, meta, launch_source
757
757
  )
758
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, 'running', ?, ?, ?, ?, ?)
758
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, 'running', ?, ?, ?, ?, ?, ?)
759
759
  `),getTrackedInvocation:t.prepare("SELECT * FROM tracked_invocation WHERE id = ?"),listAllRunningTrackedInvocations:t.prepare(`
760
760
  SELECT * FROM tracked_invocation
761
761
  WHERE status = 'running'
@@ -885,9 +885,9 @@ var Nv=Object.defineProperty;var T=(t,e)=>()=>(t&&(e=t(t=0)),e);var ae=(t,e)=>{f
885
885
  AND delivered_at IS NULL
886
886
  AND delivering_at IS NULL
887
887
  ORDER BY receiver_teamfile ASC, receiver_alias ASC, id ASC
888
- `),deleteMailboxMessage:t.prepare("DELETE FROM agent_mailbox WHERE id = ?")}}function jl(t){if(Buffer.byteLength(t,"utf8")<=65536)return t;let r=Buffer.byteLength(Ym,"utf8"),n=Math.max(0,65536-r),s=Buffer.from(t,"utf8"),o=n;for(;o>0&&(s[o]&192)===128;)o-=1;return`${s.subarray(0,o).toString("utf8")}${Ym}`}var Ym,Zm=T(()=>{"use strict";Ym=`
889
- ...[truncated]`});function Zn(t,e){return JSON.stringify([t,e])}function Qm(t){try{let e=JSON.parse(t);return typeof e.lock_id!="string"||typeof e.teamfile!="string"||typeof e.alias!="string"||typeof e.holder_pid!="number"||typeof e.holder_host!="string"||!Array.isArray(e.holder_ips)||!e.holder_ips.every(r=>typeof r=="string")||typeof e.started_at!="string"||typeof e.last_heartbeat!="string"?null:{lock_id:e.lock_id,teamfile:e.teamfile,alias:e.alias,holder_pid:e.holder_pid,holder_host:e.holder_host,holder_ips:e.holder_ips,started_at:e.started_at,last_heartbeat:e.last_heartbeat}}catch{return null}}var Yn,zn,ep=T(()=>{"use strict";Yn="terminal_lock",zn="member"});function Xr(t){if(!Number.isInteger(t)||(t??0)<=0)return!1;try{return process.kill(t,0),!0}catch(e){return(e!==null&&typeof e=="object"&&"code"in e?e.code:void 0)!=="ESRCH"}}var Ll=T(()=>{"use strict"});function Gr(t){return typeof t=="string"&&JI.has(t)}function np(t){return["Decide the workflow outcome. Reply with a final line:",` STANCE: <one of: ${t.length>0?t.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: ${_o[0]}`,` STANCE: ${_o[1]}`,` STANCE: ${_o[2]}`,` STANCE: ${tp}: <one short sentence: why no declared outcome fits>`,"Never invent a different outcome; never leave the STANCE line out."].join(`
890
- `)}var tp,_o,JI,Qn,rp,Ol,go,es=T(()=>{"use strict";tp="other",_o=["not_enough_information","dont_know","other_work"],JI=new Set([tp,..._o]),Qn="@abort",rp="invalid_decision",Ol="escalation_aborted",go="workflow_escalation"});import{randomUUID as sp}from"node:crypto";import{hostname as ts}from"node:os";function Ae(t){return t.provider_resolved??t.provider}function O(){return new Date().toISOString()}function _e(t){return new Cl(Rl({dbPath:t.path}))}function op(t,e,r){let n=ip(e);if(n.length===0)return;let s=new Set,o=[],i=l=>{if(l===t)return n;let c=r(l);if(c===null)throw new Error(`unknown workflow reference: ${l}`);return ip(c.definition)},a=l=>{let c=o.indexOf(l);if(c>=0)throw new Error(`cycle detected: ${[...o.slice(c),l].join(" -> ")}`);if(!s.has(l)){o.push(l);try{for(let u of i(l))a(u)}finally{o.pop()}s.add(l)}};a(t)}function ip(t){let e=XI(t),r=e===null?null:GI(e,"states");if(r===null)return[];let n=[];for(let s of Object.values(r))yo(s)&&s.type==="Subflow"&&typeof s.workflow_name=="string"&&s.workflow_name.length>0&&n.push(s.workflow_name);return n}function XI(t){try{let e=JSON.parse(t);return yo(e)?e:null}catch{return null}}function GI(t,e){let r=t[e];return yo(r)?r:null}function yo(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function KI(t){try{let e=JSON.parse(t);return!yo(e)||typeof e.lock_id!="string"||typeof e.holder_pid!="number"||typeof e.holder_host!="string"||typeof e.started_at!="string"||typeof e.last_heartbeat!="string"?null:{lock_id:e.lock_id,holder_pid:e.holder_pid,holder_host:e.holder_host,started_at:e.started_at,last_heartbeat:e.last_heartbeat}}catch{return null}}function VI(t,e){return t===null?!0:t.holder_host===ts()?!Xr(t.holder_pid):t.last_heartbeat<e}function YI(t,e){return t.delivering_at===null?!1:t.delivery_holder_host===ts()&&zI(t.delivery_holder_pid)?!Xr(t.delivery_holder_pid):t.delivering_at<e}function zI(t){return Number.isInteger(t)&&(t??0)>0}function ZI(t){return{...zm(t),getRuntimeState:t.prepare("SELECT * FROM runtime_state WHERE scope = ? AND key = ? AND kind = ?"),upsertRuntimeState:t.prepare(`
888
+ `),deleteMailboxMessage:t.prepare("DELETE FROM agent_mailbox WHERE id = ?")}}function Ll(t){if(Buffer.byteLength(t,"utf8")<=65536)return t;let r=Buffer.byteLength(Ym,"utf8"),n=Math.max(0,65536-r),s=Buffer.from(t,"utf8"),o=n;for(;o>0&&(s[o]&192)===128;)o-=1;return`${s.subarray(0,o).toString("utf8")}${Ym}`}var Ym,Zm=T(()=>{"use strict";Ym=`
889
+ ...[truncated]`});function Qn(t,e){return JSON.stringify([t,e])}function Qm(t){try{let e=JSON.parse(t);return typeof e.lock_id!="string"||typeof e.teamfile!="string"||typeof e.alias!="string"||typeof e.holder_pid!="number"||typeof e.holder_host!="string"||!Array.isArray(e.holder_ips)||!e.holder_ips.every(r=>typeof r=="string")||typeof e.started_at!="string"||typeof e.last_heartbeat!="string"?null:{lock_id:e.lock_id,teamfile:e.teamfile,alias:e.alias,holder_pid:e.holder_pid,holder_host:e.holder_host,holder_ips:e.holder_ips,started_at:e.started_at,last_heartbeat:e.last_heartbeat}}catch{return null}}var zn,Zn,ep=T(()=>{"use strict";zn="terminal_lock",Zn="member"});function Xr(t){if(!Number.isInteger(t)||(t??0)<=0)return!1;try{return process.kill(t,0),!0}catch(e){return(e!==null&&typeof e=="object"&&"code"in e?e.code:void 0)!=="ESRCH"}}var jl=T(()=>{"use strict"});function Gr(t){return typeof t=="string"&&JI.has(t)}function np(t){return["Decide the workflow outcome. Reply with a final line:",` STANCE: <one of: ${t.length>0?t.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: ${_o[0]}`,` STANCE: ${_o[1]}`,` STANCE: ${_o[2]}`,` STANCE: ${tp}: <one short sentence: why no declared outcome fits>`,"Never invent a different outcome; never leave the STANCE line out."].join(`
890
+ `)}var tp,_o,JI,es,rp,Ol,go,ts=T(()=>{"use strict";tp="other",_o=["not_enough_information","dont_know","other_work"],JI=new Set([tp,..._o]),es="@abort",rp="invalid_decision",Ol="escalation_aborted",go="workflow_escalation"});import{randomUUID as sp}from"node:crypto";import{hostname as rs}from"node:os";function Ae(t){return t.provider_resolved??t.provider}function O(){return new Date().toISOString()}function _e(t){return new Cl(Rl({dbPath:t.path}))}function op(t,e,r){let n=ip(e);if(n.length===0)return;let s=new Set,o=[],i=l=>{if(l===t)return n;let c=r(l);if(c===null)throw new Error(`unknown workflow reference: ${l}`);return ip(c.definition)},a=l=>{let c=o.indexOf(l);if(c>=0)throw new Error(`cycle detected: ${[...o.slice(c),l].join(" -> ")}`);if(!s.has(l)){o.push(l);try{for(let u of i(l))a(u)}finally{o.pop()}s.add(l)}};a(t)}function ip(t){let e=XI(t),r=e===null?null:GI(e,"states");if(r===null)return[];let n=[];for(let s of Object.values(r))yo(s)&&s.type==="Subflow"&&typeof s.workflow_name=="string"&&s.workflow_name.length>0&&n.push(s.workflow_name);return n}function XI(t){try{let e=JSON.parse(t);return yo(e)?e:null}catch{return null}}function GI(t,e){let r=t[e];return yo(r)?r:null}function yo(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function KI(t){try{let e=JSON.parse(t);return!yo(e)||typeof e.lock_id!="string"||typeof e.holder_pid!="number"||typeof e.holder_host!="string"||typeof e.started_at!="string"||typeof e.last_heartbeat!="string"?null:{lock_id:e.lock_id,holder_pid:e.holder_pid,holder_host:e.holder_host,started_at:e.started_at,last_heartbeat:e.last_heartbeat}}catch{return null}}function VI(t,e){return t===null?!0:t.holder_host===rs()?!Xr(t.holder_pid):t.last_heartbeat<e}function YI(t,e){return t.delivering_at===null?!1:t.delivery_holder_host===rs()&&zI(t.delivery_holder_pid)?!Xr(t.delivery_holder_pid):t.delivering_at<e}function zI(t){return Number.isInteger(t)&&(t??0)>0}function ZI(t){return{...zm(t),getRuntimeState:t.prepare("SELECT * FROM runtime_state WHERE scope = ? AND key = ? AND kind = ?"),upsertRuntimeState:t.prepare(`
891
891
  INSERT INTO runtime_state (scope, key, kind, data, updated_at)
892
892
  VALUES (?, ?, ?, ?, ?)
893
893
  ON CONFLICT(scope, key, kind) DO UPDATE SET
@@ -1287,8 +1287,8 @@ var Nv=Object.defineProperty;var T=(t,e)=>()=>(t&&(e=t(t=0)),e);var ae=(t,e)=>{f
1287
1287
  error_detail = ?,
1288
1288
  truncated = ?
1289
1289
  WHERE id = ?
1290
- `),...Km(t),...Jm(t)}}function QI(t,e){return e===void 0?{resumed:!1,reason:t}:{resumed:!1,reason:t,valid:e}}var Cl,Ue=T(()=>{"use strict";$l();Xm();Vm();Zm();ep();Ll();es();Cl=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;tryAcquireAgentInflightTxn;recvMailboxMessagesTxn;constructor(e){e.pragma("foreign_keys = ON"),this.db=e,this.stmts=ZI(e),this.claimTxn=e.transaction((r,n,s)=>{let o=this.stmts.selectClaimableJob.get(s,s,s);return o===void 0||this.stmts.claimJob.run(r,n,s,o.id,s,s,s).changes!==1?null:this.getJob(o.id)}),this.claimWithConcurrencyTxn=e.transaction((r,n,s,o)=>{let i=this.stmts.selectClaimableJobs.all(s,s,s);for(let a of i){let l=this.getJob(a.id);if(l===null)continue;let c=o(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=e.transaction((r,n,s,o,i)=>{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>=o)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<=o,u=a.status==="running"&&a.locked_until!==null&&a.locked_until<o;if(!c&&!u)return{claimed:!1,reason:"not_claimable",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let d=i(a);if(d.concurrency_key!==null&&(a.concurrency_key_resolved!==d.concurrency_key&&this.stmts.setJobConcurrencyKey.run(d.concurrency_key,a.id),(this.stmts.countRunningByConcurrencyKey.get(d.concurrency_key,o,a.id)?.count??0)>=Math.max(1,d.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,o,a.id,o,o,o).changes!==1){let p=this.getJob(a.id);return{claimed:!1,reason:p?.locked_until!==null&&p?.locked_until!==void 0&&p.locked_until>=o?"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=e.transaction((r,n,s)=>QI("state_not_found")),this.resumeInteractiveTxn=e.transaction((r,n,s,o)=>{let i=this.getInteractiveSessionByStepId(r);if(i===null)return{resumed:!1,reason:"not_found"};if(i.status!=="waiting_operator")return{resumed:!1,reason:"not_waiting_operator"};let a=this.getRun(i.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(),i.id),this.stmts.resumeRunState.run(i.state_name,a.id),this.stmts.requeuePausedJob.run(o,a.job_id),{resumed:!0,session:this.getInteractiveSessionByStepId(r),run:this.getRun(a.id),job:this.getJob(a.job_id)}}),this.resumeEscalationTxn=e.transaction((r,n,s)=>{let o=this.stmts.getAttention.get(r);if(o===void 0)return{resumed:!1,reason:"not_found"};if(o.kind!==go)return{resumed:!1,reason:"wrong_kind"};if(o.acknowledged_at!==null)return{resumed:!1,reason:"already_acked"};if(o.run_id===null)return{resumed:!1,reason:"run_not_found"};let i=null,a=[];if(o.payload!==null)try{let u=JSON.parse(o.payload);u.step!==void 0&&typeof u.step.id=="string"&&u.step.id.length>0&&(i=u.step.id),Array.isArray(u.declared_outcomes)&&(a=u.declared_outcomes.filter(d=>typeof d=="string"))}catch{}if(i===null)return{resumed:!1,reason:"no_step"};let l=this.getRun(o.run_id);if(l===null)return{resumed:!1,reason:"run_not_found"};if(n!==Qn&&!a.includes(n))return{resumed:!1,reason:rp};let c={};if(l.pending_escalation_decision!==null)try{let u=JSON.parse(l.pending_escalation_decision);u!==null&&typeof u=="object"&&!Array.isArray(u)&&(c=u)}catch{c={}}return c[i]=n,this.stmts.setRunPendingEscalationDecision.run(JSON.stringify(c),l.id),this.stmts.resumeRunState.run(i,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,o=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}),i=o!==void 0?{acquired:!0,current:o}:{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"),i}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}},this.recvMailboxMessagesTxn=e.transaction((r,n)=>{let s=this.stmts.listAllMailboxMessagesForReceiver.all(r,n);for(let o of s)this.stmts.deleteMailboxMessage.run(o.id);return s})}close(){this.db.close()}query(e,...r){let n=e.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(e).all(...r)}insertWorkflow(e){op(e.name,e.definition,i=>this.getWorkflowByName(i));let r=this.stmts.insertWorkflow.run(e.name,e.version??1,e.definition_schema_version??1,e.definition,O()),n=this.getWorkflow(Number(r.lastInsertRowid)),s=this.stmts.insertWorkflowVersion.run(n.id,n.version,e.definition,e.author??null,O());this.stmts.updateWorkflowActiveVersion.run(s.lastInsertRowid,n.id),(e.source_uri!=null||e.source_sha256!=null)&&this.stmts.setWorkflowSource.run(e.source_uri??null,e.source_sha256??null,n.id);let o=this.getWorkflow(n.id);return this.syncWorkflowTriggers(n.id,e.definition),o}upsertWorkflow(e){op(e.name,e.definition,i=>this.getWorkflowByName(i));let r=this.getWorkflowByName(e.name);if(r===null)return this.insertWorkflow({name:e.name,definition_schema_version:e.definition_schema_version,definition:e.definition,author:e.author,source_uri:e.source_uri,source_sha256:e.source_sha256});let s=(this.stmts.getLatestWorkflowVersion.get(r.id)?.version??r.version)+1,o=this.stmts.insertWorkflowVersion.run(r.id,s,e.definition,e.author??null,O());return this.stmts.updateWorkflowActiveVersionDefinitionAndVersion.run(Number(o.lastInsertRowid),e.definition,e.definition_schema_version??r.definition_schema_version,s,r.id),(e.source_uri!=null||e.source_sha256!=null)&&this.stmts.setWorkflowSource.run(e.source_uri??null,e.source_sha256??null,r.id),this.syncWorkflowTriggers(r.id,e.definition),this.getWorkflow(r.id)}insertCompositionUnit(e){this.stmts.insertCompositionUnit.run(e.name,e.version,e.lang,e.source,e.source_sha,e.compiled_workflow_version_id,O())}getWorkflow(e){return this.stmts.getWorkflow.get(e)??null}getWorkflowByName(e,r){return(r===void 0?this.stmts.findWorkflowLatest.get(e):this.stmts.findWorkflowVersion.get(e,r))??null}findWorkflowByName(e,r){return this.getWorkflowByName(e,r)}insertWorkflowVersion(e,r,n){let o=(this.stmts.getLatestWorkflowVersion.get(e)?.version??0)+1,i=this.stmts.insertWorkflowVersion.run(e,o,r,n??null,O());return this.stmts.getWorkflowVersion.get(i.lastInsertRowid)}activateWorkflowVersion(e,r){let n=this.getWorkflowVersionById(r);if(n===null||n.workflow_id!==e)return null;let s=1;try{let o=JSON.parse(n.definition);typeof o.definition_schema_version=="number"&&(s=o.definition_schema_version)}catch{}return this.stmts.updateWorkflowActiveVersionAndDefinition.run(r,n.definition,s,e),this.syncWorkflowTriggers(e,n.definition),this.getWorkflow(e)}getWorkflowVersionById(e){return this.stmts.getWorkflowVersion.get(e)??null}listWorkflowVersions(e){return this.stmts.listWorkflowVersions.all(e)}upsertTriggerInstance(e){return this.stmts.upsertTriggerInstance.run(e.workflow_id,e.trigger_id,e.trigger_type,e.parameters,e.enabled===!1?0:1,O()),this.stmts.getTriggerInstanceByWorkflowAndId.get(e.workflow_id,e.trigger_id)}listTriggerInstancesForWorkflow(e){return this.stmts.listTriggerInstancesForWorkflow.all(e)}listEnabledTriggerInstances(){return this.stmts.listEnabledTriggerInstances.all()}setTriggerCursor(e,r){return this.stmts.setTriggerCursor.run(r,O(),e),this.stmts.getTriggerInstance.get(e)??null}setTriggerFailure(e,r){return this.stmts.setTriggerFailure.run(O(),r,e),this.stmts.getTriggerInstance.get(e)??null}syncWorkflowTriggers(e,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 o of s){if(o===null||typeof o!="object"||Array.isArray(o))continue;let i=o;typeof i.id!="string"||i.id.length===0||typeof i.type!="string"||i.type.length===0||this.upsertTriggerInstance({workflow_id:e,trigger_id:i.id,trigger_type:i.type,parameters:JSON.stringify(i.parameters??{})})}}insertTeam(e){let r=this.stmts.insertTeam.run(e.name,O());return this.stmts.getTeam.get(r.lastInsertRowid)}getTeam(e){return this.stmts.getTeam.get(e)??null}findTeamByName(e){return this.stmts.findTeamByName.get(e)??null}listTeams(){return this.stmts.listTeams.all()}insertTeamMember(e){let r=this.stmts.insertTeamMember.run(e.team_id,e.alias,e.role??"agent",e.provider,e.model??null,e.sessionid??null,e.sessiondir,O());return this.stmts.getTeamMember.get(r.lastInsertRowid)}listTeamMembers(e){return this.stmts.listTeamMembers.all(e)}findTeamMemberByAlias(e,r){return this.stmts.findTeamMemberByAlias.get(e,r)??null}updateTeamMemberSession(e,r){return this.stmts.updateTeamMemberSession.run(r,e),this.stmts.getTeamMember.get(e)??null}setMemberState(e,r,n){return this.stmts.setMemberState.run(r,n??null,O(),e),this.stmts.getTeamMember.get(e)??null}listMembersInState(e){return this.stmts.listMembersInState.all(e)}setMemberPromptSnapshot(e,r){return this.stmts.setMemberPromptSnapshot.run(r,e),this.stmts.getTeamMember.get(e)??null}setMemberProviderResolved(e,r){return this.stmts.setMemberProviderResolved.run(r,e),this.stmts.getTeamMember.get(e)??null}setMemberRolePrompt(e,r){return this.stmts.setMemberRolePrompt.run(r,e),this.stmts.getTeamMember.get(e)??null}updateTeamMemberMeta(e,r){let n=this.stmts.getTeamMember.get(e);if(n===void 0)return null;let s=Object.prototype.hasOwnProperty.call(r,"role_prompt"),o=Object.prototype.hasOwnProperty.call(r,"model"),i=Object.prototype.hasOwnProperty.call(r,"provider");return this.stmts.updateTeamMemberMeta.run(s?r.role_prompt??null:n.role_prompt,o?r.model??null:n.model,i?r.provider??n.provider:n.provider,e),this.stmts.getTeamMember.get(e)??null}insertTeamMemberCompanion(e){let r=this.stmts.insertTeamMemberCompanion.run(e.interpreter_id,e.companion_id,O());return this.stmts.getTeamMemberCompanion.get(r.lastInsertRowid)}insertProject(e){let r=this.stmts.insertProject.run(e.name,e.description??null,e.local_path,e.workflow_name,e.team_id,e.default_branch??null,e.intake_config??null,e.test_argv??null,e.test_command??null,e.durable_memory_mode??"folder",O());return this.stmts.getProject.get(r.lastInsertRowid)}listProjects(){return this.stmts.listProjects.all()}getProject(e){return this.stmts.getProject.get(e)??null}findProjectByName(e){return this.stmts.findProjectByName.get(e)??null}setProjectIntakeConfig(e,r){return this.stmts.setProjectIntakeConfig.run(r,e),this.stmts.getProject.get(e)??null}updateProjectSettings(e,r){let n=this.stmts.getProject.get(e);if(n===void 0)return null;let s=Object.prototype.hasOwnProperty.call(r,"local_path"),o=Object.prototype.hasOwnProperty.call(r,"durable_memory_mode"),i=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,o?r.durable_memory_mode:n.durable_memory_mode,i?r.default_branch??null:n.default_branch,a?r.intake_config??null:n.intake_config,e),this.stmts.getProject.get(e)??null}listProjectsWithIntakeEnabled(){return this.stmts.listProjectsWithIntakeConfig.all().filter(e=>{if(e.intake_config===null)return!1;try{let r=JSON.parse(e.intake_config);return typeof r=="object"&&r!==null&&!Array.isArray(r)&&r.scan_github_issues===!0}catch{return!1}})}getProjectByJob(e){return this.stmts.getProjectByJob.get(e)??null}insertProjectWorkflow(e){let r=e.condition??null,n=this.stmts.findProjectWorkflowUnique.get(e.project_id,e.workflow_id,r);if(n!==void 0)return n;let s=this.stmts.insertProjectWorkflow.run(e.project_id,e.workflow_id,r,e.parameters_override??null,e.enabled===!1?0:1,e.priority??100,O());return s.changes===1?this.stmts.getProjectWorkflow.get(s.lastInsertRowid):this.stmts.findProjectWorkflowUnique.get(e.project_id,e.workflow_id,r)}getProjectWorkflow(e){return this.stmts.getProjectWorkflow.get(e)??null}listProjectWorkflows(e,r={}){return r.enabled_only===!0?this.stmts.listEnabledProjectWorkflows.all(e):this.stmts.listProjectWorkflows.all(e)}removeProjectWorkflow(e){return this.stmts.removeProjectWorkflow.run(e).changes>0}setProjectWorkflowEnabled(e,r){return this.stmts.setProjectWorkflowEnabled.run(r?1:0,e),this.getProjectWorkflow(e)}createIssue(e){let r=O(),n=this.stmts.createIssue.run(e.project_id,e.title,e.body,e.severity??"medium",e.labels??null,e.ai_test_path??null,e.source_run_id??null,r,r);return this.stmts.getIssue.get(n.lastInsertRowid)}getIssue(e){return this.stmts.getIssue.get(e)??null}listIssues(e,r={}){return this.stmts.listIssuesForProject.all(e).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(e,r){return this.stmts.claimNextIssue.get(r,O(),e)??null}claimIssue(e,r){return this.stmts.claimIssue.get(r,O(),e)??null}closeIssue(e,r,n){let s=O(),o=this.stmts.closeIssue.get(r,n??null,s,s,e);if(o===void 0)throw new Error(`issue not found: ${e}`);return o}reopenIssue(e,r){let n=this.stmts.reopenIssue.get(r,O(),e);if(n===void 0)throw this.getIssue(e)===null?new Error(`issue not found: ${e}`):new Error(`issue ${e} is not closed`);return n}updateIssue(e,r){let n=this.getIssue(e);if(n===null)throw new Error(`issue not found: ${e}`);let s=Object.prototype.hasOwnProperty.call(r,"labels"),o=Object.prototype.hasOwnProperty.call(r,"ai_test_path"),i=this.stmts.updateIssue.get(r.title??n.title,r.body??n.body,r.severity??n.severity,s?r.labels??null:n.labels,o?r.ai_test_path??null:n.ai_test_path,O(),e);if(i===void 0)throw new Error(`issue not found: ${e}`);return i}listWorkflows(){return this.stmts.listWorkflows.all()}getOrCreateWebuiSession(e,r){let n=this.stmts.getWebuiSession.get(e);if(n!==void 0)return n;let s=O();return this.stmts.insertWebuiSession.run(e,r,"N1",null,null,null,null,"authenticated",s,s),this.stmts.getWebuiSession.get(e)}getWebuiSession(e){return this.stmts.getWebuiSession.get(e)??null}updateWebuiSessionTransition(e,r,n,s,o){if(this.stmts.updateWebuiSessionTransition.run(r,n,s,o,O(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}setWebuiSessionChatbot(e,r){if(this.stmts.setWebuiSessionChatbot.run(r,O(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}createChatbotSession(e,r){let n=sp(),s=O();return this.stmts.insertChatbotSession.run(n,e,r??null,s,s,"active"),this.stmts.getChatbotSession.get(n)}getChatbotSession(e){return this.stmts.getChatbotSession.get(e)??null}listChatbotSessions(e){return this.stmts.listChatbotSessionsForUser.all(e)}appendChatbotMessage(e,r,n,s){let o=O(),i=this.stmts.insertChatbotMessage.run(e,r,n,s??null,o);return this.stmts.touchChatbotSession.run(o,e),this.stmts.getChatbotMessage.get(i.lastInsertRowid)}listChatbotMessages(e){return this.stmts.listChatbotMessages.all(e)}getConfig(e){return this.stmts.getConfig.get(e)?.value??null}setConfig(e,r){this.stmts.upsertConfig.run(e,r,O())}getConfigAll(){let e=this.stmts.listConfig.all(),r={};for(let n of e)r[n.key]=n.value;return r}enqueueJob(e){let r=this.stmts.insertJob.run(e.project_id,e.workflow_id_override??null,e.source,e.source_ref??null,e.payload??null,e.priority??0,e.available_at??O(),e.dedupe_key??null,e.concurrency_key??null,O());if(r.changes===1)return this.stmts.getJob.get(r.lastInsertRowid);if(e.dedupe_key===void 0||e.dedupe_key===null)throw new Error("job insert ignored without dedupe key");return this.stmts.findJobByDedupe.get(e.source,e.dedupe_key)}claimNextJob(e){let r=O(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimTxn(e.worker_id,n,r)}claimNextJobWithConcurrency(e){let r=O(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimWithConcurrencyTxn(e.worker_id,n,r,e.evaluator)}claimJobByIdWithConcurrency(e){let r=O(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimByIdWithConcurrencyTxn(e.job_id,e.worker_id,n,r,e.evaluator)}releaseJob(e,r,n){let s=r==="queued"||r==="running"?null:O();return this.stmts.releaseJob.run(r,n??null,s,e),this.getJob(e)}getJob(e){return this.stmts.getJob.get(e)??null}findJobBySourceAndDedupe(e,r){return this.stmts.findJobByDedupe.get(e,r)??null}insertRun(e){let r=this.getWorkflow(e.workflow_id);if(r===null)throw new Error(`workflow not found: ${e.workflow_id}`);let n=this.stmts.insertRun.run(e.job_id,e.workflow_id,e.team_id,e.current_state??null,r.active_version_id,e.parent_run_id??null,O()),s=this.stmts.getRun.get(n.lastInsertRowid);return(e.parent_run_id===void 0||e.parent_run_id===null)&&this.stmts.setJobRun.run(s.id,e.job_id),s}setJobRun(e,r){return this.stmts.setJobRun.run(r,e),this.getJob(e)}insertPromptDispatch(e){return this.stmts.insertPromptDispatch.run(e.prompt_id,e.project_id,e.job_id,e.text,e.context_json??null,O()),this.stmts.getPromptDispatch.get(e.prompt_id)}getPromptDispatch(e){return this.stmts.getPromptDispatch.get(e)??null}setPromptDispatchCompleted(e,r){return this.stmts.setPromptDispatchCompleted.run(r??O(),e),this.getPromptDispatch(e)}getWorkspace(e){return this.stmts.getWorkspace.get(e)??null}ensureWorkspace(e={}){let r=e.id??"default";this.stmts.ensureWorkspace.run(r,e.name??"Default workspace",e.idleThresholdMs??6e5,O());let n=this.getWorkspace(r);if(n===null)throw new Error(`workspace ${r} missing after upsert`);return n}listWebProjectsActive(e){return this.stmts.listWebProjectsActive.all(e)}getWebProject(e){return this.stmts.getWebProject.get(e)??null}insertWebProject(e){let r=O(),n=this.stmts.insertWebProject.run(e.workspace_id,e.name,e.repo_path,e.config_json??null,e.linked_v4_project_id??null,r,r),s=Number(n.lastInsertRowid),o=this.getWebProject(s);if(o===null)throw new Error(`web_project ${s} missing after insert`);return o}updateWebProject(e){let r=this.getWebProject(e.id);return r===null||r.deleted_at!==null?null:(this.stmts.updateWebProject.run(e.name??r.name,e.config_json===void 0?r.config_json:e.config_json,O(),e.id),this.getWebProject(e.id))}softDeleteWebProject(e){return this.stmts.softDeleteWebProject.run(O(),e).changes===1}loadMailboxCursor(e,r){return this.stmts.loadMailboxCursor.get(e,r)??null}saveMailboxCursor(e){this.stmts.saveMailboxCursor.run(e.user_id,e.mailbox_key,e.last_processed_version_id,e.last_processed_seq??null,e.last_processed_at)}addUsage(e){this.stmts.addUsage.run(e.user_id,e.device_id,e.period,e.put,e.get,e.list,e.updated_at)}loadUsage(e,r,n){return this.stmts.loadUsage.get(e,r,n)??null}sumUsageForPeriod(e,r){let n=this.stmts.sumUsageForPeriod.get(e,r);return{put:n?.put??0,get:n?.get??0,list:n?.list??0}}upsertRootTeam(e){this.stmts.upsertRootTeam.run(e.teamfile_path,e.name,e.raw_text,e.raw_sha256,e.registered_at,e.last_seeded_at)}getRootTeam(e){return this.stmts.getRootTeam.get(e)??null}listRootTeams(){return this.stmts.listRootTeams.all()}insertTeamChatLog(e){let r=this.stmts.insertTeamChatLog.run(e.root_teamfile,e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias,e.message,e.response,e.origin,e.status,e.error_detail,e.truncated,e.created_at);return Number(r.lastInsertRowid)}listTeamChatLog(e){return this.stmts.listTeamChatLog.all(e)}listTeamChatLogSinceId(e,r=500){return this.stmts.listTeamChatLogSinceId.all(e,Math.max(1,Math.trunc(r)))}getMaxTeamChatLogId(){return this.stmts.getMaxTeamChatLogId.get()?.max_id??0}loadTeamChatLogCursor(e){return this.stmts.loadTeamChatLogCursor.get(e)??null}saveTeamChatLogCursor(e){this.stmts.saveTeamChatLogCursor.run(e.cursor_key,e.last_pushed_id,e.updated_at)}startTrackedInvocation(e){let r=e.started_at??O(),n=e.holder_host??ts(),s=e.last_heartbeat_at??r,o=this.stmts.insertTrackedInvocation.run(e.kind,e.origin,e.scope_teamfile??null,e.from_identity,e.target_teamfile??null,e.target_alias??null,e.root_teamfile??null,e.cwd??null,Ct(e.command),r,e.holder_pid??null,n,s,Ct(e.meta));return this.getTrackedInvocation(Number(o.lastInsertRowid))}getTrackedInvocation(e){return this.stmts.getTrackedInvocation.get(e)??null}listAllRunningTrackedInvocations(){return this.stmts.listAllRunningTrackedInvocations.all()}finishTrackedInvocation(e,r){let n=r.ended_at??O();return this.stmts.finishTrackedInvocation.run(r.status,n,r.exit_code??null,r.signal??null,Ct(r.result_summary),Ct(r.error),r.team_chat_log_id??null,Ct(r.meta),n,e).changes!==1?null:this.getTrackedInvocation(e)}reclaimTrackedInvocationIfUnchanged(e,r,n){let s=n.ended_at??O();return this.stmts.reclaimTrackedInvocationIfUnchanged.run(n.status,s,n.exit_code??null,n.signal??null,Ct(n.result_summary),Ct(n.error),n.team_chat_log_id??null,Ct(n.meta),s,e,r.holder_pid,r.holder_host,r.started_at,r.last_heartbeat_at).changes!==1?null:this.getTrackedInvocation(e)}heartbeatTrackedInvocation(e,r=O()){return this.stmts.heartbeatTrackedInvocation.run(r,e).changes!==1?null:this.getTrackedInvocation(e)}listClaimableTerminalTrackedInvocations(e){let r=["status IN ('done', 'error', 'busy', 'cancelled')","ended_at IS NOT NULL","notified_by IS NULL"],n=[];e.from!==void 0&&(r.push("from_identity = ?"),n.push(e.from)),e.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(e.scope_teamfile));let s=Math.max(1,Math.min(1e3,Math.trunc(e.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(e,r,n=O()){return this.stmts.claimTrackedInvocationNotification.run(r,n,e).changes!==1?null:this.getTrackedInvocation(e)}listTrackedInvocations(e={}){let r=[],n=[];e.from!==void 0&&(r.push("from_identity = ?"),n.push(e.from)),e.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(e.scope_teamfile)),e.status!==void 0&&(r.push("status = ?"),n.push(e.status)),e.kind!==void 0&&(r.push("kind = ?"),n.push(e.kind)),e.origin!==void 0&&(r.push("origin = ?"),n.push(e.origin));let s=Math.max(1,Math.min(1e3,Math.trunc(e.limit??100)));n.push(s);let o=r.length===0?"":` WHERE ${r.join(" AND ")}`;return this.db.prepare(`SELECT * FROM tracked_invocation${o} ORDER BY started_at DESC, id DESC LIMIT ?`).all(...n)}maxTrackedInvocationId(e={}){let r=[],n=[];e.from!==void 0&&(r.push("from_identity = ?"),n.push(e.from)),e.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(e.scope_teamfile));let s=r.length===0?"":` WHERE ${r.join(" AND ")}`,o=this.db.prepare(`SELECT COALESCE(MAX(id), 0) AS max_id FROM tracked_invocation${s}`).get(...n);return Number(o?.max_id??0)}listRunningTrackedInvocations(e={}){return this.listTrackedInvocations({...e,status:"running"})}enqueueMail(e){return this.sendMailboxMessage(e)}sendMailboxMessage(e){let r=this.stmts.insertMailboxMessage.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile??null,e.sender_alias??null,e.root_teamfile??null,jl(e.payload),e.created_at??O(),e.remote_transport??null,e.remote_message_id??null,e.remote_thread_id??null,e.meta??null);return this.getMailboxMessage(Number(r.lastInsertRowid))}listEnqueuedMailFromSender(e,r,n,s){return this.stmts.listEnqueuedMailFromSender.all(e,r,n,s)}markMailDelivered(e,r,n){let s=[...new Set(e.map(i=>Math.trunc(i)).filter(i=>Number.isInteger(i)&&i>0))];if(s.length===0)return 0;let o=jl(r);this.db.exec("BEGIN IMMEDIATE");try{let i=0;for(let a of s)i+=this.stmts.markMailboxMessageDelivered.run(n,o,a).changes;return this.db.exec("COMMIT"),i}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}claimMailForDelivery(e,r,n=process.pid,s=ts()){let o=[...new Set(e.map(i=>Math.trunc(i)).filter(i=>Number.isInteger(i)&&i>0))];if(o.length===0)return[];this.db.exec("BEGIN IMMEDIATE");try{let i=[];for(let a of o)if(this.stmts.claimMailboxMessageDelivery.run(r,n,s,a).changes===1){let c=this.getMailboxMessage(a);c!==null&&i.push(c)}return this.db.exec("COMMIT"),i}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}clearMailDelivery(e){let r=[...new Set(e.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(e){return this.stmts.clearMailboxMessageDeliveryIfUnchanged.run(e.id,e.delivering_at,e.delivery_holder_pid,e.delivery_holder_host).changes!==1?null:this.getMailboxMessage(e.id)}reclaimStaleMailboxDeliveries(e){let r=this.stmts.listInFlightMailboxDeliveries.all(),n=[];this.db.exec("BEGIN IMMEDIATE");try{for(let s of r){if(!YI(s,e))continue;let o=this.reclaimMailboxDeliveryIfUnchanged(s);o!==null&&n.push(o)}return this.db.exec("COMMIT"),n}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}listDeliveredReceiptsForSender(e,r){return this.stmts.listDeliveredReceiptsForSender.all(e,r)}listOutboundPendingForSender(e,r){return this.stmts.listOutboundPendingForSender.all(e,r)}getMailboxMessage(e){return this.stmts.getMailboxMessage.get(e)??null}peekMailboxMessages(e,r=1e3){return this.stmts.listMailboxMessagesForReceiver.all(e.receiver_teamfile,e.receiver_alias,Math.max(1,Math.min(1e3,Math.trunc(r))))}recvMailboxMessages(e){return this.recvMailboxMessagesTxn(e.receiver_teamfile,e.receiver_alias)}updateTeamChatLogResponse(e,r){this.stmts.updateTeamChatLogResponse.run(r.response,r.status,r.error_detail,r.truncated,e)}getAgentInflight(e,r){return this.stmts.getAgentInflight.get(e,r)??null}listAgentInflight(){return this.stmts.listAgentInflight.all()}tryAcquireAgentInflight(e,r){return this.tryAcquireAgentInflightTxn(e,r)}clearAgentInflight(e,r){this.stmts.clearAgentInflight.run(e,r)}clearObservedTerminalAgentInflight(e,r,n){return this.stmts.clearObservedTerminalAgentInflight.run({receiver_teamfile:e,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(e){this.db.exec("BEGIN IMMEDIATE");try{let r=this.getAgentInflight(e.receiver_teamfile,e.receiver_alias);if(r===null||r.sender_teamfile!==e.sender_teamfile||r.sender_alias!==e.sender_alias)return this.db.exec("COMMIT"),!1;if(r.active_count<=1)return this.stmts.clearAgentInflightIfSender.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias),this.db.exec("COMMIT"),!0;let n=this.stmts.decrementAgentInflight.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias);return this.db.exec("COMMIT"),n.changes===1}catch(r){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),r}}clearAgentInflightOlderThan(e){return this.stmts.clearAgentInflightOlderThan.run(e).changes}getTerminalLock(e,r){let n=this.stmts.getRuntimeState.get(Yn,Zn(e,r),zn);return n===void 0?null:Qm(n.data)}setTerminalLock(e){this.stmts.upsertRuntimeState.run(Yn,Zn(e.teamfile,e.alias),zn,JSON.stringify(e),e.last_heartbeat)}heartbeatTerminalLock(e,r,n,s){this.db.exec("BEGIN IMMEDIATE");try{let o=this.getTerminalLock(e,r);if(o===null||o.lock_id!==n)return this.db.exec("COMMIT"),!1;let i={...o,last_heartbeat:s};return this.stmts.upsertRuntimeState.run(Yn,Zn(e,r),zn,JSON.stringify(i),s),this.db.exec("COMMIT"),!0}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}clearTerminalLock(e,r,n){this.db.exec("BEGIN IMMEDIATE");try{let s=this.getTerminalLock(e,r);if(s===null||s.lock_id!==n)return this.db.exec("COMMIT"),!1;let o=this.stmts.deleteRuntimeState.run(Yn,Zn(e,r),zn);return this.db.exec("COMMIT"),o.changes===1}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}getRuntimeProcessLock(e,r,n){let s=this.stmts.getRuntimeState.get(e,r,n);return s===void 0?null:KI(s.data)}tryAcquireRuntimeProcessLock(e,r,n,s,o=O()){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getRuntimeProcessLock(e,r,n);if(i!==null&&!VI(i,s))return this.db.exec("COMMIT"),{acquired:!1,current:i};let a={lock_id:sp(),holder_pid:process.pid,holder_host:ts(),started_at:o,last_heartbeat:o};return this.stmts.upsertRuntimeState.run(e,r,n,JSON.stringify(a),o),this.db.exec("COMMIT"),{acquired:!0,lock:a,previous:i}}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}clearRuntimeProcessLock(e,r,n,s){this.db.exec("BEGIN IMMEDIATE");try{let o=this.getRuntimeProcessLock(e,r,n);if(o===null||o.lock_id!==s)return this.db.exec("COMMIT"),!1;let i=this.stmts.deleteRuntimeState.run(e,r,n);return this.db.exec("COMMIT"),i.changes===1}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}getRun(e){return this.stmts.getRun.get(e)??null}setRunCurrentState(e,r){return this.stmts.setRunCurrentState.run(r,e),this.stmts.getRun.get(e)??null}setRunPausedState(e,r,n){return this.stmts.setRunPausedState.run(r,n,e),this.stmts.getRun.get(e)??null}setRunPendingEscalationDecision(e,r){return this.stmts.setRunPendingEscalationDecision.run(r,e),this.stmts.getRun.get(e)??null}setRunTerminalState(e,r){return this.stmts.setRunTerminalState.run(r,O(),e),this.stmts.getRun.get(e)??null}pauseJob(e){return this.stmts.pauseJob.run(e),this.getJob(e)}resumeRun(e,r){return this.resumeRunTxn(e,r,O())}insertStep(e){let r=this.stmts.insertStep.run(e.run_id,e.parent_step_id??null,e.state_name,e.outcome??null,e.status_detail??null,O());return this.stmts.getStep.get(r.lastInsertRowid)}finishStep(e,r,n){return this.stmts.finishStep.run(r??null,n??null,O(),e),this.stmts.getStep.get(e)??null}listStepsForRun(e){return this.stmts.listStepsForRun.all(e)}listLatestStepOutcomesByState(e){let r=this.stmts.listLatestStepOutcomesByState.all(e),n={};for(let s of r)n[s.state_name]=s.outcome;return n}insertSubmittedPr(e){let r=this.stmts.insertSubmittedPr.run(e.repo,e.pr_url,e.issue_url??null,e.local_path??null,e.branch??null,e.head_sha??null,e.status??"watching",e.submitted_at??O(),e.last_known_state??null,e.created_by_run_id??null);return this.stmts.getSubmittedPr.get(r.lastInsertRowid)}listSubmittedPrs(e){return e?.status!==void 0?this.stmts.listSubmittedPrsByStatus.all(e.status):this.stmts.listSubmittedPrs.all()}getSubmittedPr(e){return this.stmts.getSubmittedPr.get(e)??null}findSubmittedPrByUrl(e){return this.stmts.findSubmittedPrByUrl.get(e)??null}insertStepArtifact(e){let r=this.stmts.insertStepArtifact.run(e.step_id,e.kind,e.path??null,e.content??null,e.sha??null,e.provider_call_mode??null,O());return this.stmts.getStepArtifact.get(r.lastInsertRowid)}insertExternalObject(e){let n=this.stmts.insertExternalObject.run(e.type,e.provider,e.project_id,e.run_id??null,e.external_id,e.url??null,e.status??null,e.metadata??null,e.last_seen_at??null,O()).changes===1;return{row:this.stmts.findExternalObjectByUnique.get(e.provider,e.type,e.external_id),inserted:n}}insertExternalSignal(e){let r=this.stmts.insertExternalSignal.run(e.object_id,e.kind,e.source??null,e.occurred_at??null,e.payload??null,e.signal_hash??null,null,O()),n=r.changes===1;return{row:e.signal_hash===void 0||e.signal_hash===null?this.stmts.getExternalSignal.get(r.lastInsertRowid):this.stmts.findExternalSignalByUnique.get(e.object_id,e.kind,e.signal_hash),inserted:n}}raiseAttention(e){let r=this.stmts.insertAttention.run(e.kind,e.severity??"warn",e.project_id??null,e.run_id??null,e.external_object_id??null,e.requires_user===!0?1:0,e.payload??null,O());return this.stmts.getAttention.get(r.lastInsertRowid)}acknowledgeAttention(e){return this.stmts.ackAttention.run(O(),e),this.stmts.getAttention.get(e)??null}upsertDurableMemory(e){let r=O();return this.stmts.upsertDurableMemory.run(e.project_id,e.type,e.name,e.description??null,e.body,r,r),this.stmts.getDurableMemoryByName.get(e.project_id,e.name)}getDurableMemoryByName(e,r){return this.stmts.getDurableMemoryByName.get(e,r)??null}deleteDurableMemory(e,r){return this.stmts.deleteDurableMemory.run(e,r).changes>0}listDurableMemory(e,r){return r!==void 0?this.stmts.listDurableMemoryByType.all(e,r):this.stmts.listDurableMemory.all(e)}indexDurableMemory(e,r){return r!==void 0&&r.length>0?this.stmts.listDurableMemory.all(e).filter(s=>r.includes(s.type)).map(({name:s,description:o,type:i,updated_at:a})=>({name:s,description:o,type:i,updated_at:a})):this.stmts.listDurableMemory.all(e).map(({name:n,description:s,type:o,updated_at:i})=>({name:n,description:s,type:o,updated_at:i}))}recordSessionSize(e){let r=this.stmts.insertSessionSize.run(e.team_name,e.alias,e.sessionid,e.input_tokens??null,e.cache_tokens??null,e.output_tokens??null,e.total_tokens??null,e.observed_at??O());return this.stmts.getSessionSize.get(r.lastInsertRowid)}latestSessionSizes(){return this.stmts.latestSessionSizes.all()}sessionSizeHistory(e,r,n=20){return this.stmts.sessionSizeHistory.all(e,r,n)}insertSessionEvent(e){let r=this.stmts.insertSessionEvent.run(e.run_id,e.step_id??null,e.kind,e.timestamp_ms,e.payload,e.payload_truncated??0,e.overflow_artifact_id??null);return this.stmts.getSessionEvent.get(r.lastInsertRowid)}listSessionEvents(e,r){return r!==void 0?this.stmts.listSessionEventsSince.all(e,r):this.stmts.listSessionEvents.all(e)}listSessionEventsSince(e,r=1e3){return this.stmts.listAllEventsSince.all(e,r)}latestAgentCall(e){let r=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call' ORDER BY id DESC LIMIT 1").get(e);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(e){let r=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call'").all(e),n=0,s=0,o=0;for(let i of r)try{let a=JSON.parse(i.payload);typeof a.tokens_in=="number"&&(n+=a.tokens_in),typeof a.tokens_out=="number"&&(s+=a.tokens_out),o+=1}catch{}return{totalInputTokens:n,totalOutputTokens:s,agentCallCount:o}}addRollupValue(e){this.stmts.upsertRollupStat.run(e.run_id,e.step_id??null,e.metric_kind,e.value,e.bucket_start_ms,e.bucket_end_ms,e.updated_at)}listRollupStats(e){return this.stmts.listRollupStats.all(e)}getRollupCursor(){return this.stmts.getRollupCursor.get("last_event_id")?.value??0}setRollupCursor(e){this.stmts.setRollupCursor.run("last_event_id",e)}insertDriftSignal(e){let r=this.stmts.insertDriftSignal.run(e.team_member_id,e.project_id??null,e.signal_kind,e.severity,e.description,e.detected_at,e.expires_at??null,e.payload??null);return this.stmts.getDriftSignal.get(r.lastInsertRowid)}listDriftSignals(e={}){return e.team_member_id!==void 0&&e.unacked?this.stmts.listUnackedDriftByMember.all(e.team_member_id):e.team_member_id!==void 0?this.stmts.listDriftByMember.all(e.team_member_id):e.project_id!==void 0?this.stmts.listDriftByProject.all(e.project_id):this.stmts.listAllDrift.all()}hasUnackedDriftSignal(e,r,n){return this.stmts.findUnackedDrift.get(e,r??null,n)!==void 0}acknowledgeDriftSignal(e){return this.stmts.ackDriftSignal.run(Date.now(),e),this.stmts.getDriftSignal.get(e)??null}insertInteractiveSession(e){let r=Date.now();return this.stmts.insertInteractiveSession.run(e.run_id,e.step_id,e.state_name,e.status,r,r),this.stmts.getInteractiveSessionByStepId.get(e.step_id)}getInteractiveSessionByStepId(e){return this.stmts.getInteractiveSessionByStepId.get(e)??null}getInteractiveSessionByRunAndState(e,r){return this.stmts.getInteractiveSessionByRunAndState.get(e,r)??null}setInteractiveAgentOutput(e,r,n){this.stmts.setInteractiveAgentOutput.run(r,n,Date.now(),e)}resumeInteractive(e,r,n){return this.resumeInteractiveTxn(e,r,n,O())}resumeEscalation(e,r){return this.resumeEscalationTxn(e,r,O())}}});import{realpathSync as e0}from"node:fs";import{resolve as t0}from"node:path";function Ml(t){let e=t0(t);try{return e0(e)}catch{return e}}var ap=T(()=>{"use strict"});import{platform as lp}from"node:os";function Tt(t){let e=new rs;for(let r of t)e.registerAdapter(r);return e}var rs,Dl=T(()=>{"use strict";ap();rs=class{providers=[];adapters=new Map;register(e){this.providers.push(e)}async listAll(e){let r=[],n=e?.provider?this.providers.filter(i=>i.name===e.provider):this.providers,s=await Promise.all(n.map(i=>i.discoverSessions()));for(let i of s)r.push(...i);let o=r;if(e?.workspace){let i=Ml(e.workspace);o=o.filter(a=>Ml(a.cwd)===i)}if(e?.from){let i=e.from.getTime();o=o.filter(a=>a.modifiedAt.getTime()>=i)}if(e?.to){let i=e.to.getTime();o=o.filter(a=>a.modifiedAt.getTime()<=i)}return o.sort((i,a)=>a.modifiedAt.getTime()-i.modifiedAt.getTime()),e?.limit&&(o=o.slice(0,e.limit)),o}async getSession(e,r){let n=r?this.providers.filter(s=>s.name===r):this.providers;for(let s of n){let o=await s.loadSession(e);if(o)return o}return null}async resolveSession(e,r){let n=await this.resolveSessions(e,r);return n.length===1?n[0]:null}async resolveSessions(e,r){let n=r?this.providers.filter(o=>o.name===r):this.providers,s=[];for(let o of n){let i=await o.resolveSessionPath(e);i&&s.push({provider:o,filePath:i})}return s}getWatchTargets(){let e=lp()==="darwin"||lp()==="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:e,filePattern:s.filePattern});return r}async deleteSession(e,r){let n=await this.resolveSession(e,r);return n?n.provider.deleteSession(e):!1}registerAdapter(e){this.adapters.set(e.name,e),this.providers.push({name:e.name,discoverSessions:()=>e.discover(),loadSession:r=>e.load(r),resolveSessionPath:r=>e.resolvePath(r),deleteSession:r=>e.delete(r),getWatchPaths:()=>e.getWatchPaths?.()??[]})}getAdapter(e){return this.adapters.get(e)}getAllAdapters(){return[...this.adapters.values()]}}});import{createReadStream as cp}from"node:fs";import{createInterface as up}from"node:readline";import{stat as r0}from"node:fs/promises";import{homedir as n0}from"node:os";async function*We(t){let e=cp(t,{encoding:"utf-8"}),r=up({input:e,crlfDelay:1/0});try{for await(let n of r){let s=n.trim();if(s)try{yield JSON.parse(s)}catch{}}}finally{e.destroy()}}async function Ce(t,e){let r=[],n=cp(t,{encoding:"utf-8"}),s=up({input:n,crlfDelay:1/0});try{for await(let o of s){let i=o.trim();if(i){try{r.push(JSON.parse(i))}catch{}if(r.length>=e)break}}}finally{s.close(),n.destroy()}return r}async function Re(t){let e=await r0(t);return{createdAt:e.birthtime,modifiedAt:e.mtime}}function me(t){return t.replace(/\\n/g,`
1291
- `).replace(/\\t/g," ").replace(/\\r/g,"\r")}function G(t,e){return t.length<=e?t:t.slice(0,e-3)+"..."}var Se,rr=T(()=>{"use strict";Se=n0()});import{readdir as wo,stat as dp,unlink as s0}from"node:fs/promises";import{join as Kr,basename as fp}from"node:path";function o0(t){return t==="file-history-snapshot"||t==="progress"||t==="system"||t==="queue-operation"}function i0(t){if(t.type==="system"){let e=t.message?.content;if(typeof e=="string"&&e.trim())return me(e.trim());if(e!==void 0)return JSON.stringify(e,null,2)}return t.type==="progress"&&t.data!==void 0?JSON.stringify(t.data,null,2):JSON.stringify(t,null,2)}async function mp(t){let e=0,r=0,n=0,s=0,o=0,i=0,a;for await(let l of We(t))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;e++}}else if(l.type==="assistant"&&l.message){let c=l.message.content;if(Array.isArray(c))for(let d of c)d.type==="text"&&e++;let u=l.message.usage;if(u){let d=u.input_tokens||0,f=u.cache_creation_input_tokens||0,m=u.cache_read_input_tokens||0,p=u.output_tokens||0;r+=d+f+m,n+=m,s+=f,o+=p;let h=d+f+m;h&&(i=h),a={inputTokens:d,cacheWriteInputTokens:f,cachedInputTokens:m,outputTokens:p}}}}return{messageCount:e,totalInputTokens:r,totalCacheReadInputTokens:n,totalCacheWriteInputTokens:s,totalOutputTokens:o,lastInputTokens:i,lastTokenUsage:a}}var Eo,pp=T(()=>{"use strict";rr();Eo=class{name="claude";claudeDir;projectsDir;constructor(e={}){this.claudeDir=e.claudeDir||Kr(Se,".claude"),this.projectsDir=Kr(this.claudeDir,"projects")}getWatchPaths(){return[{directory:this.projectsDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await wo(this.projectsDir)}catch{return e}for(let n of r){let s=Kr(this.projectsDir,n);if(!(await dp(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await wo(s)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=fp(a,".jsonl");if(!/^[0-9a-f]{8}-/.test(l))continue;let c=Kr(s,a);try{let u=await this.extractSummary(c,l);u&&e.push(u)}catch{}}}return e}async extractSummary(e,r){let n=await Ce(e,50),s=await Re(e),o="",i,a,l,c,u,d;for(let m of n)if(!o0(m.type)&&(!o&&m.cwd&&(o=m.cwd),!i&&m.slug&&(i=m.slug),!a&&m.version&&(a=m.version),!d&&m.timestamp&&(d=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=G(p.trim(),80)),u=G(p.trim(),80)}}if(!o)return null;let f=await mp(e);return{provider:"claude",sessionId:r,slug:i,cwd:o,createdAt:d||s.createdAt,modifiedAt:s.modifiedAt,model:l,cliVersion:a,startCommand:"claude",firstUserMessage:c,lastUserMessage:u,messageCount:f.messageCount,filePath:e,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(e){let r=await this.resolveSessionFile(e);if(!r)return null;let n=await Re(r),s=[],o="",i,a,l,c,u,d,f,m=e;for await(let h of We(r))if(h.type!=="file-history-snapshot"&&!h.isSidechain){if(!o&&h.cwd&&(o=h.cwd),!i&&h.slug&&(i=h.slug),!a&&h.version&&(a=h.version),!c&&h.gitBranch&&(c=h.gitBranch),!f&&h.timestamp&&(f=new Date(h.timestamp)),h.sessionId&&(m=h.sessionId),h.type==="system"||h.type==="progress"||h.type==="queue-operation"){s.push({role:"system",timestamp:new Date(h.timestamp||0),content:i0(h)});continue}if(h.type==="user"&&h.message){if(h.isMeta)continue;let g=new Date(h.timestamp||0),_=h.message.content;if(typeof _=="string"){if(_.includes("<command-name>")||_.includes("<local-command-"))continue;u||(u=G(_.trim(),80)),d=G(_.trim(),80),s.push({role:"user",timestamp:g,content:me(_.trim())})}else if(Array.isArray(_)){for(let S of _)if(S.type==="tool_result"){let w=typeof S.content=="string"?me(S.content):JSON.stringify(S.content);s.push({role:"tool_result",timestamp:g,content:w,toolCallId:S.tool_use_id})}}}if(h.type==="assistant"&&h.message){h.message.model&&(l=h.message.model);let g=new Date(h.timestamp||0),_=h.message.content;if(Array.isArray(_))for(let S of _)S.type==="text"&&S.text?s.push({role:"assistant",timestamp:g,content:me(S.text),model:h.message.model}):S.type==="tool_use"?s.push({role:"tool_use",timestamp:g,content:S.name||"unknown tool",toolName:S.name,toolInput:JSON.stringify(S.input,null,2),toolCallId:S.id,model:h.message.model}):S.type==="thinking"&&S.thinking&&s.push({role:"thinking",timestamp:g,content:S.thinking})}}if(!o)return null;let p=await mp(r);return{provider:"claude",sessionId:m,slug:i,cwd:o,createdAt:f||n.createdAt,modifiedAt:n.modifiedAt,model:l,cliVersion:a,startCommand:"claude",gitBranch:c,firstUserMessage:u,lastUserMessage:d,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(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await s0(r),!0):!1}async resolveSessionFile(e){let r;try{r=await wo(this.projectsDir)}catch{return null}let n=[];for(let i of r){let a=Kr(this.projectsDir,i);if(!(await dp(a).catch(()=>null))?.isDirectory())continue;let c;try{c=await wo(a)}catch{continue}for(let u of c){if(!u.endsWith(".jsonl"))continue;let d=fp(u,".jsonl");/^[0-9a-f]{8}-/.test(d)&&n.push({filePath:Kr(a,u),fileSessionId:d})}}let s=n.find(i=>i.fileSessionId===e);if(s)return s.filePath;let o=n.filter(i=>i.fileSessionId.startsWith(e));if(o.length===1)return o[0].filePath;for(let i of n){let a=await Ce(i.filePath,20);for(let l of a)if(l.slug&&l.slug===e)return i.filePath}return null}}});function To(t){return"'"+t.replace(/'/g,"'\\''")+"'"}function l0(t,e,r){if(!r)return"";let n=t.tools[e]??Pl[e],s=n?.profiles?.[r]?.flags??Pl[e]?.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 "${e}"`)}function hp(t,e){return!!t.tools[e]}function _p(t,e,r,n,s){let o=t.tools[e]??Pl[e],i;if(o?.agent){let l=To(n);i=o.agent.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,l)}else{let l=a0[e];if(!l)throw new Error(`No agent command configured for tool "${e}"`);let c=l.argv.map(u=>u.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,n));if(l.mode==="stdin"){let u=c.map(To).join(" ");i=`printf '%s\\n' ${To(n)} | ${u}`}else i=c.map(To).join(" ")}let a=l0(t,e,s);return a&&(i+=" "+a),i}var Pl,a0,gp=T(()=>{"use strict";Pl={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:""}}}},a0={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 yp(t=process.env){let e=t.LMCTL_ONE_SHOT_TIMEOUT_MS;if(!e)return 6e5;let r=Number(e);return!Number.isFinite(r)||r<=0?6e5:r}var wp=T(()=>{"use strict"});var c0,we,bo,bt=T(()=>{"use strict";c0="ACK: waiting for explicit lmctl task.",we=`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: ${c0}`,bo=`send this exact lmctl seed instruction: "${we}"`});function Mt(t,e){let r={...t??process.env,PWD:e};return delete r.OLDPWD,r}function u0(t,e){return e===void 0||e.length===0?t:{...t??process.env,[ns]:e}}function Be(t,e,r){return u0(Mt(t,e),r)}var ns,lt=T(()=>{"use strict";ns="LMCTL_SELF_SESSIONID"});import{spawn as Ep}from"node:child_process";import{mkdirSync as d0}from"node:fs";var Fl,$e,Dt=T(()=>{"use strict";gp();wp();bt();lt();Fl=class t extends Error{cancelReason;constructor(e,r){super(e),this.name="TurnAbortError",this.cancelReason=r,Object.setPrototypeOf(this,t.prototype)}},$e=class t{name;capabilities;injection;provider;binary;seedArgs;seedStdin;resumeTemplate;startTemplate;transportFn;constructor(e){this.name=e.provider.name,this.provider=e.provider,this.capabilities=e.capabilities,this.injection=e.injection,this.binary=e.binary,this.seedArgs=e.seedArgs,this.seedStdin=e.seedStdin,this.resumeTemplate=e.resumeTemplate,this.startTemplate=e.startTemplate,this.transportFn=e.transport}discover(){return this.provider.discoverSessions()}load(e){return this.provider.loadSession(e)}resolvePath(e){return this.provider.resolveSessionPath(e)}delete(e){return this.provider.deleteSession(e)}getWatchPaths(){return this.provider.getWatchPaths?.()??[]}seedArgsFor(e){let r=e?.prompt;return r===void 0?this.seedArgs:this.seedArgs.map(n=>n===we?r:n)}seed(e,r){return d0(e,{recursive:!0}),new Promise(n=>{let s;try{s=Ep(this.binary,this.seedArgsFor(r),{cwd:e,env:Mt(void 0,e),stdio:["pipe","pipe","pipe"],timeout:6e4})}catch(a){return n({success:!1,error:a instanceof Error?a.message:String(a)})}let o="";s.stderr?.on("data",a=>{o+=a.toString()});let i=r?.prompt!==void 0&&this.seedStdin!==void 0?`${r.prompt}
1290
+ `),...Km(t),...Jm(t)}}function QI(t,e){return e===void 0?{resumed:!1,reason:t}:{resumed:!1,reason:t,valid:e}}var Cl,Ue=T(()=>{"use strict";$l();Xm();Vm();Zm();ep();jl();ts();Cl=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;tryAcquireAgentInflightTxn;recvMailboxMessagesTxn;constructor(e){e.pragma("foreign_keys = ON"),this.db=e,this.stmts=ZI(e),this.claimTxn=e.transaction((r,n,s)=>{let o=this.stmts.selectClaimableJob.get(s,s,s);return o===void 0||this.stmts.claimJob.run(r,n,s,o.id,s,s,s).changes!==1?null:this.getJob(o.id)}),this.claimWithConcurrencyTxn=e.transaction((r,n,s,o)=>{let i=this.stmts.selectClaimableJobs.all(s,s,s);for(let a of i){let l=this.getJob(a.id);if(l===null)continue;let c=o(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=e.transaction((r,n,s,o,i)=>{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>=o)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<=o,u=a.status==="running"&&a.locked_until!==null&&a.locked_until<o;if(!c&&!u)return{claimed:!1,reason:"not_claimable",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let d=i(a);if(d.concurrency_key!==null&&(a.concurrency_key_resolved!==d.concurrency_key&&this.stmts.setJobConcurrencyKey.run(d.concurrency_key,a.id),(this.stmts.countRunningByConcurrencyKey.get(d.concurrency_key,o,a.id)?.count??0)>=Math.max(1,d.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,o,a.id,o,o,o).changes!==1){let p=this.getJob(a.id);return{claimed:!1,reason:p?.locked_until!==null&&p?.locked_until!==void 0&&p.locked_until>=o?"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=e.transaction((r,n,s)=>QI("state_not_found")),this.resumeInteractiveTxn=e.transaction((r,n,s,o)=>{let i=this.getInteractiveSessionByStepId(r);if(i===null)return{resumed:!1,reason:"not_found"};if(i.status!=="waiting_operator")return{resumed:!1,reason:"not_waiting_operator"};let a=this.getRun(i.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(),i.id),this.stmts.resumeRunState.run(i.state_name,a.id),this.stmts.requeuePausedJob.run(o,a.job_id),{resumed:!0,session:this.getInteractiveSessionByStepId(r),run:this.getRun(a.id),job:this.getJob(a.job_id)}}),this.resumeEscalationTxn=e.transaction((r,n,s)=>{let o=this.stmts.getAttention.get(r);if(o===void 0)return{resumed:!1,reason:"not_found"};if(o.kind!==go)return{resumed:!1,reason:"wrong_kind"};if(o.acknowledged_at!==null)return{resumed:!1,reason:"already_acked"};if(o.run_id===null)return{resumed:!1,reason:"run_not_found"};let i=null,a=[];if(o.payload!==null)try{let u=JSON.parse(o.payload);u.step!==void 0&&typeof u.step.id=="string"&&u.step.id.length>0&&(i=u.step.id),Array.isArray(u.declared_outcomes)&&(a=u.declared_outcomes.filter(d=>typeof d=="string"))}catch{}if(i===null)return{resumed:!1,reason:"no_step"};let l=this.getRun(o.run_id);if(l===null)return{resumed:!1,reason:"run_not_found"};if(n!==es&&!a.includes(n))return{resumed:!1,reason:rp};let c={};if(l.pending_escalation_decision!==null)try{let u=JSON.parse(l.pending_escalation_decision);u!==null&&typeof u=="object"&&!Array.isArray(u)&&(c=u)}catch{c={}}return c[i]=n,this.stmts.setRunPendingEscalationDecision.run(JSON.stringify(c),l.id),this.stmts.resumeRunState.run(i,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,o=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}),i=o!==void 0?{acquired:!0,current:o}:{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"),i}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}},this.recvMailboxMessagesTxn=e.transaction((r,n)=>{let s=this.stmts.listAllMailboxMessagesForReceiver.all(r,n);for(let o of s)this.stmts.deleteMailboxMessage.run(o.id);return s})}close(){this.db.close()}query(e,...r){let n=e.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(e).all(...r)}insertWorkflow(e){op(e.name,e.definition,i=>this.getWorkflowByName(i));let r=this.stmts.insertWorkflow.run(e.name,e.version??1,e.definition_schema_version??1,e.definition,O()),n=this.getWorkflow(Number(r.lastInsertRowid)),s=this.stmts.insertWorkflowVersion.run(n.id,n.version,e.definition,e.author??null,O());this.stmts.updateWorkflowActiveVersion.run(s.lastInsertRowid,n.id),(e.source_uri!=null||e.source_sha256!=null)&&this.stmts.setWorkflowSource.run(e.source_uri??null,e.source_sha256??null,n.id);let o=this.getWorkflow(n.id);return this.syncWorkflowTriggers(n.id,e.definition),o}upsertWorkflow(e){op(e.name,e.definition,i=>this.getWorkflowByName(i));let r=this.getWorkflowByName(e.name);if(r===null)return this.insertWorkflow({name:e.name,definition_schema_version:e.definition_schema_version,definition:e.definition,author:e.author,source_uri:e.source_uri,source_sha256:e.source_sha256});let s=(this.stmts.getLatestWorkflowVersion.get(r.id)?.version??r.version)+1,o=this.stmts.insertWorkflowVersion.run(r.id,s,e.definition,e.author??null,O());return this.stmts.updateWorkflowActiveVersionDefinitionAndVersion.run(Number(o.lastInsertRowid),e.definition,e.definition_schema_version??r.definition_schema_version,s,r.id),(e.source_uri!=null||e.source_sha256!=null)&&this.stmts.setWorkflowSource.run(e.source_uri??null,e.source_sha256??null,r.id),this.syncWorkflowTriggers(r.id,e.definition),this.getWorkflow(r.id)}insertCompositionUnit(e){this.stmts.insertCompositionUnit.run(e.name,e.version,e.lang,e.source,e.source_sha,e.compiled_workflow_version_id,O())}getWorkflow(e){return this.stmts.getWorkflow.get(e)??null}getWorkflowByName(e,r){return(r===void 0?this.stmts.findWorkflowLatest.get(e):this.stmts.findWorkflowVersion.get(e,r))??null}findWorkflowByName(e,r){return this.getWorkflowByName(e,r)}insertWorkflowVersion(e,r,n){let o=(this.stmts.getLatestWorkflowVersion.get(e)?.version??0)+1,i=this.stmts.insertWorkflowVersion.run(e,o,r,n??null,O());return this.stmts.getWorkflowVersion.get(i.lastInsertRowid)}activateWorkflowVersion(e,r){let n=this.getWorkflowVersionById(r);if(n===null||n.workflow_id!==e)return null;let s=1;try{let o=JSON.parse(n.definition);typeof o.definition_schema_version=="number"&&(s=o.definition_schema_version)}catch{}return this.stmts.updateWorkflowActiveVersionAndDefinition.run(r,n.definition,s,e),this.syncWorkflowTriggers(e,n.definition),this.getWorkflow(e)}getWorkflowVersionById(e){return this.stmts.getWorkflowVersion.get(e)??null}listWorkflowVersions(e){return this.stmts.listWorkflowVersions.all(e)}upsertTriggerInstance(e){return this.stmts.upsertTriggerInstance.run(e.workflow_id,e.trigger_id,e.trigger_type,e.parameters,e.enabled===!1?0:1,O()),this.stmts.getTriggerInstanceByWorkflowAndId.get(e.workflow_id,e.trigger_id)}listTriggerInstancesForWorkflow(e){return this.stmts.listTriggerInstancesForWorkflow.all(e)}listEnabledTriggerInstances(){return this.stmts.listEnabledTriggerInstances.all()}setTriggerCursor(e,r){return this.stmts.setTriggerCursor.run(r,O(),e),this.stmts.getTriggerInstance.get(e)??null}setTriggerFailure(e,r){return this.stmts.setTriggerFailure.run(O(),r,e),this.stmts.getTriggerInstance.get(e)??null}syncWorkflowTriggers(e,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 o of s){if(o===null||typeof o!="object"||Array.isArray(o))continue;let i=o;typeof i.id!="string"||i.id.length===0||typeof i.type!="string"||i.type.length===0||this.upsertTriggerInstance({workflow_id:e,trigger_id:i.id,trigger_type:i.type,parameters:JSON.stringify(i.parameters??{})})}}insertTeam(e){let r=this.stmts.insertTeam.run(e.name,O());return this.stmts.getTeam.get(r.lastInsertRowid)}getTeam(e){return this.stmts.getTeam.get(e)??null}findTeamByName(e){return this.stmts.findTeamByName.get(e)??null}listTeams(){return this.stmts.listTeams.all()}insertTeamMember(e){let r=this.stmts.insertTeamMember.run(e.team_id,e.alias,e.role??"agent",e.provider,e.model??null,e.sessionid??null,e.sessiondir,O());return this.stmts.getTeamMember.get(r.lastInsertRowid)}listTeamMembers(e){return this.stmts.listTeamMembers.all(e)}findTeamMemberByAlias(e,r){return this.stmts.findTeamMemberByAlias.get(e,r)??null}updateTeamMemberSession(e,r){return this.stmts.updateTeamMemberSession.run(r,e),this.stmts.getTeamMember.get(e)??null}setMemberState(e,r,n){return this.stmts.setMemberState.run(r,n??null,O(),e),this.stmts.getTeamMember.get(e)??null}listMembersInState(e){return this.stmts.listMembersInState.all(e)}setMemberPromptSnapshot(e,r){return this.stmts.setMemberPromptSnapshot.run(r,e),this.stmts.getTeamMember.get(e)??null}setMemberProviderResolved(e,r){return this.stmts.setMemberProviderResolved.run(r,e),this.stmts.getTeamMember.get(e)??null}setMemberRolePrompt(e,r){return this.stmts.setMemberRolePrompt.run(r,e),this.stmts.getTeamMember.get(e)??null}updateTeamMemberMeta(e,r){let n=this.stmts.getTeamMember.get(e);if(n===void 0)return null;let s=Object.prototype.hasOwnProperty.call(r,"role_prompt"),o=Object.prototype.hasOwnProperty.call(r,"model"),i=Object.prototype.hasOwnProperty.call(r,"provider");return this.stmts.updateTeamMemberMeta.run(s?r.role_prompt??null:n.role_prompt,o?r.model??null:n.model,i?r.provider??n.provider:n.provider,e),this.stmts.getTeamMember.get(e)??null}insertTeamMemberCompanion(e){let r=this.stmts.insertTeamMemberCompanion.run(e.interpreter_id,e.companion_id,O());return this.stmts.getTeamMemberCompanion.get(r.lastInsertRowid)}insertProject(e){let r=this.stmts.insertProject.run(e.name,e.description??null,e.local_path,e.workflow_name,e.team_id,e.default_branch??null,e.intake_config??null,e.test_argv??null,e.test_command??null,e.durable_memory_mode??"folder",O());return this.stmts.getProject.get(r.lastInsertRowid)}listProjects(){return this.stmts.listProjects.all()}getProject(e){return this.stmts.getProject.get(e)??null}findProjectByName(e){return this.stmts.findProjectByName.get(e)??null}setProjectIntakeConfig(e,r){return this.stmts.setProjectIntakeConfig.run(r,e),this.stmts.getProject.get(e)??null}updateProjectSettings(e,r){let n=this.stmts.getProject.get(e);if(n===void 0)return null;let s=Object.prototype.hasOwnProperty.call(r,"local_path"),o=Object.prototype.hasOwnProperty.call(r,"durable_memory_mode"),i=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,o?r.durable_memory_mode:n.durable_memory_mode,i?r.default_branch??null:n.default_branch,a?r.intake_config??null:n.intake_config,e),this.stmts.getProject.get(e)??null}listProjectsWithIntakeEnabled(){return this.stmts.listProjectsWithIntakeConfig.all().filter(e=>{if(e.intake_config===null)return!1;try{let r=JSON.parse(e.intake_config);return typeof r=="object"&&r!==null&&!Array.isArray(r)&&r.scan_github_issues===!0}catch{return!1}})}getProjectByJob(e){return this.stmts.getProjectByJob.get(e)??null}insertProjectWorkflow(e){let r=e.condition??null,n=this.stmts.findProjectWorkflowUnique.get(e.project_id,e.workflow_id,r);if(n!==void 0)return n;let s=this.stmts.insertProjectWorkflow.run(e.project_id,e.workflow_id,r,e.parameters_override??null,e.enabled===!1?0:1,e.priority??100,O());return s.changes===1?this.stmts.getProjectWorkflow.get(s.lastInsertRowid):this.stmts.findProjectWorkflowUnique.get(e.project_id,e.workflow_id,r)}getProjectWorkflow(e){return this.stmts.getProjectWorkflow.get(e)??null}listProjectWorkflows(e,r={}){return r.enabled_only===!0?this.stmts.listEnabledProjectWorkflows.all(e):this.stmts.listProjectWorkflows.all(e)}removeProjectWorkflow(e){return this.stmts.removeProjectWorkflow.run(e).changes>0}setProjectWorkflowEnabled(e,r){return this.stmts.setProjectWorkflowEnabled.run(r?1:0,e),this.getProjectWorkflow(e)}createIssue(e){let r=O(),n=this.stmts.createIssue.run(e.project_id,e.title,e.body,e.severity??"medium",e.labels??null,e.ai_test_path??null,e.source_run_id??null,r,r);return this.stmts.getIssue.get(n.lastInsertRowid)}getIssue(e){return this.stmts.getIssue.get(e)??null}listIssues(e,r={}){return this.stmts.listIssuesForProject.all(e).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(e,r){return this.stmts.claimNextIssue.get(r,O(),e)??null}claimIssue(e,r){return this.stmts.claimIssue.get(r,O(),e)??null}closeIssue(e,r,n){let s=O(),o=this.stmts.closeIssue.get(r,n??null,s,s,e);if(o===void 0)throw new Error(`issue not found: ${e}`);return o}reopenIssue(e,r){let n=this.stmts.reopenIssue.get(r,O(),e);if(n===void 0)throw this.getIssue(e)===null?new Error(`issue not found: ${e}`):new Error(`issue ${e} is not closed`);return n}updateIssue(e,r){let n=this.getIssue(e);if(n===null)throw new Error(`issue not found: ${e}`);let s=Object.prototype.hasOwnProperty.call(r,"labels"),o=Object.prototype.hasOwnProperty.call(r,"ai_test_path"),i=this.stmts.updateIssue.get(r.title??n.title,r.body??n.body,r.severity??n.severity,s?r.labels??null:n.labels,o?r.ai_test_path??null:n.ai_test_path,O(),e);if(i===void 0)throw new Error(`issue not found: ${e}`);return i}listWorkflows(){return this.stmts.listWorkflows.all()}getOrCreateWebuiSession(e,r){let n=this.stmts.getWebuiSession.get(e);if(n!==void 0)return n;let s=O();return this.stmts.insertWebuiSession.run(e,r,"N1",null,null,null,null,"authenticated",s,s),this.stmts.getWebuiSession.get(e)}getWebuiSession(e){return this.stmts.getWebuiSession.get(e)??null}updateWebuiSessionTransition(e,r,n,s,o){if(this.stmts.updateWebuiSessionTransition.run(r,n,s,o,O(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}setWebuiSessionChatbot(e,r){if(this.stmts.setWebuiSessionChatbot.run(r,O(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}createChatbotSession(e,r){let n=sp(),s=O();return this.stmts.insertChatbotSession.run(n,e,r??null,s,s,"active"),this.stmts.getChatbotSession.get(n)}getChatbotSession(e){return this.stmts.getChatbotSession.get(e)??null}listChatbotSessions(e){return this.stmts.listChatbotSessionsForUser.all(e)}appendChatbotMessage(e,r,n,s){let o=O(),i=this.stmts.insertChatbotMessage.run(e,r,n,s??null,o);return this.stmts.touchChatbotSession.run(o,e),this.stmts.getChatbotMessage.get(i.lastInsertRowid)}listChatbotMessages(e){return this.stmts.listChatbotMessages.all(e)}getConfig(e){return this.stmts.getConfig.get(e)?.value??null}setConfig(e,r){this.stmts.upsertConfig.run(e,r,O())}getConfigAll(){let e=this.stmts.listConfig.all(),r={};for(let n of e)r[n.key]=n.value;return r}enqueueJob(e){let r=this.stmts.insertJob.run(e.project_id,e.workflow_id_override??null,e.source,e.source_ref??null,e.payload??null,e.priority??0,e.available_at??O(),e.dedupe_key??null,e.concurrency_key??null,O());if(r.changes===1)return this.stmts.getJob.get(r.lastInsertRowid);if(e.dedupe_key===void 0||e.dedupe_key===null)throw new Error("job insert ignored without dedupe key");return this.stmts.findJobByDedupe.get(e.source,e.dedupe_key)}claimNextJob(e){let r=O(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimTxn(e.worker_id,n,r)}claimNextJobWithConcurrency(e){let r=O(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimWithConcurrencyTxn(e.worker_id,n,r,e.evaluator)}claimJobByIdWithConcurrency(e){let r=O(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimByIdWithConcurrencyTxn(e.job_id,e.worker_id,n,r,e.evaluator)}releaseJob(e,r,n){let s=r==="queued"||r==="running"?null:O();return this.stmts.releaseJob.run(r,n??null,s,e),this.getJob(e)}getJob(e){return this.stmts.getJob.get(e)??null}findJobBySourceAndDedupe(e,r){return this.stmts.findJobByDedupe.get(e,r)??null}insertRun(e){let r=this.getWorkflow(e.workflow_id);if(r===null)throw new Error(`workflow not found: ${e.workflow_id}`);let n=this.stmts.insertRun.run(e.job_id,e.workflow_id,e.team_id,e.current_state??null,r.active_version_id,e.parent_run_id??null,O()),s=this.stmts.getRun.get(n.lastInsertRowid);return(e.parent_run_id===void 0||e.parent_run_id===null)&&this.stmts.setJobRun.run(s.id,e.job_id),s}setJobRun(e,r){return this.stmts.setJobRun.run(r,e),this.getJob(e)}insertPromptDispatch(e){return this.stmts.insertPromptDispatch.run(e.prompt_id,e.project_id,e.job_id,e.text,e.context_json??null,O()),this.stmts.getPromptDispatch.get(e.prompt_id)}getPromptDispatch(e){return this.stmts.getPromptDispatch.get(e)??null}setPromptDispatchCompleted(e,r){return this.stmts.setPromptDispatchCompleted.run(r??O(),e),this.getPromptDispatch(e)}getWorkspace(e){return this.stmts.getWorkspace.get(e)??null}ensureWorkspace(e={}){let r=e.id??"default";this.stmts.ensureWorkspace.run(r,e.name??"Default workspace",e.idleThresholdMs??6e5,O());let n=this.getWorkspace(r);if(n===null)throw new Error(`workspace ${r} missing after upsert`);return n}listWebProjectsActive(e){return this.stmts.listWebProjectsActive.all(e)}getWebProject(e){return this.stmts.getWebProject.get(e)??null}insertWebProject(e){let r=O(),n=this.stmts.insertWebProject.run(e.workspace_id,e.name,e.repo_path,e.config_json??null,e.linked_v4_project_id??null,r,r),s=Number(n.lastInsertRowid),o=this.getWebProject(s);if(o===null)throw new Error(`web_project ${s} missing after insert`);return o}updateWebProject(e){let r=this.getWebProject(e.id);return r===null||r.deleted_at!==null?null:(this.stmts.updateWebProject.run(e.name??r.name,e.config_json===void 0?r.config_json:e.config_json,O(),e.id),this.getWebProject(e.id))}softDeleteWebProject(e){return this.stmts.softDeleteWebProject.run(O(),e).changes===1}loadMailboxCursor(e,r){return this.stmts.loadMailboxCursor.get(e,r)??null}saveMailboxCursor(e){this.stmts.saveMailboxCursor.run(e.user_id,e.mailbox_key,e.last_processed_version_id,e.last_processed_seq??null,e.last_processed_at)}addUsage(e){this.stmts.addUsage.run(e.user_id,e.device_id,e.period,e.put,e.get,e.list,e.updated_at)}loadUsage(e,r,n){return this.stmts.loadUsage.get(e,r,n)??null}sumUsageForPeriod(e,r){let n=this.stmts.sumUsageForPeriod.get(e,r);return{put:n?.put??0,get:n?.get??0,list:n?.list??0}}upsertRootTeam(e){this.stmts.upsertRootTeam.run(e.teamfile_path,e.name,e.raw_text,e.raw_sha256,e.registered_at,e.last_seeded_at)}getRootTeam(e){return this.stmts.getRootTeam.get(e)??null}listRootTeams(){return this.stmts.listRootTeams.all()}insertTeamChatLog(e){let r=this.stmts.insertTeamChatLog.run(e.root_teamfile,e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias,e.message,e.response,e.origin,e.status,e.error_detail,e.truncated,e.created_at);return Number(r.lastInsertRowid)}listTeamChatLog(e){return this.stmts.listTeamChatLog.all(e)}listTeamChatLogSinceId(e,r=500){return this.stmts.listTeamChatLogSinceId.all(e,Math.max(1,Math.trunc(r)))}getMaxTeamChatLogId(){return this.stmts.getMaxTeamChatLogId.get()?.max_id??0}loadTeamChatLogCursor(e){return this.stmts.loadTeamChatLogCursor.get(e)??null}saveTeamChatLogCursor(e){this.stmts.saveTeamChatLogCursor.run(e.cursor_key,e.last_pushed_id,e.updated_at)}startTrackedInvocation(e){let r=e.started_at??O(),n=e.holder_host??rs(),s=e.last_heartbeat_at??r,o=this.stmts.insertTrackedInvocation.run(e.kind,e.origin,e.scope_teamfile??null,e.from_identity,e.target_teamfile??null,e.target_alias??null,e.root_teamfile??null,e.cwd??null,Ct(e.command),r,e.holder_pid??null,n,s,Ct(e.meta),e.launch_source??e.kind);return this.getTrackedInvocation(Number(o.lastInsertRowid))}getTrackedInvocation(e){return this.stmts.getTrackedInvocation.get(e)??null}listAllRunningTrackedInvocations(){return this.stmts.listAllRunningTrackedInvocations.all()}finishTrackedInvocation(e,r){let n=r.ended_at??O();return this.stmts.finishTrackedInvocation.run(r.status,n,r.exit_code??null,r.signal??null,Ct(r.result_summary),Ct(r.error),r.team_chat_log_id??null,Ct(r.meta),n,e).changes!==1?null:this.getTrackedInvocation(e)}reclaimTrackedInvocationIfUnchanged(e,r,n){let s=n.ended_at??O();return this.stmts.reclaimTrackedInvocationIfUnchanged.run(n.status,s,n.exit_code??null,n.signal??null,Ct(n.result_summary),Ct(n.error),n.team_chat_log_id??null,Ct(n.meta),s,e,r.holder_pid,r.holder_host,r.started_at,r.last_heartbeat_at).changes!==1?null:this.getTrackedInvocation(e)}heartbeatTrackedInvocation(e,r=O()){return this.stmts.heartbeatTrackedInvocation.run(r,e).changes!==1?null:this.getTrackedInvocation(e)}listClaimableTerminalTrackedInvocations(e){let r=["status IN ('done', 'error', 'busy', 'cancelled')","ended_at IS NOT NULL","notified_by IS NULL"],n=[];e.from!==void 0&&(r.push("from_identity = ?"),n.push(e.from)),e.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(e.scope_teamfile));let s=Math.max(1,Math.min(1e3,Math.trunc(e.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(e,r,n=O()){return this.stmts.claimTrackedInvocationNotification.run(r,n,e).changes!==1?null:this.getTrackedInvocation(e)}listTrackedInvocations(e={}){let r=[],n=[];e.from!==void 0&&(r.push("from_identity = ?"),n.push(e.from)),e.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(e.scope_teamfile)),e.status!==void 0&&(r.push("status = ?"),n.push(e.status)),e.kind!==void 0&&(r.push("kind = ?"),n.push(e.kind)),e.origin!==void 0&&(r.push("origin = ?"),n.push(e.origin));let s=Math.max(1,Math.min(1e3,Math.trunc(e.limit??100)));n.push(s);let o=r.length===0?"":` WHERE ${r.join(" AND ")}`;return this.db.prepare(`SELECT * FROM tracked_invocation${o} ORDER BY started_at DESC, id DESC LIMIT ?`).all(...n)}maxTrackedInvocationId(e={}){let r=[],n=[];e.from!==void 0&&(r.push("from_identity = ?"),n.push(e.from)),e.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(e.scope_teamfile));let s=r.length===0?"":` WHERE ${r.join(" AND ")}`,o=this.db.prepare(`SELECT COALESCE(MAX(id), 0) AS max_id FROM tracked_invocation${s}`).get(...n);return Number(o?.max_id??0)}listRunningTrackedInvocations(e={}){return this.listTrackedInvocations({...e,status:"running"})}enqueueMail(e){return this.sendMailboxMessage(e)}sendMailboxMessage(e){let r=this.stmts.insertMailboxMessage.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile??null,e.sender_alias??null,e.root_teamfile??null,Ll(e.payload),e.created_at??O(),e.remote_transport??null,e.remote_message_id??null,e.remote_thread_id??null,e.meta??null);return this.getMailboxMessage(Number(r.lastInsertRowid))}listEnqueuedMailFromSender(e,r,n,s){return this.stmts.listEnqueuedMailFromSender.all(e,r,n,s)}markMailDelivered(e,r,n){let s=[...new Set(e.map(i=>Math.trunc(i)).filter(i=>Number.isInteger(i)&&i>0))];if(s.length===0)return 0;let o=Ll(r);this.db.exec("BEGIN IMMEDIATE");try{let i=0;for(let a of s)i+=this.stmts.markMailboxMessageDelivered.run(n,o,a).changes;return this.db.exec("COMMIT"),i}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}claimMailForDelivery(e,r,n=process.pid,s=rs()){let o=[...new Set(e.map(i=>Math.trunc(i)).filter(i=>Number.isInteger(i)&&i>0))];if(o.length===0)return[];this.db.exec("BEGIN IMMEDIATE");try{let i=[];for(let a of o)if(this.stmts.claimMailboxMessageDelivery.run(r,n,s,a).changes===1){let c=this.getMailboxMessage(a);c!==null&&i.push(c)}return this.db.exec("COMMIT"),i}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}clearMailDelivery(e){let r=[...new Set(e.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(e){return this.stmts.clearMailboxMessageDeliveryIfUnchanged.run(e.id,e.delivering_at,e.delivery_holder_pid,e.delivery_holder_host).changes!==1?null:this.getMailboxMessage(e.id)}reclaimStaleMailboxDeliveries(e){let r=this.stmts.listInFlightMailboxDeliveries.all(),n=[];this.db.exec("BEGIN IMMEDIATE");try{for(let s of r){if(!YI(s,e))continue;let o=this.reclaimMailboxDeliveryIfUnchanged(s);o!==null&&n.push(o)}return this.db.exec("COMMIT"),n}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}listDeliveredReceiptsForSender(e,r){return this.stmts.listDeliveredReceiptsForSender.all(e,r)}listOutboundPendingForSender(e,r){return this.stmts.listOutboundPendingForSender.all(e,r)}getMailboxMessage(e){return this.stmts.getMailboxMessage.get(e)??null}peekMailboxMessages(e,r=1e3){return this.stmts.listMailboxMessagesForReceiver.all(e.receiver_teamfile,e.receiver_alias,Math.max(1,Math.min(1e3,Math.trunc(r))))}recvMailboxMessages(e){return this.recvMailboxMessagesTxn(e.receiver_teamfile,e.receiver_alias)}updateTeamChatLogResponse(e,r){this.stmts.updateTeamChatLogResponse.run(r.response,r.status,r.error_detail,r.truncated,e)}getAgentInflight(e,r){return this.stmts.getAgentInflight.get(e,r)??null}listAgentInflight(){return this.stmts.listAgentInflight.all()}tryAcquireAgentInflight(e,r){return this.tryAcquireAgentInflightTxn(e,r)}clearAgentInflight(e,r){this.stmts.clearAgentInflight.run(e,r)}clearObservedTerminalAgentInflight(e,r,n){return this.stmts.clearObservedTerminalAgentInflight.run({receiver_teamfile:e,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(e){this.db.exec("BEGIN IMMEDIATE");try{let r=this.getAgentInflight(e.receiver_teamfile,e.receiver_alias);if(r===null||r.sender_teamfile!==e.sender_teamfile||r.sender_alias!==e.sender_alias)return this.db.exec("COMMIT"),!1;if(r.active_count<=1)return this.stmts.clearAgentInflightIfSender.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias),this.db.exec("COMMIT"),!0;let n=this.stmts.decrementAgentInflight.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias);return this.db.exec("COMMIT"),n.changes===1}catch(r){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),r}}clearAgentInflightOlderThan(e){return this.stmts.clearAgentInflightOlderThan.run(e).changes}getTerminalLock(e,r){let n=this.stmts.getRuntimeState.get(zn,Qn(e,r),Zn);return n===void 0?null:Qm(n.data)}setTerminalLock(e){this.stmts.upsertRuntimeState.run(zn,Qn(e.teamfile,e.alias),Zn,JSON.stringify(e),e.last_heartbeat)}heartbeatTerminalLock(e,r,n,s){this.db.exec("BEGIN IMMEDIATE");try{let o=this.getTerminalLock(e,r);if(o===null||o.lock_id!==n)return this.db.exec("COMMIT"),!1;let i={...o,last_heartbeat:s};return this.stmts.upsertRuntimeState.run(zn,Qn(e,r),Zn,JSON.stringify(i),s),this.db.exec("COMMIT"),!0}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}clearTerminalLock(e,r,n){this.db.exec("BEGIN IMMEDIATE");try{let s=this.getTerminalLock(e,r);if(s===null||s.lock_id!==n)return this.db.exec("COMMIT"),!1;let o=this.stmts.deleteRuntimeState.run(zn,Qn(e,r),Zn);return this.db.exec("COMMIT"),o.changes===1}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}getRuntimeProcessLock(e,r,n){let s=this.stmts.getRuntimeState.get(e,r,n);return s===void 0?null:KI(s.data)}tryAcquireRuntimeProcessLock(e,r,n,s,o=O()){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getRuntimeProcessLock(e,r,n);if(i!==null&&!VI(i,s))return this.db.exec("COMMIT"),{acquired:!1,current:i};let a={lock_id:sp(),holder_pid:process.pid,holder_host:rs(),started_at:o,last_heartbeat:o};return this.stmts.upsertRuntimeState.run(e,r,n,JSON.stringify(a),o),this.db.exec("COMMIT"),{acquired:!0,lock:a,previous:i}}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}clearRuntimeProcessLock(e,r,n,s){this.db.exec("BEGIN IMMEDIATE");try{let o=this.getRuntimeProcessLock(e,r,n);if(o===null||o.lock_id!==s)return this.db.exec("COMMIT"),!1;let i=this.stmts.deleteRuntimeState.run(e,r,n);return this.db.exec("COMMIT"),i.changes===1}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}getRun(e){return this.stmts.getRun.get(e)??null}setRunCurrentState(e,r){return this.stmts.setRunCurrentState.run(r,e),this.stmts.getRun.get(e)??null}setRunPausedState(e,r,n){return this.stmts.setRunPausedState.run(r,n,e),this.stmts.getRun.get(e)??null}setRunPendingEscalationDecision(e,r){return this.stmts.setRunPendingEscalationDecision.run(r,e),this.stmts.getRun.get(e)??null}setRunTerminalState(e,r){return this.stmts.setRunTerminalState.run(r,O(),e),this.stmts.getRun.get(e)??null}pauseJob(e){return this.stmts.pauseJob.run(e),this.getJob(e)}resumeRun(e,r){return this.resumeRunTxn(e,r,O())}insertStep(e){let r=this.stmts.insertStep.run(e.run_id,e.parent_step_id??null,e.state_name,e.outcome??null,e.status_detail??null,O());return this.stmts.getStep.get(r.lastInsertRowid)}finishStep(e,r,n){return this.stmts.finishStep.run(r??null,n??null,O(),e),this.stmts.getStep.get(e)??null}listStepsForRun(e){return this.stmts.listStepsForRun.all(e)}listLatestStepOutcomesByState(e){let r=this.stmts.listLatestStepOutcomesByState.all(e),n={};for(let s of r)n[s.state_name]=s.outcome;return n}insertSubmittedPr(e){let r=this.stmts.insertSubmittedPr.run(e.repo,e.pr_url,e.issue_url??null,e.local_path??null,e.branch??null,e.head_sha??null,e.status??"watching",e.submitted_at??O(),e.last_known_state??null,e.created_by_run_id??null);return this.stmts.getSubmittedPr.get(r.lastInsertRowid)}listSubmittedPrs(e){return e?.status!==void 0?this.stmts.listSubmittedPrsByStatus.all(e.status):this.stmts.listSubmittedPrs.all()}getSubmittedPr(e){return this.stmts.getSubmittedPr.get(e)??null}findSubmittedPrByUrl(e){return this.stmts.findSubmittedPrByUrl.get(e)??null}insertStepArtifact(e){let r=this.stmts.insertStepArtifact.run(e.step_id,e.kind,e.path??null,e.content??null,e.sha??null,e.provider_call_mode??null,O());return this.stmts.getStepArtifact.get(r.lastInsertRowid)}insertExternalObject(e){let n=this.stmts.insertExternalObject.run(e.type,e.provider,e.project_id,e.run_id??null,e.external_id,e.url??null,e.status??null,e.metadata??null,e.last_seen_at??null,O()).changes===1;return{row:this.stmts.findExternalObjectByUnique.get(e.provider,e.type,e.external_id),inserted:n}}insertExternalSignal(e){let r=this.stmts.insertExternalSignal.run(e.object_id,e.kind,e.source??null,e.occurred_at??null,e.payload??null,e.signal_hash??null,null,O()),n=r.changes===1;return{row:e.signal_hash===void 0||e.signal_hash===null?this.stmts.getExternalSignal.get(r.lastInsertRowid):this.stmts.findExternalSignalByUnique.get(e.object_id,e.kind,e.signal_hash),inserted:n}}raiseAttention(e){let r=this.stmts.insertAttention.run(e.kind,e.severity??"warn",e.project_id??null,e.run_id??null,e.external_object_id??null,e.requires_user===!0?1:0,e.payload??null,O());return this.stmts.getAttention.get(r.lastInsertRowid)}acknowledgeAttention(e){return this.stmts.ackAttention.run(O(),e),this.stmts.getAttention.get(e)??null}upsertDurableMemory(e){let r=O();return this.stmts.upsertDurableMemory.run(e.project_id,e.type,e.name,e.description??null,e.body,r,r),this.stmts.getDurableMemoryByName.get(e.project_id,e.name)}getDurableMemoryByName(e,r){return this.stmts.getDurableMemoryByName.get(e,r)??null}deleteDurableMemory(e,r){return this.stmts.deleteDurableMemory.run(e,r).changes>0}listDurableMemory(e,r){return r!==void 0?this.stmts.listDurableMemoryByType.all(e,r):this.stmts.listDurableMemory.all(e)}indexDurableMemory(e,r){return r!==void 0&&r.length>0?this.stmts.listDurableMemory.all(e).filter(s=>r.includes(s.type)).map(({name:s,description:o,type:i,updated_at:a})=>({name:s,description:o,type:i,updated_at:a})):this.stmts.listDurableMemory.all(e).map(({name:n,description:s,type:o,updated_at:i})=>({name:n,description:s,type:o,updated_at:i}))}recordSessionSize(e){let r=this.stmts.insertSessionSize.run(e.team_name,e.alias,e.sessionid,e.input_tokens??null,e.cache_tokens??null,e.output_tokens??null,e.total_tokens??null,e.observed_at??O());return this.stmts.getSessionSize.get(r.lastInsertRowid)}latestSessionSizes(){return this.stmts.latestSessionSizes.all()}sessionSizeHistory(e,r,n=20){return this.stmts.sessionSizeHistory.all(e,r,n)}insertSessionEvent(e){let r=this.stmts.insertSessionEvent.run(e.run_id,e.step_id??null,e.kind,e.timestamp_ms,e.payload,e.payload_truncated??0,e.overflow_artifact_id??null);return this.stmts.getSessionEvent.get(r.lastInsertRowid)}listSessionEvents(e,r){return r!==void 0?this.stmts.listSessionEventsSince.all(e,r):this.stmts.listSessionEvents.all(e)}listSessionEventsSince(e,r=1e3){return this.stmts.listAllEventsSince.all(e,r)}latestAgentCall(e){let r=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call' ORDER BY id DESC LIMIT 1").get(e);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(e){let r=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call'").all(e),n=0,s=0,o=0;for(let i of r)try{let a=JSON.parse(i.payload);typeof a.tokens_in=="number"&&(n+=a.tokens_in),typeof a.tokens_out=="number"&&(s+=a.tokens_out),o+=1}catch{}return{totalInputTokens:n,totalOutputTokens:s,agentCallCount:o}}addRollupValue(e){this.stmts.upsertRollupStat.run(e.run_id,e.step_id??null,e.metric_kind,e.value,e.bucket_start_ms,e.bucket_end_ms,e.updated_at)}listRollupStats(e){return this.stmts.listRollupStats.all(e)}getRollupCursor(){return this.stmts.getRollupCursor.get("last_event_id")?.value??0}setRollupCursor(e){this.stmts.setRollupCursor.run("last_event_id",e)}insertDriftSignal(e){let r=this.stmts.insertDriftSignal.run(e.team_member_id,e.project_id??null,e.signal_kind,e.severity,e.description,e.detected_at,e.expires_at??null,e.payload??null);return this.stmts.getDriftSignal.get(r.lastInsertRowid)}listDriftSignals(e={}){return e.team_member_id!==void 0&&e.unacked?this.stmts.listUnackedDriftByMember.all(e.team_member_id):e.team_member_id!==void 0?this.stmts.listDriftByMember.all(e.team_member_id):e.project_id!==void 0?this.stmts.listDriftByProject.all(e.project_id):this.stmts.listAllDrift.all()}hasUnackedDriftSignal(e,r,n){return this.stmts.findUnackedDrift.get(e,r??null,n)!==void 0}acknowledgeDriftSignal(e){return this.stmts.ackDriftSignal.run(Date.now(),e),this.stmts.getDriftSignal.get(e)??null}insertInteractiveSession(e){let r=Date.now();return this.stmts.insertInteractiveSession.run(e.run_id,e.step_id,e.state_name,e.status,r,r),this.stmts.getInteractiveSessionByStepId.get(e.step_id)}getInteractiveSessionByStepId(e){return this.stmts.getInteractiveSessionByStepId.get(e)??null}getInteractiveSessionByRunAndState(e,r){return this.stmts.getInteractiveSessionByRunAndState.get(e,r)??null}setInteractiveAgentOutput(e,r,n){this.stmts.setInteractiveAgentOutput.run(r,n,Date.now(),e)}resumeInteractive(e,r,n){return this.resumeInteractiveTxn(e,r,n,O())}resumeEscalation(e,r){return this.resumeEscalationTxn(e,r,O())}}});import{realpathSync as e0}from"node:fs";import{resolve as t0}from"node:path";function Ml(t){let e=t0(t);try{return e0(e)}catch{return e}}var ap=T(()=>{"use strict"});import{platform as lp}from"node:os";function Tt(t){let e=new ns;for(let r of t)e.registerAdapter(r);return e}var ns,Dl=T(()=>{"use strict";ap();ns=class{providers=[];adapters=new Map;register(e){this.providers.push(e)}async listAll(e){let r=[],n=e?.provider?this.providers.filter(i=>i.name===e.provider):this.providers,s=await Promise.all(n.map(i=>i.discoverSessions()));for(let i of s)r.push(...i);let o=r;if(e?.workspace){let i=Ml(e.workspace);o=o.filter(a=>Ml(a.cwd)===i)}if(e?.from){let i=e.from.getTime();o=o.filter(a=>a.modifiedAt.getTime()>=i)}if(e?.to){let i=e.to.getTime();o=o.filter(a=>a.modifiedAt.getTime()<=i)}return o.sort((i,a)=>a.modifiedAt.getTime()-i.modifiedAt.getTime()),e?.limit&&(o=o.slice(0,e.limit)),o}async getSession(e,r){let n=r?this.providers.filter(s=>s.name===r):this.providers;for(let s of n){let o=await s.loadSession(e);if(o)return o}return null}async resolveSession(e,r){let n=await this.resolveSessions(e,r);return n.length===1?n[0]:null}async resolveSessions(e,r){let n=r?this.providers.filter(o=>o.name===r):this.providers,s=[];for(let o of n){let i=await o.resolveSessionPath(e);i&&s.push({provider:o,filePath:i})}return s}getWatchTargets(){let e=lp()==="darwin"||lp()==="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:e,filePattern:s.filePattern});return r}async deleteSession(e,r){let n=await this.resolveSession(e,r);return n?n.provider.deleteSession(e):!1}registerAdapter(e){this.adapters.set(e.name,e),this.providers.push({name:e.name,discoverSessions:()=>e.discover(),loadSession:r=>e.load(r),resolveSessionPath:r=>e.resolvePath(r),deleteSession:r=>e.delete(r),getWatchPaths:()=>e.getWatchPaths?.()??[]})}getAdapter(e){return this.adapters.get(e)}getAllAdapters(){return[...this.adapters.values()]}}});import{createReadStream as cp}from"node:fs";import{createInterface as up}from"node:readline";import{stat as r0}from"node:fs/promises";import{homedir as n0}from"node:os";async function*We(t){let e=cp(t,{encoding:"utf-8"}),r=up({input:e,crlfDelay:1/0});try{for await(let n of r){let s=n.trim();if(s)try{yield JSON.parse(s)}catch{}}}finally{e.destroy()}}async function Ce(t,e){let r=[],n=cp(t,{encoding:"utf-8"}),s=up({input:n,crlfDelay:1/0});try{for await(let o of s){let i=o.trim();if(i){try{r.push(JSON.parse(i))}catch{}if(r.length>=e)break}}}finally{s.close(),n.destroy()}return r}async function Re(t){let e=await r0(t);return{createdAt:e.birthtime,modifiedAt:e.mtime}}function me(t){return t.replace(/\\n/g,`
1291
+ `).replace(/\\t/g," ").replace(/\\r/g,"\r")}function G(t,e){return t.length<=e?t:t.slice(0,e-3)+"..."}var Se,rr=T(()=>{"use strict";Se=n0()});import{readdir as wo,stat as dp,unlink as s0}from"node:fs/promises";import{join as Kr,basename as fp}from"node:path";function o0(t){return t==="file-history-snapshot"||t==="progress"||t==="system"||t==="queue-operation"}function i0(t){if(t.type==="system"){let e=t.message?.content;if(typeof e=="string"&&e.trim())return me(e.trim());if(e!==void 0)return JSON.stringify(e,null,2)}return t.type==="progress"&&t.data!==void 0?JSON.stringify(t.data,null,2):JSON.stringify(t,null,2)}async function mp(t){let e=0,r=0,n=0,s=0,o=0,i=0,a;for await(let l of We(t))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;e++}}else if(l.type==="assistant"&&l.message){let c=l.message.content;if(Array.isArray(c))for(let d of c)d.type==="text"&&e++;let u=l.message.usage;if(u){let d=u.input_tokens||0,f=u.cache_creation_input_tokens||0,m=u.cache_read_input_tokens||0,p=u.output_tokens||0;r+=d+f+m,n+=m,s+=f,o+=p;let h=d+f+m;h&&(i=h),a={inputTokens:d,cacheWriteInputTokens:f,cachedInputTokens:m,outputTokens:p}}}}return{messageCount:e,totalInputTokens:r,totalCacheReadInputTokens:n,totalCacheWriteInputTokens:s,totalOutputTokens:o,lastInputTokens:i,lastTokenUsage:a}}var Eo,pp=T(()=>{"use strict";rr();Eo=class{name="claude";claudeDir;projectsDir;constructor(e={}){this.claudeDir=e.claudeDir||Kr(Se,".claude"),this.projectsDir=Kr(this.claudeDir,"projects")}getWatchPaths(){return[{directory:this.projectsDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await wo(this.projectsDir)}catch{return e}for(let n of r){let s=Kr(this.projectsDir,n);if(!(await dp(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await wo(s)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=fp(a,".jsonl");if(!/^[0-9a-f]{8}-/.test(l))continue;let c=Kr(s,a);try{let u=await this.extractSummary(c,l);u&&e.push(u)}catch{}}}return e}async extractSummary(e,r){let n=await Ce(e,50),s=await Re(e),o="",i,a,l,c,u,d;for(let m of n)if(!o0(m.type)&&(!o&&m.cwd&&(o=m.cwd),!i&&m.slug&&(i=m.slug),!a&&m.version&&(a=m.version),!d&&m.timestamp&&(d=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=G(p.trim(),80)),u=G(p.trim(),80)}}if(!o)return null;let f=await mp(e);return{provider:"claude",sessionId:r,slug:i,cwd:o,createdAt:d||s.createdAt,modifiedAt:s.modifiedAt,model:l,cliVersion:a,startCommand:"claude",firstUserMessage:c,lastUserMessage:u,messageCount:f.messageCount,filePath:e,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(e){let r=await this.resolveSessionFile(e);if(!r)return null;let n=await Re(r),s=[],o="",i,a,l,c,u,d,f,m=e;for await(let h of We(r))if(h.type!=="file-history-snapshot"&&!h.isSidechain){if(!o&&h.cwd&&(o=h.cwd),!i&&h.slug&&(i=h.slug),!a&&h.version&&(a=h.version),!c&&h.gitBranch&&(c=h.gitBranch),!f&&h.timestamp&&(f=new Date(h.timestamp)),h.sessionId&&(m=h.sessionId),h.type==="system"||h.type==="progress"||h.type==="queue-operation"){s.push({role:"system",timestamp:new Date(h.timestamp||0),content:i0(h)});continue}if(h.type==="user"&&h.message){if(h.isMeta)continue;let g=new Date(h.timestamp||0),_=h.message.content;if(typeof _=="string"){if(_.includes("<command-name>")||_.includes("<local-command-"))continue;u||(u=G(_.trim(),80)),d=G(_.trim(),80),s.push({role:"user",timestamp:g,content:me(_.trim())})}else if(Array.isArray(_)){for(let S of _)if(S.type==="tool_result"){let w=typeof S.content=="string"?me(S.content):JSON.stringify(S.content);s.push({role:"tool_result",timestamp:g,content:w,toolCallId:S.tool_use_id})}}}if(h.type==="assistant"&&h.message){h.message.model&&(l=h.message.model);let g=new Date(h.timestamp||0),_=h.message.content;if(Array.isArray(_))for(let S of _)S.type==="text"&&S.text?s.push({role:"assistant",timestamp:g,content:me(S.text),model:h.message.model}):S.type==="tool_use"?s.push({role:"tool_use",timestamp:g,content:S.name||"unknown tool",toolName:S.name,toolInput:JSON.stringify(S.input,null,2),toolCallId:S.id,model:h.message.model}):S.type==="thinking"&&S.thinking&&s.push({role:"thinking",timestamp:g,content:S.thinking})}}if(!o)return null;let p=await mp(r);return{provider:"claude",sessionId:m,slug:i,cwd:o,createdAt:f||n.createdAt,modifiedAt:n.modifiedAt,model:l,cliVersion:a,startCommand:"claude",gitBranch:c,firstUserMessage:u,lastUserMessage:d,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(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await s0(r),!0):!1}async resolveSessionFile(e){let r;try{r=await wo(this.projectsDir)}catch{return null}let n=[];for(let i of r){let a=Kr(this.projectsDir,i);if(!(await dp(a).catch(()=>null))?.isDirectory())continue;let c;try{c=await wo(a)}catch{continue}for(let u of c){if(!u.endsWith(".jsonl"))continue;let d=fp(u,".jsonl");/^[0-9a-f]{8}-/.test(d)&&n.push({filePath:Kr(a,u),fileSessionId:d})}}let s=n.find(i=>i.fileSessionId===e);if(s)return s.filePath;let o=n.filter(i=>i.fileSessionId.startsWith(e));if(o.length===1)return o[0].filePath;for(let i of n){let a=await Ce(i.filePath,20);for(let l of a)if(l.slug&&l.slug===e)return i.filePath}return null}}});function To(t){return"'"+t.replace(/'/g,"'\\''")+"'"}function l0(t,e,r){if(!r)return"";let n=t.tools[e]??Pl[e],s=n?.profiles?.[r]?.flags??Pl[e]?.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 "${e}"`)}function hp(t,e){return!!t.tools[e]}function _p(t,e,r,n,s){let o=t.tools[e]??Pl[e],i;if(o?.agent){let l=To(n);i=o.agent.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,l)}else{let l=a0[e];if(!l)throw new Error(`No agent command configured for tool "${e}"`);let c=l.argv.map(u=>u.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,n));if(l.mode==="stdin"){let u=c.map(To).join(" ");i=`printf '%s\\n' ${To(n)} | ${u}`}else i=c.map(To).join(" ")}let a=l0(t,e,s);return a&&(i+=" "+a),i}var Pl,a0,gp=T(()=>{"use strict";Pl={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:""}}}},a0={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 yp(t=process.env){let e=t.LMCTL_ONE_SHOT_TIMEOUT_MS;if(!e)return 6e5;let r=Number(e);return!Number.isFinite(r)||r<=0?6e5:r}var wp=T(()=>{"use strict"});var c0,we,bo,bt=T(()=>{"use strict";c0="ACK: waiting for explicit lmctl task.",we=`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: ${c0}`,bo=`send this exact lmctl seed instruction: "${we}"`});function Mt(t,e){let r={...t??process.env,PWD:e};return delete r.OLDPWD,r}function u0(t,e){return e===void 0||e.length===0?t:{...t??process.env,[ss]:e}}function Be(t,e,r){return u0(Mt(t,e),r)}var ss,lt=T(()=>{"use strict";ss="LMCTL_SELF_SESSIONID"});import{spawn as Ep}from"node:child_process";import{mkdirSync as d0}from"node:fs";var Fl,$e,Dt=T(()=>{"use strict";gp();wp();bt();lt();Fl=class t extends Error{cancelReason;constructor(e,r){super(e),this.name="TurnAbortError",this.cancelReason=r,Object.setPrototypeOf(this,t.prototype)}},$e=class t{name;capabilities;injection;provider;binary;seedArgs;seedStdin;resumeTemplate;startTemplate;transportFn;constructor(e){this.name=e.provider.name,this.provider=e.provider,this.capabilities=e.capabilities,this.injection=e.injection,this.binary=e.binary,this.seedArgs=e.seedArgs,this.seedStdin=e.seedStdin,this.resumeTemplate=e.resumeTemplate,this.startTemplate=e.startTemplate,this.transportFn=e.transport}discover(){return this.provider.discoverSessions()}load(e){return this.provider.loadSession(e)}resolvePath(e){return this.provider.resolveSessionPath(e)}delete(e){return this.provider.deleteSession(e)}getWatchPaths(){return this.provider.getWatchPaths?.()??[]}seedArgsFor(e){let r=e?.prompt;return r===void 0?this.seedArgs:this.seedArgs.map(n=>n===we?r:n)}seed(e,r){return d0(e,{recursive:!0}),new Promise(n=>{let s;try{s=Ep(this.binary,this.seedArgsFor(r),{cwd:e,env:Mt(void 0,e),stdio:["pipe","pipe","pipe"],timeout:6e4})}catch(a){return n({success:!1,error:a instanceof Error?a.message:String(a)})}let o="";s.stderr?.on("data",a=>{o+=a.toString()});let i=r?.prompt!==void 0&&this.seedStdin!==void 0?`${r.prompt}
1292
1292
  `:this.seedStdin;i&&s.stdin?.write(i),s.stdin?.end(),s.on("exit",a=>{n(a===0||a===null?{success:!0}:{success:!1,error:o.trim().slice(0,200)||`exit code ${a}`})}),s.on("error",a=>{n({success:!1,error:a.message})})})}resumeCommand(e,r){return this.resumeTemplate.replace(/\{\{session_id\}\}/g,e)}startCommand(e){return this.startTemplate}manualSeedHint(e){return{launchCommand:`cd ${e} && ${this.binary}`,postLaunchNote:bo,lsCommand:`lmctl ls --provider ${this.name} --sessiondir ${e}`}}static DEFAULT_IDLE_TIMEOUT_MS=8*60*60*1e3;sendTurn(e,r){if(r.userConfig&&hp(r.userConfig,this.name)){let s=r.userConfig.tools[this.name];if(s?.agent)return this.runOneShotAgent(e,r,s.agent)}let n=r.timeoutMs??t.DEFAULT_IDLE_TIMEOUT_MS;return n<=0&&!r.signal?this.transportFn(e,{...r,binary:this.binary}):this.withTimeouts(n,e,r)}withTimeouts(e,r,n){let s=new AbortController,o,i,a="",l,c=()=>{e<=0||(clearTimeout(o),o=setTimeout(()=>{n.onIdleWarning?.(e),u(),s.abort(),l&&l({text:a,sessionId:n.sessionId,durationMs:e,status:"stalled",stalledAfterMs:e})},e))},u=()=>{clearTimeout(o)};n.signal&&(n.signal.aborted?(i="external",s.abort()):n.signal.addEventListener("abort",()=>{i="external",s.abort()},{once:!0})),c();let d={...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,d).then(p=>(u(),{...p,status:"ok"})).catch(p=>{throw u(),i==="external"?new Fl("Turn cancelled","external"):p}),m=new Promise(p=>{l=p});return Promise.race([f,m])}runOneShotAgent(e,r,n){let s=_p(r.userConfig,this.name,r.sessionId,e,r.profile),o=Date.now();return new Promise((i,a)=>{let l=yp(r.env),c=Ep(s,{shell:!0,cwd:r.cwd,env:Be(r.env,r.cwd,r.sessionId),stdio:["pipe","pipe","pipe"]}),u=!1,d=!1,f=setTimeout(()=>{d=!0,c.kill()},l),m="",p="";if(c.stdout?.on("data",h=>{let g=h.toString();m+=g,r.onDelta?.(g)}),c.stderr?.on("data",h=>{p+=h.toString()}),r.signal){if(r.signal.aborted)return clearTimeout(f),c.kill(),a(new Error("Aborted"));r.signal.addEventListener("abort",()=>c.kill(),{once:!0})}c.on("exit",h=>{if(u)return;u=!0,clearTimeout(f);let g=Date.now()-o;d?a(new Error(`Agent command timed out after ${l}ms`)):h===0||h===null?i({text:m.trim(),sessionId:r.sessionId,durationMs:g}):a(new Error(p.trim().slice(0,200)||`Agent command exited with code ${h}`))}),c.on("error",h=>{u||(u=!0,clearTimeout(f),a(h))})})}}});function ko(t,e){let r;if(e&&typeof e=="object"){let n=e.code;typeof n=="number"&&(r=n)}return new Ft(t,r,e)}var Ze,ke,Pt,So,Ft,Vr=T(()=>{"use strict";Ze=class extends Error{constructor(e,r){super(e,r),this.name=this.constructor.name}},ke=class extends Ze{},Pt=class extends Ze{exitCode;signal;stderr;constructor(e,r,n=null,s){super(e),this.exitCode=r,this.signal=n,this.stderr=s}},So=class extends Ze{line;constructor(e,r,n){super(e,{cause:n}),this.line=r}},Ft=class extends Ze{rpcCode;rpcData;constructor(e,r,n){super(e),r!==void 0&&(this.rpcCode=r),n!==void 0&&(this.rpcData=n)}}});import*as Wl from"node:child_process";function m0(t){if(typeof Wl.spawnSync=="function")try{Wl.spawnSync("taskkill",["/T","/F","/PID",String(t)],{windowsHide:!0})}catch{}}function Tp(t){return t.exitCode!==null||t.signalCode!==null}function Ul(t,e){return Tp(t)?Promise.resolve(!0):new Promise(r=>{let n=!1,s=()=>{n||(n=!0,clearTimeout(o),r(!0))},o=setTimeout(()=>{n||(n=!0,t.removeListener("exit",s),r(!1))},e);t.once("exit",s)})}async function ct(t,e={}){let r=Date.now(),n=e.stdinEnd!==!1,s=e.softDelayMs??5e3,o=e.killDelayMs??5e3,i=e.platform??process.platform,a=e.runTaskkill??m0;if(Tp(t))return{signal:"natural",elapsedMs:Date.now()-r};if(n&&t.stdin&&!t.stdin.destroyed)try{t.stdin.end()}catch{}if(await Ul(t,s))return{signal:"stdin",elapsedMs:Date.now()-r};if(i==="win32"&&typeof t.pid=="number")a(t.pid);else try{t.kill("SIGTERM")}catch{}if(await Ul(t,o))return{signal:"SIGTERM",elapsedMs:Date.now()-r};if(i!=="win32")try{t.kill("SIGKILL")}catch{}return await Ul(t,f0)?{signal:"SIGKILL",elapsedMs:Date.now()-r}:{signal:"abandoned",elapsedMs:Date.now()-r}}var f0,vo=T(()=>{"use strict";f0=1e3});function bp(t){fe()&&Xe({event:"legacy",msg:`[debug] ${t}`},{always:!0})}function nr(t,e){let r=h0[t];if(r)return r[e]??r.yolo}function g0(t,e){if(e.length===0)return!0;for(let r=0;r+e.length<=t.length;r++){let n=!0;for(let s=0;s<e.length;s++)if(t[r+s]!==e[s]){n=!1;break}if(n)return!0}return!1}function ut(t,e,r="yolo"){if(_0.has(t)){bp(`YOLO ${t} [mode=${r}]: ${t==="codex"?`JSON-RPC params (approvalPolicy=never, sandbox=${r==="plan"?"read-only":"danger-full-access"})`:t==="opencode"?".opencode/opencode.json (permission=allow)":"protocol/config (out-of-band)"} \u2014 no argv flag`);return}let n=r==="plan"?nr(t,"plan"):p0[t];if(!n){let s=`unknown provider "${t}" \u2014 YOLO contract not configured. Add an entry to YOLO_FLAGS in src/providers/yolo-contract.ts before spawning this provider.`;throw Y({event:"yolo_assert_failed",provider:t,reason:"unconfigured_provider",args:e.join(" "),message:s}),new ke(s)}if(!g0(e,n)){let s=n.join(" "),o=`${t} spawn missing YOLO flag '${s}' \u2014 YOLO is mandatory for every provider; see src/providers/yolo-contract.ts. Got argv: [${e.map(i=>JSON.stringify(i)).join(", ")}]`;throw Y({event:"yolo_assert_failed",provider:t,reason:"flag_missing",required_flag:s,mode:r,args:e.join(" "),message:o}),new ke(o)}bp(`YOLO ${t} [mode=${r}]: argv flag '${n.join(" ")}'`)}var p0,h0,_0,Yr=T(()=>{"use strict";Vr();Ie();p0={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"],gemini:["-y"],copilot:["--yolo"],agy:["--dangerously-skip-permissions"],lmplayer:["--dangerously-skip-permissions"]},h0={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"]}};_0=new Set(["codex","opencode"])});function Sp(t){if(t.length===0)return"";if(t.length===1)return t[0];let e=[];for(let r=0;r<t.length;r++)r===0?e.push(t[r]):e.push(`
1293
1293
 
1294
1294
  --- additional response (turn ${r+1} of ${t.length}; likely an injected mid-call notification) ---
@@ -1305,11 +1305,11 @@ ${e}
1305
1305
 
1306
1306
  ${r}`:r}function Ap(t,e){return new Promise((r,n)=>{let s=e.binaryPath||"codex",o=["app-server","--listen","stdio://"];e.model&&o.push("-c",`model=${JSON.stringify(e.model)}`);let i=e.isLead??e.alias?.toLowerCase()==="lead",a=i?Io():[];o.push(...a),fe()&&Oe(JSON.stringify({event:"codex_mcp_inject",alias:e.alias??null,isLead:i,injected:a.length>0}));let l=e.permissionMode??"yolo",c=Jl(l);try{ut("codex",o,l)}catch(q){return n(q)}if(e.cwd&&!v0(e.cwd))return Y({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`}),n(new ke(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let u=S0(s,o,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Be(e.env,e.cwd,e.threadId)}),d=!1;if(e.signal){if(e.signal.aborted)return d=!0,Y({event:"transport_abort",provider:"codex",phase:"pre_spawn"}),ct(u).catch(()=>{}),n(new Error("Aborted"));e.signal.addEventListener("abort",()=>{d=!0,Y({event:"transport_abort",provider:"codex"}),ct(u).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let f=k0({input:u.stdout}),m=new Map,p=1,h=e.threadId||"",g="",_=!1,S=!1,w=Date.now(),E=Xl(),I=Kl();function x(q,P={}){return new Promise((R,ee)=>{let J=p++;m.set(J,{resolve:R,reject:ee});let v=JSON.stringify({jsonrpc:"2.0",id:J,method:q,params:P});u.stdin?.write(v+`
1307
1307
  `)})}function H(q,P={}){let R=JSON.stringify({jsonrpc:"2.0",method:q,params:P});u.stdin?.write(R+`
1308
- `)}f.on("line",q=>{let P;try{P=JSON.parse(q)}catch{return}if(typeof P.id=="number"&&m.has(P.id)){let J=m.get(P.id);if(m.delete(P.id),P.error){let v=P.error,N=typeof v?.message=="string"&&v.message.length>0?v.message:JSON.stringify(P.error);J.reject(ko(`codex app-server error: ${N}`,v))}else J.resolve(P);e.onEvent?.(P);return}let R=P.method;if(!R){e.onEvent?.(P);return}if(R==="thread/started"){let v=P.params?.thread;v?.id&&(h=v.id)}let ee=fe()?J=>{sr("item.text/buffer-mismatch",{itemId:J.itemId,threadId:J.threadId??null,turnId:J.turnId??null,expectedFromItemText:J.expectedFromItemText,gotFromBuffer:J.gotFromBuffer,expectedLen:J.expectedFromItemText.length,gotLen:J.gotFromBuffer.length})}:void 0;if(R==="turn/started"){let J=P.params,v=J?.turn;v?.id&&(g=v.id),No(P,E,e.onDelta,ee),fe()&&sr("turn/started",{params:J??null})}if(fe()&&(R==="item/started"||R==="item/completed")){let J=P.params;J?.item?.type==="agentMessage"&&sr(R,{params:J??null})}if(R==="item/started"||R==="item/agentMessage/delta"||R==="item/completed"){if(R==="item/agentMessage/delta"){let J=P.params;fe()&&sr("agentMessage/delta",{params:J??null})}No(P,E,e.onDelta,ee)}if(R==="turn/completed"){let J=P.params;if(fe())for(let[N,j]of E.agentItems.entries())j.buffer&&sr("turn/completed/unflushed-item",{itemId:N,phase:j.phase,bufferLen:j.buffer.length});Gl(E),fe()&&sr("turn/completed",{params:J??null});let v=Yl(P,I);v.shouldReject?(fe()&&sr("turn/completed/terminal-reject",{message:v.turnError.message}),S=!0,_=!0,u.stdin?.end(),n(v.turnError)):(_=!0,u.stdin?.end())}if(R==="error"){let J=Vl(P,I);if(fe()){let v=P.params,N=v?.error,j=typeof N?.message=="string"?N.message:"(no message)";sr(J.willRetry?"error/retry":"error/terminal-deferred",{message:j,willRetry:J.willRetry,params:v??null})}}e.onEvent?.(P)});let ue="";u.stderr?.on("data",q=>{ue+=q.toString()}),u.on("error",q=>{Y({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:q.message}),n(new ke(`Failed to spawn codex app-server: ${q.message}`,{cause:q}))}),u.on("exit",q=>{if(!d&&!S){if(_){r({result:E.resultText,threadId:h,turnId:g,durationMs:Date.now()-w,exitCode:q});return}if(I.pendingCodexError){n(I.pendingCodexError);return}Y({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:q,stderr_tail:ue.slice(0,500)}),n(new Error(R0({exitCode:q,stderr:ue})))}}),(async()=>{try{if(await x("initialize",A0()),H("initialized",{}),e.threadId)try{let q=x("thread/resume",{threadId:e.threadId,sandbox:c,approvalPolicy:"never",...e.model?{model:e.model}:{}}),P=new Promise((R,ee)=>setTimeout(()=>ee(new Error("resume timeout")),5e3));await Promise.race([q,P]),h=e.threadId}catch{process.stderr.write(`[codex] thread/resume failed, creating new thread
1309
- `);let P=(await x("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:c,...e.model?{model:e.model}:{}})).result?.thread;P?.id&&(h=P.id)}else{let P=(await x("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:c,...e.model?{model:e.model}:{}})).result?.thread;P?.id&&(h=P.id)}await x("turn/start",{threadId:h,input:[{type:"text",text:t}],...e.model?{model:e.model}:{}})}catch(q){ct(u).catch(()=>{}),n(q instanceof Error?q:new Error(String(q)))}})()})}var x0,Rp=T(()=>{"use strict";Ie();Ie();Vr();vo();Yr();ql();Ie();lt();zl();zl();x0=(()=>{try{let t=new URL("../../../package.json",import.meta.url),e=JSON.parse(I0(N0(t),"utf8"));return typeof e.version=="string"?e.version:"0.0.0"}catch{return"0.0.0"}})()});import{existsSync as Lp,mkdirSync as $0,readFileSync as Op,writeFileSync as $p}from"node:fs";import{join as ss,resolve as j0}from"node:path";function Cp(t){if(t==="allow")return!0;if(t&&typeof t=="object"&&!Array.isArray(t)){let e=Object.entries(t);if(e.length===1&&e[0][0]==="*"&&e[0][1]==="allow")return!0}return!1}function Zl(t,e,r={existsSync:Lp,readFileSync:Op}){let n=[];for(let s of t){if(s.provider.trim().toLowerCase()!=="opencode")continue;let o=j0(e,s.sessiondir??e);for(let i of L0(o)){let a=O0(i,r);a!==void 0&&Object.prototype.hasOwnProperty.call(a,"permission")&&(Cp(a.permission)||n.push(`[${s.alias}] ${i} 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 L0(t){return[ss(t,".opencode","opencode.jsonc"),ss(t,"opencode.jsonc"),ss(t,"opencode.json")]}function O0(t,e){try{if(!e.existsSync(t))return;let r=e.readFileSync(t,"utf-8"),n=JSON.parse(C0(r));return n===null||typeof n!="object"||Array.isArray(n)?void 0:n}catch{return}}function C0(t){let e="",r=!1,n="",s=!1;for(let o=0;o<t.length;o+=1){let i=t[o],a=t[o+1];if(r){e+=i,s?s=!1:i==="\\"?s=!0:i===n&&(r=!1,n="");continue}if(i==='"'||i==="'"){r=!0,n=i,e+=i;continue}if(i==="/"&&a==="/"){for(;o<t.length&&t[o]!==`
1310
- `;)o+=1;o<t.length&&(e+=t[o]);continue}if(i==="/"&&a==="*"){for(o+=2;o<t.length&&!(t[o]==="*"&&t[o+1]==="/");)o+=1;o+=1;continue}e+=i}return e.replace(/,\s*([}\]])/g,"$1")}function xo(t,e={}){let r=ss(t,".opencode"),n=ss(r,"opencode.json");if(!Lp(n)){$0(r,{recursive:!0});let i=JSON.stringify({permission:"allow"},null,2);return $p(n,i+`
1311
- `,"utf-8"),!0}let s;try{s=JSON.parse(Op(n,"utf-8"))}catch{return console.log(jp.yellow(` .opencode/opencode.json at ${n} is malformed \u2014 skipping opencode config install.`)),!1}if(typeof s!="object"||s===null)return console.log(jp.yellow(` .opencode/opencode.json at ${n} is not an object \u2014 skipping opencode config install.`)),!1;let o=!1;return s.permission===void 0&&(s.permission="allow",o=!0),Cp(s.permission)||Y({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.`}),o&&$p(n,JSON.stringify(s,null,2)+`
1312
- `,"utf-8"),o}var jp,Ao=T(()=>{"use strict";Ie();jp={yellow:t=>t}});function Pp(t){let e=[...t.matchAll(M0)];if(e.length>0){let r=e[e.length-1],n=(r.index??0)+r[0].length;return Mp(t.slice(n).trimStart())}return Mp(W0(t.replace(D0,"")))}function W0(t){let e=P0.exec(t);if(e===null)return t;let r=t.slice(e[0].length),n=[...r.matchAll(F0)];if(n.length<2)return t;let s=n[0],o=(s.index??0)+s[0].length;return r.slice(o).trimStart()}function Mp(t){let e=[...t.matchAll(U0)];if(e.length===0)return t;let r=e[e.length-1],n=(r.index??0)+r[0].length;return t.slice(n).trimStart()}function os(t,e=""){let r=t.result;return typeof r?.sessionId=="string"&&r.sessionId.length>0?r.sessionId:e}function Fp(t){let e=t.result;return typeof e?.stopReason=="string"?e.stopReason:""}function Ql(t={}){let e="",r="",n="",s=!1,o=!1,i=()=>({result:t.tool==="gemini"?Pp(r):r,sessionId:e,stopReason:n});return{setSessionId(a){e=a},beginTurn(){r="",n="",s=!1,o=!0},completeTurn(a){return n=Fp(a),s=!0,o=!1,i()},processMessage(a){if(a.method!=="session/update")return!1;let c=a.params?.update;if(c?.sessionUpdate!=="agent_message_chunk")return!1;let u=c.content,d=typeof u?.text=="string"?u.text:"";return d&&o&&(r+=d,t.onDelta?.(d)),!0},finalize(){return s?i():null}}}var Dp,M0,D0,P0,F0,U0,ec=T(()=>{"use strict";Dp="(?:png|jpe?g|webp|heic|pdf)",M0=new RegExp(`\\bSTANCE:\\s*\\S+_\\d{6,}\\.${Dp}\\s*`,"gi"),D0=new RegExp(`^ACK:\\s*waiting for explicit lmctl task\\.\\d{6,}\\.${Dp}\\s*`,"i"),P0=/^ACK:\s*waiting for explicit lmctl task[._]?\s*/i,F0=/^STANCE:\s+\S+\s*$/gim,U0=/\[Thought:\s*true\]\s*/gi});import{spawn as B0}from"node:child_process";import{existsSync as H0}from"node:fs";import{createInterface as q0}from"node:readline";function J0(t){let e=t.stderr.trim().slice(0,500),r=`lmctl: ${t.tool} ACP process exited with code ${t.exitCode} before completing the prompt.
1308
+ `)}f.on("line",q=>{let P;try{P=JSON.parse(q)}catch{return}if(typeof P.id=="number"&&m.has(P.id)){let J=m.get(P.id);if(m.delete(P.id),P.error){let v=P.error,N=typeof v?.message=="string"&&v.message.length>0?v.message:JSON.stringify(P.error);J.reject(ko(`codex app-server error: ${N}`,v))}else J.resolve(P);e.onEvent?.(P);return}let R=P.method;if(!R){e.onEvent?.(P);return}if(R==="thread/started"){let v=P.params?.thread;v?.id&&(h=v.id)}let ee=fe()?J=>{sr("item.text/buffer-mismatch",{itemId:J.itemId,threadId:J.threadId??null,turnId:J.turnId??null,expectedFromItemText:J.expectedFromItemText,gotFromBuffer:J.gotFromBuffer,expectedLen:J.expectedFromItemText.length,gotLen:J.gotFromBuffer.length})}:void 0;if(R==="turn/started"){let J=P.params,v=J?.turn;v?.id&&(g=v.id),No(P,E,e.onDelta,ee),fe()&&sr("turn/started",{params:J??null})}if(fe()&&(R==="item/started"||R==="item/completed")){let J=P.params;J?.item?.type==="agentMessage"&&sr(R,{params:J??null})}if(R==="item/started"||R==="item/agentMessage/delta"||R==="item/completed"){if(R==="item/agentMessage/delta"){let J=P.params;fe()&&sr("agentMessage/delta",{params:J??null})}No(P,E,e.onDelta,ee)}if(R==="turn/completed"){let J=P.params;if(fe())for(let[N,L]of E.agentItems.entries())L.buffer&&sr("turn/completed/unflushed-item",{itemId:N,phase:L.phase,bufferLen:L.buffer.length});Gl(E),fe()&&sr("turn/completed",{params:J??null});let v=Yl(P,I);v.shouldReject?(fe()&&sr("turn/completed/terminal-reject",{message:v.turnError.message}),S=!0,_=!0,u.stdin?.end(),n(v.turnError)):(_=!0,u.stdin?.end())}if(R==="error"){let J=Vl(P,I);if(fe()){let v=P.params,N=v?.error,L=typeof N?.message=="string"?N.message:"(no message)";sr(J.willRetry?"error/retry":"error/terminal-deferred",{message:L,willRetry:J.willRetry,params:v??null})}}e.onEvent?.(P)});let ue="";u.stderr?.on("data",q=>{ue+=q.toString()}),u.on("error",q=>{Y({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:q.message}),n(new ke(`Failed to spawn codex app-server: ${q.message}`,{cause:q}))}),u.on("exit",q=>{if(!d&&!S){if(_){r({result:E.resultText,threadId:h,turnId:g,durationMs:Date.now()-w,exitCode:q});return}if(I.pendingCodexError){n(I.pendingCodexError);return}Y({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:q,stderr_tail:ue.slice(0,500)}),n(new Error(R0({exitCode:q,stderr:ue})))}}),(async()=>{try{if(await x("initialize",A0()),H("initialized",{}),e.threadId)try{let q=x("thread/resume",{threadId:e.threadId,sandbox:c,approvalPolicy:"never",...e.model?{model:e.model}:{}}),P=new Promise((R,ee)=>setTimeout(()=>ee(new Error("resume timeout")),5e3));await Promise.race([q,P]),h=e.threadId}catch{process.stderr.write(`[codex] thread/resume failed, creating new thread
1309
+ `);let P=(await x("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:c,...e.model?{model:e.model}:{}})).result?.thread;P?.id&&(h=P.id)}else{let P=(await x("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:c,...e.model?{model:e.model}:{}})).result?.thread;P?.id&&(h=P.id)}await x("turn/start",{threadId:h,input:[{type:"text",text:t}],...e.model?{model:e.model}:{}})}catch(q){ct(u).catch(()=>{}),n(q instanceof Error?q:new Error(String(q)))}})()})}var x0,Rp=T(()=>{"use strict";Ie();Ie();Vr();vo();Yr();ql();Ie();lt();zl();zl();x0=(()=>{try{let t=new URL("../../../package.json",import.meta.url),e=JSON.parse(I0(N0(t),"utf8"));return typeof e.version=="string"?e.version:"0.0.0"}catch{return"0.0.0"}})()});import{existsSync as jp,mkdirSync as $0,readFileSync as Op,writeFileSync as $p}from"node:fs";import{join as os,resolve as L0}from"node:path";function Cp(t){if(t==="allow")return!0;if(t&&typeof t=="object"&&!Array.isArray(t)){let e=Object.entries(t);if(e.length===1&&e[0][0]==="*"&&e[0][1]==="allow")return!0}return!1}function Zl(t,e,r={existsSync:jp,readFileSync:Op}){let n=[];for(let s of t){if(s.provider.trim().toLowerCase()!=="opencode")continue;let o=L0(e,s.sessiondir??e);for(let i of j0(o)){let a=O0(i,r);a!==void 0&&Object.prototype.hasOwnProperty.call(a,"permission")&&(Cp(a.permission)||n.push(`[${s.alias}] ${i} 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 j0(t){return[os(t,".opencode","opencode.jsonc"),os(t,"opencode.jsonc"),os(t,"opencode.json")]}function O0(t,e){try{if(!e.existsSync(t))return;let r=e.readFileSync(t,"utf-8"),n=JSON.parse(C0(r));return n===null||typeof n!="object"||Array.isArray(n)?void 0:n}catch{return}}function C0(t){let e="",r=!1,n="",s=!1;for(let o=0;o<t.length;o+=1){let i=t[o],a=t[o+1];if(r){e+=i,s?s=!1:i==="\\"?s=!0:i===n&&(r=!1,n="");continue}if(i==='"'||i==="'"){r=!0,n=i,e+=i;continue}if(i==="/"&&a==="/"){for(;o<t.length&&t[o]!==`
1310
+ `;)o+=1;o<t.length&&(e+=t[o]);continue}if(i==="/"&&a==="*"){for(o+=2;o<t.length&&!(t[o]==="*"&&t[o+1]==="/");)o+=1;o+=1;continue}e+=i}return e.replace(/,\s*([}\]])/g,"$1")}function xo(t,e={}){let r=os(t,".opencode"),n=os(r,"opencode.json");if(!jp(n)){$0(r,{recursive:!0});let i=JSON.stringify({permission:"allow"},null,2);return $p(n,i+`
1311
+ `,"utf-8"),!0}let s;try{s=JSON.parse(Op(n,"utf-8"))}catch{return console.log(Lp.yellow(` .opencode/opencode.json at ${n} is malformed \u2014 skipping opencode config install.`)),!1}if(typeof s!="object"||s===null)return console.log(Lp.yellow(` .opencode/opencode.json at ${n} is not an object \u2014 skipping opencode config install.`)),!1;let o=!1;return s.permission===void 0&&(s.permission="allow",o=!0),Cp(s.permission)||Y({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.`}),o&&$p(n,JSON.stringify(s,null,2)+`
1312
+ `,"utf-8"),o}var Lp,Ao=T(()=>{"use strict";Ie();Lp={yellow:t=>t}});function Pp(t){let e=[...t.matchAll(M0)];if(e.length>0){let r=e[e.length-1],n=(r.index??0)+r[0].length;return Mp(t.slice(n).trimStart())}return Mp(W0(t.replace(D0,"")))}function W0(t){let e=P0.exec(t);if(e===null)return t;let r=t.slice(e[0].length),n=[...r.matchAll(F0)];if(n.length<2)return t;let s=n[0],o=(s.index??0)+s[0].length;return r.slice(o).trimStart()}function Mp(t){let e=[...t.matchAll(U0)];if(e.length===0)return t;let r=e[e.length-1],n=(r.index??0)+r[0].length;return t.slice(n).trimStart()}function is(t,e=""){let r=t.result;return typeof r?.sessionId=="string"&&r.sessionId.length>0?r.sessionId:e}function Fp(t){let e=t.result;return typeof e?.stopReason=="string"?e.stopReason:""}function Ql(t={}){let e="",r="",n="",s=!1,o=!1,i=()=>({result:t.tool==="gemini"?Pp(r):r,sessionId:e,stopReason:n});return{setSessionId(a){e=a},beginTurn(){r="",n="",s=!1,o=!0},completeTurn(a){return n=Fp(a),s=!0,o=!1,i()},processMessage(a){if(a.method!=="session/update")return!1;let c=a.params?.update;if(c?.sessionUpdate!=="agent_message_chunk")return!1;let u=c.content,d=typeof u?.text=="string"?u.text:"";return d&&o&&(r+=d,t.onDelta?.(d)),!0},finalize(){return s?i():null}}}var Dp,M0,D0,P0,F0,U0,ec=T(()=>{"use strict";Dp="(?:png|jpe?g|webp|heic|pdf)",M0=new RegExp(`\\bSTANCE:\\s*\\S+_\\d{6,}\\.${Dp}\\s*`,"gi"),D0=new RegExp(`^ACK:\\s*waiting for explicit lmctl task\\.\\d{6,}\\.${Dp}\\s*`,"i"),P0=/^ACK:\s*waiting for explicit lmctl task[._]?\s*/i,F0=/^STANCE:\s+\S+\s*$/gim,U0=/\[Thought:\s*true\]\s*/gi});import{spawn as B0}from"node:child_process";import{existsSync as H0}from"node:fs";import{createInterface as q0}from"node:readline";function J0(t){let e=t.stderr.trim().slice(0,500),r=`lmctl: ${t.tool} ACP process exited with code ${t.exitCode} before completing the prompt.
1313
1313
  One possible cause: the provider process failed before a complete ACP response was delivered.`;return e?`Original provider error:
1314
1314
  ${e}
1315
1315
 
@@ -1318,22 +1318,22 @@ ${r}`:r}function Up(t,e){let r=X0[e.tool];return r?new Promise((n,s)=>{let o=e.b
1318
1318
  `),e.cwd&&!H0(e.cwd))return Y({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),s(new ke(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=B0(o,a,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Be(e.env,e.cwd,e.sessionId)}),u=Date.now(),d=!1;if(e.signal){if(e.signal.aborted)return d=!0,Y({event:"transport_abort",provider:e.tool,phase:"pre_spawn"}),ct(c).catch(()=>{}),s(new Error("Aborted"));e.signal.addEventListener("abort",()=>{d=!0,Y({event:"transport_abort",provider:e.tool,elapsed_ms:Date.now()-u}),ct(c).catch(()=>{}),s(new Error("Aborted"))},{once:!0})}let f=q0({input:c.stdout}),m=new Map,p=e.sessionId||"",h=Ql({tool:e.tool,onDelta:e.onDelta});h.setSessionId(p);function g(w,E={}){return new Promise((I,x)=>{let H=G0++;m.set(H,{resolve:I,reject:x});let ue=JSON.stringify({jsonrpc:"2.0",id:H,method:w,params:E});Xe({event:"acp_send",direction:"SEND",provider:e.tool,method:w,id:H,params:E}),c.stdin?.write(ue+`
1319
1319
  `)})}f.on("line",w=>{let E;try{E=JSON.parse(w)}catch{return}if(Xe({event:"acp_recv",direction:"RECV",provider:e.tool,id:typeof E.id=="number"?E.id:void 0,method:typeof E.method=="string"?E.method:void 0,preview:JSON.stringify(E).slice(0,300)}),e.onEvent?.(E),typeof E.id=="number"&&m.has(E.id)){let x=m.get(E.id);if(m.delete(E.id),E.error){let H=E.error,ue=typeof H?.message=="string"&&H.message.length>0?H.message:JSON.stringify(E.error);x.reject(ko(`ACP RPC error: ${ue}`,H))}else x.resolve(E);return}let I=E.method;if(I){if(typeof E.id=="number"){Y({event:"acp_unhandled_request",provider:e.tool,method:I,id:E.id,params:E.params});let x=JSON.stringify({jsonrpc:"2.0",id:E.id,error:{code:-32601,message:`Method not found: ${I} (lmctl does not implement server-side ACP methods)`}});Xe({event:"acp_send",direction:"SEND",provider:e.tool,replyTo:E.id,error:"method not found"}),c.stdin?.write(x+`
1320
1320
  `);return}h.processMessage(E)}});let _="";c.stderr?.on("data",w=>{_+=w.toString()}),c.on("error",w=>{Y({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:w.message,elapsed_ms:Date.now()-u}),s(new ke(`Failed to spawn ${r.binary} ${r.args.join(" ")}: ${w.message}`,{cause:w}))}),c.on("exit",w=>{if(d)return;let E=h.finalize();E!==null?n({result:E.result,sessionId:E.sessionId,durationMs:Date.now()-u,stopReason:E.stopReason,exitCode:w}):(Y({event:"transport_error",provider:e.tool,error_class:"Error",reason:"provider_no_result",exit_code:w,stderr_tail:_.slice(0,500),elapsed_ms:Date.now()-u}),s(new Error(J0({tool:e.tool,exitCode:w,stderr:_}))))});function S(w,E={}){let I=JSON.stringify({jsonrpc:"2.0",method:w,params:E});c.stdin?.write(I+`
1321
- `)}(async()=>{try{if(await g("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),S("notifications/initialized"),e.sessionId)try{let I=await g("session/load",{sessionId:e.sessionId,cwd:e.cwd,mcpServers:[]});p=os(I,e.sessionId),h.setSessionId(p)}catch(I){if(e.requireResume)throw new Error(`Cannot resume session ${e.sessionId} via ACP: ${I instanceof Error?I.message:String(I)}`);process.stderr.write(`[acp] session/load failed for ${e.sessionId}, creating new session
1322
- `);let x=await g("session/new",{cwd:e.cwd,mcpServers:[]});p=os(x),h.setSessionId(p)}else{let I=await g("session/new",{cwd:e.cwd,mcpServers:[]});p=os(I),h.setSessionId(p)}if(e.model&&e.tool==="opencode")try{await g("session/set_config_option",{sessionId:p,configId:"model",value:e.model}),Et(`acp: set_config_option(model=${e.model}) ok`)}catch(I){let x=I instanceof Error?I.message:String(I);process.stderr.write(`[acp] set_config_option(model=${e.model}) failed: ${x}
1321
+ `)}(async()=>{try{if(await g("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),S("notifications/initialized"),e.sessionId)try{let I=await g("session/load",{sessionId:e.sessionId,cwd:e.cwd,mcpServers:[]});p=is(I,e.sessionId),h.setSessionId(p)}catch(I){if(e.requireResume)throw new Error(`Cannot resume session ${e.sessionId} via ACP: ${I instanceof Error?I.message:String(I)}`);process.stderr.write(`[acp] session/load failed for ${e.sessionId}, creating new session
1322
+ `);let x=await g("session/new",{cwd:e.cwd,mcpServers:[]});p=is(x),h.setSessionId(p)}else{let I=await g("session/new",{cwd:e.cwd,mcpServers:[]});p=is(I),h.setSessionId(p)}if(e.model&&e.tool==="opencode")try{await g("session/set_config_option",{sessionId:p,configId:"model",value:e.model}),Et(`acp: set_config_option(model=${e.model}) ok`)}catch(I){let x=I instanceof Error?I.message:String(I);process.stderr.write(`[acp] set_config_option(model=${e.model}) failed: ${x}
1323
1323
  `)}if(e.effort&&e.tool==="opencode")try{await g("session/set_config_option",{sessionId:p,configId:"effort",value:e.effort}),Et(`acp: set_config_option(effort=${e.effort}) ok`)}catch(I){let x=I instanceof Error?I.message:String(I);process.stderr.write(`[acp] set_config_option(effort=${e.effort}) failed: ${x}
1324
1324
  `)}h.beginTurn(),Et(`acp: prompt sent (${t.length} chars)`);let w=await g("session/prompt",{sessionId:p,prompt:[{type:"text",text:t}]}),E=h.completeTurn(w);Et(`acp: result received (${E.result.length} chars, stopReason=${E.stopReason})`),c.stdin?.end()}catch(w){ct(c).catch(()=>{}),s(w instanceof Error?w:new Error(String(w)))}})()}):Promise.reject(new Error(`No ACP config for tool "${e.tool}"`))}var X0,G0,Wp=T(()=>{"use strict";Ie();Vr();vo();Yr();Ao();Ie();lt();ec();ec();X0={gemini:{binary:"gemini",args:["--acp","-y","--skip-trust"]},copilot:{binary:"copilot",args:["--acp","--yolo"]},opencode:{binary:"opencode",args:["acp"]}},G0=1});function ge(t,e=120){let r=t.replace(/\s+/g," ").trim();return r.length>e?r.slice(0,e-1)+"\u2026":r}function Bp(t,e){return r=>{if(r.kind==="tool_use"&&typeof r.id=="string"){if(t.size>=K0){let n=t.keys().next().value;n!==void 0&&t.delete(n)}t.set(r.id,Date.now()),e(r);return}if(r.kind==="tool_result"&&typeof r.id=="string"&&r.elapsedMs===void 0){let n=t.get(r.id);if(n!==void 0){e({...r,elapsedMs:Date.now()-n}),t.delete(r.id);return}}e(r)}}function V0(){let t=new Map;return(e,r)=>{Y0(e,Bp(t,r))}}function Y0(t,e){let r=t.type;if(r==="system"){let n=t.subtype;if(n==="api_retry"){let s=typeof t.attempt=="number"?t.attempt:void 0,o=typeof t.max_retries=="number"?t.max_retries:void 0,i=typeof t.error_status=="number"?t.error_status:void 0,a=typeof t.error=="string"?t.error:void 0,l=typeof t.retry_delay_ms=="number"?t.retry_delay_ms:void 0,c=[];s!==void 0&&c.push(o!==void 0?`attempt ${s}/${o}`:`attempt ${s}`),i!==void 0&&c.push(`HTTP ${i}`),l!==void 0&&c.push(`retry in ${Math.round(l/1e3)}s`),a&&c.push(ge(a,60));let u=c.length>0?c.join(", "):n;e({kind:"api_retry",summary:u});return}if(n==="api_error"){let s=typeof t.error_status=="number"?t.error_status:void 0,o=typeof t.error=="string"?t.error:void 0,i=["api_error"];s!==void 0&&i.push(`HTTP ${s}`),o&&i.push(ge(o,80)),e({kind:"other",summary:i.join(": "),raw:t});return}e({kind:"system",summary:n||"system",raw:t});return}if(r==="assistant"||r==="user"){let s=t.message?.content;if(!Array.isArray(s))return;for(let o of s){let i=o.type;if(i==="text"){let a=o.text||"";a&&e({kind:"text",summary:ge(a),raw:o})}else if(i==="tool_use"){let a=o.name||"tool",l=typeof o.id=="string"?o.id:void 0,c=o.input,u="";c&&(typeof c.command=="string"?u=c.command:typeof c.file_path=="string"?u=c.file_path:typeof c.path=="string"?u=c.path:typeof c.pattern=="string"?u=c.pattern:typeof c.url=="string"?u=c.url:u=ge(JSON.stringify(c))),e({kind:"tool_use",tool:a,summary:ge(u),id:l,raw:o})}else if(i==="thinking"){let a=o.thinking||"";e({kind:"thinking",summary:ge(a),raw:o})}else if(i==="tool_result"){let l=o.is_error===!0?"error":"ok",c=typeof o.tool_use_id=="string"?o.tool_use_id:void 0,u,d=o.content;if(typeof d=="string")u=`${d.split(`
1325
1325
  `).length} lines, ${d.length} chars`;else if(Array.isArray(d)){let f=d.map(m=>typeof m=="object"&&m&&"text"in m?m.text:"").filter(Boolean).join("");f&&(u=`${f.split(`
1326
1326
  `).length} lines, ${f.length} chars`)}e({kind:"tool_result",status:l,summary:u,id:c,raw:o})}else i&&e({kind:"other",summary:i,raw:o})}return}if(r==="result"){e({kind:"system",summary:"result",raw:t});return}}async function Ro(t,e){let r=e.binary==="qwen"?"qwen":"claude",n=e.onProgress?V0():void 0,s=await vp(t,{sessionId:e.sessionId,cwd:e.cwd,env:e.env,tool:r,binaryPath:e.progPath,model:e.model,permissionMode:e.permissionMode,onText:e.onDelta,onEvent:n?o=>n(o,e.onProgress):void 0,signal:e.signal});return{text:s.result,sessionId:s.sessionId,durationMs:s.durationMs,numTurns:s.numTurns}}function z0(){let t=new Map;return(e,r)=>{Z0(e,Bp(t,r))}}function Z0(t,e){if(t.method!=="session/update")return;let s=t.params?.update;if(!s)return;let o=s.sessionUpdate;if(o){if(o==="agent_message_chunk"){let a=s.content?.text||"";a&&e({kind:"text",summary:ge(a)});return}if(o==="agent_thought_chunk"){let a=s.content?.text||"";e({kind:"thinking",summary:ge(a)});return}if(o==="tool_call"){let i=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=ge(JSON.stringify(c))),e({kind:"tool_use",tool:i,summary:ge(l),id:a});return}if(o==="tool_call_update"){let i=s.status||"",a=typeof s.toolCallId=="string"?s.toolCallId:void 0;if(i==="completed"||i==="failed")e({kind:"tool_result",summary:i,status:i==="failed"?"error":"ok",id:a});else if(i==="in_progress"){let l=s.content,c=typeof l=="string"?l:typeof l?.text=="string"?l.text:"",u=c?`running\u2026 ${ge(c,80)}`:"running\u2026";e({kind:"other",summary:u,id:a})}return}e({kind:"other",summary:o})}}async function zr(t,e){let r=e.acpTool||e.binary;e.model&&r==="copilot"&&Xe({event:"model_ignored",provider:r,model:e.model,reason:"copilot --acp does not implement per-session model selection"});let n=e.onProgress?z0():void 0,s=await Up(t,{tool:r,sessionId:e.sessionId,cwd:e.cwd,env:e.env,binaryPath:e.progPath,model:e.model,effort:e.effort,alias:e.alias,permissionMode:e.permissionMode,onDelta:e.onDelta,onEvent:n?o=>n(o,e.onProgress):void 0,signal:e.signal});return{text:s.result,sessionId:s.sessionId,durationMs:s.durationMs,stopReason:s.stopReason}}function Q0(t,e){let r=t.method;if(!r)return;let n=t.params;if(r==="turn/started"){e({kind:"system",summary:"turn started"});return}if(r==="turn/completed"){e({kind:"system",summary:"turn completed"});return}if(r==="error"){let s=n?.error,o=typeof s?.message=="string"?s.message:void 0,i=o&&o.length>0?o:"(no message)",a=n?.willRetry===!0;e(a?{kind:"api_retry",summary:`codex retry: ${ge(i,120)}`}:{kind:"other",summary:`codex error: ${ge(i,120)}`});return}if(r==="item/started"||r==="item/completed"){let s=n?.item;if(!s)return;let o=s.type,i=r==="item/started";switch(o){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(i)e({kind:"tool_use",tool:"Bash",summary:ge(c||"(command)"),id:a});else{let u=s.exitCode,d=s.status||"",f=typeof s.durationMs=="number"?s.durationMs:void 0,m=typeof u=="number"?`exit ${u}`:d||"done",p=[];typeof u=="number"?p.push(`exit ${u}`):d&&p.push(d),typeof f=="number"&&p.push(`${Math.round(f/1e3)}s`),e({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(i){let l=s.changes,c=Array.isArray(l)?l.map(u=>u.path||"").filter(Boolean).join(", "):"";e({kind:"tool_use",tool:"FileChange",summary:ge(c||"(edit)"),id:a})}else{let l=s.status||"done";e({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(i)e({kind:"tool_use",tool:`${l}/${c}`,summary:"",id:a});else{let u=s.status||"done";e({kind:"tool_result",summary:u,status:u,id:a})}return}case"webSearch":{let a=typeof s.id=="string"?s.id:void 0;e(i?{kind:"tool_use",tool:"WebSearch",summary:ge(s.query||""),id:a}:{kind:"tool_result",summary:"done",status:"done",id:a});return}case"reasoning":{i&&e({kind:"thinking",summary:""});return}case"agentMessage":case"userMessage":return;default:{o&&e({kind:i?"tool_use":"tool_result",tool:o,summary:""});return}}}if(r==="item/agentMessage/delta"){let s=n?.delta||"";if(s){let o=typeof n?._lmctlItemPhase=="string"?n._lmctlItemPhase:void 0;e(o==="commentary"?{kind:"thinking",summary:ge(s)}:{kind:"text",summary:ge(s)})}return}if(r==="item/reasoning/summaryTextDelta"||r==="item/reasoning/textDelta"){let s=n?.delta||"";s&&e({kind:"thinking",summary:ge(s)});return}if(r==="item/commandExecution/outputDelta"){let s=(typeof n?.delta=="string"?n.delta:"")||"";if(s){let o=s.split(`
1327
1327
  `).filter(l=>l.length>0),i=o[o.length-1]||"",a=o.length>1?`${o.length} lines: ${ge(i,60)}`:ge(s,80);e({kind:"other",summary:`running\u2026 ${a}`})}else e({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 o=s.split(`
1328
- `).filter(l=>l.length>0),i=o[o.length-1]||"",a=o.length>1?`${o.length} lines: ${ge(i,60)}`:ge(s,80);e({kind:"other",summary:`running\u2026 ${a}`})}else e({kind:"other",summary:"running\u2026"});return}if(r.startsWith("item/")){e({kind:"other",summary:r.slice(5)});return}}async function Hp(t,e){let r=await Ap(t,{threadId:e.sessionId,cwd:e.cwd,env:e.env,binaryPath:e.progPath,model:e.model,alias:e.alias,isLead:e.isLead,permissionMode:e.permissionMode,onDelta:e.onDelta,onEvent:e.onProgress?n=>Q0(n,e.onProgress):void 0,signal:e.signal});return{text:r.result,sessionId:r.threadId,durationMs:r.durationMs}}var K0,vr=T(()=>{"use strict";Ip();Rp();Wp();Ie();K0=256});function rc(t){return new tc(t)}var tc,nc=T(()=>{"use strict";pp();Dt();vr();bt();tc=class extends $e{constructor(e){super({provider:new Eo(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"claude",seedArgs:["-p",we,"--dangerously-skip-permissions"],resumeTemplate:"claude --resume {{session_id}}",startTemplate:"claude",transport:Ro})}}});import{readdir as eN,stat as qp,unlink as tN}from"node:fs/promises";import{join as is,basename as rN}from"node:path";function nN(t,e,r){return`${t}|${e.toISOString()}|${r}`}function as(t,e,r){let n=nN(r.role,r.timestamp,r.content);e.has(n)||(e.add(n),t.push(r))}function Jp(t,e){return e==="exec"||t==="codex_exec"?"codex exec":"codex"}function sN(t){if(!t)return;let e=t.cached_input_tokens??t.cache_read_input_tokens;return{inputTokens:t.input_tokens,cachedInputTokens:e,outputTokens:t.output_tokens,reasoningOutputTokens:t.reasoning_output_tokens,totalTokens:t.total_tokens}}function $o(t){if(t==null)return"";if(typeof t=="string")return t;if(typeof t=="number"||typeof t=="boolean")return String(t);if(Array.isArray(t))return t.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 $o(r)}).filter(r=>r.length>0).join(`
1329
- `);try{return JSON.stringify(t)}catch{return String(t)}}async function Xp(t){let e=0,r=0,n=0,s=0,o=0,i,a;for await(let l of We(t)){if(l.type==="response_item"&&l.payload){let c=l.payload;if(c.type==="message"&&c.role==="user"&&c.content)for(let u of c.content)u.type==="input_text"&&typeof u.text=="string"&&u.text&&e++;else if(c.type==="message"&&c.role==="assistant"&&c.content)for(let u of c.content)u.type==="output_text"&&typeof u.text=="string"&&u.text&&e++}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,o=c.reasoning_output_tokens??o;let u=sN(l.payload.info.last_token_usage);u&&(i=u),typeof l.payload.info.model_context_window=="number"&&(a=l.payload.info.model_context_window)}}return{messageCount:e,totalInputTokens:r,totalCachedInputTokens:n,totalOutputTokens:s,totalReasoningOutputTokens:o,lastTokenUsage:i,modelContextWindow:a}}var jo,Gp=T(()=>{"use strict";rr();jo=class{name="codex";codexDirs;constructor(e={}){let r=[is(Se,".codex"),is(Se,".code")];if(e.codexDirs&&e.codexDirs.length>0){this.codexDirs=[...new Set(e.codexDirs)];return}let n=[e.codexDir||r[0],e.codeDir||r[1]];this.codexDirs=[...new Set(n)]}getWatchPaths(){return this.codexDirs.map(e=>({directory:is(e,"sessions"),filePattern:/\.jsonl$/}))}async getSessionsDirs(){let e=[];for(let r of this.codexDirs){let n=is(r,"sessions");try{await qp(n),e.push(n)}catch{}}return e}async discoverSessions(){let e=[],r=await this.getSessionsDirs();for(let n of r){let s=await this.findSessionFiles(n);for(let o of s)try{let i=await this.extractSummary(o);i&&e.push(i)}catch{}}return e}async findSessionFiles(e){let r=[],n;try{n=await eN(e)}catch{return r}for(let s of n){let o=is(e,s),i=await qp(o).catch(()=>null);if(i)if(i.isDirectory()){let a=await this.findSessionFiles(o);r.push(...a)}else s.endsWith(".jsonl")&&r.push(o)}return r}extractSessionIdFromFilename(e){let r=rN(e,".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(e){let r=await Ce(e,30),n=await Re(e),s=this.extractSessionIdFromFilename(e),o="",i,a,l,c,u,d,f;for(let p of r){if(p.type==="session_meta"&&p.payload&&(p.payload.id&&(s=p.payload.id),p.payload.cwd&&(o=p.payload.cwd),p.payload.cli_version&&(i=p.payload.cli_version),p.payload.timestamp&&(l=new Date(p.payload.timestamp)),p.payload.originator&&(d=p.payload.originator),p.payload.source&&(f=p.payload.source)),p.type==="turn_context"&&p.payload&&(p.payload.model&&(a=p.payload.model),!o&&p.payload.cwd&&(o=p.payload.cwd)),p.type==="event_msg"&&p.payload?.type==="user_message"){let h=p.payload.message||p.payload.text;h&&(c||(c=G(h.trim(),80)),u=G(h.trim(),80))}if(p.type==="response_item"&&p.payload?.type==="message"&&p.payload.role==="user"&&p.payload.content){let h=p.payload.content.find(g=>g.type==="input_text"&&typeof g.text=="string"&&g.text);typeof h?.text=="string"&&(c||(c=G(h.text.trim(),80)),u=G(h.text.trim(),80))}}if(!o)return null;let m=await Xp(e);return{provider:"codex",sessionId:s,cwd:o,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:i,startCommand:Jp(d,f),firstUserMessage:c,lastUserMessage:u,messageCount:m.messageCount,filePath:e,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(e){let r=await this.resolveSessionFile(e);if(!r)return null;let n=await Re(r),s=[],o="",i,a,l,c,u,d=e,f,m=new Set;for await(let h of We(r)){let g=h.timestamp?new Date(h.timestamp):new Date;if(h.type==="session_meta"&&h.payload){h.payload.id&&(d=h.payload.id),h.payload.cwd&&(o=h.payload.cwd),h.payload.cli_version&&(i=h.payload.cli_version),h.payload.timestamp&&(l=new Date(h.payload.timestamp)),f=Jp(h.payload.originator,h.payload.source);continue}if(h.type==="turn_context"&&h.payload){h.payload.model&&(a=h.payload.model),!o&&h.payload.cwd&&(o=h.payload.cwd);continue}if(h.type==="response_item"&&h.payload){let _=h.payload;if(_.type==="message"){if(_.role==="user"&&_.content){for(let S of _.content)if(S.type==="input_text"&&typeof S.text=="string"&&S.text){let w=S.text.trim();c||(c=G(w,80)),u=G(w,80),as(s,m,{role:"user",timestamp:g,content:me(w)})}continue}if(_.role==="assistant"&&_.content){for(let S of _.content)S.type==="output_text"&&typeof S.text=="string"&&S.text&&as(s,m,{role:"assistant",timestamp:g,content:me(S.text),model:a});continue}if(_.role!=="user"&&_.role!=="assistant"&&_.content){for(let S of _.content)(S.type==="input_text"||S.type==="output_text")&&typeof S.text=="string"&&S.text&&as(s,m,{role:"system",timestamp:g,content:me(S.text.trim())});continue}}if(_.type==="function_call"){s.push({role:"tool_use",timestamp:g,content:_.name||"unknown tool",toolName:_.name,toolInput:_.arguments!==void 0?me($o(_.arguments)):void 0,toolCallId:_.call_id});continue}if(_.type==="function_call_output"){s.push({role:"tool_result",timestamp:g,content:me($o(_.output)),toolCallId:_.call_id});continue}if(_.type==="reasoning"&&_.summary){let S=_.summary.map(w=>$o(w.text)).join(`
1330
- `);S.trim()&&as(s,m,{role:"thinking",timestamp:g,content:me(S)});continue}}if(h.type==="event_msg"&&h.payload&&h.payload.type==="agent_reasoning"){let _=h.payload.message||h.payload.text;_&&as(s,m,{role:"thinking",timestamp:g,content:me(_)})}}if(!o)return null;let p=await Xp(r);return{provider:"codex",sessionId:d,cwd:o,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:i,startCommand:f,firstUserMessage:c,lastUserMessage:u,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(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await tN(r),!0):!1}async resolveSessionFile(e){let r=await this.getSessionsDirs(),n=[];for(let o of r){let i=await this.findSessionFiles(o);n.push(...i)}for(let o of n)if(this.extractSessionIdFromFilename(o)===e)return o;let s=[];for(let o of n)this.extractSessionIdFromFilename(o).startsWith(e)&&s.push(o);if(s.length===1)return s[0];for(let o of n){let i=await Ce(o,1);if(i.length>0&&i[0].type==="session_meta"){let a=i[0].payload?.id;if(a===e||a&&a.startsWith(e))return o}}return null}}});function oc(t){return new sc(t)}var sc,ic=T(()=>{"use strict";Gp();Dt();vr();bt();sc=class extends $e{constructor(e){super({provider:new jo(e),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:`${we}
1331
- `,resumeTemplate:"codex resume {{session_id}}",startTemplate:"codex",transport:Hp})}seedArgsFor(e){let r=super.seedArgsFor(e);return e?.model?[...r.slice(0,-1),"--model",e.model,r[r.length-1]]:r}}});function ls(t){if(!t.trim())return"unknown";let e=t.split(/\r?\n/).filter(n=>n.trim().length>0);if(e.length>1)try{let n=JSON.parse(e[0]);if(n!==null&&typeof n=="object"&&!Array.isArray(n)&&"kind"in n)return"jsonl"}catch{}let r;try{r=JSON.parse(t)}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 Lo(t){let e=ls(t);if(e==="unknown")throw new Error("gemini session content matches neither known format (old .json with messages[] or new .jsonl with kind metadata)");if(e==="json"){let a=JSON.parse(t);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=t.split(`
1328
+ `).filter(l=>l.length>0),i=o[o.length-1]||"",a=o.length>1?`${o.length} lines: ${ge(i,60)}`:ge(s,80);e({kind:"other",summary:`running\u2026 ${a}`})}else e({kind:"other",summary:"running\u2026"});return}if(r.startsWith("item/")){e({kind:"other",summary:r.slice(5)});return}}async function Hp(t,e){let r=await Ap(t,{threadId:e.sessionId,cwd:e.cwd,env:e.env,binaryPath:e.progPath,model:e.model,alias:e.alias,isLead:e.isLead,permissionMode:e.permissionMode,onDelta:e.onDelta,onEvent:e.onProgress?n=>Q0(n,e.onProgress):void 0,signal:e.signal});return{text:r.result,sessionId:r.threadId,durationMs:r.durationMs}}var K0,vr=T(()=>{"use strict";Ip();Rp();Wp();Ie();K0=256});function rc(t){return new tc(t)}var tc,nc=T(()=>{"use strict";pp();Dt();vr();bt();tc=class extends $e{constructor(e){super({provider:new Eo(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"claude",seedArgs:["-p",we,"--dangerously-skip-permissions"],resumeTemplate:"claude --resume {{session_id}}",startTemplate:"claude",transport:Ro})}}});import{readdir as eN,stat as qp,unlink as tN}from"node:fs/promises";import{join as as,basename as rN}from"node:path";function nN(t,e,r){return`${t}|${e.toISOString()}|${r}`}function ls(t,e,r){let n=nN(r.role,r.timestamp,r.content);e.has(n)||(e.add(n),t.push(r))}function Jp(t,e){return e==="exec"||t==="codex_exec"?"codex exec":"codex"}function sN(t){if(!t)return;let e=t.cached_input_tokens??t.cache_read_input_tokens;return{inputTokens:t.input_tokens,cachedInputTokens:e,outputTokens:t.output_tokens,reasoningOutputTokens:t.reasoning_output_tokens,totalTokens:t.total_tokens}}function $o(t){if(t==null)return"";if(typeof t=="string")return t;if(typeof t=="number"||typeof t=="boolean")return String(t);if(Array.isArray(t))return t.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 $o(r)}).filter(r=>r.length>0).join(`
1329
+ `);try{return JSON.stringify(t)}catch{return String(t)}}async function Xp(t){let e=0,r=0,n=0,s=0,o=0,i,a;for await(let l of We(t)){if(l.type==="response_item"&&l.payload){let c=l.payload;if(c.type==="message"&&c.role==="user"&&c.content)for(let u of c.content)u.type==="input_text"&&typeof u.text=="string"&&u.text&&e++;else if(c.type==="message"&&c.role==="assistant"&&c.content)for(let u of c.content)u.type==="output_text"&&typeof u.text=="string"&&u.text&&e++}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,o=c.reasoning_output_tokens??o;let u=sN(l.payload.info.last_token_usage);u&&(i=u),typeof l.payload.info.model_context_window=="number"&&(a=l.payload.info.model_context_window)}}return{messageCount:e,totalInputTokens:r,totalCachedInputTokens:n,totalOutputTokens:s,totalReasoningOutputTokens:o,lastTokenUsage:i,modelContextWindow:a}}var Lo,Gp=T(()=>{"use strict";rr();Lo=class{name="codex";codexDirs;constructor(e={}){let r=[as(Se,".codex"),as(Se,".code")];if(e.codexDirs&&e.codexDirs.length>0){this.codexDirs=[...new Set(e.codexDirs)];return}let n=[e.codexDir||r[0],e.codeDir||r[1]];this.codexDirs=[...new Set(n)]}getWatchPaths(){return this.codexDirs.map(e=>({directory:as(e,"sessions"),filePattern:/\.jsonl$/}))}async getSessionsDirs(){let e=[];for(let r of this.codexDirs){let n=as(r,"sessions");try{await qp(n),e.push(n)}catch{}}return e}async discoverSessions(){let e=[],r=await this.getSessionsDirs();for(let n of r){let s=await this.findSessionFiles(n);for(let o of s)try{let i=await this.extractSummary(o);i&&e.push(i)}catch{}}return e}async findSessionFiles(e){let r=[],n;try{n=await eN(e)}catch{return r}for(let s of n){let o=as(e,s),i=await qp(o).catch(()=>null);if(i)if(i.isDirectory()){let a=await this.findSessionFiles(o);r.push(...a)}else s.endsWith(".jsonl")&&r.push(o)}return r}extractSessionIdFromFilename(e){let r=rN(e,".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(e){let r=await Ce(e,30),n=await Re(e),s=this.extractSessionIdFromFilename(e),o="",i,a,l,c,u,d,f;for(let p of r){if(p.type==="session_meta"&&p.payload&&(p.payload.id&&(s=p.payload.id),p.payload.cwd&&(o=p.payload.cwd),p.payload.cli_version&&(i=p.payload.cli_version),p.payload.timestamp&&(l=new Date(p.payload.timestamp)),p.payload.originator&&(d=p.payload.originator),p.payload.source&&(f=p.payload.source)),p.type==="turn_context"&&p.payload&&(p.payload.model&&(a=p.payload.model),!o&&p.payload.cwd&&(o=p.payload.cwd)),p.type==="event_msg"&&p.payload?.type==="user_message"){let h=p.payload.message||p.payload.text;h&&(c||(c=G(h.trim(),80)),u=G(h.trim(),80))}if(p.type==="response_item"&&p.payload?.type==="message"&&p.payload.role==="user"&&p.payload.content){let h=p.payload.content.find(g=>g.type==="input_text"&&typeof g.text=="string"&&g.text);typeof h?.text=="string"&&(c||(c=G(h.text.trim(),80)),u=G(h.text.trim(),80))}}if(!o)return null;let m=await Xp(e);return{provider:"codex",sessionId:s,cwd:o,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:i,startCommand:Jp(d,f),firstUserMessage:c,lastUserMessage:u,messageCount:m.messageCount,filePath:e,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(e){let r=await this.resolveSessionFile(e);if(!r)return null;let n=await Re(r),s=[],o="",i,a,l,c,u,d=e,f,m=new Set;for await(let h of We(r)){let g=h.timestamp?new Date(h.timestamp):new Date;if(h.type==="session_meta"&&h.payload){h.payload.id&&(d=h.payload.id),h.payload.cwd&&(o=h.payload.cwd),h.payload.cli_version&&(i=h.payload.cli_version),h.payload.timestamp&&(l=new Date(h.payload.timestamp)),f=Jp(h.payload.originator,h.payload.source);continue}if(h.type==="turn_context"&&h.payload){h.payload.model&&(a=h.payload.model),!o&&h.payload.cwd&&(o=h.payload.cwd);continue}if(h.type==="response_item"&&h.payload){let _=h.payload;if(_.type==="message"){if(_.role==="user"&&_.content){for(let S of _.content)if(S.type==="input_text"&&typeof S.text=="string"&&S.text){let w=S.text.trim();c||(c=G(w,80)),u=G(w,80),ls(s,m,{role:"user",timestamp:g,content:me(w)})}continue}if(_.role==="assistant"&&_.content){for(let S of _.content)S.type==="output_text"&&typeof S.text=="string"&&S.text&&ls(s,m,{role:"assistant",timestamp:g,content:me(S.text),model:a});continue}if(_.role!=="user"&&_.role!=="assistant"&&_.content){for(let S of _.content)(S.type==="input_text"||S.type==="output_text")&&typeof S.text=="string"&&S.text&&ls(s,m,{role:"system",timestamp:g,content:me(S.text.trim())});continue}}if(_.type==="function_call"){s.push({role:"tool_use",timestamp:g,content:_.name||"unknown tool",toolName:_.name,toolInput:_.arguments!==void 0?me($o(_.arguments)):void 0,toolCallId:_.call_id});continue}if(_.type==="function_call_output"){s.push({role:"tool_result",timestamp:g,content:me($o(_.output)),toolCallId:_.call_id});continue}if(_.type==="reasoning"&&_.summary){let S=_.summary.map(w=>$o(w.text)).join(`
1330
+ `);S.trim()&&ls(s,m,{role:"thinking",timestamp:g,content:me(S)});continue}}if(h.type==="event_msg"&&h.payload&&h.payload.type==="agent_reasoning"){let _=h.payload.message||h.payload.text;_&&ls(s,m,{role:"thinking",timestamp:g,content:me(_)})}}if(!o)return null;let p=await Xp(r);return{provider:"codex",sessionId:d,cwd:o,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:i,startCommand:f,firstUserMessage:c,lastUserMessage:u,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(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await tN(r),!0):!1}async resolveSessionFile(e){let r=await this.getSessionsDirs(),n=[];for(let o of r){let i=await this.findSessionFiles(o);n.push(...i)}for(let o of n)if(this.extractSessionIdFromFilename(o)===e)return o;let s=[];for(let o of n)this.extractSessionIdFromFilename(o).startsWith(e)&&s.push(o);if(s.length===1)return s[0];for(let o of n){let i=await Ce(o,1);if(i.length>0&&i[0].type==="session_meta"){let a=i[0].payload?.id;if(a===e||a&&a.startsWith(e))return o}}return null}}});function oc(t){return new sc(t)}var sc,ic=T(()=>{"use strict";Gp();Dt();vr();bt();sc=class extends $e{constructor(e){super({provider:new Lo(e),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:`${we}
1331
+ `,resumeTemplate:"codex resume {{session_id}}",startTemplate:"codex",transport:Hp})}seedArgsFor(e){let r=super.seedArgsFor(e);return e?.model?[...r.slice(0,-1),"--model",e.model,r[r.length-1]]:r}}});function cs(t){if(!t.trim())return"unknown";let e=t.split(/\r?\n/).filter(n=>n.trim().length>0);if(e.length>1)try{let n=JSON.parse(e[0]);if(n!==null&&typeof n=="object"&&!Array.isArray(n)&&"kind"in n)return"jsonl"}catch{}let r;try{r=JSON.parse(t)}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 jo(t){let e=cs(t);if(e==="unknown")throw new Error("gemini session content matches neither known format (old .json with messages[] or new .jsonl with kind metadata)");if(e==="json"){let a=JSON.parse(t);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=t.split(`
1332
1332
  `).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 o=[],i=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 u=c;if(typeof u.id=="string"){let d=i.get(u.id);d?oN(d,u):(o.push(u),i.set(u.id,u))}else o.push(u)}}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:o}}function oN(t,e){for(let[r,n]of Object.entries(e))if(n!==void 0){if(r==="tokens"&&Kp(t.tokens)&&Kp(n)){t.tokens={...t.tokens,...n};continue}t[r]=n}}function Kp(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Vp(t,e){if(e==="json")return JSON.stringify(t,null,2);let{messages:r,...n}=t,s=[JSON.stringify(n)];for(let o of r)s.push(JSON.stringify(o));return s.join(`
1333
1333
  `)+`
1334
- `}var ac=T(()=>{"use strict"});import{createHash as iN}from"node:crypto";import{readdir as cs,readFile as Yp,stat as Oo,unlink as aN}from"node:fs/promises";import{join as Ge,basename as lN,dirname as cN}from"node:path";import{cwd as uN}from"node:process";function zp(t){return t?typeof t=="string"?t:Array.isArray(t)?t.map(e=>e.text||"").join(""):"":""}function Zp(t){return t==="user"}function lc(t){return t==="gemini"||t==="assistant"}function Ir(t,e=new Date(0)){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function dN(t){return`${t.sessionId}\0${t.cwd}`}function fN(t,e){let r=t.filePaths??[t.filePath],n=e.filePaths??[e.filePath],s=[...new Set([...r,...n])],o=e.modifiedAt.getTime()>=t.modifiedAt.getTime()?e:t;return{...o,createdAt:t.createdAt.getTime()<=e.createdAt.getTime()?t.createdAt:e.createdAt,modifiedAt:o.modifiedAt,filePath:o.filePath,filePaths:s}}function Co(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}function Qp(t){let e=0,r=0,n=0,s=0,o=0,i;for(let a of t){if(!lc(a.type)||!a.tokens)continue;let l=Co(a.tokens.input),c=Co(a.tokens.cached),u=Math.max(l-c,0),d=Co(a.tokens.output),f=Co(a.tokens.thoughts);e+=l,r+=c,n+=d,s+=f,o=l,i={inputTokens:u,cachedInputTokens:c,cacheWriteInputTokens:0,outputTokens:d,reasoningOutputTokens:f,totalTokens:l+d+f}}return{totalInputTokens:e,totalCachedInputTokens:r,totalOutputTokens:n,totalReasoningOutputTokens:s,lastInputTokens:o,lastTokenUsage:i}}function mN(t){return iN("sha256").update(t).digest("hex")}function us(t,e){let r=e;for(;r&&!t.has(r);){t.add(r);let n=cN(r);if(n===r)break;r=n}}var Mo,eh=T(()=>{"use strict";rr();ac();Ie();Mo=class{name="gemini";workspaceHashMap;geminiProjectsFile;geminiTmpDir;claudeProjectsDir;codexSessionDirs;extraWorkspacePaths;constructor(e={}){let r=e.geminiDir||Ge(Se,".gemini");this.geminiProjectsFile=Ge(r,"projects.json"),this.geminiTmpDir=Ge(r,"tmp");let n=e.claudeDir||Ge(Se,".claude");this.claudeProjectsDir=Ge(n,"projects");let s=[Ge(Se,".codex"),Ge(Se,".code")],o=e.codexDirs&&e.codexDirs.length>0?e.codexDirs:[e.codexDir||s[0],e.codeDir||s[1]];this.codexSessionDirs=[...new Set(o)].map(i=>Ge(i,"sessions")),this.extraWorkspacePaths=e.extraWorkspacePaths||[]}getWatchPaths(){return[{directory:this.geminiTmpDir,filePattern:/\.jsonl?$/}]}async discoverSessions(){let e=await this.findSessionFiles(),r=new Map;for(let n of e)try{let s=await this.extractSummary(n);if(!s)continue;let o=dN(s),i=r.get(o);r.set(o,i?fN(i,s):s)}catch{}return[...r.values()]}async loadSession(e){let r=await this.resolveSessionFile(e);if(!r)return null;let n;try{n=await this.readSessionFile(r)}catch{return null}if(!n)return null;let s=await Re(r),o=[],i=n.messages||[],a=n.sessionId||this.extractSessionIdFromFilename(r),l=n.projectHash||"",c=await this.resolveWorkspace(l),u,d,f;for(let g of i){let _=Ir(g.timestamp),S=g.type,w=me(zp(g.content));if(Zp(S)){let I=w.trim();I&&(u||(u=G(I,80)),d=G(I,80)),o.push({role:"user",timestamp:_,content:I||w});continue}if(lc(S)){g.model&&(f=g.model);for(let I of g.thoughts||[]){let x=[I.subject,I.description].filter(Boolean).join(`
1335
- `).trim();x&&o.push({role:"thinking",timestamp:Ir(I.timestamp,_),content:me(x)})}o.push({role:"assistant",timestamp:_,content:w,model:g.model});continue}let E=S?`[${S}] `:"";o.push({role:"system",timestamp:_,content:`${E}${w}`.trim()})}let m=Ir(n.startTime,s.createdAt),p=Ir(n.lastUpdated,s.modifiedAt),h=Qp(i);return{provider:"gemini",sessionId:a,cwd:c,createdAt:m,modifiedAt:p,model:f,startCommand:"gemini",firstUserMessage:u,lastUserMessage:d,messageCount:o.filter(g=>g.role==="user"||g.role==="assistant").length,filePath:r,totalInputTokens:h.totalInputTokens||void 0,totalCachedInputTokens:h.totalCachedInputTokens||void 0,totalOutputTokens:h.totalOutputTokens||void 0,totalReasoningOutputTokens:h.totalReasoningOutputTokens||void 0,lastInputTokens:h.lastInputTokens||void 0,lastTokenUsage:h.lastTokenUsage,messages:o}}async extractSummary(e){let r=await this.readSessionFile(e);if(!r)return null;let n=await Re(e),s=r.messages||[],o=r.sessionId||this.extractSessionIdFromFilename(e),i=r.projectHash||"",a=await this.resolveWorkspace(i),l,c,u,d=0;for(let m of s)if(Zp(m.type)){d++;let p=zp(m.content).trim();p&&(l||(l=G(me(p),80)),c=G(me(p),80))}else lc(m.type)&&(d++,m.model&&(u=m.model));let f=Qp(s);return{provider:"gemini",sessionId:o,cwd:a,createdAt:Ir(r.startTime,n.createdAt),modifiedAt:Ir(r.lastUpdated,n.modifiedAt),model:u,startCommand:"gemini",firstUserMessage:l,lastUserMessage:c,messageCount:d,filePath:e,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(e){let r=await Yp(e,"utf-8");if(ls(r)==="unknown")return Y({event:"gemini_session_format_unknown",provider:"gemini",file:e,preview:r.slice(0,120),message:`gemini session file at ${e} 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 Lo(r)}catch{return null}}extractSessionIdFromFilename(e){let r=lN(e).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 e=[],r;try{r=await cs(this.geminiTmpDir)}catch{return e}for(let n of r){let s=Ge(this.geminiTmpDir,n,"chats");if(!(await Oo(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await cs(s)}catch{continue}for(let a of i)a.startsWith("session-")&&(!a.endsWith(".json")&&!a.endsWith(".jsonl")||e.push(Ge(s,a)))}return e}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await aN(r),!0):!1}async resolveSessionFile(e){let r=await this.findSessionFiles(),n=[];for(let s of r){let o=await this.readSessionFile(s).catch(()=>null),i=this.extractSessionIdFromFilename(s),a=o?.sessionId||i,l=a===e||a.startsWith(e),c=i===e||i.startsWith(e)||i.length>=8&&e.startsWith(i);if(!l&&!c)continue;let u=await Re(s).catch(()=>({createdAt:new Date(0),modifiedAt:new Date(0)}));n.push({filePath:s,modifiedAt:Ir(o?.lastUpdated,u.modifiedAt)})}return n.sort((s,o)=>{let i=o.modifiedAt.getTime()-s.modifiedAt.getTime();return i!==0?i:o.filePath.localeCompare(s.filePath)}),n[0]?.filePath??null}async resolveWorkspace(e){return e?(await this.getWorkspaceHashMap()).get(e)||`[hash:${e.slice(0,16)}]`:"(unknown workspace)"}async getWorkspaceHashMap(){if(this.workspaceHashMap)return this.workspaceHashMap;let e=new Set;us(e,uN());for(let n of this.extraWorkspacePaths)us(e,n);for(let n of await this.collectGeminiProjectPaths())us(e,n);for(let n of await this.collectCodexCwds())us(e,n);for(let n of await this.collectClaudeCwds())us(e,n);let r=new Map;for(let n of e)r.set(mN(n),n);return this.workspaceHashMap=r,r}async collectGeminiProjectPaths(){let e;try{e=await Yp(this.geminiProjectsFile,"utf-8")}catch{return[]}try{let n=JSON.parse(e).projects;return!n||typeof n!="object"||Array.isArray(n)?[]:Object.keys(n)}catch{return[]}}async collectCodexCwds(){let e=new Set;for(let r of this.codexSessionDirs){let n=await this.findJsonlFiles(r);for(let s of n){let i=(await Ce(s,1).catch(()=>[]))[0]?.payload?.cwd;i&&e.add(i)}}return[...e]}async collectClaudeCwds(){let e=new Set,r;try{r=await cs(this.claudeProjectsDir)}catch{return[]}for(let n of r){let s=Ge(this.claudeProjectsDir,n);if(!(await Oo(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await cs(s)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=Ge(s,a),u=(await Ce(l,1).catch(()=>[]))[0]?.cwd;u&&e.add(u)}}return[...e]}async findJsonlFiles(e){let r=[];if(!(await Oo(e).catch(()=>null))?.isDirectory())return r;let s;try{s=await cs(e)}catch{return r}for(let o of s){let i=Ge(e,o),a=await Oo(i).catch(()=>null);if(a)if(a.isDirectory()){let l=await this.findJsonlFiles(i);r.push(...l)}else o.endsWith(".jsonl")&&r.push(i)}return r}}});import{readFileSync as pN,writeFileSync as hN,mkdirSync as _N}from"node:fs";import{join as gN,dirname as yN}from"node:path";import{randomUUID as wN}from"node:crypto";function uc(t){return new cc(t)}var cc,dc=T(()=>{"use strict";eh();Dt();vr();bt();ac();cc=class extends $e{constructor(e){super({provider:new Mo(e),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",we,"-y","--skip-trust"],resumeTemplate:"gemini --resume {{session_id}} --skip-trust",startTemplate:"gemini --skip-trust",transport:(r,n)=>zr(r,{...n,acpTool:"gemini"})})}forkHint(e){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(`
1336
- `)}manualSeedHint(e){return{launchCommand:`cd ${e} && gemini --skip-trust`,postLaunchNote:bo,lsCommand:`lmctl ls --provider gemini --sessiondir ${e}`}}async fork(e,r){let n=await this.resolvePath(e);if(!n)return{success:!1,error:`Session file not found for ${e}`};try{let s=pN(n,"utf-8"),o=ls(s),i=Lo(s),a=wN();i.sessionId=a,i.kind="main";let l=yN(n),c=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),u=o==="jsonl"?".jsonl":".json",d=`session-${c}-${a.slice(0,8)}${u}`,f=gN(l,d);return _N(l,{recursive:!0}),hN(f,Vp(i,o),"utf-8"),{success:!0,sessionId:a,filePath:f}}catch(s){return{success:!1,error:s instanceof Error?s.message:String(s)}}}}});import{readdir as th,readFile as EN,rm as TN,stat as Zr}from"node:fs/promises";import{basename as bN,join as dt}from"node:path";function SN(t){let e={};for(let r of t.split(`
1334
+ `}var ac=T(()=>{"use strict"});import{createHash as iN}from"node:crypto";import{readdir as us,readFile as Yp,stat as Oo,unlink as aN}from"node:fs/promises";import{join as Ge,basename as lN,dirname as cN}from"node:path";import{cwd as uN}from"node:process";function zp(t){return t?typeof t=="string"?t:Array.isArray(t)?t.map(e=>e.text||"").join(""):"":""}function Zp(t){return t==="user"}function lc(t){return t==="gemini"||t==="assistant"}function Ir(t,e=new Date(0)){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function dN(t){return`${t.sessionId}\0${t.cwd}`}function fN(t,e){let r=t.filePaths??[t.filePath],n=e.filePaths??[e.filePath],s=[...new Set([...r,...n])],o=e.modifiedAt.getTime()>=t.modifiedAt.getTime()?e:t;return{...o,createdAt:t.createdAt.getTime()<=e.createdAt.getTime()?t.createdAt:e.createdAt,modifiedAt:o.modifiedAt,filePath:o.filePath,filePaths:s}}function Co(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}function Qp(t){let e=0,r=0,n=0,s=0,o=0,i;for(let a of t){if(!lc(a.type)||!a.tokens)continue;let l=Co(a.tokens.input),c=Co(a.tokens.cached),u=Math.max(l-c,0),d=Co(a.tokens.output),f=Co(a.tokens.thoughts);e+=l,r+=c,n+=d,s+=f,o=l,i={inputTokens:u,cachedInputTokens:c,cacheWriteInputTokens:0,outputTokens:d,reasoningOutputTokens:f,totalTokens:l+d+f}}return{totalInputTokens:e,totalCachedInputTokens:r,totalOutputTokens:n,totalReasoningOutputTokens:s,lastInputTokens:o,lastTokenUsage:i}}function mN(t){return iN("sha256").update(t).digest("hex")}function ds(t,e){let r=e;for(;r&&!t.has(r);){t.add(r);let n=cN(r);if(n===r)break;r=n}}var Mo,eh=T(()=>{"use strict";rr();ac();Ie();Mo=class{name="gemini";workspaceHashMap;geminiProjectsFile;geminiTmpDir;claudeProjectsDir;codexSessionDirs;extraWorkspacePaths;constructor(e={}){let r=e.geminiDir||Ge(Se,".gemini");this.geminiProjectsFile=Ge(r,"projects.json"),this.geminiTmpDir=Ge(r,"tmp");let n=e.claudeDir||Ge(Se,".claude");this.claudeProjectsDir=Ge(n,"projects");let s=[Ge(Se,".codex"),Ge(Se,".code")],o=e.codexDirs&&e.codexDirs.length>0?e.codexDirs:[e.codexDir||s[0],e.codeDir||s[1]];this.codexSessionDirs=[...new Set(o)].map(i=>Ge(i,"sessions")),this.extraWorkspacePaths=e.extraWorkspacePaths||[]}getWatchPaths(){return[{directory:this.geminiTmpDir,filePattern:/\.jsonl?$/}]}async discoverSessions(){let e=await this.findSessionFiles(),r=new Map;for(let n of e)try{let s=await this.extractSummary(n);if(!s)continue;let o=dN(s),i=r.get(o);r.set(o,i?fN(i,s):s)}catch{}return[...r.values()]}async loadSession(e){let r=await this.resolveSessionFile(e);if(!r)return null;let n;try{n=await this.readSessionFile(r)}catch{return null}if(!n)return null;let s=await Re(r),o=[],i=n.messages||[],a=n.sessionId||this.extractSessionIdFromFilename(r),l=n.projectHash||"",c=await this.resolveWorkspace(l),u,d,f;for(let g of i){let _=Ir(g.timestamp),S=g.type,w=me(zp(g.content));if(Zp(S)){let I=w.trim();I&&(u||(u=G(I,80)),d=G(I,80)),o.push({role:"user",timestamp:_,content:I||w});continue}if(lc(S)){g.model&&(f=g.model);for(let I of g.thoughts||[]){let x=[I.subject,I.description].filter(Boolean).join(`
1335
+ `).trim();x&&o.push({role:"thinking",timestamp:Ir(I.timestamp,_),content:me(x)})}o.push({role:"assistant",timestamp:_,content:w,model:g.model});continue}let E=S?`[${S}] `:"";o.push({role:"system",timestamp:_,content:`${E}${w}`.trim()})}let m=Ir(n.startTime,s.createdAt),p=Ir(n.lastUpdated,s.modifiedAt),h=Qp(i);return{provider:"gemini",sessionId:a,cwd:c,createdAt:m,modifiedAt:p,model:f,startCommand:"gemini",firstUserMessage:u,lastUserMessage:d,messageCount:o.filter(g=>g.role==="user"||g.role==="assistant").length,filePath:r,totalInputTokens:h.totalInputTokens||void 0,totalCachedInputTokens:h.totalCachedInputTokens||void 0,totalOutputTokens:h.totalOutputTokens||void 0,totalReasoningOutputTokens:h.totalReasoningOutputTokens||void 0,lastInputTokens:h.lastInputTokens||void 0,lastTokenUsage:h.lastTokenUsage,messages:o}}async extractSummary(e){let r=await this.readSessionFile(e);if(!r)return null;let n=await Re(e),s=r.messages||[],o=r.sessionId||this.extractSessionIdFromFilename(e),i=r.projectHash||"",a=await this.resolveWorkspace(i),l,c,u,d=0;for(let m of s)if(Zp(m.type)){d++;let p=zp(m.content).trim();p&&(l||(l=G(me(p),80)),c=G(me(p),80))}else lc(m.type)&&(d++,m.model&&(u=m.model));let f=Qp(s);return{provider:"gemini",sessionId:o,cwd:a,createdAt:Ir(r.startTime,n.createdAt),modifiedAt:Ir(r.lastUpdated,n.modifiedAt),model:u,startCommand:"gemini",firstUserMessage:l,lastUserMessage:c,messageCount:d,filePath:e,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(e){let r=await Yp(e,"utf-8");if(cs(r)==="unknown")return Y({event:"gemini_session_format_unknown",provider:"gemini",file:e,preview:r.slice(0,120),message:`gemini session file at ${e} 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 jo(r)}catch{return null}}extractSessionIdFromFilename(e){let r=lN(e).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 e=[],r;try{r=await us(this.geminiTmpDir)}catch{return e}for(let n of r){let s=Ge(this.geminiTmpDir,n,"chats");if(!(await Oo(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await us(s)}catch{continue}for(let a of i)a.startsWith("session-")&&(!a.endsWith(".json")&&!a.endsWith(".jsonl")||e.push(Ge(s,a)))}return e}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await aN(r),!0):!1}async resolveSessionFile(e){let r=await this.findSessionFiles(),n=[];for(let s of r){let o=await this.readSessionFile(s).catch(()=>null),i=this.extractSessionIdFromFilename(s),a=o?.sessionId||i,l=a===e||a.startsWith(e),c=i===e||i.startsWith(e)||i.length>=8&&e.startsWith(i);if(!l&&!c)continue;let u=await Re(s).catch(()=>({createdAt:new Date(0),modifiedAt:new Date(0)}));n.push({filePath:s,modifiedAt:Ir(o?.lastUpdated,u.modifiedAt)})}return n.sort((s,o)=>{let i=o.modifiedAt.getTime()-s.modifiedAt.getTime();return i!==0?i:o.filePath.localeCompare(s.filePath)}),n[0]?.filePath??null}async resolveWorkspace(e){return e?(await this.getWorkspaceHashMap()).get(e)||`[hash:${e.slice(0,16)}]`:"(unknown workspace)"}async getWorkspaceHashMap(){if(this.workspaceHashMap)return this.workspaceHashMap;let e=new Set;ds(e,uN());for(let n of this.extraWorkspacePaths)ds(e,n);for(let n of await this.collectGeminiProjectPaths())ds(e,n);for(let n of await this.collectCodexCwds())ds(e,n);for(let n of await this.collectClaudeCwds())ds(e,n);let r=new Map;for(let n of e)r.set(mN(n),n);return this.workspaceHashMap=r,r}async collectGeminiProjectPaths(){let e;try{e=await Yp(this.geminiProjectsFile,"utf-8")}catch{return[]}try{let n=JSON.parse(e).projects;return!n||typeof n!="object"||Array.isArray(n)?[]:Object.keys(n)}catch{return[]}}async collectCodexCwds(){let e=new Set;for(let r of this.codexSessionDirs){let n=await this.findJsonlFiles(r);for(let s of n){let i=(await Ce(s,1).catch(()=>[]))[0]?.payload?.cwd;i&&e.add(i)}}return[...e]}async collectClaudeCwds(){let e=new Set,r;try{r=await us(this.claudeProjectsDir)}catch{return[]}for(let n of r){let s=Ge(this.claudeProjectsDir,n);if(!(await Oo(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await us(s)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=Ge(s,a),u=(await Ce(l,1).catch(()=>[]))[0]?.cwd;u&&e.add(u)}}return[...e]}async findJsonlFiles(e){let r=[];if(!(await Oo(e).catch(()=>null))?.isDirectory())return r;let s;try{s=await us(e)}catch{return r}for(let o of s){let i=Ge(e,o),a=await Oo(i).catch(()=>null);if(a)if(a.isDirectory()){let l=await this.findJsonlFiles(i);r.push(...l)}else o.endsWith(".jsonl")&&r.push(i)}return r}}});import{readFileSync as pN,writeFileSync as hN,mkdirSync as _N}from"node:fs";import{join as gN,dirname as yN}from"node:path";import{randomUUID as wN}from"node:crypto";function uc(t){return new cc(t)}var cc,dc=T(()=>{"use strict";eh();Dt();vr();bt();ac();cc=class extends $e{constructor(e){super({provider:new Mo(e),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",we,"-y","--skip-trust"],resumeTemplate:"gemini --resume {{session_id}} --skip-trust",startTemplate:"gemini --skip-trust",transport:(r,n)=>zr(r,{...n,acpTool:"gemini"})})}forkHint(e){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(`
1336
+ `)}manualSeedHint(e){return{launchCommand:`cd ${e} && gemini --skip-trust`,postLaunchNote:bo,lsCommand:`lmctl ls --provider gemini --sessiondir ${e}`}}async fork(e,r){let n=await this.resolvePath(e);if(!n)return{success:!1,error:`Session file not found for ${e}`};try{let s=pN(n,"utf-8"),o=cs(s),i=jo(s),a=wN();i.sessionId=a,i.kind="main";let l=yN(n),c=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),u=o==="jsonl"?".jsonl":".json",d=`session-${c}-${a.slice(0,8)}${u}`,f=gN(l,d);return _N(l,{recursive:!0}),hN(f,Vp(i,o),"utf-8"),{success:!0,sessionId:a,filePath:f}}catch(s){return{success:!1,error:s instanceof Error?s.message:String(s)}}}}});import{readdir as th,readFile as EN,rm as TN,stat as Zr}from"node:fs/promises";import{basename as bN,join as dt}from"node:path";function SN(t){let e={};for(let r of t.split(`
1337
1337
  `)){let n=r.match(/^(\w+):\s*(.*)$/);n&&(e[n[1]]=n[2].trim())}return{id:e.id,cwd:e.cwd,summary_count:e.summary_count?parseInt(e.summary_count,10):void 0,created_at:e.created_at,updated_at:e.updated_at,summary:e.summary}}function Nr(t){if(!t)return;let e=new Date(t);return Number.isNaN(e.getTime())?void 0:e}async function kN(t){let e=0;for await(let r of We(t))(r.type==="user.message"||r.type==="assistant.message"&&(r.data?.content||"").trim())&&e++;return e}var Do,rh=T(()=>{"use strict";rr();Do=class{name="copilot";sessionStateDir;constructor(e={}){let r=e.copilotDir||dt(Se,".copilot");this.sessionStateDir=dt(r,"session-state")}getWatchPaths(){return[{directory:this.sessionStateDir,filePattern:/events\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await th(this.sessionStateDir)}catch{return e}for(let n of r){let s=dt(this.sessionStateDir,n);if((await Zr(s).catch(()=>null))?.isDirectory())try{let i=await this.extractSummary(s,n);i&&e.push(i)}catch{}}return e}async loadSession(e){let r=await this.resolveSessionDir(e);if(!r)return null;let n=await this.readWorkspaceYaml(r),s=dt(r,"events.jsonl"),o=await Zr(s).catch(()=>null),i=o?s:dt(r,"workspace.yaml"),a=await Re(o?s:r),l=[],c=n?.cwd||"(unknown workspace)",u,d,f,m,p,h,g=n?.id||bN(r)||e;if(o)for await(let _ of We(s)){let S=Nr(_.timestamp)||a.modifiedAt;if(_.type==="session.start"&&_.data){_.data.sessionId&&(g=_.data.sessionId),_.data.copilotVersion&&(d=_.data.copilotVersion),_.data.startTime&&(h=Nr(_.data.startTime)),_.data.selectedModel&&(u=_.data.selectedModel),_.data.context&&(_.data.context.cwd&&(c=_.data.context.cwd),_.data.context.branch&&(f=_.data.context.branch));continue}if(_.type==="session.model_change"&&_.data?.newModel){u=_.data.newModel;continue}if(_.type==="user.message"&&_.data){let w=_.data.content||"",E=w.trim();E&&(m||(m=G(E,80)),p=G(E,80)),l.push({role:"user",timestamp:S,content:me(E||w)});continue}if(_.type==="assistant.message"&&_.data){let w=(_.data.content||"").trim();if(w&&l.push({role:"assistant",timestamp:S,content:me(w),model:u}),_.data.toolRequests)for(let E of _.data.toolRequests)l.push({role:"tool_use",timestamp:S,content:E.name||"unknown tool",toolName:E.name,toolInput:E.arguments?JSON.stringify(E.arguments,null,2):void 0,toolCallId:E.toolCallId});continue}if(_.type==="tool.execution_complete"&&_.data){let w=_.data.result?.content||"",E=_.data.result?.detailedContent||"";l.push({role:"tool_result",timestamp:S,content:me(w),toolDetailedContent:E?me(E):void 0,toolCallId:_.data.toolCallId});continue}if(_.type==="assistant.reasoning"&&_.data?.content){l.push({role:"thinking",timestamp:S,content:me(_.data.content)});continue}if(_.type==="session.error"||_.type==="session.warning"||_.type==="session.info"||_.type==="system.message"){let w=_.data?.message||"";w.trim()&&l.push({role:"system",timestamp:S,content:me(w)});continue}}if(!m){let _=(n?.summary||"").trim();_&&(m=G(_,80))}return{provider:"copilot",sessionId:g,cwd:c,createdAt:h??Nr(n?.created_at)??a.createdAt,modifiedAt:Nr(n?.updated_at)??a.modifiedAt,model:u,cliVersion:d,startCommand:"copilot",gitBranch:f,firstUserMessage:m,lastUserMessage:p,messageCount:l.filter(_=>_.role==="user"||_.role==="assistant").length,filePath:i,messages:l}}async extractSummary(e,r){let n=await this.readWorkspaceYaml(e),s=dt(e,"events.jsonl"),o=await Zr(s).catch(()=>null),i=o?s:dt(e,"workspace.yaml"),a=await Re(o?s:e),l=o?await Ce(s,20):[],c=n?.id||r,u=n?.cwd||"(unknown workspace)",d,f,m,p,h;for(let _ of l)if(_.type==="session.start"&&_.data&&(_.data.sessionId&&(c=_.data.sessionId),_.data.copilotVersion&&(f=_.data.copilotVersion),_.data.startTime&&(m=Nr(_.data.startTime)),_.data.selectedModel&&(d=_.data.selectedModel),_.data.context?.cwd&&(u=_.data.context.cwd)),_.type==="session.model_change"&&_.data?.newModel&&(d||(d=_.data.newModel)),_.type==="user.message"&&_.data){let S=(_.data.content||"").trim();S&&(p||(p=G(S,80)),h=G(S,80))}if(!p){let _=(n?.summary||"").trim();_&&(p=G(_,80))}let g=o?await kN(s):0;return{provider:"copilot",sessionId:c,cwd:u,createdAt:m??Nr(n?.created_at)??a.createdAt,modifiedAt:Nr(n?.updated_at)??a.modifiedAt,model:d,cliVersion:f,startCommand:"copilot",firstUserMessage:p,lastUserMessage:h,messageCount:g,filePath:i}}async readWorkspaceYaml(e){let r=dt(e,"workspace.yaml");try{let n=await EN(r,"utf-8");return SN(n)}catch{return null}}async resolveSessionPath(e){return this.resolveSessionDir(e)}async deleteSession(e){let r=await this.resolveSessionDir(e);return r?(await TN(r,{recursive:!0}),!0):!1}async resolveSessionDir(e){let r;try{r=await th(this.sessionStateDir)}catch{return null}if(r.includes(e)){let s=dt(this.sessionStateDir,e);if((await Zr(s).catch(()=>null))?.isDirectory())return s}let n=[];for(let s of r)if(s.startsWith(e)){let o=dt(this.sessionStateDir,s);(await Zr(o).catch(()=>null))?.isDirectory()&&n.push(o)}if(n.length===1)return n[0];for(let s of r){let o=dt(this.sessionStateDir,s);if(!(await Zr(o).catch(()=>null))?.isDirectory())continue;let a=await this.readWorkspaceYaml(o);if(a&&(a.id===e||a.id?.startsWith(e)))return o}return null}}});function fc(t){return new $e({provider:new Do(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"copilot",seedArgs:["-p",we,"--yolo"],resumeTemplate:"copilot --resume={{session_id}}",startTemplate:"copilot",transport:(e,r)=>zr(e,{...r,acpTool:"copilot"})})}var mc=T(()=>{"use strict";rh();Dt();vr();bt()});import{existsSync as nh,readdirSync as vN,statSync as sh}from"node:fs";import{join as or}from"node:path";import{createRequire as IN}from"node:module";function oh(){return pc===null&&(pc=IN(import.meta.url)("node:sqlite").DatabaseSync),pc}function NN(){let t=process.env.XDG_DATA_HOME||or(Se,".local","share"),e=process.env.XDG_CONFIG_HOME||or(Se,".config");return[or(t,"opencode","opencode.db"),or(e,"opencode","opencode.db")]}function xN(){if(process.env.OPENCODE_DB)return[process.env.OPENCODE_DB];let t=process.env.XDG_DATA_HOME||or(Se,".local","share"),e=or(t,"lmplayer"),r=or(e,"opencode-local.db"),n=[r];try{let s=vN(e).filter(o=>/^opencode.*\.db$/u.test(o)).map(o=>or(e,o)).filter(o=>o!==r).sort((o,i)=>{try{return sh(i).mtimeMs-sh(o).mtimeMs}catch{return 0}});n.push(...s)}catch{}return n}function AN(t){return t==="lmplayer"?xN():NN()}var pc,Qr,hc=T(()=>{"use strict";rr();pc=null;Qr=class{name;startCommand;dbPaths;constructor(e){this.name=e?.providerName??"opencode",this.startCommand=e?.startCommand??this.name,e?.dbPath?this.dbPaths=[e.dbPath]:this.dbPaths=AN(this.name)}existingDbPaths(){return this.dbPaths.filter(e=>nh(e))}openDb(e){return nh(e)?new(oh())(e,{open:!0,readOnly:!0}):null}async discoverSessions(){let e=[];for(let r of this.existingDbPaths()){let n=this.openDb(r);if(n)try{let s=new Map,o=n.prepare("SELECT id, worktree, name FROM project").all();for(let a of o)s.set(a.id,a);let i=n.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
1338
1338
  s.time_created, s.time_updated
1339
1339
  FROM session s
@@ -1347,11 +1347,11 @@ ${r}`:r}function Up(t,e){let r=X0[e.tool];return r?new Promise((n,s)=>{let o=e.b
1347
1347
  FROM session s
1348
1348
  WHERE s.id LIKE ?
1349
1349
  ORDER BY s.time_updated DESC
1350
- LIMIT 2`).all(`${r}%`);return s.length!==1?null:s[0]}}});function gc(){return new _c}var _c,yc=T(()=>{"use strict";hc();Dt();vr();bt();_c=class extends $e{constructor(){super({provider:new Qr,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",we],resumeTemplate:"opencode --session {{session_id}}",startTemplate:"opencode",transport:(e,r)=>zr(e,{...r,acpTool:"opencode"})})}seedArgsFor(e){let r=["run"];return e?.model&&r.push("--model",e.model),e?.effort&&r.push("--variant",e.effort),r.push(e?.prompt??we),r}}});import{spawn as RN}from"node:child_process";import{mkdirSync as $N}from"node:fs";function Ec(t){return new wc(t)}async function jN(t,e){let r=Date.now(),n=ih({prompt:t,sessionId:e.sessionId,model:e.model,effort:e.effort,formatJson:!0,permissionMode:e.permissionMode??"yolo"});ut("lmplayer",n,e.permissionMode??"yolo");let s=await ah(e.binary,n,{cwd:e.cwd,env:Be(e.env,e.cwd,e.sessionId),signal:e.signal,onText:o=>{e.onProgress?.({kind:"text",summary:o.slice(0,120)}),e.onDelta?.(o)}});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??e.sessionId,durationMs:Date.now()-r}}function ih(t){let e=["run"];return t.model&&e.push("--model",t.model),t.sessionId&&e.push("--session",t.sessionId),t.formatJson&&e.push("--format","json"),t.effort&&e.push("--effort",t.effort),e.push(...nr("lmplayer",t.permissionMode)??[]),e.push(t.prompt),e}function ah(t,e,r){return new Promise((n,s)=>{let o;try{o=RN(t,e,{cwd:r.cwd,env:r.env,stdio:["ignore","pipe","pipe"]})}catch(g){s(g);return}let i="",a="",l="",c,u,d=[],f=!1,m=r.timeoutMs===void 0?void 0:setTimeout(()=>{f||(f=!0,o.kill(),p(),s(new Error(`lmplayer seed timed out after ${r.timeoutMs}ms`)))},r.timeoutMs),p=()=>{m!==void 0&&clearTimeout(m)},h=g=>{let _=g.trim();if(!_)return;let S;try{S=JSON.parse(_)}catch{d.push(g),r.onText?.(g);return}if(!Fo(S))return;let w=Po(S,!1);c===void 0&&w!==void 0&&(c=w),u=Po(S,!0)??u;let E=lh(S);E&&(d.push(E),r.onText?.(E))};o.stdout?.on("data",g=>{let _=g.toString("utf8");i+=_,l+=_;let S=l.indexOf(`
1350
+ LIMIT 2`).all(`${r}%`);return s.length!==1?null:s[0]}}});function gc(){return new _c}var _c,yc=T(()=>{"use strict";hc();Dt();vr();bt();_c=class extends $e{constructor(){super({provider:new Qr,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",we],resumeTemplate:"opencode --session {{session_id}}",startTemplate:"opencode",transport:(e,r)=>zr(e,{...r,acpTool:"opencode"})})}seedArgsFor(e){let r=["run"];return e?.model&&r.push("--model",e.model),e?.effort&&r.push("--variant",e.effort),r.push(e?.prompt??we),r}}});import{spawn as RN}from"node:child_process";import{mkdirSync as $N}from"node:fs";function Ec(t){return new wc(t)}async function LN(t,e){let r=Date.now(),n=ih({prompt:t,sessionId:e.sessionId,model:e.model,effort:e.effort,formatJson:!0,permissionMode:e.permissionMode??"yolo"});ut("lmplayer",n,e.permissionMode??"yolo");let s=await ah(e.binary,n,{cwd:e.cwd,env:Be(e.env,e.cwd,e.sessionId),signal:e.signal,onText:o=>{e.onProgress?.({kind:"text",summary:o.slice(0,120)}),e.onDelta?.(o)}});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??e.sessionId,durationMs:Date.now()-r}}function ih(t){let e=["run"];return t.model&&e.push("--model",t.model),t.sessionId&&e.push("--session",t.sessionId),t.formatJson&&e.push("--format","json"),t.effort&&e.push("--effort",t.effort),e.push(...nr("lmplayer",t.permissionMode)??[]),e.push(t.prompt),e}function ah(t,e,r){return new Promise((n,s)=>{let o;try{o=RN(t,e,{cwd:r.cwd,env:r.env,stdio:["ignore","pipe","pipe"]})}catch(g){s(g);return}let i="",a="",l="",c,u,d=[],f=!1,m=r.timeoutMs===void 0?void 0:setTimeout(()=>{f||(f=!0,o.kill(),p(),s(new Error(`lmplayer seed timed out after ${r.timeoutMs}ms`)))},r.timeoutMs),p=()=>{m!==void 0&&clearTimeout(m)},h=g=>{let _=g.trim();if(!_)return;let S;try{S=JSON.parse(_)}catch{d.push(g),r.onText?.(g);return}if(!Fo(S))return;let w=Po(S,!1);c===void 0&&w!==void 0&&(c=w),u=Po(S,!0)??u;let E=lh(S);E&&(d.push(E),r.onText?.(E))};o.stdout?.on("data",g=>{let _=g.toString("utf8");i+=_,l+=_;let S=l.indexOf(`
1351
1351
  `);for(;S>=0;){let w=l.slice(0,S);l=l.slice(S+1),h(w),S=l.indexOf(`
1352
- `)}}),o.stderr?.on("data",g=>{a+=g.toString("utf8")}),r.signal&&(r.signal.aborted?o.kill():r.signal.addEventListener("abort",()=>o.kill(),{once:!0})),o.on("exit",g=>{f||(f=!0,p(),l.length>0&&h(l),n({code:g,stdout:i,stderr:a,sessionId:c??u,text:d.join("")}))}),o.on("error",g=>{f||(f=!0,p(),s(g))})})}function lh(t){for(let e of["text","content","delta","output","message"]){let r=t[e];if(typeof r=="string")return r}for(let e of["data","event","payload","part"]){let r=t[e];if(Fo(r)){let n=lh(r);if(n)return n}}}function Po(t,e){for(let n of["sessionID","sessionId","session_id"]){let s=t[n];if(typeof s=="string"&&s.length>0)return s}let r=t.session;if(typeof r=="string"&&r.length>0)return r;if(Fo(r)){let n=Po(r,e);if(n!==void 0)return n}if(e){let n=t.id;if(typeof n=="string"&&n.length>0)return n}for(let n of["data","event","payload","part"]){let s=t[n];if(Fo(s)){let o=Po(s,e);if(o!==void 0)return o}}}function Fo(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var wc,Tc=T(()=>{"use strict";hc();Dt();bt();Yr();lt();wc=class extends $e{constructor(e){super({provider:new Qr({providerName:"lmplayer",startCommand:"lmplayer",dbPath:e?.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",we],resumeTemplate:"lmplayer run --session {{session_id}} --dangerously-skip-permissions",startTemplate:"lmplayer run --dangerously-skip-permissions",transport:jN})}seedArgsFor(e){return ih({prompt:e?.prompt??we,model:e?.model,effort:e?.effort,formatJson:!0,permissionMode:"yolo"})}async seed(e,r){$N(e,{recursive:!0});let n=this.seedArgsFor(r);ut("lmplayer",n);try{let s=await ah(this.binary,n,{cwd:e,env:Mt(void 0,e),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(e){return{launchCommand:`cd ${e} && lmplayer run --format json --dangerously-skip-permissions "${we}"`,postLaunchNote:"Copy the sessionID reported by lmplayer into this member's sessionid= field.",lsCommand:`lmctl ls --provider lmplayer --sessiondir ${e}`}}}});import{readdir as Uo,readFile as LN,rm as ON}from"node:fs/promises";import{basename as ch,join as ir}from"node:path";function uh(t){return t.type==="user"||t.message?.role==="user"}function dh(t){return t.type==="assistant"||t.message?.role==="assistant"||t.message?.role==="model"}function fh(t){let e=t.message;return e?typeof e.content=="string"?e.content:Array.isArray(e.content)?e.content.filter(r=>r.type==="text").map(r=>r.text||"").join(`
1352
+ `)}}),o.stderr?.on("data",g=>{a+=g.toString("utf8")}),r.signal&&(r.signal.aborted?o.kill():r.signal.addEventListener("abort",()=>o.kill(),{once:!0})),o.on("exit",g=>{f||(f=!0,p(),l.length>0&&h(l),n({code:g,stdout:i,stderr:a,sessionId:c??u,text:d.join("")}))}),o.on("error",g=>{f||(f=!0,p(),s(g))})})}function lh(t){for(let e of["text","content","delta","output","message"]){let r=t[e];if(typeof r=="string")return r}for(let e of["data","event","payload","part"]){let r=t[e];if(Fo(r)){let n=lh(r);if(n)return n}}}function Po(t,e){for(let n of["sessionID","sessionId","session_id"]){let s=t[n];if(typeof s=="string"&&s.length>0)return s}let r=t.session;if(typeof r=="string"&&r.length>0)return r;if(Fo(r)){let n=Po(r,e);if(n!==void 0)return n}if(e){let n=t.id;if(typeof n=="string"&&n.length>0)return n}for(let n of["data","event","payload","part"]){let s=t[n];if(Fo(s)){let o=Po(s,e);if(o!==void 0)return o}}}function Fo(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var wc,Tc=T(()=>{"use strict";hc();Dt();bt();Yr();lt();wc=class extends $e{constructor(e){super({provider:new Qr({providerName:"lmplayer",startCommand:"lmplayer",dbPath:e?.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",we],resumeTemplate:"lmplayer run --session {{session_id}} --dangerously-skip-permissions",startTemplate:"lmplayer run --dangerously-skip-permissions",transport:LN})}seedArgsFor(e){return ih({prompt:e?.prompt??we,model:e?.model,effort:e?.effort,formatJson:!0,permissionMode:"yolo"})}async seed(e,r){$N(e,{recursive:!0});let n=this.seedArgsFor(r);ut("lmplayer",n);try{let s=await ah(this.binary,n,{cwd:e,env:Mt(void 0,e),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(e){return{launchCommand:`cd ${e} && lmplayer run --format json --dangerously-skip-permissions "${we}"`,postLaunchNote:"Copy the sessionID reported by lmplayer into this member's sessionid= field.",lsCommand:`lmctl ls --provider lmplayer --sessiondir ${e}`}}}});import{readdir as Uo,readFile as jN,rm as ON}from"node:fs/promises";import{basename as ch,join as ir}from"node:path";function uh(t){return t.type==="user"||t.message?.role==="user"}function dh(t){return t.type==="assistant"||t.message?.role==="assistant"||t.message?.role==="model"}function fh(t){let e=t.message;return e?typeof e.content=="string"?e.content:Array.isArray(e.content)?e.content.filter(r=>r.type==="text").map(r=>r.text||"").join(`
1353
1353
  `):Array.isArray(e.parts)?e.parts.filter(r=>!r.thought&&r.type!=="thinking").map(r=>r.text||"").join(`
1354
- `):"":""}function mh(t){return t.model||t.message?.model}var Wo,ph=T(()=>{"use strict";rr();Wo=class{name="qwen";baseDir;constructor(e){this.baseDir=e?.qwenDir||ir(Se,".qwen")}async discoverSessions(){let e=ir(this.baseDir,"projects"),r;try{r=await Uo(e)}catch{return[]}let n=[];for(let s of r){let o=ir(e,s,"chats"),i;try{i=await Uo(o)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),c=ir(o,a);try{let u=await this.extractSummary(c,l);u&&n.push(u)}catch{}}}return n}async extractSummary(e,r){let n=await Ce(e,30);if(n.length===0)return null;let s=await Re(e),o="(unknown)",i,a,l,c,u=0;for(let d of n){if(d.cwd&&(o=d.cwd,d.version&&(a=d.version)),d.type==="system"&&d.cwd&&(o=d.cwd,d.version&&(a=d.version),d.model&&(i=d.model)),uh(d)){let f=fh(d).trim();f&&(l||(l=G(f,80)),c=G(f,80)),u++}if(dh(d)){let f=mh(d);f&&(i=f),u++}}return{provider:"qwen",sessionId:r,cwd:o,createdAt:s.createdAt,modifiedAt:s.modifiedAt,model:i,cliVersion:a,startCommand:"qwen",firstUserMessage:l,lastUserMessage:c,messageCount:u,filePath:e}}async loadSession(e){let r=await this.resolveSessionPath(e);if(!r)return null;let n=ch(r,".jsonl");return this.loadFromFile(r,n)}async loadFromFile(e,r){let n=await Re(e),s="(unknown)",o,i,a,l,c,u,d=[];for await(let f of We(e)){if(f.cwd&&(s=f.cwd,f.version&&(i=f.version),f.gitBranch&&(a=f.gitBranch)),f.type==="system"&&f.cwd&&(s=f.cwd,f.version&&(i=f.version),f.model&&(o=f.model),f.gitBranch&&(a=f.gitBranch)),!f.message)continue;let m=f.message,p=f.timestamp?new Date(f.timestamp):n.modifiedAt;if(uh(f)){let h=fh(f);h.trim()&&(c||(c=G(h.trim(),80)),u=G(h.trim(),80)),d.push({role:"user",timestamp:p,content:h})}else if(dh(f)){let h=mh(f);if(h&&(o=h),Array.isArray(m.content))for(let g of m.content)g.type==="text"&&g.text?d.push({role:"assistant",timestamp:p,content:g.text,model:h}):g.type==="thinking"&&g.thinking&&d.push({role:"thinking",timestamp:p,content:g.thinking});else if(typeof m.content=="string")d.push({role:"assistant",timestamp:p,content:m.content,model:h});else if(Array.isArray(m.parts))for(let g of m.parts)if(g.thought||g.type==="thinking"){let _=g.thinking||g.text;_&&d.push({role:"thinking",timestamp:p,content:_})}else g.text&&d.push({role:"assistant",timestamp:p,content:g.text,model:h})}}return{provider:"qwen",sessionId:r,slug:l,cwd:s,createdAt:n.createdAt,modifiedAt:n.modifiedAt,model:o,cliVersion:i,gitBranch:a,startCommand:"qwen",firstUserMessage:c,lastUserMessage:u,messageCount:d.length,filePath:e,messages:d}}async resolveSessionPath(e){let r=ir(this.baseDir,"projects");try{let n=await Uo(r),s=[];for(let o of n){let i=ir(r,o,"chats",`${e}.jsonl`);try{return await LN(i,{flag:"r"}),i}catch{continue}}for(let o of n){let i=ir(r,o,"chats"),a;try{a=await Uo(i)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;ch(l,".jsonl").startsWith(e)&&s.push(ir(i,l))}}if(s.length===1)return s[0]}catch{}return null}async deleteSession(e){let r=await this.resolveSessionPath(e);if(!r)return!1;try{return await ON(r),!0}catch{return!1}}}});function Sc(){return new bc}var bc,kc=T(()=>{"use strict";ph();Dt();vr();bt();bc=class extends $e{constructor(){super({provider:new Wo,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"qwen",seedArgs:["-p",we,"--approval-mode","yolo"],resumeTemplate:"qwen --resume {{session_id}}",startTemplate:"qwen",transport:Ro})}}});import{readdir as hh,readFile as CN,rm as _h,stat as gh}from"node:fs/promises";import{basename as vc,join as Ut}from"node:path";async function MN(t){let e=await Promise.all(t.map(r=>Re(r)));return{createdAt:new Date(Math.min(...e.map(r=>r.createdAt.getTime()))),modifiedAt:new Date(Math.max(...e.map(r=>r.modifiedAt.getTime())))}}function DN(t,e){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function yh(t){return t.type==="USER_INPUT"}function wh(t){return t.source==="MODEL"&&t.type==="PLANNER_RESPONSE"}function PN(t){return t.source==="MODEL"&&t.type!=="PLANNER_RESPONSE"}function Eh(t){if(!t)return"";let e=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(t);return e?e[1]:t}function Th(t){if(!t)return;let e=/Model Selection` from [^\n]+? to ([^\n]+)/.exec(t);if(e)return e[1].replace(/\. No need\b[\s\S]*$/,"").replace(/\. If reporting\b[\s\S]*$/,"").replace(/\.\s*$/,"").trim()}function FN(t){if(t===void 0)return"";try{return JSON.stringify(t)}catch{return String(t)}}async function UN(t){for await(let e of We(t)){let r=e.tool_calls?.map(s=>s.args)??[];for(let s of r){let o=WN(s);if(o)return o}let n=BN(e.content);if(n)return n}return null}function WN(t){if(!t||typeof t!="object"||Array.isArray(t))return null;let e=t,r=e.Cwd??e.cwd??e.DirectoryPath;return typeof r!="string"?null:r.replace(/^"|"$/g,"")}function BN(t){return t?/"Cwd":"([^"]+)"/.exec(t)?.[1]??null:null}function bh(t){if(t.endsWith(".db"))return vc(t,".db");let e="/brain/",r=t.indexOf(e);return r===-1?null:t.slice(r+e.length).split("/")[0]||null}var Bo,Sh=T(()=>{"use strict";rr();Bo=class{name="agy";baseDir;constructor(e={}){this.baseDir=e.agyDir||Ut(Se,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:Ut(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let e=Ut(this.baseDir,"conversations"),r;try{r=await hh(e)}catch{return[]}let n=[];for(let s of r){if(!s.endsWith(".db"))continue;let o=vc(s,".db");try{let i=await this.extractSummary(o);i&&n.push(i)}catch{}}return n}conversationPath(e){return Ut(this.baseDir,"conversations",`${e}.db`)}transcriptPath(e){return Ut(this.baseDir,"brain",e,".system_generated","logs","transcript.jsonl")}async existingTranscriptPath(e){let r=this.transcriptPath(e);try{return await gh(r),r}catch{return null}}async extractSummary(e){let r=this.conversationPath(e),n=await this.existingTranscriptPath(e),s=n??r,o=await MN([r,n].filter(Boolean)),i=await this.resolveCwd(e,n),a,l,c,u=0;if(n){let d=await Ce(n,80);for(let f of d){let m=Th(f.content);if(m&&(a=m),yh(f)){let p=Eh(f.content).trim();p&&(l||(l=G(p,80)),c=G(p,80)),u++}else wh(f)&&u++}}return{provider:"agy",sessionId:e,cwd:i,createdAt:o.createdAt,modifiedAt:o.modifiedAt,model:a,startCommand:"agy",firstUserMessage:l,lastUserMessage:c,messageCount:u,filePath:s,filePaths:n?[r,n]:[r]}}async loadSession(e){let r=await this.resolveSessionPath(e);if(!r)return null;let n=bh(r);if(!n)return null;let s=await this.extractSummary(n);if(!s)return null;let o=await this.existingTranscriptPath(n),i=[],a=s.model,l=s.firstUserMessage,c=s.lastUserMessage;if(o)for await(let u of We(o)){let d=DN(u.created_at,s.modifiedAt),f=Th(u.content);if(f&&(a=f),yh(u)){let m=Eh(u.content),p=m.trim();p&&(l||(l=G(p,80)),c=G(p,80)),i.push({role:"user",timestamp:d,content:m});continue}if(Array.isArray(u.tool_calls))for(let m of u.tool_calls)i.push({role:"tool_use",timestamp:d,content:FN(m.args),toolName:m.name||"tool"});wh(u)&&u.content?i.push({role:"assistant",timestamp:d,content:u.content,model:a}):PN(u)&&u.content&&i.push({role:"tool_result",timestamp:d,content:u.content,toolName:u.type?.toLowerCase()}),u.thinking&&i.push({role:"thinking",timestamp:d,content:u.thinking})}return{...s,model:a,firstUserMessage:l,lastUserMessage:c,messageCount:i.length,messages:i}}async resolveSessionPath(e){let r=this.conversationPath(e);try{return await gh(r),r}catch{}let n=Ut(this.baseDir,"conversations");try{let s=[];for(let o of await hh(n)){if(!o.endsWith(".db"))continue;vc(o,".db").startsWith(e)&&s.push(Ut(n,o))}if(s.length===1)return s[0]}catch{}return null}async deleteSession(e){let r=await this.resolveSessionPath(e);if(!r)return!1;let n=bh(r);return n?(await _h(this.conversationPath(n),{force:!0}),await _h(Ut(this.baseDir,"brain",n),{recursive:!0,force:!0}),!0):!1}async resolveCwd(e,r){let n=await this.cwdFromLastConversationCache(e);if(n)return n;if(r){let s=await UN(r);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(e){let r=Ut(this.baseDir,"cache","last_conversations.json");try{let n=JSON.parse(await CN(r,"utf8"));for(let[s,o]of Object.entries(n))if(o===e)return s}catch{}return null}}});import{spawn as HN}from"node:child_process";function Nc(t){return new Ic(t)}async function qN(t,e){let r=Date.now(),n=["--conversation",e.sessionId,"-p",t,"--dangerously-skip-permissions","--print-timeout",XN(e.timeoutMs)];e.model&&n.push("--model",e.model),ut("agy",n,e.permissionMode??"yolo"),e.onProgress?.({kind:"system",summary:"agy -p one-shot started (no streaming events)"});let{stdout:s}=await JN(e.binary,n,{cwd:e.cwd,env:Be(e.env,e.cwd,e.sessionId),signal:e.signal});return e.onProgress?.({kind:"system",summary:"agy -p one-shot completed"}),{text:s.trimEnd(),sessionId:e.sessionId,durationMs:Date.now()-r}}function JN(t,e,r){return new Promise((n,s)=>{let o;try{o=HN(t,e,{cwd:r.cwd,env:r.env,stdio:["ignore","pipe","pipe"]})}catch(c){s(c);return}let i="",a="";o.stdout?.on("data",c=>{i+=c.toString()}),o.stderr?.on("data",c=>{a+=c.toString()});let l=()=>{o.kill("SIGTERM"),s(new Error("agy turn aborted"))};if(r.signal){if(r.signal.aborted){l();return}r.signal.addEventListener("abort",l,{once:!0})}o.on("error",c=>{r.signal?.removeEventListener("abort",l),s(c)}),o.on("exit",(c,u)=>{if(r.signal?.removeEventListener("abort",l),c===0){n({stdout:i,stderr:a});return}let d=u?`signal ${u}`:`exit code ${c}`,f=a.trim()||i.trim();s(new Error(`agy failed (${d})${f?`: ${f}`:""}`))})})}function XN(t){return!t||t<=0?"8h":`${Math.max(1,Math.ceil(t/1e3))}s`}var Ic,xc=T(()=>{"use strict";Sh();Dt();bt();lt();Yr();Ic=class extends $e{constructor(e){super({provider:new Bo(e),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",we,"--dangerously-skip-permissions","--print-timeout","2m"],resumeTemplate:"agy --conversation {{session_id}} --dangerously-skip-permissions",startTemplate:"agy --dangerously-skip-permissions",transport:qN})}seedArgsFor(e){let r=[...super.seedArgsFor(e)];return e?.model&&r.push("--model",e.model),r}manualSeedHint(e){return{launchCommand:`cd ${e} && agy --dangerously-skip-permissions`,postLaunchNote:"Send the lmctl seed instruction, wait for the conversation to write, then exit.",lsCommand:`lmctl ls --provider agy --sessiondir ${e}`}}}});import{createHash as GN}from"node:crypto";import{join as KN}from"node:path";function VN(t){return GN("sha256").update(t).digest("hex").slice(0,8)}function YN(t){let e=t.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"session"}function zN(t,e){let r=e?.prompt??"",n=/\bYou are alias\s+([A-Za-z][A-Za-z0-9_-]*)\b/.exec(r);return n!==null?n[1]:t.split(/[\\/]/).filter(Boolean).pop()??"session"}function ZN(t){return t.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function Ho(t){return Math.max(1,Math.ceil(t.length/4))}function kh(t){return{provider:"ClaudeMock",sessionId:t.sessionId,cwd:t.cwd,createdAt:t.createdAt,modifiedAt:t.modifiedAt,messageCount:t.messages.length,filePath:t.filePath,cliVersion:"ClaudeMock/0",model:"claude-mock",totalInputTokens:t.totalInputTokens,totalOutputTokens:t.totalOutputTokens,lastTokenUsage:{totalTokens:t.totalInputTokens+t.totalOutputTokens}}}function $c(){return new Rc}var xr,Ac,Rc,jc=T(()=>{"use strict";xr=new Map;Ac=class{name="ClaudeMock";async discoverSessions(){return[...xr.values()].map(kh)}async loadSession(e){let r=xr.get(e);return r===void 0?null:{...kh(r),messages:r.messages.slice()}}async resolveSessionPath(e){return xr.get(e)?.filePath??null}async deleteSession(e){return xr.delete(e)}},Rc=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new Ac;discover(){return this.provider.discoverSessions()}load(e){return this.provider.loadSession(e)}resolvePath(e){return this.provider.resolveSessionPath(e)}delete(e){return this.provider.deleteSession(e)}getWatchPaths(){return[]}async seed(e,r){let n=YN(zN(e,r)),s=`mock-${n}-${VN(`${e}:${n}`)}`,o=new Date,i=xr.get(s),a=r?.prompt??"ClaudeMock seed",l=Ho(a),c={sessionId:s,cwd:e,filePath:KN(e,".lmctl-claude-mock",`${s}.json`),createdAt:i?.createdAt??o,modifiedAt:o,messages:i?.messages.slice()??[],totalInputTokens:i?.totalInputTokens??0,totalOutputTokens:i?.totalOutputTokens??0};return c.messages.push({role:"user",timestamp:o,content:a}),c.messages.push({role:"assistant",timestamp:o,content:"ACK: ClaudeMock seeded"}),c.totalInputTokens+=l,c.totalOutputTokens+=Ho("ACK: ClaudeMock seeded"),xr.set(s,c),{success:!0}}resumeCommand(e){return`ClaudeMock --resume ${e}`}startCommand(){return"ClaudeMock"}manualSeedHint(e){return{launchCommand:`cd ${e} && ClaudeMock`,postLaunchNote:"ClaudeMock is a hermetic test provider; no manual seed is required.",lsCommand:`lmctl ls --provider ClaudeMock --sessiondir ${e}`}}forkHint(e){return"ClaudeMock does not support fork."}async fork(e,r){return{success:!1,error:"ClaudeMock does not support fork."}}async sendTurn(e,r){let n=Date.now(),s=xr.get(r.sessionId);if(s===void 0)throw new Error(`ClaudeMock session not found: ${r.sessionId}`);let o=new Date,i=`ClaudeMock ack: ${ZN(e)}`;return s.messages.push({role:"user",timestamp:o,content:e}),s.messages.push({role:"assistant",timestamp:o,content:i,model:r.model??"claude-mock"}),s.modifiedAt=o,s.totalInputTokens+=Ho(e),s.totalOutputTokens+=Ho(i),r.onProgress?.({kind:"text",summary:"ClaudeMock deterministic reply"}),{text:i,sessionId:r.sessionId,durationMs:Math.max(1,Date.now()-n),stopReason:"mock_stop",numTurns:1,status:"ok"}}}});function St(t){let e=[rc({claudeDir:t?.claudeDir}),oc({codexDir:t?.codexDir,codeDir:t?.codeDir}),uc({geminiDir:t?.geminiDir,claudeDir:t?.claudeDir,codexDir:t?.codexDir,codeDir:t?.codeDir}),fc({copilotDir:t?.copilotDir}),gc(),Ec({lmplayerDbPath:t?.lmplayerDbPath}),Sc(),Nc({agyDir:t?.agyDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&e.push($c()),e}var Lc=T(()=>{"use strict";nc();ic();dc();mc();yc();Tc();kc();xc();jc();nc();ic();dc();mc();yc();Tc();kc();xc();jc()});var Dc={};ae(Dc,{ProviderRegistry:()=>rs,TransportConnectionError:()=>ke,TransportError:()=>Ze,TransportJsonError:()=>So,TransportProcessError:()=>Pt,TransportRpcError:()=>Ft,_resetDefaultRegistryForTests:()=>QN,chat:()=>Wt,countTokens:()=>Mc,createAdapterRegistry:()=>Tt,createAllAdapters:()=>St,listSessions:()=>Cc,seed:()=>Oc});function Jo(){return qo===null&&(qo=Tt(St())),qo}function QN(){qo=null}function Ih(t,e){let r=t.getAdapter(e);if(!r)throw new Error(`provider "${e}" is not registered in this registry`);return r}async function Wt(t){let e=t.registry??Jo(),r=Ih(e,t.provider),n={sessionId:t.sessionId,cwd:t.cwd,env:t.env,onDelta:t.onDelta,onProgress:t.onProgress,signal:t.signal,timeoutMs:t.timeoutMs,model:t.model,effort:t.effort,progPath:t.progPath,alias:t.alias,isLead:t.isLead,permissionMode:t.permissionMode},s=await r.sendTurn(t.prompt,n);return{text:s.text,sessionId:s.sessionId,durationMs:s.durationMs,stopReason:s.stopReason,numTurns:s.numTurns,status:s.status,stalledAfterMs:s.stalledAfterMs}}async function Oc(t){let e=t.registry??Jo(),r=Ih(e,t.provider),n=await vh(e,t.provider,t.cwd),s=await r.seed(t.cwd,{model:t.model,effort:t.effort,prompt:t.prompt});if(!s.success)return{success:!1,error:s.error};if(s.sessionId)return{success:!0,sessionId:s.sessionId};let o=await vh(e,t.provider,t.cwd),i=ex(n,o);return i?{success:!0,sessionId:i}:{success:!0}}async function vh(t,e,r){let n=await t.listAll({provider:e,workspace:r}),s=new Map;for(let o of n)s.set(o.sessionId,o.modifiedAt);return s}function ex(t,e){let r=[];for(let n of e.keys())t.has(n)||r.push(n);return r.length===1?r[0]:void 0}async function Cc(t={}){return(t.registry??Jo()).listAll({provider:t.provider,workspace:t.workspace,limit:t.limit,from:t.from,to:t.to})}async function Mc(t){let r=await(t.registry??Jo()).getSession(t.sessionId,t.provider);if(!r)throw new Error(`session "${t.sessionId}" not found`);let n=r.totalInputTokens??0,s=r.totalCachedInputTokens??0,o=r.totalCacheWriteInputTokens??0,i=r.totalOutputTokens??0,a=r.totalReasoningOutputTokens??0;return{provider:r.provider,sessionId:r.sessionId,input:n,cachedInput:s,cacheWriteInput:o,output:i,reasoningOutput:a,total:n+s+o+i+a,lastTurn:r.lastTokenUsage}}var qo,kt=T(()=>{"use strict";Dl();Lc();Dl();Lc();Vr();qo=null});function tx(){return Pc===null&&(Pc=Tt(St())),Pc}async function tn(t){let{dal:e,team_member_id:r}=t,n=e!==void 0&&r!==void 0;n&&e.setMemberState(r,"in_chat");let s=!1,o;try{return await nx(t)}catch(i){throw s=!0,o=i,i}finally{if(n)if(!s)en.delete(r),e.setMemberState(r,"idle");else{let i=rx(o,r);e.setMemberState(r,i!==null?"attention_needed":"idle",i)}}}function rx(t,e){if(!(t instanceof ve))return en.delete(e),null;if(t.kind==="sessiondir_missing")return"sessiondir_missing";if(t.kind==="enoent")return"binary_missing";if(t.kind==="nonzero_exit"&&(t.exit_status===137||t.exit_status===139))return"oom_exit";if(t.kind==="timeout"){let r=(en.get(e)??0)+1;return r>=3?(en.delete(e),"consecutive_timeouts"):(en.set(e,r),null)}return en.delete(e),null}async function nx(t){let e=t.timeoutMs,r=typeof e=="number"&&e>0,n=tx(),s;try{let u=await n.resolveSession(t.sessionid);if(!u)return Promise.reject(new ve("other",null,`library: sessionid "${t.sessionid}" matched no registered provider`,Fc(t.sessionid,t.sessiondir,"unresolved")));s=u.provider.name}catch(u){return Promise.reject(new ve("other",null,`library: session resolution failed: ${Nh(u)}`,Fc(t.sessionid,t.sessiondir,"unresolved")))}let o=Fc(t.sessionid,t.sessiondir,s),i=new AbortController,a=r?setTimeout(()=>i.abort(),e):null,l=!1;i.signal.addEventListener("abort",()=>{l=!0},{once:!0});let c=Date.now();try{let u=await Wt({provider:s,sessionId:t.sessionid,cwd:t.sessiondir,prompt:t.prompt,timeoutMs:0,signal:i.signal,registry:n,onProgress:t.onProgress,permissionMode:t.permissionMode});if(u.status==="stalled")throw new ve("timeout",null,`library: stalled after ${u.stalledAfterMs??0}ms`,o);return{text:u.text,ms:Date.now()-c,exit_status:0,argv:o}}catch(u){throw l?new ve("timeout",null,`library: wall-clock timeout after ${e??0}ms`,o):sx(u,o)}finally{a!==null&&clearTimeout(a)}}function Fc(t,e,r){return["<library>","chat",t,e,"--provider",r]}function Nh(t){return t instanceof Error?t.message:String(t)}function sx(t,e){if(t instanceof ve)return t;if(t instanceof ke){let r=t.cause;return r?.code==="ENOENT_CWD"?new ve("sessiondir_missing",null,t.message,e):r?.code==="ENOENT"?new ve("enoent",null,t.message,e):new ve("other",null,t.message,e)}return t instanceof Pt?new ve("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof Ft?new ve("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof Ze?new ve("other",null,t.message,e):new ve("other",null,Nh(t),e)}var ve,Pc,en,ds=T(()=>{"use strict";kt();ve=class extends Error{kind;exit_status;stderr;argv;constructor(e,r,n,s){super(`lmctl chat failed: ${e}`),this.kind=e,this.exit_status=r,this.stderr=n,this.argv=s,this.name="ChatError"}},Pc=null;en=new Map});function xh(){return Uc===null&&(Uc=Tt(St())),Uc}function ix(t,e){if(!ox.test(t))return t;let r=e.getConfig(`workspace.${t}`);if(r===null||r.length===0)throw new Ne("other",null,`workspace has no mapping for ${t}; run \`lmctl workspace init\` (or set workspace.${t} in lmctl_config)`,["<library>","seed","--provider",t]);return r}async function rn(t){let e=ix(t.member.provider,t.dal),r=e===t.member.provider?t.member:{...t.member,provider:e},n=await ax({member:r});return t.dal.setMemberProviderResolved(t.member.id,e),{sessionid:n.sessionid,provider_resolved:e}}async function ax(t){let e=t.member.provider,r=t.member.sessiondir,n=Wc("seed",r,e);try{let s=await Oc({provider:e,cwd:r,registry:xh()});if(!s.success)throw cx(s.error,n);if(!s.sessionId)throw new Ne("parse",0,"",n);return{sessionid:s.sessionId}}catch(s){throw s instanceof Ne?s:Bc(s,n)}}async function Ah(t){return lx(t)}async function lx(t){let e=xh(),r=Wc("tokens",t.sessionid,"unresolved"),n;try{let o=await e.resolveSession(t.sessionid);if(!o)throw new Ne("parse",0,`library: sessionid "${t.sessionid}" matched no registered provider`,r);n=o.provider.name}catch(o){throw o instanceof Ne?o:Bc(o,r)}let s=Wc("tokens",t.sessionid,n);try{let o=await Mc({sessionId:t.sessionid,provider:n,registry:e});return{input_tokens:o.input,cache_tokens:o.cachedInput+o.cacheWriteInput,output_tokens:o.output,total_tokens:o.total}}catch(o){throw o instanceof Ne?o:Bc(o,s)}}function Wc(t,e,r){return["<library>",t,e,"--provider",r]}function cx(t,e){let r=t??"";if(/\bENOENT\b/i.test(r))return new Ne("enoent",null,r,e);if(/timed?\s*out/i.test(r))return new Ne("timeout",null,r,e);if(/\bexit code\s+(-?\d+)\b/i.test(r)){let n=/\bexit code\s+(-?\d+)\b/i.exec(r);return new Ne("nonzero_exit",Number(n[1]),r,e)}return new Ne("other",null,r,e)}function Bc(t,e){return t instanceof Ne?t:t instanceof ke?t.cause?.code==="ENOENT"?new Ne("enoent",null,t.message,e):new Ne("other",null,t.message,e):t instanceof Pt?new Ne("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof Ft?new Ne("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof Ze?new Ne("other",null,t.message,e):new Ne("other",null,t instanceof Error?t.message:String(t),e)}var Ne,Uc,ox,Xo=T(()=>{"use strict";kt();Ne=class extends Error{kind;exit_status;stderr;argv;constructor(e,r,n,s){super(`lmctl seed failed: ${e}`),this.kind=e,this.exit_status=r,this.stderr=n,this.argv=s,this.name="SeedError"}},Uc=null;ox=/^provider[123]$/});function Go(t){return Buffer.from(t,"utf8").toString("base64url")}function ms(t){return Buffer.from(t,"base64url").toString("utf8")}async function Rh(t,e=r=>Ah({sessionid:r})){if(process.env.LMCTL_SESSION_SIZE_DISABLED==="1")return{recorded:0,failed:0};let r=0,n=0;for(let s of ux(t)){let o=s.member.sessionid;if(o!==null)try{let i=await e(o);t.recordSessionSize({team_name:s.team_name,alias:s.member.alias,sessionid:o,...i}),r+=1}catch(i){n+=1;try{t.raiseAttention({kind:"daemon_session_size_failed",severity:"warn",payload:JSON.stringify({team_name:s.team_name,alias:s.member.alias,sessionid:o,error:i instanceof Error?i.message:String(i)})})}catch{}}}return{recorded:r,failed:n}}async function $h(t,e,r){let n=jh(t,e,r);if(n===null||n.member.sessionid===null)throw new Error("session member not found");if(n.member.state!=="idle")throw new fs(r,n.member.state);t.setMemberState(n.member.id,"in_chat","compacting");try{return await tn({sessionid:n.member.sessionid,sessiondir:n.member.sessiondir,prompt:"/compact"}),t.setMemberState(n.member.id,"idle",null),{ok:!0,row:Lh(t,e,r)}}catch(s){throw t.setMemberState(n.member.id,"attention_needed",`compact failed: ${s instanceof Error?s.message:String(s)}`),s}}async function Hc(t,e,r){let n=jh(t,e,r);if(n===null)throw new Error("session member not found");let s=await rn({member:n.member,dal:t});return t.updateTeamMemberSession(n.member.id,s.sessionid),{ok:!0,sessionid:s.sessionid,row:Lh(t,e,r)}}function ux(t){return t.listTeams().flatMap(e=>t.listTeamMembers(e.id).filter(r=>r.sessionid!==null).map(r=>({team_name:e.name,member:r})))}function jh(t,e,r){let n=t.findTeamByName(e);if(n===null)return null;let s=t.findTeamMemberByAlias(n.id,r);return s===null?null:{team_name:n.name,member:s}}function Lh(t,e,r){return t.sessionSizeHistory(e,r,1)[0]??null}var fs,Ko=T(()=>{"use strict";ds();Xo();fs=class extends Error{constructor(e,r){super(`member ${e} is currently ${r}; cannot compact while busy`),this.name="MemberBusyError"}}});async function qc(t){let e=t.dal,r=t.nowMs??Date.now(),n=t.thresholdMs??fx(e),s=r-n,o=e.query(`
1354
+ `):"":""}function mh(t){return t.model||t.message?.model}var Wo,ph=T(()=>{"use strict";rr();Wo=class{name="qwen";baseDir;constructor(e){this.baseDir=e?.qwenDir||ir(Se,".qwen")}async discoverSessions(){let e=ir(this.baseDir,"projects"),r;try{r=await Uo(e)}catch{return[]}let n=[];for(let s of r){let o=ir(e,s,"chats"),i;try{i=await Uo(o)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),c=ir(o,a);try{let u=await this.extractSummary(c,l);u&&n.push(u)}catch{}}}return n}async extractSummary(e,r){let n=await Ce(e,30);if(n.length===0)return null;let s=await Re(e),o="(unknown)",i,a,l,c,u=0;for(let d of n){if(d.cwd&&(o=d.cwd,d.version&&(a=d.version)),d.type==="system"&&d.cwd&&(o=d.cwd,d.version&&(a=d.version),d.model&&(i=d.model)),uh(d)){let f=fh(d).trim();f&&(l||(l=G(f,80)),c=G(f,80)),u++}if(dh(d)){let f=mh(d);f&&(i=f),u++}}return{provider:"qwen",sessionId:r,cwd:o,createdAt:s.createdAt,modifiedAt:s.modifiedAt,model:i,cliVersion:a,startCommand:"qwen",firstUserMessage:l,lastUserMessage:c,messageCount:u,filePath:e}}async loadSession(e){let r=await this.resolveSessionPath(e);if(!r)return null;let n=ch(r,".jsonl");return this.loadFromFile(r,n)}async loadFromFile(e,r){let n=await Re(e),s="(unknown)",o,i,a,l,c,u,d=[];for await(let f of We(e)){if(f.cwd&&(s=f.cwd,f.version&&(i=f.version),f.gitBranch&&(a=f.gitBranch)),f.type==="system"&&f.cwd&&(s=f.cwd,f.version&&(i=f.version),f.model&&(o=f.model),f.gitBranch&&(a=f.gitBranch)),!f.message)continue;let m=f.message,p=f.timestamp?new Date(f.timestamp):n.modifiedAt;if(uh(f)){let h=fh(f);h.trim()&&(c||(c=G(h.trim(),80)),u=G(h.trim(),80)),d.push({role:"user",timestamp:p,content:h})}else if(dh(f)){let h=mh(f);if(h&&(o=h),Array.isArray(m.content))for(let g of m.content)g.type==="text"&&g.text?d.push({role:"assistant",timestamp:p,content:g.text,model:h}):g.type==="thinking"&&g.thinking&&d.push({role:"thinking",timestamp:p,content:g.thinking});else if(typeof m.content=="string")d.push({role:"assistant",timestamp:p,content:m.content,model:h});else if(Array.isArray(m.parts))for(let g of m.parts)if(g.thought||g.type==="thinking"){let _=g.thinking||g.text;_&&d.push({role:"thinking",timestamp:p,content:_})}else g.text&&d.push({role:"assistant",timestamp:p,content:g.text,model:h})}}return{provider:"qwen",sessionId:r,slug:l,cwd:s,createdAt:n.createdAt,modifiedAt:n.modifiedAt,model:o,cliVersion:i,gitBranch:a,startCommand:"qwen",firstUserMessage:c,lastUserMessage:u,messageCount:d.length,filePath:e,messages:d}}async resolveSessionPath(e){let r=ir(this.baseDir,"projects");try{let n=await Uo(r),s=[];for(let o of n){let i=ir(r,o,"chats",`${e}.jsonl`);try{return await jN(i,{flag:"r"}),i}catch{continue}}for(let o of n){let i=ir(r,o,"chats"),a;try{a=await Uo(i)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;ch(l,".jsonl").startsWith(e)&&s.push(ir(i,l))}}if(s.length===1)return s[0]}catch{}return null}async deleteSession(e){let r=await this.resolveSessionPath(e);if(!r)return!1;try{return await ON(r),!0}catch{return!1}}}});function Sc(){return new bc}var bc,kc=T(()=>{"use strict";ph();Dt();vr();bt();bc=class extends $e{constructor(){super({provider:new Wo,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"qwen",seedArgs:["-p",we,"--approval-mode","yolo"],resumeTemplate:"qwen --resume {{session_id}}",startTemplate:"qwen",transport:Ro})}}});import{readdir as hh,readFile as CN,rm as _h,stat as gh}from"node:fs/promises";import{basename as vc,join as Ut}from"node:path";async function MN(t){let e=await Promise.all(t.map(r=>Re(r)));return{createdAt:new Date(Math.min(...e.map(r=>r.createdAt.getTime()))),modifiedAt:new Date(Math.max(...e.map(r=>r.modifiedAt.getTime())))}}function DN(t,e){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function yh(t){return t.type==="USER_INPUT"}function wh(t){return t.source==="MODEL"&&t.type==="PLANNER_RESPONSE"}function PN(t){return t.source==="MODEL"&&t.type!=="PLANNER_RESPONSE"}function Eh(t){if(!t)return"";let e=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(t);return e?e[1]:t}function Th(t){if(!t)return;let e=/Model Selection` from [^\n]+? to ([^\n]+)/.exec(t);if(e)return e[1].replace(/\. No need\b[\s\S]*$/,"").replace(/\. If reporting\b[\s\S]*$/,"").replace(/\.\s*$/,"").trim()}function FN(t){if(t===void 0)return"";try{return JSON.stringify(t)}catch{return String(t)}}async function UN(t){for await(let e of We(t)){let r=e.tool_calls?.map(s=>s.args)??[];for(let s of r){let o=WN(s);if(o)return o}let n=BN(e.content);if(n)return n}return null}function WN(t){if(!t||typeof t!="object"||Array.isArray(t))return null;let e=t,r=e.Cwd??e.cwd??e.DirectoryPath;return typeof r!="string"?null:r.replace(/^"|"$/g,"")}function BN(t){return t?/"Cwd":"([^"]+)"/.exec(t)?.[1]??null:null}function bh(t){if(t.endsWith(".db"))return vc(t,".db");let e="/brain/",r=t.indexOf(e);return r===-1?null:t.slice(r+e.length).split("/")[0]||null}var Bo,Sh=T(()=>{"use strict";rr();Bo=class{name="agy";baseDir;constructor(e={}){this.baseDir=e.agyDir||Ut(Se,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:Ut(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let e=Ut(this.baseDir,"conversations"),r;try{r=await hh(e)}catch{return[]}let n=[];for(let s of r){if(!s.endsWith(".db"))continue;let o=vc(s,".db");try{let i=await this.extractSummary(o);i&&n.push(i)}catch{}}return n}conversationPath(e){return Ut(this.baseDir,"conversations",`${e}.db`)}transcriptPath(e){return Ut(this.baseDir,"brain",e,".system_generated","logs","transcript.jsonl")}async existingTranscriptPath(e){let r=this.transcriptPath(e);try{return await gh(r),r}catch{return null}}async extractSummary(e){let r=this.conversationPath(e),n=await this.existingTranscriptPath(e),s=n??r,o=await MN([r,n].filter(Boolean)),i=await this.resolveCwd(e,n),a,l,c,u=0;if(n){let d=await Ce(n,80);for(let f of d){let m=Th(f.content);if(m&&(a=m),yh(f)){let p=Eh(f.content).trim();p&&(l||(l=G(p,80)),c=G(p,80)),u++}else wh(f)&&u++}}return{provider:"agy",sessionId:e,cwd:i,createdAt:o.createdAt,modifiedAt:o.modifiedAt,model:a,startCommand:"agy",firstUserMessage:l,lastUserMessage:c,messageCount:u,filePath:s,filePaths:n?[r,n]:[r]}}async loadSession(e){let r=await this.resolveSessionPath(e);if(!r)return null;let n=bh(r);if(!n)return null;let s=await this.extractSummary(n);if(!s)return null;let o=await this.existingTranscriptPath(n),i=[],a=s.model,l=s.firstUserMessage,c=s.lastUserMessage;if(o)for await(let u of We(o)){let d=DN(u.created_at,s.modifiedAt),f=Th(u.content);if(f&&(a=f),yh(u)){let m=Eh(u.content),p=m.trim();p&&(l||(l=G(p,80)),c=G(p,80)),i.push({role:"user",timestamp:d,content:m});continue}if(Array.isArray(u.tool_calls))for(let m of u.tool_calls)i.push({role:"tool_use",timestamp:d,content:FN(m.args),toolName:m.name||"tool"});wh(u)&&u.content?i.push({role:"assistant",timestamp:d,content:u.content,model:a}):PN(u)&&u.content&&i.push({role:"tool_result",timestamp:d,content:u.content,toolName:u.type?.toLowerCase()}),u.thinking&&i.push({role:"thinking",timestamp:d,content:u.thinking})}return{...s,model:a,firstUserMessage:l,lastUserMessage:c,messageCount:i.length,messages:i}}async resolveSessionPath(e){let r=this.conversationPath(e);try{return await gh(r),r}catch{}let n=Ut(this.baseDir,"conversations");try{let s=[];for(let o of await hh(n)){if(!o.endsWith(".db"))continue;vc(o,".db").startsWith(e)&&s.push(Ut(n,o))}if(s.length===1)return s[0]}catch{}return null}async deleteSession(e){let r=await this.resolveSessionPath(e);if(!r)return!1;let n=bh(r);return n?(await _h(this.conversationPath(n),{force:!0}),await _h(Ut(this.baseDir,"brain",n),{recursive:!0,force:!0}),!0):!1}async resolveCwd(e,r){let n=await this.cwdFromLastConversationCache(e);if(n)return n;if(r){let s=await UN(r);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(e){let r=Ut(this.baseDir,"cache","last_conversations.json");try{let n=JSON.parse(await CN(r,"utf8"));for(let[s,o]of Object.entries(n))if(o===e)return s}catch{}return null}}});import{spawn as HN}from"node:child_process";function Nc(t){return new Ic(t)}async function qN(t,e){let r=Date.now(),n=["--conversation",e.sessionId,"-p",t,"--dangerously-skip-permissions","--print-timeout",XN(e.timeoutMs)];e.model&&n.push("--model",e.model),ut("agy",n,e.permissionMode??"yolo"),e.onProgress?.({kind:"system",summary:"agy -p one-shot started (no streaming events)"});let{stdout:s}=await JN(e.binary,n,{cwd:e.cwd,env:Be(e.env,e.cwd,e.sessionId),signal:e.signal});return e.onProgress?.({kind:"system",summary:"agy -p one-shot completed"}),{text:s.trimEnd(),sessionId:e.sessionId,durationMs:Date.now()-r}}function JN(t,e,r){return new Promise((n,s)=>{let o;try{o=HN(t,e,{cwd:r.cwd,env:r.env,stdio:["ignore","pipe","pipe"]})}catch(c){s(c);return}let i="",a="";o.stdout?.on("data",c=>{i+=c.toString()}),o.stderr?.on("data",c=>{a+=c.toString()});let l=()=>{o.kill("SIGTERM"),s(new Error("agy turn aborted"))};if(r.signal){if(r.signal.aborted){l();return}r.signal.addEventListener("abort",l,{once:!0})}o.on("error",c=>{r.signal?.removeEventListener("abort",l),s(c)}),o.on("exit",(c,u)=>{if(r.signal?.removeEventListener("abort",l),c===0){n({stdout:i,stderr:a});return}let d=u?`signal ${u}`:`exit code ${c}`,f=a.trim()||i.trim();s(new Error(`agy failed (${d})${f?`: ${f}`:""}`))})})}function XN(t){return!t||t<=0?"8h":`${Math.max(1,Math.ceil(t/1e3))}s`}var Ic,xc=T(()=>{"use strict";Sh();Dt();bt();lt();Yr();Ic=class extends $e{constructor(e){super({provider:new Bo(e),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",we,"--dangerously-skip-permissions","--print-timeout","2m"],resumeTemplate:"agy --conversation {{session_id}} --dangerously-skip-permissions",startTemplate:"agy --dangerously-skip-permissions",transport:qN})}seedArgsFor(e){let r=[...super.seedArgsFor(e)];return e?.model&&r.push("--model",e.model),r}manualSeedHint(e){return{launchCommand:`cd ${e} && agy --dangerously-skip-permissions`,postLaunchNote:"Send the lmctl seed instruction, wait for the conversation to write, then exit.",lsCommand:`lmctl ls --provider agy --sessiondir ${e}`}}}});import{createHash as GN}from"node:crypto";import{join as KN}from"node:path";function VN(t){return GN("sha256").update(t).digest("hex").slice(0,8)}function YN(t){let e=t.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"session"}function zN(t,e){let r=e?.prompt??"",n=/\bYou are alias\s+([A-Za-z][A-Za-z0-9_-]*)\b/.exec(r);return n!==null?n[1]:t.split(/[\\/]/).filter(Boolean).pop()??"session"}function ZN(t){return t.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function Ho(t){return Math.max(1,Math.ceil(t.length/4))}function kh(t){return{provider:"ClaudeMock",sessionId:t.sessionId,cwd:t.cwd,createdAt:t.createdAt,modifiedAt:t.modifiedAt,messageCount:t.messages.length,filePath:t.filePath,cliVersion:"ClaudeMock/0",model:"claude-mock",totalInputTokens:t.totalInputTokens,totalOutputTokens:t.totalOutputTokens,lastTokenUsage:{totalTokens:t.totalInputTokens+t.totalOutputTokens}}}function $c(){return new Rc}var xr,Ac,Rc,Lc=T(()=>{"use strict";xr=new Map;Ac=class{name="ClaudeMock";async discoverSessions(){return[...xr.values()].map(kh)}async loadSession(e){let r=xr.get(e);return r===void 0?null:{...kh(r),messages:r.messages.slice()}}async resolveSessionPath(e){return xr.get(e)?.filePath??null}async deleteSession(e){return xr.delete(e)}},Rc=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new Ac;discover(){return this.provider.discoverSessions()}load(e){return this.provider.loadSession(e)}resolvePath(e){return this.provider.resolveSessionPath(e)}delete(e){return this.provider.deleteSession(e)}getWatchPaths(){return[]}async seed(e,r){let n=YN(zN(e,r)),s=`mock-${n}-${VN(`${e}:${n}`)}`,o=new Date,i=xr.get(s),a=r?.prompt??"ClaudeMock seed",l=Ho(a),c={sessionId:s,cwd:e,filePath:KN(e,".lmctl-claude-mock",`${s}.json`),createdAt:i?.createdAt??o,modifiedAt:o,messages:i?.messages.slice()??[],totalInputTokens:i?.totalInputTokens??0,totalOutputTokens:i?.totalOutputTokens??0};return c.messages.push({role:"user",timestamp:o,content:a}),c.messages.push({role:"assistant",timestamp:o,content:"ACK: ClaudeMock seeded"}),c.totalInputTokens+=l,c.totalOutputTokens+=Ho("ACK: ClaudeMock seeded"),xr.set(s,c),{success:!0}}resumeCommand(e){return`ClaudeMock --resume ${e}`}startCommand(){return"ClaudeMock"}manualSeedHint(e){return{launchCommand:`cd ${e} && ClaudeMock`,postLaunchNote:"ClaudeMock is a hermetic test provider; no manual seed is required.",lsCommand:`lmctl ls --provider ClaudeMock --sessiondir ${e}`}}forkHint(e){return"ClaudeMock does not support fork."}async fork(e,r){return{success:!1,error:"ClaudeMock does not support fork."}}async sendTurn(e,r){let n=Date.now(),s=xr.get(r.sessionId);if(s===void 0)throw new Error(`ClaudeMock session not found: ${r.sessionId}`);let o=new Date,i=`ClaudeMock ack: ${ZN(e)}`;return s.messages.push({role:"user",timestamp:o,content:e}),s.messages.push({role:"assistant",timestamp:o,content:i,model:r.model??"claude-mock"}),s.modifiedAt=o,s.totalInputTokens+=Ho(e),s.totalOutputTokens+=Ho(i),r.onProgress?.({kind:"text",summary:"ClaudeMock deterministic reply"}),{text:i,sessionId:r.sessionId,durationMs:Math.max(1,Date.now()-n),stopReason:"mock_stop",numTurns:1,status:"ok"}}}});function St(t){let e=[rc({claudeDir:t?.claudeDir}),oc({codexDir:t?.codexDir,codeDir:t?.codeDir}),uc({geminiDir:t?.geminiDir,claudeDir:t?.claudeDir,codexDir:t?.codexDir,codeDir:t?.codeDir}),fc({copilotDir:t?.copilotDir}),gc(),Ec({lmplayerDbPath:t?.lmplayerDbPath}),Sc(),Nc({agyDir:t?.agyDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&e.push($c()),e}var jc=T(()=>{"use strict";nc();ic();dc();mc();yc();Tc();kc();xc();Lc();nc();ic();dc();mc();yc();Tc();kc();xc();Lc()});var Dc={};le(Dc,{ProviderRegistry:()=>ns,TransportConnectionError:()=>ke,TransportError:()=>Ze,TransportJsonError:()=>So,TransportProcessError:()=>Pt,TransportRpcError:()=>Ft,_resetDefaultRegistryForTests:()=>QN,chat:()=>Wt,countTokens:()=>Mc,createAdapterRegistry:()=>Tt,createAllAdapters:()=>St,listSessions:()=>Cc,seed:()=>Oc});function Jo(){return qo===null&&(qo=Tt(St())),qo}function QN(){qo=null}function Ih(t,e){let r=t.getAdapter(e);if(!r)throw new Error(`provider "${e}" is not registered in this registry`);return r}async function Wt(t){let e=t.registry??Jo(),r=Ih(e,t.provider),n={sessionId:t.sessionId,cwd:t.cwd,env:t.env,onDelta:t.onDelta,onProgress:t.onProgress,signal:t.signal,timeoutMs:t.timeoutMs,model:t.model,effort:t.effort,progPath:t.progPath,alias:t.alias,isLead:t.isLead,permissionMode:t.permissionMode},s=await r.sendTurn(t.prompt,n);return{text:s.text,sessionId:s.sessionId,durationMs:s.durationMs,stopReason:s.stopReason,numTurns:s.numTurns,status:s.status,stalledAfterMs:s.stalledAfterMs}}async function Oc(t){let e=t.registry??Jo(),r=Ih(e,t.provider),n=await vh(e,t.provider,t.cwd),s=await r.seed(t.cwd,{model:t.model,effort:t.effort,prompt:t.prompt});if(!s.success)return{success:!1,error:s.error};if(s.sessionId)return{success:!0,sessionId:s.sessionId};let o=await vh(e,t.provider,t.cwd),i=ex(n,o);return i?{success:!0,sessionId:i}:{success:!0}}async function vh(t,e,r){let n=await t.listAll({provider:e,workspace:r}),s=new Map;for(let o of n)s.set(o.sessionId,o.modifiedAt);return s}function ex(t,e){let r=[];for(let n of e.keys())t.has(n)||r.push(n);return r.length===1?r[0]:void 0}async function Cc(t={}){return(t.registry??Jo()).listAll({provider:t.provider,workspace:t.workspace,limit:t.limit,from:t.from,to:t.to})}async function Mc(t){let r=await(t.registry??Jo()).getSession(t.sessionId,t.provider);if(!r)throw new Error(`session "${t.sessionId}" not found`);let n=r.totalInputTokens??0,s=r.totalCachedInputTokens??0,o=r.totalCacheWriteInputTokens??0,i=r.totalOutputTokens??0,a=r.totalReasoningOutputTokens??0;return{provider:r.provider,sessionId:r.sessionId,input:n,cachedInput:s,cacheWriteInput:o,output:i,reasoningOutput:a,total:n+s+o+i+a,lastTurn:r.lastTokenUsage}}var qo,kt=T(()=>{"use strict";Dl();jc();Dl();jc();Vr();qo=null});function tx(){return Pc===null&&(Pc=Tt(St())),Pc}async function tn(t){let{dal:e,team_member_id:r}=t,n=e!==void 0&&r!==void 0;n&&e.setMemberState(r,"in_chat");let s=!1,o;try{return await nx(t)}catch(i){throw s=!0,o=i,i}finally{if(n)if(!s)en.delete(r),e.setMemberState(r,"idle");else{let i=rx(o,r);e.setMemberState(r,i!==null?"attention_needed":"idle",i)}}}function rx(t,e){if(!(t instanceof ve))return en.delete(e),null;if(t.kind==="sessiondir_missing")return"sessiondir_missing";if(t.kind==="enoent")return"binary_missing";if(t.kind==="nonzero_exit"&&(t.exit_status===137||t.exit_status===139))return"oom_exit";if(t.kind==="timeout"){let r=(en.get(e)??0)+1;return r>=3?(en.delete(e),"consecutive_timeouts"):(en.set(e,r),null)}return en.delete(e),null}async function nx(t){let e=t.timeoutMs,r=typeof e=="number"&&e>0,n=tx(),s;try{let u=await n.resolveSession(t.sessionid);if(!u)return Promise.reject(new ve("other",null,`library: sessionid "${t.sessionid}" matched no registered provider`,Fc(t.sessionid,t.sessiondir,"unresolved")));s=u.provider.name}catch(u){return Promise.reject(new ve("other",null,`library: session resolution failed: ${Nh(u)}`,Fc(t.sessionid,t.sessiondir,"unresolved")))}let o=Fc(t.sessionid,t.sessiondir,s),i=new AbortController,a=r?setTimeout(()=>i.abort(),e):null,l=!1;i.signal.addEventListener("abort",()=>{l=!0},{once:!0});let c=Date.now();try{let u=await Wt({provider:s,sessionId:t.sessionid,cwd:t.sessiondir,prompt:t.prompt,timeoutMs:0,signal:i.signal,registry:n,onProgress:t.onProgress,permissionMode:t.permissionMode});if(u.status==="stalled")throw new ve("timeout",null,`library: stalled after ${u.stalledAfterMs??0}ms`,o);return{text:u.text,ms:Date.now()-c,exit_status:0,argv:o}}catch(u){throw l?new ve("timeout",null,`library: wall-clock timeout after ${e??0}ms`,o):sx(u,o)}finally{a!==null&&clearTimeout(a)}}function Fc(t,e,r){return["<library>","chat",t,e,"--provider",r]}function Nh(t){return t instanceof Error?t.message:String(t)}function sx(t,e){if(t instanceof ve)return t;if(t instanceof ke){let r=t.cause;return r?.code==="ENOENT_CWD"?new ve("sessiondir_missing",null,t.message,e):r?.code==="ENOENT"?new ve("enoent",null,t.message,e):new ve("other",null,t.message,e)}return t instanceof Pt?new ve("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof Ft?new ve("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof Ze?new ve("other",null,t.message,e):new ve("other",null,Nh(t),e)}var ve,Pc,en,fs=T(()=>{"use strict";kt();ve=class extends Error{kind;exit_status;stderr;argv;constructor(e,r,n,s){super(`lmctl chat failed: ${e}`),this.kind=e,this.exit_status=r,this.stderr=n,this.argv=s,this.name="ChatError"}},Pc=null;en=new Map});function xh(){return Uc===null&&(Uc=Tt(St())),Uc}function ix(t,e){if(!ox.test(t))return t;let r=e.getConfig(`workspace.${t}`);if(r===null||r.length===0)throw new Ne("other",null,`workspace has no mapping for ${t}; run \`lmctl workspace init\` (or set workspace.${t} in lmctl_config)`,["<library>","seed","--provider",t]);return r}async function rn(t){let e=ix(t.member.provider,t.dal),r=e===t.member.provider?t.member:{...t.member,provider:e},n=await ax({member:r});return t.dal.setMemberProviderResolved(t.member.id,e),{sessionid:n.sessionid,provider_resolved:e}}async function ax(t){let e=t.member.provider,r=t.member.sessiondir,n=Wc("seed",r,e);try{let s=await Oc({provider:e,cwd:r,registry:xh()});if(!s.success)throw cx(s.error,n);if(!s.sessionId)throw new Ne("parse",0,"",n);return{sessionid:s.sessionId}}catch(s){throw s instanceof Ne?s:Bc(s,n)}}async function Ah(t){return lx(t)}async function lx(t){let e=xh(),r=Wc("tokens",t.sessionid,"unresolved"),n;try{let o=await e.resolveSession(t.sessionid);if(!o)throw new Ne("parse",0,`library: sessionid "${t.sessionid}" matched no registered provider`,r);n=o.provider.name}catch(o){throw o instanceof Ne?o:Bc(o,r)}let s=Wc("tokens",t.sessionid,n);try{let o=await Mc({sessionId:t.sessionid,provider:n,registry:e});return{input_tokens:o.input,cache_tokens:o.cachedInput+o.cacheWriteInput,output_tokens:o.output,total_tokens:o.total}}catch(o){throw o instanceof Ne?o:Bc(o,s)}}function Wc(t,e,r){return["<library>",t,e,"--provider",r]}function cx(t,e){let r=t??"";if(/\bENOENT\b/i.test(r))return new Ne("enoent",null,r,e);if(/timed?\s*out/i.test(r))return new Ne("timeout",null,r,e);if(/\bexit code\s+(-?\d+)\b/i.test(r)){let n=/\bexit code\s+(-?\d+)\b/i.exec(r);return new Ne("nonzero_exit",Number(n[1]),r,e)}return new Ne("other",null,r,e)}function Bc(t,e){return t instanceof Ne?t:t instanceof ke?t.cause?.code==="ENOENT"?new Ne("enoent",null,t.message,e):new Ne("other",null,t.message,e):t instanceof Pt?new Ne("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof Ft?new Ne("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof Ze?new Ne("other",null,t.message,e):new Ne("other",null,t instanceof Error?t.message:String(t),e)}var Ne,Uc,ox,Xo=T(()=>{"use strict";kt();Ne=class extends Error{kind;exit_status;stderr;argv;constructor(e,r,n,s){super(`lmctl seed failed: ${e}`),this.kind=e,this.exit_status=r,this.stderr=n,this.argv=s,this.name="SeedError"}},Uc=null;ox=/^provider[123]$/});function Go(t){return Buffer.from(t,"utf8").toString("base64url")}function ps(t){return Buffer.from(t,"base64url").toString("utf8")}async function Rh(t,e=r=>Ah({sessionid:r})){if(process.env.LMCTL_SESSION_SIZE_DISABLED==="1")return{recorded:0,failed:0};let r=0,n=0;for(let s of ux(t)){let o=s.member.sessionid;if(o!==null)try{let i=await e(o);t.recordSessionSize({team_name:s.team_name,alias:s.member.alias,sessionid:o,...i}),r+=1}catch(i){n+=1;try{t.raiseAttention({kind:"daemon_session_size_failed",severity:"warn",payload:JSON.stringify({team_name:s.team_name,alias:s.member.alias,sessionid:o,error:i instanceof Error?i.message:String(i)})})}catch{}}}return{recorded:r,failed:n}}async function $h(t,e,r){let n=Lh(t,e,r);if(n===null||n.member.sessionid===null)throw new Error("session member not found");if(n.member.state!=="idle")throw new ms(r,n.member.state);t.setMemberState(n.member.id,"in_chat","compacting");try{return await tn({sessionid:n.member.sessionid,sessiondir:n.member.sessiondir,prompt:"/compact"}),t.setMemberState(n.member.id,"idle",null),{ok:!0,row:jh(t,e,r)}}catch(s){throw t.setMemberState(n.member.id,"attention_needed",`compact failed: ${s instanceof Error?s.message:String(s)}`),s}}async function Hc(t,e,r){let n=Lh(t,e,r);if(n===null)throw new Error("session member not found");let s=await rn({member:n.member,dal:t});return t.updateTeamMemberSession(n.member.id,s.sessionid),{ok:!0,sessionid:s.sessionid,row:jh(t,e,r)}}function ux(t){return t.listTeams().flatMap(e=>t.listTeamMembers(e.id).filter(r=>r.sessionid!==null).map(r=>({team_name:e.name,member:r})))}function Lh(t,e,r){let n=t.findTeamByName(e);if(n===null)return null;let s=t.findTeamMemberByAlias(n.id,r);return s===null?null:{team_name:n.name,member:s}}function jh(t,e,r){return t.sessionSizeHistory(e,r,1)[0]??null}var ms,Ko=T(()=>{"use strict";fs();Xo();ms=class extends Error{constructor(e,r){super(`member ${e} is currently ${r}; cannot compact while busy`),this.name="MemberBusyError"}}});async function qc(t){let e=t.dal,r=t.nowMs??Date.now(),n=t.thresholdMs??fx(e),s=r-n,o=e.query(`
1355
1355
  SELECT
1356
1356
  isess.id AS interactive_session_id,
1357
1357
  isess.run_id,
@@ -1481,9 +1481,9 @@ ${r}`:r}function Up(t,e){let r=X0[e.tool];return r?new Promise((n,s)=>{let o=e.b
1481
1481
  WHERE run_id = ?
1482
1482
  AND kind = 'session_hung'
1483
1483
  AND acknowledged_at IS NULL
1484
- ORDER BY id ASC`,e).map(I=>({kind:I.kind,severity:I.severity,payload:Rx(I.payload)})),E=_.map(I=>{let x=f.get(I),H=p.get(I),ue=kx(s,I,S,x,H),q=x===void 0?null:Date.parse(x.started_at),P=x?.ended_at===null||x===void 0?null:Date.parse(x.ended_at),R=x===void 0||Number.isNaN(q??NaN)?null:P!==null&&!Number.isNaN(P)?P-q:ue==="running"||ue==="paused"?n-q:null,ee=x===void 0?null:h.get(x.id)??null,J=$x(H?.last_activity_at??null,ee,g),v=o===null||H===void 0?void 0:Nx(t,s.team_id,o.definition,H.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:J,elapsed_ms:R,...v!==void 0?{member:v}:{},...H!==void 0?{interactive_session:{id:H.id,status:H.status,turn_count:H.turn_count,state_name:H.state_name}}:{}}});return{run_id:e,workflow_name:o?.name??null,workflow_version:i?.version??o?.version??null,workflow_version_id:s.workflow_version_id,project:l?.name??null,status:Ix(s,a,E),submitted_at:a?.enqueued_at??s.started_at,nodes:E,current_node_index:vx(E,s.terminal_state!==null),related_attentions:w}}function oi(t,e={}){let r=e.nowMs??Date.now(),n=[],s=t.workflow_name??"?",o=t.workflow_version!==null?`v${t.workflow_version}`:"v?";n.push(`run ${t.run_id} - ${s}, ${o} - ${t.status}`);let i=`${t.submitted_at} (${Dh(Date.parse(t.submitted_at),r)} ago)`;n.push(`project: ${t.project??"?"} | submitted: ${i}`),n.push(""),n.push("timeline:"),n.push(`${Mh(t.submitted_at,t.submitted_at)} submit`);for(let a of t.nodes){let l=a.started_at===null?"[ ]":Mh(t.submitted_at,a.started_at),c=a.status.padEnd(7),u=a.elapsed_ms===null?"":` elapsed ${ii(a.elapsed_ms)}`;if(n.push(`${l} ${a.state_id.padEnd(24)} ${c}${u}`.trimEnd()),a.interactive_session!==void 0){let d=a.last_activity_at===null?"last activity unknown":`last activity ${Dh(a.last_activity_at,r)} ago`,f=a.member!==void 0?`${a.member.alias} member`:"interactive member";n.push(` ${" ".repeat(24)} ${d}`),n.push(` ${" ".repeat(24)} ${f}, ${a.interactive_session.status}`)}}if(t.related_attentions.length>0){n.push(""),n.push("attentions:");for(let a of t.related_attentions)n.push(`- ${a.kind}${jx(a.payload)}`)}return`${n.join(`
1484
+ ORDER BY id ASC`,e).map(I=>({kind:I.kind,severity:I.severity,payload:Rx(I.payload)})),E=_.map(I=>{let x=f.get(I),H=p.get(I),ue=kx(s,I,S,x,H),q=x===void 0?null:Date.parse(x.started_at),P=x?.ended_at===null||x===void 0?null:Date.parse(x.ended_at),R=x===void 0||Number.isNaN(q??NaN)?null:P!==null&&!Number.isNaN(P)?P-q:ue==="running"||ue==="paused"?n-q:null,ee=x===void 0?null:h.get(x.id)??null,J=$x(H?.last_activity_at??null,ee,g),v=o===null||H===void 0?void 0:Nx(t,s.team_id,o.definition,H.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:J,elapsed_ms:R,...v!==void 0?{member:v}:{},...H!==void 0?{interactive_session:{id:H.id,status:H.status,turn_count:H.turn_count,state_name:H.state_name}}:{}}});return{run_id:e,workflow_name:o?.name??null,workflow_version:i?.version??o?.version??null,workflow_version_id:s.workflow_version_id,project:l?.name??null,status:Ix(s,a,E),submitted_at:a?.enqueued_at??s.started_at,nodes:E,current_node_index:vx(E,s.terminal_state!==null),related_attentions:w}}function oi(t,e={}){let r=e.nowMs??Date.now(),n=[],s=t.workflow_name??"?",o=t.workflow_version!==null?`v${t.workflow_version}`:"v?";n.push(`run ${t.run_id} - ${s}, ${o} - ${t.status}`);let i=`${t.submitted_at} (${Dh(Date.parse(t.submitted_at),r)} ago)`;n.push(`project: ${t.project??"?"} | submitted: ${i}`),n.push(""),n.push("timeline:"),n.push(`${Mh(t.submitted_at,t.submitted_at)} submit`);for(let a of t.nodes){let l=a.started_at===null?"[ ]":Mh(t.submitted_at,a.started_at),c=a.status.padEnd(7),u=a.elapsed_ms===null?"":` elapsed ${ii(a.elapsed_ms)}`;if(n.push(`${l} ${a.state_id.padEnd(24)} ${c}${u}`.trimEnd()),a.interactive_session!==void 0){let d=a.last_activity_at===null?"last activity unknown":`last activity ${Dh(a.last_activity_at,r)} ago`,f=a.member!==void 0?`${a.member.alias} member`:"interactive member";n.push(` ${" ".repeat(24)} ${d}`),n.push(` ${" ".repeat(24)} ${f}, ${a.interactive_session.status}`)}}if(t.related_attentions.length>0){n.push(""),n.push("attentions:");for(let a of t.related_attentions)n.push(`- ${a.kind}${Lx(a.payload)}`)}return`${n.join(`
1485
1485
  `)}
1486
- `}function bx(t,e,r){let n=t.nodes.filter(s=>s.startsWith("@terminal:")?!1:t.nodeTypes.get(s)!=="lmctl/terminal"&&t.nodeTypes.get(s)!=="Terminal");for(let s of e){let o=r(s.state_name);n.includes(o)||n.push(o)}return n}function Sx(t){return t===null?null:t.startsWith("__paused__:")?t.slice(11):t}function kx(t,e,r,n,s){return n===void 0?"pending":n.ended_at===null?s?.status==="waiting_operator"||t.paused_at!==null&&r===e?"paused":"running":n.outcome===null?"failed":"done"}function vx(t,e){if(t.length===0)return null;let r=t.findIndex(s=>s.status==="running"||s.status==="paused"||s.status==="failed");if(r>=0)return r;if(e){for(let s=t.length-1;s>=0;s-=1)if(t[s].status==="done")return s}let n=t.findIndex(s=>s.status==="pending");return n>=0?n:t.length-1}function Ix(t,e,r){return t.terminal_state!==null?t.terminal_state:t.paused_at!==null?"paused":e?.status==="failed"||r.some(n=>n.status==="failed")?"failed":"running"}function Nx(t,e,r,n,s){let o=xx(r,n,s);if(o===null)return;let i=t.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",e,o)[0];return i===void 0?void 0:{alias:i.alias,provider:Ae(i)}}function xx(t,e,r){let n=Ax(t);if(n===null)return null;if(Array.isArray(n.steps)){let s=n.steps.find(a=>ar(a)?a.id===e||a.name===e||a.name===r:!1),o=ar(s?.members)?s.members:null,i=o!==null&&ar(o.agent)?o.agent:null;return typeof i?.alias=="string"?i.alias:null}if(ar(n.states)){let s=n.states[e]??n.states[r];if(!ar(s))return null;let o=ar(s.agent)?s.agent:null;return typeof o?.alias=="string"?o.alias:null}return null}function Ax(t){try{let e=JSON.parse(t);return ar(e)?e:null}catch{return null}}function Rx(t){if(t===null)return null;try{return JSON.parse(t)}catch{return t}}function ar(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function $x(...t){let e=t.filter(r=>r!==null&&Number.isFinite(r));return e.length===0?null:Math.max(...e)}function Mh(t,e){let r=Date.parse(t),n=Date.parse(e);return Number.isNaN(r)||Number.isNaN(n)?"[+? ]":`[+${ii(Math.max(0,n-r)).padEnd(6)}]`}function Dh(t,e){return Number.isNaN(t)?"?":ii(Math.max(0,e-t))}function ii(t){let e=Math.max(0,Math.round(t/1e3));if(e<60)return`${e}s`;let r=Math.floor(e/60),n=e%60;if(r<60)return n===0?`${r}m`:`${r}m${n}s`;let s=Math.floor(r/60),o=r%60;return o===0?`${s}h`:`${s}h${o}m`}function jx(t){if(!ar(t))return"";let e=typeof t.step_id=="number"?` on step ${t.step_id}`:"",r=typeof t.member_alias=="string"?t.member_alias:null,n=typeof t.provider=="string"?t.provider:null,s=typeof t.elapsed_ms=="number"?`, ${ii(t.elapsed_ms)} elapsed`:"",o=r===null?"":` (${r}${n===null?"":` ${n}`}${s})`;return`${e}${o}`}var Xh,Bt=T(()=>{"use strict";Ue();Xh=`SELECT a.id AS attention_id,
1486
+ `}function bx(t,e,r){let n=t.nodes.filter(s=>s.startsWith("@terminal:")?!1:t.nodeTypes.get(s)!=="lmctl/terminal"&&t.nodeTypes.get(s)!=="Terminal");for(let s of e){let o=r(s.state_name);n.includes(o)||n.push(o)}return n}function Sx(t){return t===null?null:t.startsWith("__paused__:")?t.slice(11):t}function kx(t,e,r,n,s){return n===void 0?"pending":n.ended_at===null?s?.status==="waiting_operator"||t.paused_at!==null&&r===e?"paused":"running":n.outcome===null?"failed":"done"}function vx(t,e){if(t.length===0)return null;let r=t.findIndex(s=>s.status==="running"||s.status==="paused"||s.status==="failed");if(r>=0)return r;if(e){for(let s=t.length-1;s>=0;s-=1)if(t[s].status==="done")return s}let n=t.findIndex(s=>s.status==="pending");return n>=0?n:t.length-1}function Ix(t,e,r){return t.terminal_state!==null?t.terminal_state:t.paused_at!==null?"paused":e?.status==="failed"||r.some(n=>n.status==="failed")?"failed":"running"}function Nx(t,e,r,n,s){let o=xx(r,n,s);if(o===null)return;let i=t.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",e,o)[0];return i===void 0?void 0:{alias:i.alias,provider:Ae(i)}}function xx(t,e,r){let n=Ax(t);if(n===null)return null;if(Array.isArray(n.steps)){let s=n.steps.find(a=>ar(a)?a.id===e||a.name===e||a.name===r:!1),o=ar(s?.members)?s.members:null,i=o!==null&&ar(o.agent)?o.agent:null;return typeof i?.alias=="string"?i.alias:null}if(ar(n.states)){let s=n.states[e]??n.states[r];if(!ar(s))return null;let o=ar(s.agent)?s.agent:null;return typeof o?.alias=="string"?o.alias:null}return null}function Ax(t){try{let e=JSON.parse(t);return ar(e)?e:null}catch{return null}}function Rx(t){if(t===null)return null;try{return JSON.parse(t)}catch{return t}}function ar(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function $x(...t){let e=t.filter(r=>r!==null&&Number.isFinite(r));return e.length===0?null:Math.max(...e)}function Mh(t,e){let r=Date.parse(t),n=Date.parse(e);return Number.isNaN(r)||Number.isNaN(n)?"[+? ]":`[+${ii(Math.max(0,n-r)).padEnd(6)}]`}function Dh(t,e){return Number.isNaN(t)?"?":ii(Math.max(0,e-t))}function ii(t){let e=Math.max(0,Math.round(t/1e3));if(e<60)return`${e}s`;let r=Math.floor(e/60),n=e%60;if(r<60)return n===0?`${r}m`:`${r}m${n}s`;let s=Math.floor(r/60),o=r%60;return o===0?`${s}h`:`${s}h${o}m`}function Lx(t){if(!ar(t))return"";let e=typeof t.step_id=="number"?` on step ${t.step_id}`:"",r=typeof t.member_alias=="string"?t.member_alias:null,n=typeof t.provider=="string"?t.provider:null,s=typeof t.elapsed_ms=="number"?`, ${ii(t.elapsed_ms)} elapsed`:"",o=r===null?"":` (${r}${n===null?"":` ${n}`}${s})`;return`${e}${o}`}var Xh,Bt=T(()=>{"use strict";Ue();Xh=`SELECT a.id AS attention_id,
1487
1487
  a.kind AS kind,
1488
1488
  a.severity AS severity,
1489
1489
  a.created_at AS created_at,
@@ -1505,12 +1505,12 @@ ${r}`:r}function Up(t,e){let r=X0[e.tool];return r?new Promise((n,s)=>{let o=e.b
1505
1505
  ON isess.run_id = a.run_id
1506
1506
  AND isess.id = (
1507
1507
  SELECT MAX(id) FROM interactive_session WHERE run_id = a.run_id
1508
- )`});var d_={};ae(d_,{parseApiArgs:()=>e_,readApiClientConfig:()=>hs,runApi:()=>Px});import{readFileSync as Lx}from"node:fs";import{basename as Ox,extname as Cx}from"node:path";async function Px(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(Dx),0;if(t[0]==="config")return Ux(t.slice(1),e);let r=c_(t,"--direct");if(r.rest[0]==="escalations")return Wx(r.rest.slice(1),e,r.present);if(r.rest[0]==="workflows"&&r.rest[1]==="verify"&&ci(r.rest.slice(2)))return e.stdout.write(`${Jx}
1508
+ )`});var d_={};le(d_,{parseApiArgs:()=>e_,readApiClientConfig:()=>_s,runApi:()=>Px});import{readFileSync as jx}from"node:fs";import{basename as Ox,extname as Cx}from"node:path";async function Px(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(Dx),0;if(t[0]==="config")return Ux(t.slice(1),e);let r=c_(t,"--direct");if(r.rest[0]==="escalations")return Wx(r.rest.slice(1),e,r.present);if(r.rest[0]==="workflows"&&r.rest[1]==="verify"&&ci(r.rest.slice(2)))return e.stdout.write(`${Jx}
1509
1509
  `),0;if(r.rest[0]==="workflows"&&r.rest[1]==="verify")return r.present?(e.stderr.write(`error: --direct is not supported for workflows verify; use the HTTP api route
1510
1510
  `),2):FA(r.rest.slice(2),e);if(r.rest[0]==="run"&&r.rest[1]==="where"&&ci(r.rest.slice(2)))return e.stdout.write(`${Hx}
1511
1511
  `),0;if(r.rest[0]==="run"&&r.rest[1]==="timeline"&&ci(r.rest.slice(2)))return e.stdout.write(`${qx}
1512
1512
  `),0;if(r.rest[0]==="run"&&r.rest[1]==="where")return r.present?CA(r.rest.slice(2),e):MA(r.rest.slice(2),e);if(r.rest[0]==="run"&&r.rest[1]==="timeline")return r.present?DA(r.rest.slice(2),e):PA(r.rest.slice(2),e);if(r.present)return EA(r.rest,e);let n=e_(t);if(typeof n=="string")return e.stderr.write(`error: ${n}
1513
- `),2;let s=jr(e),o=s.baseUrl,i=cr(n.accept,s.token),a=n.body;if(n.upload!==void 0)try{a=Qx(n.upload.filePath,n.upload.project)}catch(c){return e.stderr.write(`error: upload failed: ${c instanceof Error?c.message:String(c)}
1513
+ `),2;let s=Lr(e),o=s.baseUrl,i=cr(n.accept,s.token),a=n.body;if(n.upload!==void 0)try{a=Qx(n.upload.filePath,n.upload.project)}catch(c){return e.stderr.write(`error: upload failed: ${c instanceof Error?c.message:String(c)}
1514
1514
  `),2}else n.body!==void 0&&n.contentType!==void 0?i["Content-Type"]=n.contentType:n.body!==void 0&&(i["Content-Type"]="application/json");let l;try{l=await fetch(new URL(n.path,o),{method:n.method,headers:i,body:a})}catch(c){return e.stderr.write(`error: network failure: ${c instanceof Error?c.message:String(c)}
1515
1515
  `),2}if(!l.ok)return e.stderr.write(`error: HTTP ${l.status}: ${await l.text()}
1516
1516
  `),l.status===400?2:1;if(n.runAfterSubmit){let c=await l.json(),u=tA(c);if(u===null)return e.stderr.write(`error: submit-job response did not include a numeric job id
@@ -1520,7 +1520,7 @@ ${r}`:r}function Up(t,e){let r=X0[e.tool];return r?new Promise((n,s)=>{let o=e.b
1520
1520
  `):e.stdout.write(`${JSON.stringify(f)}
1521
1521
  `)}else n.json?e.stdout.write(`${JSON.stringify(await l.json(),null,2)}
1522
1522
  `):(e.stdout.write(await l.text()),e.stdout.write(`
1523
- `));return 0}function e_(t){let e=n_(t);if(typeof e=="string")return e;let r=e.args,n=e.format!=="text",[s,...o]=r;return s===void 0?"usage: lmctl api <subcommand>":s==="status"?li(o,"/api/status",n):s==="projects"?li(o,"/api/projects",n):s==="teams"?li(o,"/api/teams",n):s==="workflows"?o[0]==="verify"?cA(o.slice(1),e.format):li(o,"/api/workflows",n):s==="workflow"?lA(o,n):s==="upload"?iA(o,n):s==="submit-job"?aA(o,n):s==="issues"?oA(o,n):s==="jobs"?ps(o,"--status","/api/jobs","status",n):s==="job"?sA(o,n):s==="project"?uA(o,n):s==="artifact"?mA(o,n):s==="runs"?ps(o,"--limit","/api/runs","limit",n,!0):s==="external-objects"?ps(o,"--type","/api/external-objects","type",n):s==="external-signals"?zh(o,"--unhandled","/api/external-signals","unhandled",n):s==="attentions"||s==="attention"?o[0]==="ack"?pA(o,n):zh(o,"--unacked","/api/attentions","unacked",n):s==="stats"?hA(o,n):s==="daemon"?_A(o,n):s==="intake"?gA(o,n):s==="session"?yA(o,n):s==="run"?wA(o,e.format):s==="prs"?ps(o,"--status","/api/submitted-prs","status",n):s==="pr"?rA(o,n):`unknown subcommand: ${s}`}function cr(t,e){let r={Accept:t};return e!==null&&e.length>0&&(r.Authorization=`Bearer ${e}`),r}function jr(t){if(t.dal!==void 0)return hs(t.dal,process.env,t);let e=_e({path:de()});try{return hs(e,process.env,t)}finally{e.close()}}function hs(t,e,r){let n=[],s=t.getConfig("api.url"),o;s!==null?o=s:e.LMCTL_API_URL!==void 0&&e.LMCTL_API_URL.length>0?(o=e.LMCTL_API_URL,n.push("api.url")):o=Mx;let i=t.getConfig("api.token"),a;i!==null?a=i:e.LMCTL_API_TOKEN!==void 0&&e.LMCTL_API_TOKEN.length>0?(a=e.LMCTL_API_TOKEN,n.push("api.token")):a=null;for(let l of n)r.stderr.write(`note: ${Fx(l)} env var read; consider \`lmctl api config set ${l} ...\` to make this DB-canonical.
1523
+ `));return 0}function e_(t){let e=n_(t);if(typeof e=="string")return e;let r=e.args,n=e.format!=="text",[s,...o]=r;return s===void 0?"usage: lmctl api <subcommand>":s==="status"?li(o,"/api/status",n):s==="projects"?li(o,"/api/projects",n):s==="teams"?li(o,"/api/teams",n):s==="workflows"?o[0]==="verify"?cA(o.slice(1),e.format):li(o,"/api/workflows",n):s==="workflow"?lA(o,n):s==="upload"?iA(o,n):s==="submit-job"?aA(o,n):s==="issues"?oA(o,n):s==="jobs"?hs(o,"--status","/api/jobs","status",n):s==="job"?sA(o,n):s==="project"?uA(o,n):s==="artifact"?mA(o,n):s==="runs"?hs(o,"--limit","/api/runs","limit",n,!0):s==="external-objects"?hs(o,"--type","/api/external-objects","type",n):s==="external-signals"?zh(o,"--unhandled","/api/external-signals","unhandled",n):s==="attentions"||s==="attention"?o[0]==="ack"?pA(o,n):zh(o,"--unacked","/api/attentions","unacked",n):s==="stats"?hA(o,n):s==="daemon"?_A(o,n):s==="intake"?gA(o,n):s==="session"?yA(o,n):s==="run"?wA(o,e.format):s==="prs"?hs(o,"--status","/api/submitted-prs","status",n):s==="pr"?rA(o,n):`unknown subcommand: ${s}`}function cr(t,e){let r={Accept:t};return e!==null&&e.length>0&&(r.Authorization=`Bearer ${e}`),r}function Lr(t){if(t.dal!==void 0)return _s(t.dal,process.env,t);let e=_e({path:de()});try{return _s(e,process.env,t)}finally{e.close()}}function _s(t,e,r){let n=[],s=t.getConfig("api.url"),o;s!==null?o=s:e.LMCTL_API_URL!==void 0&&e.LMCTL_API_URL.length>0?(o=e.LMCTL_API_URL,n.push("api.url")):o=Mx;let i=t.getConfig("api.token"),a;i!==null?a=i:e.LMCTL_API_TOKEN!==void 0&&e.LMCTL_API_TOKEN.length>0?(a=e.LMCTL_API_TOKEN,n.push("api.token")):a=null;for(let l of n)r.stderr.write(`note: ${Fx(l)} env var read; consider \`lmctl api config set ${l} ...\` to make this DB-canonical.
1524
1524
  `);return{baseUrl:o,token:a}}function Fx(t){switch(t){case"api.port":return"LMCTL_API_PORT";case"api.token":return"LMCTL_API_TOKEN";case"api.url":return"LMCTL_API_URL";default:return`LMCTL_${t.replaceAll(".","_").toUpperCase()}`}}async function Ux(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`usage: lmctl api config <get|set|list>
1525
1525
  `),2;let s=e.dal===void 0,o=e.dal??_e({path:de()});try{if(r==="get"){if(n.length!==1)return e.stderr.write(`usage: lmctl api config get <key>
1526
1526
  `),2;let i=n[0];if(!ai.has(i))return e.stderr.write(`error: unsupported config key: ${i} (Phase A keys: ${[...ai].join(", ")})
@@ -1538,7 +1538,7 @@ ${r}`:r}function Up(t,e){let r=X0[e.tool];return r?new Promise((n,s)=>{let o=e.b
1538
1538
  `),0;let n=c_(t,"--direct"),s=r||n.present,o=n.rest,[i,...a]=o;return i===void 0?(e.stderr.write(`usage: lmctl api escalations <list|show|respond>
1539
1539
  `),2):s?Xx(i,a,e):i==="list"?Kx(a,e):i==="show"?Yx(a,e):i==="respond"?zx(a,e):(e.stderr.write(`error: unknown api escalations verb: ${i}
1540
1540
  `),2)}function ci(t){return t.some(e=>e==="--help"||e==="-h")}function Xx(t,e,r){let n=r.dal===void 0,s=r.dal??_e({path:de()});try{return u_(s,[t,...e],r)}finally{n&&s.close()}}function t_(t){let e,r=!1,n=!1,s;for(let i=0;i<t.length;i+=1){let a=t[i];if(a==="--json"){r=!0;continue}if(a==="--all"){n=!0;continue}if(a==="--project"){let l=t[++i];if(l===void 0||l.startsWith("--"))return"missing value for --project";e=l;continue}if(a==="--since"){let l=t[++i];if(l===void 0||l.startsWith("--"))return"missing value for --since";let c=Gx(l);if(typeof c=="object"&&"error"in c)return c.error;s=c.iso;continue}return re(a)}let o={json:r,all:n};return e!==void 0&&(o.project=e),s!==void 0&&(o.since=s),o}function Gx(t){let e=/^(\d+)([smhd])$/.exec(t);if(e!==null){let n=Number(e[1]),s=e[2],o=s==="s"?n:s==="m"?n*60:s==="h"?n*3600:n*86400;return{iso:new Date(Date.now()-o*1e3).toISOString()}}let r=Date.parse(t);return Number.isNaN(r)?{error:`invalid --since value: ${t} (expected ISO8601 or duration like 24h)`}:{iso:new Date(r).toISOString()}}async function Kx(t,e){let r=t_(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
1541
- `),2;let n=jr(e),s=cr("application/json",n.token),o=new URLSearchParams;r.project!==void 0&&o.set("project",r.project),r.all&&o.set("all","true"),r.since!==void 0&&o.set("since",r.since);let i=o.toString().length>0?`?${o.toString()}`:"",a;try{a=await fetch(new URL(`/api/escalations${i}`,n.baseUrl),{method:"GET",headers:s})}catch(c){return e.stderr.write(`error: network failure: ${c instanceof Error?c.message:String(c)}
1541
+ `),2;let n=Lr(e),s=cr("application/json",n.token),o=new URLSearchParams;r.project!==void 0&&o.set("project",r.project),r.all&&o.set("all","true"),r.since!==void 0&&o.set("since",r.since);let i=o.toString().length>0?`?${o.toString()}`:"",a;try{a=await fetch(new URL(`/api/escalations${i}`,n.baseUrl),{method:"GET",headers:s})}catch(c){return e.stderr.write(`error: network failure: ${c instanceof Error?c.message:String(c)}
1542
1542
  `),1}if(!a.ok)return e.stderr.write(`error: HTTP ${a.status}: ${await a.text()}
1543
1543
  `),a.status===400?2:1;let l=await a.json();return r_(l,r.json,e)}function r_(t,e,r){if(e)return r.stdout.write(`${JSON.stringify(t,null,2)}
1544
1544
  `),0;if(t.length===0)return r.stdout.write(`No pending escalations.
@@ -1552,22 +1552,22 @@ ${r}`:r}function Up(t,e){let r=X0[e.tool];return r?new Promise((n,s)=>{let o=e.b
1552
1552
  `),r.stdout.write(`
1553
1553
  `)}return 0}function Vx(t){let e=Date.parse(t);if(Number.isNaN(e))return"recently";let r=Math.max(0,Math.round((Date.now()-e)/1e3));if(r<60)return`${r}s ago`;let n=Math.round(r/60);if(n<60)return`${n}m ago`;let s=Math.round(n/60);return s<24?`${s}h ago`:`${Math.round(s/24)}d ago`}async function Yx(t,e){let r=t.filter(a=>a!=="--json"&&a!=="--text");if(r.length!==1)return e.stderr.write(`usage: lmctl api escalations show <attention_id> [--json|--text]
1554
1554
  `),2;let n=ne(r[0],"attention_id");if(typeof n=="string")return e.stderr.write(`error: ${n}
1555
- `),2;let s=jr(e),o=cr("application/json",s.token),i;try{i=await fetch(new URL(`/api/escalations/${n}`,s.baseUrl),{method:"GET",headers:o})}catch(a){return e.stderr.write(`error: network failure: ${a instanceof Error?a.message:String(a)}
1555
+ `),2;let s=Lr(e),o=cr("application/json",s.token),i;try{i=await fetch(new URL(`/api/escalations/${n}`,s.baseUrl),{method:"GET",headers:o})}catch(a){return e.stderr.write(`error: network failure: ${a instanceof Error?a.message:String(a)}
1556
1556
  `),1}return i.status===404?(e.stderr.write(`error: escalation not found: ${n}
1557
1557
  `),1):i.ok?(e.stdout.write(`${JSON.stringify(await i.json(),null,2)}
1558
1558
  `),0):(e.stderr.write(`error: HTTP ${i.status}: ${await i.text()}
1559
1559
  `),i.status===400?2:1)}async function zx(t,e){let r=!1,n=!1,s=[];for(let f=0;f<t.length;f+=1){let m=t[f];if(m==="--json"){r=!0;continue}if(m==="--done"){n=!0;continue}s.push(m)}if(s.length!==2)return e.stderr.write(`usage: lmctl api escalations respond <attention_id> "<answer>" [--done] [--json]
1560
1560
  `),2;let o=ne(s[0],"attention_id");if(typeof o=="string")return e.stderr.write(`error: ${o}
1561
- `),2;let i=s[1],a=jr(e),l=cr("application/json",a.token);l["Content-Type"]="application/json";let c={input:i};n&&(c.done=!0);let u;try{u=await fetch(new URL(`/api/escalations/${o}/respond`,a.baseUrl),{method:"POST",headers:l,body:JSON.stringify(c)})}catch(f){return e.stderr.write(`error: network failure: ${f instanceof Error?f.message:String(f)}
1561
+ `),2;let i=s[1],a=Lr(e),l=cr("application/json",a.token);l["Content-Type"]="application/json";let c={input:i};n&&(c.done=!0);let u;try{u=await fetch(new URL(`/api/escalations/${o}/respond`,a.baseUrl),{method:"POST",headers:l,body:JSON.stringify(c)})}catch(f){return e.stderr.write(`error: network failure: ${f instanceof Error?f.message:String(f)}
1562
1562
  `),1}if(u.status===404)return e.stderr.write(`error: escalation not found: ${o}
1563
1563
  `),1;if(!u.ok){let f=await u.text();return e.stderr.write(`error: HTTP ${u.status}: ${f}
1564
1564
  `),u.status===400?2:1}let d=await u.json();return r?e.stdout.write(`${JSON.stringify(d,null,2)}
1565
1565
  `):e.stdout.write(`ok: attention ${o} acknowledged; step ${d.step_id} resumed (session_status=${String(d.session_status)})
1566
- `),0}function Yh(t,e,r){return t!=="api.token"||r?e:e.length<=8?"***":`${e.slice(0,8)}\u2026(masked; use --show-secrets to reveal)`}function Zx(t,e){if(e.length===0)return`${t} value must be non-empty`;if(t==="api.port"){let r=Number(e);if(!Number.isInteger(r)||r<=0||r>65535)return`invalid api.port: ${e}`}if(t==="api.url")try{new URL(e)}catch{return`invalid api.url: ${e}`}if(t===Vo||t===Yo){let r=Number(e);if(!Number.isInteger(r)||r<=0)return`invalid ${t}: ${e}`}return null}function Qx(t,e){let r=Lx(t),n=r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength),s=new FormData;return s.append("image",new Blob([n],{type:eA(t)}),Ox(t)),e!==void 0&&s.append("project",e),s}function eA(t){switch(Cx(t).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 tA(t){if(t!==null&&typeof t=="object"&&!Array.isArray(t)){let e=t.id;return typeof e=="number"&&Number.isInteger(e)?e:null}return null}function rA(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api pr <id|list|get>";if(r==="list")return ps(n,"--status","/api/submitted-prs","status",e);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:e}:{method:"GET",path:`/api/submitted-prs?pr_url=${encodeURIComponent(s)}`,accept:"application/json",json:e}}return/^\d+$/.test(r)?{method:"GET",path:`/api/submitted-prs/${r}`,accept:"application/json",json:e}:`usage: lmctl api pr <id|list|get>; got: ${r}`}function n_(t){let e=[],r="json";for(let n of t)n==="--json"?r="json":n==="--text"?r="text":e.push(n);return{args:e,format:r}}function li(t,e,r){return t.length>0?re(t[0]):{method:"GET",path:e,accept:r?"application/json":"text/html",json:r}}function ps(t,e,r,n,s,o=!1){let i;for(let l=0;l<t.length;l+=1){let c=t[l];if(c!==e)return re(c);let u=t[++l];if(u===void 0||u.startsWith("--"))return`missing value for ${e}`;if(o&&(!/^\d+$/.test(u)||Number(u)<=0))return`invalid ${e}: ${u}`;i=u}let a=i===void 0?"":`?${n}=${encodeURIComponent(i)}`;return{method:"GET",path:`${r}${a}`,accept:s?"application/json":"text/html",json:s}}function zh(t,e,r,n,s){let o=!1;for(let i of t){if(i!==e)return re(i);o=!0}return{method:"GET",path:`${r}${o?`?${n}=true`:""}`,accept:s?"application/json":"text/html",json:s}}function nA(t,e,r){if(t.length!==1)return`usage: lmctl api ${r} <id>`;let n=ne(t[0],"id");return typeof n=="string"?n:{method:"GET",path:`${e}/${n}`,accept:"application/json",json:!0}}function sA(t,e){let[r,...n]=t;if(r!==void 0&&n.length===0&&r!=="enqueue"&&r!=="run")return nA([r],"/api/jobs","job");if(r==="enqueue"){let s,o,i="manual",a,l,c;for(let d=0;d<n.length;d+=1){let f=n[d],m=n[++d];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}`;o=p}else if(f==="--source")i=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&&o===void 0)return"usage: lmctl api job enqueue (--project NAME | --project-id ID) [--source S] [--payload JSON] [--dedupe-key K] [--priority N]";let u={source:i};return s!==void 0&&(u.project=s),o!==void 0&&(u.project_id=o),a!==void 0&&(u.payload=Zc(a)),l!==void 0&&(u.dedupe_key=l),c!==void 0&&(u.priority=c),{method:"POST",path:"/api/jobs",accept:"application/json",json:e,body:JSON.stringify(u)}}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:e}}return"usage: lmctl api job <id|enqueue|run>"}function oA(t,e){let[r,...n]=t;if(r==="list"){let[s,...o]=n;if(s===void 0||s.startsWith("--"))return"usage: lmctl api issues list <project> [--status STATUS] [--severity SEVERITY] [--ai-test-path P]";let i=new URLSearchParams;for(let l=0;l<o.length;l+=1){let c=o[l],u=o[++l];if(u===void 0||u.startsWith("--"))return`missing value for ${c}`;if(c==="--status")i.set("status",u);else if(c==="--severity")i.set("severity",u);else if(c==="--ai-test-path")i.set("ai_test_path",u);else return re(c)}let a=i.toString();return{method:"GET",path:`/api/projects/${encodeURIComponent(s)}/issues${a.length>0?`?${a}`:""}`,accept:e?"application/json":"text/html",json:e}}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:e}}return r==="create"?s_(n,e):r==="claim"?o_(n,e):r==="claim-next"?i_(n,e):r==="close"?a_(n,e):r==="reopen"?l_(n,e):"usage: lmctl api issues <list|show|create|claim|claim-next|close|reopen>"}function s_(t,e){let[r,...n]=t;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"]),o={};for(let i=0;i<n.length;i+=1){let a=n[i],l=n[++i];if(l===void 0)return`missing value for ${a}`;if(!s.has(a)&&l.startsWith("--"))return`missing value for ${a}`;if(a==="--title")o.title=l;else if(a==="--body")o.body=l;else if(a==="--severity")o.severity=l;else if(a==="--labels")o.labels=Zc(l);else if(a==="--ai-test-path")o.ai_test_path=l;else if(a==="--source-run-id"){let c=ne(l,"--source-run-id");if(typeof c=="string")return c;o.source_run_id=c}else return re(a)}return typeof o.title!="string"?"missing value for --title":typeof o.body!="string"?"missing value for --body":{method:"POST",path:`/api/projects/${encodeURIComponent(r)}/issues`,accept:"application/json",json:e,body:JSON.stringify(o)}}function o_(t,e){let[r,...n]=t;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 o={};for(let i=0;i<n.length;i+=1){let a=n[i],l=n[++i];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;o.assigned_run_id=c}else return re(a)}return typeof o.assigned_run_id!="number"?"missing value for --assigned-run-id":{method:"POST",path:`/api/issues/${s}/claim`,accept:"application/json",json:e,body:JSON.stringify(o)}}function i_(t,e){let[r,...n]=t;if(r===void 0||r.startsWith("--"))return"usage: lmctl api issues claim-next <project> --assigned-run-id RUN";let s={};for(let o=0;o<n.length;o+=1){let i=n[o],a=n[++o];if(a===void 0||a.startsWith("--"))return`missing value for ${i}`;if(i==="--assigned-run-id"){let l=ne(a,"--assigned-run-id");if(typeof l=="string")return l;s.assigned_run_id=l}else return re(i)}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:e,body:JSON.stringify(s)}}function a_(t,e){let[r,...n]=t;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 o={};for(let i=0;i<n.length;i+=1){let a=n[i],l=n[++i];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--commit-hash")o.commit_hash=l;else if(a==="--closed-run-id"){let c=ne(l,"--closed-run-id");if(typeof c=="string")return c;o.closed_run_id=c}else return re(a)}return{method:"POST",path:`/api/issues/${s}/close`,accept:"application/json",json:e,body:JSON.stringify(o)}}function l_(t,e){let[r,...n]=t;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 o={};for(let i=0;i<n.length;i+=1){let a=n[i],l=n[++i];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;o.source_run_id=c}else return re(a)}return{method:"POST",path:`/api/issues/${s}/reopen`,accept:"application/json",json:e,body:JSON.stringify(o)}}function iA(t,e){let[r,...n]=t;if(r===void 0||r.startsWith("--"))return"usage: lmctl api upload <file> [--project NAME] [--json]";let s;for(let o=0;o<n.length;o+=1){let i=n[o];if(i!=="--project")return re(i);let a=n[++o];if(a===void 0||a.startsWith("--"))return"missing value for --project";s=a}return{method:"POST",path:"/api/uploads",accept:"application/json",json:e,upload:{filePath:r,project:s}}}function aA(t,e){let r,n,s,o;for(let a=0;a<t.length;a+=1){let l=t[a],c=t[++a];if(c===void 0||c.startsWith("--"))return`missing value for ${l}`;if(l==="--workflow")r=c;else if(l==="--workflow-id-override"){let u=Number(c);if(!Number.isInteger(u)||u<=0)return`invalid --workflow-id-override: ${c}`;n=u}else if(l==="--project")s=c;else if(l==="--inputs")try{let u=JSON.parse(c);if(u===null||typeof u!="object"||Array.isArray(u))return"--inputs must be a JSON object";o=u}catch{return"invalid --inputs JSON"}else return re(l)}if(r===void 0&&n===void 0)return"missing value for --workflow";if(o===void 0)return"missing value for --inputs";let i={source:"api-submit-job",payload:o};return r!==void 0&&(i.workflow=r),n!==void 0&&(i.workflow_id_override=n),s!==void 0&&(i.project=s),{method:"POST",path:"/api/jobs",accept:"application/json",json:e,body:JSON.stringify(i),runAfterSubmit:!0}}function Zc(t){try{return JSON.parse(t)}catch{return t}}function lA(t,e){let[r,n]=t;return r!=="show"||n===void 0||t.length!==2?"usage: lmctl api workflow show <name>":{method:"GET",path:`/api/workflows/${encodeURIComponent(n)}`,accept:"application/json",json:e}}function cA(t,e){for(let r of t)if(!(r==="--json"||r==="--text"))return re(r);return{method:"GET",path:"/api/workflows/verify",accept:e==="text"?"text/plain":"application/json",json:e!=="text"}}function uA(t,e){let[r,n,...s]=t;return r==="workflow"?dA([n,...s].filter(o=>o!==void 0),e):r!=="show"||n===void 0||t.length!==2?"usage: lmctl api project <show|workflow>":{method:"GET",path:`/api/projects/${encodeURIComponent(n)}`,accept:"application/json",json:e}}function dA(t,e){let[r,...n]=t;if(r==="list")return n.length!==1?"usage: lmctl api project workflow list <project>":{method:"GET",path:`/api/projects/${encodeURIComponent(n[0])}/workflows`,accept:e?"application/json":"text/html",json:e};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:e?"application/json":"text/html",json:e}}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 o=r==="remove"?"DELETE":"POST",i=r==="remove"?"":`/${r}`;return{method:o,path:`/api/projects/workflows/${s}${i}`,accept:"application/json",json:e}}if(r==="add"){let s=fA(n);return typeof s=="string"?s:{method:"POST",path:`/api/projects/${encodeURIComponent(s.project)}/workflows`,accept:"application/json",json:e,body:JSON.stringify(s.body)}}return"usage: lmctl api project workflow <add|list|show|remove|enable|disable>"}function fA(t){let[e,r,...n]=t;if(e===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 o=0;o<n.length;o+=1){let i=n[o],a=n[++o];if(a===void 0||a.startsWith("--"))return`missing value for ${i}`;if(i==="--condition")s.condition=a;else if(i==="--params")s.params=Zc(a);else if(i==="--priority"){let l=Number(a);if(!Number.isInteger(l))return`invalid --priority: ${a}`;s.priority=l}else return re(i)}return{project:e,body:s}}function mA(t,e){if(t[0]!=="get")return"usage: lmctl api artifact get --run R --kind K [--raw]";let r,n,s=!1;for(let i=1;i<t.length;i+=1){let a=t[i];if(a==="--raw"){s=!0;continue}let l=t[++i];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&&e}}function pA(t,e){if(t[0]!=="ack"||t.length!==2)return"usage: lmctl api attention ack <id>";let r=ne(t[1],"id");return typeof r=="string"?r:{method:"POST",path:`/api/attentions/${r}/ack`,accept:e?"application/json":"text/html",json:e}}function hA(t,e){return t.length!==1||t[0]!=="run-throughput"?"usage: lmctl api stats run-throughput":{method:"GET",path:"/api/stats/run-throughput",accept:e?"application/json":"text/html",json:e}}function _A(t,e){return t.length!==1||t[0]!=="state"&&t[0]!=="cycle"?"usage: lmctl api daemon <state|cycle>":{method:t[0]==="cycle"?"POST":"GET",path:t[0]==="cycle"?"/api/daemon/cycle":"/api/daemon/state",accept:e?"application/json":"text/html",json:e}}function gA(t,e){return t.length!==1||t[0]!=="state"&&t[0]!=="scan"?"usage: lmctl api intake <state|scan>":{method:t[0]==="scan"?"POST":"GET",path:t[0]==="scan"?"/api/intake/scan":"/api/intake/state",accept:e?"application/json":"text/html",json:e}}function yA(t,e){let r=t[0];if(r==="list")return t.length!==1?"usage: lmctl api session list":{method:"GET",path:"/api/sessions",accept:e?"application/json":"text/html",json:e};if(r==="history"||r==="compact"||r==="refresh"){if(t.length!==3)return`usage: lmctl api session ${r} <team_name> <alias>`;let n=Go(t[1]),s=encodeURIComponent(t[2]);return{method:r==="history"?"GET":"POST",path:`/api/sessions/${n}/${s}/${r}`,accept:e?"application/json":"text/html",json:e}}return"usage: lmctl api session <list|history|compact|refresh>"}function wA(t,e){let[r,n,s,o]=t;if(r!==void 0&&/^\d+$/.test(r)&&n===void 0){let i=ne(r,"run_id");return typeof i=="string"?i:{method:"GET",path:`/api/runs/${i}`,accept:"application/json",json:e!=="text"}}if(r==="resume"){if(n===void 0)return"usage: lmctl api run resume <run_id> --outcome <value>";let i=ne(n,"run_id");if(typeof i=="string")return i;let a;for(let l=2;l<t.length;l+=1){let c=t[l];if(c!=="--outcome")return re(c);let u=t[++l];if(u===void 0||u.startsWith("--"))return"missing value for --outcome";a=u}return a===void 0?"missing value for --outcome":{method:"POST",path:`/api/runs/${i}/resume?outcome=${encodeURIComponent(a)}`,accept:e==="text"?"text/html":"application/json",json:e!=="text"}}if(r==="get"){if(n===void 0||s!==void 0)return"usage: lmctl api run get <run_id>";let i=ne(n,"run_id");return typeof i=="string"?i:{method:"GET",path:`/api/runs/${i}`,accept:"application/json",json:e!=="text"}}if(r==="step"||r==="transcript"||r==="messages"){if(n===void 0||s===void 0||o!==void 0)return`usage: lmctl api run ${r} <run_id> <step_id>`;let i=ne(n,"run_id");if(typeof i=="string")return i;let a=ne(s,"step_id");if(typeof a=="string")return a;let l=r==="step"?"":`/${r}`,c=r==="transcript"&&e==="text";return{method:"GET",path:`/api/runs/${i}/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 i=ne(n,"run_id");if(typeof i=="string")return i;let a;for(let c=2;c<t.length;c+=1){let u=t[c];if(u!=="--kind")return re(u);let d=t[++c];if(d===void 0)return"missing value for --kind";a=d}let l=a===void 0?"":`?kind=${encodeURIComponent(a)}`;return{method:"GET",path:`/api/runs/${i}/artifacts${l}`,accept:"application/json",json:e!=="text"}}if(r==="where"){if(n===void 0||s!==void 0)return"usage: lmctl api run where <run_id>";let i=ne(n,"run_id");return typeof i=="string"?i:{method:"GET",path:`/api/runs/${i}/where`,accept:e==="text"?"text/plain":"application/json",json:e!=="text"}}if(r==="timeline"){if(n===void 0||s!==void 0)return"usage: lmctl api run timeline <run_id>";let i=ne(n,"run_id");return typeof i=="string"?i:{method:"GET",path:`/api/runs/${i}/timeline`,accept:e==="text"?"text/plain":"application/json",json:e!=="text"}}return"usage: lmctl api run <id|get|step|transcript|messages|resume|artifacts|where|timeline>"}function ne(t,e){return t===void 0||t.startsWith("--")?`missing value for ${e}`:!/^\d+$/.test(t)||Number(t)<=0?`invalid ${e}: ${t}`:Number(t)}function re(t){return t.startsWith("--")?`unknown flag: ${t}`:`unknown argument: ${t}`}function c_(t,e){let r=[],n=!1;for(let s of t){if(s===e){n=!0;continue}r.push(s)}return{rest:r,present:n}}async function EA(t,e){let r=n_(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
1566
+ `),0}function Yh(t,e,r){return t!=="api.token"||r?e:e.length<=8?"***":`${e.slice(0,8)}\u2026(masked; use --show-secrets to reveal)`}function Zx(t,e){if(e.length===0)return`${t} value must be non-empty`;if(t==="api.port"){let r=Number(e);if(!Number.isInteger(r)||r<=0||r>65535)return`invalid api.port: ${e}`}if(t==="api.url")try{new URL(e)}catch{return`invalid api.url: ${e}`}if(t===Vo||t===Yo){let r=Number(e);if(!Number.isInteger(r)||r<=0)return`invalid ${t}: ${e}`}return null}function Qx(t,e){let r=jx(t),n=r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength),s=new FormData;return s.append("image",new Blob([n],{type:eA(t)}),Ox(t)),e!==void 0&&s.append("project",e),s}function eA(t){switch(Cx(t).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 tA(t){if(t!==null&&typeof t=="object"&&!Array.isArray(t)){let e=t.id;return typeof e=="number"&&Number.isInteger(e)?e:null}return null}function rA(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api pr <id|list|get>";if(r==="list")return hs(n,"--status","/api/submitted-prs","status",e);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:e}:{method:"GET",path:`/api/submitted-prs?pr_url=${encodeURIComponent(s)}`,accept:"application/json",json:e}}return/^\d+$/.test(r)?{method:"GET",path:`/api/submitted-prs/${r}`,accept:"application/json",json:e}:`usage: lmctl api pr <id|list|get>; got: ${r}`}function n_(t){let e=[],r="json";for(let n of t)n==="--json"?r="json":n==="--text"?r="text":e.push(n);return{args:e,format:r}}function li(t,e,r){return t.length>0?re(t[0]):{method:"GET",path:e,accept:r?"application/json":"text/html",json:r}}function hs(t,e,r,n,s,o=!1){let i;for(let l=0;l<t.length;l+=1){let c=t[l];if(c!==e)return re(c);let u=t[++l];if(u===void 0||u.startsWith("--"))return`missing value for ${e}`;if(o&&(!/^\d+$/.test(u)||Number(u)<=0))return`invalid ${e}: ${u}`;i=u}let a=i===void 0?"":`?${n}=${encodeURIComponent(i)}`;return{method:"GET",path:`${r}${a}`,accept:s?"application/json":"text/html",json:s}}function zh(t,e,r,n,s){let o=!1;for(let i of t){if(i!==e)return re(i);o=!0}return{method:"GET",path:`${r}${o?`?${n}=true`:""}`,accept:s?"application/json":"text/html",json:s}}function nA(t,e,r){if(t.length!==1)return`usage: lmctl api ${r} <id>`;let n=ne(t[0],"id");return typeof n=="string"?n:{method:"GET",path:`${e}/${n}`,accept:"application/json",json:!0}}function sA(t,e){let[r,...n]=t;if(r!==void 0&&n.length===0&&r!=="enqueue"&&r!=="run")return nA([r],"/api/jobs","job");if(r==="enqueue"){let s,o,i="manual",a,l,c;for(let d=0;d<n.length;d+=1){let f=n[d],m=n[++d];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}`;o=p}else if(f==="--source")i=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&&o===void 0)return"usage: lmctl api job enqueue (--project NAME | --project-id ID) [--source S] [--payload JSON] [--dedupe-key K] [--priority N]";let u={source:i};return s!==void 0&&(u.project=s),o!==void 0&&(u.project_id=o),a!==void 0&&(u.payload=Zc(a)),l!==void 0&&(u.dedupe_key=l),c!==void 0&&(u.priority=c),{method:"POST",path:"/api/jobs",accept:"application/json",json:e,body:JSON.stringify(u)}}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:e}}return"usage: lmctl api job <id|enqueue|run>"}function oA(t,e){let[r,...n]=t;if(r==="list"){let[s,...o]=n;if(s===void 0||s.startsWith("--"))return"usage: lmctl api issues list <project> [--status STATUS] [--severity SEVERITY] [--ai-test-path P]";let i=new URLSearchParams;for(let l=0;l<o.length;l+=1){let c=o[l],u=o[++l];if(u===void 0||u.startsWith("--"))return`missing value for ${c}`;if(c==="--status")i.set("status",u);else if(c==="--severity")i.set("severity",u);else if(c==="--ai-test-path")i.set("ai_test_path",u);else return re(c)}let a=i.toString();return{method:"GET",path:`/api/projects/${encodeURIComponent(s)}/issues${a.length>0?`?${a}`:""}`,accept:e?"application/json":"text/html",json:e}}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:e}}return r==="create"?s_(n,e):r==="claim"?o_(n,e):r==="claim-next"?i_(n,e):r==="close"?a_(n,e):r==="reopen"?l_(n,e):"usage: lmctl api issues <list|show|create|claim|claim-next|close|reopen>"}function s_(t,e){let[r,...n]=t;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"]),o={};for(let i=0;i<n.length;i+=1){let a=n[i],l=n[++i];if(l===void 0)return`missing value for ${a}`;if(!s.has(a)&&l.startsWith("--"))return`missing value for ${a}`;if(a==="--title")o.title=l;else if(a==="--body")o.body=l;else if(a==="--severity")o.severity=l;else if(a==="--labels")o.labels=Zc(l);else if(a==="--ai-test-path")o.ai_test_path=l;else if(a==="--source-run-id"){let c=ne(l,"--source-run-id");if(typeof c=="string")return c;o.source_run_id=c}else return re(a)}return typeof o.title!="string"?"missing value for --title":typeof o.body!="string"?"missing value for --body":{method:"POST",path:`/api/projects/${encodeURIComponent(r)}/issues`,accept:"application/json",json:e,body:JSON.stringify(o)}}function o_(t,e){let[r,...n]=t;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 o={};for(let i=0;i<n.length;i+=1){let a=n[i],l=n[++i];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;o.assigned_run_id=c}else return re(a)}return typeof o.assigned_run_id!="number"?"missing value for --assigned-run-id":{method:"POST",path:`/api/issues/${s}/claim`,accept:"application/json",json:e,body:JSON.stringify(o)}}function i_(t,e){let[r,...n]=t;if(r===void 0||r.startsWith("--"))return"usage: lmctl api issues claim-next <project> --assigned-run-id RUN";let s={};for(let o=0;o<n.length;o+=1){let i=n[o],a=n[++o];if(a===void 0||a.startsWith("--"))return`missing value for ${i}`;if(i==="--assigned-run-id"){let l=ne(a,"--assigned-run-id");if(typeof l=="string")return l;s.assigned_run_id=l}else return re(i)}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:e,body:JSON.stringify(s)}}function a_(t,e){let[r,...n]=t;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 o={};for(let i=0;i<n.length;i+=1){let a=n[i],l=n[++i];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--commit-hash")o.commit_hash=l;else if(a==="--closed-run-id"){let c=ne(l,"--closed-run-id");if(typeof c=="string")return c;o.closed_run_id=c}else return re(a)}return{method:"POST",path:`/api/issues/${s}/close`,accept:"application/json",json:e,body:JSON.stringify(o)}}function l_(t,e){let[r,...n]=t;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 o={};for(let i=0;i<n.length;i+=1){let a=n[i],l=n[++i];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;o.source_run_id=c}else return re(a)}return{method:"POST",path:`/api/issues/${s}/reopen`,accept:"application/json",json:e,body:JSON.stringify(o)}}function iA(t,e){let[r,...n]=t;if(r===void 0||r.startsWith("--"))return"usage: lmctl api upload <file> [--project NAME] [--json]";let s;for(let o=0;o<n.length;o+=1){let i=n[o];if(i!=="--project")return re(i);let a=n[++o];if(a===void 0||a.startsWith("--"))return"missing value for --project";s=a}return{method:"POST",path:"/api/uploads",accept:"application/json",json:e,upload:{filePath:r,project:s}}}function aA(t,e){let r,n,s,o;for(let a=0;a<t.length;a+=1){let l=t[a],c=t[++a];if(c===void 0||c.startsWith("--"))return`missing value for ${l}`;if(l==="--workflow")r=c;else if(l==="--workflow-id-override"){let u=Number(c);if(!Number.isInteger(u)||u<=0)return`invalid --workflow-id-override: ${c}`;n=u}else if(l==="--project")s=c;else if(l==="--inputs")try{let u=JSON.parse(c);if(u===null||typeof u!="object"||Array.isArray(u))return"--inputs must be a JSON object";o=u}catch{return"invalid --inputs JSON"}else return re(l)}if(r===void 0&&n===void 0)return"missing value for --workflow";if(o===void 0)return"missing value for --inputs";let i={source:"api-submit-job",payload:o};return r!==void 0&&(i.workflow=r),n!==void 0&&(i.workflow_id_override=n),s!==void 0&&(i.project=s),{method:"POST",path:"/api/jobs",accept:"application/json",json:e,body:JSON.stringify(i),runAfterSubmit:!0}}function Zc(t){try{return JSON.parse(t)}catch{return t}}function lA(t,e){let[r,n]=t;return r!=="show"||n===void 0||t.length!==2?"usage: lmctl api workflow show <name>":{method:"GET",path:`/api/workflows/${encodeURIComponent(n)}`,accept:"application/json",json:e}}function cA(t,e){for(let r of t)if(!(r==="--json"||r==="--text"))return re(r);return{method:"GET",path:"/api/workflows/verify",accept:e==="text"?"text/plain":"application/json",json:e!=="text"}}function uA(t,e){let[r,n,...s]=t;return r==="workflow"?dA([n,...s].filter(o=>o!==void 0),e):r!=="show"||n===void 0||t.length!==2?"usage: lmctl api project <show|workflow>":{method:"GET",path:`/api/projects/${encodeURIComponent(n)}`,accept:"application/json",json:e}}function dA(t,e){let[r,...n]=t;if(r==="list")return n.length!==1?"usage: lmctl api project workflow list <project>":{method:"GET",path:`/api/projects/${encodeURIComponent(n[0])}/workflows`,accept:e?"application/json":"text/html",json:e};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:e?"application/json":"text/html",json:e}}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 o=r==="remove"?"DELETE":"POST",i=r==="remove"?"":`/${r}`;return{method:o,path:`/api/projects/workflows/${s}${i}`,accept:"application/json",json:e}}if(r==="add"){let s=fA(n);return typeof s=="string"?s:{method:"POST",path:`/api/projects/${encodeURIComponent(s.project)}/workflows`,accept:"application/json",json:e,body:JSON.stringify(s.body)}}return"usage: lmctl api project workflow <add|list|show|remove|enable|disable>"}function fA(t){let[e,r,...n]=t;if(e===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 o=0;o<n.length;o+=1){let i=n[o],a=n[++o];if(a===void 0||a.startsWith("--"))return`missing value for ${i}`;if(i==="--condition")s.condition=a;else if(i==="--params")s.params=Zc(a);else if(i==="--priority"){let l=Number(a);if(!Number.isInteger(l))return`invalid --priority: ${a}`;s.priority=l}else return re(i)}return{project:e,body:s}}function mA(t,e){if(t[0]!=="get")return"usage: lmctl api artifact get --run R --kind K [--raw]";let r,n,s=!1;for(let i=1;i<t.length;i+=1){let a=t[i];if(a==="--raw"){s=!0;continue}let l=t[++i];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&&e}}function pA(t,e){if(t[0]!=="ack"||t.length!==2)return"usage: lmctl api attention ack <id>";let r=ne(t[1],"id");return typeof r=="string"?r:{method:"POST",path:`/api/attentions/${r}/ack`,accept:e?"application/json":"text/html",json:e}}function hA(t,e){return t.length!==1||t[0]!=="run-throughput"?"usage: lmctl api stats run-throughput":{method:"GET",path:"/api/stats/run-throughput",accept:e?"application/json":"text/html",json:e}}function _A(t,e){return t.length!==1||t[0]!=="state"&&t[0]!=="cycle"?"usage: lmctl api daemon <state|cycle>":{method:t[0]==="cycle"?"POST":"GET",path:t[0]==="cycle"?"/api/daemon/cycle":"/api/daemon/state",accept:e?"application/json":"text/html",json:e}}function gA(t,e){return t.length!==1||t[0]!=="state"&&t[0]!=="scan"?"usage: lmctl api intake <state|scan>":{method:t[0]==="scan"?"POST":"GET",path:t[0]==="scan"?"/api/intake/scan":"/api/intake/state",accept:e?"application/json":"text/html",json:e}}function yA(t,e){let r=t[0];if(r==="list")return t.length!==1?"usage: lmctl api session list":{method:"GET",path:"/api/sessions",accept:e?"application/json":"text/html",json:e};if(r==="history"||r==="compact"||r==="refresh"){if(t.length!==3)return`usage: lmctl api session ${r} <team_name> <alias>`;let n=Go(t[1]),s=encodeURIComponent(t[2]);return{method:r==="history"?"GET":"POST",path:`/api/sessions/${n}/${s}/${r}`,accept:e?"application/json":"text/html",json:e}}return"usage: lmctl api session <list|history|compact|refresh>"}function wA(t,e){let[r,n,s,o]=t;if(r!==void 0&&/^\d+$/.test(r)&&n===void 0){let i=ne(r,"run_id");return typeof i=="string"?i:{method:"GET",path:`/api/runs/${i}`,accept:"application/json",json:e!=="text"}}if(r==="resume"){if(n===void 0)return"usage: lmctl api run resume <run_id> --outcome <value>";let i=ne(n,"run_id");if(typeof i=="string")return i;let a;for(let l=2;l<t.length;l+=1){let c=t[l];if(c!=="--outcome")return re(c);let u=t[++l];if(u===void 0||u.startsWith("--"))return"missing value for --outcome";a=u}return a===void 0?"missing value for --outcome":{method:"POST",path:`/api/runs/${i}/resume?outcome=${encodeURIComponent(a)}`,accept:e==="text"?"text/html":"application/json",json:e!=="text"}}if(r==="get"){if(n===void 0||s!==void 0)return"usage: lmctl api run get <run_id>";let i=ne(n,"run_id");return typeof i=="string"?i:{method:"GET",path:`/api/runs/${i}`,accept:"application/json",json:e!=="text"}}if(r==="step"||r==="transcript"||r==="messages"){if(n===void 0||s===void 0||o!==void 0)return`usage: lmctl api run ${r} <run_id> <step_id>`;let i=ne(n,"run_id");if(typeof i=="string")return i;let a=ne(s,"step_id");if(typeof a=="string")return a;let l=r==="step"?"":`/${r}`,c=r==="transcript"&&e==="text";return{method:"GET",path:`/api/runs/${i}/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 i=ne(n,"run_id");if(typeof i=="string")return i;let a;for(let c=2;c<t.length;c+=1){let u=t[c];if(u!=="--kind")return re(u);let d=t[++c];if(d===void 0)return"missing value for --kind";a=d}let l=a===void 0?"":`?kind=${encodeURIComponent(a)}`;return{method:"GET",path:`/api/runs/${i}/artifacts${l}`,accept:"application/json",json:e!=="text"}}if(r==="where"){if(n===void 0||s!==void 0)return"usage: lmctl api run where <run_id>";let i=ne(n,"run_id");return typeof i=="string"?i:{method:"GET",path:`/api/runs/${i}/where`,accept:e==="text"?"text/plain":"application/json",json:e!=="text"}}if(r==="timeline"){if(n===void 0||s!==void 0)return"usage: lmctl api run timeline <run_id>";let i=ne(n,"run_id");return typeof i=="string"?i:{method:"GET",path:`/api/runs/${i}/timeline`,accept:e==="text"?"text/plain":"application/json",json:e!=="text"}}return"usage: lmctl api run <id|get|step|transcript|messages|resume|artifacts|where|timeline>"}function ne(t,e){return t===void 0||t.startsWith("--")?`missing value for ${e}`:!/^\d+$/.test(t)||Number(t)<=0?`invalid ${e}: ${t}`:Number(t)}function re(t){return t.startsWith("--")?`unknown flag: ${t}`:`unknown argument: ${t}`}function c_(t,e){let r=[],n=!1;for(let s of t){if(s===e){n=!0;continue}r.push(s)}return{rest:r,present:n}}async function EA(t,e){let r=n_(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
1567
1567
  `),2;let n=r.args,s=r.format!=="text",[o,...i]=n;if(o===void 0)return e.stderr.write(`error: --direct requires a subcommand (issues|status|projects|workflows|runs|attentions)
1568
1568
  `),2;let a=e.dal===void 0,l=e.dal??_e({path:de()});try{if(o==="issues"){let[c,...u]=i;return c===void 0?(e.stderr.write(`error: --direct issues requires a subcommand (list|show|create|claim|claim-next|close|reopen)
1569
1569
  `),2):c==="create"?TA(l,u,e,s):c==="claim"?bA(l,u,e,s):c==="claim-next"?SA(l,u,e,s):c==="close"?kA(l,u,e,s):c==="reopen"?vA(l,u,e,s):c==="list"?AA(l,u,e,s):c==="show"?RA(l,u,e,s):(e.stderr.write(`error: --direct does not support: issues ${c} (supported: list, show, create, claim, claim-next, close, reopen)
1570
- `),2)}return o==="status"?$A(l,i,e,s):o==="projects"?jA(l,i,e,s):o==="workflows"?LA(l,i,e,s):o==="runs"?OA(l,i,e,s):o==="attentions"||o==="attention"?UA(l,i,e,s):o==="escalations"?u_(l,i,e):(e.stderr.write(`error: --direct is not supported for: ${o} (supported: issues, status, projects, workflows, runs, attentions, escalations, run where, run timeline)
1570
+ `),2)}return o==="status"?$A(l,i,e,s):o==="projects"?LA(l,i,e,s):o==="workflows"?jA(l,i,e,s):o==="runs"?OA(l,i,e,s):o==="attentions"||o==="attention"?UA(l,i,e,s):o==="escalations"?u_(l,i,e):(e.stderr.write(`error: --direct is not supported for: ${o} (supported: issues, status, projects, workflows, runs, attentions, escalations, run where, run timeline)
1571
1571
  `),2)}catch(c){return e.stderr.write(`error: ${c instanceof Error?c.message:String(c)}
1572
1572
  `),1}finally{a&&l.close()}}function Ke(t,e,r){t.stdout.write(`${r?JSON.stringify(e,null,2):JSON.stringify(e)}
1573
1573
  `)}function TA(t,e,r,n){let s=s_(e,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
@@ -1595,8 +1595,8 @@ ${r}`:r}function Up(t,e){let r=X0[e.tool];return r?new Promise((n,s)=>{let o=e.b
1595
1595
  `),2;let s=ne(e[0],"id");if(typeof s=="string")return r.stderr.write(`error: ${s}
1596
1596
  `),2;let o=t.getIssue(s);return o===null?(r.stderr.write(`error: issue not found: ${s}
1597
1597
  `),1):(Ke(r,o,n),0)}function $A(t,e,r,n){return e.length>0?(r.stderr.write(`error: ${re(e[0])}
1598
- `),2):(Ke(r,Zo(t),n),0)}function jA(t,e,r,n){return e.length>0?(r.stderr.write(`error: ${re(e[0])}
1599
- `),2):(Ke(r,Qo(t),n),0)}function LA(t,e,r,n){return e.length>0?(r.stderr.write(`error: ${re(e[0])}
1598
+ `),2):(Ke(r,Zo(t),n),0)}function LA(t,e,r,n){return e.length>0?(r.stderr.write(`error: ${re(e[0])}
1599
+ `),2):(Ke(r,Qo(t),n),0)}function jA(t,e,r,n){return e.length>0?(r.stderr.write(`error: ${re(e[0])}
1600
1600
  `),2):(Ke(r,ei(t),n),0)}function OA(t,e,r,n){let s;for(let o=0;o<e.length;o+=1){let i=e[o],a=e[++o];if(a===void 0||a.startsWith("--"))return r.stderr.write(`error: missing value for ${i}
1601
1601
  `),2;if(i==="--limit"){if(!/^\d+$/.test(a)||Number(a)<=0)return r.stderr.write(`error: invalid --limit: ${a}
1602
1602
  `),2;s=Number(a)}else return r.stderr.write(`error: ${re(i)}
@@ -1608,7 +1608,7 @@ ${r}`:r}function Up(t,e){let r=X0[e.tool];return r?new Promise((n,s)=>{let o=e.b
1608
1608
  `):e.stdout.write(ni(a)),0)}finally{o&&i.close()}}async function MA(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`error: usage: lmctl api run where <run_id> [--json]
1609
1609
  `),2;if(!/^\d+$/.test(r)||Number(r)<=0)return e.stderr.write(`error: invalid run_id: ${r}
1610
1610
  `),2;let s=!1;for(let c of n){if(c==="--json"){s=!0;continue}if(c!=="--text")return e.stderr.write(`error: ${re(c)}
1611
- `),2}let o=jr(e),a=cr(s?"application/json":"text/plain",o.token),l;try{l=await fetch(new URL(`/api/runs/${r}/where`,o.baseUrl),{method:"GET",headers:a})}catch(c){return e.stderr.write(`error: network failure: ${c instanceof Error?c.message:String(c)}
1611
+ `),2}let o=Lr(e),a=cr(s?"application/json":"text/plain",o.token),l;try{l=await fetch(new URL(`/api/runs/${r}/where`,o.baseUrl),{method:"GET",headers:a})}catch(c){return e.stderr.write(`error: network failure: ${c instanceof Error?c.message:String(c)}
1612
1612
  `),2}return l.ok?(s?e.stdout.write(`${JSON.stringify(await l.json(),null,2)}
1613
1613
  `):(e.stdout.write(await l.text()),l.headers.get("content-type")?.includes("text/plain")||e.stdout.write(`
1614
1614
  `)),0):(e.stderr.write(`error: HTTP ${l.status}: ${await l.text()}
@@ -1620,12 +1620,12 @@ ${r}`:r}function Up(t,e){let r=X0[e.tool];return r?new Promise((n,s)=>{let o=e.b
1620
1620
  `):e.stdout.write(oi(a)),0)}finally{o&&i.close()}}async function PA(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`error: usage: lmctl api run timeline <run_id> [--json]
1621
1621
  `),2;if(!/^\d+$/.test(r)||Number(r)<=0)return e.stderr.write(`error: invalid run_id: ${r}
1622
1622
  `),2;let s=!1;for(let c of n){if(c==="--json"){s=!0;continue}if(c!=="--text")return e.stderr.write(`error: ${re(c)}
1623
- `),2}let o=jr(e),a=cr(s?"application/json":"text/plain",o.token),l;try{l=await fetch(new URL(`/api/runs/${r}/timeline`,o.baseUrl),{method:"GET",headers:a})}catch(c){return e.stderr.write(`error: network failure: ${c instanceof Error?c.message:String(c)}
1623
+ `),2}let o=Lr(e),a=cr(s?"application/json":"text/plain",o.token),l;try{l=await fetch(new URL(`/api/runs/${r}/timeline`,o.baseUrl),{method:"GET",headers:a})}catch(c){return e.stderr.write(`error: network failure: ${c instanceof Error?c.message:String(c)}
1624
1624
  `),2}return l.ok?(s?e.stdout.write(`${JSON.stringify(await l.json(),null,2)}
1625
1625
  `):(e.stdout.write(await l.text()),l.headers.get("content-type")?.includes("text/plain")||e.stdout.write(`
1626
1626
  `)),0):(e.stderr.write(`error: HTTP ${l.status}: ${await l.text()}
1627
1627
  `),l.status===404?1:l.status===400?2:1)}async function FA(t,e){let r=!1;for(let a of t){if(a==="--json"){r=!0;continue}if(a!=="--text")return e.stderr.write(`error: ${re(a)}
1628
- `),2}let n=jr(e),o=cr(r?"application/json":"text/plain",n.token),i;try{i=await fetch(new URL("/api/workflows/verify",n.baseUrl),{method:"GET",headers:o})}catch(a){return e.stderr.write(`error: network failure: ${a instanceof Error?a.message:String(a)}
1628
+ `),2}let n=Lr(e),o=cr(r?"application/json":"text/plain",n.token),i;try{i=await fetch(new URL("/api/workflows/verify",n.baseUrl),{method:"GET",headers:o})}catch(a){return e.stderr.write(`error: network failure: ${a instanceof Error?a.message:String(a)}
1629
1629
  `),2}return i.ok?(r?e.stdout.write(`${JSON.stringify(await i.json(),null,2)}
1630
1630
  `):(e.stdout.write(await i.text()),i.headers.get("content-type")?.includes("text/plain")||e.stdout.write(`
1631
1631
  `)),0):(e.stderr.write(`error: HTTP ${i.status}: ${await i.text()}
@@ -1680,7 +1680,7 @@ without an HTTP round trip.
1680
1680
 
1681
1681
  Verify every workflows/*.compound.json file: load/validate the workflow graph
1682
1682
  and report the first step that would be started. Default output is the TTY
1683
- table; --json emits the structured WorkflowVerifyReport payload.`;xA=["open","assigned","closed","reopened"]});import{existsSync as f_,mkdirSync as BA,readdirSync as HA,readFileSync as m_,writeFileSync as qA}from"node:fs";import{join as on}from"node:path";import{fileURLToPath as JA}from"node:url";function _s(t){try{return XA.some(e=>f_(on(t,e)))}catch{return!1}}function GA(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(e===null)return null;let r=e[1],n=e[2].trimStart(),s=r.match(/^name:\s*(.+)$/m),o=r.match(/^type:\s*(.+)$/m),i=r.match(/^description:\s*(.+)$/m),a=s?.[1]?.trim(),l=o?.[1]?.trim();return!a||!l?null:{name:a,type:l,description:i?.[1]?.trim()??null,body:n}}function ui(t,e){t.durable_memory_mode!=="db"?KA(t):VA(t,e)}function p_(t){let e=_s(t),r;try{r=HA(eu).filter(n=>n.endsWith(".template")).sort()}catch{return[]}return r.filter(n=>n==="skills_lmprobe.md.template"||n==="skills_lmdebug.md.template"?e:!0)}function KA(t){let e=t.local_path;if(!e){console.warn("[bootstrap] skipping: project has no local_path");return}let r=on(e,"durable-memory");try{BA(r,{recursive:!0})}catch(o){console.error("[bootstrap] failed to create durable-memory directory:",o);return}let n=p_(e),s=[];for(let o of n){let i=o.replace(/\.template$/,""),a=on(r,i);if(!f_(a))try{let l=m_(on(eu,o),"utf8");qA(a,l,"utf8"),s.push(i)}catch(l){console.error(`[bootstrap] failed to copy ${o}:`,l)}}s.length>0&&console.log(`[bootstrap] filled durable-memory stubs at ${r}: ${s.join(", ")}`)}function VA(t,e){let r=t.local_path??"",n=p_(r),s=[];for(let o of n){let i=on(eu,o),a;try{a=m_(i,"utf8")}catch(c){console.error(`[bootstrap] failed to read ${o}:`,c);continue}let l=GA(a);if(l===null){console.error(`[bootstrap] failed to parse frontmatter in ${o}`);continue}if(e.getDurableMemoryByName(t.id,l.name)===null)try{e.upsertDurableMemory({project_id:t.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 ${t.name}: ${s.join(", ")}`)}var eu,XA,gs=T(()=>{"use strict";eu=on(JA(import.meta.url),"../../config/durable_memory_templates"),XA=[".git","package.json","Cargo.toml","pyproject.toml","go.mod","Gemfile","pom.xml","build.gradle","composer.json","Pipfile"]});import{existsSync as YA,mkdirSync as zA,readdirSync as ZA,readFileSync as QA,writeFileSync as eR}from"node:fs";import{join as di}from"node:path";import{fileURLToPath as tR}from"node:url";function fi(t){let e=t.local_path;if(!e){console.warn("[bootstrap] skipping ai-test: project has no local_path");return}if(!_s(e))return;let r=di(e,"ai-test");try{zA(r,{recursive:!0})}catch(s){console.error("[bootstrap] failed to create ai-test directory:",s);return}let n=[];for(let s of rR()){let o=s.replace(/\.template$/,""),i=di(r,o);if(!YA(i))try{eR(i,nR(s),"utf8"),n.push(o)}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 rR(){try{return ZA(h_).filter(t=>t.endsWith(".template")).sort()}catch{return["example-test.md.template","index.md.template"]}}function nR(t){try{return QA(di(h_,t),"utf8")}catch{return sR(t)}}function sR(t){let e=t.replace(/\.template$/,"");return e==="index.md"?`# AI Test Suite - index
1683
+ table; --json emits the structured WorkflowVerifyReport payload.`;xA=["open","assigned","closed","reopened"]});import{existsSync as f_,mkdirSync as BA,readdirSync as HA,readFileSync as m_,writeFileSync as qA}from"node:fs";import{join as on}from"node:path";import{fileURLToPath as JA}from"node:url";function gs(t){try{return XA.some(e=>f_(on(t,e)))}catch{return!1}}function GA(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(e===null)return null;let r=e[1],n=e[2].trimStart(),s=r.match(/^name:\s*(.+)$/m),o=r.match(/^type:\s*(.+)$/m),i=r.match(/^description:\s*(.+)$/m),a=s?.[1]?.trim(),l=o?.[1]?.trim();return!a||!l?null:{name:a,type:l,description:i?.[1]?.trim()??null,body:n}}function ui(t,e){t.durable_memory_mode!=="db"?KA(t):VA(t,e)}function p_(t){let e=gs(t),r;try{r=HA(eu).filter(n=>n.endsWith(".template")).sort()}catch{return[]}return r.filter(n=>n==="skills_lmprobe.md.template"||n==="skills_lmdebug.md.template"?e:!0)}function KA(t){let e=t.local_path;if(!e){console.warn("[bootstrap] skipping: project has no local_path");return}let r=on(e,"durable-memory");try{BA(r,{recursive:!0})}catch(o){console.error("[bootstrap] failed to create durable-memory directory:",o);return}let n=p_(e),s=[];for(let o of n){let i=o.replace(/\.template$/,""),a=on(r,i);if(!f_(a))try{let l=m_(on(eu,o),"utf8");qA(a,l,"utf8"),s.push(i)}catch(l){console.error(`[bootstrap] failed to copy ${o}:`,l)}}s.length>0&&console.log(`[bootstrap] filled durable-memory stubs at ${r}: ${s.join(", ")}`)}function VA(t,e){let r=t.local_path??"",n=p_(r),s=[];for(let o of n){let i=on(eu,o),a;try{a=m_(i,"utf8")}catch(c){console.error(`[bootstrap] failed to read ${o}:`,c);continue}let l=GA(a);if(l===null){console.error(`[bootstrap] failed to parse frontmatter in ${o}`);continue}if(e.getDurableMemoryByName(t.id,l.name)===null)try{e.upsertDurableMemory({project_id:t.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 ${t.name}: ${s.join(", ")}`)}var eu,XA,ys=T(()=>{"use strict";eu=on(JA(import.meta.url),"../../config/durable_memory_templates"),XA=[".git","package.json","Cargo.toml","pyproject.toml","go.mod","Gemfile","pom.xml","build.gradle","composer.json","Pipfile"]});import{existsSync as YA,mkdirSync as zA,readdirSync as ZA,readFileSync as QA,writeFileSync as eR}from"node:fs";import{join as di}from"node:path";import{fileURLToPath as tR}from"node:url";function fi(t){let e=t.local_path;if(!e){console.warn("[bootstrap] skipping ai-test: project has no local_path");return}if(!gs(e))return;let r=di(e,"ai-test");try{zA(r,{recursive:!0})}catch(s){console.error("[bootstrap] failed to create ai-test directory:",s);return}let n=[];for(let s of rR()){let o=s.replace(/\.template$/,""),i=di(r,o);if(!YA(i))try{eR(i,nR(s),"utf8"),n.push(o)}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 rR(){try{return ZA(h_).filter(t=>t.endsWith(".template")).sort()}catch{return["example-test.md.template","index.md.template"]}}function nR(t){try{return QA(di(h_,t),"utf8")}catch{return sR(t)}}function sR(t){let e=t.replace(/\.template$/,"");return e==="index.md"?`# AI Test Suite - index
1684
1684
 
1685
1685
  Add test chapters in this directory.
1686
1686
  `:`---
@@ -1702,7 +1702,7 @@ last_run_id: 0
1702
1702
  ## Expected
1703
1703
 
1704
1704
  ## Cleanup
1705
- `}var h_,tu=T(()=>{"use strict";gs();h_=di(tR(import.meta.url),"../../config/ai_test_templates")});var an,ru=T(()=>{"use strict";an=`---
1705
+ `}var h_,tu=T(()=>{"use strict";ys();h_=di(tR(import.meta.url),"../../config/ai_test_templates")});var an,ru=T(()=>{"use strict";an=`---
1706
1706
 
1707
1707
  # Durable memory \u2014 how to use it
1708
1708
 
@@ -1713,15 +1713,15 @@ ON EVERY NEW TASK:
1713
1713
  2. Pull only the chapters relevant to your current task. Don't load everything.
1714
1714
  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.
1715
1715
 
1716
- Don't dump all of durable-memory into your context. The pattern is index-first, chapter-on-demand.`});function mi(t){return oR.has(t)}function su(){return nu===null&&(nu=Tt(St())),nu}function ou(t,e,r={}){if(!mi(t))return null;try{let n=su().getAdapter?.(t);if(n===void 0)return null;let s=n.resumeCommand(e).trim();if(s.length===0)return null;let o=s.split(/\s+/),i=t==="codex"&&r.isLead===!0?Io({warn:()=>{}}):[];return[...o,...i,...__[t]??[]]}catch{return null}}function ln(t,e){let r=ou(t,e);return r===null?null:r.join(" ")}function Ht(t,e){return su().getSession(t,e)}async function pi(t){return(await su().resolveSessions(t)).map(r=>r.provider.name)}var __,oR,g_,nu,Lr=T(()=>{"use strict";kt();ql();__={claude:["--dangerously-skip-permissions"],codex:["--dangerously-bypass-approvals-and-sandbox"],gemini:["-y"],copilot:["--yolo"],opencode:[],qwen:["--approval-mode","yolo"],agy:[],lmplayer:[]},oR=new Set(Object.keys(__)),g_=/^[\w.:-]+$/;nu=null});import{createHash as iR}from"node:crypto";import{existsSync as ys,mkdirSync as w_,readFileSync as ws,readdirSync as aR,renameSync as lR,statSync as cR,unlinkSync as uR,writeFileSync as hi}from"node:fs";import{homedir as dR}from"node:os";import{dirname as iu,isAbsolute as y_,join as Qe,relative as fR,resolve as cn}from"node:path";import{fileURLToPath as mR}from"node:url";function T_(t){let e=cn(t);for(;;){let r=Qe(e,au);try{if(cR(r).isDirectory())return r}catch{}let n=iu(e);if(n===e)return null;e=n}}function gi(t=process.cwd()){let e=process.env.LMCTL_HOME;if(e!==void 0&&e.trim().length>0)return cn(e);let r=T_(t);return r!==null?r:Qe(E_(),au)}function b_(t){return Qe(gi(t),"templates","workflows")}function S_(){return cn(iu(mR(import.meta.url)),"..","..","workflows")}function pR(t){let e=Qe(t,k_);try{let r=JSON.parse(ws(e,"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 hR(t,e){w_(t,{recursive:!0});let r=Qe(t,k_),n=`${r}.tmp-${process.pid}`;hi(n,`${JSON.stringify(e,null,2)}
1717
- `,"utf8"),lR(n,r)}function _R(t){if(typeof t=="object"&&t!==null&&"code"in t){let e=t.code;if(typeof e=="string")return e}}function gR(t,e,r,n,s){let o=`${e}.dist-${r}`;for(let i=0;i<1e3;i+=1){let a=i===0?o:`${o}-${i}`,l=Qe(t,a);try{return hi(l,n,{flag:"wx"}),a}catch(c){if(_R(c)!=="EEXIST")throw c;if(_i(ws(l))===s)return a}}throw new Error(`could not find available dist shadow path for ${e}`)}function yR(t,e){if(y_(e)||iu(e)!=="workflows")return null;let r=e.slice(10);if(r.length===0||r.includes("/")||r.includes("\\")||r.includes(".."))return null;let n=cn(t,"templates","workflows"),s=cn(t,"templates",e),o=fR(n,s);return o.length===0||o.startsWith("..")||y_(o)||o.includes("/")||o.includes("\\")?null:s}function wR(t,e,r){for(let[n,s]of Object.entries(e.files)){if(r.has(n))continue;let o=yR(t,n);if(o===null){delete e.files[n];continue}if(!ys(o)){delete e.files[n];continue}try{if(_i(ws(o))!==s)continue;uR(o),delete e.files[n]}catch{}}}function yi(t={}){let e=gi(t.cwd),r=Qe(e,"templates","workflows"),n=S_(),s={basedir:e,copied:[],refreshed:[],preserved:[],shadowed:[]};try{let o=ys(n)?aR(n).filter(c=>c.endsWith(".compound.json")||c.endsWith(".lmctl")||c==="index.jsonl"):[];if(o.length===0)return s;w_(r,{recursive:!0});let i=pR(e),a=wt(),l=new Set(o.map(c=>`workflows/${c}`));for(let c of o){let u=`workflows/${c}`,d=ws(Qe(n,c)),f=_i(d),m=Qe(r,c);if(!ys(m)){try{hi(m,d,{flag:"wx"}),s.copied.push(c)}catch{}i.files[u]=f;continue}let p=_i(ws(m));if(p===f){i.files[u]=f;continue}let h=i.files[u];if(h!==void 0&&p===h)hi(m,d),i.files[u]=f,s.refreshed.push(c);else{let g=gR(r,c,a,d,f);s.preserved.push(c),s.shadowed.push(g)}}wR(e,i,l),hR(e,{version:a,files:i.files})}catch(o){if(t.swallow!==!0)throw o}return s}function lu(t){let e=[],r=process.env.LMCTL_HOME;r!==void 0&&r.trim().length>0&&e.push(cn(r));let n=T_(t??process.cwd());return n!==null&&e.push(n),e.push(Qe(E_(),au)),e}function wi(t,e){let r=lu(e),n=[`${t}.compound.json`,`${t}.lmctl`];for(let s of r)for(let o of n){let i=Qe(s,"templates","workflows",o);if(ys(i))return i}for(let s of n){let o=Qe(S_(),s);if(ys(o))return o}return null}var au,E_,_i,k_,Ei=T(()=>{"use strict";Xn();au=".lmctl",E_=()=>process.env.HOME??dR(),_i=t=>iR("sha256").update(t).digest("hex");k_=".dist-manifest.json"});import{createHash as ER}from"node:crypto";import{existsSync as TR,mkdirSync as bR,writeFileSync as SR}from"node:fs";import{dirname as kR,join as un}from"node:path";function ur(t){return typeof t=="string"&&t.startsWith(v_)}function RR(t){if(!ur(t))throw new ft(`not an lmctl:// URI: ${t}`,"malformed");let e=t.slice(v_.length),r=e.indexOf("/");if(r<=0)throw new ft(`malformed lmctl:// URI (expected lmctl://<workflow|mcp|skill>/<name>): ${t}`,"malformed");let n=e.slice(0,r);if(!xR.has(n))throw new ft(`unknown lmctl:// kind '${n}' (expected workflow|mcp|skill): ${t}`,"malformed");let s=e.slice(r+1),o,i=s.indexOf("@");i>=0&&(o=s.slice(i+1).trim(),s=s.slice(0,i));let a=s.trim();if(a.length===0)throw new ft(`empty name in lmctl:// URI: ${t}`,"malformed");if(/[\\/]|\.\./.test(a))throw new ft(`invalid name in lmctl:// URI (no path separators): ${t}`,"malformed");return{kind:n,name:a,...o!==void 0&&o.length>0?{ref:o}:{}}}function $R(t,e,r){if(t==="workflow")return wi(e,r);let n=t==="mcp"?un("templates","mcp",`${e}.json`):un("templates","skills",e,"SKILL.md");for(let s of lu(r)){let o=un(s,n);if(TR(o))return o}return null}function jR(t,e,r){let n=un(gi(r),IR,t);return t==="skill"?un(n,e,"SKILL.md"):un(n,`${e}${t==="workflow"?".compound.json":".json"}`)}function LR(t,e){if(e.trim().length===0)return!1;if(t==="skill")return!0;let r=e.trim();if(t==="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 Es(t,e){let{kind:r,name:n,ref:s}=RR(t),o=$R(r,n,e);if(o!==null)return o;let i=`${vR}${r}/${n}`,a;try{a=await fetch(i,{signal:AbortSignal.timeout(NR)})}catch(u){throw new ft(`lmctl:// '${t}' not found locally or at the remote catalog ${i} (${u instanceof Error?u.message:String(u)}). Failing closed.`,"missing")}if(!a.ok)throw new ft(`lmctl:// '${t}' not found locally or at the remote catalog ${i} (HTTP ${a.status}). Failing closed.`,"missing");let l=await a.text();if(s!==void 0){let u=AR.exec(s);if(u!==null){let d=ER("sha256").update(l).digest("hex");if(d.toLowerCase()!==u[1].toLowerCase())throw new ft(`lmctl:// '${t}' remote artifact FAILED integrity pin (expected sha256 ${u[1]}, got ${d}) \u2014 discarded, NOT cached.`,"validation-failure")}}if(!LR(r,l))throw new ft(`lmctl:// '${t}' remote artifact failed shape validation for ${r} \u2014 discarded, NOT cached.`,"validation-failure");let c=jR(r,n,e);return bR(kR(c),{recursive:!0}),SR(c,l,"utf8"),c}var v_,vR,IR,NR,xR,ft,AR,cu=T(()=>{"use strict";Ei();v_="lmctl://",vR="https://lmctl.com/templates/",IR=".cache",NR=8e3,xR=new Set(["workflow","mcp","skill"]),ft=class extends Error{reason;constructor(e,r="malformed"){super(e),this.reason=r,this.name="LmctlUriError"}},AR=/^(?:sha256[:-])?([0-9a-f]{64})$/i});import{existsSync as OR,mkdirSync as CR,readFileSync as MR,renameSync as DR,unlinkSync as PR,writeFileSync as FR}from"node:fs";import{homedir as N_}from"node:os";import{dirname as Ts,join as mt,resolve as UR}from"node:path";function mn(t,e,r){let n=Ts(UR(r)),s=new Set,o=new Map;for(let i of e.members){if(s.add(i.provider),i.teamfile!==void 0)continue;let a=i.sessiondir??n,l=o.get(a)??new Set;l.add(i.provider),o.set(a,l)}for(let[i,a]of o.entries())dr(mt(i,".mcp.json"),"mcpServers",[dn(),fn()]),a.has("opencode")&&dr(mt(i,".opencode","opencode.json"),"mcp",[$_(),j_()]);for(let i of s)HR(i)}function uu(t=x_??N_()){return mt(t,".copilot","mcp-config.json")}function A_(t,e){let r={};if(He.existsSync(t)){let o=JSON.parse(He.readFileSync(t,"utf8"));if(!It(o))throw new Error(`${t} is not a JSON object`);r=o}let n=It(r.mcpServers)?{...r.mcpServers}:{},s=!1;for(let[o,i]of Object.entries(e)){let a=It(n[o])?n[o]:void 0;t$(a,i)||(n[o]=i,s=!0)}return s?(r.mcpServers=n,R_(t,r),{changed:!0}):{changed:!1}}function R_(t,e){He.mkdirSync(Ts(t),{recursive:!0});let r=mt(Ts(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{He.writeFileSync(r,`${JSON.stringify(e,null,2)}
1718
- `,"utf8"),He.renameSync(r,t)}catch(n){try{He.unlinkSync(r)}catch{}throw n}}function BR(t,e){He.mkdirSync(Ts(t),{recursive:!0});let r=mt(Ts(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{He.writeFileSync(r,e,"utf8"),He.renameSync(r,t)}catch(n){try{He.unlinkSync(r)}catch{}throw n}}function dr(t,e,r){try{if(!He.existsSync(t))return;let n=JSON.parse(He.readFileSync(t,"utf8"));if(!It(n)||!It(n[e]))return;let s={...n[e]},o=[];for(let{name:i,shouldRemove:a}of r)Object.prototype.hasOwnProperty.call(s,i)&&a(s[i])&&(delete s[i],o.push(i));if(o.length===0)return;n[e]=s,R_(t,n),Y({event:"mcp_cleanup",path:t,removed:o})}catch{}}function dn(){return{name:bi,shouldRemove:zR}}function $_(){return{name:bi,shouldRemove:ZR}}function fn(){return{name:Ti,shouldRemove:VR}}function j_(){return{name:Ti,shouldRemove:YR}}function HR(t){let e=x_??N_();switch(t){case"copilot":dr(uu(e),"mcpServers",[dn(),fn()]);return;case"claude":dr(mt(e,".claude.json"),"mcpServers",[dn(),fn()]);return;case"gemini":dr(mt(e,".gemini","settings.json"),"mcpServers",[dn(),fn()]);return;case"qwen":dr(mt(e,".qwen","settings.json"),"mcpServers",[dn(),fn()]);return;case"agy":dr(mt(e,".gemini","antigravity-cli","settings.json"),"mcpServers",[dn(),fn()]);return;case"opencode":dr(mt(e,".config","opencode","opencode.json"),"mcp",[$_(),j_()]);return;case"codex":qR(mt(e,".codex","config.toml"));return;default:return}}function qR(t){try{if(!He.existsSync(t))return;let e=He.readFileSync(t,"utf8"),r=JR(e);if(r===null)return;let n=e.split(/\n/),s=[],o=new Set,i=!1,a;for(let l of n){let c=L_(l);if(c===null)return;if(c!==void 0){if(I_(c,r)){i=!0,a=c[1],o.add(a);continue}i=!1,a=void 0,s.push(l);continue}if(i){if(/^\s*(?:#.*)?$/.test(l)){s.push(l);continue}a!==void 0&&o.add(a);continue}let u=GR(l);if(u===null)return;if(u!==void 0&&I_(u,r)){o.add(u[1]);continue}s.push(l)}if(o.size===0)return;BR(t,s.join(`
1719
- `)),Y({event:"mcp_cleanup",path:t,removed:[...o]})}catch{}}function I_(t,e){return t.length<2||t[0]!=="mcp_servers"?!1:e.has(t[1])}function JR(t){let e=new Map,r;for(let s of t.split(/\n/)){let o=L_(s);if(o===null)return null;if(o!==void 0){r=o;continue}let i=s.indexOf("=");if(i<0)continue;let a=s.slice(0,i).trim(),l=s.slice(i+1).trim(),c=XR(a,r);if(c===null)return null;if(c===void 0||c.length!==3||c[0]!=="mcp_servers"||c[1]!==Ti&&c[1]!==bi)continue;let u=e.get(c[1])??{};if(c[2]==="command"){let d=O_(l);if(d===null)return null;u.command=d}else if(c[2]==="args"){let d=KR(l);if(d===null)return null;u.args=d}e.set(c[1],u)}let n=new Set;for(let[s,o]of e.entries())s===Ti&&M_(o.command,o.args)&&n.add(s),s===bi&&D_(o.command,o.args)&&n.add(s);return n}function XR(t,e){if(t.startsWith("mcp_servers"))return Si(t);if(e===void 0||e.length<2||e[0]!=="mcp_servers")return;let r=Si(t);return r===null?null:[...e,...r]}function L_(t){if(!/^\s*\[/.test(t))return;let e=/^\s*\[([^\]\r\n]+)\]\s*(?:#.*)?$/.exec(t);return e===null?null:Si(e[1])}function GR(t){let e=t.indexOf("=");if(e<0)return;let r=t.slice(0,e).trim();if(!(r.length===0||!r.startsWith("mcp_servers")))return Si(r)}function Si(t){let e=[],r=0,n=()=>{for(;r<t.length&&/\s/.test(t[r]);)r+=1};for(;r<t.length;){if(n(),r>=t.length)return null;if(t[r]==='"'){r+=1;let s="",o=!1;for(;r<t.length;){let i=t[r];if(i==="\\"){if(r+1>=t.length)return null;s+=t[r+1],r+=2;continue}if(i==='"'){r+=1,o=!0;break}s+=i,r+=1}if(!o)return null;e.push(s)}else{let s=r;for(;r<t.length&&/[A-Za-z0-9_-]/.test(t[r]);)r+=1;if(r===s)return null;e.push(t.slice(s,r))}if(n(),r>=t.length)break;if(t[r]!==".")return null;r+=1}return e.length>0?e:null}function O_(t){let e=C_(t).trim();if(e.startsWith('"'))try{let r=JSON.parse(e);return typeof r=="string"?r:null}catch{return null}return e.startsWith("'")&&e.endsWith("'")&&e.length>=2?e.slice(1,-1):null}function KR(t){let e=C_(t).trim();if(!e.startsWith("[")||!e.endsWith("]"))return null;let r=e.slice(1,-1).trim();if(r.length===0)return[];let n=r.split(",").map(s=>O_(s.trim()));return n.some(s=>s===null)?null:n}function C_(t){let e;for(let r=0;r<t.length;r+=1){let n=t[r];if(e!==void 0){if(e==='"'&&n==="\\"){r+=1;continue}n===e&&(e=void 0);continue}if(n==='"'||n==="'"){e=n;continue}if(n==="#")return t.slice(0,r)}return t}function VR(t){return It(t)?t.type==="stdio"&&typeof t.command=="string"&&M_(t.command,t.args):!1}function YR(t){return!It(t)||!Array.isArray(t.command)?!1:t.command.length===2&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&F_(t.command[0])&&t.command[1]==="mcp"||t.command.length===3&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&typeof t.command[2]=="string"&&P_(t.command[0],[t.command[1],t.command[2]])}function zR(t){return It(t)?t.type==="stdio"&&D_(t.command,t.args):!1}function ZR(t){return!It(t)||!Array.isArray(t.command)?!1:t.command.length===2&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&U_(t.command[0])&&t.command[1]==="mcp"}function M_(t,e){return F_(t)&&W_(e)||P_(t,e)}function D_(t,e){return U_(t)&&W_(e)}function P_(t,e){return QR(t)&&Array.isArray(e)&&e.length===2&&e$(e[0])&&e[1]==="mcp"}function F_(t){return typeof t=="string"&&du(t)==="lmctl"}function U_(t){return typeof t=="string"&&du(t)==="lmctl0"}function QR(t){if(typeof t!="string")return!1;let e=du(t).toLowerCase();return e==="node"||e==="node.exe"}function e$(t){if(typeof t!="string")return!1;let e=t.replace(/\\/g,"/");return e==="lmctl-cli/dist/index.js"||e.endsWith("/lmctl-cli/dist/index.js")}function du(t){let e=t.replace(/\\/g,"/");return e.split("/").filter(n=>n.length>0).at(-1)??e}function W_(t){return Array.isArray(t)&&t.length===1&&t[0]==="mcp"}function t$(t,e){return t!==void 0&&ki(t)===ki(e)}function ki(t){return Array.isArray(t)?`[${t.map(e=>ki(e)).join(",")}]`:It(t)?`{${Object.keys(t).sort().map(e=>`${JSON.stringify(e)}:${ki(t[e])}`).join(",")}}`:JSON.stringify(t)}function It(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Ti,bi,WR,He,x_,bs=T(()=>{"use strict";Ie();Ti="lmctl",bi="lmctl0",WR={existsSync:OR,mkdirSync:CR,readFileSync:MR,writeFileSync:FR,renameSync:DR,unlinkSync:PR},He=WR});import{spawnSync as G_}from"node:child_process";import{cpSync as B_,existsSync as pu,mkdirSync as K_,mkdtempSync as r$,readFileSync as V_,statSync as n$,writeFileSync as fu}from"node:fs";import{homedir as s$,tmpdir as o$}from"node:os";import{basename as H_,join as et}from"node:path";function qt(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function mu(t,e,r){if(Array.isArray(t)){for(let n of t)mu(n,e,r);return}if(qt(t)){t.alias===e&&(Array.isArray(t.mcp)&&r.mcp.push(...t.mcp),Array.isArray(t.skills)&&r.skills.push(...t.skills));for(let n of Object.values(t))mu(n,e,r)}}function c$(t,e){let r={mcp:[],skills:[]},n=new Set;for(let o of t.listProjects()){if(o.team_id!==e.team_id)continue;let i=t.getWorkflowByName(o.workflow_name);if(i===null||n.has(i.id))continue;n.add(i.id);let a;try{a=JSON.parse(i.definition)}catch{continue}if(!(!qt(a)||!Array.isArray(a.steps)))for(let l of a.steps)qt(l)&&l.members!==void 0&&mu(l.members,e.alias,r)}let s=o=>{let i=new Map;for(let a of o)i.set(l$(a),a);return[...i.values()]};return{mcp:s(r.mcp),skills:s(r.skills)}}function u$(t,e){return t.listProjects().find(r=>r.team_id===e.team_id)?.local_path}async function Y_(t,e){let r;try{r=await fetch(t,{signal:AbortSignal.timeout(i$)})}catch(s){throw new tt(e,`fetch ${t} failed: ${s.message}`)}if(!r.ok)throw new tt(e,`fetch ${t} \u2192 HTTP ${r.status}`);let n=await r.text();if(n.length>q_)throw new tt(e,`fetched ${t} exceeds ${q_} bytes`);return n}async function d$(t,e){if(typeof t!="string")return[t];ur(t)&&(t=await Es(t));let r;if(hu.test(t))r=await Y_(t,e);else{if(!pu(t))throw new tt(e,`mcp file not found: ${t}`);r=V_(t,"utf8")}let n;try{n=JSON.parse(r)}catch{throw new tt(e,`mcp source is not JSON: ${t}`)}if(qt(n)&&qt(n.mcpServers))return Object.entries(n.mcpServers).map(([s,o])=>({name:s,...qt(o)?o:{}}));if(qt(n)&&typeof n.name=="string")return[n];throw new tt(e,`mcp source ${t} is neither {mcpServers:{\u2026}} nor a {name,\u2026} server`)}function Ii(t){return t.type==="http"||t.type==="sse"||t.url!==void 0&&t.command===void 0}function vi(t,e,r,n){let s=G_(t,e,{cwd:r,env:Mt(void 0,r),encoding:"utf8",timeout:6e4});if(s.error)throw new tt(n,`spawn ${t} failed: ${s.error.message}`);if(s.status!==0)throw new tt(n,`${t} ${e.slice(0,3).join(" ")} exited ${s.status}: ${(s.stderr??"").trim().slice(0,200)}`)}function f$(t,e,r){G_(t,e,{cwd:r,env:Mt(void 0,r),encoding:"utf8",timeout:6e4})}function m$(t,e){return t==="claude"?["mcp","remove",e,"--scope","user"]:["mcp","remove",e]}function p$(t){let e=["mcp","add"];if(Ii(t)){e.push("-t",t.type==="sse"?"sse":"http");for(let[r,n]of Object.entries(t.headers??{}))e.push("-H",`${r}: ${n}`);e.push(t.name,t.url??"")}else{for(let[r,n]of Object.entries(t.env??{}))e.push("-e",`${r}=${n}`);e.push(t.name,t.command??"",...t.args??[])}return e}function h$(t){if(Ii(t))return["mcp","add",t.name,"--url",t.url??""];let e=["mcp","add",t.name];for(let[r,n]of Object.entries(t.env??{}))e.push("--env",`${r}=${n}`);return e.push("--",t.command??"",...t.args??[]),e}function _$(t){let e=et(process.env.XDG_CONFIG_HOME??et(pn(),".config"),"opencode"),r=et(e,"opencode.json"),n={};if(pu(r))try{let o=JSON.parse(V_(r,"utf8"));qt(o)&&(n=o)}catch{}let s=qt(n.mcp)?{...n.mcp}:{};for(let o of t){let{name:i,...a}=o;s[i]=Ii(o)?{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"),K_(e,{recursive:!0}),fu(r,`${JSON.stringify(n,null,2)}
1720
- `,"utf8")}function g$(t,e){let r={};for(let n of t)r[n.name]=Ii(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{A_(uu(pn()),r)}catch(n){throw new tt(e,`copilot MCP config install failed: ${n instanceof Error?n.message:String(n)}`)}}function y$(t){if(typeof t!="string")return t.name;let e=H_(t.replace(/\/+$/,""));return e.toLowerCase()==="skill.md"?H_(t.replace(/\/skill\.md$/i,"")):e}async function J_(t,e,r){let n=y$(t),s=et(e,n);if(K_(s,{recursive:!0}),typeof t!="string")return fu(et(s,"SKILL.md"),t.content,"utf8"),{name:n,dir:s};if(ur(t)&&(t=await Es(t)),hu.test(t))return fu(et(s,"SKILL.md"),await Y_(t,r),"utf8"),{name:n,dir:s};if(!pu(t))throw new tt(r,`skill path not found: ${t}`);return n$(t).isDirectory()?(B_(t,s,{recursive:!0}),{name:n,dir:s}):(B_(t,et(s,"SKILL.md")),{name:n,dir:s})}async function Ni(t){let{dal:e,member:r,stderr:n}=t,s=c$(e,r);if(s.mcp.length===0&&s.skills.length===0)return;let o=Ae(r),i=r.sessiondir||t.baseDir||u$(e,r)||process.cwd(),a=l=>{n.write(`[seed:${r.alias}] ${l}
1721
- `)};if(s.mcp.length>0){let l=[];for(let c of s.mcp)l.push(...await d$(c,r.alias));if(o==="opencode")_$(l);else if(o==="copilot")g$(l,r.alias);else if(o==="claude"||o==="gemini"||o==="qwen"||o==="agy"||o==="codex")for(let c of l)if(f$(o,m$(o,c.name),i),o==="claude"){let{name:u,...d}=c;vi("claude",["mcp","add-json",u,JSON.stringify(d),"--scope","user"],i,r.alias)}else o==="codex"?vi("codex",h$(c),i,r.alias):vi(o,p$(c),i,r.alias);else a(`provider ${o} has no known MCP install mechanism \u2014 ${l.length} declared server(s) NOT installed.`);["opencode","claude","gemini","qwen","agy","codex","copilot"].includes(o)&&a(`installed ${l.length} MCP server(s) into ${o} (idempotent).`)}if(s.skills.length>0)if(a$.has(o))a(`skills for ${o} 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(o==="gemini"||o==="agy"){let l=r$(et(o$(),`lmctl-skill-${r.alias}-`));for(let c of s.skills){let u=typeof c=="string"&&!hu.test(c)?c:(await J_(c,l,r.alias)).dir;vi(o,["skills","install",u,"--scope","user","--consent"],i,r.alias)}a(`installed ${s.skills.length} skill(s) via \`${o} skills install --scope user\` (idempotent).`)}else if(X_[o]!==void 0){let l=X_[o]();for(let c of s.skills)await J_(c,l,r.alias);a(`installed ${s.skills.length} skill(s) \u2192 ${l}/<name>/SKILL.md (idempotent overwrite).`)}else a(`provider ${o} has no verified skills mechanism \u2014 ${s.skills.length} declared skill(s) NOT installed.`)}var tt,hu,i$,q_,a$,l$,pn,X_,_u=T(()=>{"use strict";Ue();cu();lt();bs();tt=class extends Error{alias;constructor(e,r){super(`capability install failed for ${e}: ${r}`),this.alias=e,this.name="CapabilityInstallError"}},hu=/^https?:\/\//i,i$=8e3,q_=1e6,a$=new Set(["opencode"]),l$=t=>JSON.stringify(t),pn=()=>process.env.HOME??s$();X_={claude:()=>et(pn(),".claude","skills"),qwen:()=>et(pn(),".qwen","skills"),codex:()=>et(pn(),".codex","skills"),copilot:()=>et(pn(),".copilot","skills")}});async function L(t,e){if(t.dal!==void 0)return e(t.dal);let r=_e({path:de()});try{return await e(r)}finally{r.close()}}function D(t,e,r=["--json"]){let n=new Set(e),s=new Set(r),o=[],i={};for(let a=0;a<t.length;a+=1){let l=t[a];if(!l.startsWith("--")){o.push(l);continue}if(s.has(l)){i[l]=!0;continue}if(!n.has(l))return{positionals:o,flags:i,error:`unknown flag: ${l}`};let c=t[a+1];if(c===void 0||c.startsWith("--"))return{positionals:o,flags:i,error:`missing value for ${l}`};i[l]=c,a+=1}return{positionals:o,flags:i}}function A(t,e){let r=t.flags[e];return typeof r=="string"?r:void 0}function C(t,e){return t.flags[e]===!0}function U(t,e){t.stdout.write(`${JSON.stringify(e,null,2)}
1716
+ Don't dump all of durable-memory into your context. The pattern is index-first, chapter-on-demand.`});function mi(t){return oR.has(t)}function su(){return nu===null&&(nu=Tt(St())),nu}function ou(t,e,r={}){if(!mi(t))return null;try{let n=su().getAdapter?.(t);if(n===void 0)return null;let s=n.resumeCommand(e).trim();if(s.length===0)return null;let o=s.split(/\s+/),i=t==="codex"&&r.isLead===!0?Io({warn:()=>{}}):[];return[...o,...i,...__[t]??[]]}catch{return null}}function ln(t,e){let r=ou(t,e);return r===null?null:r.join(" ")}function Ht(t,e){return su().getSession(t,e)}async function pi(t){return(await su().resolveSessions(t)).map(r=>r.provider.name)}var __,oR,g_,nu,jr=T(()=>{"use strict";kt();ql();__={claude:["--dangerously-skip-permissions"],codex:["--dangerously-bypass-approvals-and-sandbox"],gemini:["-y"],copilot:["--yolo"],opencode:[],qwen:["--approval-mode","yolo"],agy:[],lmplayer:[]},oR=new Set(Object.keys(__)),g_=/^[\w.:-]+$/;nu=null});import{createHash as iR}from"node:crypto";import{existsSync as ws,mkdirSync as w_,readFileSync as Es,readdirSync as aR,renameSync as lR,statSync as cR,unlinkSync as uR,writeFileSync as hi}from"node:fs";import{homedir as dR}from"node:os";import{dirname as iu,isAbsolute as y_,join as Qe,relative as fR,resolve as cn}from"node:path";import{fileURLToPath as mR}from"node:url";function T_(t){let e=cn(t);for(;;){let r=Qe(e,au);try{if(cR(r).isDirectory())return r}catch{}let n=iu(e);if(n===e)return null;e=n}}function gi(t=process.cwd()){let e=process.env.LMCTL_HOME;if(e!==void 0&&e.trim().length>0)return cn(e);let r=T_(t);return r!==null?r:Qe(E_(),au)}function b_(t){return Qe(gi(t),"templates","workflows")}function S_(){return cn(iu(mR(import.meta.url)),"..","..","workflows")}function pR(t){let e=Qe(t,k_);try{let r=JSON.parse(Es(e,"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 hR(t,e){w_(t,{recursive:!0});let r=Qe(t,k_),n=`${r}.tmp-${process.pid}`;hi(n,`${JSON.stringify(e,null,2)}
1717
+ `,"utf8"),lR(n,r)}function _R(t){if(typeof t=="object"&&t!==null&&"code"in t){let e=t.code;if(typeof e=="string")return e}}function gR(t,e,r,n,s){let o=`${e}.dist-${r}`;for(let i=0;i<1e3;i+=1){let a=i===0?o:`${o}-${i}`,l=Qe(t,a);try{return hi(l,n,{flag:"wx"}),a}catch(c){if(_R(c)!=="EEXIST")throw c;if(_i(Es(l))===s)return a}}throw new Error(`could not find available dist shadow path for ${e}`)}function yR(t,e){if(y_(e)||iu(e)!=="workflows")return null;let r=e.slice(10);if(r.length===0||r.includes("/")||r.includes("\\")||r.includes(".."))return null;let n=cn(t,"templates","workflows"),s=cn(t,"templates",e),o=fR(n,s);return o.length===0||o.startsWith("..")||y_(o)||o.includes("/")||o.includes("\\")?null:s}function wR(t,e,r){for(let[n,s]of Object.entries(e.files)){if(r.has(n))continue;let o=yR(t,n);if(o===null){delete e.files[n];continue}if(!ws(o)){delete e.files[n];continue}try{if(_i(Es(o))!==s)continue;uR(o),delete e.files[n]}catch{}}}function yi(t={}){let e=gi(t.cwd),r=Qe(e,"templates","workflows"),n=S_(),s={basedir:e,copied:[],refreshed:[],preserved:[],shadowed:[]};try{let o=ws(n)?aR(n).filter(c=>c.endsWith(".compound.json")||c.endsWith(".lmctl")||c==="index.jsonl"):[];if(o.length===0)return s;w_(r,{recursive:!0});let i=pR(e),a=wt(),l=new Set(o.map(c=>`workflows/${c}`));for(let c of o){let u=`workflows/${c}`,d=Es(Qe(n,c)),f=_i(d),m=Qe(r,c);if(!ws(m)){try{hi(m,d,{flag:"wx"}),s.copied.push(c)}catch{}i.files[u]=f;continue}let p=_i(Es(m));if(p===f){i.files[u]=f;continue}let h=i.files[u];if(h!==void 0&&p===h)hi(m,d),i.files[u]=f,s.refreshed.push(c);else{let g=gR(r,c,a,d,f);s.preserved.push(c),s.shadowed.push(g)}}wR(e,i,l),hR(e,{version:a,files:i.files})}catch(o){if(t.swallow!==!0)throw o}return s}function lu(t){let e=[],r=process.env.LMCTL_HOME;r!==void 0&&r.trim().length>0&&e.push(cn(r));let n=T_(t??process.cwd());return n!==null&&e.push(n),e.push(Qe(E_(),au)),e}function wi(t,e){let r=lu(e),n=[`${t}.compound.json`,`${t}.lmctl`];for(let s of r)for(let o of n){let i=Qe(s,"templates","workflows",o);if(ws(i))return i}for(let s of n){let o=Qe(S_(),s);if(ws(o))return o}return null}var au,E_,_i,k_,Ei=T(()=>{"use strict";Xn();au=".lmctl",E_=()=>process.env.HOME??dR(),_i=t=>iR("sha256").update(t).digest("hex");k_=".dist-manifest.json"});import{createHash as ER}from"node:crypto";import{existsSync as TR,mkdirSync as bR,writeFileSync as SR}from"node:fs";import{dirname as kR,join as un}from"node:path";function ur(t){return typeof t=="string"&&t.startsWith(v_)}function RR(t){if(!ur(t))throw new ft(`not an lmctl:// URI: ${t}`,"malformed");let e=t.slice(v_.length),r=e.indexOf("/");if(r<=0)throw new ft(`malformed lmctl:// URI (expected lmctl://<workflow|mcp|skill>/<name>): ${t}`,"malformed");let n=e.slice(0,r);if(!xR.has(n))throw new ft(`unknown lmctl:// kind '${n}' (expected workflow|mcp|skill): ${t}`,"malformed");let s=e.slice(r+1),o,i=s.indexOf("@");i>=0&&(o=s.slice(i+1).trim(),s=s.slice(0,i));let a=s.trim();if(a.length===0)throw new ft(`empty name in lmctl:// URI: ${t}`,"malformed");if(/[\\/]|\.\./.test(a))throw new ft(`invalid name in lmctl:// URI (no path separators): ${t}`,"malformed");return{kind:n,name:a,...o!==void 0&&o.length>0?{ref:o}:{}}}function $R(t,e,r){if(t==="workflow")return wi(e,r);let n=t==="mcp"?un("templates","mcp",`${e}.json`):un("templates","skills",e,"SKILL.md");for(let s of lu(r)){let o=un(s,n);if(TR(o))return o}return null}function LR(t,e,r){let n=un(gi(r),IR,t);return t==="skill"?un(n,e,"SKILL.md"):un(n,`${e}${t==="workflow"?".compound.json":".json"}`)}function jR(t,e){if(e.trim().length===0)return!1;if(t==="skill")return!0;let r=e.trim();if(t==="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 Ts(t,e){let{kind:r,name:n,ref:s}=RR(t),o=$R(r,n,e);if(o!==null)return o;let i=`${vR}${r}/${n}`,a;try{a=await fetch(i,{signal:AbortSignal.timeout(NR)})}catch(u){throw new ft(`lmctl:// '${t}' not found locally or at the remote catalog ${i} (${u instanceof Error?u.message:String(u)}). Failing closed.`,"missing")}if(!a.ok)throw new ft(`lmctl:// '${t}' not found locally or at the remote catalog ${i} (HTTP ${a.status}). Failing closed.`,"missing");let l=await a.text();if(s!==void 0){let u=AR.exec(s);if(u!==null){let d=ER("sha256").update(l).digest("hex");if(d.toLowerCase()!==u[1].toLowerCase())throw new ft(`lmctl:// '${t}' remote artifact FAILED integrity pin (expected sha256 ${u[1]}, got ${d}) \u2014 discarded, NOT cached.`,"validation-failure")}}if(!jR(r,l))throw new ft(`lmctl:// '${t}' remote artifact failed shape validation for ${r} \u2014 discarded, NOT cached.`,"validation-failure");let c=LR(r,n,e);return bR(kR(c),{recursive:!0}),SR(c,l,"utf8"),c}var v_,vR,IR,NR,xR,ft,AR,cu=T(()=>{"use strict";Ei();v_="lmctl://",vR="https://lmctl.com/templates/",IR=".cache",NR=8e3,xR=new Set(["workflow","mcp","skill"]),ft=class extends Error{reason;constructor(e,r="malformed"){super(e),this.reason=r,this.name="LmctlUriError"}},AR=/^(?:sha256[:-])?([0-9a-f]{64})$/i});import{existsSync as OR,mkdirSync as CR,readFileSync as MR,renameSync as DR,unlinkSync as PR,writeFileSync as FR}from"node:fs";import{homedir as N_}from"node:os";import{dirname as bs,join as mt,resolve as UR}from"node:path";function mn(t,e,r){let n=bs(UR(r)),s=new Set,o=new Map;for(let i of e.members){if(s.add(i.provider),i.teamfile!==void 0)continue;let a=i.sessiondir??n,l=o.get(a)??new Set;l.add(i.provider),o.set(a,l)}for(let[i,a]of o.entries())dr(mt(i,".mcp.json"),"mcpServers",[dn(),fn()]),a.has("opencode")&&dr(mt(i,".opencode","opencode.json"),"mcp",[$_(),L_()]);for(let i of s)HR(i)}function uu(t=x_??N_()){return mt(t,".copilot","mcp-config.json")}function A_(t,e){let r={};if(He.existsSync(t)){let o=JSON.parse(He.readFileSync(t,"utf8"));if(!It(o))throw new Error(`${t} is not a JSON object`);r=o}let n=It(r.mcpServers)?{...r.mcpServers}:{},s=!1;for(let[o,i]of Object.entries(e)){let a=It(n[o])?n[o]:void 0;t$(a,i)||(n[o]=i,s=!0)}return s?(r.mcpServers=n,R_(t,r),{changed:!0}):{changed:!1}}function R_(t,e){He.mkdirSync(bs(t),{recursive:!0});let r=mt(bs(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{He.writeFileSync(r,`${JSON.stringify(e,null,2)}
1718
+ `,"utf8"),He.renameSync(r,t)}catch(n){try{He.unlinkSync(r)}catch{}throw n}}function BR(t,e){He.mkdirSync(bs(t),{recursive:!0});let r=mt(bs(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{He.writeFileSync(r,e,"utf8"),He.renameSync(r,t)}catch(n){try{He.unlinkSync(r)}catch{}throw n}}function dr(t,e,r){try{if(!He.existsSync(t))return;let n=JSON.parse(He.readFileSync(t,"utf8"));if(!It(n)||!It(n[e]))return;let s={...n[e]},o=[];for(let{name:i,shouldRemove:a}of r)Object.prototype.hasOwnProperty.call(s,i)&&a(s[i])&&(delete s[i],o.push(i));if(o.length===0)return;n[e]=s,R_(t,n),Y({event:"mcp_cleanup",path:t,removed:o})}catch{}}function dn(){return{name:bi,shouldRemove:zR}}function $_(){return{name:bi,shouldRemove:ZR}}function fn(){return{name:Ti,shouldRemove:VR}}function L_(){return{name:Ti,shouldRemove:YR}}function HR(t){let e=x_??N_();switch(t){case"copilot":dr(uu(e),"mcpServers",[dn(),fn()]);return;case"claude":dr(mt(e,".claude.json"),"mcpServers",[dn(),fn()]);return;case"gemini":dr(mt(e,".gemini","settings.json"),"mcpServers",[dn(),fn()]);return;case"qwen":dr(mt(e,".qwen","settings.json"),"mcpServers",[dn(),fn()]);return;case"agy":dr(mt(e,".gemini","antigravity-cli","settings.json"),"mcpServers",[dn(),fn()]);return;case"opencode":dr(mt(e,".config","opencode","opencode.json"),"mcp",[$_(),L_()]);return;case"codex":qR(mt(e,".codex","config.toml"));return;default:return}}function qR(t){try{if(!He.existsSync(t))return;let e=He.readFileSync(t,"utf8"),r=JR(e);if(r===null)return;let n=e.split(/\n/),s=[],o=new Set,i=!1,a;for(let l of n){let c=j_(l);if(c===null)return;if(c!==void 0){if(I_(c,r)){i=!0,a=c[1],o.add(a);continue}i=!1,a=void 0,s.push(l);continue}if(i){if(/^\s*(?:#.*)?$/.test(l)){s.push(l);continue}a!==void 0&&o.add(a);continue}let u=GR(l);if(u===null)return;if(u!==void 0&&I_(u,r)){o.add(u[1]);continue}s.push(l)}if(o.size===0)return;BR(t,s.join(`
1719
+ `)),Y({event:"mcp_cleanup",path:t,removed:[...o]})}catch{}}function I_(t,e){return t.length<2||t[0]!=="mcp_servers"?!1:e.has(t[1])}function JR(t){let e=new Map,r;for(let s of t.split(/\n/)){let o=j_(s);if(o===null)return null;if(o!==void 0){r=o;continue}let i=s.indexOf("=");if(i<0)continue;let a=s.slice(0,i).trim(),l=s.slice(i+1).trim(),c=XR(a,r);if(c===null)return null;if(c===void 0||c.length!==3||c[0]!=="mcp_servers"||c[1]!==Ti&&c[1]!==bi)continue;let u=e.get(c[1])??{};if(c[2]==="command"){let d=O_(l);if(d===null)return null;u.command=d}else if(c[2]==="args"){let d=KR(l);if(d===null)return null;u.args=d}e.set(c[1],u)}let n=new Set;for(let[s,o]of e.entries())s===Ti&&M_(o.command,o.args)&&n.add(s),s===bi&&D_(o.command,o.args)&&n.add(s);return n}function XR(t,e){if(t.startsWith("mcp_servers"))return Si(t);if(e===void 0||e.length<2||e[0]!=="mcp_servers")return;let r=Si(t);return r===null?null:[...e,...r]}function j_(t){if(!/^\s*\[/.test(t))return;let e=/^\s*\[([^\]\r\n]+)\]\s*(?:#.*)?$/.exec(t);return e===null?null:Si(e[1])}function GR(t){let e=t.indexOf("=");if(e<0)return;let r=t.slice(0,e).trim();if(!(r.length===0||!r.startsWith("mcp_servers")))return Si(r)}function Si(t){let e=[],r=0,n=()=>{for(;r<t.length&&/\s/.test(t[r]);)r+=1};for(;r<t.length;){if(n(),r>=t.length)return null;if(t[r]==='"'){r+=1;let s="",o=!1;for(;r<t.length;){let i=t[r];if(i==="\\"){if(r+1>=t.length)return null;s+=t[r+1],r+=2;continue}if(i==='"'){r+=1,o=!0;break}s+=i,r+=1}if(!o)return null;e.push(s)}else{let s=r;for(;r<t.length&&/[A-Za-z0-9_-]/.test(t[r]);)r+=1;if(r===s)return null;e.push(t.slice(s,r))}if(n(),r>=t.length)break;if(t[r]!==".")return null;r+=1}return e.length>0?e:null}function O_(t){let e=C_(t).trim();if(e.startsWith('"'))try{let r=JSON.parse(e);return typeof r=="string"?r:null}catch{return null}return e.startsWith("'")&&e.endsWith("'")&&e.length>=2?e.slice(1,-1):null}function KR(t){let e=C_(t).trim();if(!e.startsWith("[")||!e.endsWith("]"))return null;let r=e.slice(1,-1).trim();if(r.length===0)return[];let n=r.split(",").map(s=>O_(s.trim()));return n.some(s=>s===null)?null:n}function C_(t){let e;for(let r=0;r<t.length;r+=1){let n=t[r];if(e!==void 0){if(e==='"'&&n==="\\"){r+=1;continue}n===e&&(e=void 0);continue}if(n==='"'||n==="'"){e=n;continue}if(n==="#")return t.slice(0,r)}return t}function VR(t){return It(t)?t.type==="stdio"&&typeof t.command=="string"&&M_(t.command,t.args):!1}function YR(t){return!It(t)||!Array.isArray(t.command)?!1:t.command.length===2&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&F_(t.command[0])&&t.command[1]==="mcp"||t.command.length===3&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&typeof t.command[2]=="string"&&P_(t.command[0],[t.command[1],t.command[2]])}function zR(t){return It(t)?t.type==="stdio"&&D_(t.command,t.args):!1}function ZR(t){return!It(t)||!Array.isArray(t.command)?!1:t.command.length===2&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&U_(t.command[0])&&t.command[1]==="mcp"}function M_(t,e){return F_(t)&&W_(e)||P_(t,e)}function D_(t,e){return U_(t)&&W_(e)}function P_(t,e){return QR(t)&&Array.isArray(e)&&e.length===2&&e$(e[0])&&e[1]==="mcp"}function F_(t){return typeof t=="string"&&du(t)==="lmctl"}function U_(t){return typeof t=="string"&&du(t)==="lmctl0"}function QR(t){if(typeof t!="string")return!1;let e=du(t).toLowerCase();return e==="node"||e==="node.exe"}function e$(t){if(typeof t!="string")return!1;let e=t.replace(/\\/g,"/");return e==="lmctl-cli/dist/index.js"||e.endsWith("/lmctl-cli/dist/index.js")}function du(t){let e=t.replace(/\\/g,"/");return e.split("/").filter(n=>n.length>0).at(-1)??e}function W_(t){return Array.isArray(t)&&t.length===1&&t[0]==="mcp"}function t$(t,e){return t!==void 0&&ki(t)===ki(e)}function ki(t){return Array.isArray(t)?`[${t.map(e=>ki(e)).join(",")}]`:It(t)?`{${Object.keys(t).sort().map(e=>`${JSON.stringify(e)}:${ki(t[e])}`).join(",")}}`:JSON.stringify(t)}function It(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Ti,bi,WR,He,x_,Ss=T(()=>{"use strict";Ie();Ti="lmctl",bi="lmctl0",WR={existsSync:OR,mkdirSync:CR,readFileSync:MR,writeFileSync:FR,renameSync:DR,unlinkSync:PR},He=WR});import{spawnSync as G_}from"node:child_process";import{cpSync as B_,existsSync as pu,mkdirSync as K_,mkdtempSync as r$,readFileSync as V_,statSync as n$,writeFileSync as fu}from"node:fs";import{homedir as s$,tmpdir as o$}from"node:os";import{basename as H_,join as et}from"node:path";function qt(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function mu(t,e,r){if(Array.isArray(t)){for(let n of t)mu(n,e,r);return}if(qt(t)){t.alias===e&&(Array.isArray(t.mcp)&&r.mcp.push(...t.mcp),Array.isArray(t.skills)&&r.skills.push(...t.skills));for(let n of Object.values(t))mu(n,e,r)}}function c$(t,e){let r={mcp:[],skills:[]},n=new Set;for(let o of t.listProjects()){if(o.team_id!==e.team_id)continue;let i=t.getWorkflowByName(o.workflow_name);if(i===null||n.has(i.id))continue;n.add(i.id);let a;try{a=JSON.parse(i.definition)}catch{continue}if(!(!qt(a)||!Array.isArray(a.steps)))for(let l of a.steps)qt(l)&&l.members!==void 0&&mu(l.members,e.alias,r)}let s=o=>{let i=new Map;for(let a of o)i.set(l$(a),a);return[...i.values()]};return{mcp:s(r.mcp),skills:s(r.skills)}}function u$(t,e){return t.listProjects().find(r=>r.team_id===e.team_id)?.local_path}async function Y_(t,e){let r;try{r=await fetch(t,{signal:AbortSignal.timeout(i$)})}catch(s){throw new tt(e,`fetch ${t} failed: ${s.message}`)}if(!r.ok)throw new tt(e,`fetch ${t} \u2192 HTTP ${r.status}`);let n=await r.text();if(n.length>q_)throw new tt(e,`fetched ${t} exceeds ${q_} bytes`);return n}async function d$(t,e){if(typeof t!="string")return[t];ur(t)&&(t=await Ts(t));let r;if(hu.test(t))r=await Y_(t,e);else{if(!pu(t))throw new tt(e,`mcp file not found: ${t}`);r=V_(t,"utf8")}let n;try{n=JSON.parse(r)}catch{throw new tt(e,`mcp source is not JSON: ${t}`)}if(qt(n)&&qt(n.mcpServers))return Object.entries(n.mcpServers).map(([s,o])=>({name:s,...qt(o)?o:{}}));if(qt(n)&&typeof n.name=="string")return[n];throw new tt(e,`mcp source ${t} is neither {mcpServers:{\u2026}} nor a {name,\u2026} server`)}function Ii(t){return t.type==="http"||t.type==="sse"||t.url!==void 0&&t.command===void 0}function vi(t,e,r,n){let s=G_(t,e,{cwd:r,env:Mt(void 0,r),encoding:"utf8",timeout:6e4});if(s.error)throw new tt(n,`spawn ${t} failed: ${s.error.message}`);if(s.status!==0)throw new tt(n,`${t} ${e.slice(0,3).join(" ")} exited ${s.status}: ${(s.stderr??"").trim().slice(0,200)}`)}function f$(t,e,r){G_(t,e,{cwd:r,env:Mt(void 0,r),encoding:"utf8",timeout:6e4})}function m$(t,e){return t==="claude"?["mcp","remove",e,"--scope","user"]:["mcp","remove",e]}function p$(t){let e=["mcp","add"];if(Ii(t)){e.push("-t",t.type==="sse"?"sse":"http");for(let[r,n]of Object.entries(t.headers??{}))e.push("-H",`${r}: ${n}`);e.push(t.name,t.url??"")}else{for(let[r,n]of Object.entries(t.env??{}))e.push("-e",`${r}=${n}`);e.push(t.name,t.command??"",...t.args??[])}return e}function h$(t){if(Ii(t))return["mcp","add",t.name,"--url",t.url??""];let e=["mcp","add",t.name];for(let[r,n]of Object.entries(t.env??{}))e.push("--env",`${r}=${n}`);return e.push("--",t.command??"",...t.args??[]),e}function _$(t){let e=et(process.env.XDG_CONFIG_HOME??et(pn(),".config"),"opencode"),r=et(e,"opencode.json"),n={};if(pu(r))try{let o=JSON.parse(V_(r,"utf8"));qt(o)&&(n=o)}catch{}let s=qt(n.mcp)?{...n.mcp}:{};for(let o of t){let{name:i,...a}=o;s[i]=Ii(o)?{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"),K_(e,{recursive:!0}),fu(r,`${JSON.stringify(n,null,2)}
1720
+ `,"utf8")}function g$(t,e){let r={};for(let n of t)r[n.name]=Ii(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{A_(uu(pn()),r)}catch(n){throw new tt(e,`copilot MCP config install failed: ${n instanceof Error?n.message:String(n)}`)}}function y$(t){if(typeof t!="string")return t.name;let e=H_(t.replace(/\/+$/,""));return e.toLowerCase()==="skill.md"?H_(t.replace(/\/skill\.md$/i,"")):e}async function J_(t,e,r){let n=y$(t),s=et(e,n);if(K_(s,{recursive:!0}),typeof t!="string")return fu(et(s,"SKILL.md"),t.content,"utf8"),{name:n,dir:s};if(ur(t)&&(t=await Ts(t)),hu.test(t))return fu(et(s,"SKILL.md"),await Y_(t,r),"utf8"),{name:n,dir:s};if(!pu(t))throw new tt(r,`skill path not found: ${t}`);return n$(t).isDirectory()?(B_(t,s,{recursive:!0}),{name:n,dir:s}):(B_(t,et(s,"SKILL.md")),{name:n,dir:s})}async function Ni(t){let{dal:e,member:r,stderr:n}=t,s=c$(e,r);if(s.mcp.length===0&&s.skills.length===0)return;let o=Ae(r),i=r.sessiondir||t.baseDir||u$(e,r)||process.cwd(),a=l=>{n.write(`[seed:${r.alias}] ${l}
1721
+ `)};if(s.mcp.length>0){let l=[];for(let c of s.mcp)l.push(...await d$(c,r.alias));if(o==="opencode")_$(l);else if(o==="copilot")g$(l,r.alias);else if(o==="claude"||o==="gemini"||o==="qwen"||o==="agy"||o==="codex")for(let c of l)if(f$(o,m$(o,c.name),i),o==="claude"){let{name:u,...d}=c;vi("claude",["mcp","add-json",u,JSON.stringify(d),"--scope","user"],i,r.alias)}else o==="codex"?vi("codex",h$(c),i,r.alias):vi(o,p$(c),i,r.alias);else a(`provider ${o} has no known MCP install mechanism \u2014 ${l.length} declared server(s) NOT installed.`);["opencode","claude","gemini","qwen","agy","codex","copilot"].includes(o)&&a(`installed ${l.length} MCP server(s) into ${o} (idempotent).`)}if(s.skills.length>0)if(a$.has(o))a(`skills for ${o} 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(o==="gemini"||o==="agy"){let l=r$(et(o$(),`lmctl-skill-${r.alias}-`));for(let c of s.skills){let u=typeof c=="string"&&!hu.test(c)?c:(await J_(c,l,r.alias)).dir;vi(o,["skills","install",u,"--scope","user","--consent"],i,r.alias)}a(`installed ${s.skills.length} skill(s) via \`${o} skills install --scope user\` (idempotent).`)}else if(X_[o]!==void 0){let l=X_[o]();for(let c of s.skills)await J_(c,l,r.alias);a(`installed ${s.skills.length} skill(s) \u2192 ${l}/<name>/SKILL.md (idempotent overwrite).`)}else a(`provider ${o} has no verified skills mechanism \u2014 ${s.skills.length} declared skill(s) NOT installed.`)}var tt,hu,i$,q_,a$,l$,pn,X_,_u=T(()=>{"use strict";Ue();cu();lt();Ss();tt=class extends Error{alias;constructor(e,r){super(`capability install failed for ${e}: ${r}`),this.alias=e,this.name="CapabilityInstallError"}},hu=/^https?:\/\//i,i$=8e3,q_=1e6,a$=new Set(["opencode"]),l$=t=>JSON.stringify(t),pn=()=>process.env.HOME??s$();X_={claude:()=>et(pn(),".claude","skills"),qwen:()=>et(pn(),".qwen","skills"),codex:()=>et(pn(),".codex","skills"),copilot:()=>et(pn(),".copilot","skills")}});async function j(t,e){if(t.dal!==void 0)return e(t.dal);let r=_e({path:de()});try{return await e(r)}finally{r.close()}}function D(t,e,r=["--json"]){let n=new Set(e),s=new Set(r),o=[],i={};for(let a=0;a<t.length;a+=1){let l=t[a];if(!l.startsWith("--")){o.push(l);continue}if(s.has(l)){i[l]=!0;continue}if(!n.has(l))return{positionals:o,flags:i,error:`unknown flag: ${l}`};let c=t[a+1];if(c===void 0||c.startsWith("--"))return{positionals:o,flags:i,error:`missing value for ${l}`};i[l]=c,a+=1}return{positionals:o,flags:i}}function A(t,e){let r=t.flags[e];return typeof r=="string"?r:void 0}function C(t,e){return t.flags[e]===!0}function U(t,e){t.stdout.write(`${JSON.stringify(e,null,2)}
1722
1722
  `)}function y(t,e){return t.stderr.write(`error: ${e}
1723
1723
  `),1}function he(t,e){let r=e instanceof Error?e.message:String(e);return t.stderr.write(`internal error: ${r}
1724
- `),2}var Te=T(()=>{"use strict";Ue();ze()});var tg={};ae(tg,{defaultTeamNameForProject:()=>D$,resolveAlias:()=>Ri,resolveProject:()=>xi,resolveTeam:()=>Ai,runCode:()=>T$});import{execFileSync as w$}from"node:child_process";import{basename as E$,resolve as z_}from"node:path";import*as yu from"node:readline";import{setTimeout as gu}from"node:timers/promises";async function T$(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r===void 0)return b$(e);if(r==="chat"&&(n.includes("--help")||n.includes("-h")))return Q_(e);if(r==="spec"&&(n.includes("--help")||n.includes("-h")))return $$(e);try{return await L(e,async s=>{switch(r){case"team":return S$(n,e,s);case"chat":return x$(n,e,s);case"spec":return A$(n,e,s);default:return y(e,"usage: lmctl code <team|chat|spec> ...")}})}catch(s){return he(e,s)}}function b$(t){return t.stdout.write(["usage: lmctl code <team|chat|spec> ..."," lmctl code spec <task-description> [options]","","Manage the active project code team, chat with a code agent, or start","spec-driven code work.","","subcommands:"," team add <alias> --provider P [--model M] [--role R] [--sessiondir DIR] [--project NAME] [--team NAME] [--json]"," team list"," team show <alias>"," team rm <alias>"," chat [--alias A]"," spec <task-description> [--slug S] [--template W]",""].join(`
1724
+ `),2}var Te=T(()=>{"use strict";Ue();ze()});var tg={};le(tg,{defaultTeamNameForProject:()=>D$,resolveAlias:()=>Ri,resolveProject:()=>xi,resolveTeam:()=>Ai,runCode:()=>T$});import{execFileSync as w$}from"node:child_process";import{basename as E$,resolve as z_}from"node:path";import*as yu from"node:readline";import{setTimeout as gu}from"node:timers/promises";async function T$(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r===void 0)return b$(e);if(r==="chat"&&(n.includes("--help")||n.includes("-h")))return Q_(e);if(r==="spec"&&(n.includes("--help")||n.includes("-h")))return $$(e);try{return await j(e,async s=>{switch(r){case"team":return S$(n,e,s);case"chat":return x$(n,e,s);case"spec":return A$(n,e,s);default:return y(e,"usage: lmctl code <team|chat|spec> ...")}})}catch(s){return he(e,s)}}function b$(t){return t.stdout.write(["usage: lmctl code <team|chat|spec> ..."," lmctl code spec <task-description> [options]","","Manage the active project code team, chat with a code agent, or start","spec-driven code work.","","subcommands:"," team add <alias> --provider P [--model M] [--role R] [--sessiondir DIR] [--project NAME] [--team NAME] [--json]"," team list"," team show <alias>"," team rm <alias>"," chat [--alias A]"," spec <task-description> [--slug S] [--template W]",""].join(`
1725
1725
  `)),0}function S$(t,e,r){let[n,...s]=t;switch(n){case"add":return k$(s,e,r);case"list":return v$(s,e,r);case"show":return I$(s,e,r);case"rm":return N$(s,e,r);default:return y(e,"usage: lmctl code team <add|list|show|rm>")}}function k$(t,e,r){let n=D(t,["--project","--team","--provider","--model","--role","--sessiondir"]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0)return y(e,"usage: code team add <alias> --provider P [--model M] [--role R] [--sessiondir DIR] [--project NAME] [--team NAME] [--json]");let o=A(n,"--provider");if(o===void 0)return y(e,"code team add requires --provider");let i=hn(e,r,A(n,"--project"),A(n,"--team"));if(typeof i=="number")return i;let a=r.insertTeamMember({team_id:i.team.id,alias:s,provider:o,model:A(n,"--model")??null,role:A(n,"--role")??"agent",sessiondir:A(n,"--sessiondir")??i.project.local_path});return C(n,"--json")?U(e,a):e.stdout.write(`added member ${a.alias} to ${i.team.name}
1726
1726
  `),0}function v$(t,e,r){let n=D(t,["--project","--team"]);if(n.error!==void 0)return y(e,n.error);let s=hn(e,r,A(n,"--project"),A(n,"--team"));if(typeof s=="number")return s;let o=eg(r.listTeamMembers(s.team.id));if(C(n,"--json"))U(e,o);else for(let i of o)e.stdout.write(`${i.alias} ${i.role} ${Ae(i)} ${i.sessionid??"(unseeded)"}
1727
1727
  `);return 0}function I$(t,e,r){let n=D(t,["--project","--team"]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0)return y(e,"usage: code team show <alias>");let o=hn(e,r,A(n,"--project"),A(n,"--team"));if(typeof o=="number")return o;let i=r.findTeamMemberByAlias(o.team.id,s);return i===null||i.state==="retired"?y(e,`member not found: ${s}`):(C(n,"--json")?U(e,i):(e.stdout.write(`member ${i.alias}
@@ -1732,47 +1732,47 @@ Don't dump all of durable-memory into your context. The pattern is index-first,
1732
1732
  `),e.stdout.write(`sessiondir: ${i.sessiondir}
1733
1733
  `)),0)}function N$(t,e,r){let n=D(t,["--project","--team"]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0)return y(e,"usage: code team rm <alias>");let o=hn(e,r,A(n,"--project"),A(n,"--team"));if(typeof o=="number")return o;let i=r.findTeamMemberByAlias(o.team.id,s);if(i===null||i.state==="retired")return y(e,`member not found: ${s}`);let a=r.setMemberState(i.id,"retired","removed via code team rm");return C(n,"--json")?U(e,a):e.stdout.write(`retired member ${i.alias}
1734
1734
  `),0}async function x$(t,e,r){if(t.includes("--help")||t.includes("-h"))return Q_(e);let n=D(t,["--project","--team","--alias"]);if(n.error!==void 0)return y(e,n.error);let s=hn(e,r,A(n,"--project"),A(n,"--team"));if(typeof s=="number")return s;let o=Ri(e,r,s.team,A(n,"--alias"));if(typeof o=="number")return o;let i=await M$(e,r,s.project,o);e.stdout.write(`[${i.alias}@${s.project.name}] type /help for commands
1735
- `);let a=e.stdin??process.stdin,l=yu.createInterface({input:a,terminal:!1}),c=i;Ss(e,c,s.project);try{for await(let u of l){let d=u.trim();if(d.length===0){Ss(e,c,s.project);continue}if(d==="/exit")return e.stdout.write(`[bye]
1736
- `),0;if(d==="/help"){C$(e),Ss(e,c,s.project);continue}if(d.startsWith("/")){e.stderr.write(`unknown command: ${d}
1737
- `),Ss(e,c,s.project);continue}e.stdout.write(`[${c.alias}@${s.project.name}] (thinking...)
1735
+ `);let a=e.stdin??process.stdin,l=yu.createInterface({input:a,terminal:!1}),c=i;ks(e,c,s.project);try{for await(let u of l){let d=u.trim();if(d.length===0){ks(e,c,s.project);continue}if(d==="/exit")return e.stdout.write(`[bye]
1736
+ `),0;if(d==="/help"){C$(e),ks(e,c,s.project);continue}if(d.startsWith("/")){e.stderr.write(`unknown command: ${d}
1737
+ `),ks(e,c,s.project);continue}e.stdout.write(`[${c.alias}@${s.project.name}] (thinking...)
1738
1738
  `);let f=await tn({sessionid:c.sessionid,sessiondir:c.sessiondir,prompt:d,dal:r,team_member_id:c.id});e.stdout.write(`${f.text.trimEnd()}
1739
- `);let m=r.findTeamMemberByAlias(s.team.id,c.alias);m!==null&&(c=m),Ss(e,c,s.project)}}finally{l.close()}return 0}async function A$(t,e,r){let n=D(t,["--slug","--template","--from-requirement","--from-plan","--from-design","--project","--team"]);if(n.error!==void 0)return y(e,n.error);let s=n.positionals.join(" ").trim();if(s.length===0)return y(e,"usage: code spec <task-description> [--slug S] [--template W]");let o=hn(e,r,A(n,"--project"),A(n,"--team"));if(typeof o=="number")return o;let i=A(n,"--template")??Z_,a=r.getWorkflowByName(i);if(a===null)return y(e,`workflow not found: ${i}`);let l=A(n,"--slug")??O$(s),c={task_description:s,slug:l},u=A(n,"--from-requirement"),d=A(n,"--from-plan"),f=A(n,"--from-design");u!==void 0&&(c.from_requirement=u),d!==void 0&&(c.from_plan=d),f!==void 0&&(c.from_design=f);let m=R$(r,e),p=await ks(m,"/api/jobs","POST",{project:o.project.name,source:"code_spec",source_ref:l,payload:c,dedupe_key:`code_spec:${o.project.name}:${l}`,workflow_id_override:a.id});return e.stderr.write(`[code spec] enqueued job ${p.id} for ${o.project.name}/${l}
1740
- `),j$(e,m,p.id)}function R$(t,e){let r=hs(t,process.env,e);return process.env.LMCTL_API_URL=r.baseUrl,r.token!==null&&r.token.length>0&&(process.env.LMCTL_API_TOKEN=r.token),r}function $$(t){return t.stdout.write(["usage: lmctl code spec <task-description> [options]","","options:"," --slug S default: slugified task description",` --template W default: ${Z_}`," --from-requirement PATH skip requirement stage"," --from-plan PATH skip plan stage"," --from-design PATH skip design stage"," --project NAME override cwd project resolution"," --team NAME override project team","","interactive commands while paused:"," /done mark current Interactive stage done"," /exit leave the run paused and exit",""].join(`
1741
- `)),0}async function j$(t,e,r){let n=null;for(let s=0;s<1e3;s+=1){let o=await ks(e,`/api/jobs/${r}/run`,"POST");if(o.run_id!==null&&(n=o.run_id),o.status==="done")return t.stdout.write(`code spec complete: run ${o.run_id??n??"(unknown)"} terminal=${o.terminal_state??"(none)"}
1739
+ `);let m=r.findTeamMemberByAlias(s.team.id,c.alias);m!==null&&(c=m),ks(e,c,s.project)}}finally{l.close()}return 0}async function A$(t,e,r){let n=D(t,["--slug","--template","--from-requirement","--from-plan","--from-design","--project","--team"]);if(n.error!==void 0)return y(e,n.error);let s=n.positionals.join(" ").trim();if(s.length===0)return y(e,"usage: code spec <task-description> [--slug S] [--template W]");let o=hn(e,r,A(n,"--project"),A(n,"--team"));if(typeof o=="number")return o;let i=A(n,"--template")??Z_,a=r.getWorkflowByName(i);if(a===null)return y(e,`workflow not found: ${i}`);let l=A(n,"--slug")??O$(s),c={task_description:s,slug:l},u=A(n,"--from-requirement"),d=A(n,"--from-plan"),f=A(n,"--from-design");u!==void 0&&(c.from_requirement=u),d!==void 0&&(c.from_plan=d),f!==void 0&&(c.from_design=f);let m=R$(r,e),p=await vs(m,"/api/jobs","POST",{project:o.project.name,source:"code_spec",source_ref:l,payload:c,dedupe_key:`code_spec:${o.project.name}:${l}`,workflow_id_override:a.id});return e.stderr.write(`[code spec] enqueued job ${p.id} for ${o.project.name}/${l}
1740
+ `),L$(e,m,p.id)}function R$(t,e){let r=_s(t,process.env,e);return process.env.LMCTL_API_URL=r.baseUrl,r.token!==null&&r.token.length>0&&(process.env.LMCTL_API_TOKEN=r.token),r}function $$(t){return t.stdout.write(["usage: lmctl code spec <task-description> [options]","","options:"," --slug S default: slugified task description",` --template W default: ${Z_}`," --from-requirement PATH skip requirement stage"," --from-plan PATH skip plan stage"," --from-design PATH skip design stage"," --project NAME override cwd project resolution"," --team NAME override project team","","interactive commands while paused:"," /done mark current Interactive stage done"," /exit leave the run paused and exit",""].join(`
1741
+ `)),0}async function L$(t,e,r){let n=null;for(let s=0;s<1e3;s+=1){let o=await vs(e,`/api/jobs/${r}/run`,"POST");if(o.run_id!==null&&(n=o.run_id),o.status==="done")return t.stdout.write(`code spec complete: run ${o.run_id??n??"(unknown)"} terminal=${o.terminal_state??"(none)"}
1742
1742
  `),o.terminal_state==="done"?0:1;if(o.status==="failed")return t.stderr.write(`code spec failed: run ${o.run_id??n??"(unknown)"} terminal=${o.terminal_state??"(none)"}
1743
- `),1;if(o.status==="paused"&&o.run_id!==null){n=o.run_id;let i=await L$(t,e,r,n);if(i!=="continue")return i;continue}await gu(1e3)}return t.stderr.write(`error: code spec polling exceeded step limit for job ${r}
1744
- `),1}async function L$(t,e,r,n){let s=await ks(e,`/api/runs/${n}`,"GET"),o=typeof s.current_state=="string"&&s.current_state.startsWith("__paused__:")?s.current_state.slice(11):null;if(o===null)return t.stderr.write(`[code spec] run ${n} paused without an Interactive state; polling will continue
1743
+ `),1;if(o.status==="paused"&&o.run_id!==null){n=o.run_id;let i=await j$(t,e,r,n);if(i!=="continue")return i;continue}await gu(1e3)}return t.stderr.write(`error: code spec polling exceeded step limit for job ${r}
1744
+ `),1}async function j$(t,e,r,n){let s=await vs(e,`/api/runs/${n}`,"GET"),o=typeof s.current_state=="string"&&s.current_state.startsWith("__paused__:")?s.current_state.slice(11):null;if(o===null)return t.stderr.write(`[code spec] run ${n} paused without an Interactive state; polling will continue
1745
1745
  `),await gu(1e3),"continue";let i=[...s.steps].reverse().find(l=>l.state_name===o);if(i===void 0)return t.stderr.write(`[code spec] paused state ${o} has no step; polling will continue
1746
1746
  `),await gu(1e3),"continue";t.stderr.write(`[code spec] interactive stage ${o}; type /done to advance or /exit to leave paused
1747
1747
  `);let a=yu.createInterface({input:t.stdin??process.stdin,terminal:!1});try{for await(let l of a){let c=l.trim();if(c==="/exit")return t.stdout.write(`code spec paused: job ${r}, run ${n}, stage ${o}
1748
- `),0;if(c==="/done")return await ks(e,`/api/interactive/${i.id}/respond`,"POST",{input:"",done:!0}),"continue";if(c.length!==0)return await ks(e,`/api/interactive/${i.id}/respond`,"POST",{input:c,done:!1}),"continue"}}finally{a.close()}return 0}async function ks(t,e,r,n){let s=new URL(e,t.baseUrl),o={Accept:"application/json"};t.token!==null&&t.token.length>0&&(o.Authorization=`Bearer ${t.token}`);let i;n!==void 0&&(i=JSON.stringify(n),o["Content-Type"]="application/json");let a=await fetch(s,{method:r,headers:o,body:i});if(!a.ok)throw new Error(`HTTP ${a.status}: ${await a.text()}`);return await a.json()}function O$(t){let e=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,60);return e.length>0?e:"spec-task"}function Q_(t){return t.stdout.write(["usage: lmctl code chat [--project P] [--team T] [--alias A]","","slash commands:"," /help show this help"," /exit exit the REPL",""].join(`
1748
+ `),0;if(c==="/done")return await vs(e,`/api/interactive/${i.id}/respond`,"POST",{input:"",done:!0}),"continue";if(c.length!==0)return await vs(e,`/api/interactive/${i.id}/respond`,"POST",{input:c,done:!1}),"continue"}}finally{a.close()}return 0}async function vs(t,e,r,n){let s=new URL(e,t.baseUrl),o={Accept:"application/json"};t.token!==null&&t.token.length>0&&(o.Authorization=`Bearer ${t.token}`);let i;n!==void 0&&(i=JSON.stringify(n),o["Content-Type"]="application/json");let a=await fetch(s,{method:r,headers:o,body:i});if(!a.ok)throw new Error(`HTTP ${a.status}: ${await a.text()}`);return await a.json()}function O$(t){let e=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,60);return e.length>0?e:"spec-task"}function Q_(t){return t.stdout.write(["usage: lmctl code chat [--project P] [--team T] [--alias A]","","slash commands:"," /help show this help"," /exit exit the REPL",""].join(`
1749
1749
  `)),0}function C$(t){t.stderr.write(`commands: /help, /exit
1750
- `)}function Ss(t,e,r){t.stdout.write(`[${e.alias}@${r.name}] > `)}function xi(t,e,r){if(r!==void 0){let a=e.findProjectByName(r);return a===null?y(t,`project not found: ${r}`):a}let n=t.cwd??process.cwd(),s;try{s=w$("git",["rev-parse","--show-toplevel"],{cwd:n,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return y(t,"not in a git repo; use --project <name>")}let o=z_(s),i=e.listProjects().find(a=>z_(a.local_path)===o);return i===void 0?y(t,"no lmctl project for this directory; create via `lmctl project create` or use --project <name>"):i}function Ai(t,e,r,n){if(n!==void 0){let o=e.findTeamByName(n);return o===null?y(t,`team not found: ${n}`):o}let s=e.getTeam(r.team_id);return s===null?y(t,`project ${r.name} has no assigned team; use --team <name>`):s}function Ri(t,e,r,n){if(n!==void 0){let o=e.findTeamMemberByAlias(r.id,n);return o===null||o.state==="retired"?y(t,`member not found: ${n}`):o}let s=eg(e.listTeamMembers(r.id)).find(o=>o.role==="agent");return s===void 0?y(t,`team ${r.name} has no active agent member; add one with \`lmctl code team add <alias> --provider <provider>\``):s}function hn(t,e,r,n){let s=xi(t,e,r);if(typeof s=="number")return s;let o=Ai(t,e,s,n);return typeof o=="number"?o:{project:s,team:o}}function eg(t){return t.filter(e=>e.state!=="retired")}async function M$(t,e,r,n){if(n.sessionid!==null&&n.sessionid.trim().length>0)return n;t.stderr.write(`[seeding ${n.alias}...]
1750
+ `)}function ks(t,e,r){t.stdout.write(`[${e.alias}@${r.name}] > `)}function xi(t,e,r){if(r!==void 0){let a=e.findProjectByName(r);return a===null?y(t,`project not found: ${r}`):a}let n=t.cwd??process.cwd(),s;try{s=w$("git",["rev-parse","--show-toplevel"],{cwd:n,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return y(t,"not in a git repo; use --project <name>")}let o=z_(s),i=e.listProjects().find(a=>z_(a.local_path)===o);return i===void 0?y(t,"no lmctl project for this directory; create via `lmctl project create` or use --project <name>"):i}function Ai(t,e,r,n){if(n!==void 0){let o=e.findTeamByName(n);return o===null?y(t,`team not found: ${n}`):o}let s=e.getTeam(r.team_id);return s===null?y(t,`project ${r.name} has no assigned team; use --team <name>`):s}function Ri(t,e,r,n){if(n!==void 0){let o=e.findTeamMemberByAlias(r.id,n);return o===null||o.state==="retired"?y(t,`member not found: ${n}`):o}let s=eg(e.listTeamMembers(r.id)).find(o=>o.role==="agent");return s===void 0?y(t,`team ${r.name} has no active agent member; add one with \`lmctl code team add <alias> --provider <provider>\``):s}function hn(t,e,r,n){let s=xi(t,e,r);if(typeof s=="number")return s;let o=Ai(t,e,s,n);return typeof o=="number"?o:{project:s,team:o}}function eg(t){return t.filter(e=>e.state!=="retired")}async function M$(t,e,r,n){if(n.sessionid!==null&&n.sessionid.trim().length>0)return n;t.stderr.write(`[seeding ${n.alias}...]
1751
1751
  `),ui(r,e),fi(r);let s=await rn({member:n,dal:e}),o=e.updateTeamMemberSession(n.id,s.sessionid);if(o===null)throw new Error(`member disappeared during seed: ${n.alias}`);let i=ln(Ae(o),s.sessionid);i!==null&&t.stderr.write(`[seeded ${o.alias}] customize/compact in its native TUI:
1752
1752
  ${i}
1753
1753
  `),await Ni({dal:e,member:o,stderr:t.stderr,baseDir:r.local_path});let a=o.role_prompt??"",l=a.length>0?`${a}
1754
1754
 
1755
- ${an}`:an;return e.setMemberPromptSnapshot(o.id,l)??o}function D$(t){return`${E$(t.local_path)}-code`}var Z_,wu=T(()=>{"use strict";ds();Xo();gs();tu();ru();Ue();Lr();_u();Te();Qc();Z_="spec-driven-task"});import rg from"jexl";function fr(t){rg.compile(ng(t))}async function Or(t,e){return rg.eval(ng(t),e)}function ng(t){return t.replace(/([A-Za-z_$][\w$.[\]]*)\.includes\(([^()]+)\)/g,"($2 in $1)")}var _n=T(()=>{"use strict"});import{z as b}from"zod";function Iu(t){let e=t.trim();return e.startsWith("={{")&&e.endsWith("}}")?e.slice(3,-2).trim():t}var P$,sg,Eu,Tu,bu,Su,ku,vu,og,F$,U$,W$,vs,B$,$i,ji,Li,Oi,Ci,ig,H$,q$,J$,X$,Mi,gn=T(()=>{"use strict";_n();P$=b.object({kind:b.enum(["success","neutral","failure"])}),sg=b.enum(["string","number","boolean","object","array"]),Eu=b.object({name:b.string().min(1),type:sg,required:b.boolean().optional(),default:b.unknown().optional(),description:b.string().optional()}),Tu=b.object({name:b.string().min(1),type:sg,source_step_id:b.string().min(1),source_field:b.string().min(1),description:b.string().optional()}),bu=b.object({id:b.string().min(1),type:b.string().min(1),parameters:b.record(b.string(),b.unknown()).default({})}),Su="__failure__",ku=b.object({tools:b.array(b.string().min(1)).optional(),auth:b.array(b.string().min(1)).optional()}).strict().optional(),vu=b.object({on_unhandled_failure:b.object({attention_kind:b.string().min(1).default("workflow_failed"),severity:b.enum(["warn","error","critical"]).default("warn"),capture_evidence:b.boolean().default(!0),recommend_recovery:b.string().min(1).optional()}).optional(),on_unhandled_failure_state:b.string().min(1).optional()}).optional(),og=b.object({type:b.literal("AssertRepoClean"),fail_message:b.string().min(1).optional(),next:b.string().min(1)}),F$=b.object({name:b.string().min(1),command:b.string().min(1).optional(),args:b.array(b.string()).optional(),env:b.record(b.string(),b.string()).optional(),type:b.enum(["stdio","http","sse"]).optional(),url:b.string().min(1).optional(),headers:b.record(b.string(),b.string()).optional()}).strict(),U$=b.union([b.string().min(1),F$]),W$=b.union([b.string().min(1),b.object({name:b.string().min(1),content:b.string().min(1)}).strict()]),vs=b.object({team:b.string().min(1),alias:b.string().min(1),prompt_template:b.string().optional(),mcp:b.array(U$).optional(),skills:b.array(W$).optional()}),B$=b.object({kind:b.literal("shell"),command:b.string().min(1),description:b.string().optional()}),$i=b.object({type:b.literal("Review"),state_name:b.string().min(1),coder:vs,pre_checks:b.array(B$).optional(),reviewers:b.array(vs.extend({rubric_artifact:b.string().optional()})).optional(),outcomes:b.object({approve:b.string().min(1),request_changes:b.string().optional(),fail_pre_check:b.string().optional(),max_loops_exceeded:b.string().optional()}),writes_to_project_path:b.boolean().optional(),durable_memory_tags:b.array(b.string().min(1)).optional(),write_back_durable_memory:b.union([b.boolean(),b.string().min(1)]).optional(),max_loops:b.number().int().positive().default(5),loop_feedback_artifact:b.string().optional(),outcomes_from_stance:b.record(b.string(),b.string().min(1)).optional()}).superRefine((t,e)=>{(t.reviewers??[]).length>0&&t.outcomes_from_stance!==void 0&&e.addIssue({code:"custom",path:["outcomes_from_stance"],message:"outcomes_from_stance cannot be used when reviewers is non-empty"})}),ji=b.object({type:b.literal("Consolidate"),state_name:b.string().min(1),researchers:b.array(vs.extend({topic:b.string().min(1)})).optional(),consolidator:vs,outcomes:b.object({ok:b.string().min(1),error:b.string().optional()}),research_artifact_prefix:b.string().optional(),durable_memory_tags:b.array(b.string().min(1)).optional(),write_back_durable_memory:b.union([b.boolean(),b.string().min(1)]).optional()}),Li=b.object({type:b.literal("Interactive"),state_name:b.string().min(1),agent:vs.extend({initial_prompt_template:b.string().min(1)}),termination:b.object({operator_signal:b.boolean().default(!0),agent_signal:b.string().optional(),max_turns:b.number().int().positive().default(20),timeout_seconds:b.number().int().positive().optional()}),outcomes:b.object({done:b.string().min(1),timeout:b.string().optional()}),artifact_name:b.string().optional(),durable_memory_tags:b.array(b.string().min(1)).optional(),write_back_durable_memory:b.union([b.boolean(),b.string().min(1)]).optional()}),Oi=b.object({type:b.literal("Loop"),state_name:b.string().min(1),over:b.string().min(1),item_var:b.string().min(1),body:b.string().min(1),outcomes:b.object({ok:b.string().min(1),error:b.string().optional()}),stop_on_error:b.boolean().default(!0),max_items:b.number().int().positive().default(1e3)}),Ci=b.object({type:b.literal("ShellStep"),state_name:b.string().min(1),command:b.string().min(1),outcomes_from_exit:b.record(b.string(),b.string().min(1)),timeout_ms:b.number().int().nonnegative().optional(),capture_output_to:b.string().optional(),writes_to_project_path:b.boolean().optional()}),ig=b.object({type:b.literal("Choice"),state_name:b.string().min(1),branches:b.array(b.object({when:b.string().min(1),next:b.string().min(1)})).default([]),default_next:b.string().min(1).optional()}).superRefine((t,e)=>{for(let[r,n]of t.branches.entries())try{fr(Iu(n.when))}catch(s){let o=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["branches",r,"when"],message:`invalid jexl expression: ${o}`})}}),H$=b.discriminatedUnion("type",[og,$i,ji,Li,Oi,Ci,ig]),q$=b.object({type:b.literal("ForEach"),state_name:b.string().min(1),items_from:b.string().min(1),mode:b.enum(["sequential","parallel"]).default("sequential"),max_concurrency:b.number().int().positive().default(1),on_item_failure:b.enum(["continue","stop"]).default("stop"),body:H$,outcomes:b.object({all_ok:b.string().min(1),any_failed:b.string().optional()})}).superRefine((t,e)=>{try{fr(Iu(t.items_from))}catch(r){let n=r instanceof Error?r.message:"invalid expression";e.addIssue({code:"custom",path:["items_from"],message:`invalid jexl expression: ${n}`})}}),J$=b.object({type:b.literal("Subflow"),state_name:b.string().min(1),workflow_name:b.string().min(1),inputs:b.record(b.string(),b.string().min(1)).optional(),outcomes:b.record(b.string(),b.string().min(1))}).superRefine((t,e)=>{for(let[r,n]of Object.entries(t.inputs??{}))try{fr(Iu(n))}catch(s){let o=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["inputs",r],message:`invalid jexl expression: ${o}`})}}),X$=b.discriminatedUnion("type",[og,$i,ji,Li,Oi,Ci,ig,q$,J$]),Mi=b.object({name:b.string().min(1),version:b.number().int().positive(),definition_schema_version:b.union([b.literal(1),b.literal(2)]),description:b.string().optional(),estimated_duration_ms:b.number().int().nonnegative().optional(),primitive_version:b.union([b.literal(1),b.literal(2)]).default(1),start_at:b.string().min(1),states:b.record(b.string().min(1),X$),terminals:b.record(b.string().min(1),P$),errors:vu,concurrency_key:b.string().min(1).optional(),concurrent_limit:b.number().int().positive().optional(),default_task_timeout_ms:b.number().int().positive().max(216e5).optional(),inputs:b.array(Eu).optional(),outputs:b.array(Tu).optional(),triggers:b.array(bu).optional(),read_only:b.boolean().optional(),requires:ku}).superRefine((t,e)=>{t.definition_schema_version===1&&t.errors!==void 0&&e.addIssue({code:"custom",path:["errors"],message:"errors block requires definition_schema_version: 2"}),t.definition_schema_version===1&&t.concurrency_key!==void 0&&e.addIssue({code:"custom",path:["concurrency_key"],message:"concurrency_key requires definition_schema_version: 2"}),t.definition_schema_version===1&&t.default_task_timeout_ms!==void 0&&e.addIssue({code:"custom",path:["default_task_timeout_ms"],message:"default_task_timeout_ms requires definition_schema_version: 2"})})});import{z}from"zod";var G$,Di,K$,V$,Y$,Nt,yn=T(()=>{"use strict";gn();G$=/^s-[a-z0-9-]+-[a-f0-9]{4}$/,Di=z.string().regex(G$),K$=z.object({step_id:Di,type:z.literal("main"),index:z.number().int().min(0)}),V$=z.record(Di,z.record(z.string().min(1),z.array(z.array(K$)))),Y$=z.object({id:Di,name:z.string().min(1),type:z.string().min(1),typeVersion:z.number().int().positive().default(1),parameters:z.record(z.string(),z.unknown()).default({}),members:z.record(z.string(),z.unknown()).optional(),estimated_duration_ms:z.number().int().nonnegative().optional()}),Nt=z.object({schema_version:z.literal("lmctl/v3"),definition_schema_version:z.literal(3),name:z.string().min(1),version:z.number().int().positive(),description:z.string().optional(),estimated_duration_ms:z.number().int().nonnegative().optional(),default_task_timeout_ms:z.number().int().positive().max(216e5).optional(),concurrency_key:z.string().min(1).optional(),concurrent_limit:z.number().int().positive().optional(),errors:vu,inputs:z.array(Eu).optional(),outputs:z.array(Tu).optional(),steps:z.array(Y$).min(1),connections:V$.default({}),entry_step_id:Di,triggers:z.array(bu).optional(),read_only:z.boolean().optional(),requires:ku}).superRefine((t,e)=>{let r=new Set;for(let[n,s]of t.steps.entries())r.has(s.id)&&e.addIssue({code:"custom",path:["steps",n,"id"],message:`duplicate step id: ${s.id}`}),r.add(s.id);r.has(t.entry_step_id)||e.addIssue({code:"custom",path:["entry_step_id"],message:`entry_step_id does not reference an existing step: ${t.entry_step_id}`});for(let[n,s]of Object.entries(t.connections)){r.has(n)||e.addIssue({code:"custom",path:["connections",n],message:`connection source does not reference an existing step: ${n}`});for(let[o,i]of Object.entries(s))for(let[a,l]of i.entries())for(let[c,u]of l.entries())r.has(u.step_id)||e.addIssue({code:"custom",path:["connections",n,o,a,c,"step_id"],message:`connection target does not reference an existing step: ${u.step_id}`})}})});function Pi(t){return xu(t)}function xu(t){if(Array.isArray(t))return t.map(xu);if(t===null||typeof t!="object")return t;let e=t,r={};for(let n of Object.keys(e))r[n]=xu(e[n]);if(typeof r.type=="string"){let n=Z$[r.type];n!==void 0&&(r.type=n)}return r}var Nu,z$,Z$,Au=T(()=>{"use strict";Nu="lmctl.builtin.",z$={Review:`${Nu}Review`,Research:`${Nu}Research`,Consolidate:`${Nu}Consolidate`},Z$=Object.fromEntries(Object.entries(z$).map(([t,e])=>[e,t]))});import{readFileSync as Q$}from"node:fs";function cg(t){return ej(t)}function ej(t){let e=Pi(nj(t));if(rj(e),ug(e)===3)return tj(e);let r=Mi.safeParse(e);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=sj(r.data);if(n.errors.length>0||n.unresolvedRefs.length>0)throw new Jt(n);return r.data}function tj(t){let e=Nt.safeParse(t);if(!e.success)throw new Jt({errors:e.error.issues.map(r=>({path:r.path.length===0?"$":r.path.map(String).join("."),message:r.message}))});return e.data}function rj(t){if(typeof t!="object"||t===null||!("definition_schema_version"in t))return;let e=ug(t);if(!(e===null||ag.includes(e)))throw new Jt({errors:[{path:"definition_schema_version",message:`unsupported definition_schema_version ${e}; supported versions: ${ag.join(", ")}`}]})}function ug(t){if(typeof t!="object"||t===null||!("definition_schema_version"in t))return null;let e=t.definition_schema_version;return typeof e=="number"?e:null}function nj(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
1756
- `)||e.startsWith("{")||e.startsWith("[")?lg(t,"$"):e.endsWith(".json")?lg(Q$(e,"utf8"),e):t}function lg(t,e){try{return JSON.parse(t)}catch(r){let n=r instanceof Error?r.message:"invalid JSON";throw new Jt({errors:[{path:e,message:`invalid JSON: ${n}`}]})}}function sj(t){let e=[],r=[],n=new Set(Object.keys(t.states));n.has(t.start_at)||r.push({state:"$",ref:t.start_at,kind:"next"}),oj(t,n,r);for(let[s,o]of Object.entries(t.states))new Set(Object.keys(t.terminals));return{errors:e,unresolvedRefs:r}}function oj(t,e,r){let n=t.errors?.on_unhandled_failure_state;n!==void 0&&(e.has(n)||r.push({state:"$",ref:n,kind:"next"}))}var ag,Jt,dg=T(()=>{"use strict";gn();yn();Au();ag=[1,2,3],Jt=class extends Error{errors;unresolvedRefs;constructor(e){super(e.message??"workflow validation failed"),this.name="WorkflowValidationError",this.errors=e.errors??[],this.unresolvedRefs=e.unresolvedRefs??[]}}});import{createHash as ij}from"node:crypto";function fg(t,e){let r=aj(e),n=ij("sha1").update(`${t}:${e}`).digest("hex").slice(0,4);return`s-${r}-${n}`}function aj(t){let e=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"step"}var mg=T(()=>{"use strict";yn()});function uj(t,e){let r=cj[t]??[],n={},s={};for(let[o,i]of Object.entries(e))r.includes(o)?s[o]=i:n[o]=i;return{params:n,members:s}}function gg(t){let e=[],r=(v,N)=>{throw new wn([{line:v,message:N}])},n=t.split(`
1757
- `),s=[];for(let v=0;v<n.length;v+=1){let j=mj(n[v]).trim();j.length>0&&s.push({n:v+1,text:j})}s.length===0&&r(1,"empty composition: expected a `workflow <name> v<version>` header");let o=/^workflow\s+(\S+)\s+v(\d+)$/.exec(s[0].text)??r(s[0].n,`expected header \`workflow <name> v<version>\`, got: ${s[0].text}`),i=o[1],a=Number.parseInt(o[2],10),l=new Map,c=[],u=[],d=[],f,m={},p=new Map,h=new Map,g=new Map,_=(v,N,j,B,F,M)=>{l.has(v)&&r(B,`duplicate step/terminal id: ${v}`),/^[A-Za-z][\w-]*$/.test(v)||r(B,`invalid id (must start with a letter): ${v}`),l.set(v,{declId:v,type:N,params:j,line:B,isTerminal:F,...M?{members:M}:{}}),u.push(v)},S=v=>{let N=[],j=v+1;for(;j<s.length;j+=1){let B=/^([A-Za-z][\w-]*|default)\s*->\s*([A-Za-z][\w-]*)$/.exec(s[j].text);if(B===null)break;N.push({label:B[1],dst:B[2]})}return{branches:N,nextIdx:j-1}};for(let v=1;v<s.length;v+=1){let{n:N,text:j}=s[v],B=j.split(/\s+/,1)[0];if(/^meta\s*\(/.test(j)){v!==1&&r(N,"`meta(...)` must be the preamble \u2014 the FIRST line after the `workflow` header (at most one, before any construct)");let F=/^meta\s*\((.*)\)\s*$/.exec(j)??r(N,`malformed \`meta\` (expected \`meta({ "requires"?:\u2026, "default_task_timeout_ms"?:\u2026, "errors"?:\u2026, "concurrency_key"?:\u2026, "concurrent_limit"?:\u2026 })\`): ${j}`),M=mr(F[1],N,r);for(let Q of Object.keys(M))hg.has(Q)||r(N,`unknown \`meta\` key \`${Q}\` \u2014 only workflow-level runtime metadata is allowed: ${[...hg].join(", ")} (no grammar inflation; bounded)`);m=M;continue}if(B==="step"){let F=/^step\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(j)??r(N,`malformed \`step\` (expected \`step <id> = <archetype>(k=v, ...)\`): ${j}`),M=F[1],Q=F[2],ye=F[3],oe=pg[Q];oe===void 0&&r(N,`unknown step type: ${Q} (supported \`step\` archetypes: ${Object.keys(pg).join(", ")}; choice/terminal/loop/foreach/call/decide have their own constructs)`);let{params:be,members:jt}=uj(oe,mr(ye,N,r));_(M,oe,be,N,!1,Object.keys(jt).length>0?jt:void 0);continue}if(B==="trigger"){let F=/^trigger\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(j)??r(N,`malformed \`trigger\` (expected \`trigger <id> = <trigger-type>({ ...json... })\`): ${j}`),M=F[1],Q=F[2],ye=F[3],oe=_g[Q];oe===void 0&&r(N,`unknown trigger type: ${Q} (registered trigger archetypes: ${Object.keys(_g).join(", ")})`),p.has(M)&&r(N,`duplicate trigger id: ${M}`),p.set(M,{id:M,type:oe,parameters:mr(ye,N,r)});continue}if(B==="mcp"||B==="skill"){let F=new RegExp(`^${B}\\s+([A-Za-z][\\w-]*)\\s*=\\s*(.+)$`).exec(j)??r(N,`malformed \`${B}\` decl (expected \`${B} <name> = {json} | ${B} <name> = "<file|url>"\`): ${j}`),M=F[1],Q=F[2].trim(),ye=B==="mcp"?h:g;ye.has(M)&&r(N,`duplicate ${B} declaration: ${M}`);let oe;if(Q.startsWith("{")){let be=mr(Q,N,r);B==="mcp"?oe={...be,name:M}:((typeof be.content!="string"||be.content.length===0)&&r(N,`\`skill ${M}\`: inline form requires a non-empty string \`content\` (a SKILL.md body)`),oe={name:M,content:be.content})}else{let be=yg(Q);(typeof be!="string"||be.length===0)&&r(N,`\`${B} ${M}\`: string form must be a non-empty file path or http(s) URL`),oe=be}ye.set(M,oe);continue}if(B==="terminal"){let F=/^terminal\s+([A-Za-z][\w-]*)\s*=\s*([A-Za-z][\w-]*)(?:\s+(success|failure|neutral))?\s*$/.exec(j)??r(N,`malformed \`terminal\` (expected \`terminal <id> = <name> [success|failure|neutral]\`): ${j}`);_(F[1],"lmctl/terminal",{name:F[2],kind:F[3]??"neutral"},N,!0);continue}if(B==="seq"){let M=j.slice(3).trim().split(/\s*(->|-[a-z0-9_]+->)\s*/).map(Q=>Q.trim()).filter(Q=>Q.length>0);(M.length<3||M.length%2===0)&&r(N,`malformed \`seq\` (expected \`<id> -> <id> [ -> <id> ... ]\`, optional \`-<port>->\`): ${j}`);for(let Q=0;Q+2<M.length+1&&!(Q+2>M.length-1);Q+=2){let ye=M[Q],oe=M[Q+1],be=M[Q+2],jt=oe==="->"?"main":oe.slice(1,-2);c.push({srcDeclId:ye,port:jt,dstDeclId:be,line:N})}continue}if(B==="choice"){let M=(/^choice\s+([A-Za-z][\w-]*)\s*:$/.exec(j)??r(N,`malformed \`choice\` (expected \`choice <id>:\` then \`when <predicate> -<port>-> <id>\` lines): ${j}`))[1],Q=[],ye,oe=v+1;for(;oe<s.length;oe+=1){let be=s[oe].text,jt=/^when\s+(.+)\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(be);if(jt!==null){ye!==void 0&&r(s[oe].n,`\`choice ${M}\`: a \`when\` branch may not follow \`default\` (branches are ordered, default is the fallback)`);let Wn=jt[2];Q.push({when:jt[1].trim(),next:`@terminal:${Wn}`}),c.push({srcDeclId:M,port:Wn,dstDeclId:jt[3],line:s[oe].n});continue}let fl=/^default\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(be);if(fl!==null){ye!==void 0&&r(s[oe].n,`\`choice ${M}\` has more than one \`default\``);let Wn=fl[1];ye=`@terminal:${Wn}`,c.push({srcDeclId:M,port:Wn,dstDeclId:fl[2],line:s[oe].n});continue}break}Q.length===0&&r(N,`\`choice ${M}\` has no \`when\` branches (need \u22651 \`when <jexl-predicate> -<port>-> <id>\`)`),_(M,"lmctl/choice",{branches:Q,...ye!==void 0?{default_next:ye}:{}},N,!1),v=oe-1;continue}if(B==="loop"){let F=/^loop\s+([A-Za-z][\w-]*)\s*=\s*loop\s*\((.*)\)\s*$/.exec(j)??r(N,`malformed \`loop\` (expected \`loop <id> = loop(k=v, ...)\`): ${j}`);_(F[1],"lmctl/loop",mr(F[2],N,r),N,!1);continue}if(B==="foreach"){let F=/^foreach\s+([A-Za-z][\w-]*)\s*=\s*foreach\s*\((.*)\)\s*$/.exec(j)??r(N,`malformed \`foreach\` (expected \`foreach <id> = foreach(items=<expr>, ...)\`): ${j}`),M=mr(F[2],N,r);"mode"in M&&r(N,"foreach is SEQUENTIAL-ONLY: `mode` is not permitted (single-thread; durable-memory/composition-language-design.md \xA7Execution model)"),_(F[1],"lmctl/foreach",M,N,!1);continue}if(B==="call"){let F=/^call\s+([A-Za-z][\w-]*)\s*=\s*call\s*\((.*)\)\s*$/.exec(j)??r(N,`malformed \`call\` (expected \`call <id> = call(workflow=<name>, ...)\`): ${j}`),M=F[1],Q=mr(F[2],N,r),ye=Q.workflow;(typeof ye!="string"||ye.length===0)&&r(N,`\`call ${M}\` requires a \`workflow=<name>\` argument`);let{workflow:oe,...be}=Q;_(M,"lmctl/subflow",{workflow_name:ye,...be},N,!1),d.push({declId:M,target:ye,line:N});continue}if(B==="decide"){let F=/^decide\s+([A-Za-z][\w-]*)\s+by\s+agent\s*\((.*)\)\s*:$/.exec(j)??r(N,`malformed \`decide\` (expected \`decide <id> by agent(k=v, ...):\`): ${j}`),M=F[1],Q=mr(F[2],N,r),{branches:ye,nextIdx:oe}=S(v);ye.length===0&&r(N,`\`decide ${M}\` has no outcomes (need at least one \`<outcome> -> <id>\`)`),_(M,"lmctl/interactive",{termination:{operator_signal:!0}},N,!1,{agent:Q});for(let be of ye)c.push({srcDeclId:M,port:be.label,dstDeclId:be.dst,line:N});v=oe;continue}if(B==="entry"){let F=/^entry\s+([A-Za-z][\w-]*)$/.exec(j)??r(N,`malformed \`entry\` (expected \`entry <id>\`): ${j}`);f!==void 0&&r(N,`duplicate \`entry\` (already set to ${f})`),f=F[1];continue}r(N,`unknown statement \`${B}\` (grammar: workflow / meta / trigger / mcp / skill / step / terminal / seq / choice / loop / foreach / call / decide / entry)`)}u.length===0&&r(s[0].n,"composition declares no steps"),f===void 0&&(f=u[0]),l.has(f)||r(s[0].n,`entry references undeclared step: ${f}`);let w=v=>{if(Array.isArray(v)){for(let j of v)w(j);return}if(typeof v!="object"||v===null)return;let N=v;if(typeof N.alias=="string")for(let[j,B]of[["mcp",h],["skills",g]]){let F=N[j];Array.isArray(F)&&(N[j]=F.map(M=>typeof M=="string"&&B.has(M)?structuredClone(B.get(M)):M))}for(let j of Object.values(N))w(j)};for(let v of u){let N=l.get(v);N.members!==void 0&&w(N.members)}let E=v=>fg(i,v),I=u.map(v=>{let N=l.get(v);return{id:E(v),name:v,type:N.type,typeVersion:1,parameters:N.params,...N.members?{members:N.members}:{}}}),x={};for(let v of c){l.has(v.srcDeclId)||r(v.line,`edge source references undeclared step: ${v.srcDeclId}`),l.has(v.dstDeclId)||r(v.line,`dangling edge target: ${v.dstDeclId} is not declared`),l.get(v.srcDeclId).isTerminal&&r(v.line,`terminal \`${v.srcDeclId}\` cannot have an outgoing edge`);let N=E(v.srcDeclId);x[N]??={},x[N][v.port]!==void 0&&r(v.line,`duplicate edge port \`${v.port}\` on step \`${v.srcDeclId}\``),x[N][v.port]=[[{step_id:E(v.dstDeclId),type:"main",index:0}]]}for(let v of u){let N=l.get(v);dj.has(N.type)||r(N.line,`unknown archetype \`${N.type}\` for step \`${v}\` \u2014 not a registered builtin (src/engine/archetypes/index.ts:17-32)`)}for(let v of d)v.target===i&&r(v.line,`subflow cycle: \`call ${v.declId}\` invokes this workflow (\`${i}\`) \u2014 direct recursion is not allowed (cross-workflow A\u2192B\u2192A cycle detection is deferred to the M3 compile.ts seam)`);let H=new Map;for(let v of c){let N=H.get(v.srcDeclId);N===void 0?H.set(v.srcDeclId,[v.dstDeclId]):N.push(v.dstDeclId)}for(let v of u){let N=l.get(v);if(N.type!=="lmctl/loop")continue;let j=N.params.body;if(typeof j=="string"&&l.has(j)){let B=H.get(v);B===void 0?H.set(v,[j]):B.push(j)}}let ue=new Set([f]),q=[f];for(;q.length>0;){let v=q.shift();for(let N of H.get(v)??[])ue.has(N)||(ue.add(N),q.push(N))}for(let v of u)ue.has(v)||r(l.get(v).line,`step \`${v}\` is unreachable from entry \`${f}\``);let P=new Map;for(let v of c){let N=P.get(v.srcDeclId);N===void 0&&(N=new Set,P.set(v.srcDeclId,N)),N.add(v.port)}let R=new Set(["approve","request_changes","fail_pre_check","max_loops_exceeded"]);for(let v of u){let N=l.get(v);if(N.isTerminal)continue;let j=P.get(v)??new Set;if(N.type==="lmctl/review"){let F=[...j].some(M=>!R.has(M));!j.has("approve")&&!F&&r(N.line,`uncovered outcome: review step \`${v}\` wires neither \`approve\` nor any stance outcome \u2014 route \`approve\` (\`seq ${v} -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 B=fj[N.type];if(B!==void 0)for(let F of B)j.has(F)||r(N.line,`uncovered outcome: required outcome \`${F}\` of step \`${v}\` (\`${N.type}\`) has no connection \u2014 route it (\`seq ${v} -${F}-> <target|terminal>\`)`);else j.size===0&&r(N.line,`uncovered outcome: non-terminal step \`${v}\` (\`${N.type}\`) has no outgoing connection \u2014 wire it with \`seq\` or route to a \`terminal\``)}for(let v of u){let N=l.get(v),j=lj[N.type];if(j===void 0)continue;let B={...N.params,...N.members??{},type:j.v2type,state_name:v,...Object.keys(j.outcomes).length>0?{outcomes:j.outcomes}:{}},F=j.schema.safeParse(B);if(!F.success){let M=F.error.issues[0],Q=M.path.length===0?"$":M.path.map(String).join(".");r(N.line,`step \`${v}\` (\`${N.type}\`) has invalid params for archetype \`${j.v2type}\` at \`${Q}\`: ${M.message} \u2014 this would crash the engine (it derefs this field unguarded). Provide it via the structured form: \`step ${v} = ${N.type.replace("lmctl/","")}({ ... })\``)}}let ee={schema_version:"lmctl/v3",definition_schema_version:3,name:i,version:a,...m,...p.size>0?{triggers:[...p.values()]}:{},steps:I,connections:x,entry_step_id:E(f)},J=Nt.safeParse(ee);if(!J.success)throw new wn(J.error.issues.map(v=>({line:s[0].n,message:`emitted V3 invalid at ${v.path.length===0?"$":v.path.map(String).join(".")}: ${v.message}`})));return J.data}function mj(t){let e=null;for(let r=0;r<t.length;r+=1){let n=t[r];if(e!==null){if(n==="\\"){r+=1;continue}n===e&&(e=null);continue}if(n==='"'||n==="'"){e=n;continue}if(n==="#")return t.slice(0,r)}return t}function mr(t,e,r){let n=t.trim();if(n.length===0)return{};if(n.startsWith("{")){let o;try{o=JSON.parse(n)}catch(i){r(e,`malformed structured args (expected a single-line JSON object): ${i.message}`)}return(o===null||typeof o!="object"||Array.isArray(o))&&r(e,"structured args must be a JSON object"),o}let s={};for(let o of pj(n)){let i=o.indexOf("=");i===-1&&r(e,`malformed arg (expected k=v): ${o}`);let a=o.slice(0,i).trim(),l=o.slice(i+1).trim();/^[A-Za-z_][\w-]*$/.test(a)||r(e,`invalid arg name: ${a}`),s[a]=yg(l)}return s}function pj(t){return t.split(",").map(e=>e.trim()).filter(e=>e.length>0)}function yg(t){return t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'")?t.slice(1,-1):t==="true"?!0:t==="false"?!1:/^-?\d+$/.test(t)?Number.parseInt(t,10):/^-?\d*\.\d+$/.test(t)?Number.parseFloat(t):t}var lj,cj,pg,wn,dj,fj,hg,_g,wg=T(()=>{"use strict";yn();mg();gn();lj={"lmctl/review":{v2type:"Review",outcomes:{approve:"_"},schema:$i},"lmctl/consolidate":{v2type:"Consolidate",outcomes:{ok:"_"},schema:ji},"lmctl/interactive":{v2type:"Interactive",outcomes:{done:"_"},schema:Li},"lmctl/loop":{v2type:"Loop",outcomes:{ok:"_"},schema:Oi},"lmctl/shell-step":{v2type:"ShellStep",outcomes:{},schema:Ci}},cj={"lmctl/review":["coder","reviewers"],"lmctl/consolidate":["researchers","consolidator"],"lmctl/interactive":["agent"]};pg={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"},wn=class extends Error{issues;constructor(e){super(`composition DSL compile failed:
1755
+ ${an}`:an;return e.setMemberPromptSnapshot(o.id,l)??o}function D$(t){return`${E$(t.local_path)}-code`}var Z_,wu=T(()=>{"use strict";fs();Xo();ys();tu();ru();Ue();jr();_u();Te();Qc();Z_="spec-driven-task"});import rg from"jexl";function fr(t){rg.compile(ng(t))}async function Or(t,e){return rg.eval(ng(t),e)}function ng(t){return t.replace(/([A-Za-z_$][\w$.[\]]*)\.includes\(([^()]+)\)/g,"($2 in $1)")}var _n=T(()=>{"use strict"});import{z as b}from"zod";function Iu(t){let e=t.trim();return e.startsWith("={{")&&e.endsWith("}}")?e.slice(3,-2).trim():t}var P$,sg,Eu,Tu,bu,Su,ku,vu,og,F$,U$,W$,Is,B$,$i,Li,ji,Oi,Ci,ig,H$,q$,J$,X$,Mi,gn=T(()=>{"use strict";_n();P$=b.object({kind:b.enum(["success","neutral","failure"])}),sg=b.enum(["string","number","boolean","object","array"]),Eu=b.object({name:b.string().min(1),type:sg,required:b.boolean().optional(),default:b.unknown().optional(),description:b.string().optional()}),Tu=b.object({name:b.string().min(1),type:sg,source_step_id:b.string().min(1),source_field:b.string().min(1),description:b.string().optional()}),bu=b.object({id:b.string().min(1),type:b.string().min(1),parameters:b.record(b.string(),b.unknown()).default({})}),Su="__failure__",ku=b.object({tools:b.array(b.string().min(1)).optional(),auth:b.array(b.string().min(1)).optional()}).strict().optional(),vu=b.object({on_unhandled_failure:b.object({attention_kind:b.string().min(1).default("workflow_failed"),severity:b.enum(["warn","error","critical"]).default("warn"),capture_evidence:b.boolean().default(!0),recommend_recovery:b.string().min(1).optional()}).optional(),on_unhandled_failure_state:b.string().min(1).optional()}).optional(),og=b.object({type:b.literal("AssertRepoClean"),fail_message:b.string().min(1).optional(),next:b.string().min(1)}),F$=b.object({name:b.string().min(1),command:b.string().min(1).optional(),args:b.array(b.string()).optional(),env:b.record(b.string(),b.string()).optional(),type:b.enum(["stdio","http","sse"]).optional(),url:b.string().min(1).optional(),headers:b.record(b.string(),b.string()).optional()}).strict(),U$=b.union([b.string().min(1),F$]),W$=b.union([b.string().min(1),b.object({name:b.string().min(1),content:b.string().min(1)}).strict()]),Is=b.object({team:b.string().min(1),alias:b.string().min(1),prompt_template:b.string().optional(),mcp:b.array(U$).optional(),skills:b.array(W$).optional()}),B$=b.object({kind:b.literal("shell"),command:b.string().min(1),description:b.string().optional()}),$i=b.object({type:b.literal("Review"),state_name:b.string().min(1),coder:Is,pre_checks:b.array(B$).optional(),reviewers:b.array(Is.extend({rubric_artifact:b.string().optional()})).optional(),outcomes:b.object({approve:b.string().min(1),request_changes:b.string().optional(),fail_pre_check:b.string().optional(),max_loops_exceeded:b.string().optional()}),writes_to_project_path:b.boolean().optional(),durable_memory_tags:b.array(b.string().min(1)).optional(),write_back_durable_memory:b.union([b.boolean(),b.string().min(1)]).optional(),max_loops:b.number().int().positive().default(5),loop_feedback_artifact:b.string().optional(),outcomes_from_stance:b.record(b.string(),b.string().min(1)).optional()}).superRefine((t,e)=>{(t.reviewers??[]).length>0&&t.outcomes_from_stance!==void 0&&e.addIssue({code:"custom",path:["outcomes_from_stance"],message:"outcomes_from_stance cannot be used when reviewers is non-empty"})}),Li=b.object({type:b.literal("Consolidate"),state_name:b.string().min(1),researchers:b.array(Is.extend({topic:b.string().min(1)})).optional(),consolidator:Is,outcomes:b.object({ok:b.string().min(1),error:b.string().optional()}),research_artifact_prefix:b.string().optional(),durable_memory_tags:b.array(b.string().min(1)).optional(),write_back_durable_memory:b.union([b.boolean(),b.string().min(1)]).optional()}),ji=b.object({type:b.literal("Interactive"),state_name:b.string().min(1),agent:Is.extend({initial_prompt_template:b.string().min(1)}),termination:b.object({operator_signal:b.boolean().default(!0),agent_signal:b.string().optional(),max_turns:b.number().int().positive().default(20),timeout_seconds:b.number().int().positive().optional()}),outcomes:b.object({done:b.string().min(1),timeout:b.string().optional()}),artifact_name:b.string().optional(),durable_memory_tags:b.array(b.string().min(1)).optional(),write_back_durable_memory:b.union([b.boolean(),b.string().min(1)]).optional()}),Oi=b.object({type:b.literal("Loop"),state_name:b.string().min(1),over:b.string().min(1),item_var:b.string().min(1),body:b.string().min(1),outcomes:b.object({ok:b.string().min(1),error:b.string().optional()}),stop_on_error:b.boolean().default(!0),max_items:b.number().int().positive().default(1e3)}),Ci=b.object({type:b.literal("ShellStep"),state_name:b.string().min(1),command:b.string().min(1),outcomes_from_exit:b.record(b.string(),b.string().min(1)),timeout_ms:b.number().int().nonnegative().optional(),capture_output_to:b.string().optional(),writes_to_project_path:b.boolean().optional()}),ig=b.object({type:b.literal("Choice"),state_name:b.string().min(1),branches:b.array(b.object({when:b.string().min(1),next:b.string().min(1)})).default([]),default_next:b.string().min(1).optional()}).superRefine((t,e)=>{for(let[r,n]of t.branches.entries())try{fr(Iu(n.when))}catch(s){let o=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["branches",r,"when"],message:`invalid jexl expression: ${o}`})}}),H$=b.discriminatedUnion("type",[og,$i,Li,ji,Oi,Ci,ig]),q$=b.object({type:b.literal("ForEach"),state_name:b.string().min(1),items_from:b.string().min(1),mode:b.enum(["sequential","parallel"]).default("sequential"),max_concurrency:b.number().int().positive().default(1),on_item_failure:b.enum(["continue","stop"]).default("stop"),body:H$,outcomes:b.object({all_ok:b.string().min(1),any_failed:b.string().optional()})}).superRefine((t,e)=>{try{fr(Iu(t.items_from))}catch(r){let n=r instanceof Error?r.message:"invalid expression";e.addIssue({code:"custom",path:["items_from"],message:`invalid jexl expression: ${n}`})}}),J$=b.object({type:b.literal("Subflow"),state_name:b.string().min(1),workflow_name:b.string().min(1),inputs:b.record(b.string(),b.string().min(1)).optional(),outcomes:b.record(b.string(),b.string().min(1))}).superRefine((t,e)=>{for(let[r,n]of Object.entries(t.inputs??{}))try{fr(Iu(n))}catch(s){let o=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["inputs",r],message:`invalid jexl expression: ${o}`})}}),X$=b.discriminatedUnion("type",[og,$i,Li,ji,Oi,Ci,ig,q$,J$]),Mi=b.object({name:b.string().min(1),version:b.number().int().positive(),definition_schema_version:b.union([b.literal(1),b.literal(2)]),description:b.string().optional(),estimated_duration_ms:b.number().int().nonnegative().optional(),primitive_version:b.union([b.literal(1),b.literal(2)]).default(1),start_at:b.string().min(1),states:b.record(b.string().min(1),X$),terminals:b.record(b.string().min(1),P$),errors:vu,concurrency_key:b.string().min(1).optional(),concurrent_limit:b.number().int().positive().optional(),default_task_timeout_ms:b.number().int().positive().max(216e5).optional(),inputs:b.array(Eu).optional(),outputs:b.array(Tu).optional(),triggers:b.array(bu).optional(),read_only:b.boolean().optional(),requires:ku}).superRefine((t,e)=>{t.definition_schema_version===1&&t.errors!==void 0&&e.addIssue({code:"custom",path:["errors"],message:"errors block requires definition_schema_version: 2"}),t.definition_schema_version===1&&t.concurrency_key!==void 0&&e.addIssue({code:"custom",path:["concurrency_key"],message:"concurrency_key requires definition_schema_version: 2"}),t.definition_schema_version===1&&t.default_task_timeout_ms!==void 0&&e.addIssue({code:"custom",path:["default_task_timeout_ms"],message:"default_task_timeout_ms requires definition_schema_version: 2"})})});import{z}from"zod";var G$,Di,K$,V$,Y$,Nt,yn=T(()=>{"use strict";gn();G$=/^s-[a-z0-9-]+-[a-f0-9]{4}$/,Di=z.string().regex(G$),K$=z.object({step_id:Di,type:z.literal("main"),index:z.number().int().min(0)}),V$=z.record(Di,z.record(z.string().min(1),z.array(z.array(K$)))),Y$=z.object({id:Di,name:z.string().min(1),type:z.string().min(1),typeVersion:z.number().int().positive().default(1),parameters:z.record(z.string(),z.unknown()).default({}),members:z.record(z.string(),z.unknown()).optional(),estimated_duration_ms:z.number().int().nonnegative().optional()}),Nt=z.object({schema_version:z.literal("lmctl/v3"),definition_schema_version:z.literal(3),name:z.string().min(1),version:z.number().int().positive(),description:z.string().optional(),estimated_duration_ms:z.number().int().nonnegative().optional(),default_task_timeout_ms:z.number().int().positive().max(216e5).optional(),concurrency_key:z.string().min(1).optional(),concurrent_limit:z.number().int().positive().optional(),errors:vu,inputs:z.array(Eu).optional(),outputs:z.array(Tu).optional(),steps:z.array(Y$).min(1),connections:V$.default({}),entry_step_id:Di,triggers:z.array(bu).optional(),read_only:z.boolean().optional(),requires:ku}).superRefine((t,e)=>{let r=new Set;for(let[n,s]of t.steps.entries())r.has(s.id)&&e.addIssue({code:"custom",path:["steps",n,"id"],message:`duplicate step id: ${s.id}`}),r.add(s.id);r.has(t.entry_step_id)||e.addIssue({code:"custom",path:["entry_step_id"],message:`entry_step_id does not reference an existing step: ${t.entry_step_id}`});for(let[n,s]of Object.entries(t.connections)){r.has(n)||e.addIssue({code:"custom",path:["connections",n],message:`connection source does not reference an existing step: ${n}`});for(let[o,i]of Object.entries(s))for(let[a,l]of i.entries())for(let[c,u]of l.entries())r.has(u.step_id)||e.addIssue({code:"custom",path:["connections",n,o,a,c,"step_id"],message:`connection target does not reference an existing step: ${u.step_id}`})}})});function Pi(t){return xu(t)}function xu(t){if(Array.isArray(t))return t.map(xu);if(t===null||typeof t!="object")return t;let e=t,r={};for(let n of Object.keys(e))r[n]=xu(e[n]);if(typeof r.type=="string"){let n=Z$[r.type];n!==void 0&&(r.type=n)}return r}var Nu,z$,Z$,Au=T(()=>{"use strict";Nu="lmctl.builtin.",z$={Review:`${Nu}Review`,Research:`${Nu}Research`,Consolidate:`${Nu}Consolidate`},Z$=Object.fromEntries(Object.entries(z$).map(([t,e])=>[e,t]))});import{readFileSync as Q$}from"node:fs";function cg(t){return eL(t)}function eL(t){let e=Pi(nL(t));if(rL(e),ug(e)===3)return tL(e);let r=Mi.safeParse(e);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=sL(r.data);if(n.errors.length>0||n.unresolvedRefs.length>0)throw new Jt(n);return r.data}function tL(t){let e=Nt.safeParse(t);if(!e.success)throw new Jt({errors:e.error.issues.map(r=>({path:r.path.length===0?"$":r.path.map(String).join("."),message:r.message}))});return e.data}function rL(t){if(typeof t!="object"||t===null||!("definition_schema_version"in t))return;let e=ug(t);if(!(e===null||ag.includes(e)))throw new Jt({errors:[{path:"definition_schema_version",message:`unsupported definition_schema_version ${e}; supported versions: ${ag.join(", ")}`}]})}function ug(t){if(typeof t!="object"||t===null||!("definition_schema_version"in t))return null;let e=t.definition_schema_version;return typeof e=="number"?e:null}function nL(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
1756
+ `)||e.startsWith("{")||e.startsWith("[")?lg(t,"$"):e.endsWith(".json")?lg(Q$(e,"utf8"),e):t}function lg(t,e){try{return JSON.parse(t)}catch(r){let n=r instanceof Error?r.message:"invalid JSON";throw new Jt({errors:[{path:e,message:`invalid JSON: ${n}`}]})}}function sL(t){let e=[],r=[],n=new Set(Object.keys(t.states));n.has(t.start_at)||r.push({state:"$",ref:t.start_at,kind:"next"}),oL(t,n,r);for(let[s,o]of Object.entries(t.states))new Set(Object.keys(t.terminals));return{errors:e,unresolvedRefs:r}}function oL(t,e,r){let n=t.errors?.on_unhandled_failure_state;n!==void 0&&(e.has(n)||r.push({state:"$",ref:n,kind:"next"}))}var ag,Jt,dg=T(()=>{"use strict";gn();yn();Au();ag=[1,2,3],Jt=class extends Error{errors;unresolvedRefs;constructor(e){super(e.message??"workflow validation failed"),this.name="WorkflowValidationError",this.errors=e.errors??[],this.unresolvedRefs=e.unresolvedRefs??[]}}});import{createHash as iL}from"node:crypto";function fg(t,e){let r=aL(e),n=iL("sha1").update(`${t}:${e}`).digest("hex").slice(0,4);return`s-${r}-${n}`}function aL(t){let e=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"step"}var mg=T(()=>{"use strict";yn()});function uL(t,e){let r=cL[t]??[],n={},s={};for(let[o,i]of Object.entries(e))r.includes(o)?s[o]=i:n[o]=i;return{params:n,members:s}}function gg(t){let e=[],r=(v,N)=>{throw new wn([{line:v,message:N}])},n=t.split(`
1757
+ `),s=[];for(let v=0;v<n.length;v+=1){let L=mL(n[v]).trim();L.length>0&&s.push({n:v+1,text:L})}s.length===0&&r(1,"empty composition: expected a `workflow <name> v<version>` header");let o=/^workflow\s+(\S+)\s+v(\d+)$/.exec(s[0].text)??r(s[0].n,`expected header \`workflow <name> v<version>\`, got: ${s[0].text}`),i=o[1],a=Number.parseInt(o[2],10),l=new Map,c=[],u=[],d=[],f,m={},p=new Map,h=new Map,g=new Map,_=(v,N,L,B,F,M)=>{l.has(v)&&r(B,`duplicate step/terminal id: ${v}`),/^[A-Za-z][\w-]*$/.test(v)||r(B,`invalid id (must start with a letter): ${v}`),l.set(v,{declId:v,type:N,params:L,line:B,isTerminal:F,...M?{members:M}:{}}),u.push(v)},S=v=>{let N=[],L=v+1;for(;L<s.length;L+=1){let B=/^([A-Za-z][\w-]*|default)\s*->\s*([A-Za-z][\w-]*)$/.exec(s[L].text);if(B===null)break;N.push({label:B[1],dst:B[2]})}return{branches:N,nextIdx:L-1}};for(let v=1;v<s.length;v+=1){let{n:N,text:L}=s[v],B=L.split(/\s+/,1)[0];if(/^meta\s*\(/.test(L)){v!==1&&r(N,"`meta(...)` must be the preamble \u2014 the FIRST line after the `workflow` header (at most one, before any construct)");let F=/^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}`),M=mr(F[1],N,r);for(let Q of Object.keys(M))hg.has(Q)||r(N,`unknown \`meta\` key \`${Q}\` \u2014 only workflow-level runtime metadata is allowed: ${[...hg].join(", ")} (no grammar inflation; bounded)`);m=M;continue}if(B==="step"){let F=/^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}`),M=F[1],Q=F[2],ye=F[3],oe=pg[Q];oe===void 0&&r(N,`unknown step type: ${Q} (supported \`step\` archetypes: ${Object.keys(pg).join(", ")}; choice/terminal/loop/foreach/call/decide have their own constructs)`);let{params:be,members:Lt}=uL(oe,mr(ye,N,r));_(M,oe,be,N,!1,Object.keys(Lt).length>0?Lt:void 0);continue}if(B==="trigger"){let F=/^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}`),M=F[1],Q=F[2],ye=F[3],oe=_g[Q];oe===void 0&&r(N,`unknown trigger type: ${Q} (registered trigger archetypes: ${Object.keys(_g).join(", ")})`),p.has(M)&&r(N,`duplicate trigger id: ${M}`),p.set(M,{id:M,type:oe,parameters:mr(ye,N,r)});continue}if(B==="mcp"||B==="skill"){let F=new RegExp(`^${B}\\s+([A-Za-z][\\w-]*)\\s*=\\s*(.+)$`).exec(L)??r(N,`malformed \`${B}\` decl (expected \`${B} <name> = {json} | ${B} <name> = "<file|url>"\`): ${L}`),M=F[1],Q=F[2].trim(),ye=B==="mcp"?h:g;ye.has(M)&&r(N,`duplicate ${B} declaration: ${M}`);let oe;if(Q.startsWith("{")){let be=mr(Q,N,r);B==="mcp"?oe={...be,name:M}:((typeof be.content!="string"||be.content.length===0)&&r(N,`\`skill ${M}\`: inline form requires a non-empty string \`content\` (a SKILL.md body)`),oe={name:M,content:be.content})}else{let be=yg(Q);(typeof be!="string"||be.length===0)&&r(N,`\`${B} ${M}\`: string form must be a non-empty file path or http(s) URL`),oe=be}ye.set(M,oe);continue}if(B==="terminal"){let F=/^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}`);_(F[1],"lmctl/terminal",{name:F[2],kind:F[3]??"neutral"},N,!0);continue}if(B==="seq"){let M=L.slice(3).trim().split(/\s*(->|-[a-z0-9_]+->)\s*/).map(Q=>Q.trim()).filter(Q=>Q.length>0);(M.length<3||M.length%2===0)&&r(N,`malformed \`seq\` (expected \`<id> -> <id> [ -> <id> ... ]\`, optional \`-<port>->\`): ${L}`);for(let Q=0;Q+2<M.length+1&&!(Q+2>M.length-1);Q+=2){let ye=M[Q],oe=M[Q+1],be=M[Q+2],Lt=oe==="->"?"main":oe.slice(1,-2);c.push({srcDeclId:ye,port:Lt,dstDeclId:be,line:N})}continue}if(B==="choice"){let M=(/^choice\s+([A-Za-z][\w-]*)\s*:$/.exec(L)??r(N,`malformed \`choice\` (expected \`choice <id>:\` then \`when <predicate> -<port>-> <id>\` lines): ${L}`))[1],Q=[],ye,oe=v+1;for(;oe<s.length;oe+=1){let be=s[oe].text,Lt=/^when\s+(.+)\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(be);if(Lt!==null){ye!==void 0&&r(s[oe].n,`\`choice ${M}\`: a \`when\` branch may not follow \`default\` (branches are ordered, default is the fallback)`);let Wn=Lt[2];Q.push({when:Lt[1].trim(),next:`@terminal:${Wn}`}),c.push({srcDeclId:M,port:Wn,dstDeclId:Lt[3],line:s[oe].n});continue}let fl=/^default\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(be);if(fl!==null){ye!==void 0&&r(s[oe].n,`\`choice ${M}\` has more than one \`default\``);let Wn=fl[1];ye=`@terminal:${Wn}`,c.push({srcDeclId:M,port:Wn,dstDeclId:fl[2],line:s[oe].n});continue}break}Q.length===0&&r(N,`\`choice ${M}\` has no \`when\` branches (need \u22651 \`when <jexl-predicate> -<port>-> <id>\`)`),_(M,"lmctl/choice",{branches:Q,...ye!==void 0?{default_next:ye}:{}},N,!1),v=oe-1;continue}if(B==="loop"){let F=/^loop\s+([A-Za-z][\w-]*)\s*=\s*loop\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`loop\` (expected \`loop <id> = loop(k=v, ...)\`): ${L}`);_(F[1],"lmctl/loop",mr(F[2],N,r),N,!1);continue}if(B==="foreach"){let F=/^foreach\s+([A-Za-z][\w-]*)\s*=\s*foreach\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`foreach\` (expected \`foreach <id> = foreach(items=<expr>, ...)\`): ${L}`),M=mr(F[2],N,r);"mode"in M&&r(N,"foreach is SEQUENTIAL-ONLY: `mode` is not permitted (single-thread; durable-memory/composition-language-design.md \xA7Execution model)"),_(F[1],"lmctl/foreach",M,N,!1);continue}if(B==="call"){let F=/^call\s+([A-Za-z][\w-]*)\s*=\s*call\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`call\` (expected \`call <id> = call(workflow=<name>, ...)\`): ${L}`),M=F[1],Q=mr(F[2],N,r),ye=Q.workflow;(typeof ye!="string"||ye.length===0)&&r(N,`\`call ${M}\` requires a \`workflow=<name>\` argument`);let{workflow:oe,...be}=Q;_(M,"lmctl/subflow",{workflow_name:ye,...be},N,!1),d.push({declId:M,target:ye,line:N});continue}if(B==="decide"){let F=/^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}`),M=F[1],Q=mr(F[2],N,r),{branches:ye,nextIdx:oe}=S(v);ye.length===0&&r(N,`\`decide ${M}\` has no outcomes (need at least one \`<outcome> -> <id>\`)`),_(M,"lmctl/interactive",{termination:{operator_signal:!0}},N,!1,{agent:Q});for(let be of ye)c.push({srcDeclId:M,port:be.label,dstDeclId:be.dst,line:N});v=oe;continue}if(B==="entry"){let F=/^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=F[1];continue}r(N,`unknown statement \`${B}\` (grammar: workflow / meta / trigger / mcp / skill / step / terminal / seq / choice / loop / foreach / call / decide / entry)`)}u.length===0&&r(s[0].n,"composition declares no steps"),f===void 0&&(f=u[0]),l.has(f)||r(s[0].n,`entry references undeclared step: ${f}`);let w=v=>{if(Array.isArray(v)){for(let L of v)w(L);return}if(typeof v!="object"||v===null)return;let N=v;if(typeof N.alias=="string")for(let[L,B]of[["mcp",h],["skills",g]]){let F=N[L];Array.isArray(F)&&(N[L]=F.map(M=>typeof M=="string"&&B.has(M)?structuredClone(B.get(M)):M))}for(let L of Object.values(N))w(L)};for(let v of u){let N=l.get(v);N.members!==void 0&&w(N.members)}let E=v=>fg(i,v),I=u.map(v=>{let N=l.get(v);return{id:E(v),name:v,type:N.type,typeVersion:1,parameters:N.params,...N.members?{members:N.members}:{}}}),x={};for(let v of c){l.has(v.srcDeclId)||r(v.line,`edge source references undeclared step: ${v.srcDeclId}`),l.has(v.dstDeclId)||r(v.line,`dangling edge target: ${v.dstDeclId} is not declared`),l.get(v.srcDeclId).isTerminal&&r(v.line,`terminal \`${v.srcDeclId}\` cannot have an outgoing edge`);let N=E(v.srcDeclId);x[N]??={},x[N][v.port]!==void 0&&r(v.line,`duplicate edge port \`${v.port}\` on step \`${v.srcDeclId}\``),x[N][v.port]=[[{step_id:E(v.dstDeclId),type:"main",index:0}]]}for(let v of u){let N=l.get(v);dL.has(N.type)||r(N.line,`unknown archetype \`${N.type}\` for step \`${v}\` \u2014 not a registered builtin (src/engine/archetypes/index.ts:17-32)`)}for(let v of d)v.target===i&&r(v.line,`subflow cycle: \`call ${v.declId}\` invokes this workflow (\`${i}\`) \u2014 direct recursion is not allowed (cross-workflow A\u2192B\u2192A cycle detection is deferred to the M3 compile.ts seam)`);let H=new Map;for(let v of c){let N=H.get(v.srcDeclId);N===void 0?H.set(v.srcDeclId,[v.dstDeclId]):N.push(v.dstDeclId)}for(let v of u){let N=l.get(v);if(N.type!=="lmctl/loop")continue;let L=N.params.body;if(typeof L=="string"&&l.has(L)){let B=H.get(v);B===void 0?H.set(v,[L]):B.push(L)}}let ue=new Set([f]),q=[f];for(;q.length>0;){let v=q.shift();for(let N of H.get(v)??[])ue.has(N)||(ue.add(N),q.push(N))}for(let v of u)ue.has(v)||r(l.get(v).line,`step \`${v}\` is unreachable from entry \`${f}\``);let P=new Map;for(let v of c){let N=P.get(v.srcDeclId);N===void 0&&(N=new Set,P.set(v.srcDeclId,N)),N.add(v.port)}let R=new Set(["approve","request_changes","fail_pre_check","max_loops_exceeded"]);for(let v of u){let N=l.get(v);if(N.isTerminal)continue;let L=P.get(v)??new Set;if(N.type==="lmctl/review"){let F=[...L].some(M=>!R.has(M));!L.has("approve")&&!F&&r(N.line,`uncovered outcome: review step \`${v}\` wires neither \`approve\` nor any stance outcome \u2014 route \`approve\` (\`seq ${v} -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 B=fL[N.type];if(B!==void 0)for(let F of B)L.has(F)||r(N.line,`uncovered outcome: required outcome \`${F}\` of step \`${v}\` (\`${N.type}\`) has no connection \u2014 route it (\`seq ${v} -${F}-> <target|terminal>\`)`);else L.size===0&&r(N.line,`uncovered outcome: non-terminal step \`${v}\` (\`${N.type}\`) has no outgoing connection \u2014 wire it with \`seq\` or route to a \`terminal\``)}for(let v of u){let N=l.get(v),L=lL[N.type];if(L===void 0)continue;let B={...N.params,...N.members??{},type:L.v2type,state_name:v,...Object.keys(L.outcomes).length>0?{outcomes:L.outcomes}:{}},F=L.schema.safeParse(B);if(!F.success){let M=F.error.issues[0],Q=M.path.length===0?"$":M.path.map(String).join(".");r(N.line,`step \`${v}\` (\`${N.type}\`) has invalid params for archetype \`${L.v2type}\` at \`${Q}\`: ${M.message} \u2014 this would crash the engine (it derefs this field unguarded). Provide it via the structured form: \`step ${v} = ${N.type.replace("lmctl/","")}({ ... })\``)}}let ee={schema_version:"lmctl/v3",definition_schema_version:3,name:i,version:a,...m,...p.size>0?{triggers:[...p.values()]}:{},steps:I,connections:x,entry_step_id:E(f)},J=Nt.safeParse(ee);if(!J.success)throw new wn(J.error.issues.map(v=>({line:s[0].n,message:`emitted V3 invalid at ${v.path.length===0?"$":v.path.map(String).join(".")}: ${v.message}`})));return J.data}function mL(t){let e=null;for(let r=0;r<t.length;r+=1){let n=t[r];if(e!==null){if(n==="\\"){r+=1;continue}n===e&&(e=null);continue}if(n==='"'||n==="'"){e=n;continue}if(n==="#")return t.slice(0,r)}return t}function mr(t,e,r){let n=t.trim();if(n.length===0)return{};if(n.startsWith("{")){let o;try{o=JSON.parse(n)}catch(i){r(e,`malformed structured args (expected a single-line JSON object): ${i.message}`)}return(o===null||typeof o!="object"||Array.isArray(o))&&r(e,"structured args must be a JSON object"),o}let s={};for(let o of pL(n)){let i=o.indexOf("=");i===-1&&r(e,`malformed arg (expected k=v): ${o}`);let a=o.slice(0,i).trim(),l=o.slice(i+1).trim();/^[A-Za-z_][\w-]*$/.test(a)||r(e,`invalid arg name: ${a}`),s[a]=yg(l)}return s}function pL(t){return t.split(",").map(e=>e.trim()).filter(e=>e.length>0)}function yg(t){return t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'")?t.slice(1,-1):t==="true"?!0:t==="false"?!1:/^-?\d+$/.test(t)?Number.parseInt(t,10):/^-?\d*\.\d+$/.test(t)?Number.parseFloat(t):t}var lL,cL,pg,wn,dL,fL,hg,_g,wg=T(()=>{"use strict";yn();mg();gn();lL={"lmctl/review":{v2type:"Review",outcomes:{approve:"_"},schema:$i},"lmctl/consolidate":{v2type:"Consolidate",outcomes:{ok:"_"},schema:Li},"lmctl/interactive":{v2type:"Interactive",outcomes:{done:"_"},schema:ji},"lmctl/loop":{v2type:"Loop",outcomes:{ok:"_"},schema:Oi},"lmctl/shell-step":{v2type:"ShellStep",outcomes:{},schema:Ci}},cL={"lmctl/review":["coder","reviewers"],"lmctl/consolidate":["researchers","consolidator"],"lmctl/interactive":["agent"]};pg={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"},wn=class extends Error{issues;constructor(e){super(`composition DSL compile failed:
1758
1758
  ${e.map(r=>` line ${r.line}: ${r.message}`).join(`
1759
- `)}`),this.issues=e,this.name="DslCompileError"}},dj=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"]),fj={"lmctl/consolidate":["ok"],"lmctl/interactive":["done"],"lmctl/loop":["ok"],"lmctl/foreach":["all_ok"]},hg=new Set(["requires","default_task_timeout_ms","errors","concurrency_key","concurrent_limit"]),_g={"trigger-schedule":"lmctl/trigger-schedule","trigger-gh-issue":"lmctl/trigger-gh-issue"}});import{readFileSync as hj}from"node:fs";function _j(){let t=process.env.LMCTL_DSL;return t===void 0?!0:!["0","false","off"].includes(t.trim().toLowerCase())}function gj(t){for(let e of t.split(`
1760
- `)){let r=e.replace(/#.*/,"").trim();if(r.length!==0)return/^workflow\s+\S+\s+v\d+\s*$/.test(r)}return!1}function Me(t){if(typeof t=="string"&&_j()&&gj(t)){let r;try{r=gg(t)}catch(s){throw s instanceof wn?new Xt(s.issues.map(o=>({path:`dsl:${o.line}`,message:o.message}))):s}let n=Nt.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 e=Pi(wj(t));if(Ej(e)&&e.definition_schema_version===3){let r=Nt.safeParse(e);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 yj(e)}function yj(t){let e=Mi.safeParse(t);if(!e.success)throw new Xt(e.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));let r=e.data,n=new Set(["Task","Pause","Parallel","LoopUntil","Pass","Fail","Succeed"]);for(let[s,o]of Object.entries(r.states))if(n.has(o.type))throw new Xt([{path:`states.${s}`,message:`v2 workflows (primitive_version: 2) may not use v1 primitive type: ${o.type}`}]);try{return cg(r)}catch(s){throw s instanceof Jt?new Ru(s):s}}function wj(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
1761
- `)||e.startsWith("{")||e.startsWith("[")?Eg(t):e.endsWith(".json")?Eg(hj(e,"utf8")):t}function Eg(t){return JSON.parse(t)}function Ej(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Ru,Xt,En=T(()=>{"use strict";gn();dg();Au();yn();wg();Ru=class extends Error{causeError;constructor(e){super("compiler emitted invalid atomic workflow"),this.causeError=e,this.name="CompilerInvariantError"}},Xt=class extends Error{issues;constructor(e){super("compound workflow validation failed"),this.issues=e,this.name="CompilerValidationError"}}});function Fi(t){let e=t.workflow?.concurrent_limit??1,r=t.job.concurrency_key_resolved??t.workflow?.concurrency_key??null;return r===null||r.trim().length===0?{concurrency_key:null,concurrent_limit:e}:{concurrency_key:Tj(r,{job:{id:t.job.id,kind:t.job.source,source:t.job.source,source_ref:t.job.source_ref,payload:Sj(t.job.payload)},project:t.project===null?null:{id:t.project.id,name:t.project.name}}),concurrent_limit:e}}function Tj(t,e){return t.replace(/\{\{\s*([^}]+?)\s*\}\}/g,(r,n)=>{let s=bj(e,n.trim());return s==null?"":typeof s=="string"?s:typeof s=="number"||typeof s=="boolean"?String(s):JSON.stringify(s)})}function bj(t,e){let r=t;for(let n of e.split(".")){if(typeof r!="object"||r===null||!Object.prototype.hasOwnProperty.call(r,n))return;r=r[n]}return r}function Sj(t){if(t===null||t.trim().length===0)return null;try{return JSON.parse(t)}catch{return t}}var $u=T(()=>{"use strict"});var Tg={};ae(Tg,{enqueueFromAgentOutput:()=>vj,enqueueFromGitHubIssue:()=>ju,enqueueManual:()=>kj,enqueueScheduled:()=>Ij});function ju(t,e){return Wi(t,{project_id:e.project_id,workflow_id_override:e.workflow_id_override??null,source:"gh_issue",source_ref:e.issue_url,dedupe_key:e.dedupe_key??e.issue_url,payload:Ui(e.payload),concurrency_key:e.concurrency_key,priority:e.priority})}function kj(t,e){return Wi(t,{project_id:e.project_id,workflow_id_override:null,source:"manual",source_ref:e.source_ref??null,dedupe_key:e.source_ref??null,payload:Ui(e.payload),concurrency_key:e.concurrency_key})}function vj(t,e){let r=e.sequence===void 0?`run:${e.parent_run_id}`:`run:${e.parent_run_id}:${e.sequence}`;return Wi(t,{project_id:e.project_id,workflow_id_override:null,source:"agent_output",source_ref:r,dedupe_key:r,available_at:e.available_at,payload:Ui(e.payload),concurrency_key:e.concurrency_key})}function Ij(t,e){return Wi(t,{project_id:e.project_id,workflow_id_override:null,source:"schedule",source_ref:e.source_ref,dedupe_key:e.source_ref,available_at:e.available_at,payload:Ui(e.payload),concurrency_key:e.concurrency_key})}function Ui(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function Wi(t,e){let r=e.concurrency_key;if(r!==void 0)return t.enqueueJob({...e,concurrency_key:r});let n=t.getProject(e.project_id),s=n===null?null:e.workflow_id_override!==void 0&&e.workflow_id_override!==null?t.getWorkflow(e.workflow_id_override):t.getWorkflowByName(n.workflow_name);if(n===null||s===null)return t.enqueueJob(e);try{let o=Me(s.definition),i={id:-1,project_id:e.project_id,workflow_id_override:e.workflow_id_override??null,source:e.source,source_ref:e.source_ref??null,payload:e.payload??null,status:"queued",priority:e.priority??0,available_at:e.available_at??new Date().toISOString(),locked_by:null,locked_until:null,attempt_count:0,last_error:null,dedupe_key:e.dedupe_key??null,concurrency_key_resolved:null,enqueued_at:new Date().toISOString(),started_at:null,ended_at:null,run_id:null},a=Fi({workflow:o,job:i,project:n});return t.enqueueJob({...e,concurrency_key:a.concurrency_key})}catch{return t.enqueueJob(e)}}var Lu=T(()=>{"use strict";En();$u()});async function Sg(t){let e=t.dal.listProjectWorkflows(t.project.id,{enabled_only:!0});if(e.length===0)return bg(t.dal,t.project.id,t.issue,t.issue.url,null,t.issue,void 0);let r={event:{kind:"github_issue",issue:t.issue}},n=[],s=0;for(let o of e){if(!await Nj(o.condition,r))continue;let i=`${t.issue.url}#workflow:${o.workflow_id}`,a={issue:t.issue,...xj(o.parameters_override)},l=bg(t.dal,t.project.id,t.issue,i,o.workflow_id,a,-o.priority);n.push(...l.jobs),s+=l.new_jobs}return{jobs:n,new_jobs:s}}function bg(t,e,r,n,s,o,i){let a=t.findJobBySourceAndDedupe("gh_issue",n);return{jobs:[ju(t,{project_id:e,issue_url:r.url,payload:o,workflow_id_override:s,dedupe_key:n,priority:i})],new_jobs:a===null?1:0}}async function Nj(t,e){if(t===null||t.trim().length===0)return!0;try{return await Or(t,e)===!0}catch{return!1}}function xj(t){if(t===null||t.trim().length===0)return{};try{let e=JSON.parse(t);if(e!==null&&typeof e=="object"&&!Array.isArray(e))return e}catch{return{}}return{}}var kg=T(()=>{"use strict";_n();Lu()});import{spawnSync as Aj}from"node:child_process";async function Cu(t){let e=t.labels??["bug"],r=t.state??"open",n=["issue","list","--repo",t.project.name,"--state",r,"--json","number,title,url,body,state,labels","--limit","100"];e.length>0&&n.splice(4,0,"--label",e.join(","));let s=Aj(t.binary??"gh",n,{encoding:"utf8",timeout:t.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 o;try{o=JSON.parse(s.stdout??"[]")}catch{throw new Error("gh issue list returned malformed JSON")}if(!$j(o))throw new Error("gh issue list returned unexpected JSON shape");let i=0;for(let a of o){let l=await Sg({dal:t.dal,project:t.project,issue:jj(a)});i+=l.new_jobs}return{scanned:o.length,new_jobs:i}}async function Tn(t){if(process.env.LMCTL_INTAKE_DISABLED==="1")return[];let e=[];for(let r of t.listProjectsWithIntakeEnabled()){let n=Rj(r.intake_config);try{let s=await Cu({dal:t,project:r,labels:n.labels,state:n.state});e.push({project_id:r.id,project_name:r.name,...s})}catch(s){let o=s instanceof Error?s.message:String(s);e.push({project_id:r.id,project_name:r.name,scanned:0,new_jobs:0,error:o});try{t.raiseAttention({kind:"daemon_intake_scan_failed",severity:"warn",project_id:r.id,payload:JSON.stringify({project_id:r.id,project_name:r.name,error:o})})}catch{}}}return e}function Rj(t){if(t===null)return{};try{let e=JSON.parse(t);if(!Ou(e))return{};let r=e.state==="open"||e.state==="closed"||e.state==="all"?e.state:void 0,n=Array.isArray(e.labels)?e.labels.filter(s=>typeof s=="string"&&s.length>0):void 0;return{scan_github_issues:e.scan_github_issues===!0,labels:n,state:r}}catch{return{}}}function $j(t){return Array.isArray(t)&&t.every(e=>{if(!Ou(e))return!1;let r=e.labels;return typeof e.number=="number"&&typeof e.title=="string"&&typeof e.url=="string"&&(typeof e.body=="string"||e.body===null||e.body===void 0)&&(e.state===void 0||typeof e.state=="string")&&(r===void 0||Array.isArray(r)&&r.every(n=>typeof n=="string"?!0:Ou(n)&&typeof n.name=="string"))})}function jj(t){let e=t.labels?.map(s=>typeof s=="string"?s:s.name),{labels:r,...n}=t;return e===void 0?n:{...n,labels:e}}function Ou(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var Bi=T(()=>{"use strict";kg()});function Ig(t){return async e=>Oj(t.app,e,t.log!==void 0?{log:t.log}:{})}async function Oj(t,e,r={}){let n=Cj(e.path),s={"content-type":"application/json",...e.headers??{},[Hi]:Mu},o={method:e.method,headers:s};e.body!==void 0&&e.method!=="GET"&&e.method!=="DELETE"&&(o.body=typeof e.body=="string"?e.body:JSON.stringify(e.body));let i=new Request(n,o),a=Date.now();try{let l=await t.fetch(i),c=await Mj(l);if(r.log!==void 0){let u=Date.now()-a;r.log(`[mailbox-dispatch] ${e.method} ${vg(e.path)} \u2192 ${c.status} (${u}ms)`)}return c}catch(l){if(r.log!==void 0){let c=Date.now()-a;r.log(`[mailbox-dispatch] ${e.method} ${vg(e.path)} \u2192 ERR (${c}ms)`)}throw l}}function vg(t){let e=t.startsWith("/")?t:`/${t}`,r=e.search(/[?#]/);return r===-1?e:e.slice(0,r)}function Cj(t){let e=t.startsWith("/")?t:`/${t}`;return`${Lj}${e}`}async function Mj(t){let e=await t.text(),r;if(e==="")r=void 0;else try{r=JSON.parse(e)}catch{r=e}let n={};t.headers.forEach((o,i)=>{i.toLowerCase()!==Hi&&(n[i]=o)});let s={status:t.status};return Object.keys(n).length>0&&(s.headers=n),r!==void 0&&(s.body=r),s}var Hi,Mu,Lj,Du=T(()=>{"use strict";Hi="x-mailbox-channel",Mu="1",Lj="http://mailbox.local"});import{createHash as Ng,createHmac as Dj,timingSafeEqual as Pj}from"node:crypto";function xg(){return async(t,e)=>{let r=Ag();if(r===null||Hj(t.req.path)){await e();return}if(t.req.path.startsWith("/mailbox/")&&t.req.header(Hi)===Mu){await e();return}let n=t.req.query("token");if(n!==void 0&&qi(n,r)){Fu(t,r),await e();return}if(Bj(t,r)){await e();return}return t.req.path.startsWith("/api/")||t.req.path.startsWith("/mailbox/")?t.json({error:"API requires auth; set LMCTL_API_TOKEN"},401):t.redirect("/login",302)}}function Ag(){let t=process.env.LMCTL_API_TOKEN;return t&&t.length>0?t:null}function Rg(t){let e=Ag();return e!==null&&qi(t,e)}function Fu(t,e,r=new Date){t.header("Set-Cookie",`${Pu}=${Uj(e,r)}; Path=/; HttpOnly; SameSite=Lax`)}function $g(t){t.header("Set-Cookie",`${Pu}=; Path=/; HttpOnly; SameSite=Lax; Max-Age=0`)}function Uj(t,e=new Date){let n=`auth=ok|${new Date(e.getTime()+Fj*24*60*60*1e3).toISOString()}`;return Buffer.from(`${n}|${jg(t,n)}`,"utf8").toString("base64url")}function Wj(t,e,r=new Date){let n;try{n=Buffer.from(t,"base64url").toString("utf8")}catch{return!1}let s=n.split("|");if(s.length!==3||s[0]!=="auth=ok")return!1;let o=new Date(s[1]);return Number.isNaN(o.getTime())||o.getTime()<=r.getTime()?!1:qi(s[2],jg(e,`${s[0]}|${s[1]}`))}function qi(t,e){return Pj(Ng("sha256").update(t).digest(),Ng("sha256").update(e).digest())}function Bj(t,e){let r=/^Bearer\s+(.+)$/i.exec(t.req.header("authorization")??"")?.[1];if(r!==void 0&&qi(r,e))return!0;let n=qj(t.req.header("cookie")??"")[Pu];return n!==void 0&&Wj(n,e)}function Hj(t){return t==="/login"||t==="/logout"}function qj(t){let e={};for(let r of t.split(";")){let[n,...s]=r.trim().split("=");n===void 0||n.length===0||s.length===0||(e[n]=s.join("="))}return e}function jg(t,e){return Dj("sha256",t).update(e).digest("hex")}var Pu,Fj,Lg=T(()=>{"use strict";Du();Pu="lmctl_next_session",Fj=30});import{existsSync as bn,mkdirSync as Jj,readdirSync as Xj,readFileSync as Ji,unlinkSync as Gj,writeFileSync as Bu}from"node:fs";import{join as Cr}from"node:path";function rt(t){if(!Kj.test(t))throw new Error(`invalid memory name "${t}": only alphanumeric characters, underscores, and hyphens are allowed`)}function Cg(t,e){let r=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(r===null)return null;let n=r[1],s=r[2].trimStart(),o=n.match(/^type:\s*(.+)$/m),i=n.match(/^description:\s*(.+)$/m),a=o?.[1]?.trim()??"";return Zj(a)?{name:t,type:a,description:i?.[1]?.trim()??null,body:s,created_at:Og,updated_at:Og}:null}function Vj(t,e,r,n){let s=r!==null?`
1759
+ `)}`),this.issues=e,this.name="DslCompileError"}},dL=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"]),fL={"lmctl/consolidate":["ok"],"lmctl/interactive":["done"],"lmctl/loop":["ok"],"lmctl/foreach":["all_ok"]},hg=new Set(["requires","default_task_timeout_ms","errors","concurrency_key","concurrent_limit"]),_g={"trigger-schedule":"lmctl/trigger-schedule","trigger-gh-issue":"lmctl/trigger-gh-issue"}});import{readFileSync as hL}from"node:fs";function _L(){let t=process.env.LMCTL_DSL;return t===void 0?!0:!["0","false","off"].includes(t.trim().toLowerCase())}function gL(t){for(let e of t.split(`
1760
+ `)){let r=e.replace(/#.*/,"").trim();if(r.length!==0)return/^workflow\s+\S+\s+v\d+\s*$/.test(r)}return!1}function Me(t){if(typeof t=="string"&&_L()&&gL(t)){let r;try{r=gg(t)}catch(s){throw s instanceof wn?new Xt(s.issues.map(o=>({path:`dsl:${o.line}`,message:o.message}))):s}let n=Nt.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 e=Pi(wL(t));if(EL(e)&&e.definition_schema_version===3){let r=Nt.safeParse(e);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 yL(e)}function yL(t){let e=Mi.safeParse(t);if(!e.success)throw new Xt(e.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));let r=e.data,n=new Set(["Task","Pause","Parallel","LoopUntil","Pass","Fail","Succeed"]);for(let[s,o]of Object.entries(r.states))if(n.has(o.type))throw new Xt([{path:`states.${s}`,message:`v2 workflows (primitive_version: 2) may not use v1 primitive type: ${o.type}`}]);try{return cg(r)}catch(s){throw s instanceof Jt?new Ru(s):s}}function wL(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
1761
+ `)||e.startsWith("{")||e.startsWith("[")?Eg(t):e.endsWith(".json")?Eg(hL(e,"utf8")):t}function Eg(t){return JSON.parse(t)}function EL(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Ru,Xt,En=T(()=>{"use strict";gn();dg();Au();yn();wg();Ru=class extends Error{causeError;constructor(e){super("compiler emitted invalid atomic workflow"),this.causeError=e,this.name="CompilerInvariantError"}},Xt=class extends Error{issues;constructor(e){super("compound workflow validation failed"),this.issues=e,this.name="CompilerValidationError"}}});function Fi(t){let e=t.workflow?.concurrent_limit??1,r=t.job.concurrency_key_resolved??t.workflow?.concurrency_key??null;return r===null||r.trim().length===0?{concurrency_key:null,concurrent_limit:e}:{concurrency_key:TL(r,{job:{id:t.job.id,kind:t.job.source,source:t.job.source,source_ref:t.job.source_ref,payload:SL(t.job.payload)},project:t.project===null?null:{id:t.project.id,name:t.project.name}}),concurrent_limit:e}}function TL(t,e){return t.replace(/\{\{\s*([^}]+?)\s*\}\}/g,(r,n)=>{let s=bL(e,n.trim());return s==null?"":typeof s=="string"?s:typeof s=="number"||typeof s=="boolean"?String(s):JSON.stringify(s)})}function bL(t,e){let r=t;for(let n of e.split(".")){if(typeof r!="object"||r===null||!Object.prototype.hasOwnProperty.call(r,n))return;r=r[n]}return r}function SL(t){if(t===null||t.trim().length===0)return null;try{return JSON.parse(t)}catch{return t}}var $u=T(()=>{"use strict"});var Tg={};le(Tg,{enqueueFromAgentOutput:()=>vL,enqueueFromGitHubIssue:()=>Lu,enqueueManual:()=>kL,enqueueScheduled:()=>IL});function Lu(t,e){return Wi(t,{project_id:e.project_id,workflow_id_override:e.workflow_id_override??null,source:"gh_issue",source_ref:e.issue_url,dedupe_key:e.dedupe_key??e.issue_url,payload:Ui(e.payload),concurrency_key:e.concurrency_key,priority:e.priority})}function kL(t,e){return Wi(t,{project_id:e.project_id,workflow_id_override:null,source:"manual",source_ref:e.source_ref??null,dedupe_key:e.source_ref??null,payload:Ui(e.payload),concurrency_key:e.concurrency_key})}function vL(t,e){let r=e.sequence===void 0?`run:${e.parent_run_id}`:`run:${e.parent_run_id}:${e.sequence}`;return Wi(t,{project_id:e.project_id,workflow_id_override:null,source:"agent_output",source_ref:r,dedupe_key:r,available_at:e.available_at,payload:Ui(e.payload),concurrency_key:e.concurrency_key})}function IL(t,e){return Wi(t,{project_id:e.project_id,workflow_id_override:null,source:"schedule",source_ref:e.source_ref,dedupe_key:e.source_ref,available_at:e.available_at,payload:Ui(e.payload),concurrency_key:e.concurrency_key})}function Ui(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function Wi(t,e){let r=e.concurrency_key;if(r!==void 0)return t.enqueueJob({...e,concurrency_key:r});let n=t.getProject(e.project_id),s=n===null?null:e.workflow_id_override!==void 0&&e.workflow_id_override!==null?t.getWorkflow(e.workflow_id_override):t.getWorkflowByName(n.workflow_name);if(n===null||s===null)return t.enqueueJob(e);try{let o=Me(s.definition),i={id:-1,project_id:e.project_id,workflow_id_override:e.workflow_id_override??null,source:e.source,source_ref:e.source_ref??null,payload:e.payload??null,status:"queued",priority:e.priority??0,available_at:e.available_at??new Date().toISOString(),locked_by:null,locked_until:null,attempt_count:0,last_error:null,dedupe_key:e.dedupe_key??null,concurrency_key_resolved:null,enqueued_at:new Date().toISOString(),started_at:null,ended_at:null,run_id:null},a=Fi({workflow:o,job:i,project:n});return t.enqueueJob({...e,concurrency_key:a.concurrency_key})}catch{return t.enqueueJob(e)}}var ju=T(()=>{"use strict";En();$u()});async function Sg(t){let e=t.dal.listProjectWorkflows(t.project.id,{enabled_only:!0});if(e.length===0)return bg(t.dal,t.project.id,t.issue,t.issue.url,null,t.issue,void 0);let r={event:{kind:"github_issue",issue:t.issue}},n=[],s=0;for(let o of e){if(!await NL(o.condition,r))continue;let i=`${t.issue.url}#workflow:${o.workflow_id}`,a={issue:t.issue,...xL(o.parameters_override)},l=bg(t.dal,t.project.id,t.issue,i,o.workflow_id,a,-o.priority);n.push(...l.jobs),s+=l.new_jobs}return{jobs:n,new_jobs:s}}function bg(t,e,r,n,s,o,i){let a=t.findJobBySourceAndDedupe("gh_issue",n);return{jobs:[Lu(t,{project_id:e,issue_url:r.url,payload:o,workflow_id_override:s,dedupe_key:n,priority:i})],new_jobs:a===null?1:0}}async function NL(t,e){if(t===null||t.trim().length===0)return!0;try{return await Or(t,e)===!0}catch{return!1}}function xL(t){if(t===null||t.trim().length===0)return{};try{let e=JSON.parse(t);if(e!==null&&typeof e=="object"&&!Array.isArray(e))return e}catch{return{}}return{}}var kg=T(()=>{"use strict";_n();ju()});import{spawnSync as AL}from"node:child_process";async function Cu(t){let e=t.labels??["bug"],r=t.state??"open",n=["issue","list","--repo",t.project.name,"--state",r,"--json","number,title,url,body,state,labels","--limit","100"];e.length>0&&n.splice(4,0,"--label",e.join(","));let s=AL(t.binary??"gh",n,{encoding:"utf8",timeout:t.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 o;try{o=JSON.parse(s.stdout??"[]")}catch{throw new Error("gh issue list returned malformed JSON")}if(!$L(o))throw new Error("gh issue list returned unexpected JSON shape");let i=0;for(let a of o){let l=await Sg({dal:t.dal,project:t.project,issue:LL(a)});i+=l.new_jobs}return{scanned:o.length,new_jobs:i}}async function Tn(t){if(process.env.LMCTL_INTAKE_DISABLED==="1")return[];let e=[];for(let r of t.listProjectsWithIntakeEnabled()){let n=RL(r.intake_config);try{let s=await Cu({dal:t,project:r,labels:n.labels,state:n.state});e.push({project_id:r.id,project_name:r.name,...s})}catch(s){let o=s instanceof Error?s.message:String(s);e.push({project_id:r.id,project_name:r.name,scanned:0,new_jobs:0,error:o});try{t.raiseAttention({kind:"daemon_intake_scan_failed",severity:"warn",project_id:r.id,payload:JSON.stringify({project_id:r.id,project_name:r.name,error:o})})}catch{}}}return e}function RL(t){if(t===null)return{};try{let e=JSON.parse(t);if(!Ou(e))return{};let r=e.state==="open"||e.state==="closed"||e.state==="all"?e.state:void 0,n=Array.isArray(e.labels)?e.labels.filter(s=>typeof s=="string"&&s.length>0):void 0;return{scan_github_issues:e.scan_github_issues===!0,labels:n,state:r}}catch{return{}}}function $L(t){return Array.isArray(t)&&t.every(e=>{if(!Ou(e))return!1;let r=e.labels;return typeof e.number=="number"&&typeof e.title=="string"&&typeof e.url=="string"&&(typeof e.body=="string"||e.body===null||e.body===void 0)&&(e.state===void 0||typeof e.state=="string")&&(r===void 0||Array.isArray(r)&&r.every(n=>typeof n=="string"?!0:Ou(n)&&typeof n.name=="string"))})}function LL(t){let e=t.labels?.map(s=>typeof s=="string"?s:s.name),{labels:r,...n}=t;return e===void 0?n:{...n,labels:e}}function Ou(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var Bi=T(()=>{"use strict";kg()});function Ig(t){return async e=>OL(t.app,e,t.log!==void 0?{log:t.log}:{})}async function OL(t,e,r={}){let n=CL(e.path),s={"content-type":"application/json",...e.headers??{},[Hi]:Mu},o={method:e.method,headers:s};e.body!==void 0&&e.method!=="GET"&&e.method!=="DELETE"&&(o.body=typeof e.body=="string"?e.body:JSON.stringify(e.body));let i=new Request(n,o),a=Date.now();try{let l=await t.fetch(i),c=await ML(l);if(r.log!==void 0){let u=Date.now()-a;r.log(`[mailbox-dispatch] ${e.method} ${vg(e.path)} \u2192 ${c.status} (${u}ms)`)}return c}catch(l){if(r.log!==void 0){let c=Date.now()-a;r.log(`[mailbox-dispatch] ${e.method} ${vg(e.path)} \u2192 ERR (${c}ms)`)}throw l}}function vg(t){let e=t.startsWith("/")?t:`/${t}`,r=e.search(/[?#]/);return r===-1?e:e.slice(0,r)}function CL(t){let e=t.startsWith("/")?t:`/${t}`;return`${jL}${e}`}async function ML(t){let e=await t.text(),r;if(e==="")r=void 0;else try{r=JSON.parse(e)}catch{r=e}let n={};t.headers.forEach((o,i)=>{i.toLowerCase()!==Hi&&(n[i]=o)});let s={status:t.status};return Object.keys(n).length>0&&(s.headers=n),r!==void 0&&(s.body=r),s}var Hi,Mu,jL,Du=T(()=>{"use strict";Hi="x-mailbox-channel",Mu="1",jL="http://mailbox.local"});import{createHash as Ng,createHmac as DL,timingSafeEqual as PL}from"node:crypto";function xg(){return async(t,e)=>{let r=Ag();if(r===null||HL(t.req.path)){await e();return}if(t.req.path.startsWith("/mailbox/")&&t.req.header(Hi)===Mu){await e();return}let n=t.req.query("token");if(n!==void 0&&qi(n,r)){Fu(t,r),await e();return}if(BL(t,r)){await e();return}return t.req.path.startsWith("/api/")||t.req.path.startsWith("/mailbox/")?t.json({error:"API requires auth; set LMCTL_API_TOKEN"},401):t.redirect("/login",302)}}function Ag(){let t=process.env.LMCTL_API_TOKEN;return t&&t.length>0?t:null}function Rg(t){let e=Ag();return e!==null&&qi(t,e)}function Fu(t,e,r=new Date){t.header("Set-Cookie",`${Pu}=${UL(e,r)}; Path=/; HttpOnly; SameSite=Lax`)}function $g(t){t.header("Set-Cookie",`${Pu}=; Path=/; HttpOnly; SameSite=Lax; Max-Age=0`)}function UL(t,e=new Date){let n=`auth=ok|${new Date(e.getTime()+FL*24*60*60*1e3).toISOString()}`;return Buffer.from(`${n}|${Lg(t,n)}`,"utf8").toString("base64url")}function WL(t,e,r=new Date){let n;try{n=Buffer.from(t,"base64url").toString("utf8")}catch{return!1}let s=n.split("|");if(s.length!==3||s[0]!=="auth=ok")return!1;let o=new Date(s[1]);return Number.isNaN(o.getTime())||o.getTime()<=r.getTime()?!1:qi(s[2],Lg(e,`${s[0]}|${s[1]}`))}function qi(t,e){return PL(Ng("sha256").update(t).digest(),Ng("sha256").update(e).digest())}function BL(t,e){let r=/^Bearer\s+(.+)$/i.exec(t.req.header("authorization")??"")?.[1];if(r!==void 0&&qi(r,e))return!0;let n=qL(t.req.header("cookie")??"")[Pu];return n!==void 0&&WL(n,e)}function HL(t){return t==="/login"||t==="/logout"}function qL(t){let e={};for(let r of t.split(";")){let[n,...s]=r.trim().split("=");n===void 0||n.length===0||s.length===0||(e[n]=s.join("="))}return e}function Lg(t,e){return DL("sha256",t).update(e).digest("hex")}var Pu,FL,jg=T(()=>{"use strict";Du();Pu="lmctl_next_session",FL=30});import{existsSync as bn,mkdirSync as JL,readdirSync as XL,readFileSync as Ji,unlinkSync as GL,writeFileSync as Bu}from"node:fs";import{join as Cr}from"node:path";function rt(t){if(!KL.test(t))throw new Error(`invalid memory name "${t}": only alphanumeric characters, underscores, and hyphens are allowed`)}function Cg(t,e){let r=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(r===null)return null;let n=r[1],s=r[2].trimStart(),o=n.match(/^type:\s*(.+)$/m),i=n.match(/^description:\s*(.+)$/m),a=o?.[1]?.trim()??"";return ZL(a)?{name:t,type:a,description:i?.[1]?.trim()??null,body:s,created_at:Og,updated_at:Og}:null}function VL(t,e,r,n){let s=r!==null?`
1762
1762
  description: ${r}`:"";return`---
1763
1763
  name: ${t}${s}
1764
1764
  type: ${e}
1765
1765
  ---
1766
- ${n}`}function Yj(t,e,r,n){let s=Cr(t,Hu),o=`- [${e}.md](${e}.md)${n!==null?` \u2014 ${n}`:""} (${r})`,i=bn(s)?Ji(s,"utf8"):"",a=new RegExp(`^- \\[${Mg(e)}\\.md\\].*$`,"m");a.test(i)?i=i.replace(a,o):i=i.length>0&&!i.endsWith(`
1766
+ ${n}`}function YL(t,e,r,n){let s=Cr(t,Hu),o=`- [${e}.md](${e}.md)${n!==null?` \u2014 ${n}`:""} (${r})`,i=bn(s)?Ji(s,"utf8"):"",a=new RegExp(`^- \\[${Mg(e)}\\.md\\].*$`,"m");a.test(i)?i=i.replace(a,o):i=i.length>0&&!i.endsWith(`
1767
1767
  `)?`${i}
1768
1768
  ${o}
1769
1769
  `:`${i}${o}
1770
- `,Bu(s,i,"utf8")}function zj(t,e){let r=Cr(t,Hu);if(!bn(r))return;let n=Ji(r,"utf8"),s=new RegExp(`^- \\[${Mg(e)}\\.md\\].*$\\r?\\n?`,"m");s.test(n)&&Bu(r,n.replace(s,""),"utf8")}function Mg(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Zj(t){return t==="user"||t==="feedback"||t==="project"||t==="reference"}function pt(t,e){return t.durable_memory_mode==="db"?new Wu(e,t.id):new Uu(t.local_path)}var Kj,Hu,Og,Uu,Wu,qu=T(()=>{"use strict";Kj=/^[a-zA-Z0-9_-]+$/;Hu="MEMORY.md",Og="1970-01-01T00:00:00.000Z",Uu=class{dir;constructor(e){this.dir=Cr(e,"durable-memory")}read(e){rt(e);let r=Cr(this.dir,`${e}.md`);if(!bn(r))return null;let n=Ji(r,"utf8");return Cg(e,n)}write(e){rt(e.name),Jj(this.dir,{recursive:!0});let r=Cr(this.dir,`${e.name}.md`),n=!bn(r),s=Vj(e.name,e.type,e.description??null,e.body);return Bu(r,s,"utf8"),Yj(this.dir,e.name,e.type,e.description??null),{created:n}}index(e){return this.listFiles().filter(r=>e===void 0||e.length===0||e.includes(r.type)).map(({name:r,type:n,description:s,updated_at:o})=>({name:r,type:n,description:s,updated_at:o}))}list(e){return this.listFiles().filter(r=>e===void 0||r.type===e).map(({name:r,type:n,updated_at:s})=>({name:r,type:n,updated_at:s}))}delete(e){rt(e);let r=Cr(this.dir,`${e}.md`);return bn(r)?(Gj(r),zj(this.dir,e),!0):!1}listFiles(){if(!bn(this.dir))return[];let e=Xj(this.dir).filter(n=>n.endsWith(".md")&&n!==Hu),r=[];for(let n of e){let s=n.slice(0,-3),o=Ji(Cr(this.dir,n),"utf8"),i=Cg(s,o);i!==null&&r.push(i)}return r.sort((n,s)=>n.name.localeCompare(s.name))}};Wu=class{dal;projectId;constructor(e,r){this.dal=e,this.projectId=r}read(e){rt(e);let r=this.dal.getDurableMemoryByName(this.projectId,e);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(e){rt(e.name);let r=this.dal.getDurableMemoryByName(this.projectId,e.name);return this.dal.upsertDurableMemory({project_id:this.projectId,type:e.type,name:e.name,description:e.description??null,body:e.body}),{created:r===null}}index(e){return this.dal.indexDurableMemory(this.projectId,e).map(n=>({name:n.name,type:n.type,description:n.description,updated_at:n.updated_at}))}list(e){return this.dal.listDurableMemory(this.projectId,e).map(n=>({name:n.name,type:n.type,updated_at:n.updated_at}))}delete(e){return rt(e),this.dal.deleteDurableMemory(this.projectId,e)}}});function Pg(t,e){let{dal:r}=e;t.get("/api/durable-memory/index/:project_id",n=>{let s=Number(n.req.param("project_id")),o=r.getProject(s);if(o===null)return n.json({error:"project not found"},404);let i=pt(o,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(i.index(l))}),t.get("/api/durable-memory/read/:project_id/:name",n=>{let s=Number(n.req.param("project_id")),o=n.req.param("name"),i=r.getProject(s);if(i===null)return n.json({error:"project not found"},404);let a=pt(i,r),l;try{l=a.read(o)}catch(c){return n.json({error:c.message},400)}return l===null?n.json({error:`memory entry not found: ${o}`},404):n.json(l)}),t.post("/api/durable-memory/write/:project_id",async n=>{let s=Number(n.req.param("project_id")),o=r.getProject(s);if(o===null)return n.json({error:"project not found"},404);let i;try{i=await n.req.json()}catch{return n.json({error:"invalid JSON body"},400)}let a=typeof i.type=="string"?i.type:null,l=typeof i.name=="string"?i.name:null,c=typeof i.body=="string"?i.body:null,u=typeof i.description=="string"?i.description:null;if(a===null||!Dg.has(a))return n.json({error:`invalid type: must be one of ${[...Dg].join("|")}`},400);if(l===null)return n.json({error:"missing name"},400);if(c===null)return n.json({error:"missing body"},400);let d=pt(o,r),f;try{({created:f}=d.write({type:a,name:l,description:u,body:c}))}catch(m){return n.json({error:m.message},400)}return n.json({success:!0,created_or_updated:f?"created":"updated"})}),t.get("/api/durable-memory/list/:project_id",n=>{let s=Number(n.req.param("project_id")),o=r.getProject(s);if(o===null)return n.json({error:"project not found"},404);let i=pt(o,r),a=n.req.query("type");return n.json(i.list(a))})}var Dg,Fg=T(()=>{"use strict";qu();Dg=new Set(["user","feedback","project","reference"])});function eL(t){let e=4294967295;for(let r=0;r<t.length;r+=1)e=(Qj[(e^t[r])&255]^e>>>8)>>>0;return(e^4294967295)>>>0}function tL(t){let e=Math.max(1980,t.getFullYear()),r=(t.getHours()&31)<<11|(t.getMinutes()&63)<<5|Math.floor(t.getSeconds()/2)&31,n=(e-1980&127)<<9|(t.getMonth()+1&15)<<5|t.getDate()&31;return{time:r,date:n}}function Ug(t,e=new Date){let{time:r,date:n}=tL(e),s=[],o=[],i=0,a=new TextEncoder;for(let h of t){let g=a.encode(h.name),_=eL(h.data),S=h.data.length,w=new Uint8Array(30+g.length),E=new DataView(w.buffer);E.setUint32(0,67324752,!0),E.setUint16(4,20,!0),E.setUint16(6,0,!0),E.setUint16(8,0,!0),E.setUint16(10,r,!0),E.setUint16(12,n,!0),E.setUint32(14,_,!0),E.setUint32(18,S,!0),E.setUint32(22,S,!0),E.setUint16(26,g.length,!0),E.setUint16(28,0,!0),w.set(g,30),s.push(w,h.data);let I=new Uint8Array(46+g.length),x=new DataView(I.buffer);x.setUint32(0,33639248,!0),x.setUint16(4,20,!0),x.setUint16(6,20,!0),x.setUint16(8,0,!0),x.setUint16(10,0,!0),x.setUint16(12,r,!0),x.setUint16(14,n,!0),x.setUint32(16,_,!0),x.setUint32(20,S,!0),x.setUint32(24,S,!0),x.setUint16(28,g.length,!0),x.setUint16(30,0,!0),x.setUint16(32,0,!0),x.setUint16(34,0,!0),x.setUint16(36,0,!0),x.setUint32(38,0,!0),x.setUint32(42,i,!0),I.set(g,46),o.push(I),i+=w.length+h.data.length}let l=i,c=0;for(let h of o)c+=h.length;let u=new Uint8Array(22),d=new DataView(u.buffer);d.setUint32(0,101010256,!0),d.setUint16(4,0,!0),d.setUint16(6,0,!0),d.setUint16(8,t.length,!0),d.setUint16(10,t.length,!0),d.setUint32(12,c,!0),d.setUint32(16,l,!0),d.setUint16(20,0,!0);let f=l+c+u.length,m=new Uint8Array(f),p=0;for(let h of s)m.set(h,p),p+=h.length;for(let h of o)m.set(h,p),p+=h.length;return m.set(u,p),m}var Qj,Wg=T(()=>{"use strict";Qj=(()=>{let t=new Uint32Array(256);for(let e=0;e<256;e+=1){let r=e;for(let n=0;n<8;n+=1)r=r&1?3988292384^r>>>1:r>>>1;t[e]=r>>>0}return t})()});import{existsSync as Ki,mkdirSync as rL,readdirSync as nL,readFileSync as qg,statSync as sL,unlinkSync as oL,writeFileSync as iL}from"node:fs";import{join as xs}from"node:path";function Jg(t,e){let{dal:r}=e;t.post("/api/projects",async n=>{let s=await ht(n);if(typeof s=="string")return $(n,s,400);let o=ie(s,"name"),i=ie(s,"local_path");if(o===null||o.length===0)return $(n,"missing or empty name",400);if(i===null||i.length===0)return $(n,"missing or empty local_path",400);if(r.findProjectByName(o)!==null)return $(n,`project already exists: ${o}`,409);let a=ie(s,"workflow_name")??"bugfix",l,c=ie(s,"team_name");if(c!==null&&c.length>0){let d=r.findTeamByName(c);if(d===null)return $(n,`team not found: ${c}`,404);l=d.id}else{let d=r.listTeams();if(d.length===0)return $(n,"no teams exist; create a team first",400);l=d[0].id}let u=r.insertProject({name:o,local_path:i,workflow_name:a,team_id:l,default_branch:ie(s,"default_branch")});return n.json(u,201)}),t.patch("/api/projects/:name",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return $(n,"project not found",404);let o=await ht(n);if(typeof o=="string")return $(n,o,400);let i={};if(Object.prototype.hasOwnProperty.call(o,"local_path")){let l=o.local_path;if(typeof l!="string"||l.length===0)return $(n,"local_path must be a non-empty string",400);i.local_path=l}if(Object.prototype.hasOwnProperty.call(o,"durable_memory_mode")){let l=o.durable_memory_mode;if(l!=="folder"&&l!=="db")return $(n,'durable_memory_mode must be "folder" or "db"',400);i.durable_memory_mode=l}if(Object.prototype.hasOwnProperty.call(o,"default_branch")){let l=o.default_branch;if(l!==null&&typeof l!="string")return $(n,"default_branch must be string or null",400);i.default_branch=l}if(Object.prototype.hasOwnProperty.call(o,"intake_config")){let l=o.intake_config;if(l===null)i.intake_config=null;else if(typeof l=="string")i.intake_config=l;else if(typeof l=="object"&&!Array.isArray(l))i.intake_config=JSON.stringify(l);else return $(n,"intake_config must be a JSON object, string, or null",400)}let a=r.updateProjectSettings(s.id,i);return a===null?$(n,"project not found",404):n.json(a)}),t.post("/api/teams",async n=>{let s=await ht(n);if(typeof s=="string")return $(n,s,400);let o=ie(s,"name");if(o===null||o.length===0)return $(n,"missing or empty name",400);if(r.findTeamByName(o)!==null)return $(n,`team already exists: ${o}`,409);let i=r.insertTeam({name:o});return n.json(i,201)}),t.post("/api/teams/:name/members",async n=>{let s=r.findTeamByName(n.req.param("name"));if(s===null)return $(n,"team not found",404);let o=await ht(n);if(typeof o=="string")return $(n,o,400);let i=ie(o,"alias"),a=ie(o,"provider");if(i===null||i.length===0)return $(n,"missing or empty alias",400);if(a===null||a.length===0)return $(n,"missing or empty provider",400);if(r.findTeamMemberByAlias(s.id,i)!==null)return $(n,`member already exists: ${i}`,409);let l=ie(o,"model"),c=r.insertTeamMember({team_id:s.id,alias:i,provider:a,model:l,sessiondir:`.lmctl/sessions/${s.name}/${i}`}),u=ie(o,"role_prompt");u!==null&&r.setMemberRolePrompt(c.id,u);let d=r.findTeamMemberByAlias(s.id,i);return n.json(d??c,201)}),t.put("/api/teams/:name/members/:alias",async n=>{let s=r.findTeamByName(n.req.param("name"));if(s===null)return $(n,"team not found",404);let o=r.findTeamMemberByAlias(s.id,n.req.param("alias"));if(o===null)return $(n,"member not found",404);let i=await ht(n);if(typeof i=="string")return $(n,i,400);let a={};if(Object.prototype.hasOwnProperty.call(i,"role_prompt")){let c=i.role_prompt;if(c!==null&&typeof c!="string")return $(n,"role_prompt must be string or null",400);a.role_prompt=c}if(Object.prototype.hasOwnProperty.call(i,"model")){let c=i.model;if(c!==null&&typeof c!="string")return $(n,"model must be string or null",400);a.model=c}if(Object.prototype.hasOwnProperty.call(i,"provider")){let c=i.provider;if(typeof c!="string"||c.length===0)return $(n,"provider must be a non-empty string",400);a.provider=c}if(Object.keys(a).length===0)return $(n,"no updatable fields provided",400);let l=r.updateTeamMemberMeta(o.id,a);return l===null?$(n,"member not found",404):n.json(l)}),t.get("/api/projects/:name/durable-memory",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return $(n,"project not found",404);let o=pt(s,r);return n.json(o.index())}),t.post("/api/projects/:name/durable-memory",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return $(n,"project not found",404);let o=await ht(n);if(typeof o=="string")return $(n,o,400);let i=ie(o,"name"),a=ie(o,"body"),l=ie(o,"type");if(i===null||i.length===0)return $(n,"missing or empty name",400);if(a===null)return $(n,"missing body",400);if(l===null||!Xi.includes(l))return $(n,`invalid type: must be one of ${Xi.join("|")}`,400);try{rt(i)}catch(d){return $(n,d.message,400)}let c=pt(s,r);try{if(c.read(i)!==null)return $(n,`chapter already exists: ${i}`,409)}catch(d){return $(n,d.message,400)}try{c.write({type:l,name:i,description:ie(o,"description"),body:a})}catch(d){return $(n,d.message,400)}let u=c.read(i);return u===null?$(n,"chapter created but unreadable",500):n.json(u,201)}),t.get("/api/projects/:name/durable-memory/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return $(n,"project not found",404);let o=pt(s,r),i;try{i=o.read(n.req.param("chapter"))}catch(a){return $(n,a.message,400)}return i===null?$(n,"chapter not found",404):n.json(i)}),t.put("/api/projects/:name/durable-memory/:chapter",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return $(n,"project not found",404);let o=n.req.param("chapter"),i=await ht(n);if(typeof i=="string")return $(n,i,400);let a=pt(s,r),l;try{l=a.read(o)}catch(m){return $(n,m.message,400)}if(l===null)return $(n,"chapter not found",404);let c=ie(i,"body")??l.body,u=Object.prototype.hasOwnProperty.call(i,"description")?ie(i,"description"):l.description,d=ie(i,"type")??l.type;if(!Xi.includes(d))return $(n,`invalid type: must be one of ${Xi.join("|")}`,400);try{a.write({type:d,name:o,description:u,body:c})}catch(m){return $(n,m.message,400)}let f=a.read(o);return f===null?$(n,"chapter updated but unreadable",500):n.json(f)}),t.delete("/api/projects/:name/durable-memory/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return $(n,"project not found",404);let o=pt(s,r),i;try{i=o.delete(n.req.param("chapter"))}catch(a){return $(n,a.message,400)}return i?n.json({removed:!0}):$(n,"chapter not found",404)}),t.get("/api/projects/:name/ai-test",n=>{let s=r.findProjectByName(n.req.param("name"));return s===null?$(n,"project not found",404):n.json(lL(s.local_path))}),t.post("/api/projects/:name/ai-test",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return $(n,"project not found",404);let o=await ht(n);if(typeof o=="string")return $(n,o,400);let i=ie(o,"name"),a=ie(o,"body"),l=ie(o,"type");if(i===null||i.length===0)return $(n,"missing or empty name",400);if(a===null)return $(n,"missing body",400);if(l===null||!Gi.has(l))return $(n,`invalid type: must be one of ${[...Gi].join("|")}`,400);try{rt(i)}catch(f){return $(n,f.message,400)}let c=Is(s.local_path),u=xs(c,`${i}.md`);if(Ki(u))return $(n,`chapter already exists: ${i}`,409);rL(c,{recursive:!0}),Hg(u,i,l,ie(o,"description"),a);let d=Ns(c,i);return d===null?$(n,"chapter created but unreadable",500):n.json(d,201)}),t.get("/api/projects/:name/ai-test/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return $(n,"project not found",404);try{rt(n.req.param("chapter"))}catch(i){return $(n,i.message,400)}let o=Ns(Is(s.local_path),n.req.param("chapter"));return o===null?$(n,"chapter not found",404):n.json(o)}),t.put("/api/projects/:name/ai-test/:chapter",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return $(n,"project not found",404);let o=n.req.param("chapter");try{rt(o)}catch(m){return $(n,m.message,400)}let i=Is(s.local_path),a=Ns(i,o);if(a===null)return $(n,"chapter not found",404);let l=await ht(n);if(typeof l=="string")return $(n,l,400);let c=ie(l,"body")??a.body,u=Object.prototype.hasOwnProperty.call(l,"description")?ie(l,"description"):a.description,d=ie(l,"type")??a.type;if(!Gi.has(d))return $(n,`invalid type: must be one of ${[...Gi].join("|")}`,400);Hg(xs(i,`${o}.md`),o,d,u,c);let f=Ns(i,o);return f===null?$(n,"chapter updated but unreadable",500):n.json(f)}),t.delete("/api/projects/:name/ai-test/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return $(n,"project not found",404);let o=n.req.param("chapter");try{rt(o)}catch(a){return $(n,a.message,400)}let i=xs(Is(s.local_path),`${o}.md`);return Ki(i)?(oL(i),n.json({removed:!0})):$(n,"chapter not found",404)}),t.get("/api/tokens",n=>n.json([])),t.post("/api/tokens",n=>$(n,"scoped-tokens table not yet migrated; see briefs/scoped-tokens-design.md",501)),t.get("/api/settings",n=>n.json({})),t.patch("/api/settings",async n=>{let s=await ht(n);return typeof s=="string"?$(n,s,400):n.json({accepted:s,note:"settings persistence not yet implemented"})}),t.get("/api/chat/sessions",n=>n.json(r.listChatbotSessions(Bg))),t.post("/api/chat/sessions",async n=>{let s=await aL(n);if(typeof s=="string")return $(n,s,400);let o=s!==null?ie(s,"title"):null,i=r.createChatbotSession(Bg,o);return n.json(i,201)}),t.get("/api/chat/sessions/:id/messages",n=>{let s=n.req.param("id");return r.getChatbotSession(s)===null?$(n,"chat session not found",404):n.json(r.listChatbotMessages(s))}),t.post("/api/chat/sessions/:id/messages",async n=>{let s=n.req.param("id");if(r.getChatbotSession(s)===null)return $(n,"chat session not found",404);let o=await ht(n);if(typeof o=="string")return $(n,o,400);let i=ie(o,"role"),a=ie(o,"content");if(i===null||i!=="user"&&i!=="assistant"&&i!=="tool")return $(n,"role must be one of user|assistant|tool",400);if(a===null)return $(n,"missing content",400);let l=r.appendChatbotMessage(s,i,a);return n.json(l,201)}),t.get("/api/runs/:id/artifacts.zip",n=>{let s=Number(n.req.param("id"));if(!Number.isInteger(s))return $(n,"invalid run id",400);if(r.getRun(s)===null)return $(n,"run not found",404);let i=$r(r,s),a=[];for(let c of i){let u=uL(c),d=null;if(c.content!==null&&c.content!==void 0)d=new TextEncoder().encode(c.content);else if(c.path!==null&&c.path!==void 0)try{let f=qg(c.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);d=new Uint8Array(m)}catch{d=new Uint8Array(0)}d!==null&&a.push({name:u,data:d})}let l=Ug(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 $(t,e,r){return t.json({error:e},r)}async function ht(t){try{let e=await t.req.json();return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:"invalid JSON body"}catch{return"invalid JSON body"}}async function aL(t){let e=await t.req.text().catch(()=>"");if(e.trim().length===0)return null;try{let r=JSON.parse(e);return r!==null&&typeof r=="object"&&!Array.isArray(r)?r:"invalid JSON body"}catch{return"invalid JSON body"}}function ie(t,e){let r=t[e];return typeof r!="string"?null:r}function Is(t){return xs(t,"ai-test")}function Ns(t,e){let r=xs(t,`${e}.md`);if(!Ki(r))return null;let n=qg(r,"utf8"),s=cL(n),o=sL(r).mtime.toISOString();return{name:e,type:s.type,description:s.description,body:s.body,updated_at:o}}function lL(t){let e=Is(t);return Ki(e)?nL(e).filter(r=>r.endsWith(".md")&&r!=="index.md").map(r=>r.slice(0,-3)).sort().map(r=>{let n=Ns(e,r);if(n===null)return null;let{name:s,type:o,description:i,updated_at:a}=n;return{name:s,type:o,description:i,updated_at:a}}).filter(r=>r!==null):[]}function Hg(t,e,r,n,s){let o=n!==null&&n.length>0?`
1770
+ `,Bu(s,i,"utf8")}function zL(t,e){let r=Cr(t,Hu);if(!bn(r))return;let n=Ji(r,"utf8"),s=new RegExp(`^- \\[${Mg(e)}\\.md\\].*$\\r?\\n?`,"m");s.test(n)&&Bu(r,n.replace(s,""),"utf8")}function Mg(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function ZL(t){return t==="user"||t==="feedback"||t==="project"||t==="reference"}function pt(t,e){return t.durable_memory_mode==="db"?new Wu(e,t.id):new Uu(t.local_path)}var KL,Hu,Og,Uu,Wu,qu=T(()=>{"use strict";KL=/^[a-zA-Z0-9_-]+$/;Hu="MEMORY.md",Og="1970-01-01T00:00:00.000Z",Uu=class{dir;constructor(e){this.dir=Cr(e,"durable-memory")}read(e){rt(e);let r=Cr(this.dir,`${e}.md`);if(!bn(r))return null;let n=Ji(r,"utf8");return Cg(e,n)}write(e){rt(e.name),JL(this.dir,{recursive:!0});let r=Cr(this.dir,`${e.name}.md`),n=!bn(r),s=VL(e.name,e.type,e.description??null,e.body);return Bu(r,s,"utf8"),YL(this.dir,e.name,e.type,e.description??null),{created:n}}index(e){return this.listFiles().filter(r=>e===void 0||e.length===0||e.includes(r.type)).map(({name:r,type:n,description:s,updated_at:o})=>({name:r,type:n,description:s,updated_at:o}))}list(e){return this.listFiles().filter(r=>e===void 0||r.type===e).map(({name:r,type:n,updated_at:s})=>({name:r,type:n,updated_at:s}))}delete(e){rt(e);let r=Cr(this.dir,`${e}.md`);return bn(r)?(GL(r),zL(this.dir,e),!0):!1}listFiles(){if(!bn(this.dir))return[];let e=XL(this.dir).filter(n=>n.endsWith(".md")&&n!==Hu),r=[];for(let n of e){let s=n.slice(0,-3),o=Ji(Cr(this.dir,n),"utf8"),i=Cg(s,o);i!==null&&r.push(i)}return r.sort((n,s)=>n.name.localeCompare(s.name))}};Wu=class{dal;projectId;constructor(e,r){this.dal=e,this.projectId=r}read(e){rt(e);let r=this.dal.getDurableMemoryByName(this.projectId,e);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(e){rt(e.name);let r=this.dal.getDurableMemoryByName(this.projectId,e.name);return this.dal.upsertDurableMemory({project_id:this.projectId,type:e.type,name:e.name,description:e.description??null,body:e.body}),{created:r===null}}index(e){return this.dal.indexDurableMemory(this.projectId,e).map(n=>({name:n.name,type:n.type,description:n.description,updated_at:n.updated_at}))}list(e){return this.dal.listDurableMemory(this.projectId,e).map(n=>({name:n.name,type:n.type,updated_at:n.updated_at}))}delete(e){return rt(e),this.dal.deleteDurableMemory(this.projectId,e)}}});function Pg(t,e){let{dal:r}=e;t.get("/api/durable-memory/index/:project_id",n=>{let s=Number(n.req.param("project_id")),o=r.getProject(s);if(o===null)return n.json({error:"project not found"},404);let i=pt(o,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(i.index(l))}),t.get("/api/durable-memory/read/:project_id/:name",n=>{let s=Number(n.req.param("project_id")),o=n.req.param("name"),i=r.getProject(s);if(i===null)return n.json({error:"project not found"},404);let a=pt(i,r),l;try{l=a.read(o)}catch(c){return n.json({error:c.message},400)}return l===null?n.json({error:`memory entry not found: ${o}`},404):n.json(l)}),t.post("/api/durable-memory/write/:project_id",async n=>{let s=Number(n.req.param("project_id")),o=r.getProject(s);if(o===null)return n.json({error:"project not found"},404);let i;try{i=await n.req.json()}catch{return n.json({error:"invalid JSON body"},400)}let a=typeof i.type=="string"?i.type:null,l=typeof i.name=="string"?i.name:null,c=typeof i.body=="string"?i.body:null,u=typeof i.description=="string"?i.description:null;if(a===null||!Dg.has(a))return n.json({error:`invalid type: must be one of ${[...Dg].join("|")}`},400);if(l===null)return n.json({error:"missing name"},400);if(c===null)return n.json({error:"missing body"},400);let d=pt(o,r),f;try{({created:f}=d.write({type:a,name:l,description:u,body:c}))}catch(m){return n.json({error:m.message},400)}return n.json({success:!0,created_or_updated:f?"created":"updated"})}),t.get("/api/durable-memory/list/:project_id",n=>{let s=Number(n.req.param("project_id")),o=r.getProject(s);if(o===null)return n.json({error:"project not found"},404);let i=pt(o,r),a=n.req.query("type");return n.json(i.list(a))})}var Dg,Fg=T(()=>{"use strict";qu();Dg=new Set(["user","feedback","project","reference"])});function ej(t){let e=4294967295;for(let r=0;r<t.length;r+=1)e=(QL[(e^t[r])&255]^e>>>8)>>>0;return(e^4294967295)>>>0}function tj(t){let e=Math.max(1980,t.getFullYear()),r=(t.getHours()&31)<<11|(t.getMinutes()&63)<<5|Math.floor(t.getSeconds()/2)&31,n=(e-1980&127)<<9|(t.getMonth()+1&15)<<5|t.getDate()&31;return{time:r,date:n}}function Ug(t,e=new Date){let{time:r,date:n}=tj(e),s=[],o=[],i=0,a=new TextEncoder;for(let h of t){let g=a.encode(h.name),_=ej(h.data),S=h.data.length,w=new Uint8Array(30+g.length),E=new DataView(w.buffer);E.setUint32(0,67324752,!0),E.setUint16(4,20,!0),E.setUint16(6,0,!0),E.setUint16(8,0,!0),E.setUint16(10,r,!0),E.setUint16(12,n,!0),E.setUint32(14,_,!0),E.setUint32(18,S,!0),E.setUint32(22,S,!0),E.setUint16(26,g.length,!0),E.setUint16(28,0,!0),w.set(g,30),s.push(w,h.data);let I=new Uint8Array(46+g.length),x=new DataView(I.buffer);x.setUint32(0,33639248,!0),x.setUint16(4,20,!0),x.setUint16(6,20,!0),x.setUint16(8,0,!0),x.setUint16(10,0,!0),x.setUint16(12,r,!0),x.setUint16(14,n,!0),x.setUint32(16,_,!0),x.setUint32(20,S,!0),x.setUint32(24,S,!0),x.setUint16(28,g.length,!0),x.setUint16(30,0,!0),x.setUint16(32,0,!0),x.setUint16(34,0,!0),x.setUint16(36,0,!0),x.setUint32(38,0,!0),x.setUint32(42,i,!0),I.set(g,46),o.push(I),i+=w.length+h.data.length}let l=i,c=0;for(let h of o)c+=h.length;let u=new Uint8Array(22),d=new DataView(u.buffer);d.setUint32(0,101010256,!0),d.setUint16(4,0,!0),d.setUint16(6,0,!0),d.setUint16(8,t.length,!0),d.setUint16(10,t.length,!0),d.setUint32(12,c,!0),d.setUint32(16,l,!0),d.setUint16(20,0,!0);let f=l+c+u.length,m=new Uint8Array(f),p=0;for(let h of s)m.set(h,p),p+=h.length;for(let h of o)m.set(h,p),p+=h.length;return m.set(u,p),m}var QL,Wg=T(()=>{"use strict";QL=(()=>{let t=new Uint32Array(256);for(let e=0;e<256;e+=1){let r=e;for(let n=0;n<8;n+=1)r=r&1?3988292384^r>>>1:r>>>1;t[e]=r>>>0}return t})()});import{existsSync as Ki,mkdirSync as rj,readdirSync as nj,readFileSync as qg,statSync as sj,unlinkSync as oj,writeFileSync as ij}from"node:fs";import{join as As}from"node:path";function Jg(t,e){let{dal:r}=e;t.post("/api/projects",async n=>{let s=await ht(n);if(typeof s=="string")return $(n,s,400);let o=ae(s,"name"),i=ae(s,"local_path");if(o===null||o.length===0)return $(n,"missing or empty name",400);if(i===null||i.length===0)return $(n,"missing or empty local_path",400);if(r.findProjectByName(o)!==null)return $(n,`project already exists: ${o}`,409);let a=ae(s,"workflow_name")??"bugfix",l,c=ae(s,"team_name");if(c!==null&&c.length>0){let d=r.findTeamByName(c);if(d===null)return $(n,`team not found: ${c}`,404);l=d.id}else{let d=r.listTeams();if(d.length===0)return $(n,"no teams exist; create a team first",400);l=d[0].id}let u=r.insertProject({name:o,local_path:i,workflow_name:a,team_id:l,default_branch:ae(s,"default_branch")});return n.json(u,201)}),t.patch("/api/projects/:name",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return $(n,"project not found",404);let o=await ht(n);if(typeof o=="string")return $(n,o,400);let i={};if(Object.prototype.hasOwnProperty.call(o,"local_path")){let l=o.local_path;if(typeof l!="string"||l.length===0)return $(n,"local_path must be a non-empty string",400);i.local_path=l}if(Object.prototype.hasOwnProperty.call(o,"durable_memory_mode")){let l=o.durable_memory_mode;if(l!=="folder"&&l!=="db")return $(n,'durable_memory_mode must be "folder" or "db"',400);i.durable_memory_mode=l}if(Object.prototype.hasOwnProperty.call(o,"default_branch")){let l=o.default_branch;if(l!==null&&typeof l!="string")return $(n,"default_branch must be string or null",400);i.default_branch=l}if(Object.prototype.hasOwnProperty.call(o,"intake_config")){let l=o.intake_config;if(l===null)i.intake_config=null;else if(typeof l=="string")i.intake_config=l;else if(typeof l=="object"&&!Array.isArray(l))i.intake_config=JSON.stringify(l);else return $(n,"intake_config must be a JSON object, string, or null",400)}let a=r.updateProjectSettings(s.id,i);return a===null?$(n,"project not found",404):n.json(a)}),t.post("/api/teams",async n=>{let s=await ht(n);if(typeof s=="string")return $(n,s,400);let o=ae(s,"name");if(o===null||o.length===0)return $(n,"missing or empty name",400);if(r.findTeamByName(o)!==null)return $(n,`team already exists: ${o}`,409);let i=r.insertTeam({name:o});return n.json(i,201)}),t.post("/api/teams/:name/members",async n=>{let s=r.findTeamByName(n.req.param("name"));if(s===null)return $(n,"team not found",404);let o=await ht(n);if(typeof o=="string")return $(n,o,400);let i=ae(o,"alias"),a=ae(o,"provider");if(i===null||i.length===0)return $(n,"missing or empty alias",400);if(a===null||a.length===0)return $(n,"missing or empty provider",400);if(r.findTeamMemberByAlias(s.id,i)!==null)return $(n,`member already exists: ${i}`,409);let l=ae(o,"model"),c=r.insertTeamMember({team_id:s.id,alias:i,provider:a,model:l,sessiondir:`.lmctl/sessions/${s.name}/${i}`}),u=ae(o,"role_prompt");u!==null&&r.setMemberRolePrompt(c.id,u);let d=r.findTeamMemberByAlias(s.id,i);return n.json(d??c,201)}),t.put("/api/teams/:name/members/:alias",async n=>{let s=r.findTeamByName(n.req.param("name"));if(s===null)return $(n,"team not found",404);let o=r.findTeamMemberByAlias(s.id,n.req.param("alias"));if(o===null)return $(n,"member not found",404);let i=await ht(n);if(typeof i=="string")return $(n,i,400);let a={};if(Object.prototype.hasOwnProperty.call(i,"role_prompt")){let c=i.role_prompt;if(c!==null&&typeof c!="string")return $(n,"role_prompt must be string or null",400);a.role_prompt=c}if(Object.prototype.hasOwnProperty.call(i,"model")){let c=i.model;if(c!==null&&typeof c!="string")return $(n,"model must be string or null",400);a.model=c}if(Object.prototype.hasOwnProperty.call(i,"provider")){let c=i.provider;if(typeof c!="string"||c.length===0)return $(n,"provider must be a non-empty string",400);a.provider=c}if(Object.keys(a).length===0)return $(n,"no updatable fields provided",400);let l=r.updateTeamMemberMeta(o.id,a);return l===null?$(n,"member not found",404):n.json(l)}),t.get("/api/projects/:name/durable-memory",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return $(n,"project not found",404);let o=pt(s,r);return n.json(o.index())}),t.post("/api/projects/:name/durable-memory",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return $(n,"project not found",404);let o=await ht(n);if(typeof o=="string")return $(n,o,400);let i=ae(o,"name"),a=ae(o,"body"),l=ae(o,"type");if(i===null||i.length===0)return $(n,"missing or empty name",400);if(a===null)return $(n,"missing body",400);if(l===null||!Xi.includes(l))return $(n,`invalid type: must be one of ${Xi.join("|")}`,400);try{rt(i)}catch(d){return $(n,d.message,400)}let c=pt(s,r);try{if(c.read(i)!==null)return $(n,`chapter already exists: ${i}`,409)}catch(d){return $(n,d.message,400)}try{c.write({type:l,name:i,description:ae(o,"description"),body:a})}catch(d){return $(n,d.message,400)}let u=c.read(i);return u===null?$(n,"chapter created but unreadable",500):n.json(u,201)}),t.get("/api/projects/:name/durable-memory/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return $(n,"project not found",404);let o=pt(s,r),i;try{i=o.read(n.req.param("chapter"))}catch(a){return $(n,a.message,400)}return i===null?$(n,"chapter not found",404):n.json(i)}),t.put("/api/projects/:name/durable-memory/:chapter",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return $(n,"project not found",404);let o=n.req.param("chapter"),i=await ht(n);if(typeof i=="string")return $(n,i,400);let a=pt(s,r),l;try{l=a.read(o)}catch(m){return $(n,m.message,400)}if(l===null)return $(n,"chapter not found",404);let c=ae(i,"body")??l.body,u=Object.prototype.hasOwnProperty.call(i,"description")?ae(i,"description"):l.description,d=ae(i,"type")??l.type;if(!Xi.includes(d))return $(n,`invalid type: must be one of ${Xi.join("|")}`,400);try{a.write({type:d,name:o,description:u,body:c})}catch(m){return $(n,m.message,400)}let f=a.read(o);return f===null?$(n,"chapter updated but unreadable",500):n.json(f)}),t.delete("/api/projects/:name/durable-memory/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return $(n,"project not found",404);let o=pt(s,r),i;try{i=o.delete(n.req.param("chapter"))}catch(a){return $(n,a.message,400)}return i?n.json({removed:!0}):$(n,"chapter not found",404)}),t.get("/api/projects/:name/ai-test",n=>{let s=r.findProjectByName(n.req.param("name"));return s===null?$(n,"project not found",404):n.json(lj(s.local_path))}),t.post("/api/projects/:name/ai-test",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return $(n,"project not found",404);let o=await ht(n);if(typeof o=="string")return $(n,o,400);let i=ae(o,"name"),a=ae(o,"body"),l=ae(o,"type");if(i===null||i.length===0)return $(n,"missing or empty name",400);if(a===null)return $(n,"missing body",400);if(l===null||!Gi.has(l))return $(n,`invalid type: must be one of ${[...Gi].join("|")}`,400);try{rt(i)}catch(f){return $(n,f.message,400)}let c=Ns(s.local_path),u=As(c,`${i}.md`);if(Ki(u))return $(n,`chapter already exists: ${i}`,409);rj(c,{recursive:!0}),Hg(u,i,l,ae(o,"description"),a);let d=xs(c,i);return d===null?$(n,"chapter created but unreadable",500):n.json(d,201)}),t.get("/api/projects/:name/ai-test/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return $(n,"project not found",404);try{rt(n.req.param("chapter"))}catch(i){return $(n,i.message,400)}let o=xs(Ns(s.local_path),n.req.param("chapter"));return o===null?$(n,"chapter not found",404):n.json(o)}),t.put("/api/projects/:name/ai-test/:chapter",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return $(n,"project not found",404);let o=n.req.param("chapter");try{rt(o)}catch(m){return $(n,m.message,400)}let i=Ns(s.local_path),a=xs(i,o);if(a===null)return $(n,"chapter not found",404);let l=await ht(n);if(typeof l=="string")return $(n,l,400);let c=ae(l,"body")??a.body,u=Object.prototype.hasOwnProperty.call(l,"description")?ae(l,"description"):a.description,d=ae(l,"type")??a.type;if(!Gi.has(d))return $(n,`invalid type: must be one of ${[...Gi].join("|")}`,400);Hg(As(i,`${o}.md`),o,d,u,c);let f=xs(i,o);return f===null?$(n,"chapter updated but unreadable",500):n.json(f)}),t.delete("/api/projects/:name/ai-test/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return $(n,"project not found",404);let o=n.req.param("chapter");try{rt(o)}catch(a){return $(n,a.message,400)}let i=As(Ns(s.local_path),`${o}.md`);return Ki(i)?(oj(i),n.json({removed:!0})):$(n,"chapter not found",404)}),t.get("/api/tokens",n=>n.json([])),t.post("/api/tokens",n=>$(n,"scoped-tokens table not yet migrated; see briefs/scoped-tokens-design.md",501)),t.get("/api/settings",n=>n.json({})),t.patch("/api/settings",async n=>{let s=await ht(n);return typeof s=="string"?$(n,s,400):n.json({accepted:s,note:"settings persistence not yet implemented"})}),t.get("/api/chat/sessions",n=>n.json(r.listChatbotSessions(Bg))),t.post("/api/chat/sessions",async n=>{let s=await aj(n);if(typeof s=="string")return $(n,s,400);let o=s!==null?ae(s,"title"):null,i=r.createChatbotSession(Bg,o);return n.json(i,201)}),t.get("/api/chat/sessions/:id/messages",n=>{let s=n.req.param("id");return r.getChatbotSession(s)===null?$(n,"chat session not found",404):n.json(r.listChatbotMessages(s))}),t.post("/api/chat/sessions/:id/messages",async n=>{let s=n.req.param("id");if(r.getChatbotSession(s)===null)return $(n,"chat session not found",404);let o=await ht(n);if(typeof o=="string")return $(n,o,400);let i=ae(o,"role"),a=ae(o,"content");if(i===null||i!=="user"&&i!=="assistant"&&i!=="tool")return $(n,"role must be one of user|assistant|tool",400);if(a===null)return $(n,"missing content",400);let l=r.appendChatbotMessage(s,i,a);return n.json(l,201)}),t.get("/api/runs/:id/artifacts.zip",n=>{let s=Number(n.req.param("id"));if(!Number.isInteger(s))return $(n,"invalid run id",400);if(r.getRun(s)===null)return $(n,"run not found",404);let i=$r(r,s),a=[];for(let c of i){let u=uj(c),d=null;if(c.content!==null&&c.content!==void 0)d=new TextEncoder().encode(c.content);else if(c.path!==null&&c.path!==void 0)try{let f=qg(c.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);d=new Uint8Array(m)}catch{d=new Uint8Array(0)}d!==null&&a.push({name:u,data:d})}let l=Ug(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 $(t,e,r){return t.json({error:e},r)}async function ht(t){try{let e=await t.req.json();return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:"invalid JSON body"}catch{return"invalid JSON body"}}async function aj(t){let e=await t.req.text().catch(()=>"");if(e.trim().length===0)return null;try{let r=JSON.parse(e);return r!==null&&typeof r=="object"&&!Array.isArray(r)?r:"invalid JSON body"}catch{return"invalid JSON body"}}function ae(t,e){let r=t[e];return typeof r!="string"?null:r}function Ns(t){return As(t,"ai-test")}function xs(t,e){let r=As(t,`${e}.md`);if(!Ki(r))return null;let n=qg(r,"utf8"),s=cj(n),o=sj(r).mtime.toISOString();return{name:e,type:s.type,description:s.description,body:s.body,updated_at:o}}function lj(t){let e=Ns(t);return Ki(e)?nj(e).filter(r=>r.endsWith(".md")&&r!=="index.md").map(r=>r.slice(0,-3)).sort().map(r=>{let n=xs(e,r);if(n===null)return null;let{name:s,type:o,description:i,updated_at:a}=n;return{name:s,type:o,description:i,updated_at:a}}).filter(r=>r!==null):[]}function Hg(t,e,r,n,s){let o=n!==null&&n.length>0?`
1771
1771
  description: ${n}`:"",i=`---
1772
1772
  name: ${e}${o}
1773
1773
  type: ${r}
1774
1774
  ---
1775
- ${s}`;iL(t,i,"utf8")}function cL(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(e===null)return{type:"scenario",description:null,body:t};let r=e[1],n=e[2].trimStart(),s=r.match(/^type:\s*(.+)$/m),o=r.match(/^description:\s*(.+)$/m);return{type:s?.[1]?.trim()??"scenario",description:o?.[1]?.trim()??null,body:n}}function uL(t){let e=t.state_name.replace(/[^a-zA-Z0-9_-]+/g,"_"),r=t.kind.replace(/[^a-zA-Z0-9_-]+/g,"_"),n=t.path!==null?dL(t.path):fL(t.kind);return`step-${t.step_id}-${e}/${t.id}-${r}${n}`}function dL(t){let e=t.lastIndexOf(".");if(e<0)return"";let r=t.slice(e);return/^\.[A-Za-z0-9]+$/.test(r)?r:""}function fL(t){return t.endsWith("_md")||t.includes("markdown")?".md":t.endsWith("_json")||t.includes("json")?".json":".txt"}var Xi,Gi,Bg,Xg=T(()=>{"use strict";Bt();Wg();qu();Xi=["user","feedback","project","reference"],Gi=new Set(["smoke","integration","vision","scenario","regression"]),Bg="operator"});function je(t,e){return`<!doctype html>
1775
+ ${s}`;ij(t,i,"utf8")}function cj(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(e===null)return{type:"scenario",description:null,body:t};let r=e[1],n=e[2].trimStart(),s=r.match(/^type:\s*(.+)$/m),o=r.match(/^description:\s*(.+)$/m);return{type:s?.[1]?.trim()??"scenario",description:o?.[1]?.trim()??null,body:n}}function uj(t){let e=t.state_name.replace(/[^a-zA-Z0-9_-]+/g,"_"),r=t.kind.replace(/[^a-zA-Z0-9_-]+/g,"_"),n=t.path!==null?dj(t.path):fj(t.kind);return`step-${t.step_id}-${e}/${t.id}-${r}${n}`}function dj(t){let e=t.lastIndexOf(".");if(e<0)return"";let r=t.slice(e);return/^\.[A-Za-z0-9]+$/.test(r)?r:""}function fj(t){return t.endsWith("_md")||t.includes("markdown")?".md":t.endsWith("_json")||t.includes("json")?".json":".txt"}var Xi,Gi,Bg,Xg=T(()=>{"use strict";Bt();Wg();qu();Xi=["user","feedback","project","reference"],Gi=new Set(["smoke","integration","vision","scenario","regression"]),Bg="operator"});function Le(t,e){return`<!doctype html>
1776
1776
  <html lang="en">
1777
1777
  <head>
1778
1778
  <meta charset="utf-8">
@@ -1839,40 +1839,40 @@ ${s}`;iL(t,i,"utf8")}function cL(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r
1839
1839
  JOIN step s ON s.id = sa.step_id
1840
1840
  WHERE s.run_id = ? ORDER BY sa.id ASC`,t),l=new Map;for(let R of a){let ee=l.get(R.step_id)??[];ee.push({kind:R.kind,id:R.id}),l.set(R.step_id,ee)}let c=i.map(R=>({id:R.id,state_name:R.state_name,outcome:R.outcome,duration_ms:R.started_at!==null&&R.ended_at!==null?Math.max(0,new Date(R.ended_at).getTime()-new Date(R.started_at).getTime()):null,artifacts:l.get(R.id)??[]})),u=e.query("SELECT kind, COUNT(*) AS count FROM session_event WHERE run_id = ? GROUP BY kind",t),d=e.query("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'tool_result' AND payload_truncated = 0",t),f=0;for(let R of d)try{let ee=JSON.parse(R.payload);typeof ee.elapsedMs=="number"&&ee.elapsedMs>0&&(f+=ee.elapsedMs)}catch{}let m=u.map(R=>({kind:R.kind,count:R.count,total_elapsed_ms:R.kind==="tool_result"?f:0})),p=c.filter(R=>R.outcome==="request_changes"),h=[...new Set(p.map(R=>R.state_name))],g=new Date(n.started_at).getTime(),_=n.ended_at!==null?new Date(n.ended_at).getTime():Date.now(),w=e.query("SELECT project_id FROM job WHERE id = ?",n.job_id)[0]?.project_id??null,E=w!==null?e.query(`SELECT id, signal_kind, severity, description, detected_at FROM drift_signal
1841
1841
  WHERE project_id = ? AND detected_at >= ? AND detected_at <= ? ORDER BY detected_at ASC`,w,g,_):[],x=e.query(`SELECT SUM(input_tokens) AS input, SUM(output_tokens) AS output
1842
- FROM session_size WHERE observed_at >= ? AND observed_at <= ?`,n.started_at,n.ended_at??new Date().toISOString())[0],H=x?.input!==null&&x?.input!==void 0?`input: ${x.input}, output: ${x.output??0}`:"n/a",ue=e.getWorkflow(n.workflow_id),q=n.started_at!==null&&n.ended_at!==null?Math.max(0,new Date(n.ended_at).getTime()-new Date(n.started_at).getTime()):null,P={run_id:t,workflow_name:ue?.name??null,started_at:n.started_at,ended_at:n.ended_at,terminal_state:n.terminal_state,duration_ms:q,steps:c,tool_stats:m,reviewer_interventions:{count:p.length,state_names:h},drift_signals:E,token_totals:H};e.insertStepArtifact({step_id:o,kind:"run_report",content:JSON.stringify(P)})}var Kg=T(()=>{"use strict"});import{spawnSync as Yg}from"node:child_process";function Xu(t){return mL[t]??`no install hint; ensure '${t}' is on PATH`}function pL(t){switch(t){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 Vg(t){return Yg("which",[t],{encoding:"utf8"}).status===0}function zg(t){if(t===void 0)return null;for(let e of t.tools??[])if(!Vg(e)){let r=Xu(e);return{kind:"missing_tool",tool:e,install_hint:r,message:`missing dependency: ${e}; ${r}`}}for(let e of t.auth??[]){if(!Vg(e)){let s=Xu(e);return{kind:"missing_tool",tool:e,install_hint:s,message:`missing dependency: ${e}; ${s}`}}let r=pL(e);if(r===null)continue;let n=Yg(e,r.args,{encoding:"utf8"});if(n.status!==0){let s=typeof n.stderr=="string"?n.stderr.trim():"";return{kind:"auth_failed",tool:e,install_hint:Xu(e),message:`${e} not authenticated; run \`${e} login\` or equivalent`,detail:s.length>0?s:void 0}}}return null}var mL,Zg=T(()=>{"use strict";mL={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 hL,readdirSync as _L,readFileSync as gL}from"node:fs";import{join as Qg}from"node:path";function yL(t){let e=t.match(/^---\n([\s\S]*?)\n---/);if(!e)return[];let r=e[1],n=r.match(/^tags:\s*\[([^\]]*)\]/m);if(n)return n[1].split(",").map(o=>o.trim()).filter(Boolean);let s=r.match(/^tags:\s*\n((?:\s*-\s+.+\n?)*)/m);return s?s[1].split(`
1843
- `).map(o=>o.replace(/^\s*-\s+/,"").trim()).filter(Boolean):[]}function ey(t,e){let r=t.match(/^---\n([\s\S]*?)\n---/);if(!r)return null;let s=r[1].match(new RegExp(`^${e}:\\s*(.+)$`,"m"));return s?s[1].trim():null}function ty(t,e){if(e.length===0)return null;let r=Qg(t,"durable-memory");if(!hL(r))return null;let n;try{n=_L(r).filter(o=>o.endsWith(".md")&&o!=="index.md")}catch{return null}let s=[];for(let o of n)try{let i=gL(Qg(r,o),"utf8");if(yL(i).some(l=>e.includes(l))){let l=ey(i,"name")??o.replace(".md",""),c=ey(i,"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 ry=T(()=>{"use strict"});function Vu(t){let e=t.trim().replace(wL,"").trim();for(let r=0;r<4;r+=1){let n=EL.exec(e);if(n===null)break;e=n[2].trim()}return e}function ny(t){let e=t.trim(),r=TL.exec(e);if(r!==null)return r[2];let n=bL.exec(e);return n!==null?n[0]:null}function As(t,e){let r=t.split(`
1842
+ FROM session_size WHERE observed_at >= ? AND observed_at <= ?`,n.started_at,n.ended_at??new Date().toISOString())[0],H=x?.input!==null&&x?.input!==void 0?`input: ${x.input}, output: ${x.output??0}`:"n/a",ue=e.getWorkflow(n.workflow_id),q=n.started_at!==null&&n.ended_at!==null?Math.max(0,new Date(n.ended_at).getTime()-new Date(n.started_at).getTime()):null,P={run_id:t,workflow_name:ue?.name??null,started_at:n.started_at,ended_at:n.ended_at,terminal_state:n.terminal_state,duration_ms:q,steps:c,tool_stats:m,reviewer_interventions:{count:p.length,state_names:h},drift_signals:E,token_totals:H};e.insertStepArtifact({step_id:o,kind:"run_report",content:JSON.stringify(P)})}var Kg=T(()=>{"use strict"});import{spawnSync as Yg}from"node:child_process";function Xu(t){return mj[t]??`no install hint; ensure '${t}' is on PATH`}function pj(t){switch(t){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 Vg(t){return Yg("which",[t],{encoding:"utf8"}).status===0}function zg(t){if(t===void 0)return null;for(let e of t.tools??[])if(!Vg(e)){let r=Xu(e);return{kind:"missing_tool",tool:e,install_hint:r,message:`missing dependency: ${e}; ${r}`}}for(let e of t.auth??[]){if(!Vg(e)){let s=Xu(e);return{kind:"missing_tool",tool:e,install_hint:s,message:`missing dependency: ${e}; ${s}`}}let r=pj(e);if(r===null)continue;let n=Yg(e,r.args,{encoding:"utf8"});if(n.status!==0){let s=typeof n.stderr=="string"?n.stderr.trim():"";return{kind:"auth_failed",tool:e,install_hint:Xu(e),message:`${e} not authenticated; run \`${e} login\` or equivalent`,detail:s.length>0?s:void 0}}}return null}var mj,Zg=T(()=>{"use strict";mj={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 hj,readdirSync as _j,readFileSync as gj}from"node:fs";import{join as Qg}from"node:path";function yj(t){let e=t.match(/^---\n([\s\S]*?)\n---/);if(!e)return[];let r=e[1],n=r.match(/^tags:\s*\[([^\]]*)\]/m);if(n)return n[1].split(",").map(o=>o.trim()).filter(Boolean);let s=r.match(/^tags:\s*\n((?:\s*-\s+.+\n?)*)/m);return s?s[1].split(`
1843
+ `).map(o=>o.replace(/^\s*-\s+/,"").trim()).filter(Boolean):[]}function ey(t,e){let r=t.match(/^---\n([\s\S]*?)\n---/);if(!r)return null;let s=r[1].match(new RegExp(`^${e}:\\s*(.+)$`,"m"));return s?s[1].trim():null}function ty(t,e){if(e.length===0)return null;let r=Qg(t,"durable-memory");if(!hj(r))return null;let n;try{n=_j(r).filter(o=>o.endsWith(".md")&&o!=="index.md")}catch{return null}let s=[];for(let o of n)try{let i=gj(Qg(r,o),"utf8");if(yj(i).some(l=>e.includes(l))){let l=ey(i,"name")??o.replace(".md",""),c=ey(i,"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 ry=T(()=>{"use strict"});function Vu(t){let e=t.trim().replace(wj,"").trim();for(let r=0;r<4;r+=1){let n=Ej.exec(e);if(n===null)break;e=n[2].trim()}return e}function ny(t){let e=t.trim(),r=Tj.exec(e);if(r!==null)return r[2];let n=bj.exec(e);return n!==null?n[0]:null}function Rs(t,e){let r=t.split(`
1844
1844
  `),n=null,s=-1;for(let i=0;i<r.length;i+=1){let a=Vu(r[i]),l=Gu.exec(a);if(l===null)continue;let c=l[1].trim();if(Ku.test(c))continue;let u=ny(c);u!==null&&(n=u,s=i)}if(n===null)return{outcome:null,reason:"no_stance"};if(!e.includes(n))return{outcome:null,reason:"unknown_outcome",actual:n};let o={};for(let i=s-1;i>=0;i-=1){let a=Vu(r[i]),l=Gu.exec(a);if(l===null)break;let c=Ku.exec(l[1].trim());if(c===null)break;o[c[1]]=c[2].trim()}return{outcome:n,evidence:o}}function sy(t){let e=t.split(`
1845
- `),r=null;for(let n=0;n<e.length;n+=1){let s=Vu(e[n]),o=Gu.exec(s);if(o===null)continue;let i=o[1].trim();if(Ku.test(i))continue;let a=ny(i);if(a===null||!Gr(a))continue;let c=i.slice(i.indexOf(a)+a.length).replace(/^[`*_:\s\-–—]+/,"").trim();r={token:a,reason:c}}return r}var wL,EL,Gu,Ku,TL,bL,Yu=T(()=>{"use strict";es();wL=/^#{1,6}\s+/,EL=/^(```|\*\*|__|`|\*|_)([\s\S]+?)\1$/,Gu=/^STANCE:\s+(.+)$/,Ku=/^([A-Z][A-Z0-9_]*):\s*(.+)$/,TL=/^(```|\*\*|__|`|\*|_)([A-Za-z0-9_-]+)\1/,bL=/^[A-Za-z0-9_-]+/});function oy(t,e,r){return n=>{let s=r(),o=Date.now(),i=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(i,"utf8");if(a<=262144){t.insertSessionEvent({run_id:e,step_id:s,kind:n.kind,timestamp_ms:o,payload:i});return}let l=i.slice(0,1024),c=JSON.stringify({truncated:!0,size:a,preview:l});if(s!==null){let u=t.insertStepArtifact({step_id:s,kind:"session_event_overflow",content:i});t.insertSessionEvent({run_id:e,step_id:s,kind:n.kind,timestamp_ms:o,payload:c,payload_truncated:1,overflow_artifact_id:u.id})}else t.insertSessionEvent({run_id:e,step_id:null,kind:n.kind,timestamp_ms:o,payload:c,payload_truncated:1,overflow_artifact_id:null})}}var iy=T(()=>{"use strict"});import{readFileSync as SL}from"node:fs";import{dirname as kL,join as vL}from"node:path";import{fileURLToPath as IL}from"node:url";function AL(t){return t.rules.map(e=>({command:e.command,subcommands:e.argv_patterns.map(r=>r.trim().split(/\s+/)),kind:e.kind}))}function LL(t){let e=[],r=[];for(let n of t)NL.has(n)?(r.length>0&&e.push(r),r=[]):r.push(n);return r.length>0&&e.push(r),e}function OL(t,e){if(t.length===0)return{matched:!1};let r=0;for(;r<t.length&&xL.test(t[r]);)r+=1;if(r>=t.length)return{matched:!1};let n=t[r],s=t.slice(r+1);for(let o of e)if(n===o.command){for(let i of o.subcommands)if(i.every((l,c)=>s[c]===l))return{matched:!0,kind:o.kind}}return{matched:!1}}function CL(t,e){if(t.length===0)return{matched:!1};let r=LL(t);for(let n of r){let s=OL(n,e);if(s.matched)return s}return{matched:!1}}function zu(t){return CL(t,jL)}function ML(t){return t.replace(/&&/g," && ").replace(/\|\|/g," || ").replace(/;/g," ; ").replace(/\|/g," | ").replace(/(?<!\d)>{1,2}/g,e=>` ${e} `).replace(/(?<!\d)<{1,2}/g,e=>` ${e} `).replace(/\s+/g," ").trim()}function Zu(t){return ML(t).split(" ").filter(e=>e.length>0)}var NL,xL,RL,$L,jL,ay=T(()=>{"use strict";NL=new Set(["&&","||",";","|",">",">>","<","<<"]),xL=/^[A-Za-z_][A-Za-z0-9_]*=/;RL=kL(IL(import.meta.url)),$L=JSON.parse(SL(vL(RL,"side_effect_classifier.json"),"utf-8")),jL=AL($L)});function Vi(t){return{context:{outcomes:t.outcomes,inputs:t.inputs,item:t.iteration?.item,index:t.iteration?.index},outcomes:t.outcomes,inputs:t.inputs,item:t.iteration?.item,index:t.iteration?.index}}async function ly(t,e){try{return await Or(Qu(t)??t,Vi(e))===!0}catch{return!1}}async function Yi(t,e){try{return await Or(Qu(t)??t,Vi(e))}catch{return}}async function cy(t,e){if(typeof t!="string")return t;let r=Qu(t);if(r===null)return t;try{return await Or(r,Vi(e))}catch{return}}async function uy(t,e){let r=Array.from(t.matchAll(/=\{\{([\s\S]*?)\}\}/g));if(r.length===0)return t;let n="",s=0;for(let o of r){let i=o.index??0;n+=t.slice(s,i);let a=o[1]?.trim()??"";try{n+=DL(await Or(a,Vi(e)))}catch{n+=""}s=i+o[0].length}return n+=t.slice(s),n}function Qu(t){let e=t.trim();return!e.startsWith("={{")||!e.endsWith("}}")?null:e.slice(3,-2).trim()}function DL(t){return t==null?"":typeof t=="string"?t:JSON.stringify(t)}var Rs=T(()=>{"use strict";_n()});import{existsSync as dy,readdirSync as fy,readFileSync as PL,statSync as my}from"node:fs";import{join as Zi}from"node:path";function py(t,e,r,n){return Object.assign(t,{stateId:e,state:r,displayName:n})}function X(t,e){return t.dal.insertStep({...e,parent_step_id:t.parent_step_id})}function K(t,e){return e.startsWith("@terminal:")?{kind:"terminal",terminal:e.slice(10)}:t.states[e]===void 0?{kind:"escalate",token:e,reason:`unknown state ref '${e}'`}:{kind:"state",state:e}}function nt(t,e,r,n,s={}){let o=O(),i=X(t,{run_id:t.run_id,state_name:e.name});t.steps_executed+=1,t.dal.finishStep(i.id,null,`escalation:${n}`.slice(0,480)),t.dal.setRunPausedState(t.run_id,`${$s}${e.id}`,o);let a=t.dal.getRun(t.run_id),l=Gr(r)?"generic":"unhandled";return t.dal.raiseAttention({kind:go,severity:"attn",project_id:t.project.id,run_id:t.run_id,requires_user:!0,payload:JSON.stringify({run_id:t.run_id,step_id:i.id,project_id:t.project.id,workflow_name:t.workflow.name,workflow_version_id:a?.workflow_version_id??null,step:{id:e.id,name:e.name,type:e.type},tier:l,token:r,reason:n,declared_outcomes:[...s.declared_outcomes??[]],agent_output:FL(s.agent_output??n),paused_at:o,created_at:o})}),t.dal.pauseJob(t.job.id),{kind:"paused"}}function FL(t){return t.length>8e3?`${t.slice(0,8e3)}
1846
- \u2026[truncated ${t.length-8e3} chars]`:t}function V(t,e,r,n){t.outcomes[e]=n,r!==e&&(t.outcomes[r]=n)}function Z(t){return t.terminals.aborted?.kind==="failure"?"aborted":Object.entries(t.terminals).find(([,r])=>r.kind==="failure")?.[0]??Object.keys(t.terminals)[0]??"aborted"}function hy(t,e){let r=e.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 o=pr(t.job.payload)?.[n];if(Array.isArray(o)&&o.every(i=>typeof i=="string"))return o}return null}async function Ve(t,e,r){let n=t.replace(/(?<!=)\{\{\s*([a-zA-Z0-9_.]+)\s*\}\}/g,(s,o)=>{if(o==="run_id")return String(e.run_id);if(o==="state_id")return r;if(o==="item")return e.iteration?.item??"";if(o==="index")return e.iteration===null?"":String(e.iteration.index);if(o.startsWith("project.")){let i=o.slice(8);if(i==="id")return String(e.project.id);if(i==="name")return e.project.name;if(i==="local_path")return e.project.local_path;if(i==="default_branch")return e.project.default_branch??"";if(i==="owner"){let a=e.project.name.indexOf("/");return a>0?e.project.name.slice(0,a):""}if(i==="repo"){let a=e.project.name.indexOf("/");return a>0?e.project.name.slice(a+1):e.project.name}if(i==="test_command"){let a=e.project.test_command;return a===null||a===""?"npm test":a}return""}if(o==="job_payload"){let i=pr(e.job.payload);return i===null?"":JSON.stringify(i)}if(o.startsWith("job_payload.")){let i=o.slice(12),l=pr(e.job.payload)?.[i];return l==null?"":String(l)}if(o.startsWith("outcomes.")){let i=UL(e.outcomes,o.slice(9));return i==null?"":typeof i=="string"?i:JSON.stringify(i)}return""});return uy(n,e)}function UL(t,e){let r=t;for(let n of e.split(".")){if(r===null||typeof r!="object"||Array.isArray(r))return;r=r[n]}return r}function pr(t){if(t===null)return null;try{let e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:null}catch{return null}}async function js(t){let{context:e,stateId:r,member:n,prompt:s,stepId:o,timeoutMs:i,writesToProjectPath:a}=t,l=oy(e.dal,e.run_id,()=>o),c=ed(e,r),u={violation:null},d=S=>{if(l(S),u.violation===null&&S.kind==="tool_use"&&S.tool==="Bash"&&S.summary){let w=Zu(S.summary),E=zu(w);E.matched&&!c&&(u.violation={summary:S.summary,kind:E.kind})}},f=new Date(Date.now()-1),m=0,p=0,h=S=>{d(S),WL(S,(w,E)=>{m+=w,p+=E})},g=await tn({sessionid:n.sessionid,sessiondir:n.sessiondir,prompt:s,timeoutMs:i,dal:e.dal,team_member_id:n.id,onProgress:h});e.dal.insertSessionEvent({run_id:e.run_id,step_id:o,kind:"agent_call",timestamp_ms:Date.now(),payload:JSON.stringify({alias:n.alias,provider:Ae(n),model:n.model??"unknown",tokens_in:m,tokens_out:p,wall_time_ms:g.ms})}),BL(e.project,e.dal,f);let _=u.violation;return _!==null?{kind:"g3_violation",summary:_.summary,violationKind:_.kind}:!a&&e.project.local_path.trim().length>0&&td(e.project.local_path,f)?{kind:"g2_violation"}:{kind:"ok",text:g.text,ms:g.ms,argv:g.argv}}function WL(t,e){let r=t.raw;if(r==null)return;let s=r.message?.usage;if(s!==void 0){let i=zi(s.input_tokens),a=zi(s.output_tokens);(i>0||a>0)&&e(i,a);return}let o=r.usage;if(o!==void 0){let i=zi(o.input_tokens),a=zi(o.output_tokens);(i>0||a>0)&&e(i,a)}}function zi(t){return typeof t=="number"&&Number.isFinite(t)&&t>=0?t:0}async function Gt(t,e,r,n){if(r.sessionid===null)return;let s=`${e}:write_back`,o=X(t,{run_id:t.run_id,state_name:s});t.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 js({context:t,stateId:s,member:r,prompt:a,stepId:o.id,timeoutMs:t.workflow.default_task_timeout_ms,writesToProjectPath:!1});if(l.kind==="ok"){t.dal.insertStepArtifact({step_id:o.id,kind:"write_back_transcript",content:l.text});let c=!l.text.includes("STANCE: no_writeback");t.dal.finishStep(o.id,c?"wrote_back":"no_writeback","write_back_turn")}else t.dal.finishStep(o.id,null,`write_back_${l.kind}`)}catch{t.dal.finishStep(o.id,null,"write_back_error")}}async function Sn(t,e,r,n,s,o,i,a=!1,l){let c=t.membersByAlias.get(r.alias);if(c===void 0||c.sessionid===null)return{outcome:null,text:"",status_detail:`missing_agent:${r.alias}`};let u=X(t,{run_id:t.run_id,state_name:e});t.steps_executed+=1;let d=[];c.prompt_snapshot!==null&&c.prompt_snapshot.length>0&&d.push(c.prompt_snapshot),o&&d.push(np(s)),l!=null&&l.length>0&&d.push(l);let f=r.prompt_template!==void 0?await Ve(r.prompt_template,t,e):"";f.length>0&&d.push(f),n!==null&&n.length>0&&d.push(n);let m=d.join(`
1845
+ `),r=null;for(let n=0;n<e.length;n+=1){let s=Vu(e[n]),o=Gu.exec(s);if(o===null)continue;let i=o[1].trim();if(Ku.test(i))continue;let a=ny(i);if(a===null||!Gr(a))continue;let c=i.slice(i.indexOf(a)+a.length).replace(/^[`*_:\s\-–—]+/,"").trim();r={token:a,reason:c}}return r}var wj,Ej,Gu,Ku,Tj,bj,Yu=T(()=>{"use strict";ts();wj=/^#{1,6}\s+/,Ej=/^(```|\*\*|__|`|\*|_)([\s\S]+?)\1$/,Gu=/^STANCE:\s+(.+)$/,Ku=/^([A-Z][A-Z0-9_]*):\s*(.+)$/,Tj=/^(```|\*\*|__|`|\*|_)([A-Za-z0-9_-]+)\1/,bj=/^[A-Za-z0-9_-]+/});function oy(t,e,r){return n=>{let s=r(),o=Date.now(),i=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(i,"utf8");if(a<=262144){t.insertSessionEvent({run_id:e,step_id:s,kind:n.kind,timestamp_ms:o,payload:i});return}let l=i.slice(0,1024),c=JSON.stringify({truncated:!0,size:a,preview:l});if(s!==null){let u=t.insertStepArtifact({step_id:s,kind:"session_event_overflow",content:i});t.insertSessionEvent({run_id:e,step_id:s,kind:n.kind,timestamp_ms:o,payload:c,payload_truncated:1,overflow_artifact_id:u.id})}else t.insertSessionEvent({run_id:e,step_id:null,kind:n.kind,timestamp_ms:o,payload:c,payload_truncated:1,overflow_artifact_id:null})}}var iy=T(()=>{"use strict"});import{readFileSync as Sj}from"node:fs";import{dirname as kj,join as vj}from"node:path";import{fileURLToPath as Ij}from"node:url";function Aj(t){return t.rules.map(e=>({command:e.command,subcommands:e.argv_patterns.map(r=>r.trim().split(/\s+/)),kind:e.kind}))}function jj(t){let e=[],r=[];for(let n of t)Nj.has(n)?(r.length>0&&e.push(r),r=[]):r.push(n);return r.length>0&&e.push(r),e}function Oj(t,e){if(t.length===0)return{matched:!1};let r=0;for(;r<t.length&&xj.test(t[r]);)r+=1;if(r>=t.length)return{matched:!1};let n=t[r],s=t.slice(r+1);for(let o of e)if(n===o.command){for(let i of o.subcommands)if(i.every((l,c)=>s[c]===l))return{matched:!0,kind:o.kind}}return{matched:!1}}function Cj(t,e){if(t.length===0)return{matched:!1};let r=jj(t);for(let n of r){let s=Oj(n,e);if(s.matched)return s}return{matched:!1}}function zu(t){return Cj(t,Lj)}function Mj(t){return t.replace(/&&/g," && ").replace(/\|\|/g," || ").replace(/;/g," ; ").replace(/\|/g," | ").replace(/(?<!\d)>{1,2}/g,e=>` ${e} `).replace(/(?<!\d)<{1,2}/g,e=>` ${e} `).replace(/\s+/g," ").trim()}function Zu(t){return Mj(t).split(" ").filter(e=>e.length>0)}var Nj,xj,Rj,$j,Lj,ay=T(()=>{"use strict";Nj=new Set(["&&","||",";","|",">",">>","<","<<"]),xj=/^[A-Za-z_][A-Za-z0-9_]*=/;Rj=kj(Ij(import.meta.url)),$j=JSON.parse(Sj(vj(Rj,"side_effect_classifier.json"),"utf-8")),Lj=Aj($j)});function Vi(t){return{context:{outcomes:t.outcomes,inputs:t.inputs,item:t.iteration?.item,index:t.iteration?.index},outcomes:t.outcomes,inputs:t.inputs,item:t.iteration?.item,index:t.iteration?.index}}async function ly(t,e){try{return await Or(Qu(t)??t,Vi(e))===!0}catch{return!1}}async function Yi(t,e){try{return await Or(Qu(t)??t,Vi(e))}catch{return}}async function cy(t,e){if(typeof t!="string")return t;let r=Qu(t);if(r===null)return t;try{return await Or(r,Vi(e))}catch{return}}async function uy(t,e){let r=Array.from(t.matchAll(/=\{\{([\s\S]*?)\}\}/g));if(r.length===0)return t;let n="",s=0;for(let o of r){let i=o.index??0;n+=t.slice(s,i);let a=o[1]?.trim()??"";try{n+=Dj(await Or(a,Vi(e)))}catch{n+=""}s=i+o[0].length}return n+=t.slice(s),n}function Qu(t){let e=t.trim();return!e.startsWith("={{")||!e.endsWith("}}")?null:e.slice(3,-2).trim()}function Dj(t){return t==null?"":typeof t=="string"?t:JSON.stringify(t)}var $s=T(()=>{"use strict";_n()});import{existsSync as dy,readdirSync as fy,readFileSync as Pj,statSync as my}from"node:fs";import{join as Zi}from"node:path";function py(t,e,r,n){return Object.assign(t,{stateId:e,state:r,displayName:n})}function X(t,e){return t.dal.insertStep({...e,parent_step_id:t.parent_step_id})}function K(t,e){return e.startsWith("@terminal:")?{kind:"terminal",terminal:e.slice(10)}:t.states[e]===void 0?{kind:"escalate",token:e,reason:`unknown state ref '${e}'`}:{kind:"state",state:e}}function nt(t,e,r,n,s={}){let o=O(),i=X(t,{run_id:t.run_id,state_name:e.name});t.steps_executed+=1,t.dal.finishStep(i.id,null,`escalation:${n}`.slice(0,480)),t.dal.setRunPausedState(t.run_id,`${Ls}${e.id}`,o);let a=t.dal.getRun(t.run_id),l=Gr(r)?"generic":"unhandled";return t.dal.raiseAttention({kind:go,severity:"attn",project_id:t.project.id,run_id:t.run_id,requires_user:!0,payload:JSON.stringify({run_id:t.run_id,step_id:i.id,project_id:t.project.id,workflow_name:t.workflow.name,workflow_version_id:a?.workflow_version_id??null,step:{id:e.id,name:e.name,type:e.type},tier:l,token:r,reason:n,declared_outcomes:[...s.declared_outcomes??[]],agent_output:Fj(s.agent_output??n),paused_at:o,created_at:o})}),t.dal.pauseJob(t.job.id),{kind:"paused"}}function Fj(t){return t.length>8e3?`${t.slice(0,8e3)}
1846
+ \u2026[truncated ${t.length-8e3} chars]`:t}function V(t,e,r,n){t.outcomes[e]=n,r!==e&&(t.outcomes[r]=n)}function Z(t){return t.terminals.aborted?.kind==="failure"?"aborted":Object.entries(t.terminals).find(([,r])=>r.kind==="failure")?.[0]??Object.keys(t.terminals)[0]??"aborted"}function hy(t,e){let r=e.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 o=pr(t.job.payload)?.[n];if(Array.isArray(o)&&o.every(i=>typeof i=="string"))return o}return null}async function Ve(t,e,r){let n=t.replace(/(?<!=)\{\{\s*([a-zA-Z0-9_.]+)\s*\}\}/g,(s,o)=>{if(o==="run_id")return String(e.run_id);if(o==="state_id")return r;if(o==="item")return e.iteration?.item??"";if(o==="index")return e.iteration===null?"":String(e.iteration.index);if(o.startsWith("project.")){let i=o.slice(8);if(i==="id")return String(e.project.id);if(i==="name")return e.project.name;if(i==="local_path")return e.project.local_path;if(i==="default_branch")return e.project.default_branch??"";if(i==="owner"){let a=e.project.name.indexOf("/");return a>0?e.project.name.slice(0,a):""}if(i==="repo"){let a=e.project.name.indexOf("/");return a>0?e.project.name.slice(a+1):e.project.name}if(i==="test_command"){let a=e.project.test_command;return a===null||a===""?"npm test":a}return""}if(o==="job_payload"){let i=pr(e.job.payload);return i===null?"":JSON.stringify(i)}if(o.startsWith("job_payload.")){let i=o.slice(12),l=pr(e.job.payload)?.[i];return l==null?"":String(l)}if(o.startsWith("outcomes.")){let i=Uj(e.outcomes,o.slice(9));return i==null?"":typeof i=="string"?i:JSON.stringify(i)}return""});return uy(n,e)}function Uj(t,e){let r=t;for(let n of e.split(".")){if(r===null||typeof r!="object"||Array.isArray(r))return;r=r[n]}return r}function pr(t){if(t===null)return null;try{let e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:null}catch{return null}}async function js(t){let{context:e,stateId:r,member:n,prompt:s,stepId:o,timeoutMs:i,writesToProjectPath:a}=t,l=oy(e.dal,e.run_id,()=>o),c=ed(e,r),u={violation:null},d=S=>{if(l(S),u.violation===null&&S.kind==="tool_use"&&S.tool==="Bash"&&S.summary){let w=Zu(S.summary),E=zu(w);E.matched&&!c&&(u.violation={summary:S.summary,kind:E.kind})}},f=new Date(Date.now()-1),m=0,p=0,h=S=>{d(S),Wj(S,(w,E)=>{m+=w,p+=E})},g=await tn({sessionid:n.sessionid,sessiondir:n.sessiondir,prompt:s,timeoutMs:i,dal:e.dal,team_member_id:n.id,onProgress:h});e.dal.insertSessionEvent({run_id:e.run_id,step_id:o,kind:"agent_call",timestamp_ms:Date.now(),payload:JSON.stringify({alias:n.alias,provider:Ae(n),model:n.model??"unknown",tokens_in:m,tokens_out:p,wall_time_ms:g.ms})}),Bj(e.project,e.dal,f);let _=u.violation;return _!==null?{kind:"g3_violation",summary:_.summary,violationKind:_.kind}:!a&&e.project.local_path.trim().length>0&&td(e.project.local_path,f)?{kind:"g2_violation"}:{kind:"ok",text:g.text,ms:g.ms,argv:g.argv}}function Wj(t,e){let r=t.raw;if(r==null)return;let s=r.message?.usage;if(s!==void 0){let i=zi(s.input_tokens),a=zi(s.output_tokens);(i>0||a>0)&&e(i,a);return}let o=r.usage;if(o!==void 0){let i=zi(o.input_tokens),a=zi(o.output_tokens);(i>0||a>0)&&e(i,a)}}function zi(t){return typeof t=="number"&&Number.isFinite(t)&&t>=0?t:0}async function Gt(t,e,r,n){if(r.sessionid===null)return;let s=`${e}:write_back`,o=X(t,{run_id:t.run_id,state_name:s});t.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 js({context:t,stateId:s,member:r,prompt:a,stepId:o.id,timeoutMs:t.workflow.default_task_timeout_ms,writesToProjectPath:!1});if(l.kind==="ok"){t.dal.insertStepArtifact({step_id:o.id,kind:"write_back_transcript",content:l.text});let c=!l.text.includes("STANCE: no_writeback");t.dal.finishStep(o.id,c?"wrote_back":"no_writeback","write_back_turn")}else t.dal.finishStep(o.id,null,`write_back_${l.kind}`)}catch{t.dal.finishStep(o.id,null,"write_back_error")}}async function Sn(t,e,r,n,s,o,i,a=!1,l){let c=t.membersByAlias.get(r.alias);if(c===void 0||c.sessionid===null)return{outcome:null,text:"",status_detail:`missing_agent:${r.alias}`};let u=X(t,{run_id:t.run_id,state_name:e});t.steps_executed+=1;let d=[];c.prompt_snapshot!==null&&c.prompt_snapshot.length>0&&d.push(c.prompt_snapshot),o&&d.push(np(s)),l!=null&&l.length>0&&d.push(l);let f=r.prompt_template!==void 0?await Ve(r.prompt_template,t,e):"";f.length>0&&d.push(f),n!==null&&n.length>0&&d.push(n);let m=d.join(`
1847
1847
 
1848
- `);try{let p=await js({context:t,stateId:e,member:c,prompt:m,stepId:u.id,timeoutMs:i,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 t.dal.insertSessionEvent({run_id:t.run_id,step_id:u.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(p.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:e,kind:p.violationKind,command_summary:p.summary,message:`State ${e} ran a classified side-effect command (${p.violationKind}) without a preceding approved Pause`}:{violation:"writes_to_project_path",state_id:e,message:`State ${e} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(u.id,null,g),{outcome:null,text:"",status_detail:g}}if(t.dal.insertStepArtifact({step_id:u.id,kind:`${e}_transcript`,content:p.text}),t.transcripts[e]=p.text,!o)return t.dal.finishStep(u.id,"done",`chat_ms=${p.ms}`),t.outcomes[e]="done",{outcome:"done",text:p.text,status_detail:`chat_ms=${p.ms}`};let h=As(p.text,s);return t.dal.finishStep(u.id,h.outcome,h.outcome!==null?`chat_ms=${p.ms}`:h.reason),h.outcome!==null&&(t.outcomes[e]=h.outcome),{outcome:h.outcome,text:p.text,status_detail:h.outcome!==null?`chat_ms=${p.ms}`:h.reason}}catch(p){let h=p instanceof ve?`chat_${p.kind}`:"chat_other";return t.dal.finishStep(u.id,null,h),{outcome:null,text:"",status_detail:h}}}function kn(t,e){return(e?.length??0)>0?ty(t.project.local_path,e):null}function _y(t){return zu(Zu(t))}function ed(t,e){let r=t.dal.query(`SELECT state_name, outcome FROM step
1848
+ `);try{let p=await js({context:t,stateId:e,member:c,prompt:m,stepId:u.id,timeoutMs:i,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 t.dal.insertSessionEvent({run_id:t.run_id,step_id:u.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(p.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:e,kind:p.violationKind,command_summary:p.summary,message:`State ${e} ran a classified side-effect command (${p.violationKind}) without a preceding approved Pause`}:{violation:"writes_to_project_path",state_id:e,message:`State ${e} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(u.id,null,g),{outcome:null,text:"",status_detail:g}}if(t.dal.insertStepArtifact({step_id:u.id,kind:`${e}_transcript`,content:p.text}),t.transcripts[e]=p.text,!o)return t.dal.finishStep(u.id,"done",`chat_ms=${p.ms}`),t.outcomes[e]="done",{outcome:"done",text:p.text,status_detail:`chat_ms=${p.ms}`};let h=Rs(p.text,s);return t.dal.finishStep(u.id,h.outcome,h.outcome!==null?`chat_ms=${p.ms}`:h.reason),h.outcome!==null&&(t.outcomes[e]=h.outcome),{outcome:h.outcome,text:p.text,status_detail:h.outcome!==null?`chat_ms=${p.ms}`:h.reason}}catch(p){let h=p instanceof ve?`chat_${p.kind}`:"chat_other";return t.dal.finishStep(u.id,null,h),{outcome:null,text:"",status_detail:h}}}function kn(t,e){return(e?.length??0)>0?ty(t.project.local_path,e):null}function _y(t){return zu(Zu(t))}function ed(t,e){let r=t.dal.query(`SELECT state_name, outcome FROM step
1849
1849
  WHERE run_id = ? AND state_name != ? AND ended_at IS NOT NULL
1850
- ORDER BY started_at DESC, id DESC LIMIT 1`,t.run_id,e);if(r.length===0)return!1;let n=r[0];return t.workflow.states[n.state_name]?.type==="Interactive"&&n.outcome==="done"}function td(t,e){if(!dy(t))return!1;let r=Zi(t,"durable-memory");function n(s){let o;try{o=fy(s,{withFileTypes:!0})}catch{return!1}for(let i of o){if(i.name===".git")continue;let a=Zi(s,i.name);if(a!==r)if(i.isDirectory()){if(n(a))return!0}else try{if(my(a).mtime>e)return!0}catch{}}return!1}return n(t)}function BL(t,e,r){let n=Zi(t.local_path,"durable-memory");if(!dy(n))return;let s;try{s=fy(n)}catch{return}for(let o of s){if(!o.endsWith(".md")||o==="MEMORY.md")continue;let i=Zi(n,o),a;try{a=my(i).mtime}catch{continue}if(a<=r)continue;let l;try{l=PL(i,"utf8")}catch{continue}let c=qL(l);if(c===null){process.stderr.write(`[durable-memory-sync] warning: ${o} has no valid frontmatter, skipping
1851
- `);continue}if(t.durable_memory_mode==="db")try{e.upsertDurableMemory({project_id:t.id,type:c.type,name:c.name,description:c.description,body:c.body})}catch{}}}function qL(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(e===null)return null;let r=e[1],n=e[2].trimStart(),s=r.match(/^name:\s*(.+)$/m),o=r.match(/^type:\s*(.+)$/m),i=r.match(/^description:\s*(.+)$/m),a=s?.[1]?.trim(),l=o?.[1]?.trim();return a===void 0||a.length===0||l===void 0||!HL.has(l)?null:{name:a,type:l,description:i?.[1]?.trim()??null,body:n}}var $s,HL,qe=T(()=>{"use strict";Ue();gn();ds();ry();Yu();es();iy();ay();Rs();$s="__paused__:";HL=new Set(["user","feedback","project","reference"])});import{spawnSync as gy}from"node:child_process";function JL(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let o=t.project.local_path,i=gy("git",["diff","--quiet"],{cwd:o}).status!==0,a=gy("git",["diff","--cached","--quiet"],{cwd:o}).status!==0;if(i||a){let l=e.fail_message??"repository has uncommitted changes";return t.dal.finishStep(s.id,null,l),V(t,r,n,Su),{kind:"terminal",terminal:Z(t.workflow)}}return t.dal.finishStep(s.id,"clean","repo_clean"),V(t,r,n,"clean"),K(t.workflow,e.next)}var yy,wy=T(()=>{"use strict";qe();yy={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:t=>JL(t,t.state)}});async function XL(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;for(let o of e.branches)if(await ly(o.when,t))return t.dal.finishStep(s.id,"matched",o.when),V(t,r,n,"matched"),K(t.workflow,o.next);return t.dal.finishStep(s.id,"no_match","choice_no_match"),V(t,r,n,"no_match"),e.default_next!==void 0?K(t.workflow,e.default_next):{kind:"terminal",terminal:t.workflow.terminals.no_match?"no_match":Z(t.workflow)}}var Ey,Ty=T(()=>{"use strict";qe();Rs();Ey={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 t=>XL(t,t.state)}});async function GL(t,e){let r=t.stateId,n=t.displayName,s=t.workflow.default_task_timeout_ms,o=e.researchers??[],i=kn(t,e.durable_memory_tags),a=new Array(o.length).fill(null);await Promise.all(o.map(async(m,p)=>{let h=`${n}:researcher_${m.alias}[${p}]`,g=await Sn(t,h,m,`TOPIC: ${m.topic}`,[],!1,s,!1,i);g.text.length>0&&(a[p]=g.text)}));let l=a.map((m,p)=>m!==null?`# Research ${p+1}: ${o[p]?.topic??""}
1850
+ ORDER BY started_at DESC, id DESC LIMIT 1`,t.run_id,e);if(r.length===0)return!1;let n=r[0];return t.workflow.states[n.state_name]?.type==="Interactive"&&n.outcome==="done"}function td(t,e){if(!dy(t))return!1;let r=Zi(t,"durable-memory");function n(s){let o;try{o=fy(s,{withFileTypes:!0})}catch{return!1}for(let i of o){if(i.name===".git")continue;let a=Zi(s,i.name);if(a!==r)if(i.isDirectory()){if(n(a))return!0}else try{if(my(a).mtime>e)return!0}catch{}}return!1}return n(t)}function Bj(t,e,r){let n=Zi(t.local_path,"durable-memory");if(!dy(n))return;let s;try{s=fy(n)}catch{return}for(let o of s){if(!o.endsWith(".md")||o==="MEMORY.md")continue;let i=Zi(n,o),a;try{a=my(i).mtime}catch{continue}if(a<=r)continue;let l;try{l=Pj(i,"utf8")}catch{continue}let c=qj(l);if(c===null){process.stderr.write(`[durable-memory-sync] warning: ${o} has no valid frontmatter, skipping
1851
+ `);continue}if(t.durable_memory_mode==="db")try{e.upsertDurableMemory({project_id:t.id,type:c.type,name:c.name,description:c.description,body:c.body})}catch{}}}function qj(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(e===null)return null;let r=e[1],n=e[2].trimStart(),s=r.match(/^name:\s*(.+)$/m),o=r.match(/^type:\s*(.+)$/m),i=r.match(/^description:\s*(.+)$/m),a=s?.[1]?.trim(),l=o?.[1]?.trim();return a===void 0||a.length===0||l===void 0||!Hj.has(l)?null:{name:a,type:l,description:i?.[1]?.trim()??null,body:n}}var Ls,Hj,qe=T(()=>{"use strict";Ue();gn();fs();ry();Yu();ts();iy();ay();$s();Ls="__paused__:";Hj=new Set(["user","feedback","project","reference"])});import{spawnSync as gy}from"node:child_process";function Jj(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let o=t.project.local_path,i=gy("git",["diff","--quiet"],{cwd:o}).status!==0,a=gy("git",["diff","--cached","--quiet"],{cwd:o}).status!==0;if(i||a){let l=e.fail_message??"repository has uncommitted changes";return t.dal.finishStep(s.id,null,l),V(t,r,n,Su),{kind:"terminal",terminal:Z(t.workflow)}}return t.dal.finishStep(s.id,"clean","repo_clean"),V(t,r,n,"clean"),K(t.workflow,e.next)}var yy,wy=T(()=>{"use strict";qe();yy={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:t=>Jj(t,t.state)}});async function Xj(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;for(let o of e.branches)if(await ly(o.when,t))return t.dal.finishStep(s.id,"matched",o.when),V(t,r,n,"matched"),K(t.workflow,o.next);return t.dal.finishStep(s.id,"no_match","choice_no_match"),V(t,r,n,"no_match"),e.default_next!==void 0?K(t.workflow,e.default_next):{kind:"terminal",terminal:t.workflow.terminals.no_match?"no_match":Z(t.workflow)}}var Ey,Ty=T(()=>{"use strict";qe();$s();Ey={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 t=>Xj(t,t.state)}});async function Gj(t,e){let r=t.stateId,n=t.displayName,s=t.workflow.default_task_timeout_ms,o=e.researchers??[],i=kn(t,e.durable_memory_tags),a=new Array(o.length).fill(null);await Promise.all(o.map(async(m,p)=>{let h=`${n}:researcher_${m.alias}[${p}]`,g=await Sn(t,h,m,`TOPIC: ${m.topic}`,[],!1,s,!1,i);g.text.length>0&&(a[p]=g.text)}));let l=a.map((m,p)=>m!==null?`# Research ${p+1}: ${o[p]?.topic??""}
1852
1852
  ${m}`:null).filter(m=>m!==null).join(`
1853
1853
 
1854
- `),c=`${n}:consolidator`,u=await Sn(t,c,e.consolidator,l.length>0?l:null,["ok","error"],!0,s,!1,i),d=X(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,u.outcome===null||u.outcome==="error"){t.dal.finishStep(d.id,u.outcome,u.status_detail),u.outcome==="error"&&V(t,r,n,"error");let m=e.outcomes.error;return m!==void 0?K(t.workflow,m):{kind:"terminal",terminal:Z(t.workflow)}}let f=e.research_artifact_prefix??n;if(t.dal.insertStepArtifact({step_id:d.id,kind:`${f}_consolidated`,content:u.text}),t.dal.finishStep(d.id,"ok","consolidated"),V(t,r,n,"ok"),e.write_back_durable_memory){let m=t.membersByAlias.get(e.consolidator.alias);m!==void 0&&await Gt(t,n,m,e.write_back_durable_memory)}return K(t.workflow,e.outcomes.ok)}var by,Sy=T(()=>{"use strict";qe();by={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 t=>GL(t,t.state)}});async function KL(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let o=t.progress_step_id;t.progress_step_id=s.id;try{let i=await Yi(e.items_from,t),a=ZL(i);if(a===null){t.dal.finishStep(s.id,null,`foreach_invalid_items:${e.items_from}`);let f=e.outcomes.any_failed;return f!==void 0?K(t.workflow,f):{kind:"terminal",terminal:Z(t.workflow)}}let l={routed:null},c=e.mode==="parallel"?await YL(t,e,s.id,a,l):await VL(t,e,s.id,a,l);if(l.routed!==null)return t.dal.finishStep(s.id,null,`foreach_propagated:${l.routed.kind}`),l.routed;let u=c.some(f=>f.outcome===null||f.outcome==="__failure__"),d=u?"any_failed":"all_ok";if(t.dal.finishStep(s.id,d,JSON.stringify({iterations:c,count:a.length})),V(t,r,n,d),u){let f=e.outcomes.any_failed;return f!==void 0?K(t.workflow,f):{kind:"terminal",terminal:Z(t.workflow)}}return K(t.workflow,e.outcomes.all_ok)}finally{t.progress_step_id=o}}async function VL(t,e,r,n,s){let o=[];for(let i=0;i<n.length;i+=1){let a=await vy(t,e,r,n[i],i,s);if(s.routed!==null||(o.push(a),(a.outcome===null||a.outcome==="__failure__")&&e.on_item_failure==="stop"))break}return o}async function YL(t,e,r,n,s){let o=new Array(n.length),i=0,a=Array.from({length:Math.min(e.max_concurrency,n.length)},async()=>{for(;i<n.length&&s.routed===null;){let l=i;i+=1,o[l]=await vy(t,e,r,n[l],l,s)}});return await Promise.all(a),o}async function vy(t,e,r,n,s,o){let i=t.iteration;t.iteration={item:n,index:s};let a=`${t.displayName}[${s}]`;t.emit_progress?.({kind:"item_started",data:{index:s,item:n}});let l;try{l=await t.dispatchState(a,e.body,{parent_step_id:r,iteration:{item:n,index:s}})}finally{t.iteration=i}(l.kind==="paused"||l.kind==="escalate")&&o.routed===null&&(o.routed=l);let u=l.kind==="terminal"&&t.workflow.terminals[l.terminal]?.kind==="failure"?"__failure__":zL(t.outcomes[a]);return t.emit_progress?.({kind:u===null||u==="__failure__"?"item_failed":"item_completed",data:{index:s,item:n,outcome:u}}),{index:s,value:n,outcome:u}}function zL(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function ZL(t){if(!Array.isArray(t))return null;let e=[];for(let r of t)if(typeof r=="string")e.push(r);else if(typeof r=="number"||typeof r=="boolean")e.push(String(r));else return null;return e}var ky,Iy=T(()=>{"use strict";qe();Rs();ky={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 t=>KL(t,t.state)}});async function QL(t,e){let r=t.stateId,n=t.displayName,s=e.termination.timeout_seconds!==void 0?e.termination.timeout_seconds*1e3:void 0,o=t.membersByAlias.get(e.agent.alias);if(o===void 0||o.sessionid===null){let f=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(f.id,null,`missing_agent:${e.agent.alias}`),{kind:"terminal",terminal:Z(t.workflow)}}let i=kn(t,e.durable_memory_tags),a=t.dal.getInteractiveSessionByRunAndState(t.run_id,r);if(a!==null){if(a.status==="done")return t.dal.finishStep(a.step_id,"done","operator_done"),t.outcomes[n]="done",e.write_back_durable_memory&&await Gt(t,n,o,e.write_back_durable_memory),K(t.workflow,e.outcomes.done);if(a.status==="waiting_agent"){if(a.turn_count>=e.termination.max_turns){t.dal.finishStep(a.step_id,"timeout",`max_turns=${e.termination.max_turns}`),V(t,r,n,"timeout");let m=e.outcomes.timeout;return m!==void 0?K(t.workflow,m):{kind:"terminal",terminal:Z(t.workflow)}}let f=a.last_operator_input??"";try{let m=await js({context:t,stateId:n,member:o,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 t.dal.insertSessionEvent({run_id:t.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`})}),t.dal.finishStep(a.step_id,null,p),{kind:"terminal",terminal:Z(t.workflow)}}return t.dal.setInteractiveAgentOutput(a.id,m.text,"waiting_operator"),e.termination.agent_signal!==void 0&&m.text.includes(e.termination.agent_signal)?(e.artifact_name!==void 0&&t.dal.insertStepArtifact({step_id:a.step_id,kind:e.artifact_name,content:m.text}),t.dal.finishStep(a.step_id,"done","agent_signal"),V(t,r,n,"done"),e.write_back_durable_memory&&await Gt(t,n,o,e.write_back_durable_memory),K(t.workflow,e.outcomes.done)):(Ny({context:t,state:e,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 t.dal.finishStep(a.step_id,null,p),{kind:"terminal",terminal:Z(t.workflow)}}}return{kind:"paused"}}let l=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let c=t.dal.insertInteractiveSession({run_id:t.run_id,step_id:l.id,state_name:r,status:"waiting_agent"}),u=await Ve(e.agent.initial_prompt_template,t,n),d=i?`${i}
1854
+ `),c=`${n}:consolidator`,u=await Sn(t,c,e.consolidator,l.length>0?l:null,["ok","error"],!0,s,!1,i),d=X(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,u.outcome===null||u.outcome==="error"){t.dal.finishStep(d.id,u.outcome,u.status_detail),u.outcome==="error"&&V(t,r,n,"error");let m=e.outcomes.error;return m!==void 0?K(t.workflow,m):{kind:"terminal",terminal:Z(t.workflow)}}let f=e.research_artifact_prefix??n;if(t.dal.insertStepArtifact({step_id:d.id,kind:`${f}_consolidated`,content:u.text}),t.dal.finishStep(d.id,"ok","consolidated"),V(t,r,n,"ok"),e.write_back_durable_memory){let m=t.membersByAlias.get(e.consolidator.alias);m!==void 0&&await Gt(t,n,m,e.write_back_durable_memory)}return K(t.workflow,e.outcomes.ok)}var by,Sy=T(()=>{"use strict";qe();by={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 t=>Gj(t,t.state)}});async function Kj(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let o=t.progress_step_id;t.progress_step_id=s.id;try{let i=await Yi(e.items_from,t),a=Zj(i);if(a===null){t.dal.finishStep(s.id,null,`foreach_invalid_items:${e.items_from}`);let f=e.outcomes.any_failed;return f!==void 0?K(t.workflow,f):{kind:"terminal",terminal:Z(t.workflow)}}let l={routed:null},c=e.mode==="parallel"?await Yj(t,e,s.id,a,l):await Vj(t,e,s.id,a,l);if(l.routed!==null)return t.dal.finishStep(s.id,null,`foreach_propagated:${l.routed.kind}`),l.routed;let u=c.some(f=>f.outcome===null||f.outcome==="__failure__"),d=u?"any_failed":"all_ok";if(t.dal.finishStep(s.id,d,JSON.stringify({iterations:c,count:a.length})),V(t,r,n,d),u){let f=e.outcomes.any_failed;return f!==void 0?K(t.workflow,f):{kind:"terminal",terminal:Z(t.workflow)}}return K(t.workflow,e.outcomes.all_ok)}finally{t.progress_step_id=o}}async function Vj(t,e,r,n,s){let o=[];for(let i=0;i<n.length;i+=1){let a=await vy(t,e,r,n[i],i,s);if(s.routed!==null||(o.push(a),(a.outcome===null||a.outcome==="__failure__")&&e.on_item_failure==="stop"))break}return o}async function Yj(t,e,r,n,s){let o=new Array(n.length),i=0,a=Array.from({length:Math.min(e.max_concurrency,n.length)},async()=>{for(;i<n.length&&s.routed===null;){let l=i;i+=1,o[l]=await vy(t,e,r,n[l],l,s)}});return await Promise.all(a),o}async function vy(t,e,r,n,s,o){let i=t.iteration;t.iteration={item:n,index:s};let a=`${t.displayName}[${s}]`;t.emit_progress?.({kind:"item_started",data:{index:s,item:n}});let l;try{l=await t.dispatchState(a,e.body,{parent_step_id:r,iteration:{item:n,index:s}})}finally{t.iteration=i}(l.kind==="paused"||l.kind==="escalate")&&o.routed===null&&(o.routed=l);let u=l.kind==="terminal"&&t.workflow.terminals[l.terminal]?.kind==="failure"?"__failure__":zj(t.outcomes[a]);return t.emit_progress?.({kind:u===null||u==="__failure__"?"item_failed":"item_completed",data:{index:s,item:n,outcome:u}}),{index:s,value:n,outcome:u}}function zj(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function Zj(t){if(!Array.isArray(t))return null;let e=[];for(let r of t)if(typeof r=="string")e.push(r);else if(typeof r=="number"||typeof r=="boolean")e.push(String(r));else return null;return e}var ky,Iy=T(()=>{"use strict";qe();$s();ky={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 t=>Kj(t,t.state)}});async function Qj(t,e){let r=t.stateId,n=t.displayName,s=e.termination.timeout_seconds!==void 0?e.termination.timeout_seconds*1e3:void 0,o=t.membersByAlias.get(e.agent.alias);if(o===void 0||o.sessionid===null){let f=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(f.id,null,`missing_agent:${e.agent.alias}`),{kind:"terminal",terminal:Z(t.workflow)}}let i=kn(t,e.durable_memory_tags),a=t.dal.getInteractiveSessionByRunAndState(t.run_id,r);if(a!==null){if(a.status==="done")return t.dal.finishStep(a.step_id,"done","operator_done"),t.outcomes[n]="done",e.write_back_durable_memory&&await Gt(t,n,o,e.write_back_durable_memory),K(t.workflow,e.outcomes.done);if(a.status==="waiting_agent"){if(a.turn_count>=e.termination.max_turns){t.dal.finishStep(a.step_id,"timeout",`max_turns=${e.termination.max_turns}`),V(t,r,n,"timeout");let m=e.outcomes.timeout;return m!==void 0?K(t.workflow,m):{kind:"terminal",terminal:Z(t.workflow)}}let f=a.last_operator_input??"";try{let m=await js({context:t,stateId:n,member:o,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 t.dal.insertSessionEvent({run_id:t.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`})}),t.dal.finishStep(a.step_id,null,p),{kind:"terminal",terminal:Z(t.workflow)}}return t.dal.setInteractiveAgentOutput(a.id,m.text,"waiting_operator"),e.termination.agent_signal!==void 0&&m.text.includes(e.termination.agent_signal)?(e.artifact_name!==void 0&&t.dal.insertStepArtifact({step_id:a.step_id,kind:e.artifact_name,content:m.text}),t.dal.finishStep(a.step_id,"done","agent_signal"),V(t,r,n,"done"),e.write_back_durable_memory&&await Gt(t,n,o,e.write_back_durable_memory),K(t.workflow,e.outcomes.done)):(Ny({context:t,state:e,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 t.dal.finishStep(a.step_id,null,p),{kind:"terminal",terminal:Z(t.workflow)}}}return{kind:"paused"}}let l=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let c=t.dal.insertInteractiveSession({run_id:t.run_id,step_id:l.id,state_name:r,status:"waiting_agent"}),u=await Ve(e.agent.initial_prompt_template,t,n),d=i?`${i}
1855
1855
 
1856
- ${u}`:u;try{let f=await js({context:t,stateId:n,member:o,prompt:d,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 t.dal.insertSessionEvent({run_id:t.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`})}),t.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:Z(t.workflow)}}return t.dal.setInteractiveAgentOutput(c.id,f.text,"waiting_operator"),e.artifact_name!==void 0&&t.dal.insertStepArtifact({step_id:l.id,kind:e.artifact_name,content:f.text}),e.termination.agent_signal!==void 0&&f.text.includes(e.termination.agent_signal)?(t.dal.finishStep(l.id,"done","agent_signal"),t.outcomes[n]="done",e.write_back_durable_memory&&await Gt(t,n,o,e.write_back_durable_memory),K(t.workflow,e.outcomes.done)):(Ny({context:t,state:e,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 t.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:Z(t.workflow)}}}function Ny(t){let{context:e,state:r,stateId:n,displayName:s,stepId:o,agentText:i}=t,a=O();e.dal.setRunPausedState(e.run_id,`${$s}${n}`,a),e.dal.raiseAttention({kind:"interactive_waiting_operator",severity:"attn",project_id:e.project.id,run_id:e.run_id,requires_user:!0,payload:JSON.stringify(eO({context:e,stateId:s,state:r,stepId:o,agentText:i,pausedAt:a}))}),e.dal.pauseJob(e.job.id)}function eO(t){let{context:e,stateId:r,state:n,stepId:s,agentText:o,pausedAt:i}=t,a=e.dal.getRun(e.run_id),l=tO(e,r),c={kind:"free_text",choices:null};return{run_id:e.run_id,step_id:s,state_name:r,workflow_name:e.workflow.name,workflow_version_id:a?.workflow_version_id??null,node_path:l,prompt:o,expected_response:c,transcript_tail:rO(o,3),paused_at:i,created_run_inputs:pr(e.job.payload)}}function tO(t,e){let r=[],s=t.dal.getRun(t.run_id)?.parent_run_id??null;for(let o=0;o<32&&s!==null;o+=1){let i=t.dal.getRun(s);if(i===null)break;i.current_state!==null&&r.unshift(i.current_state),s=i.parent_run_id}return r.push(e),r}function rO(t,e){if(typeof t!="string"||t.length===0)return[];let r=t.split(/\r?\n/);return(r.length>0&&r[r.length-1]===""?r.slice(0,-1):r).slice(-e)}var xy,Ay=T(()=>{"use strict";ds();qe();xy={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 t=>QL(t,t.state)}});async function nO(t,e){let r=t.stateId,n=t.displayName,s=hy(t,e.over);if(s===null){let d=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(d.id,null,`loop_invalid_items:${e.over}`);let f=e.outcomes.error;return f!==void 0?K(t.workflow,f):{kind:"terminal",terminal:Z(t.workflow)}}let o=t.workflow.states[e.body];if(o===void 0){let d=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(d.id,null,`loop_body_not_found:${e.body}`),{kind:"terminal",terminal:Z(t.workflow)}}let i=s.slice(0,e.max_items),a=[],l=!1;for(let d=0;d<i.length;d+=1){let f=i[d],m=`${n}[${d}]`,p=t.iteration;t.iteration={item:f,index:d};let h;try{h=await t.dispatchState(m,o,{iteration:{item:f,index:d}})}finally{t.iteration=p}if(h.kind==="paused"||h.kind==="escalate")return h;let g=sO(t.outcomes[m]);if(a.push({index:d,value:f,outcome:g}),g===null&&e.stop_on_error){l=!0;break}}let c=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let u=l?"error":"ok";if(t.dal.finishStep(c.id,u,JSON.stringify({iterations:a,count:i.length})),V(t,r,n,u),l){let d=e.outcomes.error;return d!==void 0?K(t.workflow,d):{kind:"terminal",terminal:Z(t.workflow)}}return K(t.workflow,e.outcomes.ok)}function sO(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}var Ry,$y=T(()=>{"use strict";qe();Ry={description:{displayName:"Loop",name:"loop",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],builtin:!0},execute:async t=>nO(t,t.state)}});import{createHash as oO}from"node:crypto";import{existsSync as iO,mkdirSync as aO,readFileSync as lO,writeFileSync as cO}from"node:fs";import{dirname as uO,isAbsolute as Ly,normalize as dO,resolve as Ls}from"node:path";import{Document as fO,ExternalHyperlink as mO,HeadingLevel as vn,LevelFormat as pO,Packer as hO,Paragraph as _t,Table as _O,TableCell as gO,TableRow as yO,TextRun as gt,WidthType as wO}from"docx";import{marked as EO}from"marked";async function TO(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;try{let o=await bO(t,e,n),i=await SO(t,e),a=await kO(t,e.title),l=await AO(o,a??t.workflow.name);if(l.length===0)throw new Error("rendered DOCX buffer was empty");return aO(uO(i),{recursive:!0}),cO(i,l),t.dal.insertStepArtifact({step_id:s.id,kind:"render_docx",path:i,sha:oO("sha256").update(l).digest("hex"),provider_call_mode:"library"}),t.dal.finishStep(s.id,"done",`wrote:${i}`),V(t,r,n,{output_path:i,path:i,bytes:l.length}),K(t.workflow,e.outcomes?.done??"@terminal:done")}catch(o){let i=o instanceof Error?o.message:String(o);return t.dal.finishStep(s.id,"error",i),V(t,r,n,{error:i}),K(t.workflow,e.outcomes?.error??"@terminal:error")}}async function bO(t,e,r){if(typeof e.markdown_source!="string"||e.markdown_source.trim().length===0)throw new Error("markdown_source is required");let n=(await Ve(e.markdown_source,t,r)).trim(),o=(n.length===0?xO(t,e.markdown_source):null)??n;if(o.length===0)throw new Error("markdown_source resolved empty");let i=IO(t.project.local_path,o);if(i!==null){if(!iO(i))throw new Error(`markdown_source file not found: ${i}`);return Qi(lO(i,"utf8"))}return Qi(o)}async function SO(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let r=(await Ve(e.output_path,t,t.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=vO(t.project.local_path,r);if(!n.endsWith(".docx"))throw new Error(`output_path must end with .docx: ${n}`);return n}async function kO(t,e){if(typeof e!="string"||e.trim().length===0)return null;let r=(await Ve(e,t,t.stateId)).trim();return r.length===0?null:r}function vO(t,e){let r=Ls(t);return dO(Ly(e)?Ls(e):Ls(r,e))}function IO(t,e){return NO(e)?Ly(e)?Ls(e):Ls(t,e):null}function NO(t){return t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function xO(t,e){let n=/context\.outcomes\.([A-Za-z0-9_-]+)\.output/.exec(e)?.[1];if(n===void 0)return null;let s=Object.entries(t.transcripts).filter(([i])=>i.startsWith(`${n}:coder[`)).sort(([i],[a])=>a.localeCompare(i))[0]?.[1];if(s!==void 0)return Qi(s);let o=t.dal.query(`SELECT sa.content
1856
+ ${u}`:u;try{let f=await js({context:t,stateId:n,member:o,prompt:d,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 t.dal.insertSessionEvent({run_id:t.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`})}),t.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:Z(t.workflow)}}return t.dal.setInteractiveAgentOutput(c.id,f.text,"waiting_operator"),e.artifact_name!==void 0&&t.dal.insertStepArtifact({step_id:l.id,kind:e.artifact_name,content:f.text}),e.termination.agent_signal!==void 0&&f.text.includes(e.termination.agent_signal)?(t.dal.finishStep(l.id,"done","agent_signal"),t.outcomes[n]="done",e.write_back_durable_memory&&await Gt(t,n,o,e.write_back_durable_memory),K(t.workflow,e.outcomes.done)):(Ny({context:t,state:e,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 t.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:Z(t.workflow)}}}function Ny(t){let{context:e,state:r,stateId:n,displayName:s,stepId:o,agentText:i}=t,a=O();e.dal.setRunPausedState(e.run_id,`${Ls}${n}`,a),e.dal.raiseAttention({kind:"interactive_waiting_operator",severity:"attn",project_id:e.project.id,run_id:e.run_id,requires_user:!0,payload:JSON.stringify(eO({context:e,stateId:s,state:r,stepId:o,agentText:i,pausedAt:a}))}),e.dal.pauseJob(e.job.id)}function eO(t){let{context:e,stateId:r,state:n,stepId:s,agentText:o,pausedAt:i}=t,a=e.dal.getRun(e.run_id),l=tO(e,r),c={kind:"free_text",choices:null};return{run_id:e.run_id,step_id:s,state_name:r,workflow_name:e.workflow.name,workflow_version_id:a?.workflow_version_id??null,node_path:l,prompt:o,expected_response:c,transcript_tail:rO(o,3),paused_at:i,created_run_inputs:pr(e.job.payload)}}function tO(t,e){let r=[],s=t.dal.getRun(t.run_id)?.parent_run_id??null;for(let o=0;o<32&&s!==null;o+=1){let i=t.dal.getRun(s);if(i===null)break;i.current_state!==null&&r.unshift(i.current_state),s=i.parent_run_id}return r.push(e),r}function rO(t,e){if(typeof t!="string"||t.length===0)return[];let r=t.split(/\r?\n/);return(r.length>0&&r[r.length-1]===""?r.slice(0,-1):r).slice(-e)}var xy,Ay=T(()=>{"use strict";fs();qe();xy={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 t=>Qj(t,t.state)}});async function nO(t,e){let r=t.stateId,n=t.displayName,s=hy(t,e.over);if(s===null){let d=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(d.id,null,`loop_invalid_items:${e.over}`);let f=e.outcomes.error;return f!==void 0?K(t.workflow,f):{kind:"terminal",terminal:Z(t.workflow)}}let o=t.workflow.states[e.body];if(o===void 0){let d=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(d.id,null,`loop_body_not_found:${e.body}`),{kind:"terminal",terminal:Z(t.workflow)}}let i=s.slice(0,e.max_items),a=[],l=!1;for(let d=0;d<i.length;d+=1){let f=i[d],m=`${n}[${d}]`,p=t.iteration;t.iteration={item:f,index:d};let h;try{h=await t.dispatchState(m,o,{iteration:{item:f,index:d}})}finally{t.iteration=p}if(h.kind==="paused"||h.kind==="escalate")return h;let g=sO(t.outcomes[m]);if(a.push({index:d,value:f,outcome:g}),g===null&&e.stop_on_error){l=!0;break}}let c=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let u=l?"error":"ok";if(t.dal.finishStep(c.id,u,JSON.stringify({iterations:a,count:i.length})),V(t,r,n,u),l){let d=e.outcomes.error;return d!==void 0?K(t.workflow,d):{kind:"terminal",terminal:Z(t.workflow)}}return K(t.workflow,e.outcomes.ok)}function sO(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}var Ry,$y=T(()=>{"use strict";qe();Ry={description:{displayName:"Loop",name:"loop",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],builtin:!0},execute:async t=>nO(t,t.state)}});import{createHash as oO}from"node:crypto";import{existsSync as iO,mkdirSync as aO,readFileSync as lO,writeFileSync as cO}from"node:fs";import{dirname as uO,isAbsolute as jy,normalize as dO,resolve as Os}from"node:path";import{Document as fO,ExternalHyperlink as mO,HeadingLevel as vn,LevelFormat as pO,Packer as hO,Paragraph as _t,Table as _O,TableCell as gO,TableRow as yO,TextRun as gt,WidthType as wO}from"docx";import{marked as EO}from"marked";async function TO(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;try{let o=await bO(t,e,n),i=await SO(t,e),a=await kO(t,e.title),l=await AO(o,a??t.workflow.name);if(l.length===0)throw new Error("rendered DOCX buffer was empty");return aO(uO(i),{recursive:!0}),cO(i,l),t.dal.insertStepArtifact({step_id:s.id,kind:"render_docx",path:i,sha:oO("sha256").update(l).digest("hex"),provider_call_mode:"library"}),t.dal.finishStep(s.id,"done",`wrote:${i}`),V(t,r,n,{output_path:i,path:i,bytes:l.length}),K(t.workflow,e.outcomes?.done??"@terminal:done")}catch(o){let i=o instanceof Error?o.message:String(o);return t.dal.finishStep(s.id,"error",i),V(t,r,n,{error:i}),K(t.workflow,e.outcomes?.error??"@terminal:error")}}async function bO(t,e,r){if(typeof e.markdown_source!="string"||e.markdown_source.trim().length===0)throw new Error("markdown_source is required");let n=(await Ve(e.markdown_source,t,r)).trim(),o=(n.length===0?xO(t,e.markdown_source):null)??n;if(o.length===0)throw new Error("markdown_source resolved empty");let i=IO(t.project.local_path,o);if(i!==null){if(!iO(i))throw new Error(`markdown_source file not found: ${i}`);return Qi(lO(i,"utf8"))}return Qi(o)}async function SO(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let r=(await Ve(e.output_path,t,t.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=vO(t.project.local_path,r);if(!n.endsWith(".docx"))throw new Error(`output_path must end with .docx: ${n}`);return n}async function kO(t,e){if(typeof e!="string"||e.trim().length===0)return null;let r=(await Ve(e,t,t.stateId)).trim();return r.length===0?null:r}function vO(t,e){let r=Os(t);return dO(jy(e)?Os(e):Os(r,e))}function IO(t,e){return NO(e)?jy(e)?Os(e):Os(t,e):null}function NO(t){return t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function xO(t,e){let n=/context\.outcomes\.([A-Za-z0-9_-]+)\.output/.exec(e)?.[1];if(n===void 0)return null;let s=Object.entries(t.transcripts).filter(([i])=>i.startsWith(`${n}:coder[`)).sort(([i],[a])=>a.localeCompare(i))[0]?.[1];if(s!==void 0)return Qi(s);let o=t.dal.query(`SELECT sa.content
1857
1857
  FROM step_artifact sa
1858
1858
  JOIN step s ON s.id = sa.step_id
1859
1859
  WHERE s.run_id = ?
1860
1860
  AND s.state_name LIKE ?
1861
1861
  AND sa.content IS NOT NULL
1862
1862
  ORDER BY sa.id DESC
1863
- LIMIT 1`,t.run_id,`${n}:coder[%`);return o[0]?.content===void 0?null:Qi(o[0].content)}function Qi(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}async function AO(t,e){let r=Cy(EO.lexer(t,{gfm:!0})),n=new fO({title:e,numbering:{config:[{reference:"ordered-list",levels:[{level:0,format:pO.DECIMAL,text:"%1."}]}]},sections:[{children:r.length===0?[new _t("")]:r}]});return hO.toBuffer(n)}function Cy(t){let e=[];for(let r of t)switch(r.type){case"space":break;case"heading":e.push(new _t({heading:MO(r.depth),children:_r(hr(r))}));break;case"paragraph":e.push(new _t({children:_r(hr(r))}));break;case"text":e.push(new _t({children:hr(r).length===0?[new gt(r.text)]:_r(hr(r))}));break;case"blockquote":e.push(...Cy(hr(r)).map(n=>n instanceof _t?n:new _t({children:[new gt(r.text)]})));break;case"list":LO(r)&&e.push(...RO(r));break;case"table":OO(r)&&e.push($O(r));break;case"code":CO(r)&&e.push(...jO(r));break;case"hr":e.push(new _t(""));break;case"html":r.text.trim().length>0&&e.push(new _t({children:[new gt(r.text)]}));break;default:break}return e}function _r(t,e){let r=[];for(let n of t)switch(n.type){case"text":case"escape":r.push(new gt({text:n.text,...rd(e)}));break;case"strong":r.push(..._r(hr(n),{...e,bold:!0}));break;case"em":r.push(..._r(hr(n),{...e,italics:!0}));break;case"codespan":r.push(new gt({text:n.text,...rd({...e,code:!0})}));break;case"link":r.push(new mO({link:n.href,children:_r(hr(n),{...e})}));break;case"br":r.push(new gt({text:"",break:1}));break;case"image":r.push(new gt({text:`[image: ${n.text}]`,italics:!0}));break;case"del":r.push(new gt({text:n.text,strike:!0}));break;default:r.push(new gt({text:n.raw,...rd(e)}));break}return r.length===0?[new gt("")]:r}function rd(t){return{...t?.bold===!0?{bold:!0}:{},...t?.italics===!0?{italics:!0}:{},...t?.code===!0?{font:"Courier New"}:{}}}function RO(t){return t.items.map(e=>new _t({children:_r(e.tokens.length===1&&e.tokens[0]?.type==="text"?[{...e.tokens[0],text:jy(e)+e.tokens[0].text}]:[{type:"text",raw:e.text,text:jy(e)+e.text}]),...t.ordered?{numbering:{reference:"ordered-list",level:0}}:{bullet:{level:0}}}))}function jy(t){return t.task?`[${t.checked?"x":" "}] `:""}function $O(t){let e=[t.header,...t.rows].map(r=>new yO({children:r.map(n=>new gO({children:[new _t({children:_r(n.tokens,n.header?{bold:!0}:void 0)})]}))}));return new _O({width:{size:100,type:wO.PERCENTAGE},rows:e})}function jO(t){return t.text.split(`
1864
- `).map(r=>new _t({children:[new gt({text:r.length===0?" ":r,font:"Courier New"})]}))}function hr(t){let e=t.tokens;return Array.isArray(e)?e:[]}function LO(t){return t.type==="list"&&Array.isArray(t.items)}function OO(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function CO(t){return t.type==="code"&&typeof t.text=="string"}function MO(t){switch(t){case 1:return vn.HEADING_1;case 2:return vn.HEADING_2;case 3:return vn.HEADING_3;case 4:return vn.HEADING_4;case 5:return vn.HEADING_5;default:return vn.HEADING_6}}var Oy,My=T(()=>{"use strict";qe();Oy={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 t=>TO(t,t.state)}});import{createHash as DO}from"node:crypto";import{existsSync as PO,mkdirSync as FO,readFileSync as Dy,statSync as UO}from"node:fs";import{dirname as WO,isAbsolute as Py,normalize as BO,resolve as Os}from"node:path";import{marked as HO}from"marked";import qO from"write-excel-file/node";async function JO(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;try{let o=await XO(t,e),i=GO(e.input_format),a=await KO(t,e),l=await VO(t,e.title),c=i==="markdown"?sC(o):QO(o);await oC({sheets:c.length===0?[{name:"Sheet1",headers:[],rows:[]}]:c,outputPath:a,title:l??t.workflow.name});let u=UO(a).size;if(u===0)throw new Error("rendered XLSX file was empty");let d=DO("sha256").update(Dy(a)).digest("hex");return t.dal.insertStepArtifact({step_id:s.id,kind:"render_xlsx",path:a,sha:d,provider_call_mode:"library"}),t.dal.finishStep(s.id,"done",`wrote:${a}`),V(t,r,n,{output_path:a,path:a,bytes:u}),K(t.workflow,e.outcomes?.done??"@terminal:done")}catch(o){let i=o instanceof Error?o.message:String(o);return t.dal.finishStep(s.id,"error",i),V(t,r,n,{error:i}),K(t.workflow,e.outcomes?.error??"@terminal:error")}}async function XO(t,e){if(typeof e.source!="string"||e.source.trim().length===0)return"";let r=(await Ve(e.source,t,t.stateId)).trim(),n=zO(t.project.local_path,r);if(n!==null){if(!PO(n))throw new Error(`source file not found: ${n}`);return Dy(n,"utf8")}return r}function GO(t){if(t==null||t==="")return"json";if(t==="json"||t==="markdown")return t;throw new Error(`unsupported input_format: ${String(t)}`)}async function KO(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let r=(await Ve(e.output_path,t,t.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=YO(t.project.local_path,r);if(!n.endsWith(".xlsx"))throw new Error(`output_path must end with .xlsx: ${n}`);return n}async function VO(t,e){if(typeof e!="string"||e.trim().length===0)return null;let r=(await Ve(e,t,t.stateId)).trim();return r.length===0?null:r}function YO(t,e){let r=Os(t);return BO(Py(e)?Os(e):Os(r,e))}function zO(t,e){return ZO(e)?Py(e)?Os(e):Os(t,e):null}function ZO(t){return t.endsWith(".json")||t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function QO(t){if(t.trim().length===0)return[];let e;try{e=JSON.parse(t)}catch(r){let n=r instanceof Error?r.message:String(r);throw new Error(`invalid JSON source: ${n}`)}if(!ea(e)||!Array.isArray(e.sheets))throw new Error("JSON source must be an object with sheets[]");return e.sheets.map((r,n)=>eC(r,n))}function eC(t,e){if(!ea(t))throw new Error(`sheets[${e}] must be an object`);let r=tC(t.headers,`sheets[${e}].headers`),n=rC(t.rows,`sheets[${e}].rows`);return{name:typeof t.name=="string"&&t.name.trim().length>0?t.name:`Sheet${e+1}`,headers:r,rows:n,headerStyle:nC(t.styles)}}function tC(t,e){if(t===void 0)return[];if(!Array.isArray(t)||!t.every(r=>typeof r=="string"))throw new Error(`${e} must be an array of strings`);return t}function rC(t,e){if(t===void 0)return[];if(!Array.isArray(t))throw new Error(`${e} must be an array`);return t.map((r,n)=>{if(!Array.isArray(r))throw new Error(`${e}[${n}] must be an array`);return r.map((s,o)=>{if(s===null||typeof s=="string"||typeof s=="number"||typeof s=="boolean")return s;throw new Error(`${e}[${n}][${o}] must be string, number, boolean, or null`)})})}function nC(t){if(!ea(t)||!ea(t.headers))return;let e={};return t.headers.bold===!0&&(e.bold=!0),typeof t.headers.fill=="string"&&(e.fill=t.headers.fill),Object.keys(e).length===0?void 0:e}function sC(t){let e=HO.lexer(t,{gfm:!0}),r=[],n=null;for(let s of e){if(fC(s)){n=s.text;continue}mC(s)&&(r.push({name:n??`Sheet${r.length+1}`,headers:s.header.map(o=>o.text),rows:s.rows.map(o=>o.map(i=>i.text)),headerStyle:{bold:!0}}),n=null)}return r}async function oC(t){FO(WO(t.outputPath),{recursive:!0});let e=new Set,r=t.sheets.map(n=>({sheet:cC(n.name,e),data:iC(n),columns:lC(n)}));await qO(r).toFile(t.outputPath)}function iC(t){let e=[];if(t.headers.length>0){let r=dC(t.headerStyle?.fill);e.push(t.headers.map(n=>({value:n,type:String,fontWeight:t.headerStyle?.bold===!1?void 0:"bold",backgroundColor:r??void 0})))}for(let r of t.rows)e.push(r.map(aC));return e.length===0?[[{}]]:e}function aC(t){return t===null?{}:typeof t=="string"?{value:t,type:String}:typeof t=="number"?{value:t,type:Number}:typeof t=="boolean"?{value:t,type:Boolean}:{}}function lC(t){let e=Math.max(t.headers.length,...t.rows.map(n=>n.length),1),r=[];for(let n=1;n<=e;n+=1){let s=[t.headers[n-1],...t.rows.map(i=>i[n-1])],o=Math.min(60,Math.max(10,...s.map(i=>String(i??"").length+2)));r.push({width:o})}return r}function cC(t,e){let r=uC(t),n=r,s=2;for(;e.has(n.toLowerCase());){let o=` ${s}`;n=`${r.slice(0,31-o.length)}${o}`,s+=1}return e.add(n.toLowerCase()),n}function uC(t){let e=t.replace(/[\[\]:*?/\\]/g," ").trim();return(e.length===0?"Sheet":e).slice(0,31)}function dC(t){if(t===void 0)return null;let e=t.startsWith("#")?t.slice(1):t;return/^[0-9a-fA-F]{6}$/.test(e)?`#${e.toUpperCase()}`:null}function fC(t){return t.type==="heading"&&typeof t.text=="string"}function mC(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function ea(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Fy,Uy=T(()=>{"use strict";qe();Fy={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 t=>JO(t,t.state)}});import{spawnSync as pC}from"node:child_process";async function _C(t,e){let r=t.stateId,n=t.displayName,s=t.workflow.default_task_timeout_ms;for(let f of e.pre_checks??[])if(pC("sh",["-c",f.command],{cwd:t.project.local_path}).status!==0){let p=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(p.id,"fail_pre_check",`pre_check_failed:${f.description??f.command}`),V(t,r,n,"fail_pre_check");let h=e.outcomes.fail_pre_check;return h!==void 0?K(t.workflow,h):{kind:"terminal",terminal:Z(t.workflow)}}let o=kn(t,e.durable_memory_tags),i=e.reviewers??[],a=null,l=i.length===0&&e.outcomes_from_stance!==void 0,c=l?Object.keys(e.outcomes_from_stance):[];for(let f=0;f<e.max_loops;f+=1){let m=`${n}:coder[${f}]`,p=await Sn(t,m,e.coder,a!==null?`PRIOR REVIEW FEEDBACK:
1865
- ${a}`:null,c,l,s,e.writes_to_project_path===!0,o);if(l){let g=sy(p.text);if(g!==null){let _=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(_.id,null,`escalation_vocab:${g.token}`),{kind:"escalate",token:g.token,reason:g.reason.length>0?`${g.token}: ${g.reason}`:g.token}}}if(p.outcome===null){let g=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(g.id,null,p.status_detail),{kind:"escalate",token:"",reason:`coder_no_outcome:${p.status_detail}`}}if(i.length===0){if(e.outcomes_from_stance!==void 0){let S=Object.keys(e.outcomes_from_stance),w=As(p.text,S);if(w.outcome===null){let I=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(I.id,null,`unhandled_stance:${w.reason}`),{kind:"escalate",token:"",reason:`no_stance:${w.reason}`}}let E=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(E.id,w.outcome,"outcomes_from_stance"),V(t,r,n,w.outcome),K(t.workflow,e.outcomes_from_stance[w.outcome])}let g=As(p.text,hC);if(g.outcome!==null){let S=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(S.id,g.outcome,"default_failure_stance"),V(t,r,n,g.outcome),{kind:"escalate",token:g.outcome,reason:`failure_stance:${g.outcome}`}}let _=X(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,t.dal.finishStep(_.id,"approve","no_reviewers"),V(t,r,n,"approve"),e.write_back_durable_memory){let S=t.membersByAlias.get(e.coder.alias);S!==void 0&&await Gt(t,n,S,e.write_back_durable_memory)}return K(t.workflow,e.outcomes.approve)}let h=await Promise.all(i.map(g=>Sn(t,`${n}:reviewer_${g.alias}[${f}]`,g,`CODER OUTPUT:
1863
+ LIMIT 1`,t.run_id,`${n}:coder[%`);return o[0]?.content===void 0?null:Qi(o[0].content)}function Qi(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}async function AO(t,e){let r=Cy(EO.lexer(t,{gfm:!0})),n=new fO({title:e,numbering:{config:[{reference:"ordered-list",levels:[{level:0,format:pO.DECIMAL,text:"%1."}]}]},sections:[{children:r.length===0?[new _t("")]:r}]});return hO.toBuffer(n)}function Cy(t){let e=[];for(let r of t)switch(r.type){case"space":break;case"heading":e.push(new _t({heading:MO(r.depth),children:_r(hr(r))}));break;case"paragraph":e.push(new _t({children:_r(hr(r))}));break;case"text":e.push(new _t({children:hr(r).length===0?[new gt(r.text)]:_r(hr(r))}));break;case"blockquote":e.push(...Cy(hr(r)).map(n=>n instanceof _t?n:new _t({children:[new gt(r.text)]})));break;case"list":jO(r)&&e.push(...RO(r));break;case"table":OO(r)&&e.push($O(r));break;case"code":CO(r)&&e.push(...LO(r));break;case"hr":e.push(new _t(""));break;case"html":r.text.trim().length>0&&e.push(new _t({children:[new gt(r.text)]}));break;default:break}return e}function _r(t,e){let r=[];for(let n of t)switch(n.type){case"text":case"escape":r.push(new gt({text:n.text,...rd(e)}));break;case"strong":r.push(..._r(hr(n),{...e,bold:!0}));break;case"em":r.push(..._r(hr(n),{...e,italics:!0}));break;case"codespan":r.push(new gt({text:n.text,...rd({...e,code:!0})}));break;case"link":r.push(new mO({link:n.href,children:_r(hr(n),{...e})}));break;case"br":r.push(new gt({text:"",break:1}));break;case"image":r.push(new gt({text:`[image: ${n.text}]`,italics:!0}));break;case"del":r.push(new gt({text:n.text,strike:!0}));break;default:r.push(new gt({text:n.raw,...rd(e)}));break}return r.length===0?[new gt("")]:r}function rd(t){return{...t?.bold===!0?{bold:!0}:{},...t?.italics===!0?{italics:!0}:{},...t?.code===!0?{font:"Courier New"}:{}}}function RO(t){return t.items.map(e=>new _t({children:_r(e.tokens.length===1&&e.tokens[0]?.type==="text"?[{...e.tokens[0],text:Ly(e)+e.tokens[0].text}]:[{type:"text",raw:e.text,text:Ly(e)+e.text}]),...t.ordered?{numbering:{reference:"ordered-list",level:0}}:{bullet:{level:0}}}))}function Ly(t){return t.task?`[${t.checked?"x":" "}] `:""}function $O(t){let e=[t.header,...t.rows].map(r=>new yO({children:r.map(n=>new gO({children:[new _t({children:_r(n.tokens,n.header?{bold:!0}:void 0)})]}))}));return new _O({width:{size:100,type:wO.PERCENTAGE},rows:e})}function LO(t){return t.text.split(`
1864
+ `).map(r=>new _t({children:[new gt({text:r.length===0?" ":r,font:"Courier New"})]}))}function hr(t){let e=t.tokens;return Array.isArray(e)?e:[]}function jO(t){return t.type==="list"&&Array.isArray(t.items)}function OO(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function CO(t){return t.type==="code"&&typeof t.text=="string"}function MO(t){switch(t){case 1:return vn.HEADING_1;case 2:return vn.HEADING_2;case 3:return vn.HEADING_3;case 4:return vn.HEADING_4;case 5:return vn.HEADING_5;default:return vn.HEADING_6}}var Oy,My=T(()=>{"use strict";qe();Oy={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 t=>TO(t,t.state)}});import{createHash as DO}from"node:crypto";import{existsSync as PO,mkdirSync as FO,readFileSync as Dy,statSync as UO}from"node:fs";import{dirname as WO,isAbsolute as Py,normalize as BO,resolve as Cs}from"node:path";import{marked as HO}from"marked";import qO from"write-excel-file/node";async function JO(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;try{let o=await XO(t,e),i=GO(e.input_format),a=await KO(t,e),l=await VO(t,e.title),c=i==="markdown"?sC(o):QO(o);await oC({sheets:c.length===0?[{name:"Sheet1",headers:[],rows:[]}]:c,outputPath:a,title:l??t.workflow.name});let u=UO(a).size;if(u===0)throw new Error("rendered XLSX file was empty");let d=DO("sha256").update(Dy(a)).digest("hex");return t.dal.insertStepArtifact({step_id:s.id,kind:"render_xlsx",path:a,sha:d,provider_call_mode:"library"}),t.dal.finishStep(s.id,"done",`wrote:${a}`),V(t,r,n,{output_path:a,path:a,bytes:u}),K(t.workflow,e.outcomes?.done??"@terminal:done")}catch(o){let i=o instanceof Error?o.message:String(o);return t.dal.finishStep(s.id,"error",i),V(t,r,n,{error:i}),K(t.workflow,e.outcomes?.error??"@terminal:error")}}async function XO(t,e){if(typeof e.source!="string"||e.source.trim().length===0)return"";let r=(await Ve(e.source,t,t.stateId)).trim(),n=zO(t.project.local_path,r);if(n!==null){if(!PO(n))throw new Error(`source file not found: ${n}`);return Dy(n,"utf8")}return r}function GO(t){if(t==null||t==="")return"json";if(t==="json"||t==="markdown")return t;throw new Error(`unsupported input_format: ${String(t)}`)}async function KO(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let r=(await Ve(e.output_path,t,t.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=YO(t.project.local_path,r);if(!n.endsWith(".xlsx"))throw new Error(`output_path must end with .xlsx: ${n}`);return n}async function VO(t,e){if(typeof e!="string"||e.trim().length===0)return null;let r=(await Ve(e,t,t.stateId)).trim();return r.length===0?null:r}function YO(t,e){let r=Cs(t);return BO(Py(e)?Cs(e):Cs(r,e))}function zO(t,e){return ZO(e)?Py(e)?Cs(e):Cs(t,e):null}function ZO(t){return t.endsWith(".json")||t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function QO(t){if(t.trim().length===0)return[];let e;try{e=JSON.parse(t)}catch(r){let n=r instanceof Error?r.message:String(r);throw new Error(`invalid JSON source: ${n}`)}if(!ea(e)||!Array.isArray(e.sheets))throw new Error("JSON source must be an object with sheets[]");return e.sheets.map((r,n)=>eC(r,n))}function eC(t,e){if(!ea(t))throw new Error(`sheets[${e}] must be an object`);let r=tC(t.headers,`sheets[${e}].headers`),n=rC(t.rows,`sheets[${e}].rows`);return{name:typeof t.name=="string"&&t.name.trim().length>0?t.name:`Sheet${e+1}`,headers:r,rows:n,headerStyle:nC(t.styles)}}function tC(t,e){if(t===void 0)return[];if(!Array.isArray(t)||!t.every(r=>typeof r=="string"))throw new Error(`${e} must be an array of strings`);return t}function rC(t,e){if(t===void 0)return[];if(!Array.isArray(t))throw new Error(`${e} must be an array`);return t.map((r,n)=>{if(!Array.isArray(r))throw new Error(`${e}[${n}] must be an array`);return r.map((s,o)=>{if(s===null||typeof s=="string"||typeof s=="number"||typeof s=="boolean")return s;throw new Error(`${e}[${n}][${o}] must be string, number, boolean, or null`)})})}function nC(t){if(!ea(t)||!ea(t.headers))return;let e={};return t.headers.bold===!0&&(e.bold=!0),typeof t.headers.fill=="string"&&(e.fill=t.headers.fill),Object.keys(e).length===0?void 0:e}function sC(t){let e=HO.lexer(t,{gfm:!0}),r=[],n=null;for(let s of e){if(fC(s)){n=s.text;continue}mC(s)&&(r.push({name:n??`Sheet${r.length+1}`,headers:s.header.map(o=>o.text),rows:s.rows.map(o=>o.map(i=>i.text)),headerStyle:{bold:!0}}),n=null)}return r}async function oC(t){FO(WO(t.outputPath),{recursive:!0});let e=new Set,r=t.sheets.map(n=>({sheet:cC(n.name,e),data:iC(n),columns:lC(n)}));await qO(r).toFile(t.outputPath)}function iC(t){let e=[];if(t.headers.length>0){let r=dC(t.headerStyle?.fill);e.push(t.headers.map(n=>({value:n,type:String,fontWeight:t.headerStyle?.bold===!1?void 0:"bold",backgroundColor:r??void 0})))}for(let r of t.rows)e.push(r.map(aC));return e.length===0?[[{}]]:e}function aC(t){return t===null?{}:typeof t=="string"?{value:t,type:String}:typeof t=="number"?{value:t,type:Number}:typeof t=="boolean"?{value:t,type:Boolean}:{}}function lC(t){let e=Math.max(t.headers.length,...t.rows.map(n=>n.length),1),r=[];for(let n=1;n<=e;n+=1){let s=[t.headers[n-1],...t.rows.map(i=>i[n-1])],o=Math.min(60,Math.max(10,...s.map(i=>String(i??"").length+2)));r.push({width:o})}return r}function cC(t,e){let r=uC(t),n=r,s=2;for(;e.has(n.toLowerCase());){let o=` ${s}`;n=`${r.slice(0,31-o.length)}${o}`,s+=1}return e.add(n.toLowerCase()),n}function uC(t){let e=t.replace(/[\[\]:*?/\\]/g," ").trim();return(e.length===0?"Sheet":e).slice(0,31)}function dC(t){if(t===void 0)return null;let e=t.startsWith("#")?t.slice(1):t;return/^[0-9a-fA-F]{6}$/.test(e)?`#${e.toUpperCase()}`:null}function fC(t){return t.type==="heading"&&typeof t.text=="string"}function mC(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function ea(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Fy,Uy=T(()=>{"use strict";qe();Fy={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 t=>JO(t,t.state)}});import{spawnSync as pC}from"node:child_process";async function _C(t,e){let r=t.stateId,n=t.displayName,s=t.workflow.default_task_timeout_ms;for(let f of e.pre_checks??[])if(pC("sh",["-c",f.command],{cwd:t.project.local_path}).status!==0){let p=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(p.id,"fail_pre_check",`pre_check_failed:${f.description??f.command}`),V(t,r,n,"fail_pre_check");let h=e.outcomes.fail_pre_check;return h!==void 0?K(t.workflow,h):{kind:"terminal",terminal:Z(t.workflow)}}let o=kn(t,e.durable_memory_tags),i=e.reviewers??[],a=null,l=i.length===0&&e.outcomes_from_stance!==void 0,c=l?Object.keys(e.outcomes_from_stance):[];for(let f=0;f<e.max_loops;f+=1){let m=`${n}:coder[${f}]`,p=await Sn(t,m,e.coder,a!==null?`PRIOR REVIEW FEEDBACK:
1865
+ ${a}`:null,c,l,s,e.writes_to_project_path===!0,o);if(l){let g=sy(p.text);if(g!==null){let _=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(_.id,null,`escalation_vocab:${g.token}`),{kind:"escalate",token:g.token,reason:g.reason.length>0?`${g.token}: ${g.reason}`:g.token}}}if(p.outcome===null){let g=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(g.id,null,p.status_detail),{kind:"escalate",token:"",reason:`coder_no_outcome:${p.status_detail}`}}if(i.length===0){if(e.outcomes_from_stance!==void 0){let S=Object.keys(e.outcomes_from_stance),w=Rs(p.text,S);if(w.outcome===null){let I=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(I.id,null,`unhandled_stance:${w.reason}`),{kind:"escalate",token:"",reason:`no_stance:${w.reason}`}}let E=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(E.id,w.outcome,"outcomes_from_stance"),V(t,r,n,w.outcome),K(t.workflow,e.outcomes_from_stance[w.outcome])}let g=Rs(p.text,hC);if(g.outcome!==null){let S=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(S.id,g.outcome,"default_failure_stance"),V(t,r,n,g.outcome),{kind:"escalate",token:g.outcome,reason:`failure_stance:${g.outcome}`}}let _=X(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,t.dal.finishStep(_.id,"approve","no_reviewers"),V(t,r,n,"approve"),e.write_back_durable_memory){let S=t.membersByAlias.get(e.coder.alias);S!==void 0&&await Gt(t,n,S,e.write_back_durable_memory)}return K(t.workflow,e.outcomes.approve)}let h=await Promise.all(i.map(g=>Sn(t,`${n}:reviewer_${g.alias}[${f}]`,g,`CODER OUTPUT:
1866
1866
  ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));if(h.every(g=>g.outcome==="approve")){let g=X(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,t.dal.finishStep(g.id,"approve",`loop=${f}`),V(t,r,n,"approve"),e.write_back_durable_memory){let _=t.membersByAlias.get(e.coder.alias);_!==void 0&&await Gt(t,n,_,e.write_back_durable_memory)}return K(t.workflow,e.outcomes.approve)}if(a=h.filter(g=>g.outcome==="request_changes").map(g=>g.text).join(`
1867
1867
 
1868
- `),e.loop_feedback_artifact!==void 0){let g=X(t,{run_id:t.run_id,state_name:`${n}:feedback[${f}]`});t.steps_executed+=1,t.dal.finishStep(g.id,"feedback_captured",`loop=${f}`),t.dal.insertStepArtifact({step_id:g.id,kind:e.loop_feedback_artifact,content:a})}}let u=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(u.id,"max_loops_exceeded",`loops=${e.max_loops}`),V(t,r,n,"max_loops_exceeded");let d=e.outcomes.max_loops_exceeded;return d!==void 0?K(t.workflow,d):{kind:"terminal",terminal:Z(t.workflow)}}var hC,Wy,By=T(()=>{"use strict";Yu();qe();hC=["blocked","failed","aborted"],Wy={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 t=>_C(t,t.state)}});import{spawnSync as gC}from"node:child_process";async function yC(t,e){let r=t.stateId,n=t.displayName,s=await Ve(e.command,t,n),o=ed(t,n),i=_y(s);if(i.matched&&!o){let h=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.insertSessionEvent({run_id:t.run_id,step_id:h.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"side_effect_without_pause",state_id:n,kind:i.kind,command:s,message:`ShellStep ${n} runs a classified side-effect command (${i.kind}) without a preceding approved gate`})}),t.dal.finishStep(h.id,null,`policy_violation:side_effect_without_pause:${i.kind}`),{kind:"terminal",terminal:Z(t.workflow)}}let a=new Date(Date.now()-1),l=typeof e.timeout_ms=="number"&&e.timeout_ms>0,c=gC("sh",["-c",s],{cwd:t.project.local_path,...l?{timeout:e.timeout_ms}:{},encoding:"utf8",env:{...process.env}}),u=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let d=typeof c.stderr=="string"?c.stderr:"",f=c.error;if((d.length>0||f!==void 0)&&t.dal.insertSessionEvent({run_id:t.run_id,step_id:u.id,kind:"shellstep_stderr",timestamp_ms:Date.now(),payload:JSON.stringify({state_id:n,exit_status:c.status,stderr:d,spawn_error:f===void 0?null:f instanceof Error?f.message:String(f),command:s})}),c.status===null)return l?(t.dal.finishStep(u.id,null,`timeout:${e.timeout_ms}ms`),{kind:"terminal",terminal:"shell_step_timeout"}):(t.dal.finishStep(u.id,null,"shell_step_signal_terminated"),{kind:"terminal",terminal:Z(t.workflow)});if(e.writes_to_project_path!==!0&&t.project.local_path.trim().length>0&&td(t.project.local_path,a))return t.dal.insertSessionEvent({run_id:t.run_id,step_id:u.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`})}),t.dal.finishStep(u.id,null,"policy_violation:writes_to_project_path"),{kind:"terminal",terminal:Z(t.workflow)};if(e.capture_output_to!==void 0){let h=c.stdout??"";t.dal.insertStepArtifact({step_id:u.id,kind:e.capture_output_to,content:h})}let m=String(c.status),p=e.outcomes_from_exit[m]??e.outcomes_from_exit.default;return p===void 0?(t.dal.insertStepArtifact({step_id:u.id,kind:"unhandled_exit",content:m}),t.dal.finishStep(u.id,null,`shell_step_unhandled_exit:${m}`),{kind:"terminal",terminal:"shell_step_unhandled_exit"}):(t.dal.finishStep(u.id,m,`exit=${c.status}`),V(t,r,n,m),K(t.workflow,p))}var Hy,qy=T(()=>{"use strict";qe();Hy={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 t=>yC(t,t.state)}});async function wC(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let o=t.dal.getWorkflowByName(e.workflow_name);if(o===null)return t.dal.finishStep(s.id,null,`subflow_missing_workflow:${e.workflow_name}`),{kind:"terminal",terminal:Z(t.workflow)};let i=Me(o.definition),a=await EC(t,e),l=await t.runChildWorkflow(o,i,a);if(l.paused===!0)return t.dal.finishStep(s.id,null,`subflow_paused:${l.run_id}`),{kind:"paused"};let c=l.terminal_state;if(c===null)return t.dal.finishStep(s.id,null,`subflow_no_terminal:${l.run_id}`),{kind:"terminal",terminal:Z(t.workflow)};V(t,r,n,TC(t,l.run_id,i.outputs??[])),t.dal.finishStep(s.id,c,`child_run=${l.run_id}`);let u=e.outcomes[c]??e.outcomes.default;return u===void 0?{kind:"terminal",terminal:Z(t.workflow)}:K(t.workflow,u)}async function EC(t,e){let r={};for(let[n,s]of Object.entries(e.inputs??{})){let o=await cy(s,t);r[n]=o===s?await Yi(s,t):o}return r}function TC(t,e,r){let n={};for(let s of r)n[s.name]=bC(t,e,s);return n}function bC(t,e,r){let s=t.dal.query("SELECT * FROM step WHERE run_id = ? AND state_name = ? ORDER BY id DESC LIMIT 1",e,r.source_step_id)[0];if(s===void 0)return null;let o=SC(s,r.source_field);if(o.found)return o.value;let a=t.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 SC(t,e){switch(e){case"id":return{found:!0,value:t.id};case"run_id":return{found:!0,value:t.run_id};case"parent_step_id":return{found:!0,value:t.parent_step_id};case"state_name":return{found:!0,value:t.state_name};case"outcome":return{found:!0,value:t.outcome};case"status_detail":return{found:!0,value:t.status_detail};case"started_at":return{found:!0,value:t.started_at};case"ended_at":return{found:!0,value:t.ended_at};default:return{found:!1}}}var Jy,Xy=T(()=>{"use strict";En();qe();Rs();Jy={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 t=>wC(t,t.state)}});function kC(t,e){let r=t.stateId,n=t.displayName,s=e.name??n,o=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(o.id,s,e.kind??"neutral"),V(t,r,n,s),{kind:"terminal",terminal:s}}var Gy,Ky=T(()=>{"use strict";qe();Gy={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:t=>kC(t,t.state)}});async function vC(t){let e=typeof t.parameters.org=="string"?t.parameters.org:"",r=typeof t.parameters.repo=="string"?t.parameters.repo:"";if(e.length===0||r.length===0)return null;let n=new URL(`https://api.github.com/repos/${e}/${r}/issues`);n.searchParams.set("state","open"),typeof t.parameters.label=="string"&&t.parameters.label.length>0&&n.searchParams.set("labels",t.parameters.label),typeof t.parameters.since=="string"&&t.parameters.since.length>0&&n.searchParams.set("since",t.parameters.since);let s=await fetch(n);if(!s.ok)throw new Error(`github issue trigger failed: HTTP ${s.status}`);let o=await s.json();if(!Array.isArray(o))throw new Error("github issue trigger returned unexpected JSON");let i=IC(t.cursor),a=o.filter(NC).filter(c=>c.id>i);if(a.length===0)return null;let l=Math.max(...a.map(c=>c.id));return{main:a.map(c=>({trigger_id:t.trigger_id,issue_id:c.id,issue_number:c.number,issue_url:c.html_url,title:c.title,cursor:String(l)}))}}function IC(t){if(t===void 0)return 0;let e=Number(t);return Number.isFinite(e)?e:0}function NC(t){if(t===null||typeof t!="object"||Array.isArray(t))return!1;let e=t;return typeof e.id=="number"&&typeof e.number=="number"&&typeof e.html_url=="string"&&typeof e.title=="string"}var Vy,Yy=T(()=>{"use strict";Vy={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 t=>vC(t)}});async function xC(t){let e=typeof t.parameters.cron=="string"?t.parameters.cron.trim():"";if(e.length===0)return null;let r=new Date(Date.now()).toISOString().slice(0,16);return t.cursor===r?null:{main:[{trigger_id:t.trigger_id,fired_at:new Date(Date.now()).toISOString(),cursor:r,cron:e}]}}var zy,Zy=T(()=>{"use strict";zy={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 t=>xC(t)}});function Qy(t){t.register(yy),t.register(Wy),t.register(by),t.register(xy),t.register(Ry),t.register(Oy),t.register(Fy),t.register(Hy),t.register(Ey),t.register(ky),t.register(Jy),t.register(Gy),t.register(zy),t.register(Vy)}var ew=T(()=>{"use strict";wy();Ty();Sy();Iy();Ay();$y();My();Uy();By();qy();Xy();Ky();Yy();Zy()});function ra(){return ta===null&&(ta=new nd,Qy(ta)),ta}var AC,nd,ta,sd=T(()=>{"use strict";ew();AC={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"},nd=class{types=new Map;register(e){let r=`${e.description.namespace}/${e.description.name}`;if(this.types.has(r))throw new Error(`archetype already registered: ${r}`);this.types.set(r,e)}get(e){let r=e.includes("/")?e:AC[e];return r?this.types.get(r):void 0}list(){return Array.from(this.types.values())}},ta=null});async function nw(t){lw(t.workflow);let e=t.workflowRow??t.dal.getWorkflowByName(t.workflow.name,t.workflow.version);if(e===null)throw new Error(`workflow ${t.workflow.name}@${t.workflow.version} is not registered`);let r=t.dal.getProjectByJob(t.job.id);if(r===null)throw new Error(`job ${t.job.id} has no project`);let n=$C(e.definition,t.workflow),s=t.job.run_id===null?null:t.dal.getRun(t.job.run_id),o=Cs(n)?n.entry_step_id:n.start_at,i=s?.terminal_state===null?s:t.dal.insertRun({job_id:t.job.id,workflow_id:e.id,team_id:t.team.id,current_state:o}),a=n.requires,l=zg(a);if(l!==null)return t.dal.setRunTerminalState(i.id,"aborted"),t.dal.raiseAttention({kind:"missing_workflow_dependency",severity:"error",project_id:r.id,run_id:i.id,payload:JSON.stringify({run_id:i.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:i.id,terminal_state:"aborted",steps_executed:0};let c=new Map(t.members.map(m=>[m.alias,m]));if(Cs(n)){let m=od({dal:t.dal,workflow:sa(n),job:t.job,project:r,run:i,membersByAlias:c,outcomes:s!==null&&i===s?t.dal.listLatestStepOutcomesByState(i.id):{},inputs:pr(t.job.payload)??{},team_id:t.team.id}),p=await ow(n,m,i.current_state??n.entry_step_id);return rw(t.dal,r.id,i.id,n.name,p),p}let u=s!==null&&i===s?t.dal.listLatestStepOutcomesByState(i.id):{},d=od({dal:t.dal,workflow:n,job:t.job,project:r,run:i,membersByAlias:c,outcomes:u,inputs:pr(t.job.payload)??{},team_id:t.team.id}),f=await sw(d,i.current_state??n.start_at);return rw(t.dal,r.id,i.id,n.name,f),f}function rw(t,e,r,n,s){if(s.paused===!0)return;let o=s.terminal_state;if(o===null)return;let i="unknown",a=!1;try{let u=t.getRun(r);if(u!==null){let d=t.getWorkflow(u.workflow_id);if(d!==null){let f=JSON.parse(d.definition),p=(f.terminals??{})[o];if(p!==void 0&&typeof p.kind=="string"&&(p.kind==="success"||p.kind==="failure"||p.kind==="neutral")&&(i=p.kind),i==="unknown"&&Array.isArray(f.steps)){for(let g of f.steps)if(g.type==="lmctl/terminal"&&g.parameters!==null&&typeof g.parameters=="object"){let _=g.parameters;if(_.name===o&&(_.kind==="success"||_.kind==="failure"||_.kind==="neutral")){i=_.kind;break}}}let h=f.errors;if(h!==null&&typeof h=="object"){let g=h;(g.on_unhandled_failure!==void 0||g.on_unhandled_failure_state!==void 0)&&(a=!0)}}}}catch{}if(i==="success"||i==="failure"&&a)return;let l=null;try{l=t.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=i==="failure"?"workflow_failed":"workflow_has_issues";t.raiseAttention({kind:c,severity:i==="failure"?"error":"warn",project_id:e,run_id:r,payload:JSON.stringify({run_id:r,workflow_name:n,terminal_state:o,terminal_kind:i,last_error:l})})}function od(t){let e={dal:t.dal,workflow:t.workflow,job:t.job,project:t.project,run_id:t.run.id,membersByAlias:t.membersByAlias,inputs:t.inputs,outcomes:t.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 o=e.parent_step_id,i=e.iteration;e.parent_step_id=s?.parent_step_id??o,e.iteration=s?.iteration??i;try{return await id(e,r,n,s?.display_name??r)}finally{e.parent_step_id=o,e.iteration=i}},runChildWorkflow:async(r,n,s)=>{lw(n);let o=Cs(n)?n.entry_step_id:n.start_at,i=t.dal.insertRun({job_id:t.job.id,workflow_id:r.id,team_id:t.team_id,current_state:o,parent_run_id:e.run_id}),a=od({dal:t.dal,workflow:Cs(n)?sa(n):n,job:t.job,project:t.project,run:i,membersByAlias:t.membersByAlias,outcomes:{},inputs:s,team_id:t.team_id});return Cs(n)?ow(n,a,i.current_state??n.entry_step_id):sw(a,i.current_state??n.start_at)}};return e}async function sw(t,e){let r=e;if(r.startsWith($s))return{run_id:t.run_id,terminal_state:null,steps_executed:0,paused:!0};for(let s=0;s<1e3;s+=1){if(r.startsWith("@terminal:"))return Kt(t,r.slice(10));t.dal.setRunCurrentState(t.run_id,r),t.last_state_id=r;let o=t.workflow.states[r];if(o===void 0){let l=na(t,Z(t.workflow));if(l.kind==="paused")return De(t);if(l.kind==="escalate")return nt(t,{id:r,name:r,type:"unknown"},l.token,l.reason),De(t);if(l.kind==="terminal")return Kt(t,l.terminal);r=l.state;continue}let i,a=aw(t,r);if(a!==null){let l=X(t,{run_id:t.run_id,state_name:r});if(t.steps_executed+=1,t.dal.finishStep(l.id,a,"escalation_resume"),V(t,r,r,a),a===Qn)return Kt(t,Ol);let c=o.outcomes?.[a];i=c!==void 0?K(t.workflow,c):nt(t,{id:r,name:r,type:o.type},a,`no declared edge for resumed outcome '${a}' from state '${r}'`)}else i=await id(t,r,o);if(i.kind==="paused")return De(t);if(i.kind==="escalate")return nt(t,{id:r,name:r,type:o.type},i.token,i.reason),De(t);if(i.kind==="terminal"){let l=na(t,i.terminal);if(l.kind==="paused")return De(t);if(l.kind==="escalate")return nt(t,{id:r,name:r,type:o.type},l.token,l.reason),De(t);if(l.kind==="terminal")return Kt(t,l.terminal);r=l.state;continue}r=i.state}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})});let n=na(t,Z(t.workflow));return n.kind==="terminal"?Kt(t,n.terminal):Kt(t,Z(t.workflow))}async function ow(t,e,r){let n=new Map(t.steps.map(i=>[i.id,i])),s=new Map(t.steps.map(i=>[i.name,i])),o=r;for(let i=0;i<1e3;i+=1){e.dal.setRunCurrentState(e.run_id,o);let a=n.get(o);if(a===void 0)return nt(e,{id:o,name:o,type:"unknown"},"",`internal:unknown v3 step '${o}'`),De(e);let l=aw(e,a.id);if(l!==null){let m=X(e,{run_id:e.run_id,state_name:a.name});if(e.steps_executed+=1,e.dal.finishStep(m.id,l,"escalation_resume"),V(e,a.id,a.name,l),l===Qn)return Kt(e,Ol);let p=Object.keys(t.connections[a.id]??{}),h=t.connections[a.id]?.[l]?.[0]?.[0]?.step_id??t.connections[a.id]?.main?.[0]?.[0]?.step_id;if(h===void 0)return nt(e,{id:a.id,name:a.name,type:a.type},l,`no declared edge for resumed outcome '${l}' from step '${a.id}'`,{declared_outcomes:p}),De(e);o=h;continue}let c=await RC(e,t,a);if(c.kind==="paused")return De(e);let u=Object.keys(t.connections[a.id]??{});if(c.kind==="escalate")return nt(e,{id:a.id,name:a.name,type:a.type},c.token,c.reason,{declared_outcomes:u}),De(e);let d=c.kind==="terminal"?c.terminal:c.state;if(a.type==="lmctl/terminal"){let m=e.workflow;e.workflow=sa(t,a);try{let p=na(e,d);if(p.kind==="paused")return De(e);if(p.kind==="escalate")return nt(e,{id:a.id,name:a.name,type:a.type},p.token,p.reason),De(e);if(p.kind==="terminal")return Kt(e,p.terminal);let h=s.get(p.state);if(h===void 0)return nt(e,{id:a.id,name:a.name,type:a.type},"",`internal:unknown v3 error handler step '${p.state}'`),De(e);o=h.id;continue}finally{e.workflow=m}}if(Gr(d))return nt(e,{id:a.id,name:a.name,type:a.type},d,`generic escalation '${d}' from step '${a.id}'`,{declared_outcomes:u}),De(e);let f=t.connections[a.id]?.[d]?.[0]?.[0]?.step_id??t.connections[a.id]?.main?.[0]?.[0]?.step_id;if(f===void 0)return nt(e,{id:a.id,name:a.name,type:a.type},d,`no declared edge for outcome '${d}' from step '${a.id}'`,{declared_outcomes:u}),De(e);o=f}return 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})}),Kt(e,"aborted")}async function RC(t,e,r){let n=iw(e,r),s=t.workflow;t.workflow=sa(e,r);try{return await id(t,r.id,n,r.name)}finally{t.workflow=s}}function iw(t,e){let r=e.parameters,n=e.members??{},s=Object.keys(t.connections[e.id]??{}),o=Object.fromEntries(s.map(a=>[a,`@terminal:${a}`])),i={state_name:e.name};switch(e.type){case"lmctl/review":{let a=s.filter(l=>!["approve","request_changes","fail_pre_check","max_loops_exceeded"].includes(l));return{...i,type:"Review",...r,coder:n.coder,reviewers:n.reviewers,outcomes:{approve:o.approve??"@terminal:approve",...o.request_changes!==void 0?{request_changes:o.request_changes}:{},...o.fail_pre_check!==void 0?{fail_pre_check:o.fail_pre_check}:{},...o.max_loops_exceeded!==void 0?{max_loops_exceeded:o.max_loops_exceeded}:{}},...a.length>0?{outcomes_from_stance:Object.fromEntries(a.map(l=>[l,`@terminal:${l}`]))}:{}}}case"lmctl/consolidate":return{...i,type:"Consolidate",...r,researchers:n.researchers,consolidator:n.consolidator,outcomes:{ok:o.ok??"@terminal:ok",...o.error!==void 0?{error:o.error}:{}}};case"lmctl/interactive":return{...i,type:"Interactive",...r,agent:n.agent,outcomes:{done:o.done??"@terminal:done",...o.timeout!==void 0?{timeout:o.timeout}:{}}};case"lmctl/loop":return{...i,type:"Loop",...r,outcomes:{ok:o.ok??"@terminal:ok",...o.error!==void 0?{error:o.error}:{}}};case"lmctl/render-docx":return{...i,type:"lmctl/render-docx",...r,outcomes:{done:o.done??"@terminal:done",...o.error!==void 0?{error:o.error}:{}}};case"lmctl/render-xlsx":return{...i,type:"lmctl/render-xlsx",...r,outcomes:{done:o.done??"@terminal:done",...o.error!==void 0?{error:o.error}:{}}};case"lmctl/shell-step":return{...i,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{...i,type:"AssertRepoClean",...r,next:o.main??"@terminal:main"};case"lmctl/choice":return{...i,type:"Choice",...r};case"lmctl/foreach":return{...i,type:"ForEach",...r,outcomes:{all_ok:o.all_ok??"@terminal:all_ok",...o.any_failed!==void 0?{any_failed:o.any_failed}:{}}};case"lmctl/subflow":return{...i,type:"Subflow",...r,outcomes:o};case"lmctl/terminal":return{...i,type:"Terminal",name:r.name,kind:r.kind};default:return{...i,type:e.type,...r}}}async function id(t,e,r,n){let s=ra().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 o=t.emit_progress,i=t.progress_step_id;t.emit_progress=s.description.emits_progress===!0?OC(t,s):void 0,t.progress_step_id=null;try{return await s.execute(py(t,e,r,n??e))}finally{t.emit_progress=o,t.progress_step_id=i}}function $C(t,e){try{let r=JSON.parse(t);if(LC(r)&&r.definition_schema_version===3)return Nt.parse(r)}catch{return e}return e}function Cs(t){return t.definition_schema_version===3}function sa(t,e){let r=e===void 0?[]:Object.keys(t.connections[e.id]??{}),n=Object.fromEntries(r.map(o=>[o,{kind:o==="aborted"?"failure":"neutral"}])),s={};if(e?.type==="lmctl/loop"&&typeof e.parameters.body=="string"){let o=t.steps.find(i=>i.name===e.parameters.body);o!==void 0&&(s[e.parameters.body]=iw(t,o))}return e?.type==="lmctl/terminal"&&typeof e.parameters.name=="string"&&(n[e.parameters.name]={kind:jC(e.parameters.kind)}),n.aborted??={kind:"failure"},{name:t.name,version:t.version,definition_schema_version:2,primitive_version:2,start_at:e?.name??t.entry_step_id,states:s,terminals:n,...t.default_task_timeout_ms!==void 0?{default_task_timeout_ms:t.default_task_timeout_ms}:{},...t.concurrency_key!==void 0?{concurrency_key:t.concurrency_key}:{},...t.concurrent_limit!==void 0?{concurrent_limit:t.concurrent_limit}:{},...t.errors!==void 0?{errors:t.errors}:{}}}function jC(t){return t==="success"||t==="failure"||t==="neutral"?t:"neutral"}function LC(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function OC(t,e){let r=`progress.${e.description.namespace}/${e.description.name}`;return n=>{try{if(typeof n.kind!="string"||n.kind.length===0)return;t.dal.insertSessionEvent({run_id:t.run_id,step_id:t.progress_step_id,kind:`${r}.${n.kind}`,timestamp_ms:Date.now(),payload:JSON.stringify({message:n.message,data:n.data})})}catch(s){let o=s instanceof Error?s.message:String(s);console.warn(`[progress] dropped ${r} event: ${o}`)}}}function Kt(t,e){t.dal.setRunTerminalState(t.run_id,e);try{Gg(t.run_id,t.dal)}catch{}return{run_id:t.run_id,terminal_state:e,steps_executed:t.steps_executed}}function De(t){return{run_id:t.run_id,terminal_state:null,steps_executed:t.steps_executed,paused:!0}}function aw(t,e){let n=t.dal.getRun(t.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 o=s[e];if(typeof o!="string")return null;delete s[e];let i=Object.keys(s).length>0?JSON.stringify(s):null;return t.dal.setRunPendingEscalationDecision(t.run_id,i),o}function na(t,e){if(!CC(t.workflow,e)||t.errors_block_fired)return{kind:"terminal",terminal:e};let r=t.workflow.errors;return r===void 0?{kind:"terminal",terminal:e}:(t.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&&MC(t,e,r.on_unhandled_failure),{kind:"terminal",terminal:e}))}function CC(t,e){return t.definition_schema_version===2&&t.terminals[e]?.kind==="failure"}function MC(t,e,r){let n=DC(t),s=r.capture_evidence&&n!==null?PC(t,n.id):[];t.dal.raiseAttention({kind:r.attention_kind,severity:r.severity,project_id:t.project.id,run_id:t.run_id,payload:JSON.stringify({run_id:t.run_id,terminal_state:e,current_state:t.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 DC(t){return t.dal.query("SELECT id, state_name, outcome, status_detail FROM step WHERE run_id = ? ORDER BY id DESC LIMIT 1",t.run_id)[0]??null}function PC(t,e){return t.dal.query("SELECT path FROM step_artifact WHERE step_id = ? AND path IS NOT NULL ORDER BY id DESC",e).map(n=>n.path)}function lw(t){if(!tw.includes(t.definition_schema_version))throw new Error(`unsupported definition_schema_version ${t.definition_schema_version}; supported versions: ${tw.join(", ")}`)}var tw,cw=T(()=>{"use strict";yn();Kg();Zg();qe();sd();es();tw=[1,2,3]});import{readFileSync as FC,readdirSync as UC}from"node:fs";import{basename as WC,join as BC,resolve as HC}from"node:path";function fw(t={}){let e=HC(t.workflowsDir??"workflows"),r=UC(e).filter(n=>n.endsWith(".compound.json")).sort((n,s)=>n.localeCompare(s));return{generated_at:new Date().toISOString(),workflows_dir:e,rows:r.map(n=>qC(BC(e,n)))}}function qC(t){let e=WC(t);try{let r=FC(t,"utf8"),n=Me(r);return hw(e,n)}catch(r){return{file:e,workflow_name:null,status:"FAIL",first_step_id:null,first_step_type:null,first_step_disposition:null,note:_w(r)}}}function mw(t,e){try{let r=Me(e);return hw(t,r)}catch(r){return{file:t,workflow_name:t,status:"FAIL",first_step_id:null,first_step_type:null,first_step_disposition:null,note:_w(r)}}}function pw(t){let e=[];e.push(`workflow verification - ${t.generated_at}`),e.push(`dir: ${t.workflows_dir}`),e.push(""),e.push(`${"status".padEnd(17)} ${"workflow".padEnd(36)} ${"first step".padEnd(52)} note`),e.push(`${"-".repeat(17)} ${"-".repeat(36)} ${"-".repeat(52)} ${"-".repeat(30)}`);for(let o of t.rows){let i=(o.workflow_name??o.file).slice(0,36).padEnd(36),a=`${o.first_step_id??"-"}${o.first_step_type===null?"":` (${o.first_step_type})`}`;e.push(`${o.status.padEnd(17)} ${i} ${a.slice(0,52).padEnd(52)} ${o.note}`)}let r=t.rows.filter(o=>o.status==="PASS").length,n=t.rows.filter(o=>o.status==="PASS_NEEDS_INPUTS").length,s=t.rows.filter(o=>o.status==="FAIL").length;return e.push(""),e.push(`summary: ${r} pass, ${n} pass_needs_inputs, ${s} fail`),`${e.join(`
1868
+ `),e.loop_feedback_artifact!==void 0){let g=X(t,{run_id:t.run_id,state_name:`${n}:feedback[${f}]`});t.steps_executed+=1,t.dal.finishStep(g.id,"feedback_captured",`loop=${f}`),t.dal.insertStepArtifact({step_id:g.id,kind:e.loop_feedback_artifact,content:a})}}let u=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(u.id,"max_loops_exceeded",`loops=${e.max_loops}`),V(t,r,n,"max_loops_exceeded");let d=e.outcomes.max_loops_exceeded;return d!==void 0?K(t.workflow,d):{kind:"terminal",terminal:Z(t.workflow)}}var hC,Wy,By=T(()=>{"use strict";Yu();qe();hC=["blocked","failed","aborted"],Wy={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 t=>_C(t,t.state)}});import{spawnSync as gC}from"node:child_process";async function yC(t,e){let r=t.stateId,n=t.displayName,s=await Ve(e.command,t,n),o=ed(t,n),i=_y(s);if(i.matched&&!o){let h=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.insertSessionEvent({run_id:t.run_id,step_id:h.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"side_effect_without_pause",state_id:n,kind:i.kind,command:s,message:`ShellStep ${n} runs a classified side-effect command (${i.kind}) without a preceding approved gate`})}),t.dal.finishStep(h.id,null,`policy_violation:side_effect_without_pause:${i.kind}`),{kind:"terminal",terminal:Z(t.workflow)}}let a=new Date(Date.now()-1),l=typeof e.timeout_ms=="number"&&e.timeout_ms>0,c=gC("sh",["-c",s],{cwd:t.project.local_path,...l?{timeout:e.timeout_ms}:{},encoding:"utf8",env:{...process.env}}),u=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let d=typeof c.stderr=="string"?c.stderr:"",f=c.error;if((d.length>0||f!==void 0)&&t.dal.insertSessionEvent({run_id:t.run_id,step_id:u.id,kind:"shellstep_stderr",timestamp_ms:Date.now(),payload:JSON.stringify({state_id:n,exit_status:c.status,stderr:d,spawn_error:f===void 0?null:f instanceof Error?f.message:String(f),command:s})}),c.status===null)return l?(t.dal.finishStep(u.id,null,`timeout:${e.timeout_ms}ms`),{kind:"terminal",terminal:"shell_step_timeout"}):(t.dal.finishStep(u.id,null,"shell_step_signal_terminated"),{kind:"terminal",terminal:Z(t.workflow)});if(e.writes_to_project_path!==!0&&t.project.local_path.trim().length>0&&td(t.project.local_path,a))return t.dal.insertSessionEvent({run_id:t.run_id,step_id:u.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`})}),t.dal.finishStep(u.id,null,"policy_violation:writes_to_project_path"),{kind:"terminal",terminal:Z(t.workflow)};if(e.capture_output_to!==void 0){let h=c.stdout??"";t.dal.insertStepArtifact({step_id:u.id,kind:e.capture_output_to,content:h})}let m=String(c.status),p=e.outcomes_from_exit[m]??e.outcomes_from_exit.default;return p===void 0?(t.dal.insertStepArtifact({step_id:u.id,kind:"unhandled_exit",content:m}),t.dal.finishStep(u.id,null,`shell_step_unhandled_exit:${m}`),{kind:"terminal",terminal:"shell_step_unhandled_exit"}):(t.dal.finishStep(u.id,m,`exit=${c.status}`),V(t,r,n,m),K(t.workflow,p))}var Hy,qy=T(()=>{"use strict";qe();Hy={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 t=>yC(t,t.state)}});async function wC(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let o=t.dal.getWorkflowByName(e.workflow_name);if(o===null)return t.dal.finishStep(s.id,null,`subflow_missing_workflow:${e.workflow_name}`),{kind:"terminal",terminal:Z(t.workflow)};let i=Me(o.definition),a=await EC(t,e),l=await t.runChildWorkflow(o,i,a);if(l.paused===!0)return t.dal.finishStep(s.id,null,`subflow_paused:${l.run_id}`),{kind:"paused"};let c=l.terminal_state;if(c===null)return t.dal.finishStep(s.id,null,`subflow_no_terminal:${l.run_id}`),{kind:"terminal",terminal:Z(t.workflow)};V(t,r,n,TC(t,l.run_id,i.outputs??[])),t.dal.finishStep(s.id,c,`child_run=${l.run_id}`);let u=e.outcomes[c]??e.outcomes.default;return u===void 0?{kind:"terminal",terminal:Z(t.workflow)}:K(t.workflow,u)}async function EC(t,e){let r={};for(let[n,s]of Object.entries(e.inputs??{})){let o=await cy(s,t);r[n]=o===s?await Yi(s,t):o}return r}function TC(t,e,r){let n={};for(let s of r)n[s.name]=bC(t,e,s);return n}function bC(t,e,r){let s=t.dal.query("SELECT * FROM step WHERE run_id = ? AND state_name = ? ORDER BY id DESC LIMIT 1",e,r.source_step_id)[0];if(s===void 0)return null;let o=SC(s,r.source_field);if(o.found)return o.value;let a=t.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 SC(t,e){switch(e){case"id":return{found:!0,value:t.id};case"run_id":return{found:!0,value:t.run_id};case"parent_step_id":return{found:!0,value:t.parent_step_id};case"state_name":return{found:!0,value:t.state_name};case"outcome":return{found:!0,value:t.outcome};case"status_detail":return{found:!0,value:t.status_detail};case"started_at":return{found:!0,value:t.started_at};case"ended_at":return{found:!0,value:t.ended_at};default:return{found:!1}}}var Jy,Xy=T(()=>{"use strict";En();qe();$s();Jy={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 t=>wC(t,t.state)}});function kC(t,e){let r=t.stateId,n=t.displayName,s=e.name??n,o=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(o.id,s,e.kind??"neutral"),V(t,r,n,s),{kind:"terminal",terminal:s}}var Gy,Ky=T(()=>{"use strict";qe();Gy={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:t=>kC(t,t.state)}});async function vC(t){let e=typeof t.parameters.org=="string"?t.parameters.org:"",r=typeof t.parameters.repo=="string"?t.parameters.repo:"";if(e.length===0||r.length===0)return null;let n=new URL(`https://api.github.com/repos/${e}/${r}/issues`);n.searchParams.set("state","open"),typeof t.parameters.label=="string"&&t.parameters.label.length>0&&n.searchParams.set("labels",t.parameters.label),typeof t.parameters.since=="string"&&t.parameters.since.length>0&&n.searchParams.set("since",t.parameters.since);let s=await fetch(n);if(!s.ok)throw new Error(`github issue trigger failed: HTTP ${s.status}`);let o=await s.json();if(!Array.isArray(o))throw new Error("github issue trigger returned unexpected JSON");let i=IC(t.cursor),a=o.filter(NC).filter(c=>c.id>i);if(a.length===0)return null;let l=Math.max(...a.map(c=>c.id));return{main:a.map(c=>({trigger_id:t.trigger_id,issue_id:c.id,issue_number:c.number,issue_url:c.html_url,title:c.title,cursor:String(l)}))}}function IC(t){if(t===void 0)return 0;let e=Number(t);return Number.isFinite(e)?e:0}function NC(t){if(t===null||typeof t!="object"||Array.isArray(t))return!1;let e=t;return typeof e.id=="number"&&typeof e.number=="number"&&typeof e.html_url=="string"&&typeof e.title=="string"}var Vy,Yy=T(()=>{"use strict";Vy={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 t=>vC(t)}});async function xC(t){let e=typeof t.parameters.cron=="string"?t.parameters.cron.trim():"";if(e.length===0)return null;let r=new Date(Date.now()).toISOString().slice(0,16);return t.cursor===r?null:{main:[{trigger_id:t.trigger_id,fired_at:new Date(Date.now()).toISOString(),cursor:r,cron:e}]}}var zy,Zy=T(()=>{"use strict";zy={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 t=>xC(t)}});function Qy(t){t.register(yy),t.register(Wy),t.register(by),t.register(xy),t.register(Ry),t.register(Oy),t.register(Fy),t.register(Hy),t.register(Ey),t.register(ky),t.register(Jy),t.register(Gy),t.register(zy),t.register(Vy)}var ew=T(()=>{"use strict";wy();Ty();Sy();Iy();Ay();$y();My();Uy();By();qy();Xy();Ky();Yy();Zy()});function ra(){return ta===null&&(ta=new nd,Qy(ta)),ta}var AC,nd,ta,sd=T(()=>{"use strict";ew();AC={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"},nd=class{types=new Map;register(e){let r=`${e.description.namespace}/${e.description.name}`;if(this.types.has(r))throw new Error(`archetype already registered: ${r}`);this.types.set(r,e)}get(e){let r=e.includes("/")?e:AC[e];return r?this.types.get(r):void 0}list(){return Array.from(this.types.values())}},ta=null});async function nw(t){lw(t.workflow);let e=t.workflowRow??t.dal.getWorkflowByName(t.workflow.name,t.workflow.version);if(e===null)throw new Error(`workflow ${t.workflow.name}@${t.workflow.version} is not registered`);let r=t.dal.getProjectByJob(t.job.id);if(r===null)throw new Error(`job ${t.job.id} has no project`);let n=$C(e.definition,t.workflow),s=t.job.run_id===null?null:t.dal.getRun(t.job.run_id),o=Ms(n)?n.entry_step_id:n.start_at,i=s?.terminal_state===null?s:t.dal.insertRun({job_id:t.job.id,workflow_id:e.id,team_id:t.team.id,current_state:o}),a=n.requires,l=zg(a);if(l!==null)return t.dal.setRunTerminalState(i.id,"aborted"),t.dal.raiseAttention({kind:"missing_workflow_dependency",severity:"error",project_id:r.id,run_id:i.id,payload:JSON.stringify({run_id:i.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:i.id,terminal_state:"aborted",steps_executed:0};let c=new Map(t.members.map(m=>[m.alias,m]));if(Ms(n)){let m=od({dal:t.dal,workflow:sa(n),job:t.job,project:r,run:i,membersByAlias:c,outcomes:s!==null&&i===s?t.dal.listLatestStepOutcomesByState(i.id):{},inputs:pr(t.job.payload)??{},team_id:t.team.id}),p=await ow(n,m,i.current_state??n.entry_step_id);return rw(t.dal,r.id,i.id,n.name,p),p}let u=s!==null&&i===s?t.dal.listLatestStepOutcomesByState(i.id):{},d=od({dal:t.dal,workflow:n,job:t.job,project:r,run:i,membersByAlias:c,outcomes:u,inputs:pr(t.job.payload)??{},team_id:t.team.id}),f=await sw(d,i.current_state??n.start_at);return rw(t.dal,r.id,i.id,n.name,f),f}function rw(t,e,r,n,s){if(s.paused===!0)return;let o=s.terminal_state;if(o===null)return;let i="unknown",a=!1;try{let u=t.getRun(r);if(u!==null){let d=t.getWorkflow(u.workflow_id);if(d!==null){let f=JSON.parse(d.definition),p=(f.terminals??{})[o];if(p!==void 0&&typeof p.kind=="string"&&(p.kind==="success"||p.kind==="failure"||p.kind==="neutral")&&(i=p.kind),i==="unknown"&&Array.isArray(f.steps)){for(let g of f.steps)if(g.type==="lmctl/terminal"&&g.parameters!==null&&typeof g.parameters=="object"){let _=g.parameters;if(_.name===o&&(_.kind==="success"||_.kind==="failure"||_.kind==="neutral")){i=_.kind;break}}}let h=f.errors;if(h!==null&&typeof h=="object"){let g=h;(g.on_unhandled_failure!==void 0||g.on_unhandled_failure_state!==void 0)&&(a=!0)}}}}catch{}if(i==="success"||i==="failure"&&a)return;let l=null;try{l=t.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=i==="failure"?"workflow_failed":"workflow_has_issues";t.raiseAttention({kind:c,severity:i==="failure"?"error":"warn",project_id:e,run_id:r,payload:JSON.stringify({run_id:r,workflow_name:n,terminal_state:o,terminal_kind:i,last_error:l})})}function od(t){let e={dal:t.dal,workflow:t.workflow,job:t.job,project:t.project,run_id:t.run.id,membersByAlias:t.membersByAlias,inputs:t.inputs,outcomes:t.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 o=e.parent_step_id,i=e.iteration;e.parent_step_id=s?.parent_step_id??o,e.iteration=s?.iteration??i;try{return await id(e,r,n,s?.display_name??r)}finally{e.parent_step_id=o,e.iteration=i}},runChildWorkflow:async(r,n,s)=>{lw(n);let o=Ms(n)?n.entry_step_id:n.start_at,i=t.dal.insertRun({job_id:t.job.id,workflow_id:r.id,team_id:t.team_id,current_state:o,parent_run_id:e.run_id}),a=od({dal:t.dal,workflow:Ms(n)?sa(n):n,job:t.job,project:t.project,run:i,membersByAlias:t.membersByAlias,outcomes:{},inputs:s,team_id:t.team_id});return Ms(n)?ow(n,a,i.current_state??n.entry_step_id):sw(a,i.current_state??n.start_at)}};return e}async function sw(t,e){let r=e;if(r.startsWith(Ls))return{run_id:t.run_id,terminal_state:null,steps_executed:0,paused:!0};for(let s=0;s<1e3;s+=1){if(r.startsWith("@terminal:"))return Kt(t,r.slice(10));t.dal.setRunCurrentState(t.run_id,r),t.last_state_id=r;let o=t.workflow.states[r];if(o===void 0){let l=na(t,Z(t.workflow));if(l.kind==="paused")return De(t);if(l.kind==="escalate")return nt(t,{id:r,name:r,type:"unknown"},l.token,l.reason),De(t);if(l.kind==="terminal")return Kt(t,l.terminal);r=l.state;continue}let i,a=aw(t,r);if(a!==null){let l=X(t,{run_id:t.run_id,state_name:r});if(t.steps_executed+=1,t.dal.finishStep(l.id,a,"escalation_resume"),V(t,r,r,a),a===es)return Kt(t,Ol);let c=o.outcomes?.[a];i=c!==void 0?K(t.workflow,c):nt(t,{id:r,name:r,type:o.type},a,`no declared edge for resumed outcome '${a}' from state '${r}'`)}else i=await id(t,r,o);if(i.kind==="paused")return De(t);if(i.kind==="escalate")return nt(t,{id:r,name:r,type:o.type},i.token,i.reason),De(t);if(i.kind==="terminal"){let l=na(t,i.terminal);if(l.kind==="paused")return De(t);if(l.kind==="escalate")return nt(t,{id:r,name:r,type:o.type},l.token,l.reason),De(t);if(l.kind==="terminal")return Kt(t,l.terminal);r=l.state;continue}r=i.state}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})});let n=na(t,Z(t.workflow));return n.kind==="terminal"?Kt(t,n.terminal):Kt(t,Z(t.workflow))}async function ow(t,e,r){let n=new Map(t.steps.map(i=>[i.id,i])),s=new Map(t.steps.map(i=>[i.name,i])),o=r;for(let i=0;i<1e3;i+=1){e.dal.setRunCurrentState(e.run_id,o);let a=n.get(o);if(a===void 0)return nt(e,{id:o,name:o,type:"unknown"},"",`internal:unknown v3 step '${o}'`),De(e);let l=aw(e,a.id);if(l!==null){let m=X(e,{run_id:e.run_id,state_name:a.name});if(e.steps_executed+=1,e.dal.finishStep(m.id,l,"escalation_resume"),V(e,a.id,a.name,l),l===es)return Kt(e,Ol);let p=Object.keys(t.connections[a.id]??{}),h=t.connections[a.id]?.[l]?.[0]?.[0]?.step_id??t.connections[a.id]?.main?.[0]?.[0]?.step_id;if(h===void 0)return nt(e,{id:a.id,name:a.name,type:a.type},l,`no declared edge for resumed outcome '${l}' from step '${a.id}'`,{declared_outcomes:p}),De(e);o=h;continue}let c=await RC(e,t,a);if(c.kind==="paused")return De(e);let u=Object.keys(t.connections[a.id]??{});if(c.kind==="escalate")return nt(e,{id:a.id,name:a.name,type:a.type},c.token,c.reason,{declared_outcomes:u}),De(e);let d=c.kind==="terminal"?c.terminal:c.state;if(a.type==="lmctl/terminal"){let m=e.workflow;e.workflow=sa(t,a);try{let p=na(e,d);if(p.kind==="paused")return De(e);if(p.kind==="escalate")return nt(e,{id:a.id,name:a.name,type:a.type},p.token,p.reason),De(e);if(p.kind==="terminal")return Kt(e,p.terminal);let h=s.get(p.state);if(h===void 0)return nt(e,{id:a.id,name:a.name,type:a.type},"",`internal:unknown v3 error handler step '${p.state}'`),De(e);o=h.id;continue}finally{e.workflow=m}}if(Gr(d))return nt(e,{id:a.id,name:a.name,type:a.type},d,`generic escalation '${d}' from step '${a.id}'`,{declared_outcomes:u}),De(e);let f=t.connections[a.id]?.[d]?.[0]?.[0]?.step_id??t.connections[a.id]?.main?.[0]?.[0]?.step_id;if(f===void 0)return nt(e,{id:a.id,name:a.name,type:a.type},d,`no declared edge for outcome '${d}' from step '${a.id}'`,{declared_outcomes:u}),De(e);o=f}return 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})}),Kt(e,"aborted")}async function RC(t,e,r){let n=iw(e,r),s=t.workflow;t.workflow=sa(e,r);try{return await id(t,r.id,n,r.name)}finally{t.workflow=s}}function iw(t,e){let r=e.parameters,n=e.members??{},s=Object.keys(t.connections[e.id]??{}),o=Object.fromEntries(s.map(a=>[a,`@terminal:${a}`])),i={state_name:e.name};switch(e.type){case"lmctl/review":{let a=s.filter(l=>!["approve","request_changes","fail_pre_check","max_loops_exceeded"].includes(l));return{...i,type:"Review",...r,coder:n.coder,reviewers:n.reviewers,outcomes:{approve:o.approve??"@terminal:approve",...o.request_changes!==void 0?{request_changes:o.request_changes}:{},...o.fail_pre_check!==void 0?{fail_pre_check:o.fail_pre_check}:{},...o.max_loops_exceeded!==void 0?{max_loops_exceeded:o.max_loops_exceeded}:{}},...a.length>0?{outcomes_from_stance:Object.fromEntries(a.map(l=>[l,`@terminal:${l}`]))}:{}}}case"lmctl/consolidate":return{...i,type:"Consolidate",...r,researchers:n.researchers,consolidator:n.consolidator,outcomes:{ok:o.ok??"@terminal:ok",...o.error!==void 0?{error:o.error}:{}}};case"lmctl/interactive":return{...i,type:"Interactive",...r,agent:n.agent,outcomes:{done:o.done??"@terminal:done",...o.timeout!==void 0?{timeout:o.timeout}:{}}};case"lmctl/loop":return{...i,type:"Loop",...r,outcomes:{ok:o.ok??"@terminal:ok",...o.error!==void 0?{error:o.error}:{}}};case"lmctl/render-docx":return{...i,type:"lmctl/render-docx",...r,outcomes:{done:o.done??"@terminal:done",...o.error!==void 0?{error:o.error}:{}}};case"lmctl/render-xlsx":return{...i,type:"lmctl/render-xlsx",...r,outcomes:{done:o.done??"@terminal:done",...o.error!==void 0?{error:o.error}:{}}};case"lmctl/shell-step":return{...i,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{...i,type:"AssertRepoClean",...r,next:o.main??"@terminal:main"};case"lmctl/choice":return{...i,type:"Choice",...r};case"lmctl/foreach":return{...i,type:"ForEach",...r,outcomes:{all_ok:o.all_ok??"@terminal:all_ok",...o.any_failed!==void 0?{any_failed:o.any_failed}:{}}};case"lmctl/subflow":return{...i,type:"Subflow",...r,outcomes:o};case"lmctl/terminal":return{...i,type:"Terminal",name:r.name,kind:r.kind};default:return{...i,type:e.type,...r}}}async function id(t,e,r,n){let s=ra().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 o=t.emit_progress,i=t.progress_step_id;t.emit_progress=s.description.emits_progress===!0?OC(t,s):void 0,t.progress_step_id=null;try{return await s.execute(py(t,e,r,n??e))}finally{t.emit_progress=o,t.progress_step_id=i}}function $C(t,e){try{let r=JSON.parse(t);if(jC(r)&&r.definition_schema_version===3)return Nt.parse(r)}catch{return e}return e}function Ms(t){return t.definition_schema_version===3}function sa(t,e){let r=e===void 0?[]:Object.keys(t.connections[e.id]??{}),n=Object.fromEntries(r.map(o=>[o,{kind:o==="aborted"?"failure":"neutral"}])),s={};if(e?.type==="lmctl/loop"&&typeof e.parameters.body=="string"){let o=t.steps.find(i=>i.name===e.parameters.body);o!==void 0&&(s[e.parameters.body]=iw(t,o))}return e?.type==="lmctl/terminal"&&typeof e.parameters.name=="string"&&(n[e.parameters.name]={kind:LC(e.parameters.kind)}),n.aborted??={kind:"failure"},{name:t.name,version:t.version,definition_schema_version:2,primitive_version:2,start_at:e?.name??t.entry_step_id,states:s,terminals:n,...t.default_task_timeout_ms!==void 0?{default_task_timeout_ms:t.default_task_timeout_ms}:{},...t.concurrency_key!==void 0?{concurrency_key:t.concurrency_key}:{},...t.concurrent_limit!==void 0?{concurrent_limit:t.concurrent_limit}:{},...t.errors!==void 0?{errors:t.errors}:{}}}function LC(t){return t==="success"||t==="failure"||t==="neutral"?t:"neutral"}function jC(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function OC(t,e){let r=`progress.${e.description.namespace}/${e.description.name}`;return n=>{try{if(typeof n.kind!="string"||n.kind.length===0)return;t.dal.insertSessionEvent({run_id:t.run_id,step_id:t.progress_step_id,kind:`${r}.${n.kind}`,timestamp_ms:Date.now(),payload:JSON.stringify({message:n.message,data:n.data})})}catch(s){let o=s instanceof Error?s.message:String(s);console.warn(`[progress] dropped ${r} event: ${o}`)}}}function Kt(t,e){t.dal.setRunTerminalState(t.run_id,e);try{Gg(t.run_id,t.dal)}catch{}return{run_id:t.run_id,terminal_state:e,steps_executed:t.steps_executed}}function De(t){return{run_id:t.run_id,terminal_state:null,steps_executed:t.steps_executed,paused:!0}}function aw(t,e){let n=t.dal.getRun(t.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 o=s[e];if(typeof o!="string")return null;delete s[e];let i=Object.keys(s).length>0?JSON.stringify(s):null;return t.dal.setRunPendingEscalationDecision(t.run_id,i),o}function na(t,e){if(!CC(t.workflow,e)||t.errors_block_fired)return{kind:"terminal",terminal:e};let r=t.workflow.errors;return r===void 0?{kind:"terminal",terminal:e}:(t.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&&MC(t,e,r.on_unhandled_failure),{kind:"terminal",terminal:e}))}function CC(t,e){return t.definition_schema_version===2&&t.terminals[e]?.kind==="failure"}function MC(t,e,r){let n=DC(t),s=r.capture_evidence&&n!==null?PC(t,n.id):[];t.dal.raiseAttention({kind:r.attention_kind,severity:r.severity,project_id:t.project.id,run_id:t.run_id,payload:JSON.stringify({run_id:t.run_id,terminal_state:e,current_state:t.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 DC(t){return t.dal.query("SELECT id, state_name, outcome, status_detail FROM step WHERE run_id = ? ORDER BY id DESC LIMIT 1",t.run_id)[0]??null}function PC(t,e){return t.dal.query("SELECT path FROM step_artifact WHERE step_id = ? AND path IS NOT NULL ORDER BY id DESC",e).map(n=>n.path)}function lw(t){if(!tw.includes(t.definition_schema_version))throw new Error(`unsupported definition_schema_version ${t.definition_schema_version}; supported versions: ${tw.join(", ")}`)}var tw,cw=T(()=>{"use strict";yn();Kg();Zg();qe();sd();ts();tw=[1,2,3]});import{readFileSync as FC,readdirSync as UC}from"node:fs";import{basename as WC,join as BC,resolve as HC}from"node:path";function fw(t={}){let e=HC(t.workflowsDir??"workflows"),r=UC(e).filter(n=>n.endsWith(".compound.json")).sort((n,s)=>n.localeCompare(s));return{generated_at:new Date().toISOString(),workflows_dir:e,rows:r.map(n=>qC(BC(e,n)))}}function qC(t){let e=WC(t);try{let r=FC(t,"utf8"),n=Me(r);return hw(e,n)}catch(r){return{file:e,workflow_name:null,status:"FAIL",first_step_id:null,first_step_type:null,first_step_disposition:null,note:_w(r)}}}function mw(t,e){try{let r=Me(e);return hw(t,r)}catch(r){return{file:t,workflow_name:t,status:"FAIL",first_step_id:null,first_step_type:null,first_step_disposition:null,note:_w(r)}}}function pw(t){let e=[];e.push(`workflow verification - ${t.generated_at}`),e.push(`dir: ${t.workflows_dir}`),e.push(""),e.push(`${"status".padEnd(17)} ${"workflow".padEnd(36)} ${"first step".padEnd(52)} note`),e.push(`${"-".repeat(17)} ${"-".repeat(36)} ${"-".repeat(52)} ${"-".repeat(30)}`);for(let o of t.rows){let i=(o.workflow_name??o.file).slice(0,36).padEnd(36),a=`${o.first_step_id??"-"}${o.first_step_type===null?"":` (${o.first_step_type})`}`;e.push(`${o.status.padEnd(17)} ${i} ${a.slice(0,52).padEnd(52)} ${o.note}`)}let r=t.rows.filter(o=>o.status==="PASS").length,n=t.rows.filter(o=>o.status==="PASS_NEEDS_INPUTS").length,s=t.rows.filter(o=>o.status==="FAIL").length;return e.push(""),e.push(`summary: ${r} pass, ${n} pass_needs_inputs, ${s} fail`),`${e.join(`
1869
1869
  `)}
1870
- `}function hw(t,e){let r=XC(e),n=GC(e);if(r===null||n===null)return{file:t,workflow_name:e.name,status:"FAIL",first_step_id:r,first_step_type:n,first_step_disposition:null,note:"entry step missing after validation"};let s=JC(e.inputs);return s.length>0?{file:t,workflow_name:e.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:t,workflow_name:e.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 JC(t){return(t??[]).filter(e=>e.required===!0&&e.default===void 0).map(e=>e.name)}function XC(t){return ad(t)?t.entry_step_id:t.start_at}function GC(t){return ad(t)?t.steps.find(e=>e.id===t.entry_step_id)?.type??null:t.states[t.start_at]?.type??null}function ad(t){return t.definition_schema_version===3}function _w(t){return t instanceof Xt?t.issues.map(e=>`${e.path}: ${e.message}`).join("; "):t instanceof SyntaxError?`JSON parse failed: ${t.message}`:t instanceof Error?t.message:String(t)}function gw(t){let e=new Set;if(ad(t))for(let r of t.steps){let n=r.members??{};uw(n,e)}else for(let r of Object.values(t.states))uw(r,e);return[...e].sort()}function uw(t,e){let r=["coder","agent","consolidator"],n=["reviewers","researchers"];for(let s of r){let o=t[s],i=dw(o);i!==null&&e.add(i)}for(let s of n){let o=t[s];if(Array.isArray(o))for(let i of o){let a=dw(i);a!==null&&e.add(a)}}}function dw(t){if(t===null||typeof t!="object")return null;let e=t.alias;return typeof e=="string"&&e.length>0?e:null}var oa=T(()=>{"use strict";En()});function KC({dal:t}){let e=t.listProjects();for(let r of e){let s=t.query("SELECT * FROM job WHERE project_id = ? AND source = ? ORDER BY id DESC LIMIT 1",r.id,ia)[0]??null;if(s!==null&&(s.status==="queued"||s.status==="running"))continue;let i=(s?.payload?JSON.parse(s.payload):null)?.max_run_id??null,{count:a,maxRunId:l}=VC(t,r,i);if(a<20)continue;let c=i??"initial",u=`${Ms}:${r.id}:${c}`;t.enqueueJob({project_id:r.id,source:ia,source_ref:Ms,payload:JSON.stringify({kind:Ms,project_id:r.id,completed_sessions:a,max_run_id:l,since_run_id:i}),dedupe_key:u})}}function VC(t,e,r){let n=t.query(`SELECT COUNT(*) AS cnt, MAX(r.id) AS max_id
1870
+ `}function hw(t,e){let r=XC(e),n=GC(e);if(r===null||n===null)return{file:t,workflow_name:e.name,status:"FAIL",first_step_id:r,first_step_type:n,first_step_disposition:null,note:"entry step missing after validation"};let s=JC(e.inputs);return s.length>0?{file:t,workflow_name:e.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:t,workflow_name:e.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 JC(t){return(t??[]).filter(e=>e.required===!0&&e.default===void 0).map(e=>e.name)}function XC(t){return ad(t)?t.entry_step_id:t.start_at}function GC(t){return ad(t)?t.steps.find(e=>e.id===t.entry_step_id)?.type??null:t.states[t.start_at]?.type??null}function ad(t){return t.definition_schema_version===3}function _w(t){return t instanceof Xt?t.issues.map(e=>`${e.path}: ${e.message}`).join("; "):t instanceof SyntaxError?`JSON parse failed: ${t.message}`:t instanceof Error?t.message:String(t)}function gw(t){let e=new Set;if(ad(t))for(let r of t.steps){let n=r.members??{};uw(n,e)}else for(let r of Object.values(t.states))uw(r,e);return[...e].sort()}function uw(t,e){let r=["coder","agent","consolidator"],n=["reviewers","researchers"];for(let s of r){let o=t[s],i=dw(o);i!==null&&e.add(i)}for(let s of n){let o=t[s];if(Array.isArray(o))for(let i of o){let a=dw(i);a!==null&&e.add(a)}}}function dw(t){if(t===null||typeof t!="object")return null;let e=t.alias;return typeof e=="string"&&e.length>0?e:null}var oa=T(()=>{"use strict";En()});function KC({dal:t}){let e=t.listProjects();for(let r of e){let s=t.query("SELECT * FROM job WHERE project_id = ? AND source = ? ORDER BY id DESC LIMIT 1",r.id,ia)[0]??null;if(s!==null&&(s.status==="queued"||s.status==="running"))continue;let i=(s?.payload?JSON.parse(s.payload):null)?.max_run_id??null,{count:a,maxRunId:l}=VC(t,r,i);if(a<20)continue;let c=i??"initial",u=`${Ds}:${r.id}:${c}`;t.enqueueJob({project_id:r.id,source:ia,source_ref:Ds,payload:JSON.stringify({kind:Ds,project_id:r.id,completed_sessions:a,max_run_id:l,since_run_id:i}),dedupe_key:u})}}function VC(t,e,r){let n=t.query(`SELECT COUNT(*) AS cnt, MAX(r.id) AS max_id
1871
1871
  FROM run r
1872
1872
  JOIN job j ON j.id = r.job_id
1873
1873
  WHERE j.project_id = ?
1874
1874
  AND r.terminal_state IS NOT NULL
1875
- ${r!==null?"AND r.id > ?":""}`,...r!==null?[e.id,r]:[e.id]);return{count:n[0]?.cnt??0,maxRunId:n[0]?.max_id??0}}function yw(t){for(let e of YC)try{e(t)}catch{}}var ia,Ms,YC,ld=T(()=>{"use strict";ia="memory_policy",Ms="memory_consolidation_request";YC=[KC]});var kw={};ae(kw,{getOrInsertConsolidationWorkflow:()=>Ew,runJobById:()=>Ds,runOnce:()=>Dr,startWorker:()=>tM});import{createHash as zC}from"node:crypto";import{readFileSync as ZC}from"node:fs";import{pathToFileURL as QC}from"node:url";function Ew(t,e="durable-memory-consolidation-v2"){let r=t.getWorkflowByName(e);if(r!==null)return r;try{yi({swallow:!0});let n=wi(e);if(n===null)return null;let s=ZC(n,"utf8"),o=Me(s);return t.insertWorkflow({name:e,version:o.version,definition_schema_version:o.definition_schema_version,definition:s,source_uri:QC(n).href,source_sha256:zC("sha256").update(s).digest("hex")})}catch{return null}}async function Dr(t){let e=Date.now(),r=null;try{return r=t.dal.claimNextJobWithConcurrency({worker_id:t.worker_id,lease_ms:t.lease_ms??ww,evaluator:n=>bw(t.dal,n)}),r===null?null:await Tw(t.dal,r,e)}catch(n){if(r!==null)return gr(t.dal,r,"worker_run_failed",Mr(n),e);try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:aa(Mr(n))})})}catch{}return null}finally{t.max_concurrent}}async function Ds(t){let e=Date.now(),r=null;try{let n=t.dal.claimJobByIdWithConcurrency({job_id:t.job_id,worker_id:t.worker_id,lease_ms:t.lease_ms??ww,evaluator:s=>bw(t.dal,s)});return n.claimed?(r=n.job,{claimed:!0,...await Tw(t.dal,r,e)}):n}catch(n){if(r!==null)return{claimed:!0,...gr(t.dal,r,"worker_run_failed",Mr(n),e)};try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:aa(Mr(n)),job_id:t.job_id})})}catch{}return{claimed:!1,reason:"not_claimable",job_id:t.job_id}}finally{t.max_concurrent}}async function Tw(t,e,r){let n=t.getProjectByJob(e.id);if(n===null)return gr(t,e,"worker_project_missing","project_not_found",r);let s=e.source===ia&&e.source_ref===Ms,o=e.run_id===null?null:t.getRun(e.run_id),i;if(o!==null?i=t.getWorkflow(o.workflow_id):s?i=Ew(t):i=Sw(t,e,n),i===null)return gr(t,e,"worker_workflow_missing","workflow_not_found",r,n);let a=t.getTeam(o?.team_id??n.team_id),l=a===null?[]:t.listTeamMembers(a.id);if(a===null||l.length===0)return gr(t,e,"worker_team_missing","team_not_found",r,n);let c;try{c=Me(i.definition)}catch(d){return gr(t,e,"worker_workflow_invalid",Mr(d),r,n)}let u=rM(c,l);if(u.length>0)return gr(t,e,"worker_team_missing_aliases",`missing_aliases:${u.join(",")}`,r,n,a);try{let d=await nw({dal:t,job:e,workflow:c,team:a,members:l,workflowRow:i});return t.setJobRun(e.id,d.run_id),d.paused===!0?{job_id:e.id,run_id:d.run_id,status:"paused",terminal_state:null,ms:Date.now()-r}:(t.releaseJob(e.id,"done",null),{job_id:e.id,run_id:d.run_id,status:"done",terminal_state:d.terminal_state,ms:Date.now()-r})}catch(d){return gr(t,e,"worker_run_failed",Mr(d),r,n,a)}}function bw(t,e){let r=t.getProjectByJob(e.id);if(r===null)return{concurrency_key:e.concurrency_key_resolved,concurrent_limit:1};let n=Sw(t,e,r);if(n===null)return{concurrency_key:e.concurrency_key_resolved,concurrent_limit:1};let s=null;try{s=Me(n.definition)}catch{s=null}return Fi({workflow:s,job:e,project:r})}function Sw(t,e,r){return e.workflow_id_override!==null?t.getWorkflow(e.workflow_id_override):t.getWorkflowByName(r.workflow_name)}async function tM(t){let e=!1,r=null,n=Promise.resolve(),s=async()=>{if(!e){try{let o;do o=await Dr(t);while(!e&&o!==null)}catch(o){try{t.dal.raiseAttention({kind:"worker_loop_error",severity:"error",payload:JSON.stringify({error:aa(Mr(o))})})}catch{}}e||(r=setTimeout(()=>{n=s()},t.poll_interval_ms??eM))}};return n=s(),{stop:async()=>{e=!0,r!==null&&clearTimeout(r),await n.catch(()=>{})}}}function gr(t,e,r,n,s,o,i){let a=aa(n);return t.releaseJob(e.id,"failed",a),t.raiseAttention({kind:r,severity:"error",project_id:o?.id??e.project_id,payload:JSON.stringify({job_id:e.id,team_id:i?.id??null,error:a})}),{job_id:e.id,run_id:null,status:"failed",terminal_state:null,ms:Date.now()-s}}function Mr(t){return t instanceof Error?t.message:String(t)}function aa(t){return t.length>4096?t.slice(0,4096):t}function rM(t,e){let r=gw(t);if(r.length===0)return[];let n=new Set(e.map(s=>s.alias));return r.filter(s=>!n.has(s))}var ww,eM,Ps=T(()=>{"use strict";Ei();cw();En();oa();$u();ld();ww=6e5,eM=5e3});import{existsSync as nM,readFileSync as sM}from"node:fs";import{marked as oM}from"marked";function xw(t,e){t.get("/layman",r=>r.html(je("Layman Home",iM(e.dal)))),t.get("/api/layman",r=>r.json(jw(e.dal))),t.get("/layman/start/:workflow",r=>{let n=Nw(r);return n===null?r.notFound():r.html(je(`Start ${In(n)}`,cM(e.dal,n)))}),t.post("/layman/start/:workflow",async r=>{let n=Nw(r);return n===null?r.notFound():n==="newspaper"?vw(r,e.dal):uM(r,e.dal,n)}),t.get("/layman/run/:id",r=>{let n=Rr(e.dal,la(r,"id"));return n===null?r.notFound():r.html(je(`Run ${n.id}`,mM(e.dal,n)))}),t.get("/api/layman/run/:id",r=>{let n=Rr(e.dal,la(r,"id"));return n===null?r.notFound():r.json(kM(e.dal,n))}),t.post("/layman/run/:id/respond",async r=>hM(r,e.dal)),t.get("/layman/newspaper",r=>r.html(je("Newspaper Subscriptions",bM(e.dal)))),t.post("/layman/newspaper",r=>vw(r,e.dal)),t.delete("/layman/newspaper/:id",r=>Iw(r,e.dal)),t.post("/layman/newspaper/:id/delete",r=>Iw(r,e.dal))}function iM(t){let e=jw(t);return`<section class="layman-home">
1875
+ ${r!==null?"AND r.id > ?":""}`,...r!==null?[e.id,r]:[e.id]);return{count:n[0]?.cnt??0,maxRunId:n[0]?.max_id??0}}function yw(t){for(let e of YC)try{e(t)}catch{}}var ia,Ds,YC,ld=T(()=>{"use strict";ia="memory_policy",Ds="memory_consolidation_request";YC=[KC]});var kw={};le(kw,{getOrInsertConsolidationWorkflow:()=>Ew,runJobById:()=>Ps,runOnce:()=>Dr,startWorker:()=>tM});import{createHash as zC}from"node:crypto";import{readFileSync as ZC}from"node:fs";import{pathToFileURL as QC}from"node:url";function Ew(t,e="durable-memory-consolidation-v2"){let r=t.getWorkflowByName(e);if(r!==null)return r;try{yi({swallow:!0});let n=wi(e);if(n===null)return null;let s=ZC(n,"utf8"),o=Me(s);return t.insertWorkflow({name:e,version:o.version,definition_schema_version:o.definition_schema_version,definition:s,source_uri:QC(n).href,source_sha256:zC("sha256").update(s).digest("hex")})}catch{return null}}async function Dr(t){let e=Date.now(),r=null;try{return r=t.dal.claimNextJobWithConcurrency({worker_id:t.worker_id,lease_ms:t.lease_ms??ww,evaluator:n=>bw(t.dal,n)}),r===null?null:await Tw(t.dal,r,e)}catch(n){if(r!==null)return gr(t.dal,r,"worker_run_failed",Mr(n),e);try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:aa(Mr(n))})})}catch{}return null}finally{t.max_concurrent}}async function Ps(t){let e=Date.now(),r=null;try{let n=t.dal.claimJobByIdWithConcurrency({job_id:t.job_id,worker_id:t.worker_id,lease_ms:t.lease_ms??ww,evaluator:s=>bw(t.dal,s)});return n.claimed?(r=n.job,{claimed:!0,...await Tw(t.dal,r,e)}):n}catch(n){if(r!==null)return{claimed:!0,...gr(t.dal,r,"worker_run_failed",Mr(n),e)};try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:aa(Mr(n)),job_id:t.job_id})})}catch{}return{claimed:!1,reason:"not_claimable",job_id:t.job_id}}finally{t.max_concurrent}}async function Tw(t,e,r){let n=t.getProjectByJob(e.id);if(n===null)return gr(t,e,"worker_project_missing","project_not_found",r);let s=e.source===ia&&e.source_ref===Ds,o=e.run_id===null?null:t.getRun(e.run_id),i;if(o!==null?i=t.getWorkflow(o.workflow_id):s?i=Ew(t):i=Sw(t,e,n),i===null)return gr(t,e,"worker_workflow_missing","workflow_not_found",r,n);let a=t.getTeam(o?.team_id??n.team_id),l=a===null?[]:t.listTeamMembers(a.id);if(a===null||l.length===0)return gr(t,e,"worker_team_missing","team_not_found",r,n);let c;try{c=Me(i.definition)}catch(d){return gr(t,e,"worker_workflow_invalid",Mr(d),r,n)}let u=rM(c,l);if(u.length>0)return gr(t,e,"worker_team_missing_aliases",`missing_aliases:${u.join(",")}`,r,n,a);try{let d=await nw({dal:t,job:e,workflow:c,team:a,members:l,workflowRow:i});return t.setJobRun(e.id,d.run_id),d.paused===!0?{job_id:e.id,run_id:d.run_id,status:"paused",terminal_state:null,ms:Date.now()-r}:(t.releaseJob(e.id,"done",null),{job_id:e.id,run_id:d.run_id,status:"done",terminal_state:d.terminal_state,ms:Date.now()-r})}catch(d){return gr(t,e,"worker_run_failed",Mr(d),r,n,a)}}function bw(t,e){let r=t.getProjectByJob(e.id);if(r===null)return{concurrency_key:e.concurrency_key_resolved,concurrent_limit:1};let n=Sw(t,e,r);if(n===null)return{concurrency_key:e.concurrency_key_resolved,concurrent_limit:1};let s=null;try{s=Me(n.definition)}catch{s=null}return Fi({workflow:s,job:e,project:r})}function Sw(t,e,r){return e.workflow_id_override!==null?t.getWorkflow(e.workflow_id_override):t.getWorkflowByName(r.workflow_name)}async function tM(t){let e=!1,r=null,n=Promise.resolve(),s=async()=>{if(!e){try{let o;do o=await Dr(t);while(!e&&o!==null)}catch(o){try{t.dal.raiseAttention({kind:"worker_loop_error",severity:"error",payload:JSON.stringify({error:aa(Mr(o))})})}catch{}}e||(r=setTimeout(()=>{n=s()},t.poll_interval_ms??eM))}};return n=s(),{stop:async()=>{e=!0,r!==null&&clearTimeout(r),await n.catch(()=>{})}}}function gr(t,e,r,n,s,o,i){let a=aa(n);return t.releaseJob(e.id,"failed",a),t.raiseAttention({kind:r,severity:"error",project_id:o?.id??e.project_id,payload:JSON.stringify({job_id:e.id,team_id:i?.id??null,error:a})}),{job_id:e.id,run_id:null,status:"failed",terminal_state:null,ms:Date.now()-s}}function Mr(t){return t instanceof Error?t.message:String(t)}function aa(t){return t.length>4096?t.slice(0,4096):t}function rM(t,e){let r=gw(t);if(r.length===0)return[];let n=new Set(e.map(s=>s.alias));return r.filter(s=>!n.has(s))}var ww,eM,Fs=T(()=>{"use strict";Ei();cw();En();oa();$u();ld();ww=6e5,eM=5e3});import{existsSync as nM,readFileSync as sM}from"node:fs";import{marked as oM}from"marked";function xw(t,e){t.get("/layman",r=>r.html(Le("Layman Home",iM(e.dal)))),t.get("/api/layman",r=>r.json(Lw(e.dal))),t.get("/layman/start/:workflow",r=>{let n=Nw(r);return n===null?r.notFound():r.html(Le(`Start ${In(n)}`,cM(e.dal,n)))}),t.post("/layman/start/:workflow",async r=>{let n=Nw(r);return n===null?r.notFound():n==="newspaper"?vw(r,e.dal):uM(r,e.dal,n)}),t.get("/layman/run/:id",r=>{let n=Rr(e.dal,la(r,"id"));return n===null?r.notFound():r.html(Le(`Run ${n.id}`,mM(e.dal,n)))}),t.get("/api/layman/run/:id",r=>{let n=Rr(e.dal,la(r,"id"));return n===null?r.notFound():r.json(kM(e.dal,n))}),t.post("/layman/run/:id/respond",async r=>hM(r,e.dal)),t.get("/layman/newspaper",r=>r.html(Le("Newspaper Subscriptions",bM(e.dal)))),t.post("/layman/newspaper",r=>vw(r,e.dal)),t.delete("/layman/newspaper/:id",r=>Iw(r,e.dal)),t.post("/layman/newspaper/:id/delete",r=>Iw(r,e.dal))}function iM(t){let e=Lw(t);return`<section class="layman-home">
1876
1876
  <h1>Welcome</h1>
1877
1877
  <p class="muted">Choose a workflow and answer a few plain-language prompts.</p>
1878
1878
  <div class="grid">${ca.map(aM).join("")}</div>
@@ -1900,7 +1900,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
1900
1900
  <label>Slug<input name="slug" placeholder="my-document" required></label>
1901
1901
  <label>Output directory<input name="output_dir" value="drafts"></label>
1902
1902
  <button type="submit">Start Document Wizard</button>
1903
- </form>`:$w(n,"/layman/start/newspaper")}function Aw(t){return`<label>Project<select name="project_id" required>${t.map(e=>`<option value="${k(e.id)}">${k(e.name)}</option>`).join("")}</select></label>`}async function uM(t,e,r){let n=await t.req.parseBody(),s=Cw(e,n);if(s===null)return t.html(je("Start workflow",'<p class="error">Choose a valid project.</p>'),400);let o=e.getWorkflowByName(r);if(o===null)return t.html(je("Start workflow",`<p class="error">${k(In(r))} is not loaded.</p>`),400);let i=r==="info-qa"?dM(n):fM(n);if(typeof i=="string")return t.html(je("Start workflow",`<p class="error">${k(i)}</p>`),400);let a=e.enqueueJob({project_id:s.id,workflow_id_override:o.id,source:"layman",source_ref:r,dedupe_key:`layman:${r}:${Date.now()}:${Math.random()}`,payload:JSON.stringify(i)}),l=await Dr({dal:e,worker_id:`layman-start-${Date.now()}`}),c=e.getJob(a.id),u=l?.job_id===a.id?l.run_id:c?.run_id??null;return u===null?t.redirect("/layman?queued=1",302):t.redirect(`/layman/run/${u}`,302)}function dM(t){let e=Ye(t.question).trim();if(e.length===0)return"Enter a question.";let r=Ye(t.output_path).trim();return{question:e,...r.length>0?{output_path:r}:{}}}function fM(t){let e=Ye(t.task_description).trim(),r=$M(Ye(t.slug).trim()),n=Ye(t.output_dir).trim()||"drafts";return e.length===0?"Describe the document you want.":r.length===0?"Enter a document slug.":{task_description:e,slug:r,output_dir:n}}function mM(t,e){let r=e.workflow?.name??"unknown",n=`<h1>${k(In(r))}</h1>
1903
+ </form>`:$w(n,"/layman/start/newspaper")}function Aw(t){return`<label>Project<select name="project_id" required>${t.map(e=>`<option value="${k(e.id)}">${k(e.name)}</option>`).join("")}</select></label>`}async function uM(t,e,r){let n=await t.req.parseBody(),s=Cw(e,n);if(s===null)return t.html(Le("Start workflow",'<p class="error">Choose a valid project.</p>'),400);let o=e.getWorkflowByName(r);if(o===null)return t.html(Le("Start workflow",`<p class="error">${k(In(r))} is not loaded.</p>`),400);let i=r==="info-qa"?dM(n):fM(n);if(typeof i=="string")return t.html(Le("Start workflow",`<p class="error">${k(i)}</p>`),400);let a=e.enqueueJob({project_id:s.id,workflow_id_override:o.id,source:"layman",source_ref:r,dedupe_key:`layman:${r}:${Date.now()}:${Math.random()}`,payload:JSON.stringify(i)}),l=await Dr({dal:e,worker_id:`layman-start-${Date.now()}`}),c=e.getJob(a.id),u=l?.job_id===a.id?l.run_id:c?.run_id??null;return u===null?t.redirect("/layman?queued=1",302):t.redirect(`/layman/run/${u}`,302)}function dM(t){let e=Ye(t.question).trim();if(e.length===0)return"Enter a question.";let r=Ye(t.output_path).trim();return{question:e,...r.length>0?{output_path:r}:{}}}function fM(t){let e=Ye(t.task_description).trim(),r=$M(Ye(t.slug).trim()),n=Ye(t.output_dir).trim()||"drafts";return e.length===0?"Describe the document you want.":r.length===0?"Enter a document slug.":{task_description:e,slug:r,output_dir:n}}function mM(t,e){let r=e.workflow?.name??"unknown",n=`<h1>${k(In(r))}</h1>
1904
1904
  <p><a href="/layman">Layman home</a></p>`;if(e.terminal_state!==null)return`${n}${gM(t,e,r)}`;let s=Ow(t,e);return s!==null&&s.status==="waiting_operator"?`${n}${pM(e,s)}`:`${n}<section hx-get="/layman/run/${k(e.id)}" hx-trigger="every 2s" hx-swap="outerHTML">
1905
1905
  <h2>Running</h2>
1906
1906
  <p class="muted">Current stage: <strong>${k(e.current_state??"starting")}</strong></p>
@@ -1916,7 +1916,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
1916
1916
  <button type="submit" name="done" value="false">Send response</button>
1917
1917
  <button type="submit" name="done" value="true">Done with this stage</button>
1918
1918
  </form>
1919
- </section>`}async function hM(t,e){let r=la(t,"id"),n=await t.req.parseBody(),s=Number(Ye(n.step_id)),o=Ye(n.input),i=Ye(n.done)==="true";if(!Number.isInteger(s))return t.html(je("Interactive response",'<p class="error">Missing interactive step.</p>'),400);let a=e.resumeInteractive(s,o,i);return a.resumed?(_M(e,a.run.id),await Dr({dal:e,worker_id:`layman-respond-${Date.now()}`}),t.redirect(`/layman/run/${r}`,302)):t.html(je("Interactive response",`<p class="error">Could not submit response: ${k(a.reason)}</p>`),400)}function _M(t,e){let r=t.getRun(e);if(r===null||r.current_state===null)return;let n=t.getWorkflow(r.workflow_id);if(n!==null)try{let s=JSON.parse(n.definition);if(!ud(s)||s.definition_schema_version!==3||!Array.isArray(s.steps))return;let o=s.steps.find(i=>ud(i)&&i.name===r.current_state&&typeof i.id=="string");ud(o)&&typeof o.id=="string"&&t.setRunCurrentState(r.id,o.id)}catch{return}}function gM(t,e,r){let n=xM(e.terminal_state);return`<section class="metric terminal-run">
1919
+ </section>`}async function hM(t,e){let r=la(t,"id"),n=await t.req.parseBody(),s=Number(Ye(n.step_id)),o=Ye(n.input),i=Ye(n.done)==="true";if(!Number.isInteger(s))return t.html(Le("Interactive response",'<p class="error">Missing interactive step.</p>'),400);let a=e.resumeInteractive(s,o,i);return a.resumed?(_M(e,a.run.id),await Dr({dal:e,worker_id:`layman-respond-${Date.now()}`}),t.redirect(`/layman/run/${r}`,302)):t.html(Le("Interactive response",`<p class="error">Could not submit response: ${k(a.reason)}</p>`),400)}function _M(t,e){let r=t.getRun(e);if(r===null||r.current_state===null)return;let n=t.getWorkflow(r.workflow_id);if(n!==null)try{let s=JSON.parse(n.definition);if(!ud(s)||s.definition_schema_version!==3||!Array.isArray(s.steps))return;let o=s.steps.find(i=>ud(i)&&i.name===r.current_state&&typeof i.id=="string");ud(o)&&typeof o.id=="string"&&t.setRunCurrentState(r.id,o.id)}catch{return}}function gM(t,e,r){let n=xM(e.terminal_state);return`<section class="metric terminal-run">
1920
1920
  <h2>${n?"Complete":"Stopped"}</h2>
1921
1921
  <p>Status: <strong>${k(e.terminal_state)}</strong></p>
1922
1922
  ${n?yM(t,e,r):EM(e)}
@@ -1926,7 +1926,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
1926
1926
  <pre>${k(RM(AM(o??"No preview available."),30))}</pre>
1927
1927
  <h3>Downloads</h3>
1928
1928
  ${i.length>0?`<ul>${i}</ul>`:'<p class="muted">No rendered files found yet.</p>'}`}function EM(t){let e=[...t.steps].reverse().find(r=>r.status_detail!==null);return`<p class="error">${k(e?.status_detail??"The workflow did not complete successfully.")}</p>`}function fd(t,e){for(let r of[...t.steps].reverse())for(let n of e){let s=[...r.artifacts].reverse().find(o=>o.kind===n&&o.content!==null);if(s?.content!==null&&s?.content!==void 0)return s.content}return null}function cd(t,e){for(let r of[...t].reverse())if(e.includes(r.kind)&&r.path!==null)return r.path;return null}function TM(t){if(t===null||!nM(t)||!t.endsWith(".md"))return null;try{return sM(t,"utf8")}catch{return null}}function bM(t){let e=t.listProjects();return`<h1>Newspaper Subscriptions</h1>
1929
- ${SM(Lw(t))}
1929
+ ${SM(jw(t))}
1930
1930
  <h2>Add Subscription</h2>
1931
1931
  ${e.length===0?'<p class="error">Create a project before subscribing.</p>':$w(e,"/layman/newspaper")}`}function $w(t,e){return`<form method="post" action="${k(e)}">
1932
1932
  ${Aw(t)}
@@ -1939,31 +1939,31 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
1939
1939
  <label>Custom cron<input name="cron" placeholder="0 6 * * *"></label>
1940
1940
  <label>Output directory<input name="output_dir" value="digests"></label>
1941
1941
  <button type="submit">Create subscription</button>
1942
- </form>`}async function vw(t,e){let r=await t.req.parseBody(),n=Cw(e,r);if(n===null)return t.html(je("Newspaper",'<p class="error">Choose a valid project.</p>'),400);let s=e.getWorkflowByName("newspaper");if(s===null)return t.html(je("Newspaper",'<p class="error">The newspaper workflow is not loaded.</p>'),400);let o=Ye(r.topics).split(/[\n,]/).map(a=>a.trim()).filter(a=>a.length>0);if(o.length===0)return t.html(je("Newspaper",'<p class="error">Enter at least one topic.</p>'),400);let i={topics:o,output_dir:Ye(r.output_dir).trim()||"digests",schedule:IM(r)};return e.insertProjectWorkflow({project_id:n.id,workflow_id:s.id,condition:null,parameters_override:JSON.stringify(i),priority:100,enabled:!0}),t.redirect("/layman/newspaper?created=1",302)}function Iw(t,e){let r=la(t,"id");return e.removeProjectWorkflow(r)?t.redirect("/layman/newspaper?removed=1",302):t.notFound()}function SM(t){return pe(["id","project","topics","status","action"],t.map(e=>{let r=jM(e.parameters_override),n=Array.isArray(r.topics)?r.topics.join(", "):"";return[k(e.id),k(e.project_name),k(n),e.enabled===1?"enabled":"disabled",`<form method="post" action="/layman/newspaper/${e.id}/delete"><button type="submit">Remove</button></form>`]}))}function jw(t){let e=Lw(t);return{workflows:ca,recent_runs:vM(t),newspaper_subscriptions:e.length}}function kM(t,e){let r=Ow(t,e);return{id:e.id,workflow:e.workflow?.name??null,current_state:e.current_state,terminal_state:e.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:e.steps.map(n=>({id:n.id,state_name:n.state_name,outcome:n.outcome,status_detail:n.status_detail}))}}function vM(t){return t.query(`SELECT r.*, w.name AS workflow_name
1942
+ </form>`}async function vw(t,e){let r=await t.req.parseBody(),n=Cw(e,r);if(n===null)return t.html(Le("Newspaper",'<p class="error">Choose a valid project.</p>'),400);let s=e.getWorkflowByName("newspaper");if(s===null)return t.html(Le("Newspaper",'<p class="error">The newspaper workflow is not loaded.</p>'),400);let o=Ye(r.topics).split(/[\n,]/).map(a=>a.trim()).filter(a=>a.length>0);if(o.length===0)return t.html(Le("Newspaper",'<p class="error">Enter at least one topic.</p>'),400);let i={topics:o,output_dir:Ye(r.output_dir).trim()||"digests",schedule:IM(r)};return e.insertProjectWorkflow({project_id:n.id,workflow_id:s.id,condition:null,parameters_override:JSON.stringify(i),priority:100,enabled:!0}),t.redirect("/layman/newspaper?created=1",302)}function Iw(t,e){let r=la(t,"id");return e.removeProjectWorkflow(r)?t.redirect("/layman/newspaper?removed=1",302):t.notFound()}function SM(t){return pe(["id","project","topics","status","action"],t.map(e=>{let r=LM(e.parameters_override),n=Array.isArray(r.topics)?r.topics.join(", "):"";return[k(e.id),k(e.project_name),k(n),e.enabled===1?"enabled":"disabled",`<form method="post" action="/layman/newspaper/${e.id}/delete"><button type="submit">Remove</button></form>`]}))}function Lw(t){let e=jw(t);return{workflows:ca,recent_runs:vM(t),newspaper_subscriptions:e.length}}function kM(t,e){let r=Ow(t,e);return{id:e.id,workflow:e.workflow?.name??null,current_state:e.current_state,terminal_state:e.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:e.steps.map(n=>({id:n.id,state_name:n.state_name,outcome:n.outcome,status_detail:n.status_detail}))}}function vM(t){return t.query(`SELECT r.*, w.name AS workflow_name
1943
1943
  FROM run r
1944
1944
  JOIN workflow w ON w.id = r.workflow_id
1945
1945
  WHERE w.name IN (${dd.map(()=>"?").join(",")})
1946
1946
  ORDER BY r.id DESC
1947
- LIMIT 10`,...dd)}function Lw(t){return t.query(`SELECT pw.*, p.name AS project_name
1947
+ LIMIT 10`,...dd)}function jw(t){return t.query(`SELECT pw.*, p.name AS project_name
1948
1948
  FROM project_workflow pw
1949
1949
  JOIN workflow w ON w.id = pw.workflow_id
1950
1950
  JOIN project p ON p.id = pw.project_id
1951
1951
  WHERE w.name = ?
1952
1952
  ORDER BY pw.id DESC`,"newspaper")}function Ow(t,e){for(let r of[...e.steps].reverse()){let n=t.getInteractiveSessionByStepId(r.id);if(n!==null)return n}return null}function Cw(t,e){let r=Number(Ye(e.project_id));return Number.isInteger(r)?t.getProject(r):null}function IM(t){let e=Ye(t.schedule)||"daily";return e==="weekly"?{preset:e,cron:"0 6 * * 1"}:e==="custom"?{preset:e,cron:Ye(t.cron).trim()||"0 6 * * *"}:{preset:"daily",cron:"0 6 * * *"}}function Nw(t){let e=t.req.param("workflow");return dd.includes(e)?e:null}function In(t){return ca.find(e=>e.name===t)?.title??t}function NM(t){return t.split(/[_:-]/).filter(Boolean).map(e=>`${e[0]?.toUpperCase()??""}${e.slice(1)}`).join(" ")}function md(t){return oM.parse(t,{async:!1})}function xM(t){return t==="done"||t==="pr_ready"||t==="merged"}function AM(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}function RM(t,e){return t.split(`
1953
1953
  `).slice(0,e).join(`
1954
- `)}function $M(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function Ye(t){return typeof t=="string"?t:""}function jM(t){if(t===null)return{};try{let e=JSON.parse(t);if(e!==null&&typeof e=="object"&&!Array.isArray(e))return e}catch{return{}}return{}}function ud(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function la(t,e){return Number(t.req.param(e))}var ca,dd,Mw=T(()=>{"use strict";Ps();Bt();Ju();ca=[{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."}],dd=ca.map(t=>t.name)});function OM(t){return t.replace(/^\/+/,"")}function Dw(t){return typeof t=="string"&&t!==""&&!t.includes("/")&&!t.includes("\\")}function Nn(t){if(t.mailboxKey!==void 0&&t.mailboxKey!==null&&t.mailboxKey!==""){let e=OM(t.mailboxKey),r=e.lastIndexOf("/");return(r>=0?e.slice(r+1):e).includes(".")&&(e=r>=0?e.slice(0,r+1):""),e!==""&&!e.endsWith("/")&&(e+="/"),e}return Dw(t.userId)&&Dw(t.deviceId)?`${t.userId}/${t.deviceId}/`:`${LM}/${t.identityId}/`}function MM(t){return String(Math.max(0,Math.floor(t))).padStart(CM,"0")}function pd(t,e,r){return`${t}${e}${MM(r)}.json`}function ua(t,e){return`${t}${e}`}function da(t,e,r){let n=`${e}${r}`;if(!t.startsWith(n))return;let s=t.slice(n.length).match(/^(\d+)\.json$/);if(s===null)return;let o=Number(s[1]);return Number.isSafeInteger(o)?o:void 0}var LM,CM,fa=T(()=>{"use strict";LM="mailbox";CM=12});function Vt(t,e){let r=Math.floor(t),n="",s=r;for(let u=0;u<12;u++)n=ma[s&15]+n,s=Math.floor(s/16);let o=Math.floor(e()*4096)&4095,i="",a=o;for(let u=0;u<3;u++)i=ma[a&15]+i,a=a>>4;let l=ma[8|Math.floor(e()*4)&3],c="";for(let u=0;u<15;u++)c+=ma[Math.floor(e()*16)&15];return n.slice(0,8)+"-"+n.slice(8,12)+"-7"+i+"-"+l+c.slice(0,3)+"-"+c.slice(3,15)}var ma,pa=T(()=>{"use strict";ma="0123456789abcdef"});function _d(t,e){return!Number.isFinite(t)||t<=0?e:t}function gd(t){if(t===null||typeof t!="object")return!1;let e=t;return e.name==="NoSuchKey"||e.name==="NotFound"||e.Code==="NoSuchKey"||e.code==="NoSuchKey"||e.$metadata!==void 0&&e.$metadata.httpStatusCode===404}function Bw(t){return t.conversation_id===Ww&&FM(t.payload)}function FM(t){return typeof t=="object"&&t!==null&&t.kind==="heartbeat"}function UM(t){let e=typeof t.hb=="string"&&t.hb!==""?t.hb:Bw(t)?t.timestamp:void 0;if(e===void 0)return;let r=Date.parse(e);return Number.isFinite(r)?r:void 0}var Pw,Fw,Uw,DM,Ww,PM,hd,Pr,ha=T(()=>{"use strict";fa();pa();Pw=3e3,Fw=1e4,Uw=12e3,DM=1e3,Ww="__lmctl_heartbeat__",PM={kind:"heartbeat"},hd={setTimeout:(t,e)=>setTimeout(t,e),clearTimeout:t=>clearTimeout(t)},Pr=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(e){this.opts=e,this.basePrefix=Nn({identityId:e.identityId,userId:e.userId,deviceId:e.deviceId,mailboxKey:e.mailboxKey}),this.ownStream=e.selfRole==="agent"?"local":"web",this.peerStream=e.selfRole==="agent"?"web":"local",this.cursor=e.cursor,this.readIntervalMs=_d(e.readIntervalMs??e.pollIntervalMs??Pw,Pw),this.heartbeatIdleMs=_d(e.heartbeatIdleMs??Fw,Fw),this.backoffReadIntervalMs=_d(e.backoffReadIntervalMs??e.pollIntervalMs??Uw,Uw)}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 e=this.opts.timers??hd;if(this.timerHandle!==null&&(e.clearTimeout(this.timerHandle),this.timerHandle=null),this.heartbeatTimerHandle!==null&&(e.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(e){return this.putEnvelope(e.conversation_id,e.payload)}getCursor(){return this.cursor}getMailboxBasePrefix(){return this.basePrefix}setPollIntervalMs(e){if(!Number.isFinite(e)||e<=0)throw new Error(`SequentialMailboxClient.setPollIntervalMs: invalid ms=${e}`);this.readIntervalMs=e}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 e=await this.maxSeq(this.ownStream);this.ownSeq=e,this.cursor===void 0&&(this.cursor=await this.maxSeq(this.peerStream)),this.bootstrapped=!0}catch(e){throw this.bootstrapPromise=null,this.emitError(e,"list"),e}}async maxSeq(e){let r=ua(this.basePrefix,e),n=0,s;do{let o=await this.opts.s3.send(new this.opts.commands.ListObjectsV2Command({Bucket:this.opts.bucket,Prefix:r,MaxKeys:DM,...s!==void 0&&{ContinuationToken:s}}));this.opts.onS3Op?.("list");for(let i of o.Contents??[]){let a=da(i.Key??"",this.basePrefix,e);a!==void 0&&a>n&&(n=a)}s=o.IsTruncated===!0?o.NextContinuationToken:void 0}while(s!==void 0);return n}async putEnvelope(e,r){let n=this.writeChain.then(()=>this.doPut(e,r));return this.writeChain=n.catch(()=>{}),n}async doPut(e,r){await this.ensureBootstrapped();let n=(this.opts.now??Date.now)(),s=new Date(n).toISOString(),o={message_id:Vt(n,this.opts.random??Math.random),from:this.opts.selfRole,timestamp:s,hb:s,conversation_id:e,payload:r},i=(this.ownSeq??0)+1,a=pd(this.basePrefix,this.ownStream,i);return await this.opts.s3.send(new this.opts.commands.PutObjectCommand({Bucket:this.opts.bucket,Key:a,Body:JSON.stringify(o),ContentType:"application/json"})),this.opts.onS3Op?.("put"),this.ownSeq=i,this.recordWrite(n),a}scheduleNextTick(e){if(this.stopRequested)return;let r=this.opts.timers??hd;this.timerHandle=r.setTimeout(()=>{this.timerHandle=null,this.runTick()},e)}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 e=(this.cursor??0)+1,r=pd(this.basePrefix,this.peerStream,e),n;try{let o=await this.opts.s3.send(new this.opts.commands.GetObjectCommand({Bucket:this.opts.bucket,Key:r}));if(this.opts.onS3Op?.("get"),o.Body===void 0){this.emitError(new Error(`GetObject ${r}: empty body`),"get"),this.advanceCursor(e);continue}n=await o.Body.transformToString("utf-8")}catch(o){if(gd(o)){this.opts.onS3Op?.("get");return}this.emitError(o,"get");return}let s;try{s=JSON.parse(n)}catch(o){this.emitError(o,"get"),this.advanceCursor(e);continue}if(this.recordPeerHeartbeat(s),Bw(s)){this.advanceCursor(e);continue}try{await this.opts.onMessage(s)}catch(o){this.emitError(o,"handle");return}this.advanceCursor(e)}}advanceCursor(e){this.cursor=e,this.notifyCursorAdvance(e)}nextReadDelayMs(){return this.peerIsOn((this.opts.now??Date.now)())?this.readIntervalMs:this.backoffReadIntervalMs}peerIsOn(e){return this.lastPeerHeartbeatMs!==void 0&&e-this.lastPeerHeartbeatMs<=this.heartbeatIdleMs}recordPeerHeartbeat(e){let r=UM(e);r!==void 0&&(this.lastPeerHeartbeatMs=r)}recordWrite(e){this.lastWriteMs=e,this.scheduleHeartbeatCheck(this.heartbeatIdleMs)}scheduleHeartbeatCheck(e){if(this.stopRequested)return;let r=this.opts.timers??hd;this.heartbeatTimerHandle!==null&&r.clearTimeout(this.heartbeatTimerHandle),this.heartbeatTimerHandle=r.setTimeout(()=>{this.heartbeatTimerHandle=null,this.maybeWriteHeartbeat()},e)}async maybeWriteHeartbeat(){if(this.stopRequested)return;let e=(this.opts.now??Date.now)();if(this.lastWriteMs!==void 0){let r=e-this.lastWriteMs;if(r<this.heartbeatIdleMs){this.scheduleHeartbeatCheck(this.heartbeatIdleMs-r);return}}await this.writeHeartbeat()}async writeHeartbeat(){try{await this.putEnvelope(Ww,PM)}catch(e){this.emitError(e,"put"),this.scheduleHeartbeatCheck(this.heartbeatIdleMs)}}notifyCursorAdvance(e){if(this.opts.onCursorAdvance!==void 0)try{this.opts.onCursorAdvance(e)}catch(r){this.emitError(r,"handle")}}emitError(e,r){if(this.opts.onError!==void 0)try{this.opts.onError(e,r)}catch{}else console.error(`SequentialMailboxClient[${r}]`,e)}}});import{getConnInfo as WM}from"@hono/node-server/conninfo";function Hw(t,e){let r=e.bucket??BM,n=e.remoteAddressOf??(o=>qM(o)),s=o=>{let i=n(o);return JM(i)?null:o.json({error:"forbidden",message:"local-mailbox is loopback-only"},403)};t.get("/local-mailbox/object",async o=>{let i=s(o);if(i!==null)return i;let a=yd(o.req.query("key"));if(typeof a!="string")return o.json({error:"bad_request",message:a.error},400);try{let l=await e.s3.send(new e.commands.GetObjectCommand({Bucket:r,Key:a}));if(l.Body===void 0)return o.json({error:"empty_body"},404);let c=await l.Body.transformToString("utf-8");return o.body(c,200,{"Content-Type":"application/octet-stream"})}catch(l){return gd(l)?o.json({error:"not_found"},404):o.json({error:"internal",message:wd(l)},500)}}),t.put("/local-mailbox/object",async o=>{let i=s(o);if(i!==null)return i;let a=yd(o.req.query("key"));if(typeof a!="string")return o.json({error:"bad_request",message:a.error},400);let l=new Uint8Array(await o.req.arrayBuffer());try{return await e.s3.send(new e.commands.PutObjectCommand({Bucket:r,Key:a,Body:l})),o.json({ok:!0})}catch(c){return o.json({error:"internal",message:wd(c)},500)}}),t.get("/local-mailbox/list",async o=>{let i=s(o);if(i!==null)return i;let a=o.req.query("prefix")??"",l=yd(a,{allowEmpty:!0});if(typeof l!="string")return o.json({error:"bad_request",message:l.error},400);let c=HM(o.req.query("maxKeys")),u=o.req.query("token");try{let d=await e.s3.send(new e.commands.ListObjectsV2Command({Bucket:r,Prefix:l,...c!==void 0?{MaxKeys:c}:{},...u!==void 0&&u!==""?{ContinuationToken:u}:{}}));return o.json({Contents:(d.Contents??[]).map(f=>({Key:f.Key,LastModified:f.LastModified instanceof Date?f.LastModified.toISOString():f.LastModified})),IsTruncated:d.IsTruncated??!1,...d.NextContinuationToken!==void 0?{NextContinuationToken:d.NextContinuationToken}:{}})}catch(d){return o.json({error:"internal",message:wd(d)},500)}})}function yd(t,e={}){if(t===void 0||t==="")return e.allowEmpty===!0?"":{error:"key required"};let r=t.replace(/^\/+/,"");return r.split("/").includes("..")?{error:"key must not contain '..'"}:r}function HM(t){if(t===void 0||t==="")return;let e=Number(t);return Number.isInteger(e)&&e>0?e:void 0}function qM(t){try{return WM(t).remote.address}catch{return}}function JM(t){return t===void 0||t===""?!1:!!(t==="127.0.0.1"||t==="::1"||t.startsWith("::ffff:127.")||t.startsWith("127."))}function wd(t){return t instanceof Error?t.message:String(t)}var BM,qw=T(()=>{"use strict";ha();BM="local"});function Jw(t,e){t.get("/mailbox/workspace",r=>KM(r,e)),t.get("/mailbox/projects",r=>VM(r,e)),t.get("/mailbox/projects/:id",r=>YM(r,e)),t.post("/mailbox/projects",r=>zM(r,e)),t.patch("/mailbox/projects/:id",r=>ZM(r,e)),t.delete("/mailbox/projects/:id",r=>QM(r,e)),t.post("/mailbox/projects/:project_id/prompts",r=>eD(r,e)),t.get("/mailbox/prompts/:id",r=>tD(r,e))}function KM(t,e){e.dal.ensureWorkspace({id:An,name:Ed});let r=Xw(e.dal),n={id:An,name:Ed,created_at:GM,projects:r};return t.json({workspace:n})}function VM(t,e){return t.json({projects:Xw(e.dal)})}function YM(t,e){let r=t.req.param("id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"project id required"},400);if(r.startsWith(xn)){let s=Td(e.dal,r);return s===null||s.deleted_at!==null?t.json({project:null},404):t.json({project:ya(s)})}let n=Kw(e.dal,r);return n===null?t.json({project:null},404):t.json({project:Gw(n)})}async function zM(t,e){let r;try{r=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let n=r.input;if(n===void 0||typeof n!="object")return t.json({error:"bad_request",message:"input is required"},400);if(typeof n.name!="string"||n.name==="")return t.json({error:"bad_request",message:"input.name is required"},400);if(typeof n.repo_path!="string"||n.repo_path==="")return t.json({error:"bad_request",message:"input.repo_path is required"},400);e.dal.ensureWorkspace({id:An,name:Ed});let s=e.dal.insertWebProject({workspace_id:An,name:n.name,repo_path:n.repo_path,config_json:n.config_json===void 0?null:JSON.stringify(n.config_json)});return t.json({project:ya(s)},201)}async function ZM(t,e){let r=t.req.param("id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"project id required"},400);let n;try{n=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.input??{};if(r.startsWith(xn)){let o=Td(e.dal,r);if(o===null||o.deleted_at!==null)return t.json({error:"project_not_found",message:`project not found: ${r}`},404);let i=e.dal.updateWebProject({id:o.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 i===null?t.json({error:"project_not_found",message:`project not found: ${r}`},404):t.json({project:ya(i)})}return t.json({error:"project_not_found",message:`project not found: ${r}`},404)}function QM(t,e){let r=t.req.param("id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"project id required"},400);if(r.startsWith(xn)){let n=Td(e.dal,r);if(n===null)return t.json({deleted:!1});let s=e.dal.softDeleteWebProject(n.id);return t.json({deleted:s})}return t.json({deleted:!1})}async function eD(t,e){let r=t.req.param("project_id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"project_id required in path"},400);let n;try{n=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.input;if(s===void 0||typeof s!="object")return t.json({error:"bad_request",message:"input is required"},400);let o=s.project_id??r;if(typeof s.text!="string"||s.text==="")return t.json({error:"bad_request",message:"input.text is required"},400);let i=Kw(e.dal,o);if(i===null)return t.json({error:"project_not_found",message:`project not found: ${o}`},404);if(e.dal.getWorkflowByName(i.workflow_name)===null)return t.json({error:"workflow_not_registered",message:`project ${i.name} has no registered workflow "${i.workflow_name}"`},400);let l=`${XM}${crypto.randomUUID()}`,c={text:s.text,context_json:s.context_json??null},u;e.enqueueProjectJob!==void 0?u=e.enqueueProjectJob({dal:e.dal,project_id:i.id,source_ref:l,payload:c}):u=await rD({dal:e.dal,project_id:i.id,source_ref:l,payload:c}),e.dal.insertPromptDispatch({prompt_id:l,project_id:i.id,job_id:u.id,text:s.text,context_json:s.context_json===void 0?null:JSON.stringify(s.context_json)});let d={id:l,project_id:`${ga}${i.id}`,text:s.text,status:"pending",created_at:new Date().toISOString(),completed_at:null};return t.json({prompt:d},201)}function tD(t,e){let r=t.req.param("id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"prompt id required"},400);let n=nD(e.dal,r);return t.json({result:n})}function Xw(t){let e=t.listProjects().map(Gw),r=t.listWebProjectsActive(An).map(ya);return[...e,...r].sort(mD)}function Gw(t){return{id:`${ga}${t.id}`,workspace_id:An,name:t.name,repo_path:t.local_path,config_json:{workflow_name:t.workflow_name,team_id:t.team_id,durable_memory_mode:t.durable_memory_mode},last_active_at:null,created_at:t.created_at}}function ya(t){let e={};if(t.config_json!==null)try{let r=JSON.parse(t.config_json);r!==null&&typeof r=="object"&&(e=r)}catch{}return t.linked_v4_project_id!==null&&(e={...e,linked_v4_project_id:t.linked_v4_project_id}),{id:`${xn}${t.id}`,workspace_id:t.workspace_id,name:t.name,repo_path:t.repo_path,config_json:e,last_active_at:t.last_active_at,created_at:t.created_at}}function Td(t,e){if(!e.startsWith(xn))return null;let r=e.slice(xn.length),n=Number.parseInt(r,10);return!Number.isFinite(n)||String(n)!==r?null:t.getWebProject(n)}function Kw(t,e){if(e.startsWith(ga)){let n=e.slice(ga.length),s=Number.parseInt(n,10);if(Number.isFinite(s)&&String(s)===n)return t.getProject(s)}let r=Number.parseInt(e,10);return Number.isFinite(r)&&String(r)===e?t.getProject(r):null}async function rD(t){let{enqueueManual:e}=await Promise.resolve().then(()=>(Lu(),Tg));return{id:e(t.dal,{project_id:t.project_id,source_ref:t.source_ref,payload:t.payload}).id}}function nD(t,e){let r=t.getPromptDispatch(e);if(r===null)return{prompt_id:e,data:{status:"unknown"},errors_json:{error:"prompt_not_found"},duration_ms:null};let n=t.getJob(r.job_id);if(n===null)return{prompt_id:e,data:null,errors_json:{error:"job_missing",job_id:r.job_id},duration_ms:null};let s=n.run_id===null?null:t.getRun(n.run_id),o=t.getProject(r.project_id),i=uD(t,o?.team_id??null),a=cD(s),l=dD(n,a,i.length>0),c=fD(r.created_at,s),u=o===null?{totalEstimatedMs:void 0,perStep:new Map}:sD(t,o.workflow_name),d=u.totalEstimatedMs,f=Vw(r.created_at),m=o?.workflow_name,p=u.perStep.size>0?u.perStep.size:void 0,h=s===null?[]:oD(t,s.id),g=iD(s,a,h,u.perStep,i),_=aD(h,u.perStep),S=lD(g,_,d,f,m,p);return l==="error"?{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,..._a(d,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&&t.setPromptDispatchCompleted(e),{prompt_id:e,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,..._a(d,f),...S},errors_json:null,duration_ms:c}):l==="paused"?{prompt_id:e,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:i,..._a(d,f),...S},errors_json:null,duration_ms:c}:{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,attempt_count:n.attempt_count,..._a(d,f),...S},errors_json:null,duration_ms:c}}function sD(t,e){let r={totalEstimatedMs:void 0,perStep:new Map},n=t.getWorkflowByName(e);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 o=s,i=typeof o.estimated_duration_ms=="number"&&Number.isFinite(o.estimated_duration_ms)&&o.estimated_duration_ms>=0?o.estimated_duration_ms:void 0,a=new Map;if(Array.isArray(o.steps))for(let l of o.steps){if(l===null||typeof l!="object")continue;let c=l;if(typeof c.id!="string"||c.id.length===0)continue;let u=typeof c.name=="string"&&c.name.length>0?c.name:c.id,d=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,d===void 0?{name:u}:{name:u,estimated_duration_ms:d})}if(o.steps===void 0&&o.states!==null&&typeof o.states=="object")for(let[l,c]of Object.entries(o.states)){if(c===null||typeof c!="object")continue;let u=c,d=typeof u.estimated_duration_ms=="number"&&Number.isFinite(u.estimated_duration_ms)&&u.estimated_duration_ms>=0?u.estimated_duration_ms:void 0;a.set(l,d===void 0?{name:l}:{name:l,estimated_duration_ms:d})}return{totalEstimatedMs:i,perStep:a}}function oD(t,e){try{return t.listStepsForRun(e)}catch{return[]}}function iD(t,e,r,n,s){if(t===null||t.terminal_state!==null)return;let o=e!==null?e:t.current_state;if(o===null||o.length===0)return;let a=[...r].reverse().find(f=>f.state_name===o&&f.ended_at===null)?.started_at??t.paused_at??t.started_at,l=n.get(o),c=l?.name??o,u=Vw(a),d={id:o,name:c,started_at:a,elapsed_ms:u};return l?.estimated_duration_ms!==void 0&&(d.estimated_duration_ms=l.estimated_duration_ms),s.length>0&&(d.attention_needed=s),d}function aD(t,e){let r=[];for(let n of t){if(n.ended_at===null)continue;let s=Date.parse(n.started_at),o=Date.parse(n.ended_at),i=Number.isFinite(s)&&Number.isFinite(o)?Math.max(0,o-s):0,a=e.get(n.state_name)?.name??n.state_name,l=n.outcome==="failed"?"failed":"done";r.push({id:n.state_name,name:a,duration_ms:i,status:l})}return r}function lD(t,e,r,n,s,o){let i={completed_steps:e,total_elapsed_ms:n};return t!==void 0&&(i.current_step=t),r!==void 0&&(i.total_estimated_ms=r),s!==void 0&&s.length>0&&(i.workflow_name=s),o!==void 0&&(i.total_steps=o),i}function Vw(t){let e=Date.parse(t);return Number.isNaN(e)?0:Math.max(0,Date.now()-e)}function _a(t,e){return t===void 0?{elapsed_ms:e}:{elapsed_ms:e,estimated_duration_ms:t}}function cD(t){if(t===null)return null;let e=t.current_state;if(e===null)return null;let r="__paused__:";return e.startsWith(r)?e.slice(r.length):null}function uD(t,e){if(e===null)return[];let r;try{r=t.listTeamMembers(e)}catch{return[]}return r.filter(n=>n.state==="attention_needed").map(n=>({alias:n.alias,reason:n.state_reason}))}function dD(t,e,r){return t.status==="queued"?"pending":t.status==="done"?"done":t.status==="failed"?"error":e!==null||r||t.status==="paused"?"paused":t.status==="running"?"running":"error"}function fD(t,e){let r=Date.parse(t);if(Number.isNaN(r))return null;let n=e?.ended_at??null,s=n===null?Date.now():Date.parse(n);return Number.isNaN(s)?null:Math.max(0,s-r)}function mD(t,e){let r=Date.parse(t.last_active_at??""),n=Date.parse(e.last_active_at??""),s=(Number.isNaN(n)?0:n)-(Number.isNaN(r)?0:r);return s===0?t.name.localeCompare(e.name):s}var ga,xn,XM,An,Ed,GM,Yw=T(()=>{"use strict";ga="project:",xn="web_project:",XM="prompt:",An="default",Ed="Default workspace",GM=new Date(0).toISOString()});import{Buffer as zw}from"node:buffer";function Zw(t,e,r){if(typeof t=="number"&&Number.isFinite(t)&&t>0)return t;if(e!==void 0&&e!==""){let n=Number(e);if(Number.isFinite(n)&&n>0)return n}return r}function Qw(t){return _D[t]}function eE(t){let e=t.trim();if(e==="")return;let r=e.split(/\s+/),n=r.shift();if(!(n===void 0||n===""))return{cmd:n,args:r}}var pD,hD,wa,_D,bd=T(()=>{"use strict";pD=1e4,hD=256*1024,wa=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=Zw(e.pushWindowMs,process.env.LMCTL_TERMINAL_PUSH_WINDOW_MS,pD),this.pushByteCap=Zw(e.pushByteCap,process.env.LMCTL_TERMINAL_PUSH_BYTE_CAP,hD),this.timers=e.timers??{setTimeout:(r,n)=>globalThis.setTimeout(r,n),clearTimeout:r=>globalThis.clearTimeout(r)}}startSession(e){if(this.sessions.has(e.session_id))throw new Error(`terminal_session_already_exists: ${e.session_id}`);let r=this.opts.pty.spawn(e.command,e.args,{name:"xterm-256color",cols:e.cols??120,rows:e.rows??30,cwd:e.cwd??process.cwd(),env:e.env??process.env}),n={session_id:e.session_id,pty:r,pendingOutput:[],pendingBytes:0,pushTimer:void 0,closed:!1};return this.sessions.set(e.session_id,n),r.onData(s=>{this.onPtyData(n,s)}),r.onExit(s=>{this.onPtyExit(n,s)}),this.opts.log?.(`[dt-2] terminal session ${e.session_id} started pid=${r.pid} cmd=${e.command}`),{pid:r.pid}}endSession(e){let r=this.sessions.get(e);if(r!==void 0)try{r.pty.kill()}catch{}}onInbound(e){if(e.direction!=="user_to_agent")return;let r=this.sessions.get(e.session_id);if(r===void 0){this.opts.log?.(`[dt-2] inbound terminal data for unknown session ${e.session_id}; dropping`);return}if(r.closed){this.opts.log?.(`[dt-2] inbound terminal data for closed session ${e.session_id}; dropping`);return}try{r.pty.write(e.data)}catch(n){this.opts.log?.(`[dt-2] pty.write failed for session ${e.session_id}: ${n instanceof Error?n.message:String(n)}`)}}setPublish(e){this.opts={...this.opts,publish:e}}listSessions(){return Array.from(this.sessions.values()).map(e=>({session_id:e.session_id,pid:e.pty.pid}))}pendingBytesFor(e){return this.sessions.get(e)?.pendingBytes}async stop(){for(let e of Array.from(this.sessions.values()))try{e.pty.kill()}catch{}for(let e of Array.from(this.sessions.values()))e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0)}onPtyData(e,r){if(!e.closed){if(e.pendingOutput.push(r),e.pendingBytes+=zw.byteLength(r,"utf8"),e.pendingBytes>=this.pushByteCap){this.flush(e,"byte_cap");return}e.pushTimer===void 0&&(e.pushTimer=this.timers.setTimeout(()=>{this.flush(e,"window_idle")},this.pushWindowMs))}}async flush(e,r){if(e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0),e.pendingOutput.length===0)return;let n=e.pendingOutput.join("");e.pendingOutput=[],e.pendingBytes=0;let s={kind:"terminal",session_id:e.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=${e.session_id} reason=${r} bytes=${zw.byteLength(n,"utf8")}`)}catch(o){this.opts.log?.(`[dt-2] publish failed session=${e.session_id} reason=${r}: ${o instanceof Error?o.message:String(o)}`)}}async onPtyExit(e,r){if(e.closed)return;await this.flush(e,"pty_exit");let n=`\r
1954
+ `)}function $M(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function Ye(t){return typeof t=="string"?t:""}function LM(t){if(t===null)return{};try{let e=JSON.parse(t);if(e!==null&&typeof e=="object"&&!Array.isArray(e))return e}catch{return{}}return{}}function ud(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function la(t,e){return Number(t.req.param(e))}var ca,dd,Mw=T(()=>{"use strict";Fs();Bt();Ju();ca=[{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."}],dd=ca.map(t=>t.name)});function OM(t){return t.replace(/^\/+/,"")}function Dw(t){return typeof t=="string"&&t!==""&&!t.includes("/")&&!t.includes("\\")}function Nn(t){if(t.mailboxKey!==void 0&&t.mailboxKey!==null&&t.mailboxKey!==""){let e=OM(t.mailboxKey),r=e.lastIndexOf("/");return(r>=0?e.slice(r+1):e).includes(".")&&(e=r>=0?e.slice(0,r+1):""),e!==""&&!e.endsWith("/")&&(e+="/"),e}return Dw(t.userId)&&Dw(t.deviceId)?`${t.userId}/${t.deviceId}/`:`${jM}/${t.identityId}/`}function MM(t){return String(Math.max(0,Math.floor(t))).padStart(CM,"0")}function pd(t,e,r){return`${t}${e}${MM(r)}.json`}function ua(t,e){return`${t}${e}`}function da(t,e,r){let n=`${e}${r}`;if(!t.startsWith(n))return;let s=t.slice(n.length).match(/^(\d+)\.json$/);if(s===null)return;let o=Number(s[1]);return Number.isSafeInteger(o)?o:void 0}var jM,CM,fa=T(()=>{"use strict";jM="mailbox";CM=12});function Vt(t,e){let r=Math.floor(t),n="",s=r;for(let u=0;u<12;u++)n=ma[s&15]+n,s=Math.floor(s/16);let o=Math.floor(e()*4096)&4095,i="",a=o;for(let u=0;u<3;u++)i=ma[a&15]+i,a=a>>4;let l=ma[8|Math.floor(e()*4)&3],c="";for(let u=0;u<15;u++)c+=ma[Math.floor(e()*16)&15];return n.slice(0,8)+"-"+n.slice(8,12)+"-7"+i+"-"+l+c.slice(0,3)+"-"+c.slice(3,15)}var ma,pa=T(()=>{"use strict";ma="0123456789abcdef"});function _d(t,e){return!Number.isFinite(t)||t<=0?e:t}function gd(t){if(t===null||typeof t!="object")return!1;let e=t;return e.name==="NoSuchKey"||e.name==="NotFound"||e.Code==="NoSuchKey"||e.code==="NoSuchKey"||e.$metadata!==void 0&&e.$metadata.httpStatusCode===404}function Bw(t){return t.conversation_id===Ww&&FM(t.payload)}function FM(t){return typeof t=="object"&&t!==null&&t.kind==="heartbeat"}function UM(t){let e=typeof t.hb=="string"&&t.hb!==""?t.hb:Bw(t)?t.timestamp:void 0;if(e===void 0)return;let r=Date.parse(e);return Number.isFinite(r)?r:void 0}var Pw,Fw,Uw,DM,Ww,PM,hd,Pr,ha=T(()=>{"use strict";fa();pa();Pw=3e3,Fw=1e4,Uw=12e3,DM=1e3,Ww="__lmctl_heartbeat__",PM={kind:"heartbeat"},hd={setTimeout:(t,e)=>setTimeout(t,e),clearTimeout:t=>clearTimeout(t)},Pr=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(e){this.opts=e,this.basePrefix=Nn({identityId:e.identityId,userId:e.userId,deviceId:e.deviceId,mailboxKey:e.mailboxKey}),this.ownStream=e.selfRole==="agent"?"local":"web",this.peerStream=e.selfRole==="agent"?"web":"local",this.cursor=e.cursor,this.readIntervalMs=_d(e.readIntervalMs??e.pollIntervalMs??Pw,Pw),this.heartbeatIdleMs=_d(e.heartbeatIdleMs??Fw,Fw),this.backoffReadIntervalMs=_d(e.backoffReadIntervalMs??e.pollIntervalMs??Uw,Uw)}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 e=this.opts.timers??hd;if(this.timerHandle!==null&&(e.clearTimeout(this.timerHandle),this.timerHandle=null),this.heartbeatTimerHandle!==null&&(e.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(e){return this.putEnvelope(e.conversation_id,e.payload)}getCursor(){return this.cursor}getMailboxBasePrefix(){return this.basePrefix}setPollIntervalMs(e){if(!Number.isFinite(e)||e<=0)throw new Error(`SequentialMailboxClient.setPollIntervalMs: invalid ms=${e}`);this.readIntervalMs=e}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 e=await this.maxSeq(this.ownStream);this.ownSeq=e,this.cursor===void 0&&(this.cursor=await this.maxSeq(this.peerStream)),this.bootstrapped=!0}catch(e){throw this.bootstrapPromise=null,this.emitError(e,"list"),e}}async maxSeq(e){let r=ua(this.basePrefix,e),n=0,s;do{let o=await this.opts.s3.send(new this.opts.commands.ListObjectsV2Command({Bucket:this.opts.bucket,Prefix:r,MaxKeys:DM,...s!==void 0&&{ContinuationToken:s}}));this.opts.onS3Op?.("list");for(let i of o.Contents??[]){let a=da(i.Key??"",this.basePrefix,e);a!==void 0&&a>n&&(n=a)}s=o.IsTruncated===!0?o.NextContinuationToken:void 0}while(s!==void 0);return n}async putEnvelope(e,r){let n=this.writeChain.then(()=>this.doPut(e,r));return this.writeChain=n.catch(()=>{}),n}async doPut(e,r){await this.ensureBootstrapped();let n=(this.opts.now??Date.now)(),s=new Date(n).toISOString(),o={message_id:Vt(n,this.opts.random??Math.random),from:this.opts.selfRole,timestamp:s,hb:s,conversation_id:e,payload:r},i=(this.ownSeq??0)+1,a=pd(this.basePrefix,this.ownStream,i);return await this.opts.s3.send(new this.opts.commands.PutObjectCommand({Bucket:this.opts.bucket,Key:a,Body:JSON.stringify(o),ContentType:"application/json"})),this.opts.onS3Op?.("put"),this.ownSeq=i,this.recordWrite(n),a}scheduleNextTick(e){if(this.stopRequested)return;let r=this.opts.timers??hd;this.timerHandle=r.setTimeout(()=>{this.timerHandle=null,this.runTick()},e)}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 e=(this.cursor??0)+1,r=pd(this.basePrefix,this.peerStream,e),n;try{let o=await this.opts.s3.send(new this.opts.commands.GetObjectCommand({Bucket:this.opts.bucket,Key:r}));if(this.opts.onS3Op?.("get"),o.Body===void 0){this.emitError(new Error(`GetObject ${r}: empty body`),"get"),this.advanceCursor(e);continue}n=await o.Body.transformToString("utf-8")}catch(o){if(gd(o)){this.opts.onS3Op?.("get");return}this.emitError(o,"get");return}let s;try{s=JSON.parse(n)}catch(o){this.emitError(o,"get"),this.advanceCursor(e);continue}if(this.recordPeerHeartbeat(s),Bw(s)){this.advanceCursor(e);continue}try{await this.opts.onMessage(s)}catch(o){this.emitError(o,"handle");return}this.advanceCursor(e)}}advanceCursor(e){this.cursor=e,this.notifyCursorAdvance(e)}nextReadDelayMs(){return this.peerIsOn((this.opts.now??Date.now)())?this.readIntervalMs:this.backoffReadIntervalMs}peerIsOn(e){return this.lastPeerHeartbeatMs!==void 0&&e-this.lastPeerHeartbeatMs<=this.heartbeatIdleMs}recordPeerHeartbeat(e){let r=UM(e);r!==void 0&&(this.lastPeerHeartbeatMs=r)}recordWrite(e){this.lastWriteMs=e,this.scheduleHeartbeatCheck(this.heartbeatIdleMs)}scheduleHeartbeatCheck(e){if(this.stopRequested)return;let r=this.opts.timers??hd;this.heartbeatTimerHandle!==null&&r.clearTimeout(this.heartbeatTimerHandle),this.heartbeatTimerHandle=r.setTimeout(()=>{this.heartbeatTimerHandle=null,this.maybeWriteHeartbeat()},e)}async maybeWriteHeartbeat(){if(this.stopRequested)return;let e=(this.opts.now??Date.now)();if(this.lastWriteMs!==void 0){let r=e-this.lastWriteMs;if(r<this.heartbeatIdleMs){this.scheduleHeartbeatCheck(this.heartbeatIdleMs-r);return}}await this.writeHeartbeat()}async writeHeartbeat(){try{await this.putEnvelope(Ww,PM)}catch(e){this.emitError(e,"put"),this.scheduleHeartbeatCheck(this.heartbeatIdleMs)}}notifyCursorAdvance(e){if(this.opts.onCursorAdvance!==void 0)try{this.opts.onCursorAdvance(e)}catch(r){this.emitError(r,"handle")}}emitError(e,r){if(this.opts.onError!==void 0)try{this.opts.onError(e,r)}catch{}else console.error(`SequentialMailboxClient[${r}]`,e)}}});import{getConnInfo as WM}from"@hono/node-server/conninfo";function Hw(t,e){let r=e.bucket??BM,n=e.remoteAddressOf??(o=>qM(o)),s=o=>{let i=n(o);return JM(i)?null:o.json({error:"forbidden",message:"local-mailbox is loopback-only"},403)};t.get("/local-mailbox/object",async o=>{let i=s(o);if(i!==null)return i;let a=yd(o.req.query("key"));if(typeof a!="string")return o.json({error:"bad_request",message:a.error},400);try{let l=await e.s3.send(new e.commands.GetObjectCommand({Bucket:r,Key:a}));if(l.Body===void 0)return o.json({error:"empty_body"},404);let c=await l.Body.transformToString("utf-8");return o.body(c,200,{"Content-Type":"application/octet-stream"})}catch(l){return gd(l)?o.json({error:"not_found"},404):o.json({error:"internal",message:wd(l)},500)}}),t.put("/local-mailbox/object",async o=>{let i=s(o);if(i!==null)return i;let a=yd(o.req.query("key"));if(typeof a!="string")return o.json({error:"bad_request",message:a.error},400);let l=new Uint8Array(await o.req.arrayBuffer());try{return await e.s3.send(new e.commands.PutObjectCommand({Bucket:r,Key:a,Body:l})),o.json({ok:!0})}catch(c){return o.json({error:"internal",message:wd(c)},500)}}),t.get("/local-mailbox/list",async o=>{let i=s(o);if(i!==null)return i;let a=o.req.query("prefix")??"",l=yd(a,{allowEmpty:!0});if(typeof l!="string")return o.json({error:"bad_request",message:l.error},400);let c=HM(o.req.query("maxKeys")),u=o.req.query("token");try{let d=await e.s3.send(new e.commands.ListObjectsV2Command({Bucket:r,Prefix:l,...c!==void 0?{MaxKeys:c}:{},...u!==void 0&&u!==""?{ContinuationToken:u}:{}}));return o.json({Contents:(d.Contents??[]).map(f=>({Key:f.Key,LastModified:f.LastModified instanceof Date?f.LastModified.toISOString():f.LastModified})),IsTruncated:d.IsTruncated??!1,...d.NextContinuationToken!==void 0?{NextContinuationToken:d.NextContinuationToken}:{}})}catch(d){return o.json({error:"internal",message:wd(d)},500)}})}function yd(t,e={}){if(t===void 0||t==="")return e.allowEmpty===!0?"":{error:"key required"};let r=t.replace(/^\/+/,"");return r.split("/").includes("..")?{error:"key must not contain '..'"}:r}function HM(t){if(t===void 0||t==="")return;let e=Number(t);return Number.isInteger(e)&&e>0?e:void 0}function qM(t){try{return WM(t).remote.address}catch{return}}function JM(t){return t===void 0||t===""?!1:!!(t==="127.0.0.1"||t==="::1"||t.startsWith("::ffff:127.")||t.startsWith("127."))}function wd(t){return t instanceof Error?t.message:String(t)}var BM,qw=T(()=>{"use strict";ha();BM="local"});function Jw(t,e){t.get("/mailbox/workspace",r=>KM(r,e)),t.get("/mailbox/projects",r=>VM(r,e)),t.get("/mailbox/projects/:id",r=>YM(r,e)),t.post("/mailbox/projects",r=>zM(r,e)),t.patch("/mailbox/projects/:id",r=>ZM(r,e)),t.delete("/mailbox/projects/:id",r=>QM(r,e)),t.post("/mailbox/projects/:project_id/prompts",r=>eD(r,e)),t.get("/mailbox/prompts/:id",r=>tD(r,e))}function KM(t,e){e.dal.ensureWorkspace({id:An,name:Ed});let r=Xw(e.dal),n={id:An,name:Ed,created_at:GM,projects:r};return t.json({workspace:n})}function VM(t,e){return t.json({projects:Xw(e.dal)})}function YM(t,e){let r=t.req.param("id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"project id required"},400);if(r.startsWith(xn)){let s=Td(e.dal,r);return s===null||s.deleted_at!==null?t.json({project:null},404):t.json({project:ya(s)})}let n=Kw(e.dal,r);return n===null?t.json({project:null},404):t.json({project:Gw(n)})}async function zM(t,e){let r;try{r=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let n=r.input;if(n===void 0||typeof n!="object")return t.json({error:"bad_request",message:"input is required"},400);if(typeof n.name!="string"||n.name==="")return t.json({error:"bad_request",message:"input.name is required"},400);if(typeof n.repo_path!="string"||n.repo_path==="")return t.json({error:"bad_request",message:"input.repo_path is required"},400);e.dal.ensureWorkspace({id:An,name:Ed});let s=e.dal.insertWebProject({workspace_id:An,name:n.name,repo_path:n.repo_path,config_json:n.config_json===void 0?null:JSON.stringify(n.config_json)});return t.json({project:ya(s)},201)}async function ZM(t,e){let r=t.req.param("id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"project id required"},400);let n;try{n=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.input??{};if(r.startsWith(xn)){let o=Td(e.dal,r);if(o===null||o.deleted_at!==null)return t.json({error:"project_not_found",message:`project not found: ${r}`},404);let i=e.dal.updateWebProject({id:o.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 i===null?t.json({error:"project_not_found",message:`project not found: ${r}`},404):t.json({project:ya(i)})}return t.json({error:"project_not_found",message:`project not found: ${r}`},404)}function QM(t,e){let r=t.req.param("id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"project id required"},400);if(r.startsWith(xn)){let n=Td(e.dal,r);if(n===null)return t.json({deleted:!1});let s=e.dal.softDeleteWebProject(n.id);return t.json({deleted:s})}return t.json({deleted:!1})}async function eD(t,e){let r=t.req.param("project_id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"project_id required in path"},400);let n;try{n=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.input;if(s===void 0||typeof s!="object")return t.json({error:"bad_request",message:"input is required"},400);let o=s.project_id??r;if(typeof s.text!="string"||s.text==="")return t.json({error:"bad_request",message:"input.text is required"},400);let i=Kw(e.dal,o);if(i===null)return t.json({error:"project_not_found",message:`project not found: ${o}`},404);if(e.dal.getWorkflowByName(i.workflow_name)===null)return t.json({error:"workflow_not_registered",message:`project ${i.name} has no registered workflow "${i.workflow_name}"`},400);let l=`${XM}${crypto.randomUUID()}`,c={text:s.text,context_json:s.context_json??null},u;e.enqueueProjectJob!==void 0?u=e.enqueueProjectJob({dal:e.dal,project_id:i.id,source_ref:l,payload:c}):u=await rD({dal:e.dal,project_id:i.id,source_ref:l,payload:c}),e.dal.insertPromptDispatch({prompt_id:l,project_id:i.id,job_id:u.id,text:s.text,context_json:s.context_json===void 0?null:JSON.stringify(s.context_json)});let d={id:l,project_id:`${ga}${i.id}`,text:s.text,status:"pending",created_at:new Date().toISOString(),completed_at:null};return t.json({prompt:d},201)}function tD(t,e){let r=t.req.param("id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"prompt id required"},400);let n=nD(e.dal,r);return t.json({result:n})}function Xw(t){let e=t.listProjects().map(Gw),r=t.listWebProjectsActive(An).map(ya);return[...e,...r].sort(mD)}function Gw(t){return{id:`${ga}${t.id}`,workspace_id:An,name:t.name,repo_path:t.local_path,config_json:{workflow_name:t.workflow_name,team_id:t.team_id,durable_memory_mode:t.durable_memory_mode},last_active_at:null,created_at:t.created_at}}function ya(t){let e={};if(t.config_json!==null)try{let r=JSON.parse(t.config_json);r!==null&&typeof r=="object"&&(e=r)}catch{}return t.linked_v4_project_id!==null&&(e={...e,linked_v4_project_id:t.linked_v4_project_id}),{id:`${xn}${t.id}`,workspace_id:t.workspace_id,name:t.name,repo_path:t.repo_path,config_json:e,last_active_at:t.last_active_at,created_at:t.created_at}}function Td(t,e){if(!e.startsWith(xn))return null;let r=e.slice(xn.length),n=Number.parseInt(r,10);return!Number.isFinite(n)||String(n)!==r?null:t.getWebProject(n)}function Kw(t,e){if(e.startsWith(ga)){let n=e.slice(ga.length),s=Number.parseInt(n,10);if(Number.isFinite(s)&&String(s)===n)return t.getProject(s)}let r=Number.parseInt(e,10);return Number.isFinite(r)&&String(r)===e?t.getProject(r):null}async function rD(t){let{enqueueManual:e}=await Promise.resolve().then(()=>(ju(),Tg));return{id:e(t.dal,{project_id:t.project_id,source_ref:t.source_ref,payload:t.payload}).id}}function nD(t,e){let r=t.getPromptDispatch(e);if(r===null)return{prompt_id:e,data:{status:"unknown"},errors_json:{error:"prompt_not_found"},duration_ms:null};let n=t.getJob(r.job_id);if(n===null)return{prompt_id:e,data:null,errors_json:{error:"job_missing",job_id:r.job_id},duration_ms:null};let s=n.run_id===null?null:t.getRun(n.run_id),o=t.getProject(r.project_id),i=uD(t,o?.team_id??null),a=cD(s),l=dD(n,a,i.length>0),c=fD(r.created_at,s),u=o===null?{totalEstimatedMs:void 0,perStep:new Map}:sD(t,o.workflow_name),d=u.totalEstimatedMs,f=Vw(r.created_at),m=o?.workflow_name,p=u.perStep.size>0?u.perStep.size:void 0,h=s===null?[]:oD(t,s.id),g=iD(s,a,h,u.perStep,i),_=aD(h,u.perStep),S=lD(g,_,d,f,m,p);return l==="error"?{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,..._a(d,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&&t.setPromptDispatchCompleted(e),{prompt_id:e,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,..._a(d,f),...S},errors_json:null,duration_ms:c}):l==="paused"?{prompt_id:e,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:i,..._a(d,f),...S},errors_json:null,duration_ms:c}:{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,attempt_count:n.attempt_count,..._a(d,f),...S},errors_json:null,duration_ms:c}}function sD(t,e){let r={totalEstimatedMs:void 0,perStep:new Map},n=t.getWorkflowByName(e);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 o=s,i=typeof o.estimated_duration_ms=="number"&&Number.isFinite(o.estimated_duration_ms)&&o.estimated_duration_ms>=0?o.estimated_duration_ms:void 0,a=new Map;if(Array.isArray(o.steps))for(let l of o.steps){if(l===null||typeof l!="object")continue;let c=l;if(typeof c.id!="string"||c.id.length===0)continue;let u=typeof c.name=="string"&&c.name.length>0?c.name:c.id,d=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,d===void 0?{name:u}:{name:u,estimated_duration_ms:d})}if(o.steps===void 0&&o.states!==null&&typeof o.states=="object")for(let[l,c]of Object.entries(o.states)){if(c===null||typeof c!="object")continue;let u=c,d=typeof u.estimated_duration_ms=="number"&&Number.isFinite(u.estimated_duration_ms)&&u.estimated_duration_ms>=0?u.estimated_duration_ms:void 0;a.set(l,d===void 0?{name:l}:{name:l,estimated_duration_ms:d})}return{totalEstimatedMs:i,perStep:a}}function oD(t,e){try{return t.listStepsForRun(e)}catch{return[]}}function iD(t,e,r,n,s){if(t===null||t.terminal_state!==null)return;let o=e!==null?e:t.current_state;if(o===null||o.length===0)return;let a=[...r].reverse().find(f=>f.state_name===o&&f.ended_at===null)?.started_at??t.paused_at??t.started_at,l=n.get(o),c=l?.name??o,u=Vw(a),d={id:o,name:c,started_at:a,elapsed_ms:u};return l?.estimated_duration_ms!==void 0&&(d.estimated_duration_ms=l.estimated_duration_ms),s.length>0&&(d.attention_needed=s),d}function aD(t,e){let r=[];for(let n of t){if(n.ended_at===null)continue;let s=Date.parse(n.started_at),o=Date.parse(n.ended_at),i=Number.isFinite(s)&&Number.isFinite(o)?Math.max(0,o-s):0,a=e.get(n.state_name)?.name??n.state_name,l=n.outcome==="failed"?"failed":"done";r.push({id:n.state_name,name:a,duration_ms:i,status:l})}return r}function lD(t,e,r,n,s,o){let i={completed_steps:e,total_elapsed_ms:n};return t!==void 0&&(i.current_step=t),r!==void 0&&(i.total_estimated_ms=r),s!==void 0&&s.length>0&&(i.workflow_name=s),o!==void 0&&(i.total_steps=o),i}function Vw(t){let e=Date.parse(t);return Number.isNaN(e)?0:Math.max(0,Date.now()-e)}function _a(t,e){return t===void 0?{elapsed_ms:e}:{elapsed_ms:e,estimated_duration_ms:t}}function cD(t){if(t===null)return null;let e=t.current_state;if(e===null)return null;let r="__paused__:";return e.startsWith(r)?e.slice(r.length):null}function uD(t,e){if(e===null)return[];let r;try{r=t.listTeamMembers(e)}catch{return[]}return r.filter(n=>n.state==="attention_needed").map(n=>({alias:n.alias,reason:n.state_reason}))}function dD(t,e,r){return t.status==="queued"?"pending":t.status==="done"?"done":t.status==="failed"?"error":e!==null||r||t.status==="paused"?"paused":t.status==="running"?"running":"error"}function fD(t,e){let r=Date.parse(t);if(Number.isNaN(r))return null;let n=e?.ended_at??null,s=n===null?Date.now():Date.parse(n);return Number.isNaN(s)?null:Math.max(0,s-r)}function mD(t,e){let r=Date.parse(t.last_active_at??""),n=Date.parse(e.last_active_at??""),s=(Number.isNaN(n)?0:n)-(Number.isNaN(r)?0:r);return s===0?t.name.localeCompare(e.name):s}var ga,xn,XM,An,Ed,GM,Yw=T(()=>{"use strict";ga="project:",xn="web_project:",XM="prompt:",An="default",Ed="Default workspace",GM=new Date(0).toISOString()});import{Buffer as zw}from"node:buffer";function Zw(t,e,r){if(typeof t=="number"&&Number.isFinite(t)&&t>0)return t;if(e!==void 0&&e!==""){let n=Number(e);if(Number.isFinite(n)&&n>0)return n}return r}function Qw(t){return _D[t]}function eE(t){let e=t.trim();if(e==="")return;let r=e.split(/\s+/),n=r.shift();if(!(n===void 0||n===""))return{cmd:n,args:r}}var pD,hD,wa,_D,bd=T(()=>{"use strict";pD=1e4,hD=256*1024,wa=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=Zw(e.pushWindowMs,process.env.LMCTL_TERMINAL_PUSH_WINDOW_MS,pD),this.pushByteCap=Zw(e.pushByteCap,process.env.LMCTL_TERMINAL_PUSH_BYTE_CAP,hD),this.timers=e.timers??{setTimeout:(r,n)=>globalThis.setTimeout(r,n),clearTimeout:r=>globalThis.clearTimeout(r)}}startSession(e){if(this.sessions.has(e.session_id))throw new Error(`terminal_session_already_exists: ${e.session_id}`);let r=this.opts.pty.spawn(e.command,e.args,{name:"xterm-256color",cols:e.cols??120,rows:e.rows??30,cwd:e.cwd??process.cwd(),env:e.env??process.env}),n={session_id:e.session_id,pty:r,pendingOutput:[],pendingBytes:0,pushTimer:void 0,closed:!1};return this.sessions.set(e.session_id,n),r.onData(s=>{this.onPtyData(n,s)}),r.onExit(s=>{this.onPtyExit(n,s)}),this.opts.log?.(`[dt-2] terminal session ${e.session_id} started pid=${r.pid} cmd=${e.command}`),{pid:r.pid}}endSession(e){let r=this.sessions.get(e);if(r!==void 0)try{r.pty.kill()}catch{}}onInbound(e){if(e.direction!=="user_to_agent")return;let r=this.sessions.get(e.session_id);if(r===void 0){this.opts.log?.(`[dt-2] inbound terminal data for unknown session ${e.session_id}; dropping`);return}if(r.closed){this.opts.log?.(`[dt-2] inbound terminal data for closed session ${e.session_id}; dropping`);return}try{r.pty.write(e.data)}catch(n){this.opts.log?.(`[dt-2] pty.write failed for session ${e.session_id}: ${n instanceof Error?n.message:String(n)}`)}}setPublish(e){this.opts={...this.opts,publish:e}}listSessions(){return Array.from(this.sessions.values()).map(e=>({session_id:e.session_id,pid:e.pty.pid}))}pendingBytesFor(e){return this.sessions.get(e)?.pendingBytes}async stop(){for(let e of Array.from(this.sessions.values()))try{e.pty.kill()}catch{}for(let e of Array.from(this.sessions.values()))e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0)}onPtyData(e,r){if(!e.closed){if(e.pendingOutput.push(r),e.pendingBytes+=zw.byteLength(r,"utf8"),e.pendingBytes>=this.pushByteCap){this.flush(e,"byte_cap");return}e.pushTimer===void 0&&(e.pushTimer=this.timers.setTimeout(()=>{this.flush(e,"window_idle")},this.pushWindowMs))}}async flush(e,r){if(e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0),e.pendingOutput.length===0)return;let n=e.pendingOutput.join("");e.pendingOutput=[],e.pendingBytes=0;let s={kind:"terminal",session_id:e.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=${e.session_id} reason=${r} bytes=${zw.byteLength(n,"utf8")}`)}catch(o){this.opts.log?.(`[dt-2] publish failed session=${e.session_id} reason=${r}: ${o instanceof Error?o.message:String(o)}`)}}async onPtyExit(e,r){if(e.closed)return;await this.flush(e,"pty_exit");let n=`\r
1955
1955
  [process exited with code ${r.exitCode}${r.signal!==void 0?` signal ${r.signal}`:""}]\r
1956
1956
  `,s={kind:"terminal",session_id:e.session_id,direction:"agent_to_user",data:n,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s)}catch(o){this.opts.log?.(`[dt-2] publish (exit) failed session=${e.session_id}: ${o instanceof Error?o.message:String(o)}`)}e.closed=!0,this.sessions.delete(e.session_id)}};_D={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 rE(t,e){t.post("/mailbox/terminal/launch",r=>gD(r,e)),t.post("/mailbox/terminal/end/:session_id",r=>yD(r,e)),t.get("/mailbox/terminal/sessions",r=>wD(r,e))}async function gD(t,e){let r=e.terminalSessionManager;if(r===void 0)return t.json({error:"terminal_unavailable",message:"terminal session manager not configured (mailbox runtime missing)"},503);let n;try{n=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.session_id;if(typeof s!="string"||!tE.test(s))return t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400);let o=n.provider;if(typeof o!="string"||o==="")return t.json({error:"bad_request",message:"provider is required"},400);let i;if(typeof n.command_line=="string"&&n.command_line.trim()!==""){if(i=eE(n.command_line),i===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=Qw(o);if(a===void 0)return t.json({error:"no_default_for_provider",message:`no TERMINAL_LAUNCH_DEFAULTS entry for provider "${o}"`},400);i={cmd:a.cmd,args:[...a.args]}}try{let{pid:a}=r.startSession({session_id:s,command:i.cmd,args:i.args,...typeof n.cwd=="string"&&n.cwd!==""?{cwd:n.cwd}:{}});return t.json({session_id:s,pid:a,command:i.cmd,args:i.args},201)}catch(a){let l=a instanceof Error?a.message:String(a);return l.startsWith("terminal_session_already_exists")?t.json({error:"session_exists",message:l},409):t.json({error:"spawn_failed",message:l},500)}}function yD(t,e){let r=e.terminalSessionManager;if(r===void 0)return t.json({error:"terminal_unavailable",message:"terminal session manager not configured"},503);let n=t.req.param("session_id");return n===void 0||!tE.test(n)?t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400):(r.endSession(n),t.json({session_id:n,ended:!0}))}function wD(t,e){let r=e.terminalSessionManager;return r===void 0?t.json({sessions:[],note:"terminal session manager not configured"}):t.json({sessions:r.listSessions()})}var tE,nE=T(()=>{"use strict";bd();tE=/^[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 ED}from"node:buffer";function SD(t){try{return ED.byteLength(JSON.stringify(t),"utf8")}catch{return 256}}function sE(t,e,r){if(typeof t=="number"&&Number.isFinite(t)&&t>0)return t;if(e!==void 0&&e!==""){let n=Number(e);if(Number.isFinite(n)&&n>0)return n}return r}function oE(t){return kD[t]}function iE(t){let e=t.trim();if(e==="")return;let r=[],n=0;for(;n<e.length;){let o=e[n];if(o===" "||o===" "){n+=1;continue}if(o==='"'){let a=n+1,l="";for(;a<e.length&&e[a]!=='"';)l+=e[a],a+=1;r.push(l),n=a+1;continue}let i=n;for(;i<e.length&&e[i]!==" "&&e[i]!==" ";)i+=1;r.push(e.slice(n,i)),n=i}if(r.length===0)return;let s=r.shift();if(!(s===void 0||s===""))return{cmd:s,args:r}}var TD,bD,Ea,kD,Sd=T(()=>{"use strict";TD=2e3,bD=64*1024,Ea=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=sE(e.pushWindowMs,process.env.LMCTL_PROVIDER_PUSH_WINDOW_MS,TD),this.pushByteCap=sE(e.pushByteCap,process.env.LMCTL_PROVIDER_PUSH_BYTE_CAP,bD),this.timers=e.timers??{setTimeout:(r,n)=>globalThis.setTimeout(r,n),clearTimeout:r=>globalThis.clearTimeout(r)}}async startSession(e){if(this.sessions.has(e.session_id))throw new Error(`persistent_session_already_exists: ${e.session_id}`);let r=this.opts.adapterFactory(e.provider),n={session_id:e.session_id,provider:e.provider,adapter:r,child:void 0,pendingEvents:[],pendingBytes:0,pushTimer:void 0,generation:1,turnMap:new Map,closed:!1};this.sessions.set(e.session_id,n);let s=this.makeAdapterContext(n);try{let o=await r.start(e,s);return n.child=o,this.wireChildExit(n,o),this.opts.log?.(`[dt-3] persistent session ${e.session_id} started provider=${e.provider} pid=${o.pid??"?"}`),{pid:o.pid}}catch(o){throw this.sessions.delete(e.session_id),o}}async endSession(e){let r=this.sessions.get(e);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(e)}}async onInbound(e){if(e.direction!=="user_to_agent")return;let r=this.sessions.get(e.session_id);if(r===void 0){this.opts.log?.(`[dt-3] inbound provider data for unknown session ${e.session_id}; dropping`);return}if(r.closed){this.opts.log?.(`[dt-3] inbound provider data for closed session ${e.session_id}; dropping`);return}let n=e.user_input??"";if(n!=="")try{await r.adapter.sendTurn(n)}catch(s){let o=s instanceof Error?s.message:String(s);this.opts.log?.(`[dt-3] adapter.sendTurn failed session=${e.session_id}: ${o}`),this.appendEvent(r,{event_type:"error",payload:{message:`sendTurn failed: ${o}`}})}}setPublish(e){this.opts={...this.opts,publish:e}}listSessions(){return Array.from(this.sessions.values()).map(e=>({session_id:e.session_id,provider:e.provider,pid:e.child?.pid}))}pendingEventCountFor(e){return this.sessions.get(e)?.pendingEvents.length}generationFor(e){return this.sessions.get(e)?.generation}_testBumpGeneration(e){let r=this.sessions.get(e);r!==void 0&&(r.generation+=1)}async stop(){for(let e of Array.from(this.sessions.values())){e.generation+=1;try{await e.adapter.stop()}catch{}if(e.child!==void 0)try{e.child.kill("SIGTERM")}catch{}}for(let e of Array.from(this.sessions.values()))e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0)}makeAdapterContext(e){let r=e.generation,n=this;return{generation:r,currentGeneration(){return e.generation},emit(s){r===e.generation&&(e.closed||n.appendEvent(e,s))},...n.opts.log!==void 0?{log:n.opts.log}:{},turnMap:e.turnMap}}appendEvent(e,r){e.pendingEvents.push(r);let n=SD(r);if(e.pendingBytes+=n,e.pendingBytes>=this.pushByteCap){this.flush(e,"byte_cap");return}e.pushTimer===void 0&&(e.pushTimer=this.timers.setTimeout(()=>{this.flush(e,"window_idle")},this.pushWindowMs))}async flush(e,r){if(e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0),e.pendingEvents.length===0)return;let n=e.pendingEvents;e.pendingEvents=[],e.pendingBytes=0;let s={kind:"provider",session_id:e.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=${e.session_id} reason=${r} events=${n.length}`)}catch(o){this.opts.log?.(`[dt-3] publish failed session=${e.session_id} reason=${r}: ${o instanceof Error?o.message:String(o)}`)}}wireChildExit(e,r){let n=e.generation;r.on("exit",(s,o)=>{n===e.generation&&(e.closed||(this.appendEvent(e,{event_type:"error",payload:{message:`provider child exited code=${s??"?"} signal=${o??""}; session ended. Click Reset to start a new chat.`}}),this.flush(e,"child_exit"),e.closed=!0))}),r.on("error",s=>{n===e.generation&&(e.closed||(this.appendEvent(e,{event_type:"error",payload:{message:`provider child error: ${s.message}`}}),this.flush(e,"child_exit")))})}};kD={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 lE(t,e){t.post("/mailbox/chat/launch",r=>vD(r,e)),t.post("/mailbox/chat/end/:session_id",r=>ID(r,e)),t.get("/mailbox/chat/sessions",r=>ND(r,e))}async function vD(t,e){let r=e.persistentSessionManager;if(r===void 0)return t.json({error:"chat_unavailable",message:"persistent session manager not configured (mailbox runtime missing)"},503);let n;try{n=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.session_id;if(typeof s!="string"||!aE.test(s))return t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400);let o=n.provider;if(typeof o!="string"||o==="")return t.json({error:"bad_request",message:"provider is required"},400);let i;if(typeof n.command_line=="string"&&n.command_line.trim()!==""){if(i=iE(n.command_line),i===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=oE(o);if(a===void 0)return t.json({error:"no_default_for_provider",message:`no PERSISTENT_LAUNCH_DEFAULTS entry for provider "${o}"`},400);i={cmd:a.cmd,args:[...a.args]}}try{let{pid:a}=await r.startSession({session_id:s,provider:o,command:i.cmd,args:i.args,...typeof n.cwd=="string"&&n.cwd!==""?{cwd:n.cwd}:{}});return t.json({session_id:s,provider:o,pid:a,command:i.cmd,args:i.args},201)}catch(a){let l=a instanceof Error?a.message:String(a);return l.startsWith("persistent_session_already_exists")?t.json({error:"session_exists",message:l},409):l.startsWith("no_persistent_adapter_for_provider")?t.json({error:"no_adapter",message:l},400):t.json({error:"spawn_failed",message:l},500)}}async function ID(t,e){let r=e.persistentSessionManager;if(r===void 0)return t.json({error:"chat_unavailable",message:"persistent session manager not configured"},503);let n=t.req.param("session_id");return n===void 0||!aE.test(n)?t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400):(await r.endSession(n),t.json({session_id:n,ended:!0}))}function ND(t,e){let r=e.persistentSessionManager;return r===void 0?t.json({sessions:[],note:"persistent session manager not configured"}):t.json({sessions:r.listSessions()})}var aE,cE=T(()=>{"use strict";Sd();aE=/^[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 xD}from"node:fs";function dE(t){let e=t.artifacts.find(r=>r.kind===`${t.state_name}_transcript`);if(e?.content!==void 0&&e.content!==null)return uE(e.content);if(e?.path===void 0||e.path===null)return[];try{let r=xD(e.path,{encoding:"utf8"});return uE(r)}catch{return[]}}function uE(t){let e=t.split(/\r?\n/).filter(r=>r.trim().length>0);return e.length===0?[]:e.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 fE=T(()=>{"use strict"});function mE(t,e,r){let n=t.getRun(e);if(n===null)return{err:`run ${e}: not found`};if(r!==void 0){let l=t.findTeamMemberByAlias(n.team_id,r);return l===null?{err:`run ${e}: team has no member alias "${r}"`}:l.sessionid===null||l.sessionid.length===0?{err:`run ${e}: 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=t.latestAgentCall(e);if(s!==null){let l=t.findTeamMemberByAlias(n.team_id,s.alias);return l===null?{err:`run ${e}: 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 ${e}: 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 i=t.listTeamMembers(n.team_id).filter(l=>l.state!=="retired"&&l.sessionid!==null&&l.sessionid.length>0);if(i.length===0)return{err:`run ${e}: cannot resolve an agent session (no agent_call yet, no seeded member)`};if(i.length>1){let l=i.map(c=>c.alias).join(", ");return{err:`run ${e}: cannot resolve an agent session (no agent_call yet; team has multiple members [${l}] \u2014 pass --alias)`}}let a=i[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 Ta(t,e){let r=t.query(`SELECT id, kind FROM attention
1957
1957
  WHERE run_id = ?
1958
1958
  AND acknowledged_at IS NULL
1959
1959
  AND requires_user = 1
1960
- ORDER BY id DESC LIMIT 1`,e);return r.length===0?null:{kind:r[0].kind,attention_id:r[0].id}}var ba=T(()=>{"use strict"});function SE(t,e){t.all("/runtime/*",r=>AD(r.req.raw,e))}async function AD(t,e){try{return Response.json(await RD(t,e))}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 RD(t,e){let r=new URL(t.url),n=DD(e),s=r.pathname.split("/").filter(Boolean).map(decodeURIComponent);if(t.method==="GET"&&r.pathname==="/runtime/workspaces")return kd(t),[{id:n.id,name:n.name}];if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="workspaces")return Sa(t,n.id,s[2]),$D(e.dal,n);if(t.method==="GET"&&s.length===5&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"){Sa(t,n.id,s[2]);let o=hE(e.dal,s[4]);return pE(e.dal,n,o)}if(t.method==="GET"&&r.pathname==="/runtime/lead-teams")return kd(t),e.dal.listTeams().map(o=>MD(o));if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="chat"){let o=_E(e.dal,gE(s[2])),i=await t.json();if(i.teamId!==`team:${o.name}`)throw new se(400,"runtime lead chat body does not match route team");return wE(t,n.id,i.context),yE(o,i.context)}if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="messages"){let o=_E(e.dal,gE(s[2])),i=await t.json();if(i.teamId!==`team:${o.name}`)throw new se(400,"runtime lead message body does not match route team");wE(t,n.id,i.context);let a=i.draft?.body;if(typeof a!="string"||a.length===0)throw new se(400,"runtime lead message requires draft.body");return yE(o,i.context,a)}if(t.method==="POST"&&s.length===6&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"&&s[5]==="workflow-message"){Sa(t,n.id,s[2]);let o=hE(e.dal,s[4]),i=await t.json();if(i.workspaceId!==n.id||i.projectId!==o.name)throw new se(400,"runtime request body does not match route workspace/project");let a=i.draft?.body;if(typeof a!="string"||a.length===0)throw new se(400,"runtime workflow message requires draft.body");return OD(e.dal,o,a),pE(e.dal,n,o)}if(t.method==="GET"&&r.pathname==="/runtime/templates")return Fs(t,n.id),e.dal.listWorkflows().map(o=>PD(o));if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="templates"){Fs(t,n.id);let o=UD(e.dal,s[2]);return FD(o)}if(t.method==="GET"&&r.pathname==="/runtime/runs"){Fs(t,n.id);let o=r.searchParams.get("project"),i=r.searchParams.get("template");if(o!==null&&i!==null)throw new se(400,"conflicting_filters: ?project= and ?template= are mutually exclusive");return WD(e.dal,o,i).map(l=>TE(e.dal,l))}if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="runs"){Fs(t,n.id);let o=EE(e.dal,s[2]);return TE(e.dal,o)}if(t.method==="GET"&&s.length===4&&s[0]==="runtime"&&s[1]==="runs"&&s[3]==="events"){Fs(t,n.id);let o=EE(e.dal,s[2]),i=HD(e.dal,o);return{runId:Ad(o),events:i,...i.length>0?{cursor:i[i.length-1].id}:{}}}throw new se(404,`unknown runtime request: ${t.method} ${r.pathname}`)}function $D(t,e){return{id:e.id,name:e.name,projects:t.listProjects().map(r=>kE(t,e,r))}}function pE(t,e,r){let n=kE(t,e,r);return{...n,managedWorkflow:{...n.managedWorkflow,instance:jD(t,r),composerTarget:{kind:"workflow-initial",label:`Project Workflow: ${r.workflow_name}`,templateId:`template:${r.workflow_name}`,runId:n.managedWorkflow.runId}},workflowMessages:LD(t,r)}}function kE(t,e,r){let n=vE(t,r.id),s=Id(n);return{id:r.name,workspaceId:e.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 jD(t,e){let r=vE(t,e.id),n=r?.current_state??null;return{id:r===null?`project:${e.id}:no-run`:`run:${r.id}`,templateId:`template:${e.workflow_name}`,label:e.workflow_name,status:Id(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 LD(t,e){return t.query("SELECT * FROM attention WHERE project_id = ? ORDER BY id ASC LIMIT 50",e.id).map(n=>({id:`attention:${n.id}`,role:"event",author:"lmctl",timestamp:n.created_at,body:n.kind}))}function OD(t,e,r){let n=CD(t,e.id);if(n!==null){let s=Ta(t,n.id);if(s?.kind==="workflow_escalation"){let o=t.resumeEscalation(s.attention_id,r);if(!o.resumed)throw new se(409,`workflow escalation resume failed: ${o.reason}`);return}if(s?.kind==="interactive_waiting_operator"){let o=vt(t,s.attention_id);if(o?.step_id===null||o?.step_id===void 0)throw new se(409,"interactive resume failed: missing step");let i=t.resumeInteractive(o.step_id,r,!0);if(!i.resumed)throw new se(409,`interactive resume failed: ${i.reason}`);return}}t.enqueueJob({project_id:e.id,source:"runtime-workflow-message",payload:JSON.stringify({prompt:r}),priority:0})}function vE(t,e){return t.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",e)[0]??null}function CD(t,e){return t.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",e)[0]??null}function Id(t){return t===null?"queued":t.terminal_state===null?"running":t.terminal_state==="done"||t.terminal_state==="success"?"succeeded":t.terminal_state==="cancelled"||t.terminal_state==="aborted"?"cancelled":"failed"}function hE(t,e){let r=t.findProjectByName(e);if(r===null)throw new se(404,`project not found: ${e}`);return r}function _E(t,e){let r=t.listTeams().find(n=>n.name===e);if(r===void 0)throw new se(404,`team not found: ${e}`);return r}function gE(t){return t.startsWith("team:")?t.slice(5):t}function MD(t){return{id:`team:${t.name}`,name:t.name,teamfile:"",hasLead:!0,kind:t.name.toLowerCase().includes("manager")?"global-manager":"custom-ai-led"}}function yE(t,e,r){let n=new Date().toISOString(),s=r===void 0?[]:[{id:`lead:${t.id}:user:${Date.now()}`,role:"user",author:"operator",timestamp:n,body:r},{id:`lead:${t.id}:event:${Date.now()}`,role:"event",author:"lmctl",timestamp:n,body:"Lead-team mailbox request accepted by the runtime dispatcher."}];return{id:`lead-chat:${t.name}:${e?.scope??"global-admin"}:${e?.workspaceId??bE}`,teamId:`team:${t.name}`,title:`${t.name} Lead`,messages:s,...e===void 0?{}:{context:e}}}function DD(t){let e=t.workspaceName??Hn()??Sr.default;return{id:e,name:e}}function kd(t){if(t.headers.get("x-lmctl-workspace-id")!==bE)throw new se(400,"runtime request requires global-admin workspace identity")}function Sa(t,e,r){let n=t.headers.get("x-lmctl-workspace-id");if(n===null)throw new se(400,"runtime request requires workspace identity");if(r!==e||n!==e)throw new se(400,"runtime workspace identity does not match route")}function Fs(t,e){let r=t.headers.get("x-lmctl-workspace-id");if(r===null)throw new se(400,"runtime request requires workspace identity");if(r!==e)throw new se(400,"runtime workspace identity does not match server workspace")}function wE(t,e,r){if(r?.scope==="workspace"){if(r.workspaceId===void 0)throw new se(400,"workspace manager context requires workspace identity");Sa(t,e,r.workspaceId);return}kd(t)}function Nd(t){return`${Rn}${xd(t.name)}`}function xd(t){return t.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"item"}function Ad(t){return`${vd}${t.id}`}function PD(t){let e=ka(t.definition);return{id:Nd(t),name:t.name,...e.description===null?{}:{description:e.description}}}function FD(t){let e=ka(t.definition);return{id:Nd(t),name:t.name,...e.description===null?{}:{description:e.description},graph:e.graph}}function ka(t){let e;try{e=JSON.parse(t)}catch{return{description:null,graph:null,stepIds:[],nameToId:new Map}}if(e===null||typeof e!="object")return{description:null,graph:e,stepIds:[],nameToId:new Map};let r=e,n=typeof r.description=="string"?r.description:null,s=[],o=new Map;if(r.schema_version==="lmctl/v3"&&Array.isArray(r.steps)){let i=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&&o.set(a.name,l))}i!==null&&s.includes(i)&&s.sort((a,l)=>a===i?-1:l===i?1:0)}return{description:n,graph:e,stepIds:s,nameToId:o}}function UD(t,e){if(!e.startsWith(Rn))throw new se(404,`template not found: ${e}`);let r=e.slice(Rn.length),n=t.listWorkflows().filter(s=>xd(s.name)===r);if(n.length===0)throw new se(404,`template not found: ${e}`);if(n.length>1){let s=n.map(o=>o.name).join(", ");throw new se(409,`template_id_ambiguous: ${e} matches multiple workflow names [${s}]; rename to ensure unique slugs`)}return n[0]}function EE(t,e){if(!e.startsWith(vd))throw new se(404,`run not found: ${e}`);let r=e.slice(vd.length);if(!/^[1-9]\d*$/.test(r))throw new se(404,`run not found: ${e}`);let n=Number.parseInt(r,10);if(!Number.isFinite(n)||n<=0||String(n)!==r)throw new se(404,`run not found: ${e}`);let s=t.getRun(n);if(s===null)throw new se(404,`run not found: ${e}`);return s}function WD(t,e,r){if(r!==null){if(!r.startsWith(Rn))return[];let s=r.slice(Rn.length),o=t.listWorkflows().filter(a=>xd(a.name)===s).map(a=>a.id);if(o.length===0)return[];let i=o.map(()=>"?").join(", ");return t.query(`SELECT * FROM run WHERE workflow_id IN (${i}) ORDER BY id DESC LIMIT 200`,...o)}if(e===null)return t.query("SELECT * FROM run ORDER BY id DESC LIMIT 200");let n=t.findProjectByName(e);return n===null?[]:t.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 TE(t,e){let r=t.getWorkflow(e.workflow_id),n=Id(e),s=BD(r,e);return{id:Ad(e),templateId:r===null?`${Rn}unknown`:Nd(r),label:r===null?`run ${e.id}`:`${r.name} #${e.id}`,status:n,createdAt:e.started_at,...e.ended_at===null?{}:{updatedAt:e.ended_at},currentStepIds:s}}function BD(t,e){if(e.current_state===null)return[];let r=e.current_state.startsWith("__paused__:")?e.current_state.slice(11):e.current_state;return t===null?[r]:[ka(t.definition).nameToId.get(r)??r]}function HD(t,e){let r=t.getWorkflow(e.workflow_id),n=r===null?{stepIds:[],nameToId:new Map}:ka(r.definition),s=c=>n.nameToId.get(c)??c,o=Ad(e),i=[];i.push({timestamp:e.started_at,type:"run.started",message:"Run started"});let a=t.listStepsForRun(e.id);for(let c of a){let u=s(c.state_name);if(i.push({timestamp:c.started_at,type:"step.started",stepId:u,message:`step ${c.state_name} started`}),c.ended_at!==null){let d=qD(c);i.push({timestamp:c.ended_at,type:d,stepId:u,...c.outcome===null?{}:{message:c.outcome},...c.status_detail===null?{}:{payload:{status_detail:c.status_detail}}})}else e.paused_at!==null&&c.id===a[a.length-1]?.id&&i.push({timestamp:e.paused_at,type:"step.paused",stepId:u})}let l=t.listSessionEvents(e.id);for(let c of l){let u=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)})(),d=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{}i.push({timestamp:d,type:"message",...u===void 0?{}:{stepId:u},payload:f})}if(e.terminal_state!==null){let c=e.terminal_state==="done"||e.terminal_state==="success"?"run.completed":e.terminal_state==="cancelled"||e.terminal_state==="aborted"?"run.cancelled":"run.failed";i.push({timestamp:e.ended_at??e.started_at,type:c,message:e.terminal_state})}return i.sort((c,u)=>c.timestamp.localeCompare(u.timestamp)),i.map((c,u)=>({id:`${o}:evt:${u+1}`,runId:o,sequence:u+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 qD(t){if(t.outcome===null)return"step.failed";let e=t.status_detail;return e==="failed"||e==="error"||e==="aborted"?"step.failed":"step.completed"}var bE,Rn,vd,se,IE=T(()=>{"use strict";ze();ba();Bt();bE="global-admin";Rn="template:",vd="run:";se=class extends Error{status;constructor(e,r){super(r),this.status=e}}});import{mkdirSync as JD,writeFileSync as XD}from"node:fs";import{randomUUID as NE}from"node:crypto";import{dirname as GD,resolve as va,sep as xE}from"node:path";async function RE(t,e){let r;try{r=await t.req.parseBody({all:!1})}catch{return t.text("invalid multipart body",400)}let n=r.image;if(!ZD(n))return t.text("missing image file",400);if(n.size>KD)return t.text("upload too large",413);let s=Buffer.from(await n.arrayBuffer()),o=QD(s);if(o===null||!(o in AE))return t.text("unsupported upload MIME type",415);if(n.type.length>0&&n.type!==o)return t.text("upload MIME type does not match file content",415);let i=VD(e,r.project);if(typeof i=="string")return t.text(i,404);let a=i===null?va(zD()):va(i.local_path),l=va(a,"uploads",NE()),c=va(l,`${NE()}${AE[o]}`);if(!YD(c,a))return t.text("invalid upload path",400);JD(l,{recursive:!0});let u=new Uint8Array(s.buffer,s.byteOffset,s.byteLength);XD(c,u);let d={path:c,size:s.byteLength,mime:o,project:i?.name??null};return t.json(d)}function VD(t,e){return e==null||e===""?null:typeof e!="string"?"invalid project":t.findProjectByName(e)??`project not found: ${e}`}function YD(t,e){let r=e.endsWith(xE)?e:`${e}${xE}`;return t.startsWith(r)}function zD(){return GD(de())}function ZD(t){return typeof File<"u"&&t instanceof File}function QD(t){return t.length>=8&&t[0]===137&&t[1]===80&&t[2]===78&&t[3]===71&&t[4]===13&&t[5]===10&&t[6]===26&&t[7]===10?"image/png":t.length>=3&&t[0]===255&&t[1]===216&&t[2]===255?"image/jpeg":t.length>=12&&t.subarray(0,4).toString("ascii")==="RIFF"&&t.subarray(8,12).toString("ascii")==="WEBP"?"image/webp":t.length>=12&&t.subarray(4,8).toString("ascii")==="ftyp"&&["heic","heix","hevc","hevx","mif1","msf1"].includes(t.subarray(8,12).toString("ascii"))?"image/heic":t.length>=5&&t.subarray(0,5).toString("ascii")==="%PDF-"?"application/pdf":null}var KD,AE,$E=T(()=>{"use strict";ze();KD=10*1024*1024,AE={"image/png":".png","image/jpeg":".jpg","image/webp":".webp","image/heic":".heic","application/pdf":".pdf"}});import{existsSync as Ia}from"node:fs";import{basename as eP,dirname as tP,extname as rP,isAbsolute as nP,join as sP,relative as oP}from"node:path";import{fileURLToPath as iP}from"node:url";import{Hono as aP}from"hono";import{serveStatic as xt}from"@hono/node-server/serve-static";function PE(t){let e=new aP,r=[],n=t.localWebui!==void 0?$d(t.localWebui.webuiDir):lP();if(t.localWebui!==void 0&&Hw(e,{s3:t.localWebui.localMailbox.s3,commands:t.localWebui.localMailbox.commands}),n!==null){let s=cP();t.localWebui!==void 0?e.get("/config.json",s,o=>o.json({workspaceFetchMode:"local-mailbox",localMailbox:{base:"/local-mailbox",userId:"local",deviceId:"local"},mailboxPolling:{readIntervalSeconds:1,heartbeatIdleSeconds:1,backoffReadIntervalSeconds:1}})):t.webuiRuntimeConfig!==void 0&&e.get("/config.json",s,o=>o.json(t.webuiRuntimeConfig)),e.use("/dist/*",s,xt({root:n})),e.use("/vendor/*",s,xt({root:n})),e.use("/src/*",s,xt({root:n})),e.get("/",s,xt({root:n,path:"index.html"})),e.get("/admin",s,xt({root:n,path:"index.html"})),e.get("/admin/*",s,xt({root:n,path:"index.html"})),e.get("/terminal",s,xt({root:n,path:"index.html"})),e.get("/terminal/*",s,xt({root:n,path:"index.html"})),e.get("/chat",s,xt({root:n,path:"index.html"})),e.get("/chat/*",s,xt({root:n,path:"index.html"}))}else e.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 e.use("*",xg()),e.get("/login",s=>s.html(je("Login",`
1960
+ ORDER BY id DESC LIMIT 1`,e);return r.length===0?null:{kind:r[0].kind,attention_id:r[0].id}}var ba=T(()=>{"use strict"});function SE(t,e){t.all("/runtime/*",r=>AD(r.req.raw,e))}async function AD(t,e){try{return Response.json(await RD(t,e))}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 RD(t,e){let r=new URL(t.url),n=DD(e),s=r.pathname.split("/").filter(Boolean).map(decodeURIComponent);if(t.method==="GET"&&r.pathname==="/runtime/workspaces")return kd(t),[{id:n.id,name:n.name}];if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="workspaces")return Sa(t,n.id,s[2]),$D(e.dal,n);if(t.method==="GET"&&s.length===5&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"){Sa(t,n.id,s[2]);let o=hE(e.dal,s[4]);return pE(e.dal,n,o)}if(t.method==="GET"&&r.pathname==="/runtime/lead-teams")return kd(t),e.dal.listTeams().map(o=>MD(o));if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="chat"){let o=_E(e.dal,gE(s[2])),i=await t.json();if(i.teamId!==`team:${o.name}`)throw new se(400,"runtime lead chat body does not match route team");return wE(t,n.id,i.context),yE(o,i.context)}if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="messages"){let o=_E(e.dal,gE(s[2])),i=await t.json();if(i.teamId!==`team:${o.name}`)throw new se(400,"runtime lead message body does not match route team");wE(t,n.id,i.context);let a=i.draft?.body;if(typeof a!="string"||a.length===0)throw new se(400,"runtime lead message requires draft.body");return yE(o,i.context,a)}if(t.method==="POST"&&s.length===6&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"&&s[5]==="workflow-message"){Sa(t,n.id,s[2]);let o=hE(e.dal,s[4]),i=await t.json();if(i.workspaceId!==n.id||i.projectId!==o.name)throw new se(400,"runtime request body does not match route workspace/project");let a=i.draft?.body;if(typeof a!="string"||a.length===0)throw new se(400,"runtime workflow message requires draft.body");return OD(e.dal,o,a),pE(e.dal,n,o)}if(t.method==="GET"&&r.pathname==="/runtime/templates")return Us(t,n.id),e.dal.listWorkflows().map(o=>PD(o));if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="templates"){Us(t,n.id);let o=UD(e.dal,s[2]);return FD(o)}if(t.method==="GET"&&r.pathname==="/runtime/runs"){Us(t,n.id);let o=r.searchParams.get("project"),i=r.searchParams.get("template");if(o!==null&&i!==null)throw new se(400,"conflicting_filters: ?project= and ?template= are mutually exclusive");return WD(e.dal,o,i).map(l=>TE(e.dal,l))}if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="runs"){Us(t,n.id);let o=EE(e.dal,s[2]);return TE(e.dal,o)}if(t.method==="GET"&&s.length===4&&s[0]==="runtime"&&s[1]==="runs"&&s[3]==="events"){Us(t,n.id);let o=EE(e.dal,s[2]),i=HD(e.dal,o);return{runId:Ad(o),events:i,...i.length>0?{cursor:i[i.length-1].id}:{}}}throw new se(404,`unknown runtime request: ${t.method} ${r.pathname}`)}function $D(t,e){return{id:e.id,name:e.name,projects:t.listProjects().map(r=>kE(t,e,r))}}function pE(t,e,r){let n=kE(t,e,r);return{...n,managedWorkflow:{...n.managedWorkflow,instance:LD(t,r),composerTarget:{kind:"workflow-initial",label:`Project Workflow: ${r.workflow_name}`,templateId:`template:${r.workflow_name}`,runId:n.managedWorkflow.runId}},workflowMessages:jD(t,r)}}function kE(t,e,r){let n=vE(t,r.id),s=Id(n);return{id:r.name,workspaceId:e.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 LD(t,e){let r=vE(t,e.id),n=r?.current_state??null;return{id:r===null?`project:${e.id}:no-run`:`run:${r.id}`,templateId:`template:${e.workflow_name}`,label:e.workflow_name,status:Id(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 jD(t,e){return t.query("SELECT * FROM attention WHERE project_id = ? ORDER BY id ASC LIMIT 50",e.id).map(n=>({id:`attention:${n.id}`,role:"event",author:"lmctl",timestamp:n.created_at,body:n.kind}))}function OD(t,e,r){let n=CD(t,e.id);if(n!==null){let s=Ta(t,n.id);if(s?.kind==="workflow_escalation"){let o=t.resumeEscalation(s.attention_id,r);if(!o.resumed)throw new se(409,`workflow escalation resume failed: ${o.reason}`);return}if(s?.kind==="interactive_waiting_operator"){let o=vt(t,s.attention_id);if(o?.step_id===null||o?.step_id===void 0)throw new se(409,"interactive resume failed: missing step");let i=t.resumeInteractive(o.step_id,r,!0);if(!i.resumed)throw new se(409,`interactive resume failed: ${i.reason}`);return}}t.enqueueJob({project_id:e.id,source:"runtime-workflow-message",payload:JSON.stringify({prompt:r}),priority:0})}function vE(t,e){return t.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",e)[0]??null}function CD(t,e){return t.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",e)[0]??null}function Id(t){return t===null?"queued":t.terminal_state===null?"running":t.terminal_state==="done"||t.terminal_state==="success"?"succeeded":t.terminal_state==="cancelled"||t.terminal_state==="aborted"?"cancelled":"failed"}function hE(t,e){let r=t.findProjectByName(e);if(r===null)throw new se(404,`project not found: ${e}`);return r}function _E(t,e){let r=t.listTeams().find(n=>n.name===e);if(r===void 0)throw new se(404,`team not found: ${e}`);return r}function gE(t){return t.startsWith("team:")?t.slice(5):t}function MD(t){return{id:`team:${t.name}`,name:t.name,teamfile:"",hasLead:!0,kind:t.name.toLowerCase().includes("manager")?"global-manager":"custom-ai-led"}}function yE(t,e,r){let n=new Date().toISOString(),s=r===void 0?[]:[{id:`lead:${t.id}:user:${Date.now()}`,role:"user",author:"operator",timestamp:n,body:r},{id:`lead:${t.id}:event:${Date.now()}`,role:"event",author:"lmctl",timestamp:n,body:"Lead-team mailbox request accepted by the runtime dispatcher."}];return{id:`lead-chat:${t.name}:${e?.scope??"global-admin"}:${e?.workspaceId??bE}`,teamId:`team:${t.name}`,title:`${t.name} Lead`,messages:s,...e===void 0?{}:{context:e}}}function DD(t){let e=t.workspaceName??Hn()??Sr.default;return{id:e,name:e}}function kd(t){if(t.headers.get("x-lmctl-workspace-id")!==bE)throw new se(400,"runtime request requires global-admin workspace identity")}function Sa(t,e,r){let n=t.headers.get("x-lmctl-workspace-id");if(n===null)throw new se(400,"runtime request requires workspace identity");if(r!==e||n!==e)throw new se(400,"runtime workspace identity does not match route")}function Us(t,e){let r=t.headers.get("x-lmctl-workspace-id");if(r===null)throw new se(400,"runtime request requires workspace identity");if(r!==e)throw new se(400,"runtime workspace identity does not match server workspace")}function wE(t,e,r){if(r?.scope==="workspace"){if(r.workspaceId===void 0)throw new se(400,"workspace manager context requires workspace identity");Sa(t,e,r.workspaceId);return}kd(t)}function Nd(t){return`${Rn}${xd(t.name)}`}function xd(t){return t.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"item"}function Ad(t){return`${vd}${t.id}`}function PD(t){let e=ka(t.definition);return{id:Nd(t),name:t.name,...e.description===null?{}:{description:e.description}}}function FD(t){let e=ka(t.definition);return{id:Nd(t),name:t.name,...e.description===null?{}:{description:e.description},graph:e.graph}}function ka(t){let e;try{e=JSON.parse(t)}catch{return{description:null,graph:null,stepIds:[],nameToId:new Map}}if(e===null||typeof e!="object")return{description:null,graph:e,stepIds:[],nameToId:new Map};let r=e,n=typeof r.description=="string"?r.description:null,s=[],o=new Map;if(r.schema_version==="lmctl/v3"&&Array.isArray(r.steps)){let i=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&&o.set(a.name,l))}i!==null&&s.includes(i)&&s.sort((a,l)=>a===i?-1:l===i?1:0)}return{description:n,graph:e,stepIds:s,nameToId:o}}function UD(t,e){if(!e.startsWith(Rn))throw new se(404,`template not found: ${e}`);let r=e.slice(Rn.length),n=t.listWorkflows().filter(s=>xd(s.name)===r);if(n.length===0)throw new se(404,`template not found: ${e}`);if(n.length>1){let s=n.map(o=>o.name).join(", ");throw new se(409,`template_id_ambiguous: ${e} matches multiple workflow names [${s}]; rename to ensure unique slugs`)}return n[0]}function EE(t,e){if(!e.startsWith(vd))throw new se(404,`run not found: ${e}`);let r=e.slice(vd.length);if(!/^[1-9]\d*$/.test(r))throw new se(404,`run not found: ${e}`);let n=Number.parseInt(r,10);if(!Number.isFinite(n)||n<=0||String(n)!==r)throw new se(404,`run not found: ${e}`);let s=t.getRun(n);if(s===null)throw new se(404,`run not found: ${e}`);return s}function WD(t,e,r){if(r!==null){if(!r.startsWith(Rn))return[];let s=r.slice(Rn.length),o=t.listWorkflows().filter(a=>xd(a.name)===s).map(a=>a.id);if(o.length===0)return[];let i=o.map(()=>"?").join(", ");return t.query(`SELECT * FROM run WHERE workflow_id IN (${i}) ORDER BY id DESC LIMIT 200`,...o)}if(e===null)return t.query("SELECT * FROM run ORDER BY id DESC LIMIT 200");let n=t.findProjectByName(e);return n===null?[]:t.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 TE(t,e){let r=t.getWorkflow(e.workflow_id),n=Id(e),s=BD(r,e);return{id:Ad(e),templateId:r===null?`${Rn}unknown`:Nd(r),label:r===null?`run ${e.id}`:`${r.name} #${e.id}`,status:n,createdAt:e.started_at,...e.ended_at===null?{}:{updatedAt:e.ended_at},currentStepIds:s}}function BD(t,e){if(e.current_state===null)return[];let r=e.current_state.startsWith("__paused__:")?e.current_state.slice(11):e.current_state;return t===null?[r]:[ka(t.definition).nameToId.get(r)??r]}function HD(t,e){let r=t.getWorkflow(e.workflow_id),n=r===null?{stepIds:[],nameToId:new Map}:ka(r.definition),s=c=>n.nameToId.get(c)??c,o=Ad(e),i=[];i.push({timestamp:e.started_at,type:"run.started",message:"Run started"});let a=t.listStepsForRun(e.id);for(let c of a){let u=s(c.state_name);if(i.push({timestamp:c.started_at,type:"step.started",stepId:u,message:`step ${c.state_name} started`}),c.ended_at!==null){let d=qD(c);i.push({timestamp:c.ended_at,type:d,stepId:u,...c.outcome===null?{}:{message:c.outcome},...c.status_detail===null?{}:{payload:{status_detail:c.status_detail}}})}else e.paused_at!==null&&c.id===a[a.length-1]?.id&&i.push({timestamp:e.paused_at,type:"step.paused",stepId:u})}let l=t.listSessionEvents(e.id);for(let c of l){let u=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)})(),d=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{}i.push({timestamp:d,type:"message",...u===void 0?{}:{stepId:u},payload:f})}if(e.terminal_state!==null){let c=e.terminal_state==="done"||e.terminal_state==="success"?"run.completed":e.terminal_state==="cancelled"||e.terminal_state==="aborted"?"run.cancelled":"run.failed";i.push({timestamp:e.ended_at??e.started_at,type:c,message:e.terminal_state})}return i.sort((c,u)=>c.timestamp.localeCompare(u.timestamp)),i.map((c,u)=>({id:`${o}:evt:${u+1}`,runId:o,sequence:u+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 qD(t){if(t.outcome===null)return"step.failed";let e=t.status_detail;return e==="failed"||e==="error"||e==="aborted"?"step.failed":"step.completed"}var bE,Rn,vd,se,IE=T(()=>{"use strict";ze();ba();Bt();bE="global-admin";Rn="template:",vd="run:";se=class extends Error{status;constructor(e,r){super(r),this.status=e}}});import{mkdirSync as JD,writeFileSync as XD}from"node:fs";import{randomUUID as NE}from"node:crypto";import{dirname as GD,resolve as va,sep as xE}from"node:path";async function RE(t,e){let r;try{r=await t.req.parseBody({all:!1})}catch{return t.text("invalid multipart body",400)}let n=r.image;if(!ZD(n))return t.text("missing image file",400);if(n.size>KD)return t.text("upload too large",413);let s=Buffer.from(await n.arrayBuffer()),o=QD(s);if(o===null||!(o in AE))return t.text("unsupported upload MIME type",415);if(n.type.length>0&&n.type!==o)return t.text("upload MIME type does not match file content",415);let i=VD(e,r.project);if(typeof i=="string")return t.text(i,404);let a=i===null?va(zD()):va(i.local_path),l=va(a,"uploads",NE()),c=va(l,`${NE()}${AE[o]}`);if(!YD(c,a))return t.text("invalid upload path",400);JD(l,{recursive:!0});let u=new Uint8Array(s.buffer,s.byteOffset,s.byteLength);XD(c,u);let d={path:c,size:s.byteLength,mime:o,project:i?.name??null};return t.json(d)}function VD(t,e){return e==null||e===""?null:typeof e!="string"?"invalid project":t.findProjectByName(e)??`project not found: ${e}`}function YD(t,e){let r=e.endsWith(xE)?e:`${e}${xE}`;return t.startsWith(r)}function zD(){return GD(de())}function ZD(t){return typeof File<"u"&&t instanceof File}function QD(t){return t.length>=8&&t[0]===137&&t[1]===80&&t[2]===78&&t[3]===71&&t[4]===13&&t[5]===10&&t[6]===26&&t[7]===10?"image/png":t.length>=3&&t[0]===255&&t[1]===216&&t[2]===255?"image/jpeg":t.length>=12&&t.subarray(0,4).toString("ascii")==="RIFF"&&t.subarray(8,12).toString("ascii")==="WEBP"?"image/webp":t.length>=12&&t.subarray(4,8).toString("ascii")==="ftyp"&&["heic","heix","hevc","hevx","mif1","msf1"].includes(t.subarray(8,12).toString("ascii"))?"image/heic":t.length>=5&&t.subarray(0,5).toString("ascii")==="%PDF-"?"application/pdf":null}var KD,AE,$E=T(()=>{"use strict";ze();KD=10*1024*1024,AE={"image/png":".png","image/jpeg":".jpg","image/webp":".webp","image/heic":".heic","application/pdf":".pdf"}});import{existsSync as Ia}from"node:fs";import{basename as eP,dirname as tP,extname as rP,isAbsolute as nP,join as sP,relative as oP}from"node:path";import{fileURLToPath as iP}from"node:url";import{Hono as aP}from"hono";import{serveStatic as xt}from"@hono/node-server/serve-static";function PE(t){let e=new aP,r=[],n=t.localWebui!==void 0?$d(t.localWebui.webuiDir):lP();if(t.localWebui!==void 0&&Hw(e,{s3:t.localWebui.localMailbox.s3,commands:t.localWebui.localMailbox.commands}),n!==null){let s=cP();t.localWebui!==void 0?e.get("/config.json",s,o=>o.json({workspaceFetchMode:"local-mailbox",localMailbox:{base:"/local-mailbox",userId:"local",deviceId:"local"},mailboxPolling:{readIntervalSeconds:1,heartbeatIdleSeconds:1,backoffReadIntervalSeconds:1}})):t.webuiRuntimeConfig!==void 0&&e.get("/config.json",s,o=>o.json(t.webuiRuntimeConfig)),e.use("/dist/*",s,xt({root:n})),e.use("/vendor/*",s,xt({root:n})),e.use("/src/*",s,xt({root:n})),e.get("/",s,xt({root:n,path:"index.html"})),e.get("/admin",s,xt({root:n,path:"index.html"})),e.get("/admin/*",s,xt({root:n,path:"index.html"})),e.get("/terminal",s,xt({root:n,path:"index.html"})),e.get("/terminal/*",s,xt({root:n,path:"index.html"})),e.get("/chat",s,xt({root:n,path:"index.html"})),e.get("/chat/*",s,xt({root:n,path:"index.html"}))}else e.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 e.use("*",xg()),e.get("/login",s=>s.html(Le("Login",`
1961
1961
  <h1>Login</h1>
1962
1962
  <form method="post" action="/login">
1963
1963
  <label>Token <input name="token" type="password"></label>
1964
1964
  <button type="submit">Login</button>
1965
1965
  </form>
1966
- `))),e.post("/login",async s=>{let o=await s.req.parseBody(),i=typeof o.token=="string"?o.token:"";return Rg(i)?(Fu(s,i),s.redirect("/",302)):s.html(je("Login","<p>Invalid token</p>"),401)}),e.post("/logout",s=>($g(s),s.redirect("/login",302))),xw(e,{dal:t.dal}),SE(e,{dal:t.dal}),Jw(e,{dal:t.dal}),rE(e,{terminalSessionManager:t.terminalSessionManager}),lE(e,{persistentSessionManager:t.persistentSessionManager}),e.post("/api/teams/:team_name/refresh",async s=>{let o=ms(s.req.param("team_name")),i=t.dal.findTeamByName(o);if(i===null)return s.notFound();let a=[],c=t.dal.db.transaction(()=>{let f=t.dal.listTeamMembers(i.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)t.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 u=[],d=[];for(let f of a)try{await Hc(t.dal,o,f.alias),t.dal.setMemberState(f.id,"idle",null),u.push(f.alias)}catch(m){let p=m instanceof Error?m.message:String(m);t.dal.setMemberState(f.id,"attention_needed",`refresh failed: ${p}`),d.push({alias:f.alias,error:p})}return W(s,{team:o,seeded:u,failed:d},f=>`<p>refreshed team ${k(f.team)}: seeded [${f.seeded.map(m=>k(m)).join(", ")}]${f.failed.length>0?` failed [${f.failed.map(m=>`${k(m.alias)}: ${k(m.error)}`).join(", ")}]`:""}</p>`)}),Pg(e,{dal:t.dal}),Jg(e,{dal:t.dal}),e.get("/api/status",s=>W(s,Zo(t.dal),_P)),e.get("/api/projects",s=>W(s,Qo(t.dal),gP)),e.get("/api/teams",s=>W(s,Ph(t.dal),EP)),e.get("/api/workflows",s=>W(s,ei(t.dal),TP)),e.get("/api/workflows/verify",s=>{let o=fw();return s.req.header("accept")?.includes("text/plain")?s.text(pw(o)):s.json(o)}),e.get("/api/jobs",s=>W(s,Fh(t.dal,{status:s.req.query("status")}),bP)),e.post("/api/uploads",s=>RE(s,t.dal)),e.get("/api/jobs/:id",s=>{let o=ti(t.dal,te(s,"id"));return o===null?s.notFound():W(s,o,ce)}),e.post("/api/jobs",async s=>{let o;try{o=await s.req.json()}catch{return s.text("invalid JSON body",400)}let i=null;if(typeof o.project_id=="number")i=o.project_id;else if(typeof o.project=="string"){let f=t.dal.findProjectByName(o.project);if(f===null)return s.text(`project not found: ${o.project}`,404);i=f.id}else{let f=t.dal.listProjects();f.length===1&&(i=f[0].id)}if(i===null)return s.text("missing project or project_id",400);let a=typeof o.workflow_id_override=="number"?o.workflow_id_override:null;if(a===null&&typeof o.workflow=="string"){let f=t.dal.getWorkflowByName(o.workflow);if(f===null)return s.text(`workflow not found: ${o.workflow}`,404);a=f.id}let l=typeof o.source=="string"?o.source:"manual",c=o.payload,u=c==null?null:typeof c=="string"?c:JSON.stringify(c),d=t.dal.enqueueJob({project_id:i,workflow_id_override:a,source:l,source_ref:typeof o.source_ref=="string"?o.source_ref:null,payload:u,priority:typeof o.priority=="number"?o.priority:0,dedupe_key:typeof o.dedupe_key=="string"?o.dedupe_key:null});return W(s,d,ce)}),e.post("/api/jobs/:id/run",async s=>{let{runJobById:o}=await Promise.resolve().then(()=>(Ps(),kw)),i=ti(t.dal,te(s,"id"));if(i===null)return s.notFound();let a=await o({dal:t.dal,worker_id:`api-job-run-${process.pid}-${Date.now()}`,job_id:i.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)}),e.get("/api/workflows/:name",s=>{let o=t.dal.getWorkflowByName(s.req.param("name"));return o===null?s.notFound():W(s,o,ce)}),e.get("/api/projects/:name/workflows",s=>{let o=t.dal.findProjectByName(s.req.param("name"));return o===null?s.notFound():W(s,t.dal.listProjectWorkflows(o.id),yP)}),e.post("/api/projects/:name/workflows",async s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=await $n(s);if(typeof i=="string")return s.text(i,400);let a=typeof i.workflow=="string"?i.workflow:null,l=typeof i.workflow_id=="number"?i.workflow_id:null,c=l!==null?t.dal.getWorkflow(l):a!==null?t.dal.getWorkflowByName(a):null;if(c===null)return s.text("workflow not found",404);let u=typeof i.condition=="string"&&i.condition.length>0?i.condition:null;if(u!==null)try{fr(u)}catch{return s.text("invalid condition",400)}let d=fP(i.parameters_override??i.params);if(typeof d=="string"&&d.startsWith("error:"))return s.text(d.slice(6),400);let f=typeof i.priority=="number"&&Number.isInteger(i.priority)?i.priority:100,m=t.dal.insertProjectWorkflow({project_id:o.id,workflow_id:c.id,condition:u,parameters_override:d,priority:f});return W(s,m,ce)}),e.get("/api/projects/workflows/:id",s=>{let o=t.dal.getProjectWorkflow(te(s,"id"));return o===null?s.notFound():W(s,o,ce)}),e.delete("/api/projects/workflows/:id",s=>t.dal.removeProjectWorkflow(te(s,"id"))?W(s,{removed:!0},ce):s.notFound()),e.post("/api/projects/workflows/:id/enable",s=>{let o=t.dal.setProjectWorkflowEnabled(te(s,"id"),!0);return o===null?s.notFound():W(s,o,ce)}),e.post("/api/projects/workflows/:id/disable",s=>{let o=t.dal.setProjectWorkflowEnabled(te(s,"id"),!1);return o===null?s.notFound():W(s,o,ce)}),e.get("/api/projects/:name/issues",s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=LE(s.req.query("status"),mP);if(typeof i=="string")return s.text(i,400);let a=LE(s.req.query("severity"),UE);return typeof a=="string"?s.text(a,400):W(s,t.dal.listIssues(o.id,{...i!==void 0?{status:i}:{},...a!==void 0?{severity:a}:{},...s.req.query("ai_test_path")!==void 0?{ai_test_path:s.req.query("ai_test_path")}:{}}),wP)}),e.post("/api/projects/:name/issues",async s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=await $n(s);if(typeof i=="string")return s.text(i,400);let a=typeof i.title=="string"&&i.title.trim().length>0?i.title:null,l=typeof i.body=="string"?i.body:null;if(a===null||l===null)return s.text("missing title or body",400);let c=pP(i.severity);if(typeof c=="object")return s.text(c.error,400);let u=hP(i.labels);if(typeof u=="string"&&u.startsWith("error:"))return s.text(u.slice(6),400);let d=t.dal.createIssue({project_id:o.id,title:a,body:l,...c!==void 0?{severity:c}:{},labels:u,ai_test_path:typeof i.ai_test_path=="string"?i.ai_test_path:null,source_run_id:typeof i.source_run_id=="number"?i.source_run_id:null});return W(s,d,ce)}),e.get("/api/issues/:id",s=>{let o=t.dal.getIssue(te(s,"id"));return o===null?s.notFound():W(s,o,ce)}),e.post("/api/issues/:id/claim",async s=>{let o=te(s,"id"),i=t.dal.getIssue(o);if(i===null)return s.notFound();let a=await $n(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=t.dal.claimIssue(o,l);return c===null?s.json({error:`issue ${o} is not in a claimable state (status=${i.status})`},400):W(s,c,ce)}),e.post("/api/projects/:name/issues/claim-next",async s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.json({error:"project_not_found"},404);let i=await $n(s);if(typeof i=="string")return s.json({error:i},400);let a=typeof i.assigned_run_id=="number"?i.assigned_run_id:null;if(a===null)return s.json({error:"missing assigned_run_id"},400);let l=t.dal.claimNextIssue(o.id,a);return l===null?s.json({status:"queue_empty"},404):W(s,l,ce)}),e.post("/api/issues/:id/close",async s=>{let o=t.dal.getIssue(te(s,"id"));if(o===null)return s.notFound();let i=await $n(s);if(typeof i=="string")return s.json({error:i},400);let a=typeof i.closed_run_id=="number"?i.closed_run_id:o.assigned_run_id;if(a===null)return s.json({error:"missing closed_run_id"},400);try{return W(s,t.dal.closeIssue(te(s,"id"),a,typeof i.commit_hash=="string"?i.commit_hash:null),ce)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),e.post("/api/issues/:id/reopen",async s=>{let o=t.dal.getIssue(te(s,"id"));if(o===null)return s.notFound();let i=await $n(s);if(typeof i=="string")return s.json({error:i},400);let a=typeof i.source_run_id=="number"?i.source_run_id:o.closed_run_id??o.source_run_id;if(a===null)return s.json({error:"missing source_run_id"},400);try{return W(s,t.dal.reopenIssue(te(s,"id"),a),ce)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),e.get("/api/projects/:name",s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=o.name.indexOf("/"),a=i>0?o.name.slice(0,i):null,l=i>0?o.name.slice(i+1):o.name;return W(s,{...o,owner:a,repo:l},ce)}),e.get("/api/runs/:run_id/artifacts",s=>{let o=te(s,"run_id"),i=s.req.query("kind"),a=$r(t.dal,o,i);return W(s,a,ce)}),e.get("/api/runs/:run_id/artifacts/:kind",async s=>{let o=te(s,"run_id"),i=s.req.param("kind"),a=$r(t.dal,o,i);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):W(s,l,ce);if(l.path!==null&&l.path!==void 0){if(c)try{let{readFileSync:u}=await import("node:fs"),d=uP(l.path);if(dP(d)){let h=u(l.path,"utf8");return s.body(h,200,{"Content-Type":d})}let f=u(l.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength),p=eP(l.path);return s.body(m,200,{"Content-Type":d,"Content-Disposition":`attachment; filename="${p}"`})}catch(u){return s.text(`failed to read artifact path: ${u.message}`,500)}return W(s,l,ce)}return W(s,l,ce)}),e.get("/api/runs",s=>W(s,nn(t.dal,{limit:Rd(s,"limit")??100}),SP)),e.get("/api/runs/:id",s=>{let o=Rr(t.dal,te(s,"id"));return o===null?s.notFound():W(s,o,kP)}),e.get("/api/runs/:id/where",s=>{let o=sn(t.dal,te(s,"id"));return o===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(ni(o)):s.json(o)}),e.get("/api/runs/:id/timeline",s=>{let o=si(t.dal,te(s,"id"));return o===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(oi(o)):s.json(o)}),e.post("/api/runs/:id/resume",async s=>{let o=s.req.query("outcome");if(o===void 0||o.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&&(o=c)}}if(o===void 0||o.length===0)return s.text("missing outcome",400);let i=t.dal.resumeRun(te(s,"id"),o);return!i.resumed&&i.reason==="run_not_found"?s.notFound():i.resumed?(Na(t.daemon),W(s,i,OE)):W(s,i,OE,400)}),e.post("/api/interactive/:step_id/respond",async s=>{let o=te(s,"step_id"),i,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let u=await s.req.json();typeof u.input=="string"&&(i=u.input),u.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let u=await s.req.parseBody().catch(()=>({}));typeof u.input=="string"&&(i=u.input),(u.done==="true"||u.done===!0)&&(a=!0)}if(i===void 0)return s.text("missing input",400);let c=t.dal.resumeInteractive(o,i,a);return!c.resumed&&c.reason==="not_found"?s.notFound():c.resumed?(Na(t.daemon),s.json({resumed:!0,session_status:c.session.status})):s.json({resumed:!1,reason:c.reason},400)}),e.get("/api/runs/:id/steps/:step_id",s=>jE(s,t.dal,o=>W(s,o,IP))),e.get("/api/runs/:id/steps/:step_id/transcript",s=>{let o=Hh(t.dal,te(s,"id"),te(s,"step_id"));return o===null?s.notFound():FE(s)?s.html(`<pre>${k(o)}</pre>`):s.req.header("accept")?.includes("text/plain")?s.text(o):s.json({transcript:o})}),e.get("/api/runs/:id/steps/:step_id/messages",s=>jE(s,t.dal,o=>{let i=dE(o);return W(s,i,a=>pe(["role","text"],a.map(l=>[k(l.role),k(l.text)])))})),e.get("/api/external-objects",s=>W(s,qh(t.dal,{type:s.req.query("type")}),NP)),e.get("/api/external-signals",s=>W(s,Jh(t.dal,{unhandled:s.req.query("unhandled")==="true"}),xP)),e.get("/api/attentions",s=>W(s,lr(t.dal,{unacked:s.req.query("unacked")==="true"}),AP)),e.post("/api/attentions/:id/ack",s=>{let o=t.dal.acknowledgeAttention(te(s,"id"));return o===null?s.notFound():W(s,o,i=>`<p>acknowledged attention ${k(i.id)}</p>`)}),e.get("/api/escalations",s=>{let o=s.req.query("project"),i=s.req.query("all")==="true",a=s.req.query("since"),l={all:i};o!==void 0&&(l.project=o),a!==void 0&&(l.since=a);let c=ri(t.dal,l);return W(s,c,u=>`<h1>Escalations</h1>${pe(["attention_id","project","run","workflow","state","prompt"],u.map(d=>[k(d.attention_id),k(d.project),k(d.run_id),k(d.workflow_name),k(d.state_name),k((d.prompt??"").slice(0,120))]))}`)}),e.get("/api/escalations/:id",s=>{let o=vt(t.dal,te(s,"id"));return o===null?s.notFound():W(s,o,ce)}),e.post("/api/escalations/:id/respond",async s=>{let o=te(s,"id"),i,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let m=await s.req.json();typeof m.input=="string"&&(i=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"&&(i=m.input),(m.done==="true"||m.done===!0)&&(a=!0)}if(i===void 0)return s.text("missing input",400);let c=vt(t.dal,o);if(c===null)return s.notFound();let u=lr(t.dal).find(m=>m.id===o);if(u===void 0)return s.notFound();if(u.kind==="workflow_escalation"){let m=t.dal.resumeEscalation(o,i);if(!m.resumed)return s.json({ok:!1,reason:m.reason},400);Na(t.daemon);let p=lr(t.dal).find(h=>h.id===o);return s.json({ok:!0,attention_id:o,run_id:m.run.id,decision:i,session_status:"escalation_resumed",acknowledged_at:p?.acknowledged_at??null})}if(u.kind!=="interactive_waiting_operator")return s.json({ok:!1,reason:"wrong_kind",kind:u.kind},400);if(u.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 d=t.dal.resumeInteractive(c.step_id,i,a);if(!d.resumed)return s.json({ok:!1,reason:d.reason,step_id:c.step_id},400);let f=t.dal.acknowledgeAttention(o);return Na(t.daemon),s.json({ok:!0,attention_id:o,step_id:c.step_id,session_status:d.session.status,acknowledged_at:f?.acknowledged_at??null})}),e.get("/api/submitted-prs",s=>{let o=s.req.query("pr_url"),i=s.req.query("status"),a=Uh(t.dal,{status:i,pr_url:o});return W(s,a,RP)}),e.get("/api/submitted-prs/:id",s=>{let o=te(s,"id"),i=Wh(t.dal,o);return i===null?s.notFound():W(s,i,$P)}),e.get("/api/sessions",s=>W(s,t.dal.latestSessionSizes(),CE)),e.get("/api/sessions/:team_name/:alias/history",s=>{let o=ms(s.req.param("team_name"));return W(s,t.dal.sessionSizeHistory(o,s.req.param("alias")),CE)}),e.post("/api/sessions/:team_name/:alias/compact",async s=>{let o=ms(s.req.param("team_name"));try{let i=await $h(t.dal,o,s.req.param("alias"));return W(s,i,a=>ME("compacted",a.row))}catch(i){if(i instanceof fs)return s.text(i.message,409);throw i}}),e.post("/api/sessions/:team_name/:alias/refresh",async s=>{let o=ms(s.req.param("team_name")),i=await Hc(t.dal,o,s.req.param("alias"));return W(s,i,a=>ME(`refreshed ${a.sessionid}`,a.row))}),e.get("/api/intake/state",s=>W(s,r,DE)),e.post("/api/intake/scan",async s=>(r=await Tn(t.dal),W(s,r,DE))),e.get("/api/stats/run-throughput",s=>W(s,Kh(t.dal),jP)),e.get("/api/daemon/state",s=>W(s,t.daemon?.state??null,LP)),e.post("/api/daemon/cycle",async s=>{if(t.daemon===void 0)return W(s,{disabled:!0},ce);let o=await t.daemon.runCycle();return W(s,{state:t.daemon.state,result:o},ce)}),e.get("/metrics/:project_id",s=>{let o=te(s,"project_id"),i=t.dal.getProject(o);if(i===null)return s.notFound();let a=Yc(t.dal,o),l=zc(t.dal,{project_id:o});return s.html(je(`Metrics \u2014 ${i.name}`,OP(i.name,a,l)))}),e.get("/api/metrics/reviewer/:project_id",s=>{let o=te(s,"project_id");if(t.dal.getProject(o)===null)return s.notFound();let i=Rd(s,"since_days");return s.json(Yc(t.dal,o,i))}),e.get("/api/metrics/tools/:project_id",s=>{let o=te(s,"project_id");if(t.dal.getProject(o)===null)return s.notFound();let i=Rd(s,"since_days");return s.json(zc(t.dal,{project_id:o,since_days:i}))}),e.post("/api/drift/:id/ack",s=>{let o=t.dal.acknowledgeDriftSignal(te(s,"id"));return o===null?s.notFound():s.json({id:o.id,acknowledged_at:o.acknowledged_at})}),e}function jE(t,e,r){let n=Vc(e,te(t,"id"),te(t,"step_id"));return n===null?t.notFound():r(n)}function Na(t){t!==void 0&&t.runCycle().catch(()=>{})}function W(t,e,r,n=200){return FE(t)?n===200?t.html(r(e)):t.html(r(e),400):new Response(JSON.stringify(e),{status:n,headers:{"Content-Type":"application/json; charset=UTF-8"}})}function FE(t){let e=t.req.header("accept")??"";return e.includes("text/html")&&!e.includes("application/json")}function lP(){let t=process.env.LMCTL_WEBUI_DIST;if(t!==void 0)return Ia(`${t}/index.html`)?$d(t):null;let e="src/serve/webui-dist";if(Ia(`${e}/index.html`))return e;let r="dist/serve/webui-dist";if(Ia(`${r}/index.html`))return r;let n=sP(tP(iP(import.meta.url)),"webui-dist");return Ia(`${n}/index.html`)?$d(n):null}function $d(t){if(!nP(t))return t;let e=oP(process.cwd(),t);return e.length===0?".":e}function cP(){return async(t,e)=>{await e(),t.header("Cache-Control","no-store")}}function te(t,e){return Number(t.req.param(e))}function Rd(t,e){let r=t.req.query(e);if(r===void 0)return;let n=Number(r);return Number.isInteger(n)&&n>0?n:void 0}function uP(t){switch(rP(t).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 dP(t){return!!(t.startsWith("text/")||t.startsWith("application/json")||t.startsWith("application/xml"))}async function $n(t){try{let e=await t.req.json();return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:"invalid JSON body"}catch{return"invalid JSON body"}}function fP(t){if(t==null)return null;if(typeof t=="string"){try{let e=JSON.parse(t);if(e!==null&&typeof e=="object"&&!Array.isArray(e))return JSON.stringify(e)}catch{return"error:invalid parameters_override JSON"}return"error:parameters_override must be a JSON object"}return typeof t=="object"&&!Array.isArray(t)?JSON.stringify(t):"error:parameters_override must be a JSON object"}function LE(t,e){if(t===void 0||t.length===0)return;let r=t.split(",").map(n=>n.trim()).filter(n=>n.length>0);if(r.length!==0){for(let n of r)if(!e.includes(n))return`invalid value: ${n}`;return r}}function pP(t){if(t!=null)return typeof t=="string"&&UE.includes(t)?t:{error:`invalid severity: ${String(t)}`}}function hP(t){if(t==null)return null;if(typeof t=="string")try{let e=JSON.parse(t);return Array.isArray(e)&&e.every(r=>typeof r=="string")?JSON.stringify(e):"error:labels must be a JSON string array"}catch{return"error:invalid labels JSON"}return Array.isArray(t)&&t.every(e=>typeof e=="string")?JSON.stringify(t):"error:labels must be a JSON string array"}function _P(t){return`<h1>Status</h1><div class="grid">
1966
+ `))),e.post("/login",async s=>{let o=await s.req.parseBody(),i=typeof o.token=="string"?o.token:"";return Rg(i)?(Fu(s,i),s.redirect("/",302)):s.html(Le("Login","<p>Invalid token</p>"),401)}),e.post("/logout",s=>($g(s),s.redirect("/login",302))),xw(e,{dal:t.dal}),SE(e,{dal:t.dal}),Jw(e,{dal:t.dal}),rE(e,{terminalSessionManager:t.terminalSessionManager}),lE(e,{persistentSessionManager:t.persistentSessionManager}),e.post("/api/teams/:team_name/refresh",async s=>{let o=ps(s.req.param("team_name")),i=t.dal.findTeamByName(o);if(i===null)return s.notFound();let a=[],c=t.dal.db.transaction(()=>{let f=t.dal.listTeamMembers(i.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)t.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 u=[],d=[];for(let f of a)try{await Hc(t.dal,o,f.alias),t.dal.setMemberState(f.id,"idle",null),u.push(f.alias)}catch(m){let p=m instanceof Error?m.message:String(m);t.dal.setMemberState(f.id,"attention_needed",`refresh failed: ${p}`),d.push({alias:f.alias,error:p})}return W(s,{team:o,seeded:u,failed:d},f=>`<p>refreshed team ${k(f.team)}: seeded [${f.seeded.map(m=>k(m)).join(", ")}]${f.failed.length>0?` failed [${f.failed.map(m=>`${k(m.alias)}: ${k(m.error)}`).join(", ")}]`:""}</p>`)}),Pg(e,{dal:t.dal}),Jg(e,{dal:t.dal}),e.get("/api/status",s=>W(s,Zo(t.dal),_P)),e.get("/api/projects",s=>W(s,Qo(t.dal),gP)),e.get("/api/teams",s=>W(s,Ph(t.dal),EP)),e.get("/api/workflows",s=>W(s,ei(t.dal),TP)),e.get("/api/workflows/verify",s=>{let o=fw();return s.req.header("accept")?.includes("text/plain")?s.text(pw(o)):s.json(o)}),e.get("/api/jobs",s=>W(s,Fh(t.dal,{status:s.req.query("status")}),bP)),e.post("/api/uploads",s=>RE(s,t.dal)),e.get("/api/jobs/:id",s=>{let o=ti(t.dal,te(s,"id"));return o===null?s.notFound():W(s,o,ce)}),e.post("/api/jobs",async s=>{let o;try{o=await s.req.json()}catch{return s.text("invalid JSON body",400)}let i=null;if(typeof o.project_id=="number")i=o.project_id;else if(typeof o.project=="string"){let f=t.dal.findProjectByName(o.project);if(f===null)return s.text(`project not found: ${o.project}`,404);i=f.id}else{let f=t.dal.listProjects();f.length===1&&(i=f[0].id)}if(i===null)return s.text("missing project or project_id",400);let a=typeof o.workflow_id_override=="number"?o.workflow_id_override:null;if(a===null&&typeof o.workflow=="string"){let f=t.dal.getWorkflowByName(o.workflow);if(f===null)return s.text(`workflow not found: ${o.workflow}`,404);a=f.id}let l=typeof o.source=="string"?o.source:"manual",c=o.payload,u=c==null?null:typeof c=="string"?c:JSON.stringify(c),d=t.dal.enqueueJob({project_id:i,workflow_id_override:a,source:l,source_ref:typeof o.source_ref=="string"?o.source_ref:null,payload:u,priority:typeof o.priority=="number"?o.priority:0,dedupe_key:typeof o.dedupe_key=="string"?o.dedupe_key:null});return W(s,d,ce)}),e.post("/api/jobs/:id/run",async s=>{let{runJobById:o}=await Promise.resolve().then(()=>(Fs(),kw)),i=ti(t.dal,te(s,"id"));if(i===null)return s.notFound();let a=await o({dal:t.dal,worker_id:`api-job-run-${process.pid}-${Date.now()}`,job_id:i.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)}),e.get("/api/workflows/:name",s=>{let o=t.dal.getWorkflowByName(s.req.param("name"));return o===null?s.notFound():W(s,o,ce)}),e.get("/api/projects/:name/workflows",s=>{let o=t.dal.findProjectByName(s.req.param("name"));return o===null?s.notFound():W(s,t.dal.listProjectWorkflows(o.id),yP)}),e.post("/api/projects/:name/workflows",async s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=await $n(s);if(typeof i=="string")return s.text(i,400);let a=typeof i.workflow=="string"?i.workflow:null,l=typeof i.workflow_id=="number"?i.workflow_id:null,c=l!==null?t.dal.getWorkflow(l):a!==null?t.dal.getWorkflowByName(a):null;if(c===null)return s.text("workflow not found",404);let u=typeof i.condition=="string"&&i.condition.length>0?i.condition:null;if(u!==null)try{fr(u)}catch{return s.text("invalid condition",400)}let d=fP(i.parameters_override??i.params);if(typeof d=="string"&&d.startsWith("error:"))return s.text(d.slice(6),400);let f=typeof i.priority=="number"&&Number.isInteger(i.priority)?i.priority:100,m=t.dal.insertProjectWorkflow({project_id:o.id,workflow_id:c.id,condition:u,parameters_override:d,priority:f});return W(s,m,ce)}),e.get("/api/projects/workflows/:id",s=>{let o=t.dal.getProjectWorkflow(te(s,"id"));return o===null?s.notFound():W(s,o,ce)}),e.delete("/api/projects/workflows/:id",s=>t.dal.removeProjectWorkflow(te(s,"id"))?W(s,{removed:!0},ce):s.notFound()),e.post("/api/projects/workflows/:id/enable",s=>{let o=t.dal.setProjectWorkflowEnabled(te(s,"id"),!0);return o===null?s.notFound():W(s,o,ce)}),e.post("/api/projects/workflows/:id/disable",s=>{let o=t.dal.setProjectWorkflowEnabled(te(s,"id"),!1);return o===null?s.notFound():W(s,o,ce)}),e.get("/api/projects/:name/issues",s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=jE(s.req.query("status"),mP);if(typeof i=="string")return s.text(i,400);let a=jE(s.req.query("severity"),UE);return typeof a=="string"?s.text(a,400):W(s,t.dal.listIssues(o.id,{...i!==void 0?{status:i}:{},...a!==void 0?{severity:a}:{},...s.req.query("ai_test_path")!==void 0?{ai_test_path:s.req.query("ai_test_path")}:{}}),wP)}),e.post("/api/projects/:name/issues",async s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=await $n(s);if(typeof i=="string")return s.text(i,400);let a=typeof i.title=="string"&&i.title.trim().length>0?i.title:null,l=typeof i.body=="string"?i.body:null;if(a===null||l===null)return s.text("missing title or body",400);let c=pP(i.severity);if(typeof c=="object")return s.text(c.error,400);let u=hP(i.labels);if(typeof u=="string"&&u.startsWith("error:"))return s.text(u.slice(6),400);let d=t.dal.createIssue({project_id:o.id,title:a,body:l,...c!==void 0?{severity:c}:{},labels:u,ai_test_path:typeof i.ai_test_path=="string"?i.ai_test_path:null,source_run_id:typeof i.source_run_id=="number"?i.source_run_id:null});return W(s,d,ce)}),e.get("/api/issues/:id",s=>{let o=t.dal.getIssue(te(s,"id"));return o===null?s.notFound():W(s,o,ce)}),e.post("/api/issues/:id/claim",async s=>{let o=te(s,"id"),i=t.dal.getIssue(o);if(i===null)return s.notFound();let a=await $n(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=t.dal.claimIssue(o,l);return c===null?s.json({error:`issue ${o} is not in a claimable state (status=${i.status})`},400):W(s,c,ce)}),e.post("/api/projects/:name/issues/claim-next",async s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.json({error:"project_not_found"},404);let i=await $n(s);if(typeof i=="string")return s.json({error:i},400);let a=typeof i.assigned_run_id=="number"?i.assigned_run_id:null;if(a===null)return s.json({error:"missing assigned_run_id"},400);let l=t.dal.claimNextIssue(o.id,a);return l===null?s.json({status:"queue_empty"},404):W(s,l,ce)}),e.post("/api/issues/:id/close",async s=>{let o=t.dal.getIssue(te(s,"id"));if(o===null)return s.notFound();let i=await $n(s);if(typeof i=="string")return s.json({error:i},400);let a=typeof i.closed_run_id=="number"?i.closed_run_id:o.assigned_run_id;if(a===null)return s.json({error:"missing closed_run_id"},400);try{return W(s,t.dal.closeIssue(te(s,"id"),a,typeof i.commit_hash=="string"?i.commit_hash:null),ce)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),e.post("/api/issues/:id/reopen",async s=>{let o=t.dal.getIssue(te(s,"id"));if(o===null)return s.notFound();let i=await $n(s);if(typeof i=="string")return s.json({error:i},400);let a=typeof i.source_run_id=="number"?i.source_run_id:o.closed_run_id??o.source_run_id;if(a===null)return s.json({error:"missing source_run_id"},400);try{return W(s,t.dal.reopenIssue(te(s,"id"),a),ce)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),e.get("/api/projects/:name",s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=o.name.indexOf("/"),a=i>0?o.name.slice(0,i):null,l=i>0?o.name.slice(i+1):o.name;return W(s,{...o,owner:a,repo:l},ce)}),e.get("/api/runs/:run_id/artifacts",s=>{let o=te(s,"run_id"),i=s.req.query("kind"),a=$r(t.dal,o,i);return W(s,a,ce)}),e.get("/api/runs/:run_id/artifacts/:kind",async s=>{let o=te(s,"run_id"),i=s.req.param("kind"),a=$r(t.dal,o,i);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):W(s,l,ce);if(l.path!==null&&l.path!==void 0){if(c)try{let{readFileSync:u}=await import("node:fs"),d=uP(l.path);if(dP(d)){let h=u(l.path,"utf8");return s.body(h,200,{"Content-Type":d})}let f=u(l.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength),p=eP(l.path);return s.body(m,200,{"Content-Type":d,"Content-Disposition":`attachment; filename="${p}"`})}catch(u){return s.text(`failed to read artifact path: ${u.message}`,500)}return W(s,l,ce)}return W(s,l,ce)}),e.get("/api/runs",s=>W(s,nn(t.dal,{limit:Rd(s,"limit")??100}),SP)),e.get("/api/runs/:id",s=>{let o=Rr(t.dal,te(s,"id"));return o===null?s.notFound():W(s,o,kP)}),e.get("/api/runs/:id/where",s=>{let o=sn(t.dal,te(s,"id"));return o===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(ni(o)):s.json(o)}),e.get("/api/runs/:id/timeline",s=>{let o=si(t.dal,te(s,"id"));return o===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(oi(o)):s.json(o)}),e.post("/api/runs/:id/resume",async s=>{let o=s.req.query("outcome");if(o===void 0||o.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&&(o=c)}}if(o===void 0||o.length===0)return s.text("missing outcome",400);let i=t.dal.resumeRun(te(s,"id"),o);return!i.resumed&&i.reason==="run_not_found"?s.notFound():i.resumed?(Na(t.daemon),W(s,i,OE)):W(s,i,OE,400)}),e.post("/api/interactive/:step_id/respond",async s=>{let o=te(s,"step_id"),i,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let u=await s.req.json();typeof u.input=="string"&&(i=u.input),u.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let u=await s.req.parseBody().catch(()=>({}));typeof u.input=="string"&&(i=u.input),(u.done==="true"||u.done===!0)&&(a=!0)}if(i===void 0)return s.text("missing input",400);let c=t.dal.resumeInteractive(o,i,a);return!c.resumed&&c.reason==="not_found"?s.notFound():c.resumed?(Na(t.daemon),s.json({resumed:!0,session_status:c.session.status})):s.json({resumed:!1,reason:c.reason},400)}),e.get("/api/runs/:id/steps/:step_id",s=>LE(s,t.dal,o=>W(s,o,IP))),e.get("/api/runs/:id/steps/:step_id/transcript",s=>{let o=Hh(t.dal,te(s,"id"),te(s,"step_id"));return o===null?s.notFound():FE(s)?s.html(`<pre>${k(o)}</pre>`):s.req.header("accept")?.includes("text/plain")?s.text(o):s.json({transcript:o})}),e.get("/api/runs/:id/steps/:step_id/messages",s=>LE(s,t.dal,o=>{let i=dE(o);return W(s,i,a=>pe(["role","text"],a.map(l=>[k(l.role),k(l.text)])))})),e.get("/api/external-objects",s=>W(s,qh(t.dal,{type:s.req.query("type")}),NP)),e.get("/api/external-signals",s=>W(s,Jh(t.dal,{unhandled:s.req.query("unhandled")==="true"}),xP)),e.get("/api/attentions",s=>W(s,lr(t.dal,{unacked:s.req.query("unacked")==="true"}),AP)),e.post("/api/attentions/:id/ack",s=>{let o=t.dal.acknowledgeAttention(te(s,"id"));return o===null?s.notFound():W(s,o,i=>`<p>acknowledged attention ${k(i.id)}</p>`)}),e.get("/api/escalations",s=>{let o=s.req.query("project"),i=s.req.query("all")==="true",a=s.req.query("since"),l={all:i};o!==void 0&&(l.project=o),a!==void 0&&(l.since=a);let c=ri(t.dal,l);return W(s,c,u=>`<h1>Escalations</h1>${pe(["attention_id","project","run","workflow","state","prompt"],u.map(d=>[k(d.attention_id),k(d.project),k(d.run_id),k(d.workflow_name),k(d.state_name),k((d.prompt??"").slice(0,120))]))}`)}),e.get("/api/escalations/:id",s=>{let o=vt(t.dal,te(s,"id"));return o===null?s.notFound():W(s,o,ce)}),e.post("/api/escalations/:id/respond",async s=>{let o=te(s,"id"),i,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let m=await s.req.json();typeof m.input=="string"&&(i=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"&&(i=m.input),(m.done==="true"||m.done===!0)&&(a=!0)}if(i===void 0)return s.text("missing input",400);let c=vt(t.dal,o);if(c===null)return s.notFound();let u=lr(t.dal).find(m=>m.id===o);if(u===void 0)return s.notFound();if(u.kind==="workflow_escalation"){let m=t.dal.resumeEscalation(o,i);if(!m.resumed)return s.json({ok:!1,reason:m.reason},400);Na(t.daemon);let p=lr(t.dal).find(h=>h.id===o);return s.json({ok:!0,attention_id:o,run_id:m.run.id,decision:i,session_status:"escalation_resumed",acknowledged_at:p?.acknowledged_at??null})}if(u.kind!=="interactive_waiting_operator")return s.json({ok:!1,reason:"wrong_kind",kind:u.kind},400);if(u.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 d=t.dal.resumeInteractive(c.step_id,i,a);if(!d.resumed)return s.json({ok:!1,reason:d.reason,step_id:c.step_id},400);let f=t.dal.acknowledgeAttention(o);return Na(t.daemon),s.json({ok:!0,attention_id:o,step_id:c.step_id,session_status:d.session.status,acknowledged_at:f?.acknowledged_at??null})}),e.get("/api/submitted-prs",s=>{let o=s.req.query("pr_url"),i=s.req.query("status"),a=Uh(t.dal,{status:i,pr_url:o});return W(s,a,RP)}),e.get("/api/submitted-prs/:id",s=>{let o=te(s,"id"),i=Wh(t.dal,o);return i===null?s.notFound():W(s,i,$P)}),e.get("/api/sessions",s=>W(s,t.dal.latestSessionSizes(),CE)),e.get("/api/sessions/:team_name/:alias/history",s=>{let o=ps(s.req.param("team_name"));return W(s,t.dal.sessionSizeHistory(o,s.req.param("alias")),CE)}),e.post("/api/sessions/:team_name/:alias/compact",async s=>{let o=ps(s.req.param("team_name"));try{let i=await $h(t.dal,o,s.req.param("alias"));return W(s,i,a=>ME("compacted",a.row))}catch(i){if(i instanceof ms)return s.text(i.message,409);throw i}}),e.post("/api/sessions/:team_name/:alias/refresh",async s=>{let o=ps(s.req.param("team_name")),i=await Hc(t.dal,o,s.req.param("alias"));return W(s,i,a=>ME(`refreshed ${a.sessionid}`,a.row))}),e.get("/api/intake/state",s=>W(s,r,DE)),e.post("/api/intake/scan",async s=>(r=await Tn(t.dal),W(s,r,DE))),e.get("/api/stats/run-throughput",s=>W(s,Kh(t.dal),LP)),e.get("/api/daemon/state",s=>W(s,t.daemon?.state??null,jP)),e.post("/api/daemon/cycle",async s=>{if(t.daemon===void 0)return W(s,{disabled:!0},ce);let o=await t.daemon.runCycle();return W(s,{state:t.daemon.state,result:o},ce)}),e.get("/metrics/:project_id",s=>{let o=te(s,"project_id"),i=t.dal.getProject(o);if(i===null)return s.notFound();let a=Yc(t.dal,o),l=zc(t.dal,{project_id:o});return s.html(Le(`Metrics \u2014 ${i.name}`,OP(i.name,a,l)))}),e.get("/api/metrics/reviewer/:project_id",s=>{let o=te(s,"project_id");if(t.dal.getProject(o)===null)return s.notFound();let i=Rd(s,"since_days");return s.json(Yc(t.dal,o,i))}),e.get("/api/metrics/tools/:project_id",s=>{let o=te(s,"project_id");if(t.dal.getProject(o)===null)return s.notFound();let i=Rd(s,"since_days");return s.json(zc(t.dal,{project_id:o,since_days:i}))}),e.post("/api/drift/:id/ack",s=>{let o=t.dal.acknowledgeDriftSignal(te(s,"id"));return o===null?s.notFound():s.json({id:o.id,acknowledged_at:o.acknowledged_at})}),e}function LE(t,e,r){let n=Vc(e,te(t,"id"),te(t,"step_id"));return n===null?t.notFound():r(n)}function Na(t){t!==void 0&&t.runCycle().catch(()=>{})}function W(t,e,r,n=200){return FE(t)?n===200?t.html(r(e)):t.html(r(e),400):new Response(JSON.stringify(e),{status:n,headers:{"Content-Type":"application/json; charset=UTF-8"}})}function FE(t){let e=t.req.header("accept")??"";return e.includes("text/html")&&!e.includes("application/json")}function lP(){let t=process.env.LMCTL_WEBUI_DIST;if(t!==void 0)return Ia(`${t}/index.html`)?$d(t):null;let e="src/serve/webui-dist";if(Ia(`${e}/index.html`))return e;let r="dist/serve/webui-dist";if(Ia(`${r}/index.html`))return r;let n=sP(tP(iP(import.meta.url)),"webui-dist");return Ia(`${n}/index.html`)?$d(n):null}function $d(t){if(!nP(t))return t;let e=oP(process.cwd(),t);return e.length===0?".":e}function cP(){return async(t,e)=>{await e(),t.header("Cache-Control","no-store")}}function te(t,e){return Number(t.req.param(e))}function Rd(t,e){let r=t.req.query(e);if(r===void 0)return;let n=Number(r);return Number.isInteger(n)&&n>0?n:void 0}function uP(t){switch(rP(t).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 dP(t){return!!(t.startsWith("text/")||t.startsWith("application/json")||t.startsWith("application/xml"))}async function $n(t){try{let e=await t.req.json();return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:"invalid JSON body"}catch{return"invalid JSON body"}}function fP(t){if(t==null)return null;if(typeof t=="string"){try{let e=JSON.parse(t);if(e!==null&&typeof e=="object"&&!Array.isArray(e))return JSON.stringify(e)}catch{return"error:invalid parameters_override JSON"}return"error:parameters_override must be a JSON object"}return typeof t=="object"&&!Array.isArray(t)?JSON.stringify(t):"error:parameters_override must be a JSON object"}function jE(t,e){if(t===void 0||t.length===0)return;let r=t.split(",").map(n=>n.trim()).filter(n=>n.length>0);if(r.length!==0){for(let n of r)if(!e.includes(n))return`invalid value: ${n}`;return r}}function pP(t){if(t!=null)return typeof t=="string"&&UE.includes(t)?t:{error:`invalid severity: ${String(t)}`}}function hP(t){if(t==null)return null;if(typeof t=="string")try{let e=JSON.parse(t);return Array.isArray(e)&&e.every(r=>typeof r=="string")?JSON.stringify(e):"error:labels must be a JSON string array"}catch{return"error:invalid labels JSON"}return Array.isArray(t)&&t.every(e=>typeof e=="string")?JSON.stringify(t):"error:labels must be a JSON string array"}function _P(t){return`<h1>Status</h1><div class="grid">
1967
1967
  <div class="metric"><strong>${t.jobs.queued}</strong><br>queued jobs</div>
1968
1968
  <div class="metric"><strong>${t.jobs.done}</strong><br>done jobs</div>
1969
1969
  <div class="metric"><strong>${t.runs.active}</strong><br>active runs</div>
@@ -1997,7 +1997,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
1997
1997
  <dt>submitted_at</dt><dd>${k(t.submitted_at)}</dd>
1998
1998
  <dt>last_scanned_at</dt><dd>${k(t.last_scanned_at??"\u2014")}</dd>
1999
1999
  <dt>last_known_state</dt><dd>${k(t.last_known_state??"\u2014")}</dd>
2000
- </dl>`}function CE(t){return`<h1>Sessions</h1>${pe(["team","alias","session","input","cache","output","total","observed","actions"],t.map(e=>{let r=Go(e.team_name),n=encodeURIComponent(e.alias);return[k(e.team_name),k(e.alias),k(e.sessionid),k(e.input_tokens),k(e.cache_tokens),k(e.output_tokens),k(e.total_tokens),k(e.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 ME(t,e){return e===null?`<span>${k(t)}</span>`:`<span>${k(t)} ${k(e.team_name)}/${k(e.alias)}</span>`}function jP(t){return`<h1>Run Throughput</h1>${pe(["workflow","terminal","count"],t.map(e=>[k(e.workflow_name),k(e.terminal_state),k(e.count)]))}`}function DE(t){return`<h1>Intake</h1><button hx-post="/api/intake/scan" hx-target="main" hx-swap="innerHTML">Scan now</button>${pe(["project","scanned","new jobs","error"],t.map(e=>[k(e.project_name),k(e.scanned),k(e.new_jobs),k(e.error)]))}`}function LP(t){return`<h1>Daemon</h1>${t===null?"<p>disabled</p>":`${ce(t)}<button hx-post="/api/daemon/cycle" hx-target="main" hx-swap="beforeend">Run cycle now</button>`}`}function OP(t,e,r){let n=e.request_changes_rate,s=n.by_state.map(l=>[k(l.state_name),k(l.total),k(l.request_changes),k(l.rate_pct)]),o=e.step_duration_histogram.map(l=>[k(l.state_name),k(l.lt_5min),k(l.btw_5_15min),k(l.btw_15_60min),k(l.gt_60min),k(l.no_end)]),i=e.retry_counts.map(l=>[k(l.state_name),k(l.retried_runs),k(l.avg_retries)]),a=r.map(l=>[k(l.tool_name),k(l.invocations),k(l.successes),k(l.hit_rate_pct),k(l.avg_latency_ms??"n/a"),k(l.p50_latency_ms??"n/a"),k(l.p95_latency_ms??"n/a")]);return`<h1>Metrics \u2014 ${k(t)}</h1>
2000
+ </dl>`}function CE(t){return`<h1>Sessions</h1>${pe(["team","alias","session","input","cache","output","total","observed","actions"],t.map(e=>{let r=Go(e.team_name),n=encodeURIComponent(e.alias);return[k(e.team_name),k(e.alias),k(e.sessionid),k(e.input_tokens),k(e.cache_tokens),k(e.output_tokens),k(e.total_tokens),k(e.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 ME(t,e){return e===null?`<span>${k(t)}</span>`:`<span>${k(t)} ${k(e.team_name)}/${k(e.alias)}</span>`}function LP(t){return`<h1>Run Throughput</h1>${pe(["workflow","terminal","count"],t.map(e=>[k(e.workflow_name),k(e.terminal_state),k(e.count)]))}`}function DE(t){return`<h1>Intake</h1><button hx-post="/api/intake/scan" hx-target="main" hx-swap="innerHTML">Scan now</button>${pe(["project","scanned","new jobs","error"],t.map(e=>[k(e.project_name),k(e.scanned),k(e.new_jobs),k(e.error)]))}`}function jP(t){return`<h1>Daemon</h1>${t===null?"<p>disabled</p>":`${ce(t)}<button hx-post="/api/daemon/cycle" hx-target="main" hx-swap="beforeend">Run cycle now</button>`}`}function OP(t,e,r){let n=e.request_changes_rate,s=n.by_state.map(l=>[k(l.state_name),k(l.total),k(l.request_changes),k(l.rate_pct)]),o=e.step_duration_histogram.map(l=>[k(l.state_name),k(l.lt_5min),k(l.btw_5_15min),k(l.btw_15_60min),k(l.gt_60min),k(l.no_end)]),i=e.retry_counts.map(l=>[k(l.state_name),k(l.retried_runs),k(l.avg_retries)]),a=r.map(l=>[k(l.tool_name),k(l.invocations),k(l.successes),k(l.hit_rate_pct),k(l.avg_latency_ms??"n/a"),k(l.p50_latency_ms??"n/a"),k(l.p95_latency_ms??"n/a")]);return`<h1>Metrics \u2014 ${k(t)}</h1>
2001
2001
  <h2>Request-changes rate</h2>
2002
2002
  <p>Total: ${k(n.request_changes)} of ${k(n.total)} steps (${k(n.rate_pct)})</p>
2003
2003
  ${pe(["state","total steps","request_changes","rate"],s)}
@@ -2006,28 +2006,28 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
2006
2006
  <h2>Retry counts (runs with &gt;1 attempt per state)</h2>
2007
2007
  ${pe(["state","retried runs","avg attempts"],i)}
2008
2008
  <h2>Tool efficacy</h2>
2009
- ${pe(["tool","invocations","successes (status=ok)","hit rate","avg latency ms","p50 ms","p95 ms"],a)}`}var mP,UE,WE=T(()=>{"use strict";Bi();_n();Lg();Fg();Xg();Bt();Ju();Mw();qw();Yw();nE();cE();fE();IE();Ko();$E();oa();mP=["open","assigned","closed","reopened"],UE=["low","medium","high","critical"]});function CP(t){return Math.floor(t/6e4)*6e4}function MP(t){t.db.transaction(()=>{let e=t.getRollupCursor(),r=t.listSessionEventsSince(e);if(r.length!==0){for(let n of r)DP(t,n);t.setRollupCursor(r[r.length-1].id)}})()}function DP(t,e){let r=Date.now(),n=CP(e.timestamp_ms),s=n+6e4;if(e.kind==="tool_use"){t.addRollupValue({run_id:e.run_id,step_id:e.step_id,metric_kind:"tool_calls_count",value:1,bucket_start_ms:n,bucket_end_ms:s,updated_at:r});return}if(e.kind==="tool_result"){let o={};try{o=JSON.parse(e.payload)}catch{}let i=typeof o.elapsedMs=="number"&&o.elapsedMs>0?o.elapsedMs:0;i>0&&t.addRollupValue({run_id:e.run_id,step_id:e.step_id,metric_kind:"time_in_tool_use_ms",value:i,bucket_start_ms:n,bucket_end_ms:s,updated_at:r});return}if(e.kind==="text"){let o=Buffer.byteLength(e.payload,"utf8");t.addRollupValue({run_id:e.run_id,step_id:e.step_id,metric_kind:"message_delta_bytes",value:o,bucket_start_ms:n,bucket_end_ms:s,updated_at:r})}}function BE(t,e=250){let r=setInterval(()=>{try{MP(t)}catch{}},e);return{stop(){clearInterval(r)}}}var HE=T(()=>{"use strict"});function FP({dal:t}){let e=t.listProjects();for(let r of e){let n=t.query(`SELECT r.id, r.team_id
2009
+ ${pe(["tool","invocations","successes (status=ok)","hit rate","avg latency ms","p50 ms","p95 ms"],a)}`}var mP,UE,WE=T(()=>{"use strict";Bi();_n();jg();Fg();Xg();Bt();Ju();Mw();qw();Yw();nE();cE();fE();IE();Ko();$E();oa();mP=["open","assigned","closed","reopened"],UE=["low","medium","high","critical"]});function CP(t){return Math.floor(t/6e4)*6e4}function MP(t){t.db.transaction(()=>{let e=t.getRollupCursor(),r=t.listSessionEventsSince(e);if(r.length!==0){for(let n of r)DP(t,n);t.setRollupCursor(r[r.length-1].id)}})()}function DP(t,e){let r=Date.now(),n=CP(e.timestamp_ms),s=n+6e4;if(e.kind==="tool_use"){t.addRollupValue({run_id:e.run_id,step_id:e.step_id,metric_kind:"tool_calls_count",value:1,bucket_start_ms:n,bucket_end_ms:s,updated_at:r});return}if(e.kind==="tool_result"){let o={};try{o=JSON.parse(e.payload)}catch{}let i=typeof o.elapsedMs=="number"&&o.elapsedMs>0?o.elapsedMs:0;i>0&&t.addRollupValue({run_id:e.run_id,step_id:e.step_id,metric_kind:"time_in_tool_use_ms",value:i,bucket_start_ms:n,bucket_end_ms:s,updated_at:r});return}if(e.kind==="text"){let o=Buffer.byteLength(e.payload,"utf8");t.addRollupValue({run_id:e.run_id,step_id:e.step_id,metric_kind:"message_delta_bytes",value:o,bucket_start_ms:n,bucket_end_ms:s,updated_at:r})}}function BE(t,e=250){let r=setInterval(()=>{try{MP(t)}catch{}},e);return{stop(){clearInterval(r)}}}var HE=T(()=>{"use strict"});function FP({dal:t}){let e=t.listProjects();for(let r of e){let n=t.query(`SELECT r.id, r.team_id
2010
2010
  FROM run r
2011
2011
  JOIN job j ON j.id = r.job_id
2012
2012
  WHERE j.project_id = ?
2013
2013
  AND r.terminal_state IS NOT NULL
2014
2014
  ORDER BY r.id DESC
2015
- LIMIT ?`,r.id,3);if(n.length<3||!n.every(l=>t.query("SELECT 1 FROM step WHERE run_id = ? AND outcome = ? LIMIT 1",l.id,PP).length>0))continue;let o=n[0].team_id,i=t.listTeamMembers(o),a=i.find(l=>l.alias.toLowerCase().includes("coder"))??i[0];a!==void 0&&(t.hasUnackedDriftSignal(a.id,r.id,qE)||t.insertDriftSignal({team_member_id:a.id,project_id:r.id,signal_kind:qE,severity:"high",description:`3+ consecutive reviewer rejections (request_changes) for project ${r.name}`,detected_at:Date.now(),payload:JSON.stringify({run_ids:n.map(l=>l.id),consecutive_threshold:3})}))}}function JE(t){for(let e of UP)try{e(t)}catch{}}var PP,qE,UP,XE=T(()=>{"use strict";PP="request_changes",qE="reviewer_rejection_rate_high";UP=[FP]});function Us(){let t=process.env.LMCTL_DAEMON_INTERVAL_MS;if(t===void 0||t.trim().length===0)return 5e3;let e=Number(t);return Number.isFinite(e)&&e>0?e:5e3}function GE(t){let e=t.intervalMs??Us(),r=t.runOnceFn??Dr,n={running:t.autoStart!==!1,in_flight:!1,interval_ms:e,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},s=null,o=null,i=null,a=null,l=null;t.startRollupUpdaterFn!==!1&&(l=(t.startRollupUpdaterFn??BE)(t.dal));let c=f=>{n.running&&(s=setTimeout(()=>{d.runCycle().finally(()=>c(e))},f))},u=f=>{n.running&&(o=setTimeout(()=>{a===null&&(a=KE(t.dal,t.monitorSessionActivityFn??qc,e,n).finally(()=>{a=null})),a.finally(()=>u(Jc(t.dal,e)))},f))},d={state:n,runCycle:async()=>(i!==null||(i=WP(t.dal,r,t.collectSessionSizesFn??Rh,t.scanIntakeFn??Tn,t.monitorSessionActivityFn??qc,t.worker_id??"daemon",e,n).finally(()=>{i=null})),i),stop:async()=>{n.running=!1,s!==null&&clearTimeout(s),o!==null&&clearTimeout(o),l?.stop(),i!==null&&await i.catch(()=>{}),a!==null&&await a.catch(()=>{})}};if(n.running){let f=t.firstDelayMs??5e3;c(f),u(f)}return d}async function WP(t,e,r,n,s,o,i,a){a.in_flight=!0,a.last_started_at=new Date().toISOString(),a.last_error=null;let l=[],c=0,u=0,d=[],f=null;try{for(yw({dal:t}),JE({dal:t}),d=await n(t);;){let p=await e({dal:t,worker_id:o,lease_ms:6e5});if(p===null)break;l.push(p)}let m=await r(t);c=m.recorded,u=m.failed,f=await KE(t,s,i,a)}catch(m){a.last_error=m instanceof Error?m.message:String(m);try{t.raiseAttention({kind:"daemon_worker_failed",severity:"error",payload:JSON.stringify({error:a.last_error})})}catch{}}finally{a.in_flight=!1,a.cycles+=1,a.last_jobs_processed=l.length,a.last_session_sizes_recorded=c,a.last_session_size_failures=u,a.last_intake_scanned=d.reduce((m,p)=>m+p.scanned,0),a.last_intake_new_jobs=d.reduce((m,p)=>m+p.new_jobs,0),a.last_intake_failures=d.filter(m=>m.error!==void 0).length,a.last_session_hung_detected=f?.hung_detected??0,a.jobs_processed+=l.length,a.last_finished_at=new Date().toISOString()}return{jobs_processed:l.length,outcomes:l,session_sizes_recorded:c,session_size_failures:u,intake:d,session_monitor:f}}async function KE(t,e,r,n){let s=Jc(t,r),o=Date.now();if(n.last_session_monitor_checked_at!==null){let i=Date.parse(n.last_session_monitor_checked_at);if(Number.isFinite(i)&&o-i<s)return null}n.last_session_monitor_checked_at=new Date(o).toISOString(),n.last_session_monitor_error=null;try{return await e({dal:t,nowMs:o})}catch(i){n.last_session_monitor_error=i instanceof Error?i.message:String(i);try{t.raiseAttention({kind:"daemon_session_monitor_failed",severity:"error",payload:JSON.stringify({error:n.last_session_monitor_error})})}catch{}return null}}var jd=T(()=>{"use strict";Bi();Ps();ld();Ko();HE();XE();Xc()});function VE(t){let e=t.listMembersInState("in_chat");for(let r of e)t.setMemberState(r.id,"attention_needed","daemon_restarted_mid_chat");return e.length}var YE=T(()=>{"use strict"});import{mkdirSync as BP,readFileSync as HP,readdirSync as qP,statSync as JP,writeFileSync as XP}from"node:fs";import{dirname as GP,join as ZE,sep as zE}from"node:path";function xa(t){return{s3:{async send(n){let s=n;switch(s._localfsTag){case QE:return KP(t,s.input);case eT:return VP(t,s.input);case tT:return YP(t,s.input);default:throw new Error("createLocalFsS3Client: unknown command")}}},commands:{ListObjectsV2Command:Cd,GetObjectCommand:Od,PutObjectCommand:Ld}}}function KP(t,e){let r=rT(t,e.Key);return BP(GP(r),{recursive:!0}),XP(r,e.Body),{}}function VP(t,e){let r=rT(t,e.Key),n;try{n=HP(r)}catch(o){throw o.code==="ENOENT"?Object.assign(new Error("NoSuchKey"),{name:"NoSuchKey"}):o}let s=n.toString("utf-8");return{Body:{transformToString:async()=>s}}}function YP(t,e){let r=e.Prefix??"";nT(r);let s=zP(t).sort((u,d)=>u.key<d.key?-1:u.key>d.key?1:0).filter(u=>u.key.startsWith(r)),o=e.ContinuationToken;o!==void 0&&o!==""&&(s=s.filter(u=>u.key>o));let i=typeof e.MaxKeys=="number"&&Number.isFinite(e.MaxKeys)&&e.MaxKeys>0?Math.floor(e.MaxKeys):void 0,a=s,l=!1;i!==void 0&&s.length>i&&(a=s.slice(0,i),l=!0);let c={Contents:a.map(u=>({Key:u.key,LastModified:u.lastModified})),IsTruncated:l};return l&&(c.NextContinuationToken=a[a.length-1].key),c}function rT(t,e){return nT(e),ZE(t,e)}function nT(t){if(t.split("/").includes(".."))throw new Error(`localfs-s3-client: refusing key/prefix with '..': ${t}`)}function zP(t){let e=[],r=(n,s)=>{let o;try{o=qP(n,{withFileTypes:!0})}catch(i){if(i.code==="ENOENT")return;throw i}for(let i of o){let a=s===""?i.name:`${s}/${i.name}`,l=ZE(n,i.name);if(i.isDirectory())r(l,a);else if(i.isFile()){let c=zE==="/"?a:a.split(zE).join("/");e.push({key:c,lastModified:JP(l).mtime})}}};return r(t,""),e}var QE,eT,tT,Ld,Od,Cd,Md=T(()=>{"use strict";QE="localfs-put",eT="localfs-get",tT="localfs-list",Ld=class{input;_localfsTag=QE;constructor(e){this.input=e}},Od=class{input;_localfsTag=eT;constructor(e){this.input=e}},Cd=class{input;_localfsTag=tT;constructor(e){this.input=e}}});function sT(){return{put:0,get:0,list:0}}function Dd(t,e=ZP){return t.put*e.putUsd+t.get*e.getUsd+t.list*e.listUsd}function Pd(t){let e=new Date(t),r=e.getUTCFullYear(),n=String(e.getUTCMonth()+1).padStart(2,"0");return`${r}-${n}`}var ZP,Aa,Fd=T(()=>{"use strict";ZP={putUsd:5e-6,getUsd:40000000000000003e-23,listUsd:5e-6};Aa=class{counts=sT();record(e,r=1){this.counts[e]+=r}peek(){return{...this.counts}}drain(){let e={...this.counts};return this.counts=sT(),e}estimateCostUsd(e){return Dd(this.counts,e)}}});function oT(t){let e=t.now??Date.now,r=t.timers??QP,n=null,s=null;async function o(){let l=e(),c=Pd(l),u=t.meter.drain();(u.put>0||u.get>0||u.list>0)&&t.store.addUsage({user_id:t.userId,device_id:t.deviceId,period:c,put:u.put,get:u.get,list:u.list,updated_at:new Date(l).toISOString()});let d=t.store.loadUsage(t.userId,t.deviceId,c),f=d?{put:d.put_count,get:d.get_count,list:d.list_count}:{put:0,get:0,list:0};if(t.publishOwnRollup!==void 0)try{await t.publishOwnRollup(c,f)}catch(h){t.log?.(`[usage] publish rollup failed: ${h instanceof Error?h.message:String(h)}`)}let m=f;if(t.readUserTotal!==void 0)try{m=await t.readUserTotal(c)}catch(h){t.log?.(`[usage] read user total failed: ${h instanceof Error?h.message:String(h)}`),m=f}let p=Dd(m);if(n!==c&&p>=t.ceilingUsd){n=c,t.log?.(`[usage] quota exceeded period=${c} cost=$${p.toFixed(4)} >= ceiling $${t.ceilingUsd}`);try{t.onQuotaExceeded({period:c,costUsd:p,ceilingUsd:t.ceilingUsd})}catch(h){t.log?.(`[usage] onQuotaExceeded threw: ${h instanceof Error?h.message:String(h)}`)}}}function i(){return s=(s??Promise.resolve()).then(()=>o()).catch(()=>{}),s}let a=r.setInterval(()=>{i()},t.intervalMs);return{stop(){r.clearInterval(a)},flushNow(){return i()},isOverQuota(){return n!==null&&n===Pd(e())}}}var QP,iT=T(()=>{"use strict";Fd();QP={setInterval:(t,e)=>setInterval(t,e),clearInterval:t=>clearInterval(t)}});var Ud=T(()=>{"use strict";fa();pa();pa()});function eF(t){if(typeof t!="object"||t===null||Array.isArray(t))return null;let e=t;if(typeof e.message_id!="string"||e.message_id==="")return null;if(typeof e.reply_to=="string"&&e.reply_to!==""){let s=e.response;if(typeof s!="object"||s===null)return null;let o=s;return typeof o.status!="number"?null:{message_id:e.message_id,reply_to:e.reply_to,response:o}}let r=e.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:e.message_id,request:n}}function tF(t){return t.reply_to!==void 0&&t.response!==void 0}function rF(t){if(typeof t!="object"||t===null)return;let e=t.conversation_id;return typeof e=="string"?e:void 0}function aT(t){let e=t.reason;if(e!==void 0)return e;try{return new DOMException("Aborted","AbortError")}catch{let r=new Error("Aborted");return r.name="AbortError",r}}var Ra,Ws,lT=T(()=>{"use strict";Ud();Ra=class extends Error{name="MailboxFetchStoppedError";code="mailbox_fetch_stopped";constructor(e="MailboxFetchClient stopped before a response arrived"){super(e)}},Ws=class{client;log;now;random;pending=new Map;requestHandler=null;stopped=!1;constructor(e){this.client=e.client,this.log=e.log??(()=>{}),this.now=e.now??Date.now,this.random=e.random??Math.random}onRequest(e){if(this.requestHandler!==null)throw new Error("MailboxFetchClient: onRequest handler already registered");this.requestHandler=e}async fetch(e,r){if(this.stopped)throw new Ra("MailboxFetchClient.fetch after stop()");if(typeof e.path!="string"||e.path==="")throw new Error("MailboxFetchClient.fetch: request.path is required");let n=e.method;if(typeof n!="string"||n==="")throw new Error("MailboxFetchClient.fetch: request.method is required");let s=Vt(this.now(),this.random);if(this.pending.has(s))throw new Error(`MailboxFetchClient.fetch: duplicate message_id=${s}`);let o=r?.conversationId??s,i={message_id:s,request:e};return new Promise((a,l)=>{let c=r?.abortSignal,u;if(c!==void 0){if(c.aborted){l(aT(c));return}u=()=>{this.pending.has(s)&&(this.pending.delete(s),l(aT(c)))},c.addEventListener("abort",u,{once:!0})}this.pending.set(s,{resolve:a,reject:l,...u!==void 0?{abortListener:u}:{},...c!==void 0?{abortSignal:c}:{}}),this.client.putMessage({conversation_id:o,payload:i}).catch(d=>{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(d))})})}async stop(){if(this.stopped)return;this.stopped=!0;let e=Array.from(this.pending.values());this.pending.clear();let r=new Ra;for(let n of e){n.abortListener!==void 0&&n.abortSignal!==void 0&&n.abortSignal.removeEventListener("abort",n.abortListener);try{n.reject(r)}catch{}}}async handleIncoming(e,r){let n=eF(e);if(n===null){this.log("MailboxFetchClient: dropping non-envelope inbound payload");return}if(tF(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??rF(e)??n.message_id,o;try{o=await this.requestHandler(n.request)}catch(l){let c=l instanceof Error?l.message:String(l),u=typeof l.code=="string"?l.code:"INTERNAL_ERROR";o={status:500,headers:{"content-type":"application/json"},body:{error:u,message:c}}}let a={message_id:Vt(this.now(),this.random),reply_to:n.message_id,response:o};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 Wd(t){if(typeof t!="object"||t===null||Array.isArray(t))return!1;let e=t;return!(e.kind!=="terminal"||typeof e.session_id!="string"||e.session_id===""||e.direction!=="agent_to_user"&&e.direction!=="user_to_agent"||typeof e.data!="string"||typeof e.ts!="number")}var cT=T(()=>{"use strict"});function Bd(t){if(typeof t!="object"||t===null||Array.isArray(t))return!1;let e=t;if(e.kind!=="provider"||typeof e.session_id!="string"||e.session_id===""||e.direction!=="agent_to_user"&&e.direction!=="user_to_agent"||typeof e.ts!="number")return!1;if(e.direction==="agent_to_user"){if(!Array.isArray(e.events))return!1;for(let r of e.events)if(typeof r!="object"||r===null||Array.isArray(r)||typeof r.event_type!="string")return!1}else if(typeof e.user_input!="string")return!1;return!0}var uT=T(()=>{"use strict"});function qd(t){if(typeof t!="object"||t===null||Array.isArray(t))return!1;let e=t;if(e.kind!=="daemon_event"||typeof e.event!="string"||e.event===""||typeof e.ts!="number")return!1;if(e.event==="workflows"){if(!Array.isArray(e.workflows))return!1;for(let r of e.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(e.event==="chat_log"){if(typeof e.entry!="object"||e.entry===null||Array.isArray(e.entry))return!1;let r=e.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 Hd,dT=T(()=>{"use strict";Hd="daemon:events"});function mT(t){return{kind:"prompt",prompt_id:t.prompt_id??Vt(t.now?.()??Date.now(),t.random??Math.random),root_teamfile:t.root_teamfile,text:t.text}}function Jd(t){if(t===null||typeof t!="object")return!1;let e=t;return e.kind==="prompt"&&typeof e.prompt_id=="string"&&e.prompt_id.length>0&&typeof e.root_teamfile=="string"&&e.root_teamfile.length>0&&typeof e.text=="string"}var fT,Xd=T(()=>{"use strict";Ud();fT="prompt:root"});function Bs(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(hT(e[1]));return typeof r.sub=="string"&&r.sub!==""?r.sub:null}catch{return null}}function nF(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(hT(e[1]));return typeof r.exp=="number"&&Number.isFinite(r.exp)?r.exp:null}catch{return null}}function pT(t,e=60){if(typeof t!="string"||t==="")return!0;let r=nF(t);return r===null?!0:Date.now()/1e3>=r-e}function hT(t){let e=t.replace(/-/g,"+").replace(/_/g,"/"),r=e.padEnd(Math.ceil(e.length/4)*4,"="),n=globalThis.Buffer;return n!==void 0?n.from(r,"base64").toString("utf8"):atob(r)}var Gd=T(()=>{"use strict"});async function $a(t){let e=t.fetchImpl??fetch,r=`https://cognito-idp.${t.region}.amazonaws.com/`,n=await e(r,{method:"POST",headers:{"content-type":"application/x-amz-json-1.1","x-amz-target":sF},body:JSON.stringify({AuthFlow:"REFRESH_TOKEN_AUTH",ClientId:t.clientId,AuthParameters:{REFRESH_TOKEN:t.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 i=JSON.parse(s).AuthenticationResult,a=i?.IdToken;if(typeof a!="string"||a==="")throw new Error("cognito_refresh_no_id_token: InitiateAuth returned no IdToken");return{idToken:a,...typeof i?.AccessToken=="string"&&i.AccessToken!==""?{accessToken:i.AccessToken}:{},...typeof i?.ExpiresIn=="number"&&Number.isFinite(i.ExpiresIn)?{expiresAt:Date.now()+i.ExpiresIn*1e3}:{}}}var sF,Kd=T(()=>{"use strict";sF="AWSCognitoIdentityProviderService.InitiateAuth"});import{chmodSync as _T,mkdirSync as gT,readFileSync as yT,writeFileSync as wT}from"node:fs";import{homedir as ET}from"node:os";import{dirname as TT,join as bT}from"node:path";function Hs(){return process.env.LMCTL_DEVICE_AUTH_PATH??bT(ET(),".lmctl","device-auth.json")}function ST(){return process.env.LMCTL_TOKEN_PATH??bT(ET(),".lmctl","cli-tokens.json")}function Vd(t=Hs()){try{let e=JSON.parse(yT(t,"utf8"));return typeof e.userId!="string"||e.userId===""||typeof e.refreshToken!="string"||e.refreshToken===""?null:{userId:e.userId,refreshToken:e.refreshToken}}catch{return null}}function kT(t,e=Hs()){gT(TT(e),{recursive:!0,mode:448}),wT(e,JSON.stringify(t,null,2));try{_T(e,384)}catch{}}function Yd(t,e=ST()){let r={};try{r=JSON.parse(yT(e,"utf8"))}catch{}let n={...r.cognito??{}};n.idToken=t.idToken,t.accessToken!==void 0&&(n.accessToken=t.accessToken),t.refreshToken!==void 0&&(n.refreshToken=t.refreshToken),t.expiresAt!==void 0&&(n.expiresAt=t.expiresAt);let s={...r,cognito:n};gT(TT(e),{recursive:!0,mode:448}),wT(e,JSON.stringify(s,null,2));try{_T(e,384)}catch{}}async function vT(t){let e=t.deviceAuthPath??Hs(),r=Vd(e);if(r===null)throw new Error("device_auth_not_found: no ~/.lmctl/device-auth.json; run `lmctl device login` first");let n=await $a({region:t.region,clientId:t.clientId,refreshToken:r.refreshToken,...t.fetchImpl!==void 0?{fetchImpl:t.fetchImpl}:{}});return Yd({idToken:n.idToken,...n.accessToken!==void 0?{accessToken:n.accessToken}:{},refreshToken:r.refreshToken,...n.expiresAt!==void 0?{expiresAt:n.expiresAt}:{}},t.cliTokensPath??ST()),{idToken:n.idToken,userId:r.userId}}var zd=T(()=>{"use strict";Kd()});function IT(t){if(t.length===0||!t.startsWith("---"))throw new At("frontmatter must start at line 1 with `---` on its own line");let e=t.split(`
2016
- `);if(e[0]!=="---")throw new At("frontmatter must start at line 1 with `---` on its own line");let r={},n=-1;for(let i=1;i<e.length;i++){let a=e[i];if(a==="---"){n=i;break}if(a.trim()==="")continue;let l=a.match(/^([a-zA-Z][a-zA-Z0-9_-]*)\s*:\s*(.*)$/);if(!l)throw new At(`malformed frontmatter line ${i+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let c=l[1],u=l[2].trim();if(!oF.has(c))throw new At(`unknown frontmatter key "${c}" \u2014 allowed keys: ${ja.join(", ")}`);r[c]=u}if(n===-1)throw new At("frontmatter not closed (missing trailing `---` on its own line)");for(let i of ja)if(r[i]===void 0)throw new At(`missing required frontmatter key "${i}" \u2014 required: ${ja.join(", ")}`);let s=0;for(let i=0;i<=n;i++)s+=e[i].length+1;s>t.length&&(s=t.length);let o=r.members.split(",").map(i=>i.trim()).filter(Boolean);return{title:r.title,description:r.description,members:o,bodyOffset:s}}var ja,oF,At,NT=T(()=>{"use strict";ja=["title","description","members"],oF=new Set(ja),At=class extends Error{constructor(e){super(e),this.name="FrontmatterError"}}});import{readFileSync as iF,writeFileSync as z6,renameSync as Z6,existsSync as AT}from"node:fs";import{basename as aF,resolve as jn,dirname as Zd}from"node:path";function cF(t){let e={},r=/(\w+)=(?:"([^"]*)"|([\S]*))/g,n;for(;(n=r.exec(t))!==null;){let s=n[1],o=n[2]!==void 0?n[2]:n[3];e[s]=o}return e}function uF(t){return/^\s*_MEMBER_\s+\S/.test(t)}function dF(t){return/^\s*_SESSION_\s+\S/.test(t)}function fF(t){return/^\s*_SKILL_(?:\s|$)/.test(t)}function La(t){let e=aF(t);return e.endsWith(".lmctl")?e.slice(0,-6):e}function Pe(t){let e=iF(t,"utf-8"),r=Zd(jn(t)),n=ef(e,La(t),{baseDir:r,sourcePath:jn(t)});for(let s of n.members)s.sessiondir&&!s.sessiondir.startsWith("/")&&(s.sessiondir=jn(r,s.sessiondir));return n}function ef(t,e,r={}){let n=[],s=[];r.sourcePath,r.baseDir;let o=t;if(o.startsWith("#teamfile:")){let l=o.indexOf(`
2015
+ LIMIT ?`,r.id,3);if(n.length<3||!n.every(l=>t.query("SELECT 1 FROM step WHERE run_id = ? AND outcome = ? LIMIT 1",l.id,PP).length>0))continue;let o=n[0].team_id,i=t.listTeamMembers(o),a=i.find(l=>l.alias.toLowerCase().includes("coder"))??i[0];a!==void 0&&(t.hasUnackedDriftSignal(a.id,r.id,qE)||t.insertDriftSignal({team_member_id:a.id,project_id:r.id,signal_kind:qE,severity:"high",description:`3+ consecutive reviewer rejections (request_changes) for project ${r.name}`,detected_at:Date.now(),payload:JSON.stringify({run_ids:n.map(l=>l.id),consecutive_threshold:3})}))}}function JE(t){for(let e of UP)try{e(t)}catch{}}var PP,qE,UP,XE=T(()=>{"use strict";PP="request_changes",qE="reviewer_rejection_rate_high";UP=[FP]});function Ws(){let t=process.env.LMCTL_DAEMON_INTERVAL_MS;if(t===void 0||t.trim().length===0)return 5e3;let e=Number(t);return Number.isFinite(e)&&e>0?e:5e3}function GE(t){let e=t.intervalMs??Ws(),r=t.runOnceFn??Dr,n={running:t.autoStart!==!1,in_flight:!1,interval_ms:e,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},s=null,o=null,i=null,a=null,l=null;t.startRollupUpdaterFn!==!1&&(l=(t.startRollupUpdaterFn??BE)(t.dal));let c=f=>{n.running&&(s=setTimeout(()=>{d.runCycle().finally(()=>c(e))},f))},u=f=>{n.running&&(o=setTimeout(()=>{a===null&&(a=KE(t.dal,t.monitorSessionActivityFn??qc,e,n).finally(()=>{a=null})),a.finally(()=>u(Jc(t.dal,e)))},f))},d={state:n,runCycle:async()=>(i!==null||(i=WP(t.dal,r,t.collectSessionSizesFn??Rh,t.scanIntakeFn??Tn,t.monitorSessionActivityFn??qc,t.worker_id??"daemon",e,n).finally(()=>{i=null})),i),stop:async()=>{n.running=!1,s!==null&&clearTimeout(s),o!==null&&clearTimeout(o),l?.stop(),i!==null&&await i.catch(()=>{}),a!==null&&await a.catch(()=>{})}};if(n.running){let f=t.firstDelayMs??5e3;c(f),u(f)}return d}async function WP(t,e,r,n,s,o,i,a){a.in_flight=!0,a.last_started_at=new Date().toISOString(),a.last_error=null;let l=[],c=0,u=0,d=[],f=null;try{for(yw({dal:t}),JE({dal:t}),d=await n(t);;){let p=await e({dal:t,worker_id:o,lease_ms:6e5});if(p===null)break;l.push(p)}let m=await r(t);c=m.recorded,u=m.failed,f=await KE(t,s,i,a)}catch(m){a.last_error=m instanceof Error?m.message:String(m);try{t.raiseAttention({kind:"daemon_worker_failed",severity:"error",payload:JSON.stringify({error:a.last_error})})}catch{}}finally{a.in_flight=!1,a.cycles+=1,a.last_jobs_processed=l.length,a.last_session_sizes_recorded=c,a.last_session_size_failures=u,a.last_intake_scanned=d.reduce((m,p)=>m+p.scanned,0),a.last_intake_new_jobs=d.reduce((m,p)=>m+p.new_jobs,0),a.last_intake_failures=d.filter(m=>m.error!==void 0).length,a.last_session_hung_detected=f?.hung_detected??0,a.jobs_processed+=l.length,a.last_finished_at=new Date().toISOString()}return{jobs_processed:l.length,outcomes:l,session_sizes_recorded:c,session_size_failures:u,intake:d,session_monitor:f}}async function KE(t,e,r,n){let s=Jc(t,r),o=Date.now();if(n.last_session_monitor_checked_at!==null){let i=Date.parse(n.last_session_monitor_checked_at);if(Number.isFinite(i)&&o-i<s)return null}n.last_session_monitor_checked_at=new Date(o).toISOString(),n.last_session_monitor_error=null;try{return await e({dal:t,nowMs:o})}catch(i){n.last_session_monitor_error=i instanceof Error?i.message:String(i);try{t.raiseAttention({kind:"daemon_session_monitor_failed",severity:"error",payload:JSON.stringify({error:n.last_session_monitor_error})})}catch{}return null}}var Ld=T(()=>{"use strict";Bi();Fs();ld();Ko();HE();XE();Xc()});function VE(t){let e=t.listMembersInState("in_chat");for(let r of e)t.setMemberState(r.id,"attention_needed","daemon_restarted_mid_chat");return e.length}var YE=T(()=>{"use strict"});import{mkdirSync as BP,readFileSync as HP,readdirSync as qP,statSync as JP,writeFileSync as XP}from"node:fs";import{dirname as GP,join as ZE,sep as zE}from"node:path";function xa(t){return{s3:{async send(n){let s=n;switch(s._localfsTag){case QE:return KP(t,s.input);case eT:return VP(t,s.input);case tT:return YP(t,s.input);default:throw new Error("createLocalFsS3Client: unknown command")}}},commands:{ListObjectsV2Command:Cd,GetObjectCommand:Od,PutObjectCommand:jd}}}function KP(t,e){let r=rT(t,e.Key);return BP(GP(r),{recursive:!0}),XP(r,e.Body),{}}function VP(t,e){let r=rT(t,e.Key),n;try{n=HP(r)}catch(o){throw o.code==="ENOENT"?Object.assign(new Error("NoSuchKey"),{name:"NoSuchKey"}):o}let s=n.toString("utf-8");return{Body:{transformToString:async()=>s}}}function YP(t,e){let r=e.Prefix??"";nT(r);let s=zP(t).sort((u,d)=>u.key<d.key?-1:u.key>d.key?1:0).filter(u=>u.key.startsWith(r)),o=e.ContinuationToken;o!==void 0&&o!==""&&(s=s.filter(u=>u.key>o));let i=typeof e.MaxKeys=="number"&&Number.isFinite(e.MaxKeys)&&e.MaxKeys>0?Math.floor(e.MaxKeys):void 0,a=s,l=!1;i!==void 0&&s.length>i&&(a=s.slice(0,i),l=!0);let c={Contents:a.map(u=>({Key:u.key,LastModified:u.lastModified})),IsTruncated:l};return l&&(c.NextContinuationToken=a[a.length-1].key),c}function rT(t,e){return nT(e),ZE(t,e)}function nT(t){if(t.split("/").includes(".."))throw new Error(`localfs-s3-client: refusing key/prefix with '..': ${t}`)}function zP(t){let e=[],r=(n,s)=>{let o;try{o=qP(n,{withFileTypes:!0})}catch(i){if(i.code==="ENOENT")return;throw i}for(let i of o){let a=s===""?i.name:`${s}/${i.name}`,l=ZE(n,i.name);if(i.isDirectory())r(l,a);else if(i.isFile()){let c=zE==="/"?a:a.split(zE).join("/");e.push({key:c,lastModified:JP(l).mtime})}}};return r(t,""),e}var QE,eT,tT,jd,Od,Cd,Md=T(()=>{"use strict";QE="localfs-put",eT="localfs-get",tT="localfs-list",jd=class{input;_localfsTag=QE;constructor(e){this.input=e}},Od=class{input;_localfsTag=eT;constructor(e){this.input=e}},Cd=class{input;_localfsTag=tT;constructor(e){this.input=e}}});function sT(){return{put:0,get:0,list:0}}function Dd(t,e=ZP){return t.put*e.putUsd+t.get*e.getUsd+t.list*e.listUsd}function Pd(t){let e=new Date(t),r=e.getUTCFullYear(),n=String(e.getUTCMonth()+1).padStart(2,"0");return`${r}-${n}`}var ZP,Aa,Fd=T(()=>{"use strict";ZP={putUsd:5e-6,getUsd:40000000000000003e-23,listUsd:5e-6};Aa=class{counts=sT();record(e,r=1){this.counts[e]+=r}peek(){return{...this.counts}}drain(){let e={...this.counts};return this.counts=sT(),e}estimateCostUsd(e){return Dd(this.counts,e)}}});function oT(t){let e=t.now??Date.now,r=t.timers??QP,n=null,s=null;async function o(){let l=e(),c=Pd(l),u=t.meter.drain();(u.put>0||u.get>0||u.list>0)&&t.store.addUsage({user_id:t.userId,device_id:t.deviceId,period:c,put:u.put,get:u.get,list:u.list,updated_at:new Date(l).toISOString()});let d=t.store.loadUsage(t.userId,t.deviceId,c),f=d?{put:d.put_count,get:d.get_count,list:d.list_count}:{put:0,get:0,list:0};if(t.publishOwnRollup!==void 0)try{await t.publishOwnRollup(c,f)}catch(h){t.log?.(`[usage] publish rollup failed: ${h instanceof Error?h.message:String(h)}`)}let m=f;if(t.readUserTotal!==void 0)try{m=await t.readUserTotal(c)}catch(h){t.log?.(`[usage] read user total failed: ${h instanceof Error?h.message:String(h)}`),m=f}let p=Dd(m);if(n!==c&&p>=t.ceilingUsd){n=c,t.log?.(`[usage] quota exceeded period=${c} cost=$${p.toFixed(4)} >= ceiling $${t.ceilingUsd}`);try{t.onQuotaExceeded({period:c,costUsd:p,ceilingUsd:t.ceilingUsd})}catch(h){t.log?.(`[usage] onQuotaExceeded threw: ${h instanceof Error?h.message:String(h)}`)}}}function i(){return s=(s??Promise.resolve()).then(()=>o()).catch(()=>{}),s}let a=r.setInterval(()=>{i()},t.intervalMs);return{stop(){r.clearInterval(a)},flushNow(){return i()},isOverQuota(){return n!==null&&n===Pd(e())}}}var QP,iT=T(()=>{"use strict";Fd();QP={setInterval:(t,e)=>setInterval(t,e),clearInterval:t=>clearInterval(t)}});var Ud=T(()=>{"use strict";fa();pa();pa()});function eF(t){if(typeof t!="object"||t===null||Array.isArray(t))return null;let e=t;if(typeof e.message_id!="string"||e.message_id==="")return null;if(typeof e.reply_to=="string"&&e.reply_to!==""){let s=e.response;if(typeof s!="object"||s===null)return null;let o=s;return typeof o.status!="number"?null:{message_id:e.message_id,reply_to:e.reply_to,response:o}}let r=e.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:e.message_id,request:n}}function tF(t){return t.reply_to!==void 0&&t.response!==void 0}function rF(t){if(typeof t!="object"||t===null)return;let e=t.conversation_id;return typeof e=="string"?e:void 0}function aT(t){let e=t.reason;if(e!==void 0)return e;try{return new DOMException("Aborted","AbortError")}catch{let r=new Error("Aborted");return r.name="AbortError",r}}var Ra,Bs,lT=T(()=>{"use strict";Ud();Ra=class extends Error{name="MailboxFetchStoppedError";code="mailbox_fetch_stopped";constructor(e="MailboxFetchClient stopped before a response arrived"){super(e)}},Bs=class{client;log;now;random;pending=new Map;requestHandler=null;stopped=!1;constructor(e){this.client=e.client,this.log=e.log??(()=>{}),this.now=e.now??Date.now,this.random=e.random??Math.random}onRequest(e){if(this.requestHandler!==null)throw new Error("MailboxFetchClient: onRequest handler already registered");this.requestHandler=e}async fetch(e,r){if(this.stopped)throw new Ra("MailboxFetchClient.fetch after stop()");if(typeof e.path!="string"||e.path==="")throw new Error("MailboxFetchClient.fetch: request.path is required");let n=e.method;if(typeof n!="string"||n==="")throw new Error("MailboxFetchClient.fetch: request.method is required");let s=Vt(this.now(),this.random);if(this.pending.has(s))throw new Error(`MailboxFetchClient.fetch: duplicate message_id=${s}`);let o=r?.conversationId??s,i={message_id:s,request:e};return new Promise((a,l)=>{let c=r?.abortSignal,u;if(c!==void 0){if(c.aborted){l(aT(c));return}u=()=>{this.pending.has(s)&&(this.pending.delete(s),l(aT(c)))},c.addEventListener("abort",u,{once:!0})}this.pending.set(s,{resolve:a,reject:l,...u!==void 0?{abortListener:u}:{},...c!==void 0?{abortSignal:c}:{}}),this.client.putMessage({conversation_id:o,payload:i}).catch(d=>{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(d))})})}async stop(){if(this.stopped)return;this.stopped=!0;let e=Array.from(this.pending.values());this.pending.clear();let r=new Ra;for(let n of e){n.abortListener!==void 0&&n.abortSignal!==void 0&&n.abortSignal.removeEventListener("abort",n.abortListener);try{n.reject(r)}catch{}}}async handleIncoming(e,r){let n=eF(e);if(n===null){this.log("MailboxFetchClient: dropping non-envelope inbound payload");return}if(tF(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??rF(e)??n.message_id,o;try{o=await this.requestHandler(n.request)}catch(l){let c=l instanceof Error?l.message:String(l),u=typeof l.code=="string"?l.code:"INTERNAL_ERROR";o={status:500,headers:{"content-type":"application/json"},body:{error:u,message:c}}}let a={message_id:Vt(this.now(),this.random),reply_to:n.message_id,response:o};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 Wd(t){if(typeof t!="object"||t===null||Array.isArray(t))return!1;let e=t;return!(e.kind!=="terminal"||typeof e.session_id!="string"||e.session_id===""||e.direction!=="agent_to_user"&&e.direction!=="user_to_agent"||typeof e.data!="string"||typeof e.ts!="number")}var cT=T(()=>{"use strict"});function Bd(t){if(typeof t!="object"||t===null||Array.isArray(t))return!1;let e=t;if(e.kind!=="provider"||typeof e.session_id!="string"||e.session_id===""||e.direction!=="agent_to_user"&&e.direction!=="user_to_agent"||typeof e.ts!="number")return!1;if(e.direction==="agent_to_user"){if(!Array.isArray(e.events))return!1;for(let r of e.events)if(typeof r!="object"||r===null||Array.isArray(r)||typeof r.event_type!="string")return!1}else if(typeof e.user_input!="string")return!1;return!0}var uT=T(()=>{"use strict"});function qd(t){if(typeof t!="object"||t===null||Array.isArray(t))return!1;let e=t;if(e.kind!=="daemon_event"||typeof e.event!="string"||e.event===""||typeof e.ts!="number")return!1;if(e.event==="workflows"){if(!Array.isArray(e.workflows))return!1;for(let r of e.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(e.event==="chat_log"){if(typeof e.entry!="object"||e.entry===null||Array.isArray(e.entry))return!1;let r=e.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 Hd,dT=T(()=>{"use strict";Hd="daemon:events"});function mT(t){return{kind:"prompt",prompt_id:t.prompt_id??Vt(t.now?.()??Date.now(),t.random??Math.random),root_teamfile:t.root_teamfile,text:t.text}}function Jd(t){if(t===null||typeof t!="object")return!1;let e=t;return e.kind==="prompt"&&typeof e.prompt_id=="string"&&e.prompt_id.length>0&&typeof e.root_teamfile=="string"&&e.root_teamfile.length>0&&typeof e.text=="string"}var fT,Xd=T(()=>{"use strict";Ud();fT="prompt:root"});function Hs(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(hT(e[1]));return typeof r.sub=="string"&&r.sub!==""?r.sub:null}catch{return null}}function nF(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(hT(e[1]));return typeof r.exp=="number"&&Number.isFinite(r.exp)?r.exp:null}catch{return null}}function pT(t,e=60){if(typeof t!="string"||t==="")return!0;let r=nF(t);return r===null?!0:Date.now()/1e3>=r-e}function hT(t){let e=t.replace(/-/g,"+").replace(/_/g,"/"),r=e.padEnd(Math.ceil(e.length/4)*4,"="),n=globalThis.Buffer;return n!==void 0?n.from(r,"base64").toString("utf8"):atob(r)}var Gd=T(()=>{"use strict"});async function $a(t){let e=t.fetchImpl??fetch,r=`https://cognito-idp.${t.region}.amazonaws.com/`,n=await e(r,{method:"POST",headers:{"content-type":"application/x-amz-json-1.1","x-amz-target":sF},body:JSON.stringify({AuthFlow:"REFRESH_TOKEN_AUTH",ClientId:t.clientId,AuthParameters:{REFRESH_TOKEN:t.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 i=JSON.parse(s).AuthenticationResult,a=i?.IdToken;if(typeof a!="string"||a==="")throw new Error("cognito_refresh_no_id_token: InitiateAuth returned no IdToken");return{idToken:a,...typeof i?.AccessToken=="string"&&i.AccessToken!==""?{accessToken:i.AccessToken}:{},...typeof i?.ExpiresIn=="number"&&Number.isFinite(i.ExpiresIn)?{expiresAt:Date.now()+i.ExpiresIn*1e3}:{}}}var sF,Kd=T(()=>{"use strict";sF="AWSCognitoIdentityProviderService.InitiateAuth"});import{chmodSync as _T,mkdirSync as gT,readFileSync as yT,writeFileSync as wT}from"node:fs";import{homedir as ET}from"node:os";import{dirname as TT,join as bT}from"node:path";function qs(){return process.env.LMCTL_DEVICE_AUTH_PATH??bT(ET(),".lmctl","device-auth.json")}function ST(){return process.env.LMCTL_TOKEN_PATH??bT(ET(),".lmctl","cli-tokens.json")}function Vd(t=qs()){try{let e=JSON.parse(yT(t,"utf8"));return typeof e.userId!="string"||e.userId===""||typeof e.refreshToken!="string"||e.refreshToken===""?null:{userId:e.userId,refreshToken:e.refreshToken}}catch{return null}}function kT(t,e=qs()){gT(TT(e),{recursive:!0,mode:448}),wT(e,JSON.stringify(t,null,2));try{_T(e,384)}catch{}}function Yd(t,e=ST()){let r={};try{r=JSON.parse(yT(e,"utf8"))}catch{}let n={...r.cognito??{}};n.idToken=t.idToken,t.accessToken!==void 0&&(n.accessToken=t.accessToken),t.refreshToken!==void 0&&(n.refreshToken=t.refreshToken),t.expiresAt!==void 0&&(n.expiresAt=t.expiresAt);let s={...r,cognito:n};gT(TT(e),{recursive:!0,mode:448}),wT(e,JSON.stringify(s,null,2));try{_T(e,384)}catch{}}async function vT(t){let e=t.deviceAuthPath??qs(),r=Vd(e);if(r===null)throw new Error("device_auth_not_found: no ~/.lmctl/device-auth.json; run `lmctl device login` first");let n=await $a({region:t.region,clientId:t.clientId,refreshToken:r.refreshToken,...t.fetchImpl!==void 0?{fetchImpl:t.fetchImpl}:{}});return Yd({idToken:n.idToken,...n.accessToken!==void 0?{accessToken:n.accessToken}:{},refreshToken:r.refreshToken,...n.expiresAt!==void 0?{expiresAt:n.expiresAt}:{}},t.cliTokensPath??ST()),{idToken:n.idToken,userId:r.userId}}var zd=T(()=>{"use strict";Kd()});function IT(t){if(t.length===0||!t.startsWith("---"))throw new At("frontmatter must start at line 1 with `---` on its own line");let e=t.split(`
2016
+ `);if(e[0]!=="---")throw new At("frontmatter must start at line 1 with `---` on its own line");let r={},n=-1;for(let i=1;i<e.length;i++){let a=e[i];if(a==="---"){n=i;break}if(a.trim()==="")continue;let l=a.match(/^([a-zA-Z][a-zA-Z0-9_-]*)\s*:\s*(.*)$/);if(!l)throw new At(`malformed frontmatter line ${i+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let c=l[1],u=l[2].trim();if(!oF.has(c))throw new At(`unknown frontmatter key "${c}" \u2014 allowed keys: ${La.join(", ")}`);r[c]=u}if(n===-1)throw new At("frontmatter not closed (missing trailing `---` on its own line)");for(let i of La)if(r[i]===void 0)throw new At(`missing required frontmatter key "${i}" \u2014 required: ${La.join(", ")}`);let s=0;for(let i=0;i<=n;i++)s+=e[i].length+1;s>t.length&&(s=t.length);let o=r.members.split(",").map(i=>i.trim()).filter(Boolean);return{title:r.title,description:r.description,members:o,bodyOffset:s}}var La,oF,At,NT=T(()=>{"use strict";La=["title","description","members"],oF=new Set(La),At=class extends Error{constructor(e){super(e),this.name="FrontmatterError"}}});import{readFileSync as iF,writeFileSync as Q6,renameSync as ez,existsSync as AT}from"node:fs";import{basename as aF,resolve as Ln,dirname as Zd}from"node:path";function cF(t){let e={},r=/(\w+)=(?:"([^"]*)"|([\S]*))/g,n;for(;(n=r.exec(t))!==null;){let s=n[1],o=n[2]!==void 0?n[2]:n[3];e[s]=o}return e}function uF(t){return/^\s*_MEMBER_\s+\S/.test(t)}function dF(t){return/^\s*_SESSION_\s+\S/.test(t)}function fF(t){return/^\s*_SKILL_(?:\s|$)/.test(t)}function ja(t){let e=aF(t);return e.endsWith(".lmctl")?e.slice(0,-6):e}function Pe(t){let e=iF(t,"utf-8"),r=Zd(Ln(t)),n=ef(e,ja(t),{baseDir:r,sourcePath:Ln(t)});for(let s of n.members)s.sessiondir&&!s.sessiondir.startsWith("/")&&(s.sessiondir=Ln(r,s.sessiondir));return n}function ef(t,e,r={}){let n=[],s=[];r.sourcePath,r.baseDir;let o=t;if(o.startsWith("#teamfile:")){let l=o.indexOf(`
2017
2017
  `);o=l>=0?o.slice(l+1):""}let i=null;if(o.startsWith("---"))try{i=IT(o)}catch(l){if(l instanceof At)s.push(`frontmatter: ${l.message}`);else throw l}let a=t.split(`
2018
2018
  `);for(let l=0;l<a.length;l++){let c=a[l],u=l+1;if(dF(c))throw new Error(`line ${u}: _SESSION_ is the legacy prefix. Rename to _MEMBER_. (line: ${c.trim()})`);if(fF(c)||!uF(c))continue;let d=cF(c);for(let p of Object.keys(d))if(!xT.includes(p))throw new Error(`line ${u}: unknown key "${p}" on _MEMBER_ line: ${c.trim()}
2019
- allowed keys: ${xT.join(", ")}`);if(!d.provider&&!d.teamfile){s.push(`line ${u}: member line missing provider (or teamfile): ${c.trim()}`);continue}let m={alias:d.alias||`member${n.length+1}`,provider:d.provider||"",extra:{}};d.sessionid&&(m.session=d.sessionid),Object.prototype.hasOwnProperty.call(d,"sessiondir")&&(m.sessiondir=d.sessiondir),d.teamfile&&(m.teamfile=d.teamfile),d.model&&(m.model=d.model),d.effort&&(m.effort=d.effort),n.push(m)}return{name:e,members:n,rawText:t,parseErrors:s,frontmatter:i}}function tf(t,e){let r=[];for(let o of t.parseErrors)r.push({field:"session",message:o});let n=t.members.filter(o=>o.alias.toLowerCase()===Qd.toLowerCase());n.length>1&&r.push({field:Qd,message:`${n.length} alias=Lead found (max 1)`});let s=new Set;for(let o of t.members){let i=o.alias.toLowerCase();if(s.has(i)&&r.push({field:o.alias,message:`Duplicate alias "${o.alias}" (case-insensitive)`}),s.add(i),o.teamfile){let a=e?jn(e,o.teamfile):jn(o.teamfile);if(!AT(a))r.push({field:o.alias,message:`Teamfile not found: ${a}`});else{let l=Pe(a),c=Rt(l);c?c.session||r.push({field:o.alias,message:`Team at ${o.teamfile} lead has no session ID. Run: lmctl seed`}):r.push({field:o.alias,message:`Team at ${o.teamfile} has no lead session`})}}else lF.has(o.provider)||r.push({field:o.alias,message:`Invalid provider "${o.provider}"`});o.sessiondir!==void 0&&o.sessiondir===""&&r.push({field:o.alias,message:"sessiondir is empty"})}return r}function Rt(t){return t.members.find(e=>e.alias.toLowerCase()===Qd.toLowerCase())}function rf(t,e,r,n={}){let s=n.requireSession??!0;if(!t.teamfile)throw new Error(`Member "${t.alias}" is not a team reference`);let o=jn(e,t.teamfile),i=r??new Set;if(i.has(o))throw new Error(`Circular team reference: ${t.alias} \u2192 ${o} (already visited: ${[...i].join(" \u2192 ")})`);if(i.add(o),!AT(o))throw new Error(`Teamfile not found: ${o} (referenced by alias "${t.alias}")`);let a=Pe(o),l=Rt(a);if(!l)throw new Error(`Team at ${o} has no lead session`);if(l.teamfile)return rf(l,Zd(o),i,n);if(s&&!l.session)throw new Error(`Team at ${o} lead has no session ID. Run: lmctl seed`);return{provider:l.provider,session:l.session??"",sessiondir:l.sessiondir||Zd(o),alias:t.alias,resolvedFrom:o,model:l.model,effort:l.effort}}function Oa(t,e){return t.members.find(r=>r.alias===e)??t.members.find(r=>r.alias.toLowerCase()===e.toLowerCase())}var Qd,lF,xT,Yt=T(()=>{"use strict";NT();Qd="Lead",lF=new Set(["claude","codex","opencode","lmplayer","gemini","copilot","qwen","agy","ClaudeMock"]);xT=["alias","provider","sessionid","sessiondir","teamfile","model","effort"]});import{hostname as mF}from"node:os";function Ln(t,e){let r=new Date().toISOString(),n=new Date(Date.now()-e.ttlMs).toISOString(),s={receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,started_at:r},o=t.getAgentInflight(e.receiver_teamfile,e.receiver_alias),i=o===null||o.holder_pid===null,a=t.tryAcquireAgentInflight(s,{...i?{stale_before:n}:{},force:e.force});if(a.acquired){let c=o===null?null:e.force===!0?"force":o.holder_pid===null&&o.started_at<n?"stale":null;return{acquired:!0,lease:a.current??s,previous:o,reclaimReason:c}}if(!LT(a.current,n))return{acquired:!1,current:a.current};let l=t.tryAcquireAgentInflight(s,a.current.holder_pid===null?{stale_before:n}:{reclaim_observed:{sender_teamfile:a.current.sender_teamfile,sender_alias:a.current.sender_alias,started_at:a.current.started_at,holder_pid:a.current.holder_pid}});return l.acquired?{acquired:!0,lease:l.current??s,previous:a.current,reclaimReason:a.current.holder_pid===null?"stale":"dead-pid"}:{acquired:!1,current:l.current}}function jT(t,e,r){let n=t.getTerminalLock(e,r);if(n!==null&&pF(n))return!0;let s=t.getAgentInflight(e,r);if(s===null)return!1;let o=new Date(Date.now()-hF()).toISOString();return!LT(s,o)}function pF(t){if(t.holder_host===mF())return Xr(t.holder_pid);let e=Date.parse(t.last_heartbeat);return Number.isFinite(e)?Date.now()-e<=_F():!1}function LT(t,e){return t.holder_pid===null?t.started_at<e:!Xr(t.holder_pid)}function hF(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return RT;let r=Number(e);return!Number.isFinite(r)||r<=0?RT:r}function _F(t=process.env){let e=t.LMCTL_TERMINAL_LOCK_STALE_MS;if(e===void 0||e.trim()==="")return $T;let r=Number(e);return!Number.isFinite(r)||r<=0?$T:r}var RT,$T,Ca=T(()=>{"use strict";Ll();RT=8*60*60*1e3,$T=12e4});import{existsSync as gF,realpathSync as yF}from"node:fs";import{dirname as wF}from"node:path";function nf(t){EF(t).catch(e=>{t.log?.(`[mailbox] prompt trigger failed: ${e instanceof Error?e.message:String(e)}`)})}async function EF(t){let e=t.payload.root_teamfile;try{e=yF(t.payload.root_teamfile)}catch(s){let o=`prompt root missing/unreadable: ${t.payload.root_teamfile}: ${s instanceof Error?s.message:String(s)}`;return await On(t.store,{rootTeamfile:t.payload.root_teamfile,receiverTeamfile:t.payload.root_teamfile,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:o,log:t.log}),t.log?.(`[mailbox] ${o}`),{status:"error",response:null,error_detail:o}}if(t.store.getRootTeam(e)===null){let s=`prompt root is not registered: ${e}`;return await On(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:s,log:t.log}),t.log?.(`[mailbox] ${s}`),{status:"error",response:null,error_detail:s}}let r=TF(e);if("error"in r)return await On(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:r.error,log:t.log}),t.log?.(`[mailbox] ${r.error}`),{status:"error",response:null,error_detail:r.error};let n=Ln(t.store,{receiver_teamfile:e,receiver_alias:r.alias,sender_teamfile:`prompt:${t.payload.prompt_id}`,sender_alias:"operator",ttlMs:kF(t.env??process.env)});if(!n.acquired){let s=SF(r.alias,n.current);return await On(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:null,status:"error",error_detail:s,log:t.log}),t.log?.(`[mailbox] prompt rejected: ${s}`),{status:"error",response:null,error_detail:s}}try{let o=await(t.chat??Wt)({provider:r.provider,sessionId:r.sessionid,cwd:r.sessiondir,prompt:t.payload.text,env:t.env??process.env,alias:r.alias,permissionMode:"yolo",...t.timeoutMs!==void 0?{timeoutMs:t.timeoutMs}:{}}),i=o.status==="stalled",a=!i&&o.text.trim()==="",l=i?`provider stalled${o.stalledAfterMs!==void 0?` after ${o.stalledAfterMs}ms`:""}`:a?"provider returned empty response":null,c=i||a?"error":"ok";return await On(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:c==="error"?null:o.text,status:c,error_detail:l,log:t.log}),{status:c,response:c==="error"?null:o.text,error_detail:l}}catch(s){let o=s instanceof Error?s.message:String(s);return await On(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:null,status:"error",error_detail:o,log:t.log}),t.log?.(`[mailbox] prompt provider error: ${o}`),{status:"error",response:null,error_detail:o}}finally{try{t.store.releaseAgentInflight(n.lease)}catch(s){t.log?.(`[mailbox] failed to release prompt in-flight slot: ${s instanceof Error?s.message:String(s)}`)}}}function TF(t){if(!gF(t))return{error:`prompt root missing/unreadable: ${t}`};let e=Pe(t);if(e.parseErrors.length>0)return{error:`prompt root parse error: ${e.parseErrors.join("; ")}`};let r=Rt(e);return r===void 0?{error:`prompt root has no Lead: ${t}`}:r.session===void 0||r.session.trim()===""?{error:`prompt root Lead is unseeded: ${t}`}:{alias:r.alias,provider:r.provider,sessionid:r.session,sessiondir:r.sessiondir??wF(t)}}async function On(t,e){let r=MT(e.message),n=e.response===null?null:MT(e.response);try{t.insertTeamChatLog({root_teamfile:e.rootTeamfile,sender_teamfile:e.rootTeamfile,sender_alias:"operator",receiver_teamfile:e.receiverTeamfile,receiver_alias:e.receiverAlias,message:r.text,response:n?.text??null,origin:"unknown",status:e.status,error_detail:e.error_detail,truncated:r.truncated||n?.truncated?1:0,created_at:new Date().toISOString()})}catch(s){e.log?.(`[mailbox] warning: failed to record prompt chat log: ${s instanceof Error?s.message:String(s)}`)}}function MT(t){return t.length<=OT?{text:t,truncated:!1}:{text:t.slice(0,OT),truncated:!0}}function bF(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}function SF(t,e){return e.sender_teamfile.startsWith("prompt:")?`${t} is busy servicing another prompt since ${e.started_at}`:bF(t,e)}function kF(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return CT;let r=Number(e);return!Number.isFinite(r)||r<=0?CT:r}var OT,CT,DT=T(()=>{"use strict";kt();Yt();Ca();OT=256*1024,CT=30*60*1e3});import{chmodSync as HT,existsSync as vF,mkdirSync as qT,readFileSync as Fa,writeFileSync as JT}from"node:fs";import{dirname as sf,resolve as Ma,join as XT}from"node:path";import{fileURLToPath as IF}from"node:url";import{homedir as GT}from"node:os";import{CognitoIdentityClient as NF,GetIdCommand as xF}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as PT}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as AF,ListObjectsV2Command as RF,PutObjectCommand as $F,S3Client as FT}from"@aws-sdk/client-s3";function Js(t={}){let e=t.env??process.env,r=t.tfstatePath!==void 0?[t.tfstatePath]:MF(t.selfUrl),n={},s;for(let I of r)if(vF(I)){n=CF(I),s=I;break}let o=(...I)=>{for(let x of I)if(typeof x=="string"&&x!=="")return x},i=o(e.LMCTL_NEXT_IDENTITY_POOL_ID,n.LMCTL_NEXT_IDENTITY_POOL_ID)??jF,a=o(e.LMCTL_NEXT_COGNITO_USER_POOL_ID,n.LMCTL_NEXT_COGNITO_USER_POOL_ID)??LF,l=o(e.LMCTL_NEXT_MAILBOX_BUCKET,e.LMCTL_NEXT_POLICY_BUCKET,n.LMCTL_NEXT_MAILBOX_BUCKET,n.LMCTL_NEXT_POLICY_BUCKET)??OF,c=o(e.AWS_REGION,e.AWS_DEFAULT_REGION)??"us-east-1",u=o(e.LMCTL_NEXT_COGNITO_CLIENT_ID,n.LMCTL_NEXT_COGNITO_CLIENT_ID)??Ua,d=[];i===void 0&&d.push("LMCTL_NEXT_IDENTITY_POOL_ID"),a===void 0&&d.push("LMCTL_NEXT_COGNITO_USER_POOL_ID"),l===void 0&&d.push("LMCTL_NEXT_MAILBOX_BUCKET");let f={missing:d,tfstateCandidatesChecked:r,...s!==void 0?{tfstatePathUsed:s}:{}};if(d.length>0)return f;let m=e.LMCTL_MAILBOX_POLL_MS,p=m!==void 0&&m.length>0?Number(m):void 0,h=Pa(e.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),g=Pa(e.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),_=Pa(e.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),S=Pa(e.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),w=o(e.LMCTL_MAILBOX_KEY),E=o(e.LMCTL_TOKEN_PATH);return f.config={identityPoolId:i,cognitoUserPoolId:a,cognitoClientId:u,region:c,mailboxBucket:l,...typeof p=="number"&&Number.isFinite(p)&&p>=100?{pollIntervalMs:p}:{},...h!==void 0?{readIntervalMs:h}:{},...g!==void 0?{heartbeatIdleMs:g}:{},..._!==void 0?{backoffReadIntervalMs:_}:{},...S!==void 0?{chatLogPollIntervalMs:S}:{},...w!==void 0?{mailboxKey:w}:{},...E!==void 0?{tokenPath:E}:{}},f}function CF(t){try{let e=Fa(t,"utf8"),n=JSON.parse(e).outputs??{},s={};for(let[o,i]of Object.entries(n))i!==null&&typeof i=="object"&&typeof i.value=="string"&&(s[o]=i.value);return s}catch{return{}}}function MF(t){let e=sf(IF(t??import.meta.url));return[Ma(e,"..","..","..","..","infra","terraform","terraform.tfstate"),Ma(e,"..","..","..","..","..","infra","terraform","terraform.tfstate"),Ma(e,"..","..","..","infra","terraform","terraform.tfstate"),Ma(e,"..","..","infra","terraform","terraform.tfstate")]}function Pa(t){if(t===void 0||t==="")return;let e=Number(t);if(!(!Number.isFinite(e)||e<=0))return e*1e3}function DF(t){let e=PF(t.intervalMs)??KT,r=Math.max(1,Math.trunc(t.limit??500)),n=t.now??Date.now,s=t.cursorKey!==void 0&&t.store.loadTeamChatLogCursor!==void 0&&t.store.saveTeamChatLogCursor!==void 0?{key:t.cursorKey,load:t.store.loadTeamChatLogCursor.bind(t.store),save:t.store.saveTeamChatLogCursor.bind(t.store)}:null,o,i=!1,a=!1,l=()=>{try{if(s!==null){let d=s.load(s.key);if(d!==null)return o=d.last_pushed_id,!0}return o=t.store.getMaxTeamChatLogId(),s!==null&&s.save({cursor_key:s.key,last_pushed_id:o,updated_at:new Date(n()).toISOString()}),!0}catch(d){return t.log?.(`[mailbox] daemon_event chat_log seed failed: ${d instanceof Error?d.message:String(d)}`),!1}};l();let c=async()=>{if(!(a||i)){i=!0;try{if(o===void 0&&!l())return;let d=t.store.listTeamChatLogSinceId(o,r);for(let f of d){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 t.publishDaemonEvent(m),s!==null&&s.save({cursor_key:s.key,last_pushed_id:f.id,updated_at:new Date(n()).toISOString()}),o=Math.max(o,f.id)}}catch(d){t.log?.(`[mailbox] daemon_event chat_log tail failed: ${d instanceof Error?d.message:String(d)}`)}finally{i=!1}}},u=setInterval(()=>{c()},e);return typeof u.unref=="function"&&u.unref(),{pollNow:c,stop(){a=!0,clearInterval(u)}}}function PF(t){return typeof t=="number"&&Number.isFinite(t)&&t>0?t:void 0}async function VT(t){let e=t.tokenPath??XT(GT(),".lmctl","cli-tokens.json"),r=WT(t.tokenPath);if(pT(r.cognito?.idToken)&&Vd()!==null)try{await vT({region:t.region,clientId:t.cognitoClientId??Ua,cliTokensPath:e}),r=WT(t.tokenPath),t.log?.("[mx-mailbox] refreshed IdToken from device-auth refresh token")}catch(R){let ee=R instanceof Error?R.message:String(R);t.log?.(`[mx-mailbox] device-auth refresh failed: ${ee}`)}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.${t.region}.amazonaws.com/${t.cognitoUserPoolId}`,o=r.cognito.identityId,i=!1;o===void 0||o===""?o=await BT({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}):(i=!0,t.log?.(`[mx-mailbox] using cached identityId from cli-tokens (skipping GetId) for ${o}`));let a=PT({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new FT({region:t.region,credentials:a}),c={ListObjectsV2Command:RF,GetObjectCommand:AF,PutObjectCommand:$F},u=Bs(n),d=u??o,f=t.deviceId,m=Nn({identityId:o,userId:u,deviceId:f,mailboxKey:t.mailboxKey}),p=t.cursorStore,h;if(p!==void 0){let R=p.loadMailboxCursor(d,m);if(R!==null)h=R.last_processed_seq??void 0,t.log?.(`[mx-mailbox] resumed seq cursor=${h??"(sentinel)"} for user_id=${d}`);else{let ee=!1,J=0;for(;!ee&&J<2;){J+=1;try{let v=ua(m,"web"),N=0,j;do{let B=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:v,MaxKeys:1e3,...j!==void 0?{ContinuationToken:j}:{}}));for(let F of B.Contents??[]){let M=da(F.Key??"",m,"web");M!==void 0&&M>N&&(N=M)}j=B.IsTruncated===!0?B.NextContinuationToken:void 0}while(j!==void 0);h=N,t.log?.(`[mx-mailbox] cold start: seeded seq cursor=${N} for user_id=${d}`),ee=!0}catch(v){let N=v instanceof Error?v.message:String(v);if(i&&J===1&&WF(v)){t.log?.(`[mx-mailbox] cached identityId rejected by cognito (${N}); clearing + refreshing`),UF(e),i=!1,o=await BT({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}),a=PT({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new FT({region:t.region,credentials:a}),m=Nn({identityId:o,userId:u,deviceId:f,mailboxKey:t.mailboxKey});continue}t.log?.(`[mx-mailbox] cold start seq probe failed: ${N}`);break}}p.saveMailboxCursor({user_id:d,mailbox_key:m,last_processed_version_id:null,last_processed_seq:h??null,last_processed_at:new Date().toISOString()})}}let g=null,_=t.terminalSessionManager,S=t.persistentSessionManager,w=t.promptTriggerStore,E=new Aa,I=new Pr({bucket:t.mailboxBucket,identityId:o,...u!==null?{userId:u}:{},...f!==void 0?{deviceId:f}:{},...t.mailboxKey!==void 0?{mailboxKey:t.mailboxKey}:{},s3:l,commands:c,selfRole:"agent",onS3Op:R=>E.record(R),onMessage:async R=>{if(_!==void 0&&Wd(R.payload)){_.onInbound(R.payload);return}if(S!==void 0&&Bd(R.payload)){await S.onInbound(R.payload);return}if(!qd(R.payload)){if(w!==void 0&&Jd(R.payload)){nf({store:w,payload:R.payload,log:t.log});return}g!==null&&await g.handleIncoming(R.payload,R)}},...p!==void 0?{onCursorAdvance:R=>{p.saveMailboxCursor({user_id:d,mailbox_key:m,last_processed_version_id:null,last_processed_seq:R,last_processed_at:new Date().toISOString()})}}:{},...h!==void 0?{cursor:h}:{},...t.pollIntervalMs!==void 0?{pollIntervalMs:t.pollIntervalMs}:{},...t.readIntervalMs!==void 0?{readIntervalMs:t.readIntervalMs}:{},...t.heartbeatIdleMs!==void 0?{heartbeatIdleMs:t.heartbeatIdleMs}:{},...t.backoffReadIntervalMs!==void 0?{backoffReadIntervalMs:t.backoffReadIntervalMs}:{}});g=new Ws({client:I,...t.log!==void 0?{log:t.log}:{}}),_!==void 0&&_.setPublish(async R=>I.putMessage({conversation_id:`terminal:${R.session_id}`,payload:R})),S!==void 0&&S.setPublish(async R=>I.putMessage({conversation_id:`provider:${R.session_id}`,payload:R}));let x=R=>I.putMessage({conversation_id:Hd,payload:R});I.start();let H=t.chatLogTailStore===void 0?void 0:DF({store:t.chatLogTailStore,publishDaemonEvent:x,cursorKey:m,intervalMs:t.chatLogPollIntervalMs??t.readIntervalMs??t.pollIntervalMs??KT,log:t.log});t.log?.(`[mx-mailbox] agent polling ${m} (bucket=${t.mailboxBucket})`);let ue=t.deviceId??o,q=`${d}/usage/`,P;return P=t.usageStore===void 0?void 0:oT({meter:E,store:t.usageStore,userId:d,deviceId:ue,ceilingUsd:t.usageQuotaUsd??1/0,onQuotaExceeded:({period:R,costUsd:ee,ceilingUsd:J})=>{t.log?.(`[usage] month ${R} cost $${ee.toFixed(4)} >= ceiling $${J} \u2014 blocking mailbox`),I.stop().catch(()=>{}),P?.stop()},publishOwnRollup:async(R,ee)=>{await l.send(new c.PutObjectCommand({Bucket:t.mailboxBucket,Key:`${q}${ue}-${R}.json`,Body:JSON.stringify({...ee,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async R=>{let ee={put:0,get:0,list:0},J;do{let v=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:q,MaxKeys:1e3,...J!==void 0?{ContinuationToken:J}:{}}));for(let N of v.Contents??[]){let j=N.Key??"";if(j.endsWith(`-${R}.json`))try{let B=await l.send(new c.GetObjectCommand({Bucket:t.mailboxBucket,Key:j}));if(B.Body===void 0)continue;let F=JSON.parse(await B.Body.transformToString("utf-8"));ee.put+=F.put??0,ee.get+=F.get??0,ee.list+=F.list??0}catch{}}J=v.IsTruncated===!0?v.NextContinuationToken:void 0}while(J!==void 0);return ee},intervalMs:t.usageFlushIntervalMs??36e5,...t.log!==void 0?{log:t.log}:{}}),{identityId:o,mailbox:I,fetchClient:g,publishDaemonEvent:x,async stop(){H?.stop(),P!==void 0&&(await P.flushNow().catch(()=>{}),P.stop()),await g.stop().catch(()=>{}),await I.stop().catch(()=>{})}}}async function YT(t){let e=t.s3!==void 0&&t.commands!==void 0?{s3:t.s3,commands:t.commands}:xa(t.rootDir),r=Nn({identityId:qs,userId:qs,deviceId:UT}),n=null,s=t.terminalSessionManager,o=t.persistentSessionManager,i=t.promptTriggerStore,a=new Pr({bucket:"local",identityId:qs,userId:qs,deviceId:UT,s3:e.s3,commands:e.commands,selfRole:"agent",onMessage:async c=>{if(s!==void 0&&Wd(c.payload)){s.onInbound(c.payload);return}if(o!==void 0&&Bd(c.payload)){await o.onInbound(c.payload);return}if(!qd(c.payload)){if(i!==void 0&&Jd(c.payload)){nf({store:i,payload:c.payload,log:t.log});return}n!==null&&await n.handleIncoming(c.payload,c)}},pollIntervalMs:t.pollIntervalMs??Da,readIntervalMs:t.readIntervalMs??Da,heartbeatIdleMs:t.heartbeatIdleMs??Da,backoffReadIntervalMs:t.backoffReadIntervalMs??Da});n=new Ws({client:a,...t.log!==void 0?{log:t.log}:{}}),s!==void 0&&s.setPublish(async c=>a.putMessage({conversation_id:`terminal:${c.session_id}`,payload:c})),o!==void 0&&o.setPublish(async c=>a.putMessage({conversation_id:`provider:${c.session_id}`,payload:c}));let l=c=>a.putMessage({conversation_id:Hd,payload:c});return a.start(),t.log?.(`[local-webui] agent polling ${r} (local-fs ${t.rootDir})`),{identityId:qs,mailbox:a,fetchClient:n,publishDaemonEvent:l,async stop(){await n.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function WT(t){let e=t??XT(GT(),".lmctl","cli-tokens.json");try{let r=Fa(e,"utf8");return JSON.parse(r)}catch{return{}}}function FF(t,e){if(e===void 0||e==="")return;let r={};try{let s=Fa(t,"utf8");r=JSON.parse(s)}catch{}if(r.cognito===void 0)return;let n={...r,cognito:{...r.cognito,identityId:e}};qT(sf(t),{recursive:!0,mode:448}),JT(t,JSON.stringify(n,null,2));try{HT(t,384)}catch{}}function UF(t){let e={};try{let n=Fa(t,"utf8");e=JSON.parse(n)}catch{return}if(e.cognito===void 0)return;let r={...e,cognito:{...e.cognito}};delete r.cognito.identityId,qT(sf(t),{recursive:!0,mode:448}),JT(t,JSON.stringify(r,null,2));try{HT(t,384)}catch{}}async function BT(t){t.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let r=await new NF({region:t.region}).send(new xF({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(r.IdentityId===void 0||r.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{FF(t.tokenPath,r.IdentityId),t.log?.(`[mx-mailbox] persisted identityId=${r.IdentityId} to ${t.tokenPath}`)}catch(n){let s=n instanceof Error?n.message:String(n);t.log?.(`[mx-mailbox] WARNING: identityId persist failed (${s}); will redo GetId on next restart`)}return r.IdentityId}function WF(t){if(t===null||typeof t!="object")return!1;let e=t,r=[typeof e.name=="string"?e.name:void 0,typeof e.Code=="string"?e.Code:void 0,typeof e.__type=="string"?e.__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 e.message=="string"?e.message:"";return!!(n.includes("NotAuthorizedException")||n.includes("Invalid identity pool configuration")||n.includes("Identity")&&n.includes("not found"))}var KT,Da,Ua,jF,LF,OF,qs,UT,of=T(()=>{"use strict";ha();Md();Fd();iT();lT();cT();uT();dT();Xd();fa();Gd();zd();DT();KT=3e3,Da=1e3,Ua="79u5jhkk46qofog661c9i0bdcs",jF="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",LF="us-east-1_4iUdFggDn",OF="lmctl-next-preview-mailbox-254332045686";qs="local",UT="local"});import{spawn as uf}from"node:child_process";import{createInterface as zT}from"node:readline";var af,lf,cf,ZT,QT=T(()=>{"use strict";Ao();Ie();af=class{child;ctx;rl;nextRpcId=1;pending=new Map;threadId;nextLocalTurnId=1;closed=!1;setResumeThreadId(e){this.threadId=e}async start(e,r){this.ctx=r;let n=uf(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=n,this.rl=zT({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 o=s instanceof Buffer?s.toString("utf8"):String(s);r.emit({event_type:"notification",payload:{source:"stderr",text:o}})}),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 o=(await this.rpc("thread/start",{cwd:e.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,i=typeof o?.id=="string"?o.id:void 0;this.threadId=i,r.emit({event_type:"thread_started",payload:{thread_id:i,resumed:!1}})}else{let o=(await this.rpc("thread/start",{cwd:e.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,i=typeof o?.id=="string"?o.id:void 0;this.threadId=i,r.emit({event_type:"thread_started",payload:{thread_id:i,resumed:!1}})}return n}async sendTurn(e){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:e}]})).result?.turn,o=typeof s?.id=="string"?s.id:void 0;if(o!==void 0){let i=this.ctx?.turnMap.get(r);this.ctx?.turnMap.delete(r),i!==void 0&&this.ctx?.turnMap.set(o,i)}}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 e of this.pending.values())e.reject(new Error("codex_session_stopping"));this.pending.clear()}async rpc(e,r){if(this.child?.stdin===null||this.child===void 0)throw new Error("codex_child_unavailable");return new Promise((n,s)=>{let o=this.nextRpcId++;this.pending.set(o,{resolve:n,reject:s});let i=JSON.stringify({jsonrpc:"2.0",id:o,method:e,params:r});try{this.child.stdin.write(i+`
2019
+ allowed keys: ${xT.join(", ")}`);if(!d.provider&&!d.teamfile){s.push(`line ${u}: member line missing provider (or teamfile): ${c.trim()}`);continue}let m={alias:d.alias||`member${n.length+1}`,provider:d.provider||"",extra:{}};d.sessionid&&(m.session=d.sessionid),Object.prototype.hasOwnProperty.call(d,"sessiondir")&&(m.sessiondir=d.sessiondir),d.teamfile&&(m.teamfile=d.teamfile),d.model&&(m.model=d.model),d.effort&&(m.effort=d.effort),n.push(m)}return{name:e,members:n,rawText:t,parseErrors:s,frontmatter:i}}function tf(t,e){let r=[];for(let o of t.parseErrors)r.push({field:"session",message:o});let n=t.members.filter(o=>o.alias.toLowerCase()===Qd.toLowerCase());n.length>1&&r.push({field:Qd,message:`${n.length} alias=Lead found (max 1)`});let s=new Set;for(let o of t.members){let i=o.alias.toLowerCase();if(s.has(i)&&r.push({field:o.alias,message:`Duplicate alias "${o.alias}" (case-insensitive)`}),s.add(i),o.teamfile){let a=e?Ln(e,o.teamfile):Ln(o.teamfile);if(!AT(a))r.push({field:o.alias,message:`Teamfile not found: ${a}`});else{let l=Pe(a),c=Rt(l);c?c.session||r.push({field:o.alias,message:`Team at ${o.teamfile} lead has no session ID. Run: lmctl seed`}):r.push({field:o.alias,message:`Team at ${o.teamfile} has no lead session`})}}else lF.has(o.provider)||r.push({field:o.alias,message:`Invalid provider "${o.provider}"`});o.sessiondir!==void 0&&o.sessiondir===""&&r.push({field:o.alias,message:"sessiondir is empty"})}return r}function Rt(t){return t.members.find(e=>e.alias.toLowerCase()===Qd.toLowerCase())}function rf(t,e,r,n={}){let s=n.requireSession??!0;if(!t.teamfile)throw new Error(`Member "${t.alias}" is not a team reference`);let o=Ln(e,t.teamfile),i=r??new Set;if(i.has(o))throw new Error(`Circular team reference: ${t.alias} \u2192 ${o} (already visited: ${[...i].join(" \u2192 ")})`);if(i.add(o),!AT(o))throw new Error(`Teamfile not found: ${o} (referenced by alias "${t.alias}")`);let a=Pe(o),l=Rt(a);if(!l)throw new Error(`Team at ${o} has no lead session`);if(l.teamfile)return rf(l,Zd(o),i,n);if(s&&!l.session)throw new Error(`Team at ${o} lead has no session ID. Run: lmctl seed`);return{provider:l.provider,session:l.session??"",sessiondir:l.sessiondir||Zd(o),alias:t.alias,resolvedFrom:o,model:l.model,effort:l.effort}}function Oa(t,e){return t.members.find(r=>r.alias===e)??t.members.find(r=>r.alias.toLowerCase()===e.toLowerCase())}var Qd,lF,xT,Yt=T(()=>{"use strict";NT();Qd="Lead",lF=new Set(["claude","codex","opencode","lmplayer","gemini","copilot","qwen","agy","ClaudeMock"]);xT=["alias","provider","sessionid","sessiondir","teamfile","model","effort"]});import{hostname as mF}from"node:os";function jn(t,e){let r=new Date().toISOString(),n=new Date(Date.now()-e.ttlMs).toISOString(),s={receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,started_at:r},o=t.getAgentInflight(e.receiver_teamfile,e.receiver_alias),i=o===null||o.holder_pid===null,a=t.tryAcquireAgentInflight(s,{...i?{stale_before:n}:{},force:e.force});if(a.acquired){let c=o===null?null:e.force===!0?"force":o.holder_pid===null&&o.started_at<n?"stale":null;return{acquired:!0,lease:a.current??s,previous:o,reclaimReason:c}}if(!jT(a.current,n))return{acquired:!1,current:a.current};let l=t.tryAcquireAgentInflight(s,a.current.holder_pid===null?{stale_before:n}:{reclaim_observed:{sender_teamfile:a.current.sender_teamfile,sender_alias:a.current.sender_alias,started_at:a.current.started_at,holder_pid:a.current.holder_pid}});return l.acquired?{acquired:!0,lease:l.current??s,previous:a.current,reclaimReason:a.current.holder_pid===null?"stale":"dead-pid"}:{acquired:!1,current:l.current}}function LT(t,e,r){let n=t.getTerminalLock(e,r);if(n!==null&&pF(n))return!0;let s=t.getAgentInflight(e,r);if(s===null)return!1;let o=new Date(Date.now()-hF()).toISOString();return!jT(s,o)}function pF(t){if(t.holder_host===mF())return Xr(t.holder_pid);let e=Date.parse(t.last_heartbeat);return Number.isFinite(e)?Date.now()-e<=_F():!1}function jT(t,e){return t.holder_pid===null?t.started_at<e:!Xr(t.holder_pid)}function hF(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return RT;let r=Number(e);return!Number.isFinite(r)||r<=0?RT:r}function _F(t=process.env){let e=t.LMCTL_TERMINAL_LOCK_STALE_MS;if(e===void 0||e.trim()==="")return $T;let r=Number(e);return!Number.isFinite(r)||r<=0?$T:r}var RT,$T,Ca=T(()=>{"use strict";jl();RT=8*60*60*1e3,$T=12e4});import{existsSync as gF,realpathSync as yF}from"node:fs";import{dirname as wF}from"node:path";function nf(t){EF(t).catch(e=>{t.log?.(`[mailbox] prompt trigger failed: ${e instanceof Error?e.message:String(e)}`)})}async function EF(t){let e=t.payload.root_teamfile;try{e=yF(t.payload.root_teamfile)}catch(s){let o=`prompt root missing/unreadable: ${t.payload.root_teamfile}: ${s instanceof Error?s.message:String(s)}`;return await On(t.store,{rootTeamfile:t.payload.root_teamfile,receiverTeamfile:t.payload.root_teamfile,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:o,log:t.log}),t.log?.(`[mailbox] ${o}`),{status:"error",response:null,error_detail:o}}if(t.store.getRootTeam(e)===null){let s=`prompt root is not registered: ${e}`;return await On(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:s,log:t.log}),t.log?.(`[mailbox] ${s}`),{status:"error",response:null,error_detail:s}}let r=TF(e);if("error"in r)return await On(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:r.error,log:t.log}),t.log?.(`[mailbox] ${r.error}`),{status:"error",response:null,error_detail:r.error};let n=jn(t.store,{receiver_teamfile:e,receiver_alias:r.alias,sender_teamfile:`prompt:${t.payload.prompt_id}`,sender_alias:"operator",ttlMs:kF(t.env??process.env)});if(!n.acquired){let s=SF(r.alias,n.current);return await On(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:null,status:"error",error_detail:s,log:t.log}),t.log?.(`[mailbox] prompt rejected: ${s}`),{status:"error",response:null,error_detail:s}}try{let o=await(t.chat??Wt)({provider:r.provider,sessionId:r.sessionid,cwd:r.sessiondir,prompt:t.payload.text,env:t.env??process.env,alias:r.alias,permissionMode:"yolo",...t.timeoutMs!==void 0?{timeoutMs:t.timeoutMs}:{}}),i=o.status==="stalled",a=!i&&o.text.trim()==="",l=i?`provider stalled${o.stalledAfterMs!==void 0?` after ${o.stalledAfterMs}ms`:""}`:a?"provider returned empty response":null,c=i||a?"error":"ok";return await On(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:c==="error"?null:o.text,status:c,error_detail:l,log:t.log}),{status:c,response:c==="error"?null:o.text,error_detail:l}}catch(s){let o=s instanceof Error?s.message:String(s);return await On(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:null,status:"error",error_detail:o,log:t.log}),t.log?.(`[mailbox] prompt provider error: ${o}`),{status:"error",response:null,error_detail:o}}finally{try{t.store.releaseAgentInflight(n.lease)}catch(s){t.log?.(`[mailbox] failed to release prompt in-flight slot: ${s instanceof Error?s.message:String(s)}`)}}}function TF(t){if(!gF(t))return{error:`prompt root missing/unreadable: ${t}`};let e=Pe(t);if(e.parseErrors.length>0)return{error:`prompt root parse error: ${e.parseErrors.join("; ")}`};let r=Rt(e);return r===void 0?{error:`prompt root has no Lead: ${t}`}:r.session===void 0||r.session.trim()===""?{error:`prompt root Lead is unseeded: ${t}`}:{alias:r.alias,provider:r.provider,sessionid:r.session,sessiondir:r.sessiondir??wF(t)}}async function On(t,e){let r=MT(e.message),n=e.response===null?null:MT(e.response);try{t.insertTeamChatLog({root_teamfile:e.rootTeamfile,sender_teamfile:e.rootTeamfile,sender_alias:"operator",receiver_teamfile:e.receiverTeamfile,receiver_alias:e.receiverAlias,message:r.text,response:n?.text??null,origin:"unknown",status:e.status,error_detail:e.error_detail,truncated:r.truncated||n?.truncated?1:0,created_at:new Date().toISOString()})}catch(s){e.log?.(`[mailbox] warning: failed to record prompt chat log: ${s instanceof Error?s.message:String(s)}`)}}function MT(t){return t.length<=OT?{text:t,truncated:!1}:{text:t.slice(0,OT),truncated:!0}}function bF(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}function SF(t,e){return e.sender_teamfile.startsWith("prompt:")?`${t} is busy servicing another prompt since ${e.started_at}`:bF(t,e)}function kF(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return CT;let r=Number(e);return!Number.isFinite(r)||r<=0?CT:r}var OT,CT,DT=T(()=>{"use strict";kt();Yt();Ca();OT=256*1024,CT=30*60*1e3});import{chmodSync as HT,existsSync as vF,mkdirSync as qT,readFileSync as Fa,writeFileSync as JT}from"node:fs";import{dirname as sf,resolve as Ma,join as XT}from"node:path";import{fileURLToPath as IF}from"node:url";import{homedir as GT}from"node:os";import{CognitoIdentityClient as NF,GetIdCommand as xF}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as PT}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as AF,ListObjectsV2Command as RF,PutObjectCommand as $F,S3Client as FT}from"@aws-sdk/client-s3";function Xs(t={}){let e=t.env??process.env,r=t.tfstatePath!==void 0?[t.tfstatePath]:MF(t.selfUrl),n={},s;for(let I of r)if(vF(I)){n=CF(I),s=I;break}let o=(...I)=>{for(let x of I)if(typeof x=="string"&&x!=="")return x},i=o(e.LMCTL_NEXT_IDENTITY_POOL_ID,n.LMCTL_NEXT_IDENTITY_POOL_ID)??LF,a=o(e.LMCTL_NEXT_COGNITO_USER_POOL_ID,n.LMCTL_NEXT_COGNITO_USER_POOL_ID)??jF,l=o(e.LMCTL_NEXT_MAILBOX_BUCKET,e.LMCTL_NEXT_POLICY_BUCKET,n.LMCTL_NEXT_MAILBOX_BUCKET,n.LMCTL_NEXT_POLICY_BUCKET)??OF,c=o(e.AWS_REGION,e.AWS_DEFAULT_REGION)??"us-east-1",u=o(e.LMCTL_NEXT_COGNITO_CLIENT_ID,n.LMCTL_NEXT_COGNITO_CLIENT_ID)??Ua,d=[];i===void 0&&d.push("LMCTL_NEXT_IDENTITY_POOL_ID"),a===void 0&&d.push("LMCTL_NEXT_COGNITO_USER_POOL_ID"),l===void 0&&d.push("LMCTL_NEXT_MAILBOX_BUCKET");let f={missing:d,tfstateCandidatesChecked:r,...s!==void 0?{tfstatePathUsed:s}:{}};if(d.length>0)return f;let m=e.LMCTL_MAILBOX_POLL_MS,p=m!==void 0&&m.length>0?Number(m):void 0,h=Pa(e.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),g=Pa(e.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),_=Pa(e.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),S=Pa(e.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),w=o(e.LMCTL_MAILBOX_KEY),E=o(e.LMCTL_TOKEN_PATH);return f.config={identityPoolId:i,cognitoUserPoolId:a,cognitoClientId:u,region:c,mailboxBucket:l,...typeof p=="number"&&Number.isFinite(p)&&p>=100?{pollIntervalMs:p}:{},...h!==void 0?{readIntervalMs:h}:{},...g!==void 0?{heartbeatIdleMs:g}:{},..._!==void 0?{backoffReadIntervalMs:_}:{},...S!==void 0?{chatLogPollIntervalMs:S}:{},...w!==void 0?{mailboxKey:w}:{},...E!==void 0?{tokenPath:E}:{}},f}function CF(t){try{let e=Fa(t,"utf8"),n=JSON.parse(e).outputs??{},s={};for(let[o,i]of Object.entries(n))i!==null&&typeof i=="object"&&typeof i.value=="string"&&(s[o]=i.value);return s}catch{return{}}}function MF(t){let e=sf(IF(t??import.meta.url));return[Ma(e,"..","..","..","..","infra","terraform","terraform.tfstate"),Ma(e,"..","..","..","..","..","infra","terraform","terraform.tfstate"),Ma(e,"..","..","..","infra","terraform","terraform.tfstate"),Ma(e,"..","..","infra","terraform","terraform.tfstate")]}function Pa(t){if(t===void 0||t==="")return;let e=Number(t);if(!(!Number.isFinite(e)||e<=0))return e*1e3}function DF(t){let e=PF(t.intervalMs)??KT,r=Math.max(1,Math.trunc(t.limit??500)),n=t.now??Date.now,s=t.cursorKey!==void 0&&t.store.loadTeamChatLogCursor!==void 0&&t.store.saveTeamChatLogCursor!==void 0?{key:t.cursorKey,load:t.store.loadTeamChatLogCursor.bind(t.store),save:t.store.saveTeamChatLogCursor.bind(t.store)}:null,o,i=!1,a=!1,l=()=>{try{if(s!==null){let d=s.load(s.key);if(d!==null)return o=d.last_pushed_id,!0}return o=t.store.getMaxTeamChatLogId(),s!==null&&s.save({cursor_key:s.key,last_pushed_id:o,updated_at:new Date(n()).toISOString()}),!0}catch(d){return t.log?.(`[mailbox] daemon_event chat_log seed failed: ${d instanceof Error?d.message:String(d)}`),!1}};l();let c=async()=>{if(!(a||i)){i=!0;try{if(o===void 0&&!l())return;let d=t.store.listTeamChatLogSinceId(o,r);for(let f of d){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 t.publishDaemonEvent(m),s!==null&&s.save({cursor_key:s.key,last_pushed_id:f.id,updated_at:new Date(n()).toISOString()}),o=Math.max(o,f.id)}}catch(d){t.log?.(`[mailbox] daemon_event chat_log tail failed: ${d instanceof Error?d.message:String(d)}`)}finally{i=!1}}},u=setInterval(()=>{c()},e);return typeof u.unref=="function"&&u.unref(),{pollNow:c,stop(){a=!0,clearInterval(u)}}}function PF(t){return typeof t=="number"&&Number.isFinite(t)&&t>0?t:void 0}async function VT(t){let e=t.tokenPath??XT(GT(),".lmctl","cli-tokens.json"),r=WT(t.tokenPath);if(pT(r.cognito?.idToken)&&Vd()!==null)try{await vT({region:t.region,clientId:t.cognitoClientId??Ua,cliTokensPath:e}),r=WT(t.tokenPath),t.log?.("[mx-mailbox] refreshed IdToken from device-auth refresh token")}catch(R){let ee=R instanceof Error?R.message:String(R);t.log?.(`[mx-mailbox] device-auth refresh failed: ${ee}`)}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.${t.region}.amazonaws.com/${t.cognitoUserPoolId}`,o=r.cognito.identityId,i=!1;o===void 0||o===""?o=await BT({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}):(i=!0,t.log?.(`[mx-mailbox] using cached identityId from cli-tokens (skipping GetId) for ${o}`));let a=PT({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new FT({region:t.region,credentials:a}),c={ListObjectsV2Command:RF,GetObjectCommand:AF,PutObjectCommand:$F},u=Hs(n),d=u??o,f=t.deviceId,m=Nn({identityId:o,userId:u,deviceId:f,mailboxKey:t.mailboxKey}),p=t.cursorStore,h;if(p!==void 0){let R=p.loadMailboxCursor(d,m);if(R!==null)h=R.last_processed_seq??void 0,t.log?.(`[mx-mailbox] resumed seq cursor=${h??"(sentinel)"} for user_id=${d}`);else{let ee=!1,J=0;for(;!ee&&J<2;){J+=1;try{let v=ua(m,"web"),N=0,L;do{let B=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:v,MaxKeys:1e3,...L!==void 0?{ContinuationToken:L}:{}}));for(let F of B.Contents??[]){let M=da(F.Key??"",m,"web");M!==void 0&&M>N&&(N=M)}L=B.IsTruncated===!0?B.NextContinuationToken:void 0}while(L!==void 0);h=N,t.log?.(`[mx-mailbox] cold start: seeded seq cursor=${N} for user_id=${d}`),ee=!0}catch(v){let N=v instanceof Error?v.message:String(v);if(i&&J===1&&WF(v)){t.log?.(`[mx-mailbox] cached identityId rejected by cognito (${N}); clearing + refreshing`),UF(e),i=!1,o=await BT({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}),a=PT({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new FT({region:t.region,credentials:a}),m=Nn({identityId:o,userId:u,deviceId:f,mailboxKey:t.mailboxKey});continue}t.log?.(`[mx-mailbox] cold start seq probe failed: ${N}`);break}}p.saveMailboxCursor({user_id:d,mailbox_key:m,last_processed_version_id:null,last_processed_seq:h??null,last_processed_at:new Date().toISOString()})}}let g=null,_=t.terminalSessionManager,S=t.persistentSessionManager,w=t.promptTriggerStore,E=new Aa,I=new Pr({bucket:t.mailboxBucket,identityId:o,...u!==null?{userId:u}:{},...f!==void 0?{deviceId:f}:{},...t.mailboxKey!==void 0?{mailboxKey:t.mailboxKey}:{},s3:l,commands:c,selfRole:"agent",onS3Op:R=>E.record(R),onMessage:async R=>{if(_!==void 0&&Wd(R.payload)){_.onInbound(R.payload);return}if(S!==void 0&&Bd(R.payload)){await S.onInbound(R.payload);return}if(!qd(R.payload)){if(w!==void 0&&Jd(R.payload)){nf({store:w,payload:R.payload,log:t.log});return}g!==null&&await g.handleIncoming(R.payload,R)}},...p!==void 0?{onCursorAdvance:R=>{p.saveMailboxCursor({user_id:d,mailbox_key:m,last_processed_version_id:null,last_processed_seq:R,last_processed_at:new Date().toISOString()})}}:{},...h!==void 0?{cursor:h}:{},...t.pollIntervalMs!==void 0?{pollIntervalMs:t.pollIntervalMs}:{},...t.readIntervalMs!==void 0?{readIntervalMs:t.readIntervalMs}:{},...t.heartbeatIdleMs!==void 0?{heartbeatIdleMs:t.heartbeatIdleMs}:{},...t.backoffReadIntervalMs!==void 0?{backoffReadIntervalMs:t.backoffReadIntervalMs}:{}});g=new Bs({client:I,...t.log!==void 0?{log:t.log}:{}}),_!==void 0&&_.setPublish(async R=>I.putMessage({conversation_id:`terminal:${R.session_id}`,payload:R})),S!==void 0&&S.setPublish(async R=>I.putMessage({conversation_id:`provider:${R.session_id}`,payload:R}));let x=R=>I.putMessage({conversation_id:Hd,payload:R});I.start();let H=t.chatLogTailStore===void 0?void 0:DF({store:t.chatLogTailStore,publishDaemonEvent:x,cursorKey:m,intervalMs:t.chatLogPollIntervalMs??t.readIntervalMs??t.pollIntervalMs??KT,log:t.log});t.log?.(`[mx-mailbox] agent polling ${m} (bucket=${t.mailboxBucket})`);let ue=t.deviceId??o,q=`${d}/usage/`,P;return P=t.usageStore===void 0?void 0:oT({meter:E,store:t.usageStore,userId:d,deviceId:ue,ceilingUsd:t.usageQuotaUsd??1/0,onQuotaExceeded:({period:R,costUsd:ee,ceilingUsd:J})=>{t.log?.(`[usage] month ${R} cost $${ee.toFixed(4)} >= ceiling $${J} \u2014 blocking mailbox`),I.stop().catch(()=>{}),P?.stop()},publishOwnRollup:async(R,ee)=>{await l.send(new c.PutObjectCommand({Bucket:t.mailboxBucket,Key:`${q}${ue}-${R}.json`,Body:JSON.stringify({...ee,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async R=>{let ee={put:0,get:0,list:0},J;do{let v=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:q,MaxKeys:1e3,...J!==void 0?{ContinuationToken:J}:{}}));for(let N of v.Contents??[]){let L=N.Key??"";if(L.endsWith(`-${R}.json`))try{let B=await l.send(new c.GetObjectCommand({Bucket:t.mailboxBucket,Key:L}));if(B.Body===void 0)continue;let F=JSON.parse(await B.Body.transformToString("utf-8"));ee.put+=F.put??0,ee.get+=F.get??0,ee.list+=F.list??0}catch{}}J=v.IsTruncated===!0?v.NextContinuationToken:void 0}while(J!==void 0);return ee},intervalMs:t.usageFlushIntervalMs??36e5,...t.log!==void 0?{log:t.log}:{}}),{identityId:o,mailbox:I,fetchClient:g,publishDaemonEvent:x,async stop(){H?.stop(),P!==void 0&&(await P.flushNow().catch(()=>{}),P.stop()),await g.stop().catch(()=>{}),await I.stop().catch(()=>{})}}}async function YT(t){let e=t.s3!==void 0&&t.commands!==void 0?{s3:t.s3,commands:t.commands}:xa(t.rootDir),r=Nn({identityId:Js,userId:Js,deviceId:UT}),n=null,s=t.terminalSessionManager,o=t.persistentSessionManager,i=t.promptTriggerStore,a=new Pr({bucket:"local",identityId:Js,userId:Js,deviceId:UT,s3:e.s3,commands:e.commands,selfRole:"agent",onMessage:async c=>{if(s!==void 0&&Wd(c.payload)){s.onInbound(c.payload);return}if(o!==void 0&&Bd(c.payload)){await o.onInbound(c.payload);return}if(!qd(c.payload)){if(i!==void 0&&Jd(c.payload)){nf({store:i,payload:c.payload,log:t.log});return}n!==null&&await n.handleIncoming(c.payload,c)}},pollIntervalMs:t.pollIntervalMs??Da,readIntervalMs:t.readIntervalMs??Da,heartbeatIdleMs:t.heartbeatIdleMs??Da,backoffReadIntervalMs:t.backoffReadIntervalMs??Da});n=new Bs({client:a,...t.log!==void 0?{log:t.log}:{}}),s!==void 0&&s.setPublish(async c=>a.putMessage({conversation_id:`terminal:${c.session_id}`,payload:c})),o!==void 0&&o.setPublish(async c=>a.putMessage({conversation_id:`provider:${c.session_id}`,payload:c}));let l=c=>a.putMessage({conversation_id:Hd,payload:c});return a.start(),t.log?.(`[local-webui] agent polling ${r} (local-fs ${t.rootDir})`),{identityId:Js,mailbox:a,fetchClient:n,publishDaemonEvent:l,async stop(){await n.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function WT(t){let e=t??XT(GT(),".lmctl","cli-tokens.json");try{let r=Fa(e,"utf8");return JSON.parse(r)}catch{return{}}}function FF(t,e){if(e===void 0||e==="")return;let r={};try{let s=Fa(t,"utf8");r=JSON.parse(s)}catch{}if(r.cognito===void 0)return;let n={...r,cognito:{...r.cognito,identityId:e}};qT(sf(t),{recursive:!0,mode:448}),JT(t,JSON.stringify(n,null,2));try{HT(t,384)}catch{}}function UF(t){let e={};try{let n=Fa(t,"utf8");e=JSON.parse(n)}catch{return}if(e.cognito===void 0)return;let r={...e,cognito:{...e.cognito}};delete r.cognito.identityId,qT(sf(t),{recursive:!0,mode:448}),JT(t,JSON.stringify(r,null,2));try{HT(t,384)}catch{}}async function BT(t){t.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let r=await new NF({region:t.region}).send(new xF({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(r.IdentityId===void 0||r.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{FF(t.tokenPath,r.IdentityId),t.log?.(`[mx-mailbox] persisted identityId=${r.IdentityId} to ${t.tokenPath}`)}catch(n){let s=n instanceof Error?n.message:String(n);t.log?.(`[mx-mailbox] WARNING: identityId persist failed (${s}); will redo GetId on next restart`)}return r.IdentityId}function WF(t){if(t===null||typeof t!="object")return!1;let e=t,r=[typeof e.name=="string"?e.name:void 0,typeof e.Code=="string"?e.Code:void 0,typeof e.__type=="string"?e.__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 e.message=="string"?e.message:"";return!!(n.includes("NotAuthorizedException")||n.includes("Invalid identity pool configuration")||n.includes("Identity")&&n.includes("not found"))}var KT,Da,Ua,LF,jF,OF,Js,UT,of=T(()=>{"use strict";ha();Md();Fd();iT();lT();cT();uT();dT();Xd();fa();Gd();zd();DT();KT=3e3,Da=1e3,Ua="79u5jhkk46qofog661c9i0bdcs",LF="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",jF="us-east-1_4iUdFggDn",OF="lmctl-next-preview-mailbox-254332045686";Js="local",UT="local"});import{spawn as uf}from"node:child_process";import{createInterface as zT}from"node:readline";var af,lf,cf,ZT,QT=T(()=>{"use strict";Ao();Ie();af=class{child;ctx;rl;nextRpcId=1;pending=new Map;threadId;nextLocalTurnId=1;closed=!1;setResumeThreadId(e){this.threadId=e}async start(e,r){this.ctx=r;let n=uf(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=n,this.rl=zT({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 o=s instanceof Buffer?s.toString("utf8"):String(s);r.emit({event_type:"notification",payload:{source:"stderr",text:o}})}),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 o=(await this.rpc("thread/start",{cwd:e.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,i=typeof o?.id=="string"?o.id:void 0;this.threadId=i,r.emit({event_type:"thread_started",payload:{thread_id:i,resumed:!1}})}else{let o=(await this.rpc("thread/start",{cwd:e.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,i=typeof o?.id=="string"?o.id:void 0;this.threadId=i,r.emit({event_type:"thread_started",payload:{thread_id:i,resumed:!1}})}return n}async sendTurn(e){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:e}]})).result?.turn,o=typeof s?.id=="string"?s.id:void 0;if(o!==void 0){let i=this.ctx?.turnMap.get(r);this.ctx?.turnMap.delete(r),i!==void 0&&this.ctx?.turnMap.set(o,i)}}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 e of this.pending.values())e.reject(new Error("codex_session_stopping"));this.pending.clear()}async rpc(e,r){if(this.child?.stdin===null||this.child===void 0)throw new Error("codex_child_unavailable");return new Promise((n,s)=>{let o=this.nextRpcId++;this.pending.set(o,{resolve:n,reject:s});let i=JSON.stringify({jsonrpc:"2.0",id:o,method:e,params:r});try{this.child.stdin.write(i+`
2020
2020
  `)}catch(a){this.pending.delete(o),s(a instanceof Error?a:new Error(String(a)))}})}notify(e,r){if(this.child?.stdin===null||this.child===void 0)return;let n=JSON.stringify({jsonrpc:"2.0",method:e,params:r});try{this.child.stdin.write(n+`
2021
2021
  `)}catch{}}handleLine(e){if(e.trim()==="")return;let r;try{r=JSON.parse(e)}catch{return}if(typeof r.id=="number"&&this.pending.has(r.id)){let i=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);i.reject(new Error(`codex_rpc_error: ${l}`))}else i.resolve(r);return}let n=typeof r.method=="string"?r.method:void 0;if(n===void 0)return;let s=r.params??{},o=this.normalizeNotification(n,s);o!==void 0&&this.ctx?.emit(o)}normalizeNotification(e,r){if(e==="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(e==="turn/started")return{event_type:"turn_started",payload:{turn_id:r.turn?.id,thread_id:this.threadId}};if(e==="item/agentMessage/delta")return{event_type:"assistant_message_delta",payload:{text:typeof r.delta=="string"?r.delta:""}};if(e==="item/started"||e==="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:e==="item/started"?"started":"completed",item:n}}:{event_type:"notification",payload:{method:e,params:r}}}if(e==="turn/completed"){let n=r.turn;return typeof n?.id=="string"&&this.ctx?.turnMap.delete(n.id),{event_type:"turn_complete",payload:r}}if(e==="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:e,params:r}}}},lf=class{child;ctx;buffer="";sessionIdSeen;closed=!1;async start(e,r){this.ctx=r;let n=uf(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});return this.child=n,n.stdout.on("data",s=>{if(r.generation!==r.currentGeneration())return;let o=s instanceof Buffer?s.toString("utf8"):String(s);this.buffer+=o;let i=this.buffer.split(`
2022
2022
  `);this.buffer=i.pop()??"";for(let a of i)this.handleLine(a)}),n.stderr?.on("data",s=>{if(r.generation!==r.currentGeneration())return;let o=s instanceof Buffer?s.toString("utf8"):String(s);r.emit({event_type:"notification",payload:{source:"stderr",text:o}})}),n}async sendTurn(e){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:e}});try{this.child.stdin.write(n+`
2023
2023
  `)}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(e){if(e.trim()==="")return;let r;try{r=JSON.parse(e)}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 o=r.message?.content;if(Array.isArray(o))for(let i of o)i.type==="text"&&typeof i.text=="string"&&i.text!==""&&this.ctx?.emit({event_type:"assistant_message_delta",payload:{text:i.text}});return}if(n==="result"){let s=typeof r.session_id=="string"?r.session_id:void 0;for(let o of Array.from(this.ctx?.turnMap.keys()??[]))this.ctx?.turnMap.delete(o);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}})}},cf=class{child;ctx;rl;nextRpcId=1;pending=new Map;sessionId;closed=!1;async start(e,r){this.ctx=r;let n=e.cwd??process.cwd();if(e.provider==="opencode")try{xo(n)}catch(a){Y({event:"opencode_config_install_failed",cwd:n,error_message:a instanceof Error?a.message:String(a)})}let s=uf(e.command,e.args,{cwd:n,env:e.env??process.env,stdio:["pipe","pipe","pipe"]});this.child=s,this.rl=zT({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 i=(await this.rpc("session/new",{cwd:e.cwd??process.cwd(),mcpServers:[]})).result;return this.sessionId=typeof i?.sessionId=="string"?i.sessionId:void 0,r.emit({event_type:"thread_started",payload:{thread_id:this.sessionId,raw:i}}),s}async sendTurn(e){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:e}]})).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 e of this.pending.values())e.reject(new Error("acp_session_stopping"));this.pending.clear()}async rpc(e,r){if(this.child?.stdin===null||this.child===void 0)throw new Error("acp_child_unavailable");return new Promise((n,s)=>{let o=this.nextRpcId++;this.pending.set(o,{resolve:n,reject:s});let i=JSON.stringify({jsonrpc:"2.0",id:o,method:e,params:r});try{this.child.stdin.write(i+`
2024
2024
  `)}catch(a){this.pending.delete(o),s(a instanceof Error?a:new Error(String(a)))}})}notify(e,r){if(this.child?.stdin===null||this.child===void 0)return;let n=JSON.stringify({jsonrpc:"2.0",method:e,params:r});try{this.child.stdin.write(n+`
2025
2025
  `)}catch{}}handleLine(e){if(e.trim()==="")return;let r;try{r=JSON.parse(e)}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 o=r.error,i=typeof o?.message=="string"&&o.message!==""?o.message:JSON.stringify(r.error);s.reject(new Error(`acp_rpc_error: ${i}`))}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+`
2026
- `)}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,o=s?.update;if((typeof o?.sessionUpdate=="string"?o.sessionUpdate:"")==="agent_message_chunk"){let a=o?.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}})}}},ZT=t=>{switch(t){case"codex":return new af;case"claude":case"qwen":return new lf;case"gemini":case"copilot":case"opencode":return new cf;default:throw new Error(`no_persistent_adapter_for_provider: ${t}`)}}});import{randomUUID as BF}from"node:crypto";import{existsSync as Fz,mkdirSync as HF,readFileSync as qF,writeFileSync as JF}from"node:fs";import{homedir as XF}from"node:os";import{dirname as GF,join as KF}from"node:path";function Wa(){return process.env.LMCTL_DEVICE_FILE??KF(XF(),".lmctl","device.json")}function Fr(t=Wa()){let e=process.env.LMCTL_DEVICE_ID;if(e!==void 0&&e!=="")return{device_id:e,created_at:"env"};try{let r=JSON.parse(qF(t,"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 df(t=Wa()){let e=Fr(t);if(e!==null&&e.created_at!=="env")return e;let r={device_id:BF(),created_at:new Date().toISOString()};return HF(GF(t),{recursive:!0}),JF(t,`${JSON.stringify(r,null,2)}
2027
- `,{encoding:"utf8",mode:384}),r}var ff=T(()=>{"use strict"});import*as eb from"node:child_process";function YF(t,e){try{let r=e(t,["--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 mf(t,e={}){let r=e.spawnSync===void 0&&process.env[zF]==="1",n=e.spawnSync??eb.spawnSync,s=new Set,o=[];for(let i of t){if(s.has(i))continue;s.add(i);let a=Ba[i];if(!a){o.push({provider:i,binary:"<unknown>",found:!1,failureMode:"not installed"});continue}if(r){o.push({provider:i,binary:a,found:!0,version:"(skipped)"});continue}let l=YF(a,n);l.found?o.push({provider:i,binary:a,found:!0,version:l.version}):o.push({provider:i,binary:a,found:!1,failureMode:l.failureMode})}return o}function tb(t){if(t.binary==="<unknown>")return`unknown provider "${t.provider}" \u2014 no binary mapping (allowed: ${Object.keys(Ba).join(", ")})`;let e=VF[t.provider],r=e?` (install via ${e})`:"";return t.failureMode==="runs but failed"?`provider "${t.provider}" binary '${t.binary}' found but \`${t.binary} --version\` failed to run cleanly \u2014 check install integrity${r}`:`provider "${t.provider}" binary '${t.binary}' not installed${r}`}var Ba,VF,zF,rb=T(()=>{"use strict";Ba={claude:"claude",codex:"codex",copilot:"copilot",gemini:"gemini",opencode:"opencode",lmplayer:"lmplayer",qwen:"qwen",agy:"agy"},VF={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"};zF="LMCTL_SKIP_BINARY_CHECK"});var fb={};ae(fb,{ProviderBinaryPreflightError:()=>Ha,__setProviderBinaryCheckForTest:()=>i1,bootstrapAgentRestMailbox:()=>ob,publishRegisteredWorkflowsOnStart:()=>sb,resolveLocalMailboxDir:()=>ub,resolveLocalWebuiDir:()=>cb,resolveServeConfig:()=>ib,runProviderBinaryPreflight:()=>lb,runServe:()=>r1,validateServeArgs:()=>db});import{randomBytes as ZF}from"node:crypto";import{existsSync as QF}from"node:fs";import{homedir as e1}from"node:os";import{isAbsolute as nb,resolve as pf}from"node:path";async function r1(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(t1),0;let r=db(t,process.env);if(typeof r=="string")return e.stderr.write(`error: ${r}
2026
+ `)}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,o=s?.update;if((typeof o?.sessionUpdate=="string"?o.sessionUpdate:"")==="agent_message_chunk"){let a=o?.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}})}}},ZT=t=>{switch(t){case"codex":return new af;case"claude":case"qwen":return new lf;case"gemini":case"copilot":case"opencode":return new cf;default:throw new Error(`no_persistent_adapter_for_provider: ${t}`)}}});import{randomUUID as BF}from"node:crypto";import{existsSync as Wz,mkdirSync as HF,readFileSync as qF,writeFileSync as JF}from"node:fs";import{homedir as XF}from"node:os";import{dirname as GF,join as KF}from"node:path";function Wa(){return process.env.LMCTL_DEVICE_FILE??KF(XF(),".lmctl","device.json")}function Fr(t=Wa()){let e=process.env.LMCTL_DEVICE_ID;if(e!==void 0&&e!=="")return{device_id:e,created_at:"env"};try{let r=JSON.parse(qF(t,"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 df(t=Wa()){let e=Fr(t);if(e!==null&&e.created_at!=="env")return e;let r={device_id:BF(),created_at:new Date().toISOString()};return HF(GF(t),{recursive:!0}),JF(t,`${JSON.stringify(r,null,2)}
2027
+ `,{encoding:"utf8",mode:384}),r}var ff=T(()=>{"use strict"});import*as eb from"node:child_process";function YF(t,e){try{let r=e(t,["--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 mf(t,e={}){let r=e.spawnSync===void 0&&process.env[zF]==="1",n=e.spawnSync??eb.spawnSync,s=new Set,o=[];for(let i of t){if(s.has(i))continue;s.add(i);let a=Ba[i];if(!a){o.push({provider:i,binary:"<unknown>",found:!1,failureMode:"not installed"});continue}if(r){o.push({provider:i,binary:a,found:!0,version:"(skipped)"});continue}let l=YF(a,n);l.found?o.push({provider:i,binary:a,found:!0,version:l.version}):o.push({provider:i,binary:a,found:!1,failureMode:l.failureMode})}return o}function tb(t){if(t.binary==="<unknown>")return`unknown provider "${t.provider}" \u2014 no binary mapping (allowed: ${Object.keys(Ba).join(", ")})`;let e=VF[t.provider],r=e?` (install via ${e})`:"";return t.failureMode==="runs but failed"?`provider "${t.provider}" binary '${t.binary}' found but \`${t.binary} --version\` failed to run cleanly \u2014 check install integrity${r}`:`provider "${t.provider}" binary '${t.binary}' not installed${r}`}var Ba,VF,zF,rb=T(()=>{"use strict";Ba={claude:"claude",codex:"codex",copilot:"copilot",gemini:"gemini",opencode:"opencode",lmplayer:"lmplayer",qwen:"qwen",agy:"agy"},VF={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"};zF="LMCTL_SKIP_BINARY_CHECK"});var fb={};le(fb,{ProviderBinaryPreflightError:()=>Ha,__setProviderBinaryCheckForTest:()=>i1,bootstrapAgentRestMailbox:()=>ob,publishRegisteredWorkflowsOnStart:()=>sb,resolveLocalMailboxDir:()=>ub,resolveLocalWebuiDir:()=>cb,resolveServeConfig:()=>ib,runProviderBinaryPreflight:()=>lb,runServe:()=>r1,validateServeArgs:()=>db});import{randomBytes as ZF}from"node:crypto";import{existsSync as QF}from"node:fs";import{homedir as e1}from"node:os";import{isAbsolute as nb,resolve as pf}from"node:path";async function r1(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(t1),0;let r=db(t,process.env);if(typeof r=="string")return e.stderr.write(`error: ${r}
2028
2028
  `),2;try{lb(e)}catch(w){return 1}let n=_e({path:de()}),s={portCli:a1(t)},o;try{o=ib({dal:n,cli:s,env:process.env,parsed:r,io:e})}catch(w){return n.close(),e.stderr.write(`error: ${w instanceof Error?w.message:String(w)}
2029
2029
  `),2}process.env.LMCTL_API_URL=o.apiUrl,process.env.LMCTL_API_TOKEN=o.apiToken,process.env.LMCTL_API_PORT=String(o.port),VE(n);let i;if(r.localWebui!==void 0){let w=cb(r.localWebui.dir,process.env);if(w===null)return e.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 E=ub(process.env),{s3:I,commands:x}=xa(E);i={webuiDir:w,rootDir:E,s3:I,commands:x},e.stdout.write(`local webui: serving SPA from ${w}; mailbox store ${E}
2030
- `)}let a=r.noDaemon?void 0:GE({dal:n,intervalMs:Us()}),l=i!==void 0?{missing:[],tfstateCandidatesChecked:[]}:Js({env:process.env});l.missing.length>0&&e.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)`)+`
2030
+ `)}let a=r.noDaemon?void 0:GE({dal:n,intervalMs:Ws()}),l=i!==void 0?{missing:[],tfstateCandidatesChecked:[]}:Xs({env:process.env});l.missing.length>0&&e.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)`)+`
2031
2031
  `);let c=await o1({log:w=>e.stderr.write(`${w}
2032
2032
  `)}),u=new Ea({adapterFactory:ZT,publish:async()=>{throw new Error("persistent_publish_not_wired: mailbox runtime has not bound the publish hook yet")},log:w=>e.stderr.write(`${w}
2033
2033
  `)}),d=Fr()?.device_id,f=PE({dal:n,daemon:a,...l.config!==void 0?{webuiRuntimeConfig:n1(l.config,d)}:{},...c!==void 0?{terminalSessionManager:c}:{},persistentSessionManager:u,...i!==void 0?{localWebui:{webuiDir:i.webuiDir,localMailbox:{s3:i.s3,commands:i.commands}}}:{}}),m=process.env.LMCTL_USAGE_QUOTA_USD,p=m!==void 0&&m!==""?Number(m):NaN,h=Number.isFinite(p)&&p>0?p:void 0,g=await ob({dal:n,app:f,io:e,mailbox:l.config===void 0?void 0:{...l.config,cursorStore:n,chatLogTailStore:n,promptTriggerStore:n,usageStore:n,...h!==void 0?{usageQuotaUsd:h}:{},...d!==void 0?{deviceId:d}:{}},...i!==void 0?{localMailbox:{rootDir:i.rootDir,s3:i.s3,commands:i.commands,promptTriggerStore:n}}:{},...c!==void 0?{terminalSessionManager:c}:{},persistentSessionManager:u});await sb({dal:n,mailbox:g.mailbox,io:e});let{serve:_}=await import("@hono/node-server"),S=_({fetch:f.fetch,port:o.port,hostname:r.bind});return e.stdout.write(`listening on ${r.bind}:${o.port}
@@ -2041,7 +2041,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
2041
2041
  `);return{port:a,apiUrl:d,apiToken:c}}function s1(t){switch(t){case"api.port":return"LMCTL_API_PORT";case"api.token":return"LMCTL_API_TOKEN";case"api.url":return"LMCTL_API_URL";default:return`LMCTL_${t.replaceAll(".","_").toUpperCase()}`}}async function o1(t){let e;try{e=await import("node-pty")}catch(r){let n=r instanceof Error?r.message:String(r);t.log(`[dt-2] node-pty not available; terminal routes will return 503 (${n})`);return}return new wa({pty:{spawn:e.spawn.bind(e)},publish:async()=>{throw new Error("terminal_publish_not_wired: mailbox runtime has not bound the publish hook yet")},log:t.log})}function i1(t){ab=t??mf}function lb(t){let e=Object.keys(Ba),r=ab(e),n=r.filter(o=>!o.found);if(n.length>0){for(let o of n)t.stderr.write(`error: ${tb(o)}
2042
2042
  `);throw t.stderr.write(`error: agent refusing to start; ensure missing provider CLIs are on PATH
2043
2043
  `),new Ha(n)}let s=r.map(o=>o.provider).join(", ");t.stdout.write(`providers ready: ${s}
2044
- `)}function cb(t,e){let r=t!==void 0&&t!==""?t:e.LMCTL_LOCAL_WEBUI_DIR!==void 0&&e.LMCTL_LOCAL_WEBUI_DIR!==""?e.LMCTL_LOCAL_WEBUI_DIR:void 0;if(r===void 0)return null;let n=nb(r)?r:pf(process.cwd(),r);return QF(`${n}/index.html`)?n:null}function ub(t){let e=t.LMCTL_LOCAL_MAILBOX_DIR;return e!==void 0&&e!==""?nb(e)?e:pf(process.cwd(),e):pf(e1(),".lmctl","local-mailbox")}function a1(t){for(let e=0;e<t.length;e+=1)if(t[e]==="--port"){let r=t[e+1];if(r!==void 0&&!r.startsWith("--")){let n=Number(r);if(Number.isInteger(n)&&n>0&&n<=65535)return n}}}function db(t,e=process.env){let r=l1(t);return typeof r=="string"?r:r.bind==="0.0.0.0"&&!r.insecureNoAuth&&!e.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 l1(t){let e={port:8787,bind:"127.0.0.1",noDaemon:!1,insecureNoAuth:!1};for(let r=0;r<t.length;r+=1){let n=t[r];if(n==="--port"){let s=t[++r];if(s===void 0||s.startsWith("--"))return"missing value for --port";let o=Number(s);if(!Number.isInteger(o)||o<=0||o>65535)return`invalid --port: ${s}`;e.port=o;continue}if(n==="--bind"){let s=t[++r];if(s===void 0||s.startsWith("--"))return"missing value for --bind";e.bind=s;continue}if(n==="--no-daemon"){e.noDaemon=!0;continue}if(n==="--insecure-no-auth"){e.insecureNoAuth=!0;continue}if(n==="--webui"){let s=t[r+1];s!==void 0&&!s.startsWith("--")?(e.localWebui={dir:s},r+=1):e.localWebui={dir:void 0};continue}return`unknown argument: ${n}`}return e}var t1,Ha,ab,mb=T(()=>{"use strict";Ue();WE();jd();YE();Du();of();Md();bd();Sd();QT();ff();rb();ze();t1=`usage: lmctl serve [--port N] [--bind HOST] [--no-daemon] [--insecure-no-auth] [--webui [DIR]]
2044
+ `)}function cb(t,e){let r=t!==void 0&&t!==""?t:e.LMCTL_LOCAL_WEBUI_DIR!==void 0&&e.LMCTL_LOCAL_WEBUI_DIR!==""?e.LMCTL_LOCAL_WEBUI_DIR:void 0;if(r===void 0)return null;let n=nb(r)?r:pf(process.cwd(),r);return QF(`${n}/index.html`)?n:null}function ub(t){let e=t.LMCTL_LOCAL_MAILBOX_DIR;return e!==void 0&&e!==""?nb(e)?e:pf(process.cwd(),e):pf(e1(),".lmctl","local-mailbox")}function a1(t){for(let e=0;e<t.length;e+=1)if(t[e]==="--port"){let r=t[e+1];if(r!==void 0&&!r.startsWith("--")){let n=Number(r);if(Number.isInteger(n)&&n>0&&n<=65535)return n}}}function db(t,e=process.env){let r=l1(t);return typeof r=="string"?r:r.bind==="0.0.0.0"&&!r.insecureNoAuth&&!e.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 l1(t){let e={port:8787,bind:"127.0.0.1",noDaemon:!1,insecureNoAuth:!1};for(let r=0;r<t.length;r+=1){let n=t[r];if(n==="--port"){let s=t[++r];if(s===void 0||s.startsWith("--"))return"missing value for --port";let o=Number(s);if(!Number.isInteger(o)||o<=0||o>65535)return`invalid --port: ${s}`;e.port=o;continue}if(n==="--bind"){let s=t[++r];if(s===void 0||s.startsWith("--"))return"missing value for --bind";e.bind=s;continue}if(n==="--no-daemon"){e.noDaemon=!0;continue}if(n==="--insecure-no-auth"){e.insecureNoAuth=!0;continue}if(n==="--webui"){let s=t[r+1];s!==void 0&&!s.startsWith("--")?(e.localWebui={dir:s},r+=1):e.localWebui={dir:void 0};continue}return`unknown argument: ${n}`}return e}var t1,Ha,ab,mb=T(()=>{"use strict";Ue();WE();Ld();YE();Du();of();Md();bd();Sd();QT();ff();rb();ze();t1=`usage: lmctl serve [--port N] [--bind HOST] [--no-daemon] [--insecure-no-auth] [--webui [DIR]]
2045
2045
 
2046
2046
  Start the local HTTP API, web UI, queue daemon, terminal manager, and agent
2047
2047
  services. Help exits before any port binding or daemon startup.
@@ -2051,39 +2051,39 @@ services. Help exits before any port binding or daemon startup.
2051
2051
  against the local filesystem (no S3, no Cognito) with a fixed
2052
2052
  local identity. Mailbox store defaults to
2053
2053
  ~/.lmctl/local-mailbox/ ($LMCTL_LOCAL_MAILBOX_DIR overrides).
2054
- `;Ha=class extends Error{missing;constructor(e){let r=e.map(n=>n.provider).join(", ");super(`provider binary pre-flight failed: ${r}`),this.name="ProviderBinaryPreflightError",this.missing=e}},ab=mf});var pb={};ae(pb,{runIntake:()=>u1});async function u1(t,e){let[r,...n]=t;return r==="--help"||r==="-h"||r==="help"?(e.stdout.write(c1),0):r==="scan"?d1(n,e):r==="config"?f1(n,e):(e.stderr.write(`usage: lmctl intake <scan|config> ...
2055
- `),1)}async function d1(t,e){let r=D(t,["--project"],["--json"]);if(r.error!==void 0)return y(e,r.error);if(r.positionals.length>0)return y(e,`unknown argument: ${r.positionals[0]}`);let n=A(r,"--project");return L(e,async s=>{if(n!==void 0){let o=s.findProjectByName(n);if(o===null)return y(e,`project not found: ${n}`);let i=await Cu({dal:s,project:o});return U(e,{project_id:o.id,project_name:o.name,...i}),0}return U(e,await Tn(s)),0})}async function f1(t,e){let[r,...n]=t;if(r===void 0||r.startsWith("--"))return y(e,"usage: lmctl intake config <project-name> --scan-github-issues true|false [--labels csv] [--state open|closed|all]");let s=D(n,["--scan-github-issues","--labels","--state"],["--json"]);if(s.error!==void 0)return y(e,s.error);let o=A(s,"--scan-github-issues");if(o!=="true"&&o!=="false")return y(e,"missing or invalid --scan-github-issues true|false");let i=A(s,"--state");if(i!==void 0&&i!=="open"&&i!=="closed"&&i!=="all")return y(e,"invalid --state: expected open, closed, or all");let a=A(s,"--labels"),l={scan_github_issues:o==="true",labels:a===void 0?void 0:a.split(",").map(c=>c.trim()).filter(Boolean),state:i};return L(e,c=>{let u=c.findProjectByName(r);if(u===null)return y(e,`project not found: ${r}`);let d=c.setProjectIntakeConfig(u.id,JSON.stringify(l));return U(e,d),0})}var c1,hb=T(()=>{"use strict";Bi();Te();c1=`usage: lmctl intake scan [--project NAME] [--json]
2054
+ `;Ha=class extends Error{missing;constructor(e){let r=e.map(n=>n.provider).join(", ");super(`provider binary pre-flight failed: ${r}`),this.name="ProviderBinaryPreflightError",this.missing=e}},ab=mf});var pb={};le(pb,{runIntake:()=>u1});async function u1(t,e){let[r,...n]=t;return r==="--help"||r==="-h"||r==="help"?(e.stdout.write(c1),0):r==="scan"?d1(n,e):r==="config"?f1(n,e):(e.stderr.write(`usage: lmctl intake <scan|config> ...
2055
+ `),1)}async function d1(t,e){let r=D(t,["--project"],["--json"]);if(r.error!==void 0)return y(e,r.error);if(r.positionals.length>0)return y(e,`unknown argument: ${r.positionals[0]}`);let n=A(r,"--project");return j(e,async s=>{if(n!==void 0){let o=s.findProjectByName(n);if(o===null)return y(e,`project not found: ${n}`);let i=await Cu({dal:s,project:o});return U(e,{project_id:o.id,project_name:o.name,...i}),0}return U(e,await Tn(s)),0})}async function f1(t,e){let[r,...n]=t;if(r===void 0||r.startsWith("--"))return y(e,"usage: lmctl intake config <project-name> --scan-github-issues true|false [--labels csv] [--state open|closed|all]");let s=D(n,["--scan-github-issues","--labels","--state"],["--json"]);if(s.error!==void 0)return y(e,s.error);let o=A(s,"--scan-github-issues");if(o!=="true"&&o!=="false")return y(e,"missing or invalid --scan-github-issues true|false");let i=A(s,"--state");if(i!==void 0&&i!=="open"&&i!=="closed"&&i!=="all")return y(e,"invalid --state: expected open, closed, or all");let a=A(s,"--labels"),l={scan_github_issues:o==="true",labels:a===void 0?void 0:a.split(",").map(c=>c.trim()).filter(Boolean),state:i};return j(e,c=>{let u=c.findProjectByName(r);if(u===null)return y(e,`project not found: ${r}`);let d=c.setProjectIntakeConfig(u.id,JSON.stringify(l));return U(e,d),0})}var c1,hb=T(()=>{"use strict";Bi();Te();c1=`usage: lmctl intake scan [--project NAME] [--json]
2056
2056
  lmctl intake config <project-name> --scan-github-issues true|false [--labels csv] [--state open|closed|all] [--json]
2057
2057
 
2058
2058
  Scan configured project GitHub issues into lmctl, or update per-project
2059
2059
  intake settings such as enabled state, labels, and issue state filters.
2060
2060
  scan writes JSON output; --project limits the scan to one project.
2061
- `});import{createHash as m1}from"node:crypto";import{existsSync as Xs,mkdirSync as p1,readFileSync as yb,realpathSync as h1,writeFileSync as _1}from"node:fs";import{basename as _b,dirname as wb,resolve as Eb}from"node:path";function xe(t,e){let r=Eb(t);if(Xs(r))return h1(r);if(e!==void 0){let n=w1(t,r,e);if(n!==null)return n}return r}function gb(t,e){let r=wb(e),n=ef(t,La(e),{baseDir:r});for(let s of n.members)s.sessiondir!==void 0&&!s.sessiondir.startsWith("/")&&(s.sessiondir=Eb(r,s.sessiondir));return n}function st(t,e){let r=xe(t,y1(e)?e:void 0);if(e!==void 0){let n=e.getRootTeam(r);if(n!==null)return!Xs(r)&&"upsertRootTeam"in e&&(p1(wb(r),{recursive:!0}),_1(r,n.raw_text,"utf8")),gb(n.raw_text,r);if(Xs(r)){let s=yb(r,"utf8"),o=gb(s,r);return"upsertRootTeam"in e&&E1(o)&&T1(e,r,o,s),o}throw new Error(`teamfile not found: ${t}`)}if(!Xs(r))throw new Error(`teamfile not found: ${t}`);return Pe(r)}function Tb(t,e,r){let n=xe(t,e),s=e.getRootTeam(n);s===null||!Xs(n)||yb(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 y1(t){return typeof t=="object"&&t!==null&&"getRootTeam"in t&&"listRootTeams"in t}function w1(t,e,r){let n=r.getRootTeam(t)??r.getRootTeam(e);if(n!==null)return n.teamfile_path;let s=_b(t),o=La(t),i=r.listRootTeams().filter(l=>_b(l.teamfile_path)===s||l.name===o);if(i.length===0)return null;if(i.length===1)return i[0].teamfile_path;let a=i.map(l=>l.teamfile_path).join(", ");throw new Error(`ambiguous teamfile "${t}" in root-team registry: ${a}; pass an absolute path`)}function E1(t){return t.parseErrors.length>0?!1:t.members.every(e=>e.teamfile!==void 0?!0:e.session!==void 0&&e.session.length>=g1)}function T1(t,e,r,n){let s=new Date().toISOString(),o={teamfile_path:e,name:r.name,raw_text:n,raw_sha256:m1("sha256").update(n).digest("hex"),registered_at:s,last_seeded_at:s};t.upsertRootTeam(o)}var g1,zt=T(()=>{"use strict";Yt();g1=5});import{existsSync as b1}from"node:fs";import{dirname as bb}from"node:path";function v1(t){return S1.test(t)||k1.test(t)}function Sb(t){return qa.test(t)}function Ur(t){if(!t.includes(":"))return null;let e=t.lastIndexOf(":"),r=t.slice(0,e),n=t.slice(e+1);return!r.endsWith(".lmctl")||!qa.test(n)?null:{teamfile:r,alias:n}}function ot(t,e,r){if(!t.endsWith(".lmctl"))throw new Ee(`lmctl: "${t}" doesn't look like a teamfile (expected .lmctl extension).`);if(!Sb(e))throw new Ee(`lmctl: "${e}" is not a valid alias (must match ${qa.source}).`);let n=xe(t,r);if(r===void 0&&!b1(n))throw new Ee(`lmctl: teamfile not found: ${t}`);let s;try{s=st(n,r)}catch(i){throw new Ee(`lmctl: ${t}: ${i instanceof Error?i.message:String(i)}`)}if(s.parseErrors.length>0)throw new Ee(`lmctl: ${t}: ${s.parseErrors.join("; ")}`);let o=Oa(s,e);if(o===void 0){let i=s.members.map(a=>a.alias).join(", ")||"(none)";throw new Ee(`lmctl: alias "${e}" not found in ${t}.
2061
+ `});import{createHash as m1}from"node:crypto";import{existsSync as Gs,mkdirSync as p1,readFileSync as yb,realpathSync as h1,writeFileSync as _1}from"node:fs";import{basename as _b,dirname as wb,resolve as Eb}from"node:path";function xe(t,e){let r=Eb(t);if(Gs(r))return h1(r);if(e!==void 0){let n=w1(t,r,e);if(n!==null)return n}return r}function gb(t,e){let r=wb(e),n=ef(t,ja(e),{baseDir:r});for(let s of n.members)s.sessiondir!==void 0&&!s.sessiondir.startsWith("/")&&(s.sessiondir=Eb(r,s.sessiondir));return n}function st(t,e){let r=xe(t,y1(e)?e:void 0);if(e!==void 0){let n=e.getRootTeam(r);if(n!==null)return!Gs(r)&&"upsertRootTeam"in e&&(p1(wb(r),{recursive:!0}),_1(r,n.raw_text,"utf8")),gb(n.raw_text,r);if(Gs(r)){let s=yb(r,"utf8"),o=gb(s,r);return"upsertRootTeam"in e&&E1(o)&&T1(e,r,o,s),o}throw new Error(`teamfile not found: ${t}`)}if(!Gs(r))throw new Error(`teamfile not found: ${t}`);return Pe(r)}function Tb(t,e,r){let n=xe(t,e),s=e.getRootTeam(n);s===null||!Gs(n)||yb(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 y1(t){return typeof t=="object"&&t!==null&&"getRootTeam"in t&&"listRootTeams"in t}function w1(t,e,r){let n=r.getRootTeam(t)??r.getRootTeam(e);if(n!==null)return n.teamfile_path;let s=_b(t),o=ja(t),i=r.listRootTeams().filter(l=>_b(l.teamfile_path)===s||l.name===o);if(i.length===0)return null;if(i.length===1)return i[0].teamfile_path;let a=i.map(l=>l.teamfile_path).join(", ");throw new Error(`ambiguous teamfile "${t}" in root-team registry: ${a}; pass an absolute path`)}function E1(t){return t.parseErrors.length>0?!1:t.members.every(e=>e.teamfile!==void 0?!0:e.session!==void 0&&e.session.length>=g1)}function T1(t,e,r,n){let s=new Date().toISOString(),o={teamfile_path:e,name:r.name,raw_text:n,raw_sha256:m1("sha256").update(n).digest("hex"),registered_at:s,last_seeded_at:s};t.upsertRootTeam(o)}var g1,zt=T(()=>{"use strict";Yt();g1=5});import{existsSync as b1}from"node:fs";import{dirname as bb}from"node:path";function v1(t){return S1.test(t)||k1.test(t)}function Sb(t){return qa.test(t)}function Ur(t){if(!t.includes(":"))return null;let e=t.lastIndexOf(":"),r=t.slice(0,e),n=t.slice(e+1);return!r.endsWith(".lmctl")||!qa.test(n)?null:{teamfile:r,alias:n}}function ot(t,e,r){if(!t.endsWith(".lmctl"))throw new Ee(`lmctl: "${t}" doesn't look like a teamfile (expected .lmctl extension).`);if(!Sb(e))throw new Ee(`lmctl: "${e}" is not a valid alias (must match ${qa.source}).`);let n=xe(t,r);if(r===void 0&&!b1(n))throw new Ee(`lmctl: teamfile not found: ${t}`);let s;try{s=st(n,r)}catch(i){throw new Ee(`lmctl: ${t}: ${i instanceof Error?i.message:String(i)}`)}if(s.parseErrors.length>0)throw new Ee(`lmctl: ${t}: ${s.parseErrors.join("; ")}`);let o=Oa(s,e);if(o===void 0){let i=s.members.map(a=>a.alias).join(", ")||"(none)";throw new Ee(`lmctl: alias "${e}" not found in ${t}.
2062
2062
  Known aliases: ${i}`)}if(o.teamfile!==void 0){let i=rf(o,bb(n));return{teamfile:n,alias:o.alias,provider:i.provider,sessionid:i.session,sessiondir:i.sessiondir,isLead:!0,...i.model??o.model?{model:i.model??o.model}:{},...i.effort??o.effort?{effort:i.effort??o.effort}:{}}}if(o.session===void 0)throw new Ee(`lmctl: alias "${o.alias}" in ${t} has no session ID yet.
2063
2063
  Run: lmctl seed ${t}`);return{teamfile:n,alias:o.alias,provider:o.provider,sessionid:o.session,sessiondir:o.sessiondir??bb(n),isLead:Rt(s)?.alias===o.alias,...o.model!==void 0?{model:o.model}:{},...o.effort!==void 0?{effort:o.effort}:{}}}function yr(t,e){let{target:r,alias:n,flags:s}=e;if(s.run!==void 0||s.project!==void 0||s.workflow!==void 0){if(r!==void 0)return{mode:"error",message:`lmctl ${t.name}: --run/--project/--workflow (managed mode) are mutually exclusive with a positional target "${r}" \u2014 pick one form.`};let i={mode:"managed"};return s.run!==void 0&&(i.run=s.run),s.project!==void 0&&(i.project=s.project),s.workflow!==void 0&&(i.workflow=s.workflow),i}if(r!==void 0){let i=Ur(r);if(i!==null)return n!==void 0&&n!==i.alias?{mode:"error",message:`lmctl ${t.name}: got "${r}" AND second positional "${n}" \u2014 pick one form.`}:{mode:"ai-team",teamfile:i.teamfile,alias:i.alias};if(r.endsWith(".lmctl"))return n!==void 0?Sb(n)?{mode:"ai-team",teamfile:r,alias:n}:{mode:"error",message:`lmctl ${t.name}: "${n}" is not a valid alias (must match ${qa.source}).`}:t.allowsBareTeamfile?{mode:"ai-team",teamfile:r}:{mode:"error",message:`lmctl ${t.name}: alias required.
2064
2064
  Use: lmctl ${t.name} ${r}:<alias> or lmctl ${t.name} ${r} <alias>`};if(v1(r)){if(n!==void 0)return{mode:"error",message:`lmctl ${t.name}: got a second positional "${n}" but "${r}" is not a teamfile path.`};if(!t.supportsRaw)return{mode:"error",message:`lmctl ${t.name}: "${r}" is a bare sessionid, but ${t.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 ${t.name}: got a second positional "${n}" but "${r}" is not a teamfile path.
2065
2065
  Either drop the second arg, or pass <teamfile>.lmctl as the first arg.`}:{mode:"error",message:`lmctl ${t.name}: can't infer target type from "${r}".
2066
2066
  Expected one of: <path>.lmctl, <path>.lmctl:<alias>, <sessionid>.`}}if(s.session!==void 0){if(!t.supportsRaw)return{mode:"error",message:`lmctl ${t.name}: --session (raw mode) is not supported by ${t.name}.`};let i={mode:"ai-team-raw",sessionid:s.session};return s.provider!==void 0&&(i.provider=s.provider),i}return{mode:"error",message:`lmctl ${t.name}: a target is required.
2067
- Use: <path>.lmctl[:<alias>] | <path>.lmctl <alias> | <sessionid> | --run <id>`}}var Ee,S1,k1,qa,Zt=T(()=>{"use strict";Yt();zt();Ee=class extends Error{constructor(e){super(e),this.name="ChatTargetError"}},S1=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,k1=/^ses_[A-Za-z0-9_-]+$/,qa=/^[A-Za-z][A-Za-z0-9_-]*$/});function Ib(t){let e=kb(t.registry,t.fromTeamfile);if(e===void 0)return Cn(`sender team is not registered in policy graph: ${t.fromTeamfile}`);if(!vb(e,t.fromAlias))return Cn(`sender alias "${t.fromAlias}" not found in ${t.fromTeamfile}`);let r=kb(t.registry,t.toTeamfile);return r===void 0?Cn(`target team is not registered in policy graph: ${t.toTeamfile}`):vb(r,t.toAlias)?t.toTeamfile===t.fromTeamfile?{allowed:!0,outOfPolicy:!1,reason:"same team"}:e.leadAlias===null?Cn(`sender team has no Lead: ${t.fromTeamfile}`):t.fromAlias!==e.leadAlias?Cn(`cross-team sends may only originate from Lead; got "${t.fromAlias}" in ${t.fromTeamfile}`):{allowed:!0,outOfPolicy:!1,reason:"cross-team send from Lead"}:Cn(`target alias "${t.toAlias}" not found in ${t.toTeamfile}`)}function kb(t,e){return t.teams.find(r=>r.teamfile===e)}function vb(t,e){return t.aliases.some(r=>r===e)}function Cn(t){return{allowed:!1,outOfPolicy:!0,reason:t}}var Nb=T(()=>{"use strict"});import{basename as I1}from"node:path";function Rb(t,e){let r=new Date(e.now.getTime()-Mn()).toISOString(),n=Lb(t,r).filter(f=>!f.sender.teamfile.startsWith("prompt:")),s=A1(e.sender,n),o=R1(e.sender,n);o!==null&&o.teamfile===e.root&&!Ab(s[0],o)&&s.unshift({...o,at:null});let i={teamfile:e.receiverTeamfile,alias:e.receiverAlias,at:e.now.getTime()},a=[...s,i],l=s.filter(f=>Ab(f,i)),c=l.map(f=>f.at).filter(f=>f!==null).sort((f,m)=>m-f)[0]??null,u=c!==null&&e.now.getTime()-c<N1;return{stop:l.length>=1&&u,chain:$1(a)}}function $b(t,e){let r=new Date(e.now.getTime()-Mn()).toISOString(),n=Lb(t,r),s=Ob(e.sender,n);if(s.length===0)return null;let o=s[0];return o.sender.teamfile.startsWith("prompt:")?o.receiver.teamfile:o.sender.teamfile}function Mn(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return xb;let r=Number(e);return!Number.isFinite(r)||r<=0?xb:r}function jb(t){return`cross-team cycle detected (${t}); stopping to prevent a runaway loop.`}function x1(t){return{sender:{teamfile:t.sender_teamfile,alias:t.sender_alias},receiver:{teamfile:t.receiver_teamfile,alias:t.receiver_alias},at:Date.parse(t.started_at)}}function Lb(t,e){return t.clearAgentInflightOlderThan(e),t.listAgentInflight().map(x1).filter(r=>Number.isFinite(r.at)&&new Date(r.at).toISOString()>=e).sort((r,n)=>r.at-n.at)}function A1(t,e,r={}){let n=new Map;for(let a of e)n.set(Wr(a.receiver),a);let s=[{...t,at:null}],o=t,i=new Set([Wr(t)]);for(let a=0;a<64;a+=1){let l=n.get(Wr(o));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 u=Wr(l.sender);if(i.has(u))break;s.unshift(c),i.add(u),o=l.sender}return s}function Ob(t,e){let r=Wr(t),n=new Set([r]),s=[r],o=[];for(let i=0;s.length>0&&i<128;i+=1){let a=s.shift();for(let l of e){let c=Wr(l.sender),u=Wr(l.receiver);c!==a&&u!==a||(o.includes(l)||o.push(l),n.has(c)||(n.add(c),s.push(c)),n.has(u)||(n.add(u),s.push(u)))}}return o.sort((i,a)=>i.at-a.at)}function R1(t,e){let r=Ob(t,e);if(r.length===0)return null;let n=r[0];return n.sender.teamfile.startsWith("prompt:")?n.receiver:n.sender}function Ab(t,e){return t.teamfile===e.teamfile&&t.alias===e.alias}function Wr(t){return`${t.teamfile}\0${t.alias}`}function $1(t){return t.map(e=>`${I1(e.teamfile)}:${e.alias}`).join(" \u2192 ")}var N1,xb,hf=T(()=>{"use strict";N1=6e4,xb=8*60*60*1e3});import{randomUUID as j1}from"node:crypto";import{hostname as Cb,networkInterfaces as L1}from"node:os";function Mb(t){let e=(t.now??new Date).toISOString();return{lock_id:j1(),teamfile:t.teamfile,alias:t.alias,holder_pid:t.pid??process.pid,holder_host:t.host??Cb(),holder_ips:t.ips??P1(),started_at:e,last_heartbeat:e}}function Db(t=process.env){return Pb(t.LMCTL_TERMINAL_LOCK_HEARTBEAT_MS,O1)}function M1(t=process.env){return Pb(t.LMCTL_TERMINAL_LOCK_STALE_MS,C1)}function _f(t,e={}){let r=e.now??new Date,n=e.localHost??Cb(),s=e.staleMs??M1();if(t.holder_host===n)return(e.isProcessAlive??D1)(t.holder_pid)?{live:!0,reason:"local-pid-alive"}:{live:!1,reason:"dead-pid"};let o=Date.parse(t.last_heartbeat);return Number.isFinite(o)?r.getTime()-o<=s?{live:!0,reason:"remote-heartbeat-fresh"}:{live:!1,reason:"stale-heartbeat"}:{live:!1,reason:"stale-heartbeat"}}function gf(t){return`${t.alias} is held by a terminal on ${t.holder_host} since ${t.started_at}; retry later`}function Pb(t,e){if(t===void 0||t.trim()==="")return e;let r=t.trim(),n=Number.parseInt(r,10);return!Number.isFinite(n)||n<=0||String(n)!==r?e:n}function D1(t){if(!Number.isInteger(t)||t<=0)return!1;try{return process.kill(t,0),!0}catch(e){return(e!==null&&typeof e=="object"&&"code"in e?e.code:void 0)!=="ESRCH"}}function P1(){let t=new Set;for(let e of Object.values(L1()))for(let r of e??[])r.internal||t.add(r.address);return[...t].sort()}var O1,C1,yf=T(()=>{"use strict";O1=15e3,C1=12e4});function F1(t){return`lmctl ${t}: LMCTL_SELF_SESSIONID is not set \u2014 it looks like you are running lmctl
2067
+ Use: <path>.lmctl[:<alias>] | <path>.lmctl <alias> | <sessionid> | --run <id>`}}var Ee,S1,k1,qa,Zt=T(()=>{"use strict";Yt();zt();Ee=class extends Error{constructor(e){super(e),this.name="ChatTargetError"}},S1=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,k1=/^ses_[A-Za-z0-9_-]+$/,qa=/^[A-Za-z][A-Za-z0-9_-]*$/});function Ib(t){let e=kb(t.registry,t.fromTeamfile);if(e===void 0)return Cn(`sender team is not registered in policy graph: ${t.fromTeamfile}`);if(!vb(e,t.fromAlias))return Cn(`sender alias "${t.fromAlias}" not found in ${t.fromTeamfile}`);let r=kb(t.registry,t.toTeamfile);return r===void 0?Cn(`target team is not registered in policy graph: ${t.toTeamfile}`):vb(r,t.toAlias)?t.toTeamfile===t.fromTeamfile?{allowed:!0,outOfPolicy:!1,reason:"same team"}:e.leadAlias===null?Cn(`sender team has no Lead: ${t.fromTeamfile}`):t.fromAlias!==e.leadAlias?Cn(`cross-team sends may only originate from Lead; got "${t.fromAlias}" in ${t.fromTeamfile}`):{allowed:!0,outOfPolicy:!1,reason:"cross-team send from Lead"}:Cn(`target alias "${t.toAlias}" not found in ${t.toTeamfile}`)}function kb(t,e){return t.teams.find(r=>r.teamfile===e)}function vb(t,e){return t.aliases.some(r=>r===e)}function Cn(t){return{allowed:!1,outOfPolicy:!0,reason:t}}var Nb=T(()=>{"use strict"});import{basename as I1}from"node:path";function Rb(t,e){let r=new Date(e.now.getTime()-Mn()).toISOString(),n=jb(t,r).filter(f=>!f.sender.teamfile.startsWith("prompt:")),s=A1(e.sender,n),o=R1(e.sender,n);o!==null&&o.teamfile===e.root&&!Ab(s[0],o)&&s.unshift({...o,at:null});let i={teamfile:e.receiverTeamfile,alias:e.receiverAlias,at:e.now.getTime()},a=[...s,i],l=s.filter(f=>Ab(f,i)),c=l.map(f=>f.at).filter(f=>f!==null).sort((f,m)=>m-f)[0]??null,u=c!==null&&e.now.getTime()-c<N1;return{stop:l.length>=1&&u,chain:$1(a)}}function $b(t,e){let r=new Date(e.now.getTime()-Mn()).toISOString(),n=jb(t,r),s=Ob(e.sender,n);if(s.length===0)return null;let o=s[0];return o.sender.teamfile.startsWith("prompt:")?o.receiver.teamfile:o.sender.teamfile}function Mn(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return xb;let r=Number(e);return!Number.isFinite(r)||r<=0?xb:r}function Lb(t){return`cross-team cycle detected (${t}); stopping to prevent a runaway loop.`}function x1(t){return{sender:{teamfile:t.sender_teamfile,alias:t.sender_alias},receiver:{teamfile:t.receiver_teamfile,alias:t.receiver_alias},at:Date.parse(t.started_at)}}function jb(t,e){return t.clearAgentInflightOlderThan(e),t.listAgentInflight().map(x1).filter(r=>Number.isFinite(r.at)&&new Date(r.at).toISOString()>=e).sort((r,n)=>r.at-n.at)}function A1(t,e,r={}){let n=new Map;for(let a of e)n.set(Wr(a.receiver),a);let s=[{...t,at:null}],o=t,i=new Set([Wr(t)]);for(let a=0;a<64;a+=1){let l=n.get(Wr(o));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 u=Wr(l.sender);if(i.has(u))break;s.unshift(c),i.add(u),o=l.sender}return s}function Ob(t,e){let r=Wr(t),n=new Set([r]),s=[r],o=[];for(let i=0;s.length>0&&i<128;i+=1){let a=s.shift();for(let l of e){let c=Wr(l.sender),u=Wr(l.receiver);c!==a&&u!==a||(o.includes(l)||o.push(l),n.has(c)||(n.add(c),s.push(c)),n.has(u)||(n.add(u),s.push(u)))}}return o.sort((i,a)=>i.at-a.at)}function R1(t,e){let r=Ob(t,e);if(r.length===0)return null;let n=r[0];return n.sender.teamfile.startsWith("prompt:")?n.receiver:n.sender}function Ab(t,e){return t.teamfile===e.teamfile&&t.alias===e.alias}function Wr(t){return`${t.teamfile}\0${t.alias}`}function $1(t){return t.map(e=>`${I1(e.teamfile)}:${e.alias}`).join(" \u2192 ")}var N1,xb,hf=T(()=>{"use strict";N1=6e4,xb=8*60*60*1e3});import{randomUUID as L1}from"node:crypto";import{hostname as Cb,networkInterfaces as j1}from"node:os";function Mb(t){let e=(t.now??new Date).toISOString();return{lock_id:L1(),teamfile:t.teamfile,alias:t.alias,holder_pid:t.pid??process.pid,holder_host:t.host??Cb(),holder_ips:t.ips??P1(),started_at:e,last_heartbeat:e}}function Db(t=process.env){return Pb(t.LMCTL_TERMINAL_LOCK_HEARTBEAT_MS,O1)}function M1(t=process.env){return Pb(t.LMCTL_TERMINAL_LOCK_STALE_MS,C1)}function _f(t,e={}){let r=e.now??new Date,n=e.localHost??Cb(),s=e.staleMs??M1();if(t.holder_host===n)return(e.isProcessAlive??D1)(t.holder_pid)?{live:!0,reason:"local-pid-alive"}:{live:!1,reason:"dead-pid"};let o=Date.parse(t.last_heartbeat);return Number.isFinite(o)?r.getTime()-o<=s?{live:!0,reason:"remote-heartbeat-fresh"}:{live:!1,reason:"stale-heartbeat"}:{live:!1,reason:"stale-heartbeat"}}function gf(t){return`${t.alias} is held by a terminal on ${t.holder_host} since ${t.started_at}; retry later`}function Pb(t,e){if(t===void 0||t.trim()==="")return e;let r=t.trim(),n=Number.parseInt(r,10);return!Number.isFinite(n)||n<=0||String(n)!==r?e:n}function D1(t){if(!Number.isInteger(t)||t<=0)return!1;try{return process.kill(t,0),!0}catch(e){return(e!==null&&typeof e=="object"&&"code"in e?e.code:void 0)!=="ESRCH"}}function P1(){let t=new Set;for(let e of Object.values(j1()))for(let r of e??[])r.internal||t.add(r.address);return[...t].sort()}var O1,C1,yf=T(()=>{"use strict";O1=15e3,C1=12e4});function F1(t){return`lmctl ${t}: LMCTL_SELF_SESSIONID is not set \u2014 it looks like you are running lmctl
2068
2068
  manually, outside a member session that lmctl started. Running lmctl this way is
2069
2069
  not officially supported.
2070
2070
  To experiment with it manually: https://lmctl.com/lmctl/docs/manual-invocation`}function Fb(t){return`lmctl ${t}: LMCTL_SELF_SESSIONID is set but does not match any member of a registered team.
2071
2071
  The session marker may be stale or the team may not be registered in this lmctl database.
2072
2072
  To experiment with it manually: https://lmctl.com/lmctl/docs/manual-invocation`}function Ub(t){return`unknown option --from
2073
- ${F1(t)}`}function Wb(t,e){let r=U1(t,e);return r.ok?{ok:!0,identity:r.identity,source:"session"}:r}function U1(t,e){let r=t[ns];if(r===void 0||r.length===0)return{ok:!1,reason:"unset"};let n=[];for(let o of e.listRootTeams()){let i=st(o.teamfile_path,e);for(let a of i.members)a.teamfile===void 0&&a.session===r&&n.push(`${o.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 wf=T(()=>{"use strict";lt();zt()});function Bb(t){let e=Ur(t);if(e===null)throw new Error(`invalid agent identity: ${t}`);return{teamfile:e.teamfile,alias:e.alias,value:t}}var Hb=T(()=>{"use strict";Zt()});import{hostname as W1}from"node:os";async function Xb(t){await q1(t.io,t.env);let e=await L(t.io,f=>f.listEnqueuedMailFromSender(t.sender.teamfile,t.sender.alias,t.receiver.teamfile,t.receiver.alias)),r=e.length===0?[]:await L(t.io,f=>f.claimMailForDelivery(e.map(m=>m.id),new Date().toISOString(),process.pid,W1())),n=B1(r,t.newMessage);if(n.length===0)throw new Error(`no queued mail to deliver for ${t.sender.teamfile}:${t.sender.alias} -> ${t.receiver.teamfile}:${t.receiver.alias}`);let s=!1,o=fe(),i=0,a=0,l=0,c={provider:t.receiver.provider,sessionId:t.receiver.sessionId,cwd:t.receiver.cwd,prompt:n,permissionMode:t.permissionMode,env:t.env,onDelta:f=>{s=!0,o&&(i+=1,l=Buffer.byteLength(f,"utf8"),a+=l),t.onDelta?.(f)},onProgress:f=>t.onProgress?.(f)};t.receiver.model!==void 0&&(c.model=t.receiver.model),t.receiver.effort!==void 0&&(c.effort=t.receiver.effort),c.alias=t.receiver.alias,c.isLead=t.receiver.isLead,t.idleTimeoutMs!==void 0&&(c.timeoutMs=t.idleTimeoutMs);let u;try{u=await Wt(c)}catch(f){throw await Jb(t.io,r.map(m=>m.id)),f}if(o&&Oe(JSON.stringify({event:"chat_return",alias:t.receiver.alias,provider:t.receiver.provider,streamed:s,blockCount:i,streamedBytes:a,resultTextBytes:Buffer.byteLength(u.text,"utf8"),lastChunkBytes:l,tailPreview:u.text.slice(-200)})),u.status==="stalled")return await Jb(t.io,r.map(f=>f.id)),{status:"stalled",receipt:u.text,prompt:n,queued:r,deliveredIds:[],wroteDelta:s,durationMs:u.durationMs,stalledAfterMs:u.stalledAfterMs};let d=r.map(f=>f.id);return await H1(t.io,d,u.text),{status:"ok",receipt:u.text,prompt:n,queued:r,deliveredIds:d,wroteDelta:s,durationMs:u.durationMs}}function B1(t,e){if(t.length===0)return e??"";let r=t.map((n,s)=>[`--- queued message ${s+1} (mail #${n.id}, sent ${n.created_at}) ---`,n.payload].join(`
2073
+ ${F1(t)}`}function Wb(t,e){let r=U1(t,e);return r.ok?{ok:!0,identity:r.identity,source:"session"}:r}function U1(t,e){let r=t[ss];if(r===void 0||r.length===0)return{ok:!1,reason:"unset"};let n=[];for(let o of e.listRootTeams()){let i=st(o.teamfile_path,e);for(let a of i.members)a.teamfile===void 0&&a.session===r&&n.push(`${o.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 wf=T(()=>{"use strict";lt();zt()});function Bb(t){let e=Ur(t);if(e===null)throw new Error(`invalid agent identity: ${t}`);return{teamfile:e.teamfile,alias:e.alias,value:t}}var Hb=T(()=>{"use strict";Zt()});import{hostname as W1}from"node:os";async function Xb(t){await q1(t.io,t.env);let e=await j(t.io,f=>f.listEnqueuedMailFromSender(t.sender.teamfile,t.sender.alias,t.receiver.teamfile,t.receiver.alias)),r=e.length===0?[]:await j(t.io,f=>f.claimMailForDelivery(e.map(m=>m.id),new Date().toISOString(),process.pid,W1())),n=B1(r,t.newMessage);if(n.length===0)throw new Error(`no queued mail to deliver for ${t.sender.teamfile}:${t.sender.alias} -> ${t.receiver.teamfile}:${t.receiver.alias}`);let s=!1,o=fe(),i=0,a=0,l=0,c={provider:t.receiver.provider,sessionId:t.receiver.sessionId,cwd:t.receiver.cwd,prompt:n,permissionMode:t.permissionMode,env:t.env,onDelta:f=>{s=!0,o&&(i+=1,l=Buffer.byteLength(f,"utf8"),a+=l),t.onDelta?.(f)},onProgress:f=>t.onProgress?.(f)};t.receiver.model!==void 0&&(c.model=t.receiver.model),t.receiver.effort!==void 0&&(c.effort=t.receiver.effort),c.alias=t.receiver.alias,c.isLead=t.receiver.isLead,t.idleTimeoutMs!==void 0&&(c.timeoutMs=t.idleTimeoutMs);let u;try{u=await Wt(c)}catch(f){throw await Jb(t.io,r.map(m=>m.id)),f}if(o&&Oe(JSON.stringify({event:"chat_return",alias:t.receiver.alias,provider:t.receiver.provider,streamed:s,blockCount:i,streamedBytes:a,resultTextBytes:Buffer.byteLength(u.text,"utf8"),lastChunkBytes:l,tailPreview:u.text.slice(-200)})),u.status==="stalled")return await Jb(t.io,r.map(f=>f.id)),{status:"stalled",receipt:u.text,prompt:n,queued:r,deliveredIds:[],wroteDelta:s,durationMs:u.durationMs,stalledAfterMs:u.stalledAfterMs};let d=r.map(f=>f.id);return await H1(t.io,d,u.text),{status:"ok",receipt:u.text,prompt:n,queued:r,deliveredIds:d,wroteDelta:s,durationMs:u.durationMs}}function B1(t,e){if(t.length===0)return e??"";let r=t.map((n,s)=>[`--- queued message ${s+1} (mail #${n.id}, sent ${n.created_at}) ---`,n.payload].join(`
2074
2074
  `));return e!==void 0&&r.push(["--- new message ---",e].join(`
2075
2075
  `)),r.join(`
2076
2076
 
2077
- `)}async function H1(t,e,r){if(e.length!==0)try{await L(t,n=>{n.markMailDelivered(e,r,new Date().toISOString())})}catch(n){t.stderr.write(`warning: failed to mark queued mailbox mail delivered: ${n instanceof Error?n.message:String(n)}
2078
- `)}}async function Jb(t,e){if(e.length!==0)try{await L(t,r=>{r.clearMailDelivery(e)})}catch(r){t.stderr.write(`warning: failed to clear queued mailbox delivery marker: ${r instanceof Error?r.message:String(r)}
2079
- `)}}async function q1(t,e){try{await L(t,r=>{r.reclaimStaleMailboxDeliveries(new Date(Date.now()-J1(e)).toISOString())})}catch{}}function J1(t){let e=t.LMCTL_MAILBOX_DELIVERY_STALE_MS;if(e===void 0||e.trim()==="")return qb;let r=Number(e);return!Number.isFinite(r)||r<=0?qb:r}var qb,Gb=T(()=>{"use strict";kt();Ie();Te();qb=8*60*60*1e3});async function Ka(t){let e=t.onEvent??(()=>{}),r=G1(t.io,e),n=null,s=null,o=null,i,a=null,l=t.prompt;try{let c=await L(r,E=>ot(t.teamfile,t.alias,E)),u=c.teamfile,d=await L(r,E=>eU(E,t.env??process.env)),f=d.sender,m=await tU(r,{explicitRoot:t.rootFlag,sender:f,receiverTeamfile:u,operatorOrigin:d.origin==="operator"});o=await Y1(r,{receiverTeamfile:u,receiverAlias:c.alias,sender:f,rootTeamfile:m,provider:c.provider,model:c.model,sessionId:c.sessionid,cwd:c.sessiondir,prompt:t.prompt,origin:d.origin}),i=Z1(r,o);let p=f===null?null:await rU(r,{rootTeamfile:m,sender:f,receiverTeamfile:u,receiverAlias:c.alias});p!==null&&!p.allowed&&e({kind:"warning",message:`warning: out-of-policy chat send: ${p.reason}
2080
- `});try{mn(r,Pe(u),u)}catch{}n={root_teamfile:m,sender_teamfile:f?.teamfile??null,sender_alias:f?.alias??null,receiver_teamfile:u,receiver_alias:c.alias,origin:d.origin,policy:p};let h=await zb(r,u,c.alias);if(h!==null){let E=gf(h);if(f!==null){let x=await Ef(r,{sender:f,receiverTeamfile:u,receiverAlias:c.alias,rootTeamfile:m,payload:t.prompt});return a=Ja(`enqueued mailbox message ${x.id}`,null),Tf(x.id,f,u,c.alias)}let I=await Dn(r,{...n,message:t.prompt,response:null,status:"error",error_detail:E});return a=bf(E,I),{status:"busy",message:E,teamChatLogId:I}}if(await K1(r,u,c.alias)){if(f!==null){let x=await Ef(r,{sender:f,receiverTeamfile:u,receiverAlias:c.alias,rootTeamfile:m,payload:t.prompt});return a=Ja(`enqueued mailbox message ${x.id}`,null),Tf(x.id,f,u,c.alias)}let E=await V1(r,u,c.alias),I=await Dn(r,{...n,message:t.prompt,response:null,status:"error",error_detail:E});return a=bf(E,I),{status:"busy",message:E,teamChatLogId:I}}if(f!==null&&f.teamfile!==u){let E=await L(r,I=>Rb(I,{root:m,sender:f,receiverTeamfile:u,receiverAlias:c.alias,now:new Date}));if(E.stop){let I=jb(E.chain),x=await Dn(r,{...n,message:t.prompt,response:null,status:"error",error_detail:I});return a=Xa(I,x),{status:"error",errorKind:"cycle",message:I,teamChatLogId:x}}}let g=await oU(r,{receiver_teamfile:u,receiver_alias:c.alias,sender_teamfile:f?.teamfile??u,sender_alias:f?.alias??"operator"});if(!g.acquired){let E=Zb(u,c.alias,g.current);if(f!==null){let x=await Ef(r,{sender:f,receiverTeamfile:u,receiverAlias:c.alias,rootTeamfile:m,payload:t.prompt});return a=Ja(`enqueued mailbox message ${x.id}`,null),Tf(x.id,f,u,c.alias)}let I=await Dn(r,{...n,message:t.prompt,response:null,status:"error",error_detail:E});return a=bf(E,I),{status:"busy",message:E,teamChatLogId:I}}s=g.lease;let _=await Xb({sender:f??{teamfile:u,alias:"operator"},receiver:{teamfile:u,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:t.prompt,io:r,permissionMode:t.permissionMode,env:t.env??process.env,...t.idleTimeoutMs!==void 0?{idleTimeoutMs:t.idleTimeoutMs}:{},onDelta:E=>e({kind:"delta",chunk:E}),onProgress:E=>e({kind:"progress",alias:c.alias,event:E})});l=_.prompt;let S=_.status==="stalled",w=await Dn(r,{...n,message:l,response:S?null:_.receipt,status:n.policy?.outOfPolicy===!0?"out_of_policy":S?"error":"ok",error_detail:n.policy?.outOfPolicy===!0?n.policy.reason:S?`provider stalled${_.stalledAfterMs!==void 0?` after ${_.stalledAfterMs}ms`:""}`:null});return a=S?Xa(`provider stalled${_.stalledAfterMs!==void 0?` after ${_.stalledAfterMs}ms`:""}`,w,_.receipt):Ja(_.receipt,w),{status:S?"stalled":"ok",replyText:_.receipt,wroteDelta:_.wroteDelta,teamChatLogId:w,durationMs:_.durationMs}}catch(c){let u=c instanceof Error?c.message:String(c),d=n===null?null:await Dn(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: ${u}`:u});return a=Xa(u,d),{status:"error",errorKind:c instanceof Ee?"target":"provider",message:u,teamChatLogId:d}}finally{i!==void 0&&clearInterval(i),s!==null&&await iU(r,s),o!==null&&await z1(r,o,a??Xa("chat turn exited without a terminal outcome",null))}}function G1(t,e){return{...t,stdout:{write:()=>{}},stderr:{write:r=>{e({kind:"warning",message:r})}}}}async function K1(t,e,r){return await L(t,n=>jT(n,e,r))}async function V1(t,e,r){let n=await zb(t,e,r);if(n!==null)return gf(n);let s=await L(t,o=>o.getAgentInflight(e,r));return s!==null?Zb(e,r,s):`${r} is busy; wait and retry`}async function Ef(t,e){return await L(t,r=>r.enqueueMail({sender_teamfile:e.sender.teamfile,sender_alias:e.sender.alias,receiver_teamfile:e.receiverTeamfile,receiver_alias:e.receiverAlias,root_teamfile:e.rootTeamfile,payload:e.payload}))}function Tf(t,e,r,n){let s=`${r}:${n}`;return{status:"enqueued",id:t,message:`mailbox message ${t} enqueued to ${s}`,teamChatLogId:null,sender:`${e.teamfile}:${e.alias}`,receiver:s}}async function Y1(t,e){try{return(await L(t,n=>n.startTrackedInvocation({kind:"chat",origin:e.origin,scope_teamfile:e.receiverTeamfile,from_identity:e.sender===null?"operator":`${e.sender.teamfile}:${e.sender.alias}`,target_teamfile:e.receiverTeamfile,target_alias:e.receiverAlias,root_teamfile:e.rootTeamfile,cwd:e.cwd??null,command:Q1(e.receiverTeamfile,e.receiverAlias,e.prompt),holder_pid:process.pid,meta:JSON.stringify({provider:e.provider,model:e.model??null,sessionid:e.sessionId??null})}))).id}catch(r){return fe()&&Oe(JSON.stringify({event:"tracked_invocation_start_error",error:r instanceof Error?r.message:String(r)})),null}}async function z1(t,e,r){try{await L(t,n=>{n.finishTrackedInvocation(e,r)})}catch(n){fe()&&Oe(JSON.stringify({event:"tracked_invocation_finish_error",id:e,error:n instanceof Error?n.message:String(n)}))}}function Z1(t,e){if(e===null)return;let r=setInterval(()=>{L(t,n=>n.heartbeatTrackedInvocation(e)).catch(n=>{fe()&&Oe(JSON.stringify({event:"tracked_invocation_heartbeat_error",id:e,error:n instanceof Error?n.message:String(n)}))})},X1);return r.unref?.(),r}function Ja(t,e){return{status:"done",result_summary:Ga(t),error:null,team_chat_log_id:e}}function bf(t,e){return{status:"busy",result_summary:Ga(t),error:t,team_chat_log_id:e}}function Xa(t,e,r){return{status:"error",result_summary:Ga(r===void 0?t:r),error:t,team_chat_log_id:e}}function Ga(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=500?e:`${e.slice(0,497)}...`}function Q1(t,e,r){return`lmctl chat ${JSON.stringify(t)} ${e} ${JSON.stringify(r)}`}function eU(t,e){let r=Wb(e,t);if(r.ok)return{sender:Bb(r.identity),origin:"agent"};if(r.reason==="unset")return{sender:null,origin:"operator"};throw new Error(Fb("chat"))}async function tU(t,e){if(e.explicitRoot!==void 0)return await L(t,n=>xe(e.explicitRoot,n));if(e.operatorOrigin||e.sender===null)return e.receiverTeamfile;let r=e.sender;return await L(t,n=>$b(n,{sender:r,now:new Date})??e.receiverTeamfile)}async function rU(t,e){return await L(t,r=>Ib({rootTeamfile:e.rootTeamfile,fromTeamfile:e.sender.teamfile,fromAlias:e.sender.alias,toTeamfile:e.receiverTeamfile,toAlias:e.receiverAlias,registry:nU(r,e.sender.teamfile,e.receiverTeamfile)}))}function nU(t,e,r){return{teams:[e,r].map(s=>sU(s,t))}}function sU(t,e){let r=st(t,e),n=Rt(r);return{teamfile:t,aliases:r.members.map(s=>s.alias),leadAlias:n?.alias??null}}async function oU(t,e){return await L(t,r=>{let n=fe(),s=Ln(r,{receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,ttlMs:Mn()});return s.acquired?(n&&Oe(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:s.reclaimReason===null?"acquired":"reclaimed",...s.reclaimReason===null?{}:{reclaim_reason:s.reclaimReason,holder:Vb(s.previous)}})),{acquired:!0,lease:s.lease}):(n&&Oe(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:"rejected",holder:Vb(s.current)})),{acquired:!1,current:s.current})})}async function zb(t,e,r){return await L(t,n=>{for(let o=0;o<2;o+=1){let i=n.getTerminalLock(e,r);if(i===null)return null;if(_f(i).live)return i;let l=n.getAgentInflight(e,r);if(n.clearTerminalLock(e,r,i.lock_id))return l!==null&&l.sender_teamfile===e&&l.sender_alias==="terminal"&&n.clearObservedTerminalAgentInflight(e,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(e,r);return s===null?null:_f(s).live?s:null})}function Vb(t){return t===null?null:{sender_teamfile:t.sender_teamfile,sender_alias:t.sender_alias,holder_pid:t.holder_pid,started_at:t.started_at}}async function iU(t,e){try{await L(t,r=>{r.releaseAgentInflight(e)})}catch(r){t.stderr.write(`warning: failed to release chat in-flight slot: ${r instanceof Error?r.message:String(r)}
2081
- `)}}function Zb(t,e,r){return`${e} is servicing ${r.sender_alias} (${r.sender_teamfile}) since ${r.started_at} \u2014 wait and retry, or inspect without waking it: lmctl tail "${t}" ${e}`}async function Dn(t,e){let r=Yb(e.message),n=e.response===null?null:Yb(e.response);try{return await L(t,s=>s.insertTeamChatLog({root_teamfile:e.root_teamfile,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,message:r.text,response:n?.text??null,origin:e.origin,status:e.status,error_detail:e.error_detail,truncated:r.truncated||n?.truncated?1:0,created_at:new Date().toISOString()}))}catch(s){return t.stderr.write(`warning: failed to record chat log: ${s instanceof Error?s.message:String(s)}
2082
- `),null}}function Yb(t){return t.length<=Kb?{text:t,truncated:!1}:{text:t.slice(0,Kb),truncated:!0}}var Kb,X1,Sf=T(()=>{"use strict";Zt();Yt();bs();Nb();zt();hf();Ie();Te();Ca();yf();wf();Hb();Gb();Kb=256*1024,X1=3e4});var rS={};ae(rS,{parseIdleTimeoutMs:()=>eS,runChat:()=>lU});async function lU(t,e={stdout:process.stdout,stderr:process.stderr}){let r=e.env??process.env;if(t.length===0||t[0]==="--help"||t[0]==="-h")return e.stdout.write(`${Qb}
2077
+ `)}async function H1(t,e,r){if(e.length!==0)try{await j(t,n=>{n.markMailDelivered(e,r,new Date().toISOString())})}catch(n){t.stderr.write(`warning: failed to mark queued mailbox mail delivered: ${n instanceof Error?n.message:String(n)}
2078
+ `)}}async function Jb(t,e){if(e.length!==0)try{await j(t,r=>{r.clearMailDelivery(e)})}catch(r){t.stderr.write(`warning: failed to clear queued mailbox delivery marker: ${r instanceof Error?r.message:String(r)}
2079
+ `)}}async function q1(t,e){try{await j(t,r=>{r.reclaimStaleMailboxDeliveries(new Date(Date.now()-J1(e)).toISOString())})}catch{}}function J1(t){let e=t.LMCTL_MAILBOX_DELIVERY_STALE_MS;if(e===void 0||e.trim()==="")return qb;let r=Number(e);return!Number.isFinite(r)||r<=0?qb:r}var qb,Gb=T(()=>{"use strict";kt();Ie();Te();qb=8*60*60*1e3});async function Ka(t){let e=t.onEvent??(()=>{}),r=G1(t.io,e),n=null,s=null,o=null,i,a=null,l=t.prompt;try{let c=await j(r,E=>ot(t.teamfile,t.alias,E)),u=c.teamfile,d=await j(r,E=>eU(E,t.env??process.env)),f=d.sender,m=await tU(r,{explicitRoot:t.rootFlag,sender:f,receiverTeamfile:u,operatorOrigin:d.origin==="operator"});o=await Y1(r,{receiverTeamfile:u,receiverAlias:c.alias,sender:f,rootTeamfile:m,provider:c.provider,model:c.model,sessionId:c.sessionid,cwd:c.sessiondir,prompt:t.prompt,origin:d.origin}),i=Z1(r,o);let p=f===null?null:await rU(r,{rootTeamfile:m,sender:f,receiverTeamfile:u,receiverAlias:c.alias});p!==null&&!p.allowed&&e({kind:"warning",message:`warning: out-of-policy chat send: ${p.reason}
2080
+ `});try{mn(r,Pe(u),u)}catch{}n={root_teamfile:m,sender_teamfile:f?.teamfile??null,sender_alias:f?.alias??null,receiver_teamfile:u,receiver_alias:c.alias,origin:d.origin,policy:p};let h=await zb(r,u,c.alias);if(h!==null){let E=gf(h);if(f!==null){let x=await Ef(r,{sender:f,receiverTeamfile:u,receiverAlias:c.alias,rootTeamfile:m,payload:t.prompt});return a=Ja(`enqueued mailbox message ${x.id}`,null),Tf(x.id,f,u,c.alias)}let I=await Dn(r,{...n,message:t.prompt,response:null,status:"error",error_detail:E});return a=bf(E,I),{status:"busy",message:E,teamChatLogId:I}}if(await K1(r,u,c.alias)){if(f!==null){let x=await Ef(r,{sender:f,receiverTeamfile:u,receiverAlias:c.alias,rootTeamfile:m,payload:t.prompt});return a=Ja(`enqueued mailbox message ${x.id}`,null),Tf(x.id,f,u,c.alias)}let E=await V1(r,u,c.alias),I=await Dn(r,{...n,message:t.prompt,response:null,status:"error",error_detail:E});return a=bf(E,I),{status:"busy",message:E,teamChatLogId:I}}if(f!==null&&f.teamfile!==u){let E=await j(r,I=>Rb(I,{root:m,sender:f,receiverTeamfile:u,receiverAlias:c.alias,now:new Date}));if(E.stop){let I=Lb(E.chain),x=await Dn(r,{...n,message:t.prompt,response:null,status:"error",error_detail:I});return a=Xa(I,x),{status:"error",errorKind:"cycle",message:I,teamChatLogId:x}}}let g=await oU(r,{receiver_teamfile:u,receiver_alias:c.alias,sender_teamfile:f?.teamfile??u,sender_alias:f?.alias??"operator"});if(!g.acquired){let E=Zb(u,c.alias,g.current);if(f!==null){let x=await Ef(r,{sender:f,receiverTeamfile:u,receiverAlias:c.alias,rootTeamfile:m,payload:t.prompt});return a=Ja(`enqueued mailbox message ${x.id}`,null),Tf(x.id,f,u,c.alias)}let I=await Dn(r,{...n,message:t.prompt,response:null,status:"error",error_detail:E});return a=bf(E,I),{status:"busy",message:E,teamChatLogId:I}}s=g.lease;let _=await Xb({sender:f??{teamfile:u,alias:"operator"},receiver:{teamfile:u,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:t.prompt,io:r,permissionMode:t.permissionMode,env:t.env??process.env,...t.idleTimeoutMs!==void 0?{idleTimeoutMs:t.idleTimeoutMs}:{},onDelta:E=>e({kind:"delta",chunk:E}),onProgress:E=>e({kind:"progress",alias:c.alias,event:E})});l=_.prompt;let S=_.status==="stalled",w=await Dn(r,{...n,message:l,response:S?null:_.receipt,status:n.policy?.outOfPolicy===!0?"out_of_policy":S?"error":"ok",error_detail:n.policy?.outOfPolicy===!0?n.policy.reason:S?`provider stalled${_.stalledAfterMs!==void 0?` after ${_.stalledAfterMs}ms`:""}`:null});return a=S?Xa(`provider stalled${_.stalledAfterMs!==void 0?` after ${_.stalledAfterMs}ms`:""}`,w,_.receipt):Ja(_.receipt,w),{status:S?"stalled":"ok",replyText:_.receipt,wroteDelta:_.wroteDelta,teamChatLogId:w,durationMs:_.durationMs}}catch(c){let u=c instanceof Error?c.message:String(c),d=n===null?null:await Dn(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: ${u}`:u});return a=Xa(u,d),{status:"error",errorKind:c instanceof Ee?"target":"provider",message:u,teamChatLogId:d}}finally{i!==void 0&&clearInterval(i),s!==null&&await iU(r,s),o!==null&&await z1(r,o,a??Xa("chat turn exited without a terminal outcome",null))}}function G1(t,e){return{...t,stdout:{write:()=>{}},stderr:{write:r=>{e({kind:"warning",message:r})}}}}async function K1(t,e,r){return await j(t,n=>LT(n,e,r))}async function V1(t,e,r){let n=await zb(t,e,r);if(n!==null)return gf(n);let s=await j(t,o=>o.getAgentInflight(e,r));return s!==null?Zb(e,r,s):`${r} is busy; wait and retry`}async function Ef(t,e){return await j(t,r=>r.enqueueMail({sender_teamfile:e.sender.teamfile,sender_alias:e.sender.alias,receiver_teamfile:e.receiverTeamfile,receiver_alias:e.receiverAlias,root_teamfile:e.rootTeamfile,payload:e.payload}))}function Tf(t,e,r,n){let s=`${r}:${n}`;return{status:"enqueued",id:t,message:`mailbox message ${t} enqueued to ${s}`,teamChatLogId:null,sender:`${e.teamfile}:${e.alias}`,receiver:s}}async function Y1(t,e){try{return(await j(t,n=>n.startTrackedInvocation({kind:"chat",origin:e.origin,scope_teamfile:e.receiverTeamfile,from_identity:e.sender===null?"operator":`${e.sender.teamfile}:${e.sender.alias}`,target_teamfile:e.receiverTeamfile,target_alias:e.receiverAlias,root_teamfile:e.rootTeamfile,cwd:e.cwd??null,command:Q1(e.receiverTeamfile,e.receiverAlias,e.prompt),holder_pid:process.pid,meta:JSON.stringify({provider:e.provider,model:e.model??null,sessionid:e.sessionId??null})}))).id}catch(r){return fe()&&Oe(JSON.stringify({event:"tracked_invocation_start_error",error:r instanceof Error?r.message:String(r)})),null}}async function z1(t,e,r){try{await j(t,n=>{n.finishTrackedInvocation(e,r)})}catch(n){fe()&&Oe(JSON.stringify({event:"tracked_invocation_finish_error",id:e,error:n instanceof Error?n.message:String(n)}))}}function Z1(t,e){if(e===null)return;let r=setInterval(()=>{j(t,n=>n.heartbeatTrackedInvocation(e)).catch(n=>{fe()&&Oe(JSON.stringify({event:"tracked_invocation_heartbeat_error",id:e,error:n instanceof Error?n.message:String(n)}))})},X1);return r.unref?.(),r}function Ja(t,e){return{status:"done",result_summary:Ga(t),error:null,team_chat_log_id:e}}function bf(t,e){return{status:"busy",result_summary:Ga(t),error:t,team_chat_log_id:e}}function Xa(t,e,r){return{status:"error",result_summary:Ga(r===void 0?t:r),error:t,team_chat_log_id:e}}function Ga(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=500?e:`${e.slice(0,497)}...`}function Q1(t,e,r){return`lmctl chat ${JSON.stringify(t)} ${e} ${JSON.stringify(r)}`}function eU(t,e){let r=Wb(e,t);if(r.ok)return{sender:Bb(r.identity),origin:"agent"};if(r.reason==="unset")return{sender:null,origin:"operator"};throw new Error(Fb("chat"))}async function tU(t,e){if(e.explicitRoot!==void 0)return await j(t,n=>xe(e.explicitRoot,n));if(e.operatorOrigin||e.sender===null)return e.receiverTeamfile;let r=e.sender;return await j(t,n=>$b(n,{sender:r,now:new Date})??e.receiverTeamfile)}async function rU(t,e){return await j(t,r=>Ib({rootTeamfile:e.rootTeamfile,fromTeamfile:e.sender.teamfile,fromAlias:e.sender.alias,toTeamfile:e.receiverTeamfile,toAlias:e.receiverAlias,registry:nU(r,e.sender.teamfile,e.receiverTeamfile)}))}function nU(t,e,r){return{teams:[e,r].map(s=>sU(s,t))}}function sU(t,e){let r=st(t,e),n=Rt(r);return{teamfile:t,aliases:r.members.map(s=>s.alias),leadAlias:n?.alias??null}}async function oU(t,e){return await j(t,r=>{let n=fe(),s=jn(r,{receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,ttlMs:Mn()});return s.acquired?(n&&Oe(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:s.reclaimReason===null?"acquired":"reclaimed",...s.reclaimReason===null?{}:{reclaim_reason:s.reclaimReason,holder:Vb(s.previous)}})),{acquired:!0,lease:s.lease}):(n&&Oe(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:"rejected",holder:Vb(s.current)})),{acquired:!1,current:s.current})})}async function zb(t,e,r){return await j(t,n=>{for(let o=0;o<2;o+=1){let i=n.getTerminalLock(e,r);if(i===null)return null;if(_f(i).live)return i;let l=n.getAgentInflight(e,r);if(n.clearTerminalLock(e,r,i.lock_id))return l!==null&&l.sender_teamfile===e&&l.sender_alias==="terminal"&&n.clearObservedTerminalAgentInflight(e,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(e,r);return s===null?null:_f(s).live?s:null})}function Vb(t){return t===null?null:{sender_teamfile:t.sender_teamfile,sender_alias:t.sender_alias,holder_pid:t.holder_pid,started_at:t.started_at}}async function iU(t,e){try{await j(t,r=>{r.releaseAgentInflight(e)})}catch(r){t.stderr.write(`warning: failed to release chat in-flight slot: ${r instanceof Error?r.message:String(r)}
2081
+ `)}}function Zb(t,e,r){return`${e} is servicing ${r.sender_alias} (${r.sender_teamfile}) since ${r.started_at} \u2014 wait and retry, or inspect without waking it: lmctl tail "${t}" ${e}`}async function Dn(t,e){let r=Yb(e.message),n=e.response===null?null:Yb(e.response);try{return await j(t,s=>s.insertTeamChatLog({root_teamfile:e.root_teamfile,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,message:r.text,response:n?.text??null,origin:e.origin,status:e.status,error_detail:e.error_detail,truncated:r.truncated||n?.truncated?1:0,created_at:new Date().toISOString()}))}catch(s){return t.stderr.write(`warning: failed to record chat log: ${s instanceof Error?s.message:String(s)}
2082
+ `),null}}function Yb(t){return t.length<=Kb?{text:t,truncated:!1}:{text:t.slice(0,Kb),truncated:!0}}var Kb,X1,Sf=T(()=>{"use strict";Zt();Yt();Ss();Nb();zt();hf();Ie();Te();Ca();yf();wf();Hb();Gb();Kb=256*1024,X1=3e4});var rS={};le(rS,{parseIdleTimeoutMs:()=>eS,runChat:()=>lU});async function lU(t,e={stdout:process.stdout,stderr:process.stderr}){let r=e.env??process.env;if(t.length===0||t[0]==="--help"||t[0]==="-h")return e.stdout.write(`${Qb}
2083
2083
  `),t.length===0?2:0;let n=cU(t);if(typeof n=="string")return e.stderr.write(`error: ${n}
2084
2084
  ${Qb}
2085
2085
  `),2;if(n.runFlag!==void 0){let d=Number.parseInt(n.runFlag,10);return!Number.isFinite(d)||d<=0||String(d)!==n.runFlag?(e.stderr.write(`error: invalid --run "${n.runFlag}" (expected a positive integer run id)
2086
- `),2):await L(e,async f=>{let m=f.getRun(d);if(m===null)return e.stderr.write(`error: run ${d}: not found
2086
+ `),2):await j(e,async f=>{let m=f.getRun(d);if(m===null)return e.stderr.write(`error: run ${d}: not found
2087
2087
  `),1;if(m.terminal_state!==null&&m.terminal_state.length>0)return y(e,`run ${d}: already terminal (${m.terminal_state}); chat --run cannot resume a terminated run`);let p=Ta(f,d);if(p===null)return e.stderr.write(`error: run ${d}: no pending operator-answerable attention (chat --run only resumes paused runs)
2088
2088
  `),1;if(p.kind==="workflow_escalation"){if(n.done)return e.stderr.write(`error: --done is not valid for workflow_escalation (the decision itself is terminal)
2089
2089
  `),2;let h=f.resumeEscalation(p.attention_id,n.prompt);return h.resumed===!0?(e.stdout.write(`run ${d}: escalation resumed (decision: ${n.prompt})
@@ -2124,25 +2124,25 @@ ${Qb}
2124
2124
  [--permission-mode plan|yolo] [--idle-timeout <duration>]
2125
2125
  [--root <teamfile>] [--json]
2126
2126
 
2127
- Send a prompt to a team member or raw provider session, or answer a paused run.`});function Gs(t){for(let e=t.length-1;e>=0;e-=1){let r=t[e],n=fU.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),o=n[2]===void 0?0:Number.parseInt(n[2],10),i=n[3].toLowerCase(),a=n[4]?.trim()??null,l=`${n[1]}${n[2]!==void 0?`:${n[2]}`:""}${i}`;return{state:"LIMITED",resets_at:a===null?null:mU(r.timestamp,s,o,i,a),reset_time:l,timezone:a,detected_at:r.timestamp.toISOString()}}return null}function mU(t,e,r,n,s){if(!Number.isFinite(t.getTime())||e<1||e>12||r<0||r>59)return null;let o=pU(e,n);try{let i=hU(t,s),a=sS(i.year,i.month,i.day,o,r,s);if(a.getTime()<=t.getTime()){let l=wU(i,1);a=sS(l.year,l.month,l.day,o,r,s)}return a.toISOString()}catch{return null}}function pU(t,e){return e==="am"?t===12?0:t:t===12?12:t+12}function hU(t,e){let r=oS(e,!1).formatToParts(t);return{year:Qt(r,"year"),month:Qt(r,"month"),day:Qt(r,"day")}}function sS(t,e,r,n,s,o){let i=Date.UTC(t,e-1,r,n,s,0,0);for(let a=0;a<3;a+=1){let l=_U(new Date(i),o);i=Date.UTC(t,e-1,r,n,s,0,0)-l}return new Date(i)}function _U(t,e){let r=oS(e,!0).formatToParts(t);return Date.UTC(Qt(r,"year"),Qt(r,"month")-1,Qt(r,"day"),Qt(r,"hour"),Qt(r,"minute"),Qt(r,"second"),0)-t.getTime()}function oS(t,e){let r=e?yU:gU,n=r.get(t);if(n!==void 0)return n;let s=new Intl.DateTimeFormat("en-US",{timeZone:t,hourCycle:"h23",year:"numeric",month:"2-digit",day:"2-digit",...e?{hour:"2-digit",minute:"2-digit",second:"2-digit"}:{}});return r.set(t,s),s}function Qt(t,e){let r=t.find(n=>n.type===e)?.value;if(r===void 0)throw new Error(`missing ${e}`);return Number.parseInt(r,10)}function wU(t,e){let r=new Date(Date.UTC(t.year,t.month-1,t.day+e));return{year:r.getUTCFullYear(),month:r.getUTCMonth()+1,day:r.getUTCDate()}}var fU,gU,yU,kf=T(()=>{"use strict";fU=/you['\u2019]ve hit your session limit\s*(?:\u00b7|-|:)?\s*resets\s+([0-9]{1,2})(?::([0-9]{2}))?\s*(am|pm)\s*(?:\(([^)]+)\))?/i;gU=new Map,yU=new Map});var lS={};ae(lS,{runRecover:()=>TU});import{dirname as iS,resolve as aS}from"node:path";async function TU(t,e,r={}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${vf}
2127
+ Send a prompt to a team member or raw provider session, or answer a paused run.`});function Ks(t){for(let e=t.length-1;e>=0;e-=1){let r=t[e],n=fU.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),o=n[2]===void 0?0:Number.parseInt(n[2],10),i=n[3].toLowerCase(),a=n[4]?.trim()??null,l=`${n[1]}${n[2]!==void 0?`:${n[2]}`:""}${i}`;return{state:"LIMITED",resets_at:a===null?null:mU(r.timestamp,s,o,i,a),reset_time:l,timezone:a,detected_at:r.timestamp.toISOString()}}return null}function mU(t,e,r,n,s){if(!Number.isFinite(t.getTime())||e<1||e>12||r<0||r>59)return null;let o=pU(e,n);try{let i=hU(t,s),a=sS(i.year,i.month,i.day,o,r,s);if(a.getTime()<=t.getTime()){let l=wU(i,1);a=sS(l.year,l.month,l.day,o,r,s)}return a.toISOString()}catch{return null}}function pU(t,e){return e==="am"?t===12?0:t:t===12?12:t+12}function hU(t,e){let r=oS(e,!1).formatToParts(t);return{year:Qt(r,"year"),month:Qt(r,"month"),day:Qt(r,"day")}}function sS(t,e,r,n,s,o){let i=Date.UTC(t,e-1,r,n,s,0,0);for(let a=0;a<3;a+=1){let l=_U(new Date(i),o);i=Date.UTC(t,e-1,r,n,s,0,0)-l}return new Date(i)}function _U(t,e){let r=oS(e,!0).formatToParts(t);return Date.UTC(Qt(r,"year"),Qt(r,"month")-1,Qt(r,"day"),Qt(r,"hour"),Qt(r,"minute"),Qt(r,"second"),0)-t.getTime()}function oS(t,e){let r=e?yU:gU,n=r.get(t);if(n!==void 0)return n;let s=new Intl.DateTimeFormat("en-US",{timeZone:t,hourCycle:"h23",year:"numeric",month:"2-digit",day:"2-digit",...e?{hour:"2-digit",minute:"2-digit",second:"2-digit"}:{}});return r.set(t,s),s}function Qt(t,e){let r=t.find(n=>n.type===e)?.value;if(r===void 0)throw new Error(`missing ${e}`);return Number.parseInt(r,10)}function wU(t,e){let r=new Date(Date.UTC(t.year,t.month-1,t.day+e));return{year:r.getUTCFullYear(),month:r.getUTCMonth()+1,day:r.getUTCDate()}}var fU,gU,yU,kf=T(()=>{"use strict";fU=/you['\u2019]ve hit your session limit\s*(?:\u00b7|-|:)?\s*resets\s+([0-9]{1,2})(?::([0-9]{2}))?\s*(am|pm)\s*(?:\(([^)]+)\))?/i;gU=new Map,yU=new Map});var lS={};le(lS,{runRecover:()=>TU});import{dirname as iS,resolve as aS}from"node:path";async function TU(t,e,r={}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${vf}
2128
2128
  `),0;let n=D(t.filter(p=>p!=="--"),[],["--all","--dry-run","--json"]);if(n.error!==void 0)return y(e,`${n.error}
2129
2129
 
2130
2130
  ${vf}`);if(n.positionals.length===0)return y(e,`recover requires a <teamfile>
2131
2131
 
2132
2132
  ${vf}`);if(n.positionals.length>2)return y(e,`unexpected argument: ${n.positionals[2]}`);let s=n.positionals[0],o=Ur(s),i=o?.teamfile??s,a=n.positionals[1],l=o?.alias??a;if(o!==null&&a!==void 0)return y(e,"recover alias was provided twice; use either <teamfile>:<alias> or <teamfile> <alias>");if(C(n,"--all")&&l!==void 0)return y(e,"recover --all is mutually exclusive with <alias>");let c;try{c=await bU(e,i,l)}catch(p){if(p instanceof Ee)return y(e,p.message);throw p}let u=r.now??new Date,d=C(n,"--dry-run"),f=[];for(let p of c)f.push(await SU(e,p,{now:u,dryRun:d}));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(C(n,"--json"))U(e,{dryRun:d,now:u.toISOString(),summary:m,members:f});else{for(let p of f)e.stdout.write(kU(p));e.stdout.write(`Recover checked ${m.checked}: ${d?`${m.wouldRecover} would recover`:`${m.recovered} recovered`}, ${m.skipped} skipped, ${m.errors} error(s).
2133
- `)}return m.errors>0?1:0}async function bU(t,e,r){return await L(t,n=>{let s=xe(e,n);if(r!==void 0){let o=st(s,n);if(o.parseErrors.length>0)throw new Ee(`lmctl: ${e}: ${o.parseErrors.join("; ")}`);let i=Oa(o,r);return i?.teamfile!==void 0?If(aS(iS(s),i.teamfile),n,new Set):[ot(e,r,n)]}return If(s,n,new Set)})}function If(t,e,r){let n=xe(t,e);if(r.has(n))return[];r.add(n);let s=st(n,e);if(s.parseErrors.length>0)throw new Ee(`lmctl: ${n}: ${s.parseErrors.join("; ")}`);let o=[];for(let i of s.members){if(i.teamfile!==void 0){o.push(...If(aS(iS(n),i.teamfile),e,r));continue}i.session!==void 0&&o.push(ot(n,i.alias,e))}return o}async function SU(t,e,r){let n;try{let a=await Ht(e.sessionid,e.provider);if(a===null)return $t(e,"session_not_found",null,"session detail not found");n=Gs(a.messages)}catch(a){return $t(e,"load_error",null,a instanceof Error?a.message:String(a))}if(n===null)return $t(e,"not_limited",null,"no current session-limit marker");if(n.resets_at===null)return $t(e,"unknown_reset",n,"reset time could not be parsed");let s=Date.parse(n.resets_at);if(!Number.isFinite(s))return $t(e,"unknown_reset",n,"reset time could not be parsed");if(s>r.now.getTime())return $t(e,"not_due",n,`resets_at ${n.resets_at} is in the future`);let o=await L(t,a=>a.getAgentInflight(e.teamfile,e.alias));if(o!==null)return $t(e,"busy",n,`in-flight since ${o.started_at}`);if(r.dryRun)return $t(e,"would_recover",n,null);let i=await Ka({teamfile:e.teamfile,alias:e.alias,prompt:EU,permissionMode:"yolo",io:t,env:process.env});return i.status==="ok"||i.status==="stalled"?$t(e,"recovered",n,null):$t(e,i.status==="busy"?"busy":"send_error",n,i.message)}function $t(t,e,r,n){return{alias:t.alias,teamfile:t.teamfile,provider:t.provider,sessionid:t.sessionid,action:e,sessionLimit:r,reason:n}}function kU(t){let e=t.sessionLimit?.resets_at??"unknown",r=t.reason===null?"":` (${t.reason})`;return`${t.alias}: ${t.action} resets_at=${e}${r}
2134
- `}var EU,vf,cS=T(()=>{"use strict";kf();Lr();Yt();zt();Zt();Sf();Te();EU="Your session limit reset time has passed. Continue your work from the last actionable point.",vf=["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(`
2135
- `)});var Ks,f9,Nf=T(()=>{"use strict";Ks=[{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}],f9=Ks.length});import{spawn as vU}from"node:child_process";async function dS(t,e,r){let n=NU.get(t);if(n===void 0)return{status:"error",code:404,message:`unknown tool: ${t}`};let s=e!==null&&typeof e=="object"&&!Array.isArray(e)?e:{};for(let o of n.inputSchema.required??[])if(s[o]===void 0)return{status:"error",code:400,message:`missing required parameter: ${o}`};return xU(n.name,s)}function xU(t,e){return t==="lmctl_chat"?AU(e):{status:"error",code:404,message:`unknown local tool: ${t}`}}function AU(t){let e=typeof t.prompt=="string"?t.prompt:"";if(e.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: prompt"});let r=typeof t.team=="string"?t.team:"";if(r.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: team"});let n=typeof t.alias=="string"&&t.alias.length>0?t.alias:"Lead",s=["chat",r,n,e];return fe()&&Oe(JSON.stringify({event:"mcp_chat_spawn",team:r,alias:n})),RU(s,process.cwd())}function RU(t,e){return new Promise(r=>{let n=!1,s,o=u=>{n||(n=!0,s!==void 0&&clearTimeout(s),r(u))},i=vU("lmctl",t,{cwd:e,env:process.env,stdio:["ignore","pipe","pipe"]}),a=$U(process.env);s=setTimeout(()=>{try{i.kill("SIGTERM")}catch{}o({status:"error",code:124,message:`lmctl chat timed out after ${a}ms`})},a),s.unref?.();let l="",c="";i.stdout?.on("data",u=>{l+=u.toString("utf8")}),i.stderr?.on("data",u=>{c+=u.toString("utf8")}),i.on("error",u=>{o({status:"error",code:1,message:`failed to spawn lmctl chat: ${u.message}`})}),i.on("exit",u=>{if(u===0){fe()&&Oe(JSON.stringify({event:"mcp_chat_payload",bytes:Buffer.byteLength(l,"utf8"),lines:l.split(`
2136
- `).length})),o({status:"ok",data:{text:l.trim()||"(empty response)"}});return}o({status:"error",code:u??1,message:c.trim()||`lmctl chat exited with code ${u}`})})})}function $U(t){let e=t.LMCTL_MCP_CHAT_TIMEOUT_MS;if(e===void 0||e.trim().length===0)return uS;let r=Number(e);return!Number.isFinite(r)||r<=0?uS:r}function xf(t,e=process.env){let n=t.getConfig("api.url")??(e.LMCTL_API_URL!==void 0&&e.LMCTL_API_URL.length>0?e.LMCTL_API_URL:IU),o=t.getConfig("api.token")??(e.LMCTL_API_TOKEN!==void 0&&e.LMCTL_API_TOKEN.length>0?e.LMCTL_API_TOKEN:null);return{baseUrl:n,token:o}}var IU,uS,NU,Af=T(()=>{"use strict";Nf();Ie();IU="http://127.0.0.1:8787",uS=30*60*1e3,NU=new Map(Ks.map(t=>[t.name,t]))});async function CU(t,e){let r=t.id===void 0,n=t.id??null;if(t.method==="exit")return r||e.io.write(Rf({jsonrpc:"2.0",id:n,result:null})),{kind:"exit"};if(t.method==="initialize")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{protocolVersion:jU,capabilities:{tools:{listChanged:!1}},serverInfo:{name:LU,version:OU}}}};if(t.method==="notifications/initialized")return{kind:"notification"};if(t.method==="shutdown")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:null}};if(t.method==="tools/list")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{tools:Ks.map(s=>({name:s.name,description:s.description,inputSchema:s.inputSchema}))}}};if(t.method==="tools/call"){let s=t.params!==null&&typeof t.params=="object"?t.params:{},o=typeof s.name=="string"?s.name:"",i=s.arguments,a=await dS(o,i,e.dispatch),l=o==="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: ${t.method}`}}}}function Rf(t){return`${JSON.stringify(t)}
2133
+ `)}return m.errors>0?1:0}async function bU(t,e,r){return await j(t,n=>{let s=xe(e,n);if(r!==void 0){let o=st(s,n);if(o.parseErrors.length>0)throw new Ee(`lmctl: ${e}: ${o.parseErrors.join("; ")}`);let i=Oa(o,r);return i?.teamfile!==void 0?If(aS(iS(s),i.teamfile),n,new Set):[ot(e,r,n)]}return If(s,n,new Set)})}function If(t,e,r){let n=xe(t,e);if(r.has(n))return[];r.add(n);let s=st(n,e);if(s.parseErrors.length>0)throw new Ee(`lmctl: ${n}: ${s.parseErrors.join("; ")}`);let o=[];for(let i of s.members){if(i.teamfile!==void 0){o.push(...If(aS(iS(n),i.teamfile),e,r));continue}i.session!==void 0&&o.push(ot(n,i.alias,e))}return o}async function SU(t,e,r){let n;try{let a=await Ht(e.sessionid,e.provider);if(a===null)return $t(e,"session_not_found",null,"session detail not found");n=Ks(a.messages)}catch(a){return $t(e,"load_error",null,a instanceof Error?a.message:String(a))}if(n===null)return $t(e,"not_limited",null,"no current session-limit marker");if(n.resets_at===null)return $t(e,"unknown_reset",n,"reset time could not be parsed");let s=Date.parse(n.resets_at);if(!Number.isFinite(s))return $t(e,"unknown_reset",n,"reset time could not be parsed");if(s>r.now.getTime())return $t(e,"not_due",n,`resets_at ${n.resets_at} is in the future`);let o=await j(t,a=>a.getAgentInflight(e.teamfile,e.alias));if(o!==null)return $t(e,"busy",n,`in-flight since ${o.started_at}`);if(r.dryRun)return $t(e,"would_recover",n,null);let i=await Ka({teamfile:e.teamfile,alias:e.alias,prompt:EU,permissionMode:"yolo",io:t,env:process.env});return i.status==="ok"||i.status==="stalled"?$t(e,"recovered",n,null):$t(e,i.status==="busy"?"busy":"send_error",n,i.message)}function $t(t,e,r,n){return{alias:t.alias,teamfile:t.teamfile,provider:t.provider,sessionid:t.sessionid,action:e,sessionLimit:r,reason:n}}function kU(t){let e=t.sessionLimit?.resets_at??"unknown",r=t.reason===null?"":` (${t.reason})`;return`${t.alias}: ${t.action} resets_at=${e}${r}
2134
+ `}var EU,vf,cS=T(()=>{"use strict";kf();jr();Yt();zt();Zt();Sf();Te();EU="Your session limit reset time has passed. Continue your work from the last actionable point.",vf=["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(`
2135
+ `)});var Vs,p9,Nf=T(()=>{"use strict";Vs=[{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}],p9=Vs.length});import{spawn as vU}from"node:child_process";async function dS(t,e,r){let n=NU.get(t);if(n===void 0)return{status:"error",code:404,message:`unknown tool: ${t}`};let s=e!==null&&typeof e=="object"&&!Array.isArray(e)?e:{};for(let o of n.inputSchema.required??[])if(s[o]===void 0)return{status:"error",code:400,message:`missing required parameter: ${o}`};return xU(n.name,s)}function xU(t,e){return t==="lmctl_chat"?AU(e):{status:"error",code:404,message:`unknown local tool: ${t}`}}function AU(t){let e=typeof t.prompt=="string"?t.prompt:"";if(e.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: prompt"});let r=typeof t.team=="string"?t.team:"";if(r.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: team"});let n=typeof t.alias=="string"&&t.alias.length>0?t.alias:"Lead",s=["chat",r,n,e];return fe()&&Oe(JSON.stringify({event:"mcp_chat_spawn",team:r,alias:n})),RU(s,process.cwd())}function RU(t,e){return new Promise(r=>{let n=!1,s,o=u=>{n||(n=!0,s!==void 0&&clearTimeout(s),r(u))},i=vU("lmctl",t,{cwd:e,env:process.env,stdio:["ignore","pipe","pipe"]}),a=$U(process.env);s=setTimeout(()=>{try{i.kill("SIGTERM")}catch{}o({status:"error",code:124,message:`lmctl chat timed out after ${a}ms`})},a),s.unref?.();let l="",c="";i.stdout?.on("data",u=>{l+=u.toString("utf8")}),i.stderr?.on("data",u=>{c+=u.toString("utf8")}),i.on("error",u=>{o({status:"error",code:1,message:`failed to spawn lmctl chat: ${u.message}`})}),i.on("exit",u=>{if(u===0){fe()&&Oe(JSON.stringify({event:"mcp_chat_payload",bytes:Buffer.byteLength(l,"utf8"),lines:l.split(`
2136
+ `).length})),o({status:"ok",data:{text:l.trim()||"(empty response)"}});return}o({status:"error",code:u??1,message:c.trim()||`lmctl chat exited with code ${u}`})})})}function $U(t){let e=t.LMCTL_MCP_CHAT_TIMEOUT_MS;if(e===void 0||e.trim().length===0)return uS;let r=Number(e);return!Number.isFinite(r)||r<=0?uS:r}function xf(t,e=process.env){let n=t.getConfig("api.url")??(e.LMCTL_API_URL!==void 0&&e.LMCTL_API_URL.length>0?e.LMCTL_API_URL:IU),o=t.getConfig("api.token")??(e.LMCTL_API_TOKEN!==void 0&&e.LMCTL_API_TOKEN.length>0?e.LMCTL_API_TOKEN:null);return{baseUrl:n,token:o}}var IU,uS,NU,Af=T(()=>{"use strict";Nf();Ie();IU="http://127.0.0.1:8787",uS=30*60*1e3,NU=new Map(Vs.map(t=>[t.name,t]))});async function CU(t,e){let r=t.id===void 0,n=t.id??null;if(t.method==="exit")return r||e.io.write(Rf({jsonrpc:"2.0",id:n,result:null})),{kind:"exit"};if(t.method==="initialize")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{protocolVersion:LU,capabilities:{tools:{listChanged:!1}},serverInfo:{name:jU,version:OU}}}};if(t.method==="notifications/initialized")return{kind:"notification"};if(t.method==="shutdown")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:null}};if(t.method==="tools/list")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{tools:Vs.map(s=>({name:s.name,description:s.description,inputSchema:s.inputSchema}))}}};if(t.method==="tools/call"){let s=t.params!==null&&typeof t.params=="object"?t.params:{},o=typeof s.name=="string"?s.name:"",i=s.arguments,a=await dS(o,i,e.dispatch),l=o==="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: ${t.method}`}}}}function Rf(t){return`${JSON.stringify(t)}
2137
2137
  `}async function fS(t,e){let r=!1,n="",s=!1,o=async i=>{let a=i.trim();if(a.length===0)return;let l;try{l=JSON.parse(a)}catch(u){t.io.write(Rf({jsonrpc:"2.0",id:null,error:{code:-32700,message:`parse error: ${u instanceof Error?u.message:String(u)}`}}));return}l.method==="shutdown"&&(r=!0);let c=await CU(l,t);c.kind==="response"?t.io.write(Rf(c.message)):c.kind==="exit"&&(s=!0)};return new Promise(i=>{let a=Promise.resolve(),l=!1,c=d=>{l||(l=!0,i(d))},u=()=>{let d=n.indexOf(`
2138
2138
  `);for(;d!==-1;){let f=n.slice(0,d);n=n.slice(d+1),a=a.then(()=>o(f)).then(()=>{s&&c(0)}),d=n.indexOf(`
2139
2139
  `)}};e.setEncoding("utf8"),e.on("data",d=>{n+=d,u()}),e.on("end",()=>{n.trim().length>0&&(a=a.then(()=>o(n))),a.finally(()=>c(0))}),e.on("error",d=>{t.io.log?.(`mcp: stdin error: ${d.message}
2140
- `),a.finally(()=>c(1))})})}var jU,LU,OU,mS=T(()=>{"use strict";Nf();Af();jU="2025-06-18",LU="lmctl",OU="0.0.1"});var hS={};ae(hS,{runMcp:()=>DU});async function DU(t,e={stdout:process.stdout,stderr:process.stderr},r=process.stdin){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(MU),0;if(t.length>0)return e.stderr.write(`usage: lmctl mcp
2140
+ `),a.finally(()=>c(1))})})}var LU,jU,OU,mS=T(()=>{"use strict";Nf();Af();LU="2025-06-18",jU="lmctl",OU="0.0.1"});var hS={};le(hS,{runMcp:()=>DU});async function DU(t,e={stdout:process.stdout,stderr:process.stderr},r=process.stdin){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(MU),0;if(t.length>0)return e.stderr.write(`usage: lmctl mcp
2141
2141
  `),2;Y({event:"mcp_bridge_start",pid:process.pid});let n=e.dal===void 0,s=e.dal??PU(),o=1;try{let i=s===void 0?xf({getConfig:()=>null},process.env):xf(s,process.env);return o=await fS({io:{write:l=>e.stdout.write(l),log:l=>e.stderr.write(l)},dispatch:{config:i,...s!==void 0?{dal:s}:{}}},r),o}finally{Y({event:"mcp_bridge_exit",pid:process.pid,exit_code:o}),n&&s!==void 0&&s.close()}}function PU(){let t=de(),e=3;for(let r=1;r<=e;r+=1)try{return _e({path:t})}catch(n){let s=n instanceof Error?n.message:String(n);if(Y({event:"mcp_bridge_db_open_failed",pid:process.pid,attempt:r,db_path:t,error_message:s}),r<e&&pS(s))FU(50*r);else if(!pS(s))break}}function pS(t){return/SQLITE_BUSY|database is locked|database is busy/i.test(t)}function FU(t){let e=new Int32Array(new SharedArrayBuffer(4));Atomics.wait(e,0,0,t)}var MU,_S=T(()=>{"use strict";Ue();Af();mS();Ie();ze();MU=`usage: lmctl mcp
2142
2142
 
2143
2143
  Start the stdio MCP bridge. The bridge resolves api.url and api.token from
2144
2144
  local config, then uses stdin/stdout for JSON-RPC frames.
2145
- `});function Vs(t){switch(t.kind){case"run_stale":return`run_stale:${t.run_id}`;case"stuck_job":return`stuck_job:${t.job_id}`;case"attentions_overdue":return`attentions_overdue:${t.project_id??"global"}`;case"issues_overdue":return`issues_overdue:${t.project_id??"global"}`}}var gS=T(()=>{"use strict"});function UU(t){return{stale_run_minutes:zs(t,"monitor.stale_run_minutes",Ys.stale_run_minutes),old_attention_days:zs(t,"monitor.old_attention_days",Ys.old_attention_days),old_issue_days:zs(t,"monitor.old_issue_days",Ys.old_issue_days),stuck_job_minutes:zs(t,"monitor.stuck_job_minutes",Ys.stuck_job_minutes),dedupe_window_hours:zs(t,"monitor.dedupe_window_hours",Ys.dedupe_window_hours)}}function zs(t,e,r){let n=t.getConfig(e);if(n===null)return r;let s=Number.parseInt(n,10);return!Number.isFinite(s)||s<=0?r:s}function yS(t,e={}){let r=e.now??new Date,n=UU(t),s=[];for(let o of WU(t,n,r))s.push(o);for(let o of BU(t,n,r))s.push(o);for(let o of HU(t,n,r))s.push(o);for(let o of qU(t,n,r))s.push(o);return{findings:s,scanned_at:r.toISOString(),config:n}}function WU(t,e,r){let n=wS(r,e.stale_run_minutes).toISOString(),s=t.db.prepare(`
2145
+ `});function Ys(t){switch(t.kind){case"run_stale":return`run_stale:${t.run_id}`;case"stuck_job":return`stuck_job:${t.job_id}`;case"attentions_overdue":return`attentions_overdue:${t.project_id??"global"}`;case"issues_overdue":return`issues_overdue:${t.project_id??"global"}`}}var gS=T(()=>{"use strict"});function UU(t){return{stale_run_minutes:Zs(t,"monitor.stale_run_minutes",zs.stale_run_minutes),old_attention_days:Zs(t,"monitor.old_attention_days",zs.old_attention_days),old_issue_days:Zs(t,"monitor.old_issue_days",zs.old_issue_days),stuck_job_minutes:Zs(t,"monitor.stuck_job_minutes",zs.stuck_job_minutes),dedupe_window_hours:Zs(t,"monitor.dedupe_window_hours",zs.dedupe_window_hours)}}function Zs(t,e,r){let n=t.getConfig(e);if(n===null)return r;let s=Number.parseInt(n,10);return!Number.isFinite(s)||s<=0?r:s}function yS(t,e={}){let r=e.now??new Date,n=UU(t),s=[];for(let o of WU(t,n,r))s.push(o);for(let o of BU(t,n,r))s.push(o);for(let o of HU(t,n,r))s.push(o);for(let o of qU(t,n,r))s.push(o);return{findings:s,scanned_at:r.toISOString(),config:n}}function WU(t,e,r){let n=wS(r,e.stale_run_minutes).toISOString(),s=t.db.prepare(`
2146
2146
  SELECT r.id AS id,
2147
2147
  r.job_id AS job_id,
2148
2148
  w.name AS workflow_name,
@@ -2153,12 +2153,12 @@ local config, then uses stdin/stdout for JSON-RPC frames.
2153
2153
  WHERE r.terminal_state IS NULL
2154
2154
  AND r.paused_at IS NULL
2155
2155
  AND r.started_at <= ?
2156
- `).all(n),o=[];for(let i of s){let a={kind:"run_stale",run_id:i.id},l=Vs(a),c={dedupe_key:l,run_id:i.id,job_id:i.job_id,workflow_name:i.workflow_name,started_at:i.started_at,last_event_at:i.last_event_ms===null?null:new Date(i.last_event_ms).toISOString(),threshold_minutes:e.stale_run_minutes},u=`run ${i.id} (${i.workflow_name}) stale since ${i.started_at}`;o.push(Va(t,{kind:"run_stale",severity:"warning",project_id:null,run_id:i.id,payload:c,dedupe_key:l,summary:u,config:e,now:r}))}return o}function BU(t,e,r){let n=wS(r,e.stuck_job_minutes).toISOString(),s=t.db.prepare(`
2156
+ `).all(n),o=[];for(let i of s){let a={kind:"run_stale",run_id:i.id},l=Ys(a),c={dedupe_key:l,run_id:i.id,job_id:i.job_id,workflow_name:i.workflow_name,started_at:i.started_at,last_event_at:i.last_event_ms===null?null:new Date(i.last_event_ms).toISOString(),threshold_minutes:e.stale_run_minutes},u=`run ${i.id} (${i.workflow_name}) stale since ${i.started_at}`;o.push(Va(t,{kind:"run_stale",severity:"warning",project_id:null,run_id:i.id,payload:c,dedupe_key:l,summary:u,config:e,now:r}))}return o}function BU(t,e,r){let n=wS(r,e.stuck_job_minutes).toISOString(),s=t.db.prepare(`
2157
2157
  SELECT id, project_id, source, source_ref, status, enqueued_at
2158
2158
  FROM job
2159
2159
  WHERE status NOT IN ('done', 'failed')
2160
2160
  AND enqueued_at <= ?
2161
- `).all(n),o=[];for(let i of s){let a={kind:"stuck_job",job_id:i.id},l=Vs(a),c={dedupe_key:l,job_id:i.id,project_id:i.project_id,source:i.source,source_ref:i.source_ref,status:i.status,enqueued_at:i.enqueued_at,threshold_minutes:e.stuck_job_minutes},u=`job ${i.id} (${i.source}) stuck in ${i.status} since ${i.enqueued_at}`;o.push(Va(t,{kind:"stuck_job",severity:"warning",project_id:i.project_id,run_id:null,payload:c,dedupe_key:l,summary:u,config:e,now:r}))}return o}function HU(t,e,r){let n=ES(r,e.old_attention_days).toISOString(),s=t.db.prepare(`
2161
+ `).all(n),o=[];for(let i of s){let a={kind:"stuck_job",job_id:i.id},l=Ys(a),c={dedupe_key:l,job_id:i.id,project_id:i.project_id,source:i.source,source_ref:i.source_ref,status:i.status,enqueued_at:i.enqueued_at,threshold_minutes:e.stuck_job_minutes},u=`job ${i.id} (${i.source}) stuck in ${i.status} since ${i.enqueued_at}`;o.push(Va(t,{kind:"stuck_job",severity:"warning",project_id:i.project_id,run_id:null,payload:c,dedupe_key:l,summary:u,config:e,now:r}))}return o}function HU(t,e,r){let n=ES(r,e.old_attention_days).toISOString(),s=t.db.prepare(`
2162
2162
  SELECT project_id,
2163
2163
  COUNT(*) AS count,
2164
2164
  (SELECT kind FROM attention a2
@@ -2173,7 +2173,7 @@ local config, then uses stdin/stdout for JSON-RPC frames.
2173
2173
  AND kind NOT IN ('attentions_overdue', 'issues_overdue')
2174
2174
  AND created_at <= ?
2175
2175
  GROUP BY project_id
2176
- `).all(n,n),o=[];for(let i of s){let a={kind:"attentions_overdue",project_id:i.project_id},l=Vs(a),c={dedupe_key:l,count:i.count,oldest_kind:i.oldest_kind,oldest_at:i.oldest_at,project_id:i.project_id,threshold_days:e.old_attention_days},u=i.project_id===null?"global":`project ${i.project_id}`,d=`${i.count} attention(s) overdue (${u}; oldest: ${i.oldest_kind})`;o.push(Va(t,{kind:"attentions_overdue",severity:"warning",project_id:i.project_id,run_id:null,payload:c,dedupe_key:l,summary:d,config:e,now:r}))}return o}function qU(t,e,r){let n=ES(r,e.old_issue_days).toISOString(),s=t.db.prepare(`
2176
+ `).all(n,n),o=[];for(let i of s){let a={kind:"attentions_overdue",project_id:i.project_id},l=Ys(a),c={dedupe_key:l,count:i.count,oldest_kind:i.oldest_kind,oldest_at:i.oldest_at,project_id:i.project_id,threshold_days:e.old_attention_days},u=i.project_id===null?"global":`project ${i.project_id}`,d=`${i.count} attention(s) overdue (${u}; oldest: ${i.oldest_kind})`;o.push(Va(t,{kind:"attentions_overdue",severity:"warning",project_id:i.project_id,run_id:null,payload:c,dedupe_key:l,summary:d,config:e,now:r}))}return o}function qU(t,e,r){let n=ES(r,e.old_issue_days).toISOString(),s=t.db.prepare(`
2177
2177
  SELECT project_id,
2178
2178
  COUNT(*) AS count,
2179
2179
  (SELECT title FROM project_issue i2
@@ -2186,33 +2186,33 @@ local config, then uses stdin/stdout for JSON-RPC frames.
2186
2186
  WHERE status IN ('open', 'reopened')
2187
2187
  AND created_at <= ?
2188
2188
  GROUP BY project_id
2189
- `).all(n,n),o=[];for(let i of s){let a={kind:"issues_overdue",project_id:i.project_id},l=Vs(a),c={dedupe_key:l,count:i.count,oldest_title:i.oldest_title,oldest_at:i.oldest_at,project_id:i.project_id,threshold_days:e.old_issue_days},u=`${i.count} issue(s) overdue in project ${i.project_id} (oldest: ${GU(i.oldest_title,40)})`;o.push(Va(t,{kind:"issues_overdue",severity:"warning",project_id:i.project_id,run_id:null,payload:c,dedupe_key:l,summary:u,config:e,now:r}))}return o}function Va(t,e){let r=JU(t,e.dedupe_key,e.now,e.config.dedupe_window_hours);if(r!==null)return{kind:e.kind,emitted:!1,dedupe_key:e.dedupe_key,attention_id:r.id,summary:e.summary};let n=t.raiseAttention({kind:e.kind,severity:e.severity,project_id:e.project_id,run_id:e.run_id,payload:JSON.stringify(e.payload)});return{kind:e.kind,emitted:!0,dedupe_key:e.dedupe_key,attention_id:n.id,summary:e.summary}}function JU(t,e,r,n){let s=XU(r,n).toISOString(),o=`%"dedupe_key":"${e}"%`;return t.db.prepare(`
2189
+ `).all(n,n),o=[];for(let i of s){let a={kind:"issues_overdue",project_id:i.project_id},l=Ys(a),c={dedupe_key:l,count:i.count,oldest_title:i.oldest_title,oldest_at:i.oldest_at,project_id:i.project_id,threshold_days:e.old_issue_days},u=`${i.count} issue(s) overdue in project ${i.project_id} (oldest: ${GU(i.oldest_title,40)})`;o.push(Va(t,{kind:"issues_overdue",severity:"warning",project_id:i.project_id,run_id:null,payload:c,dedupe_key:l,summary:u,config:e,now:r}))}return o}function Va(t,e){let r=JU(t,e.dedupe_key,e.now,e.config.dedupe_window_hours);if(r!==null)return{kind:e.kind,emitted:!1,dedupe_key:e.dedupe_key,attention_id:r.id,summary:e.summary};let n=t.raiseAttention({kind:e.kind,severity:e.severity,project_id:e.project_id,run_id:e.run_id,payload:JSON.stringify(e.payload)});return{kind:e.kind,emitted:!0,dedupe_key:e.dedupe_key,attention_id:n.id,summary:e.summary}}function JU(t,e,r,n){let s=XU(r,n).toISOString(),o=`%"dedupe_key":"${e}"%`;return t.db.prepare(`
2190
2190
  SELECT * FROM attention
2191
2191
  WHERE acknowledged_at IS NULL
2192
2192
  AND created_at >= ?
2193
2193
  AND payload LIKE ?
2194
2194
  ORDER BY id DESC
2195
2195
  LIMIT 1
2196
- `).get(s,o)??null}function wS(t,e){return new Date(t.getTime()-e*60*1e3)}function XU(t,e){return new Date(t.getTime()-e*60*60*1e3)}function ES(t,e){return new Date(t.getTime()-e*24*60*60*1e3)}function GU(t,e){return t.length<=e?t:`${t.slice(0,e-1)}\u2026`}var Ys,TS=T(()=>{"use strict";gS();Ys={stale_run_minutes:30,old_attention_days:7,old_issue_days:14,stuck_job_minutes:60,dedupe_window_hours:24}});var SS={};ae(SS,{renderSummary:()=>bS,runMonitor:()=>VU});async function VU(t,e){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(KU),0;let r=D(t,[],["--json","--quiet"]);if(r.error!==void 0)return y(e,r.error);if(r.positionals.length>0)return y(e,`unknown argument: ${r.positionals[0]}`);let n=C(r,"--json"),s=C(r,"--quiet");try{return await L(e,o=>{let i=yS(o);return n?U(e,i):s||e.stdout.write(`${bS(i.findings)}
2196
+ `).get(s,o)??null}function wS(t,e){return new Date(t.getTime()-e*60*1e3)}function XU(t,e){return new Date(t.getTime()-e*60*60*1e3)}function ES(t,e){return new Date(t.getTime()-e*24*60*60*1e3)}function GU(t,e){return t.length<=e?t:`${t.slice(0,e-1)}\u2026`}var zs,TS=T(()=>{"use strict";gS();zs={stale_run_minutes:30,old_attention_days:7,old_issue_days:14,stuck_job_minutes:60,dedupe_window_hours:24}});var SS={};le(SS,{renderSummary:()=>bS,runMonitor:()=>VU});async function VU(t,e){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(KU),0;let r=D(t,[],["--json","--quiet"]);if(r.error!==void 0)return y(e,r.error);if(r.positionals.length>0)return y(e,`unknown argument: ${r.positionals[0]}`);let n=C(r,"--json"),s=C(r,"--quiet");try{return await j(e,o=>{let i=yS(o);return n?U(e,i):s||e.stdout.write(`${bS(i.findings)}
2197
2197
  `),0})}catch(o){return he(e,o)}}function bS(t){let e=t.filter(o=>o.emitted);if(e.length===0)return"monitor: 0 findings";let r=new Map;for(let o of e)r.set(o.kind,(r.get(o.kind)??0)+1);let n=[],s=["run_stale","stuck_job","attentions_overdue","issues_overdue"];for(let o of s){let i=r.get(o);i===void 0||i===0||n.push(`${i} ${YU(o,i)}`)}return`monitor: ${e.length} findings (${n.join(", ")})`}function YU(t,e){switch(t){case"run_stale":return e===1?"stale run":"stale runs";case"stuck_job":return e===1?"stuck job":"stuck jobs";case"attentions_overdue":return"attentions overdue";case"issues_overdue":return"issues overdue"}}var KU,kS=T(()=>{"use strict";Te();TS();KU=`usage: lmctl monitor [--json] [--quiet]
2198
2198
 
2199
2199
  Scan the DB for stale runs, stuck jobs, overdue attentions, and overdue
2200
2200
  issues; emit findings as attentions for the operator/master to handle.
2201
- `});var vS={};ae(vS,{runDevice:()=>aW});import{readFileSync as zU}from"node:fs";import{homedir as ZU}from"node:os";import{join as QU}from"node:path";import{CognitoIdentityClient as eW,GetIdCommand as tW}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as rW}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as nW,ListObjectsV2Command as sW,PutObjectCommand as oW,S3Client as iW}from"@aws-sdk/client-s3";async function aW(t,e={stdout:process.stdout,stderr:process.stderr}){let[r]=t;if(r===void 0||r==="--help"||r==="-h"||r==="help")return e.stdout.write($f),0;if(r==="init"){let n=df();return e.stdout.write(`${n.device_id}
2201
+ `});var vS={};le(vS,{runDevice:()=>aW});import{readFileSync as zU}from"node:fs";import{homedir as ZU}from"node:os";import{join as QU}from"node:path";import{CognitoIdentityClient as eW,GetIdCommand as tW}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as rW}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as nW,ListObjectsV2Command as sW,PutObjectCommand as oW,S3Client as iW}from"@aws-sdk/client-s3";async function aW(t,e={stdout:process.stdout,stderr:process.stderr}){let[r]=t;if(r===void 0||r==="--help"||r==="-h"||r==="help")return e.stdout.write($f),0;if(r==="init"){let n=df();return e.stdout.write(`${n.device_id}
2202
2202
  `),0}if(r==="id"){let n=Fr();return n===null?(e.stderr.write(`error: no device id initialized at ${Wa()}; run 'lmctl device init'
2203
2203
  `),1):(e.stdout.write(`${n.device_id}
2204
2204
  `),0)}return r==="login"?await lW(t.slice(1),e):r==="prompt"?await uW(t.slice(1),e):(e.stderr.write(`usage: lmctl device <id|init|login|prompt>
2205
2205
  `),1)}async function lW(t,e){let r=cW(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
2206
- ${$f}`),2;let n=Js();if(n.config===void 0)return e.stderr.write(`error: mailbox is not configured; missing ${n.missing.join(", ")}
2206
+ ${$f}`),2;let n=Xs();if(n.config===void 0)return e.stderr.write(`error: mailbox is not configured; missing ${n.missing.join(", ")}
2207
2207
  `),1;kT({userId:r.userId,refreshToken:r.accessKey});let s,o,i;try{let c=await $a({region:n.config.region,clientId:n.config.cognitoClientId??Ua,refreshToken:r.accessKey});s=c.idToken,o=c.accessToken,i=c.expiresAt}catch(c){let u=c instanceof Error?c.message:String(c);return e.stderr.write(`error: could not authenticate access key: ${u}
2208
- `),1}let a=Bs(s);if(a!==null&&a!==r.userId)return e.stderr.write(`error: access key belongs to user-id ${a}, not ${r.userId}
2208
+ `),1}let a=Hs(s);if(a!==null&&a!==r.userId)return e.stderr.write(`error: access key belongs to user-id ${a}, not ${r.userId}
2209
2209
  `),1;Yd({idToken:s,...o!==void 0?{accessToken:o}:{},refreshToken:r.accessKey,...i!==void 0?{expiresAt:i}:{}});let l=Fr()??df();return e.stdout.write(`logged in as ${r.userId}
2210
2210
  device id: ${l.device_id}
2211
2211
  mailbox prefix: ${r.userId}/${l.device_id}/
2212
- access key stored at ${Hs()}
2212
+ access key stored at ${qs()}
2213
2213
  `),0}function cW(t){let e,r;for(let n=0;n<t.length;n+=1){let s=t[n];if(s==="--user-id"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --user-id";e=o;continue}if(s==="--access-key"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --access-key";r=o;continue}return`unknown argument: ${s}`}return e===void 0?"missing --user-id <sub>":r===void 0?"missing --access-key <refreshToken>":{userId:e,accessKey:r}}async function uW(t,e){let r=dW(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
2214
- ${$f}`),2;let n=Js();if(n.config===void 0)return e.stderr.write(`error: mailbox is not configured; missing ${n.missing.join(", ")}
2215
- `),1;let s=mW();if(s===null)return e.stderr.write("error: no Cognito id token found; run `webcli login` or `lmctl device login` first\n"),1;let o=s.cognito?.idToken;if(typeof o!="string"||o.length===0)return e.stderr.write("error: no Cognito id token found; run `webcli login` or `lmctl device login` first\n"),1;let i=`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 fW({region:n.config.region,identityPoolId:n.config.identityPoolId,idpProvider:i,idToken:o}),l=rW({identityId:a,logins:{[i]:o},clientConfig:{region:n.config.region}}),c=n.config.deviceId??Fr()?.device_id,u=Bs(o)??void 0,d=new Pr({bucket:n.config.mailboxBucket,identityId:a,...u!==void 0?{userId:u}:{},...c!==void 0?{deviceId:c}:{},...n.config.mailboxKey!==void 0?{mailboxKey:n.config.mailboxKey}:{},s3:new iW({region:n.config.region,credentials:l}),commands:{ListObjectsV2Command:sW,GetObjectCommand:nW,PutObjectCommand:oW},selfRole:"browser",onMessage:async()=>{}}),f=mT({root_teamfile:r.root,text:r.text,...r.promptId!==void 0?{prompt_id:r.promptId}:{}}),m=await d.putMessage({conversation_id:fT,payload:f});return e.stdout.write(JSON.stringify({prompt_id:f.prompt_id,mailbox_key:d.getMailboxBasePrefix(),object_key:m},null,2)+`
2214
+ ${$f}`),2;let n=Xs();if(n.config===void 0)return e.stderr.write(`error: mailbox is not configured; missing ${n.missing.join(", ")}
2215
+ `),1;let s=mW();if(s===null)return e.stderr.write("error: no Cognito id token found; run `webcli login` or `lmctl device login` first\n"),1;let o=s.cognito?.idToken;if(typeof o!="string"||o.length===0)return e.stderr.write("error: no Cognito id token found; run `webcli login` or `lmctl device login` first\n"),1;let i=`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 fW({region:n.config.region,identityPoolId:n.config.identityPoolId,idpProvider:i,idToken:o}),l=rW({identityId:a,logins:{[i]:o},clientConfig:{region:n.config.region}}),c=n.config.deviceId??Fr()?.device_id,u=Hs(o)??void 0,d=new Pr({bucket:n.config.mailboxBucket,identityId:a,...u!==void 0?{userId:u}:{},...c!==void 0?{deviceId:c}:{},...n.config.mailboxKey!==void 0?{mailboxKey:n.config.mailboxKey}:{},s3:new iW({region:n.config.region,credentials:l}),commands:{ListObjectsV2Command:sW,GetObjectCommand:nW,PutObjectCommand:oW},selfRole:"browser",onMessage:async()=>{}}),f=mT({root_teamfile:r.root,text:r.text,...r.promptId!==void 0?{prompt_id:r.promptId}:{}}),m=await d.putMessage({conversation_id:fT,payload:f});return e.stdout.write(JSON.stringify({prompt_id:f.prompt_id,mailbox_key:d.getMailboxBasePrefix(),object_key:m},null,2)+`
2216
2216
  `),0}function dW(t){let e,r,n;for(let s=0;s<t.length;s+=1){let o=t[s];if(o==="--root"){let i=t[++s];if(i===void 0||i.startsWith("--"))return"missing value for --root";e=i;continue}if(o==="--text"){let i=t[++s];if(i===void 0||i.startsWith("--"))return"missing value for --text";r=i;continue}if(o==="--prompt-id"){let i=t[++s];if(i===void 0||i.startsWith("--"))return"missing value for --prompt-id";n=i;continue}return`unknown argument: ${o}`}return e===void 0?"missing --root <teamfile>":r===void 0?"missing --text <prompt>":{root:e,text:r,...n!==void 0?{promptId:n}:{}}}async function fW(t){let r=await new eW({region:t.region}).send(new tW({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(r.IdentityId===void 0||r.IdentityId.length===0)throw new Error("Cognito GetId returned no IdentityId");return r.IdentityId}function mW(t=process.env.LMCTL_TOKEN_PATH??QU(ZU(),".lmctl","cli-tokens.json")){try{return JSON.parse(zU(t,"utf8"))}catch{return null}}var $f,IS=T(()=>{"use strict";ff();of();ha();Xd();Gd();zd();Kd();$f=`usage: lmctl device <id|init|login|prompt>
2217
2217
  lmctl device login --user-id <sub> --access-key <refreshToken>
2218
2218
  lmctl device prompt --root <teamfile> --text <prompt> [--prompt-id <id>]
@@ -2223,7 +2223,7 @@ addressing. The id is stored in ~/.lmctl/device.json by default.
2223
2223
  'lmctl device login' authenticates this machine's 'lmctl serve' daemon to the
2224
2224
  cloud mailbox using your user-id (Cognito sub) and an access key (refresh
2225
2225
  token). The access key is stored in ~/.lmctl/device-auth.json (chmod 600).
2226
- `});var xS={};ae(xS,{runTeam:()=>_W});import{join as pW}from"node:path";async function _W(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(hW),0;try{return await L(e,async s=>{switch(r){case"create":return yW(n,e,s);case"list":return wW(n,e,s);case"show":return EW(n,e,s);case"add-member":return TW(n,e,s);case"seed":return NS(n,e,s,!1);case"refresh":return NS(n,e,s,!0);case"companion":return SW(n,e,s);case"list-roots":return gW(n,e,s);default:return y(e,"usage: lmctl team <create|list|show|add-member|seed|refresh|companion|list-roots>")}})}catch(s){return he(e,s)}}function gW(t,e,r){let n=D(t,[]);if(n.error!==void 0)return y(e,n.error);if(n.positionals.length>0)return y(e,"usage: team list-roots [--json]");let s=r.listRootTeams();return C(n,"--json")?U(e,s):e.stdout.write(s.map(o=>`${o.name??"(unnamed)"} ${o.teamfile_path} ${o.last_seeded_at??""}`).join(`
2226
+ `});var xS={};le(xS,{runTeam:()=>_W});import{join as pW}from"node:path";async function _W(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(hW),0;try{return await j(e,async s=>{switch(r){case"create":return yW(n,e,s);case"list":return wW(n,e,s);case"show":return EW(n,e,s);case"add-member":return TW(n,e,s);case"seed":return NS(n,e,s,!1);case"refresh":return NS(n,e,s,!0);case"companion":return SW(n,e,s);case"list-roots":return gW(n,e,s);default:return y(e,"usage: lmctl team <create|list|show|add-member|seed|refresh|companion|list-roots>")}})}catch(s){return he(e,s)}}function gW(t,e,r){let n=D(t,[]);if(n.error!==void 0)return y(e,n.error);if(n.positionals.length>0)return y(e,"usage: team list-roots [--json]");let s=r.listRootTeams();return C(n,"--json")?U(e,s):e.stdout.write(s.map(o=>`${o.name??"(unnamed)"} ${o.teamfile_path} ${o.last_seeded_at??""}`).join(`
2227
2227
  `)+(s.length>0?`
2228
2228
  `:"")),0}function yW(t,e,r){let[n]=t;if(n===void 0)return y(e,"usage: team create <name>");let s=r.insertTeam({name:n});return e.stdout.write(`created team ${s.name}
2229
2229
  `),0}function wW(t,e,r){let n=D(t,[]);if(n.error!==void 0)return y(e,n.error);let s=r.listTeams();return C(n,"--json")?U(e,s):e.stdout.write(`${s.map(o=>`${o.id} ${o.name}`).join(`
@@ -2238,7 +2238,7 @@ ${an}`:an;r.setMemberPromptSnapshot(f.id,g),u.push(p);let _=ln(Ae(p),m.sessionid
2238
2238
  `);try{await Ni({dal:r,member:p,stderr:e.stderr})}catch(S){d=!0,e.stderr.write(`error: ${S instanceof Error?S.message:String(S)}
2239
2239
  `)}}}return C(s,"--json")?U(e,u):e.stdout.write(`seeded ${u.length} member(s)
2240
2240
  `),d?1:0}function bW(t,e,r){return t.filter(n=>e!==void 0&&n.alias!==e?!1:r||n.sessionid===null)}function SW(t,e,r){let n=D(t,["--interpreter","--of"]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0)return y(e,"usage: team companion <team-name> --interpreter A --of B[,C]");let o=r.findTeamByName(s);if(o===null)return y(e,`team not found: ${s}`);let i=A(n,"--interpreter"),a=A(n,"--of")?.split(",").map(c=>c.trim()).filter(Boolean);if(i===void 0||a===void 0||a.length===0)return y(e,"team companion requires --interpreter and --of");let l=r.findTeamMemberByAlias(o.id,i);if(l===null)return y(e,`member not found: ${i}`);for(let c of a){let u=r.findTeamMemberByAlias(o.id,c);if(u===null)return y(e,`member not found: ${c}`);r.insertTeamMemberCompanion({interpreter_id:l.id,companion_id:u.id})}return e.stdout.write(`recorded ${a.length} companion link(s)
2241
- `),0}var hW,AS=T(()=>{"use strict";ze();Xo();gs();tu();Ue();Lr();_u();oa();Te();ru();hW=`usage: lmctl team create <name>
2241
+ `),0}var hW,AS=T(()=>{"use strict";ze();Xo();ys();tu();Ue();jr();_u();oa();Te();ru();hW=`usage: lmctl team create <name>
2242
2242
  lmctl team list [--json]
2243
2243
  lmctl team show <name> [--json]
2244
2244
  lmctl team add-member <team-name> --alias A --provider P [--model M] [--role R] [--sessiondir D] [--json]
@@ -2249,8 +2249,8 @@ ${an}`:an;r.setMemberPromptSnapshot(f.id,g),u.push(p);let _=ln(Ae(p),m.sessionid
2249
2249
 
2250
2250
  Manage DB-backed teams, members, and provider session lifecycle. Use seed or
2251
2251
  refresh to create/update native provider sessions for team members.
2252
- `});var MS={};ae(MS,{applyMaxBytes:()=>Ya,renderMessage:()=>OS,runTail:()=>xW});async function xW(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${NW}
2253
- `),0;let r=D(t,["--lines","--max-bytes","--watch-interval","--provider","--session","--run"],["--watch","--help"]);if(r.error!==void 0)return y(e,r.error);let n=A(r,"--lines"),s=A(r,"--max-bytes");if(n!==void 0&&s!==void 0)return y(e,"--lines and --max-bytes are mutually exclusive (choose one)");let o;if(n!==void 0){let m=Number.parseInt(n,10);if(!Number.isFinite(m)||m<1||String(m)!==n)return y(e,`invalid --lines "${n}" (expected a positive integer)`);o={kind:"lines",lines:m}}else{let m=s===void 0?vW:Number.parseInt(s,10);if(!Number.isFinite(m)||m<0||s!==void 0&&String(m)!==s)return y(e,`invalid --max-bytes "${s}" (expected a non-negative integer)`);o={kind:"bytes",maxBytes:m}}let i=C(r,"--watch"),a=A(r,"--watch-interval"),l=a===void 0?IW:Number.parseInt(a.replace(/s$/,""),10);if(!Number.isFinite(l)||l<1)return y(e,`invalid --watch-interval "${a}" (expected <N>s, N\u22651)`);if(r.positionals.length>2)return y(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let c=A(r,"--run");if(c!==void 0){if(r.positionals.length>0)return y(e,"--run is mutually exclusive with positional [target] [alias]");if(A(r,"--session")!==void 0)return y(e,"--run is mutually exclusive with --session");if(A(r,"--provider")!==void 0)return y(e,"--run is mutually exclusive with --provider");let m=Number.parseInt(c,10);if(!Number.isFinite(m)||m<=0||String(m)!==c)return y(e,`invalid --run "${c}" (expected a positive integer run id)`);try{return await L(e,async p=>AW(e,p,m,o,i,l))}catch(p){return he(e,p)}}let u=yr(kW,{target:r.positionals[0],alias:r.positionals[1],flags:{session:A(r,"--session"),provider:A(r,"--provider")}});if(u.mode==="error")return y(e,u.message);if(u.mode==="managed")return y(e,"tail managed mode requires --run <id>");let d;if(u.mode==="ai-team")if(u.alias===void 0){let m;try{m=await L(e,g=>xe(u.teamfile,g))}catch(g){return y(e,`tail: ${g instanceof Error?g.message:String(g)}`)}let p;try{p=Pe(m)}catch(g){return y(e,`tail: ${g instanceof Error?g.message:String(g)}`)}let h=Rt(p);if(h===void 0)return y(e,`tail: ${u.teamfile} has no Lead member; pass <tf>:<alias>`);try{let g=await L(e,_=>ot(u.teamfile,h.alias,_));d={provider:g.provider,sessionId:g.sessionid,cwd:g.sessiondir}}catch(g){return g instanceof Ee?y(e,g.message):he(e,g)}}else try{let m=await L(e,p=>ot(u.teamfile,u.alias,p));d={provider:m.provider,sessionId:m.sessionid,cwd:m.sessiondir}}catch(m){return m instanceof Ee?y(e,m.message):he(e,m)}else{let m=u.sessionid,p=u.provider;if(p===void 0){let h=await pi(m);if(h.length===0)return y(e,`tail: session "${m}" not found in any provider store`);if(h.length>1)return y(e,`tail: session "${m}" matches multiple providers (${h.join(", ")}); pass --provider`);p=h[0]}d={provider:p,sessionId:m}}let f=await RS(e,d.provider,d.sessionId,o,-1);return f<0?1:i?await new Promise(m=>{let p=async()=>{try{let _=await RS(e,d.provider,d.sessionId,o,f);_>=0&&(f=_)}catch(_){e.stderr.write(`tail: ${_ instanceof Error?_.message:String(_)}
2252
+ `});var MS={};le(MS,{applyMaxBytes:()=>Ya,renderMessage:()=>OS,runTail:()=>xW});async function xW(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${NW}
2253
+ `),0;let r=D(t,["--lines","--max-bytes","--watch-interval","--provider","--session","--run"],["--watch","--help"]);if(r.error!==void 0)return y(e,r.error);let n=A(r,"--lines"),s=A(r,"--max-bytes");if(n!==void 0&&s!==void 0)return y(e,"--lines and --max-bytes are mutually exclusive (choose one)");let o;if(n!==void 0){let m=Number.parseInt(n,10);if(!Number.isFinite(m)||m<1||String(m)!==n)return y(e,`invalid --lines "${n}" (expected a positive integer)`);o={kind:"lines",lines:m}}else{let m=s===void 0?vW:Number.parseInt(s,10);if(!Number.isFinite(m)||m<0||s!==void 0&&String(m)!==s)return y(e,`invalid --max-bytes "${s}" (expected a non-negative integer)`);o={kind:"bytes",maxBytes:m}}let i=C(r,"--watch"),a=A(r,"--watch-interval"),l=a===void 0?IW:Number.parseInt(a.replace(/s$/,""),10);if(!Number.isFinite(l)||l<1)return y(e,`invalid --watch-interval "${a}" (expected <N>s, N\u22651)`);if(r.positionals.length>2)return y(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let c=A(r,"--run");if(c!==void 0){if(r.positionals.length>0)return y(e,"--run is mutually exclusive with positional [target] [alias]");if(A(r,"--session")!==void 0)return y(e,"--run is mutually exclusive with --session");if(A(r,"--provider")!==void 0)return y(e,"--run is mutually exclusive with --provider");let m=Number.parseInt(c,10);if(!Number.isFinite(m)||m<=0||String(m)!==c)return y(e,`invalid --run "${c}" (expected a positive integer run id)`);try{return await j(e,async p=>AW(e,p,m,o,i,l))}catch(p){return he(e,p)}}let u=yr(kW,{target:r.positionals[0],alias:r.positionals[1],flags:{session:A(r,"--session"),provider:A(r,"--provider")}});if(u.mode==="error")return y(e,u.message);if(u.mode==="managed")return y(e,"tail managed mode requires --run <id>");let d;if(u.mode==="ai-team")if(u.alias===void 0){let m;try{m=await j(e,g=>xe(u.teamfile,g))}catch(g){return y(e,`tail: ${g instanceof Error?g.message:String(g)}`)}let p;try{p=Pe(m)}catch(g){return y(e,`tail: ${g instanceof Error?g.message:String(g)}`)}let h=Rt(p);if(h===void 0)return y(e,`tail: ${u.teamfile} has no Lead member; pass <tf>:<alias>`);try{let g=await j(e,_=>ot(u.teamfile,h.alias,_));d={provider:g.provider,sessionId:g.sessionid,cwd:g.sessiondir}}catch(g){return g instanceof Ee?y(e,g.message):he(e,g)}}else try{let m=await j(e,p=>ot(u.teamfile,u.alias,p));d={provider:m.provider,sessionId:m.sessionid,cwd:m.sessiondir}}catch(m){return m instanceof Ee?y(e,m.message):he(e,m)}else{let m=u.sessionid,p=u.provider;if(p===void 0){let h=await pi(m);if(h.length===0)return y(e,`tail: session "${m}" not found in any provider store`);if(h.length>1)return y(e,`tail: session "${m}" matches multiple providers (${h.join(", ")}); pass --provider`);p=h[0]}d={provider:p,sessionId:m}}let f=await RS(e,d.provider,d.sessionId,o,-1);return f<0?1:i?await new Promise(m=>{let p=async()=>{try{let _=await RS(e,d.provider,d.sessionId,o,f);_>=0&&(f=_)}catch(_){e.stderr.write(`tail: ${_ instanceof Error?_.message:String(_)}
2254
2254
  `)}},h=setInterval(()=>{p()},l*1e3),g=()=>{clearInterval(h),m(0)};process.once("SIGINT",g),process.once("SIGTERM",g)}):0}async function RS(t,e,r,n,s){let o;try{o=await Ht(r,e)}catch(c){return t.stderr.write(`tail: failed to load session: ${c instanceof Error?c.message:String(c)}
2255
2255
  `),-1}if(o===null)return t.stderr.write(`tail: session not found: ${r} (provider=${e})
2256
2256
  `),-1;let i=o.messages??[],a=s<0&&n.kind==="lines"?Math.max(0,i.length-n.lines):s+1;if(a>=i.length)return i.length-1;let l="";for(let c=a;c<i.length;c+=1)l+=`${OS(i[c])}
@@ -2259,18 +2259,18 @@ refresh to create/update native provider sessions for team members.
2259
2259
  `).split(`
2260
2260
  `),o=s[0]??"",i=s.slice(1);return i.length===0?`${r}: ${o}`:`${r}: ${o}
2261
2261
  ${i.map(a=>` ${a}`).join(`
2262
- `)}`}async function AW(t,e,r,n,s,o){if(e.getRun(r)===null)return y(t,`tail: run ${r}: not found`);let a=e.listSessionEvents(r),c=(n.kind==="lines"?a.slice(Math.max(0,a.length-n.lines)):a).map(d=>`${LS(d)}
2263
- `).join("");t.stdout.write(n.kind==="bytes"?Ya(c,n.maxBytes):c);let u=a.length>0?a[a.length-1].id:0;return s?await new Promise(d=>{let m=setInterval(()=>{try{let h=e.listSessionEvents(r,u),g="";for(let _ of h)g+=`${LS(_)}
2262
+ `)}`}async function AW(t,e,r,n,s,o){if(e.getRun(r)===null)return y(t,`tail: run ${r}: not found`);let a=e.listSessionEvents(r),c=(n.kind==="lines"?a.slice(Math.max(0,a.length-n.lines)):a).map(d=>`${jS(d)}
2263
+ `).join("");t.stdout.write(n.kind==="bytes"?Ya(c,n.maxBytes):c);let u=a.length>0?a[a.length-1].id:0;return s?await new Promise(d=>{let m=setInterval(()=>{try{let h=e.listSessionEvents(r,u),g="";for(let _ of h)g+=`${jS(_)}
2264
2264
  `,u=_.id;g.length>0&&t.stdout.write(n.kind==="bytes"?Ya(g,n.maxBytes):g)}catch(h){t.stderr.write(`tail: ${h instanceof Error?h.message:String(h)}
2265
- `)}},o*1e3),p=()=>{clearInterval(m),d(0)};process.once("SIGINT",p),process.once("SIGTERM",p)}):0}function Ya(t,e){if(e===0||Buffer.byteLength(t,"utf8")<=e)return t;let n=Buffer.byteLength($S,"utf8");if(n>=e)return jS(t,e);let s=e-n,o=jS(t,s);return`${$S}${o}`}function jS(t,e){if(e<=0)return"";let r=Buffer.from(t,"utf8"),n=Math.max(0,r.length-e);for(;n<r.length&&(r[n]&192)===128;)n+=1;return r.subarray(n).toString("utf8")}function LS(t){let e=CS(new Date(t.timestamp_ms))??"",r="";try{let o=JSON.parse(t.payload);typeof o.alias=="string"&&(r=`alias=${o.alias}`),typeof o.provider=="string"&&(r+=`${r?" ":""}provider=${o.provider}`),typeof o.tool=="string"&&(r+=`${r?" ":""}tool=${o.tool}`),typeof o.status=="string"&&(r+=`${r?" ":""}status=${o.status}`),(typeof o.tokens_in=="number"||typeof o.tokens_out=="number")&&(r+=`${r?" ":""}tokens=${o.tokens_in??0}/${o.tokens_out??0}`)}catch{}let n=r!==""?r:t.payload.slice(0,200),s=t.step_id===null?"":` step=${t.step_id}`;return`${e} ${t.kind}${s}: ${n}`}function CS(t){if(t===void 0)return;let e=t instanceof Date?t:new Date(t);if(Number.isNaN(e.getTime()))return;let r=n=>String(n).padStart(2,"0");return`${e.getFullYear()}-${r(e.getMonth()+1)}-${r(e.getDate())} ${r(e.getHours())}:${r(e.getMinutes())}:${r(e.getSeconds())}`}var kW,vW,IW,NW,$S,DS=T(()=>{"use strict";Lr();Te();Zt();Yt();zt();kW={name:"tail",allowsBareTeamfile:!0,supportsRaw:!0},vW=4096,IW=2,NW=`usage: lmctl tail [target] [alias]
2265
+ `)}},o*1e3),p=()=>{clearInterval(m),d(0)};process.once("SIGINT",p),process.once("SIGTERM",p)}):0}function Ya(t,e){if(e===0||Buffer.byteLength(t,"utf8")<=e)return t;let n=Buffer.byteLength($S,"utf8");if(n>=e)return LS(t,e);let s=e-n,o=LS(t,s);return`${$S}${o}`}function LS(t,e){if(e<=0)return"";let r=Buffer.from(t,"utf8"),n=Math.max(0,r.length-e);for(;n<r.length&&(r[n]&192)===128;)n+=1;return r.subarray(n).toString("utf8")}function jS(t){let e=CS(new Date(t.timestamp_ms))??"",r="";try{let o=JSON.parse(t.payload);typeof o.alias=="string"&&(r=`alias=${o.alias}`),typeof o.provider=="string"&&(r+=`${r?" ":""}provider=${o.provider}`),typeof o.tool=="string"&&(r+=`${r?" ":""}tool=${o.tool}`),typeof o.status=="string"&&(r+=`${r?" ":""}status=${o.status}`),(typeof o.tokens_in=="number"||typeof o.tokens_out=="number")&&(r+=`${r?" ":""}tokens=${o.tokens_in??0}/${o.tokens_out??0}`)}catch{}let n=r!==""?r:t.payload.slice(0,200),s=t.step_id===null?"":` step=${t.step_id}`;return`${e} ${t.kind}${s}: ${n}`}function CS(t){if(t===void 0)return;let e=t instanceof Date?t:new Date(t);if(Number.isNaN(e.getTime()))return;let r=n=>String(n).padStart(2,"0");return`${e.getFullYear()}-${r(e.getMonth()+1)}-${r(e.getDate())} ${r(e.getHours())}:${r(e.getMinutes())}:${r(e.getSeconds())}`}var kW,vW,IW,NW,$S,DS=T(()=>{"use strict";jr();Te();Zt();Yt();zt();kW={name:"tail",allowsBareTeamfile:!0,supportsRaw:!0},vW=4096,IW=2,NW=`usage: lmctl tail [target] [alias]
2266
2266
  lmctl tail --session <id> [--provider <name>]
2267
2267
  lmctl tail --run <id>
2268
2268
  [--lines N | --max-bytes N] [--watch] [--watch-interval Ns] [--provider <name>]
2269
2269
 
2270
2270
  Print or watch provider session messages, or follow a managed run timeline.
2271
2271
  --lines and --max-bytes are mutually exclusive. Default: --max-bytes 4096.`;$S=`\u2026 [truncated older output \u2014 raise with --max-bytes]
2272
- `});var qS={};ae(qS,{runInfo:()=>OW});import{execFileSync as jf}from"node:child_process";import{dirname as FS,resolve as RW}from"node:path";function LW(t){return t>=1e6?`${(t/1e6).toFixed(1)}M`:t>=1e3?`${Math.round(t/1e3)}K`:String(t)}async function OW(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${jW}
2273
- `),0;let r=D(t,["--provider","--run"],["--json","--help"]);if(r.error!==void 0)return y(e,r.error);if(r.positionals.length>2)return y(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let n=C(r,"--json"),s=A(r,"--run");if(s!==void 0){if(r.positionals.length>0)return y(e,"--run is mutually exclusive with positional [target] [alias]");if(A(r,"--provider")!==void 0)return y(e,"--run is mutually exclusive with --provider");let c=Number.parseInt(s,10);if(!Number.isFinite(c)||c<=0||String(c)!==s)return y(e,`invalid --run "${s}" (expected a positive integer run id)`);try{return await L(e,async u=>MW(e,u,c,n))}catch(u){return he(e,u)}}let o=yr($W,{target:r.positionals[0],alias:r.positionals[1],flags:{provider:A(r,"--provider")}});if(o.mode==="error")return y(e,o.message);if(o.mode==="managed")return y(e,"health managed mode requires --run <id>");if(o.mode==="ai-team"&&o.alias===void 0){let c;try{c=await L(e,u=>xe(o.teamfile,u))}catch(u){return y(e,`health: ${u instanceof Error?u.message:String(u)}`)}return DW(e,c,n)}let i,a,l;if(o.mode==="ai-team")try{let c=await L(e,u=>ot(o.teamfile,o.alias,u));i=c.provider,a=c.sessionid,l=c.alias}catch(c){return c instanceof Ee?y(e,c.message):he(e,c)}else if(a=o.sessionid,o.provider!==void 0)i=o.provider;else{let c=await pi(a);if(c.length===0)return y(e,`health: session "${a}" not found in any provider store`);if(c.length>1)return y(e,`health: session "${a}" matches multiple providers (${c.join(", ")}); pass --provider`);i=c[0]}return CW(e,i,a,l,n)}async function CW(t,e,r,n,s){let o;try{o=await Ht(r,e)}catch(l){return y(t,`health: failed to load session: ${l instanceof Error?l.message:String(l)}`)}if(o===null)return y(t,`health: session not found: ${r} (provider=${e})`);let i=Gs(o.messages),a={provider:o.provider,sessionId:o.sessionId,cwd:o.cwd,messageCount:o.messageCount??null,...o.model!==void 0?{model:o.model}:{},...n!==void 0?{alias:n}:{},totalInputTokens:o.totalInputTokens??null,totalOutputTokens:o.totalOutputTokens??null,...o.totalCachedInputTokens!==void 0?{totalCachedInputTokens:o.totalCachedInputTokens}:{},sessionLimit:i,createdAt:o.createdAt.toISOString(),modifiedAt:o.modifiedAt.toISOString()};return s?(U(t,a),0):(t.stdout.write(`Session: ${o.sessionId}
2272
+ `});var qS={};le(qS,{runInfo:()=>OW});import{execFileSync as Lf}from"node:child_process";import{dirname as FS,resolve as RW}from"node:path";function jW(t){return t>=1e6?`${(t/1e6).toFixed(1)}M`:t>=1e3?`${Math.round(t/1e3)}K`:String(t)}async function OW(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${LW}
2273
+ `),0;let r=D(t,["--provider","--run"],["--json","--help"]);if(r.error!==void 0)return y(e,r.error);if(r.positionals.length>2)return y(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let n=C(r,"--json"),s=A(r,"--run");if(s!==void 0){if(r.positionals.length>0)return y(e,"--run is mutually exclusive with positional [target] [alias]");if(A(r,"--provider")!==void 0)return y(e,"--run is mutually exclusive with --provider");let c=Number.parseInt(s,10);if(!Number.isFinite(c)||c<=0||String(c)!==s)return y(e,`invalid --run "${s}" (expected a positive integer run id)`);try{return await j(e,async u=>MW(e,u,c,n))}catch(u){return he(e,u)}}let o=yr($W,{target:r.positionals[0],alias:r.positionals[1],flags:{provider:A(r,"--provider")}});if(o.mode==="error")return y(e,o.message);if(o.mode==="managed")return y(e,"health managed mode requires --run <id>");if(o.mode==="ai-team"&&o.alias===void 0){let c;try{c=await j(e,u=>xe(o.teamfile,u))}catch(u){return y(e,`health: ${u instanceof Error?u.message:String(u)}`)}return DW(e,c,n)}let i,a,l;if(o.mode==="ai-team")try{let c=await j(e,u=>ot(o.teamfile,o.alias,u));i=c.provider,a=c.sessionid,l=c.alias}catch(c){return c instanceof Ee?y(e,c.message):he(e,c)}else if(a=o.sessionid,o.provider!==void 0)i=o.provider;else{let c=await pi(a);if(c.length===0)return y(e,`health: session "${a}" not found in any provider store`);if(c.length>1)return y(e,`health: session "${a}" matches multiple providers (${c.join(", ")}); pass --provider`);i=c[0]}return CW(e,i,a,l,n)}async function CW(t,e,r,n,s){let o;try{o=await Ht(r,e)}catch(l){return y(t,`health: failed to load session: ${l instanceof Error?l.message:String(l)}`)}if(o===null)return y(t,`health: session not found: ${r} (provider=${e})`);let i=Ks(o.messages),a={provider:o.provider,sessionId:o.sessionId,cwd:o.cwd,messageCount:o.messageCount??null,...o.model!==void 0?{model:o.model}:{},...n!==void 0?{alias:n}:{},totalInputTokens:o.totalInputTokens??null,totalOutputTokens:o.totalOutputTokens??null,...o.totalCachedInputTokens!==void 0?{totalCachedInputTokens:o.totalCachedInputTokens}:{},sessionLimit:i,createdAt:o.createdAt.toISOString(),modifiedAt:o.modifiedAt.toISOString()};return s?(U(t,a),0):(t.stdout.write(`Session: ${o.sessionId}
2274
2274
  `),t.stdout.write(` Provider: ${o.provider}
2275
2275
  `),n!==void 0&&t.stdout.write(` Alias: ${n}
2276
2276
  `),t.stdout.write(` CWD: ${o.cwd}
@@ -2291,26 +2291,26 @@ Print or watch provider session messages, or follow a managed run timeline.
2291
2291
  `),t.stdout.write(` Steps: ${s.steps.length}
2292
2292
  `),t.stdout.write(` AgentCalls: ${i.agentCallCount}
2293
2293
  `),t.stdout.write(` Tokens: ${i.totalInputTokens} in / ${i.totalOutputTokens} out
2294
- `),0)}async function DW(t,e,r){let n,s;try{let w=await L(t,E=>{let I=st(e,E);if(I.parseErrors.length>0)throw new Error(I.parseErrors.join("; "));return{teamName:I.name,targets:US(e,E,new Set,[])}});s=w.teamName,n=w.targets}catch(w){return y(t,`health: ${w instanceof Error?w.message:String(w)}`)}let o=BW(e),i=o.kind==="repo"?o:null,a=await PW(t,n),l=[],c=0,u=i===null?void 0:0,d=i===null?void 0:0;for(let w of n){let E=null;try{E=await Ht(w.sessionid,w.provider)}catch(q){t.stderr.write(`warning: failed to load session "${w.sessionid}" for ${w.reportPath} (${w.provider}): ${q instanceof Error?q.message:String(q)}
2295
- `)}let I=E?.messageCount,x=i===null?void 0:E===null?null:qW(E,i.since),H=i===null?void 0:E===null?null:JW(E)??"n/a",ue=i===null?void 0:{messageCount:x??null,tokens:null};l.push({alias:w.alias,reportPath:w.reportPath,teamfile:w.teamfile,provider:w.provider,sessionid:w.sessionid,messageCount:I??null,model:E?.model??"(unknown)",lastContext:E?.lastInputTokens,detailLoaded:E!==null,liveness:a.get(WS(w.teamfile,w.alias))??BS(),sessionLimit:E===null?null:Gs(E.messages),...i!==null?{activitySinceLastCommit:ue,cumulativeTokens:H}:{}}),I===void 0?c=void 0:c!==void 0&&(c+=I),i!==null&&(x==null?u=void 0:u!==void 0&&(u+=x),H==null||H==="n/a"?d=void 0:d!==void 0&&(d+=H))}if(r)return U(t,{team:s,git:i===null?null:{teamDir:i.teamDir,commits:i.commits.map(w=>({ref:w.ref,timestamp:w.timestamp.toISOString()})),since:i.since.toISOString(),working:i.working},members:l.map(({detailLoaded:w,cumulativeTokens:E,...I})=>({...I,lastContext:I.lastContext??null,...E!==void 0?{cumulativeTokens:E==="n/a"?null:E}:{}})),total:{messageCount:c??null}}),0;let f=Math.max(7,...l.map(w=>w.sessionid.length)),m=Math.max(5,...l.map(w=>w.reportPath.length))+1,p=Math.max(8,...l.map(w=>w.provider.length))+1,h=Math.max(5,...l.map(w=>w.model.length))+1,g=Math.max(4,...l.map(w=>PS(w.liveness).length))+1;if(t.stdout.write(`TEAM: ${s}
2294
+ `),0)}async function DW(t,e,r){let n,s;try{let w=await j(t,E=>{let I=st(e,E);if(I.parseErrors.length>0)throw new Error(I.parseErrors.join("; "));return{teamName:I.name,targets:US(e,E,new Set,[])}});s=w.teamName,n=w.targets}catch(w){return y(t,`health: ${w instanceof Error?w.message:String(w)}`)}let o=BW(e),i=o.kind==="repo"?o:null,a=await PW(t,n),l=[],c=0,u=i===null?void 0:0,d=i===null?void 0:0;for(let w of n){let E=null;try{E=await Ht(w.sessionid,w.provider)}catch(q){t.stderr.write(`warning: failed to load session "${w.sessionid}" for ${w.reportPath} (${w.provider}): ${q instanceof Error?q.message:String(q)}
2295
+ `)}let I=E?.messageCount,x=i===null?void 0:E===null?null:qW(E,i.since),H=i===null?void 0:E===null?null:JW(E)??"n/a",ue=i===null?void 0:{messageCount:x??null,tokens:null};l.push({alias:w.alias,reportPath:w.reportPath,teamfile:w.teamfile,provider:w.provider,sessionid:w.sessionid,messageCount:I??null,model:E?.model??"(unknown)",lastContext:E?.lastInputTokens,detailLoaded:E!==null,liveness:a.get(WS(w.teamfile,w.alias))??BS(),sessionLimit:E===null?null:Ks(E.messages),...i!==null?{activitySinceLastCommit:ue,cumulativeTokens:H}:{}}),I===void 0?c=void 0:c!==void 0&&(c+=I),i!==null&&(x==null?u=void 0:u!==void 0&&(u+=x),H==null||H==="n/a"?d=void 0:d!==void 0&&(d+=H))}if(r)return U(t,{team:s,git:i===null?null:{teamDir:i.teamDir,commits:i.commits.map(w=>({ref:w.ref,timestamp:w.timestamp.toISOString()})),since:i.since.toISOString(),working:i.working},members:l.map(({detailLoaded:w,cumulativeTokens:E,...I})=>({...I,lastContext:I.lastContext??null,...E!==void 0?{cumulativeTokens:E==="n/a"?null:E}:{}})),total:{messageCount:c??null}}),0;let f=Math.max(7,...l.map(w=>w.sessionid.length)),m=Math.max(5,...l.map(w=>w.reportPath.length))+1,p=Math.max(8,...l.map(w=>w.provider.length))+1,h=Math.max(5,...l.map(w=>w.model.length))+1,g=Math.max(4,...l.map(w=>PS(w.liveness).length))+1;if(t.stdout.write(`TEAM: ${s}
2296
2296
  `),o.kind==="repo"){t.stdout.write(`Git progress:
2297
2297
  `);for(let w of o.commits)t.stdout.write(` ${w.ref}: ${w.timestamp.toISOString()}
2298
2298
  `);t.stdout.write(` Uncommitted: ${yt(o.working.uncommittedTracked)} changed (tracked), ${yt(o.working.untracked)} untracked
2299
2299
  `)}else o.reason==="no-commits"?t.stdout.write(`Git progress: git repository in ${o.teamDir} has no commits (no commit-based progress to report)
2300
2300
  `):t.stdout.write(`Git progress: no git repository in ${o.teamDir} (no commit-based progress to report)
2301
2301
  `);t.stdout.write(` ${"SESSION".padEnd(f)} ${"ALIAS".padEnd(m)}${"PROVIDER".padEnd(p)}${"MODEL".padEnd(h)}${"LIVE".padEnd(g)}${"MSGS".padStart(6)} ${"LAST CONTEXT".padStart(12)}`+(i!==null?` ${"MSGS SINCE COMMIT".padStart(17)} ${"TOKENS SINCE COMMIT".padStart(19)} ${"TOKENS (cumulative)".padStart(19)}`:"")+`
2302
- `);let _=!1,S=l.filter(w=>w.sessionLimit!==null);for(let w of l){let E=WW(w.lastContext,w.detailLoaded,LW);(E==="n/a"||w.cumulativeTokens==="n/a")&&(_=!0),t.stdout.write(` ${w.sessionid.padEnd(f)} ${w.reportPath.padEnd(m)}${w.provider.padEnd(p)}${w.model.padEnd(h)}${PS(w.liveness).padEnd(g)}${yt(w.messageCount).padStart(6)} ${E.padStart(12)}`+(i!==null?` ${yt(w.activitySinceLastCommit?.messageCount).padStart(17)} ${yt(w.activitySinceLastCommit?.tokens).padStart(19)} ${UW(w.cumulativeTokens).padStart(19)}`:"")+`
2302
+ `);let _=!1,S=l.filter(w=>w.sessionLimit!==null);for(let w of l){let E=WW(w.lastContext,w.detailLoaded,jW);(E==="n/a"||w.cumulativeTokens==="n/a")&&(_=!0),t.stdout.write(` ${w.sessionid.padEnd(f)} ${w.reportPath.padEnd(m)}${w.provider.padEnd(p)}${w.model.padEnd(h)}${PS(w.liveness).padEnd(g)}${yt(w.messageCount).padStart(6)} ${E.padStart(12)}`+(i!==null?` ${yt(w.activitySinceLastCommit?.messageCount).padStart(17)} ${yt(w.activitySinceLastCommit?.tokens).padStart(19)} ${UW(w.cumulativeTokens).padStart(19)}`:"")+`
2303
2303
  `)}if(t.stdout.write(` ${"TOTAL".padEnd(f)} ${"".padEnd(m)}${"".padEnd(p)}${"".padEnd(h)}${"".padEnd(g)}${yt(c).padStart(6)}`+(i!==null?` ${"".padStart(12)} ${yt(u).padStart(17)} ${yt(null).padStart(19)} ${yt(d).padStart(19)}`:"")+`
2304
2304
  `),_&&t.stdout.write(`n/a = this provider does not expose a context/token total; absence is not a health signal.
2305
2305
  `),S.length>0){t.stdout.write(`Session limits:
2306
2306
  `);for(let w of S)t.stdout.write(` ${w.reportPath}: LIMITED resets_at=${HS(w.sessionLimit)}
2307
- `)}return 0}function US(t,e,r,n){let s=xe(t,e);if(r.has(s))return[];r.add(s);let o=st(s,e);if(o.parseErrors.length>0)throw new Error(`${s}: ${o.parseErrors.join("; ")}`);let i=[];for(let a of o.members){if(a.teamfile!==void 0){i.push(...US(RW(FS(s),a.teamfile),e,r,[...n,a.alias]));continue}a.session===void 0||a.session.length===0||i.push({teamfile:s,alias:a.alias,reportPath:[...n,a.alias].join("/"),provider:a.provider,sessionid:a.session})}return i}async function PW(t,e){try{let r=await L(t,n=>e.map(s=>{let o=n.getAgentInflight(s.teamfile,s.alias);return[WS(s.teamfile,s.alias),FW(o)]}));return new Map(r)}catch{return new Map}}function WS(t,e){return`${t}\0${e.toLowerCase()}`}function FW(t){return t===null?BS():{state:"in_flight",inFlight:{senderTeamfile:t.sender_teamfile,senderAlias:t.sender_alias,startedAt:t.started_at,activeCount:t.active_count,holderPid:t.holder_pid}}}function BS(){return{state:"idle",inFlight:null}}function PS(t){return t.state}function HS(t){return t.resets_at!==null?t.resets_at:t.timezone!==null?`${t.reset_time} (${t.timezone})`:t.reset_time}function yt(t){return t==null?"unknown":String(t)}function UW(t){return t==="n/a"?t:yt(t)}function WW(t,e,r=String){return t!==void 0?r(t):e?"n/a":"unknown"}function BW(t){let e=FS(t),r;try{jf("git",["-C",e,"rev-parse","--is-inside-work-tree"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{kind:"unavailable",reason:"no-repo",teamDir:e}}try{r=jf("git",["-C",e,"log","-2","--format=%ct"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{kind:"unavailable",reason:"no-commits",teamDir:e}}let n=r.split(/\r?\n/).map(o=>Number.parseInt(o.trim(),10)).filter(o=>Number.isFinite(o)&&o>0);if(n.length===0)return{kind:"unavailable",reason:"no-commits",teamDir:e};let s=n.slice(0,2).map((o,i)=>({ref:i===0?"HEAD":`HEAD~${i}`,timestamp:new Date(o*1e3)}));return{kind:"repo",teamDir:e,since:s[0].timestamp,commits:s,working:HW(e)}}function HW(t){let e;try{e=jf("git",["-C",t,"status","--porcelain"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{uncommittedTracked:null,untracked:null}}let r=0,n=0;for(let s of e.split(/\r?\n/))s.trim().length!==0&&(s.startsWith("??")?n+=1:r+=1);return{uncommittedTracked:r,untracked:n}}function qW(t,e){let r=e.getTime();return t.messages.filter(n=>(n.role==="user"||n.role==="assistant")&&Number.isFinite(n.timestamp.getTime())&&n.timestamp.getTime()>r).length}function JW(t){if(t===null)return null;let e=[t.totalInputTokens,t.totalCachedInputTokens,t.totalCacheWriteInputTokens,t.totalOutputTokens,t.totalReasoningOutputTokens].filter(r=>typeof r=="number"&&Number.isFinite(r));return e.length===0?null:e.reduce((r,n)=>r+n,0)}var $W,jW,JS=T(()=>{"use strict";Lr();Te();Zt();zt();Bt();kf();$W={name:"health",allowsBareTeamfile:!0,supportsRaw:!0},jW=`usage: lmctl health [target] [alias]
2307
+ `)}return 0}function US(t,e,r,n){let s=xe(t,e);if(r.has(s))return[];r.add(s);let o=st(s,e);if(o.parseErrors.length>0)throw new Error(`${s}: ${o.parseErrors.join("; ")}`);let i=[];for(let a of o.members){if(a.teamfile!==void 0){i.push(...US(RW(FS(s),a.teamfile),e,r,[...n,a.alias]));continue}a.session===void 0||a.session.length===0||i.push({teamfile:s,alias:a.alias,reportPath:[...n,a.alias].join("/"),provider:a.provider,sessionid:a.session})}return i}async function PW(t,e){try{let r=await j(t,n=>e.map(s=>{let o=n.getAgentInflight(s.teamfile,s.alias);return[WS(s.teamfile,s.alias),FW(o)]}));return new Map(r)}catch{return new Map}}function WS(t,e){return`${t}\0${e.toLowerCase()}`}function FW(t){return t===null?BS():{state:"in_flight",inFlight:{senderTeamfile:t.sender_teamfile,senderAlias:t.sender_alias,startedAt:t.started_at,activeCount:t.active_count,holderPid:t.holder_pid}}}function BS(){return{state:"idle",inFlight:null}}function PS(t){return t.state}function HS(t){return t.resets_at!==null?t.resets_at:t.timezone!==null?`${t.reset_time} (${t.timezone})`:t.reset_time}function yt(t){return t==null?"unknown":String(t)}function UW(t){return t==="n/a"?t:yt(t)}function WW(t,e,r=String){return t!==void 0?r(t):e?"n/a":"unknown"}function BW(t){let e=FS(t),r;try{Lf("git",["-C",e,"rev-parse","--is-inside-work-tree"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{kind:"unavailable",reason:"no-repo",teamDir:e}}try{r=Lf("git",["-C",e,"log","-2","--format=%ct"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{kind:"unavailable",reason:"no-commits",teamDir:e}}let n=r.split(/\r?\n/).map(o=>Number.parseInt(o.trim(),10)).filter(o=>Number.isFinite(o)&&o>0);if(n.length===0)return{kind:"unavailable",reason:"no-commits",teamDir:e};let s=n.slice(0,2).map((o,i)=>({ref:i===0?"HEAD":`HEAD~${i}`,timestamp:new Date(o*1e3)}));return{kind:"repo",teamDir:e,since:s[0].timestamp,commits:s,working:HW(e)}}function HW(t){let e;try{e=Lf("git",["-C",t,"status","--porcelain"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{uncommittedTracked:null,untracked:null}}let r=0,n=0;for(let s of e.split(/\r?\n/))s.trim().length!==0&&(s.startsWith("??")?n+=1:r+=1);return{uncommittedTracked:r,untracked:n}}function qW(t,e){let r=e.getTime();return t.messages.filter(n=>(n.role==="user"||n.role==="assistant")&&Number.isFinite(n.timestamp.getTime())&&n.timestamp.getTime()>r).length}function JW(t){if(t===null)return null;let e=[t.totalInputTokens,t.totalCachedInputTokens,t.totalCacheWriteInputTokens,t.totalOutputTokens,t.totalReasoningOutputTokens].filter(r=>typeof r=="number"&&Number.isFinite(r));return e.length===0?null:e.reduce((r,n)=>r+n,0)}var $W,LW,JS=T(()=>{"use strict";jr();Te();Zt();zt();Bt();kf();$W={name:"health",allowsBareTeamfile:!0,supportsRaw:!0},LW=`usage: lmctl health [target] [alias]
2308
2308
  lmctl health <teamfile> # team rollup
2309
2309
  lmctl health <sessionid> [--provider <name>]
2310
2310
  [--json]
2311
2311
 
2312
- Show provider session details, team rollups, or managed run state/token totals.`});var GS={};ae(GS,{runLs:()=>VW});import{resolve as Lf}from"node:path";function KW(t){let e=new Map;for(let r of t){let n=`${r.provider}:${r.sessionId}`,s=e.get(n);(s===void 0||r.modifiedAt.getTime()>s.modifiedAt.getTime())&&e.set(n,r)}return[...e.values()]}async function VW(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${XW}
2313
- `),0;let r=D(t,["--provider","--sessiondir","--format","--limit"],["--recursive","--all","--json","--runs","--help"]);if(r.error!==void 0)return y(e,r.error);if(r.positionals.length>0)return y(e,"ls does not accept positional targets (use --provider/--sessiondir/--all to filter)");let n=A(r,"--format"),s=C(r,"--json");if(C(r,"--runs")){for(let _ of["--provider","--sessiondir"])if(A(r,_)!==void 0)return y(e,`--runs is mutually exclusive with ${_}`);for(let _ of["--recursive","--all"])if(C(r,_))return y(e,`--runs is mutually exclusive with ${_}`);if(n==="teamfile")return y(e,"--runs is mutually exclusive with --format teamfile (runs are not teamfile members)");let p=A(r,"--limit"),h=GW;if(p!==void 0){let _=Number.parseInt(p,10);if(!Number.isFinite(_)||_<1||String(_)!==p)return y(e,`invalid --limit "${p}" (expected a positive integer)`);if(_>XS)return y(e,`--limit ${_} exceeds maximum (${XS})`);h=_}let g=n==="json"||s===!0?"json":"table";try{return await L(e,async _=>YW(e,_,h,g))}catch(_){return he(e,_)}}let i=zW(n,s);if("error"in i)return y(e,i.error);let a=i.format,l=A(r,"--provider"),c=A(r,"--sessiondir"),u=C(r,"--recursive"),d=C(r,"--all"),f;try{f=await Cc(l?{provider:l}:{})}catch(p){return y(e,`ls: discovery failed: ${p instanceof Error?p.message:String(p)}`)}if(!d){let p=c!==void 0?Lf(c):Lf(process.cwd());f=f.filter(h=>{let g=Lf(h.cwd);return u?g===p||g.startsWith(`${p}/`):g===p})}if(f=KW(f),a==="json")return U(e,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=d?"(all)":c??process.cwd(),h=u?"under":"in";e.stdout.write(`No native sessions found ${h} ${p}.
2312
+ Show provider session details, team rollups, or managed run state/token totals.`});var GS={};le(GS,{runLs:()=>VW});import{resolve as jf}from"node:path";function KW(t){let e=new Map;for(let r of t){let n=`${r.provider}:${r.sessionId}`,s=e.get(n);(s===void 0||r.modifiedAt.getTime()>s.modifiedAt.getTime())&&e.set(n,r)}return[...e.values()]}async function VW(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${XW}
2313
+ `),0;let r=D(t,["--provider","--sessiondir","--format","--limit"],["--recursive","--all","--json","--runs","--help"]);if(r.error!==void 0)return y(e,r.error);if(r.positionals.length>0)return y(e,"ls does not accept positional targets (use --provider/--sessiondir/--all to filter)");let n=A(r,"--format"),s=C(r,"--json");if(C(r,"--runs")){for(let _ of["--provider","--sessiondir"])if(A(r,_)!==void 0)return y(e,`--runs is mutually exclusive with ${_}`);for(let _ of["--recursive","--all"])if(C(r,_))return y(e,`--runs is mutually exclusive with ${_}`);if(n==="teamfile")return y(e,"--runs is mutually exclusive with --format teamfile (runs are not teamfile members)");let p=A(r,"--limit"),h=GW;if(p!==void 0){let _=Number.parseInt(p,10);if(!Number.isFinite(_)||_<1||String(_)!==p)return y(e,`invalid --limit "${p}" (expected a positive integer)`);if(_>XS)return y(e,`--limit ${_} exceeds maximum (${XS})`);h=_}let g=n==="json"||s===!0?"json":"table";try{return await j(e,async _=>YW(e,_,h,g))}catch(_){return he(e,_)}}let i=zW(n,s);if("error"in i)return y(e,i.error);let a=i.format,l=A(r,"--provider"),c=A(r,"--sessiondir"),u=C(r,"--recursive"),d=C(r,"--all"),f;try{f=await Cc(l?{provider:l}:{})}catch(p){return y(e,`ls: discovery failed: ${p instanceof Error?p.message:String(p)}`)}if(!d){let p=c!==void 0?jf(c):jf(process.cwd());f=f.filter(h=>{let g=jf(h.cwd);return u?g===p||g.startsWith(`${p}/`):g===p})}if(f=KW(f),a==="json")return U(e,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=d?"(all)":c??process.cwd(),h=u?"under":"in";e.stdout.write(`No native sessions found ${h} ${p}.
2314
2314
  `)}return 0}if(a==="teamfile"){for(let p of f)e.stdout.write(`_MEMBER_ alias=- provider=${p.provider} sessionid=${p.sessionId} sessiondir=${p.cwd}
2315
2315
  `);return 0}let m=Math.max(14,...f.map(p=>p.sessionId.length));e.stdout.write(`${"SESSION".padEnd(m)} ${"PROVIDER".padEnd(10)} ${"SESSIONDIR".padEnd(36)} MODIFIED
2316
2316
  `);for(let p of f){let h=p.cwd.length>36?`\u2026${p.cwd.slice(-35)}`:p.cwd;e.stdout.write(`${p.sessionId.padEnd(m)} ${p.provider.padEnd(10)} ${h.padEnd(36)} ${p.modifiedAt.toISOString()}
@@ -2321,33 +2321,33 @@ Show provider session details, team rollups, or managed run state/token totals.`
2321
2321
  [--recursive] [--all] [--format table|teamfile|json] [--json]
2322
2322
  lmctl ls --runs [--limit N] [--format table|json] [--json]
2323
2323
 
2324
- List native provider sessions in scope, or list recent managed runs with --runs.`,GW=50,XS=500});import{existsSync as Qs,readFileSync as VS}from"node:fs";import{homedir as ZW}from"node:os";import{dirname as YS,resolve as Pn}from"node:path";import{fileURLToPath as QW}from"node:url";function Mf(t,e={}){let r=[],n=rB(e.modelSelectionDocPath);for(let s of t){let o=s.provider.trim().toLowerCase();if(s.effort&&o!=="opencode"&&o!=="lmplayer"&&o!=="qwen"&&r.push(`[${s.alias}] effort="${s.effort}" is ignored: effort selection is only supported for opencode and lmplayer.`),o==="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.`),o==="copilot"){if(!s.model)continue;r.push(`[${s.alias}] model="${s.model}" is ignored: copilot does not support lmctl model selection.`);continue}if(o==="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(o==="lmplayer")continue;if(o==="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=lB(e.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 i=n.get(o);if(!i){r.push(`[${s.alias}] model="${s.model}" cannot be verified for provider "${o}": `+(Za??"no tested models found in durable-memory/model_selection.md"));continue}i.includes(s.model)||r.push(`[${s.alias}] model="${s.model}" is not in the tested model list for provider "${o}". Valid tested models: ${uB(i)}`)}return r}function rB(t){if(!t&&Zs)return Zs;let e=new Map,r,n=t??nB();if(!Qs(n))return r=`${n} not found`,t||Of(e),t||(Zs=e),t||(Za=r),e;let s;try{s=VS(n,"utf-8")}catch(o){return r=`${n} could not be read: ${o instanceof Error?o.message:String(o)}`,t||Of(e),t||(Zs=e),t||(Za=r),e}for(let[o,i]of Object.entries(eB)){let a=iB(s,i),l=aB(a);l.length>0&&e.set(o,l)}return e.size===0&&(r=`${n} has no tested model rows`),!t&&e.size===0&&Of(e),t||(Zs=e),t||(Za=r),e}function nB(){return sB(YS(QW(import.meta.url)))}function sB(t){let e=oB(t);if(e){let n=Pn(e,"durable-memory","model_selection.md");if(Qs(n))return n}let r=[Pn(t,"..","..","durable-memory","model_selection.md"),Pn(t,"..","..","..","durable-memory","model_selection.md")];for(let n of r)if(Qs(n))return n;return r[r.length-1]}function oB(t){let e=Pn(t);for(;;){if(Qs(Pn(e,"package.json")))return e;let r=YS(e);if(r===e)return null;e=r}}function Of(t){for(let[e,r]of Object.entries(tB))t.set(e,r)}function iB(t,e){let n=new RegExp(`^## ${dB(e)}\\s*$`,"m").exec(t);if(!n)return"";let s=n.index+n[0].length,o=t.slice(s),i=/^##\s+/m.exec(o);return i?o.slice(0,i.index):o}function aB(t){let e=new Set;for(let r of t.split(/\r?\n/)){let n=r.trim();if(!n.startsWith("| `"))continue;let s=/^\|\s*`([^`]+)`\s*\|/.exec(n);if(!s)continue;let o=s[1].trim();o&&o!=="Configured `model="&&e.add(o)}return[...e]}function lB(t){let e=t??Pn(ZW(),".config","opencode","opencode.json");if(!Qs(e))return{available:!0,models:[]};let r;try{r=JSON.parse(VS(e,"utf-8"))}catch(n){return{available:!1,models:[],reason:`${e} could not be parsed: ${n instanceof Error?n.message:String(n)}`}}return{available:!0,models:cB(r)}}function cB(t){if(!Cf(t))return[];let e=za(t.provider)??za(t.providers);if(!e)return[];let r=new Set;for(let[n,s]of Object.entries(e)){if(!Cf(s))continue;let o=za(s.models)??za(s.model);if(o)for(let i of Object.keys(o))r.add(i.startsWith(`${n}/`)?i:`${n}/${i}`)}return[...r].sort()}function za(t){return Cf(t)?t:null}function Cf(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function uB(t){return t.length>0?t.join(", "):"(none)"}function dB(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var eB,tB,Zs,Za,zS=T(()=>{"use strict";eB={claude:"Claude",codex:"Codex",gemini:"Gemini",qwen:"Qwen",agy:"Antigravity"},tB={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"]},Zs=null});import{homedir as fB}from"node:os";import{basename as mB}from"node:path";function Qa(t,e){let r=new Set;return{text:t.replace(hB,(s,o)=>{let i=o.trim(),a=pB[i];return a===void 0?(r.add(i),s):a(e)}),unknownNames:[...r].sort()}}function el(t){return{workdir:t.workdir,teamfile:t.teamfile,date:_B(t.date)}}function _B(t){return t.toISOString().slice(0,10)}var pB,hB,Df=T(()=>{"use strict";pB={workdir:t=>t.workdir,teamfile:t=>t.teamfile,teamname:t=>{let e=mB(t.teamfile);return e.endsWith(".lmctl")?e.slice(0,-6):e},home:()=>fB(),date:t=>t.date},hB=/{{\s*([A-Za-z0-9_-]+)\s*}}/g});var ro={};ae(ro,{GEMINI_PROVIDER_NOTICE:()=>tk,_setLintSessiondirFsOpsForTests:()=>kB,_setTeamfileSeedForTests:()=>SB,buildRootTeamRegistrationRow:()=>ik,registerRootTeam:()=>ak,runHire:()=>jB,runLint:()=>$B,runRefresh:()=>LB,runSeed:()=>sk,sha256Text:()=>ok});import{createHash as gB}from"node:crypto";import{accessSync as yB,constants as ZS,existsSync as wB,readFileSync as nl,realpathSync as Uf,statSync as EB,writeFileSync as rl}from"node:fs";import{dirname as Hr,resolve as ek}from"node:path";function SB(t){rk=t??(async e=>{let{seed:r}=await Promise.resolve().then(()=>(kt(),Dc)),n=await r(e);return n.success?{sessionId:n.sessionId}:{error:n.error??"provider seed failed"}})}function kB(t){Br=t===null?Wf:{...Wf,...t}}function vB(t,e){let r=Hr(e),n=new Set,s=[];for(let o of t){if(o.teamfile!==void 0)continue;let i=o.sessiondir??r,a=ek(i);if(n.has(a))continue;let l=IB(a);l!==void 0&&(n.add(a),s.push(`${o.alias}: sessiondir ${a} is not writable (seed would fail: ${l}) \u2014 fix permissions or set a writable sessiondir`))}return s}function IB(t){try{if(Br.existsSync(t)){if(!Br.statSync(t).isDirectory())return"ENOTDIR";Br.accessSync(t,ZS.W_OK);return}let e=AB(t);if(e===void 0)return;if(!Br.statSync(e).isDirectory())return"ENOTDIR";Br.accessSync(e,ZS.W_OK);return}catch(e){return RB(e)??"permission check failed"}}function NB(t,e){let r=[];for(let n of t)n.teamfile!==void 0||n.sessiondir===void 0||nk(n.sessiondir,e)&&r.push(`${n.alias}: sessiondir equals the teamfile directory and is redundant; lmctl seed will remove it`);return r}function xB(t,e,r,n){let s=!1;for(let o of t){if(o.teamfile!==void 0||o.sessiondir===void 0||!nk(o.sessiondir,n))continue;let i=r.get(o.alias.toLowerCase());if(i===void 0)continue;let a=lk(e[i],"sessiondir");a!==e[i]&&(e[i]=a,s=!0),o.sessiondir=void 0}return s}function nk(t,e){return QS(t)===QS(e)}function QS(t){let e=ek(t);try{return Uf(e)}catch{return e}}function AB(t){let e=t;for(;;){try{if(Br.existsSync(e))return e}catch{return}let r=Hr(e);if(r===e)return;e=r}}function RB(t){if(typeof t=="object"&&t!==null&&"code"in t){let e=t.code;if(typeof e=="string"&&e.length>0)return e}}async function $B(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(TB),0;if(t.length!==1)return e.stderr.write(`usage: lmctl lint <teamfile.lmctl>
2325
- `),2;let r=t[0],n;try{n=await L(e,c=>xe(r,c))}catch(c){return Le(e,`${r}: ${c instanceof Error?c.message:String(c)}`)}let s;try{s=Pe(n)}catch(c){return Le(e,`${r}: ${c instanceof Error?c.message:String(c)}`)}let o=tf(s,Hr(n)),i=Mf(s.members),a=nl(n,"utf8"),l=Qa(a,el({workdir:Hr(n),teamfile:n,date:new Date})).unknownNames;l.length>0&&i.push(`unknown template placeholder${l.length===1?"":"s"}: ${l.map(c=>`{{${c}}}`).join(", ")}`),i.push(...Zl(s.members,Hr(n))),i.push(...vB(s.members,n)),i.push(...NB(s.members,Hr(n)));for(let c of o)e.stderr.write(`error: ${c.field}: ${c.message}
2326
- `);for(let c of s.members)Hf([c],e),c.session!==void 0&&c.session.length<eo&&i.push(`${c.alias}: sessionid is shorter than ${eo} chars; run lmctl seed to refresh it`);for(let c of i)e.stderr.write(`warning: ${c}
2327
- `);return await L(e,c=>{Tb(n,c,u=>e.stderr.write(`${u}
2324
+ List native provider sessions in scope, or list recent managed runs with --runs.`,GW=50,XS=500});import{existsSync as eo,readFileSync as VS}from"node:fs";import{homedir as ZW}from"node:os";import{dirname as YS,resolve as Pn}from"node:path";import{fileURLToPath as QW}from"node:url";function Mf(t,e={}){let r=[],n=rB(e.modelSelectionDocPath);for(let s of t){let o=s.provider.trim().toLowerCase();if(s.effort&&o!=="opencode"&&o!=="lmplayer"&&o!=="qwen"&&r.push(`[${s.alias}] effort="${s.effort}" is ignored: effort selection is only supported for opencode and lmplayer.`),o==="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.`),o==="copilot"){if(!s.model)continue;r.push(`[${s.alias}] model="${s.model}" is ignored: copilot does not support lmctl model selection.`);continue}if(o==="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(o==="lmplayer")continue;if(o==="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=lB(e.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 i=n.get(o);if(!i){r.push(`[${s.alias}] model="${s.model}" cannot be verified for provider "${o}": `+(Za??"no tested models found in durable-memory/model_selection.md"));continue}i.includes(s.model)||r.push(`[${s.alias}] model="${s.model}" is not in the tested model list for provider "${o}". Valid tested models: ${uB(i)}`)}return r}function rB(t){if(!t&&Qs)return Qs;let e=new Map,r,n=t??nB();if(!eo(n))return r=`${n} not found`,t||Of(e),t||(Qs=e),t||(Za=r),e;let s;try{s=VS(n,"utf-8")}catch(o){return r=`${n} could not be read: ${o instanceof Error?o.message:String(o)}`,t||Of(e),t||(Qs=e),t||(Za=r),e}for(let[o,i]of Object.entries(eB)){let a=iB(s,i),l=aB(a);l.length>0&&e.set(o,l)}return e.size===0&&(r=`${n} has no tested model rows`),!t&&e.size===0&&Of(e),t||(Qs=e),t||(Za=r),e}function nB(){return sB(YS(QW(import.meta.url)))}function sB(t){let e=oB(t);if(e){let n=Pn(e,"durable-memory","model_selection.md");if(eo(n))return n}let r=[Pn(t,"..","..","durable-memory","model_selection.md"),Pn(t,"..","..","..","durable-memory","model_selection.md")];for(let n of r)if(eo(n))return n;return r[r.length-1]}function oB(t){let e=Pn(t);for(;;){if(eo(Pn(e,"package.json")))return e;let r=YS(e);if(r===e)return null;e=r}}function Of(t){for(let[e,r]of Object.entries(tB))t.set(e,r)}function iB(t,e){let n=new RegExp(`^## ${dB(e)}\\s*$`,"m").exec(t);if(!n)return"";let s=n.index+n[0].length,o=t.slice(s),i=/^##\s+/m.exec(o);return i?o.slice(0,i.index):o}function aB(t){let e=new Set;for(let r of t.split(/\r?\n/)){let n=r.trim();if(!n.startsWith("| `"))continue;let s=/^\|\s*`([^`]+)`\s*\|/.exec(n);if(!s)continue;let o=s[1].trim();o&&o!=="Configured `model="&&e.add(o)}return[...e]}function lB(t){let e=t??Pn(ZW(),".config","opencode","opencode.json");if(!eo(e))return{available:!0,models:[]};let r;try{r=JSON.parse(VS(e,"utf-8"))}catch(n){return{available:!1,models:[],reason:`${e} could not be parsed: ${n instanceof Error?n.message:String(n)}`}}return{available:!0,models:cB(r)}}function cB(t){if(!Cf(t))return[];let e=za(t.provider)??za(t.providers);if(!e)return[];let r=new Set;for(let[n,s]of Object.entries(e)){if(!Cf(s))continue;let o=za(s.models)??za(s.model);if(o)for(let i of Object.keys(o))r.add(i.startsWith(`${n}/`)?i:`${n}/${i}`)}return[...r].sort()}function za(t){return Cf(t)?t:null}function Cf(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function uB(t){return t.length>0?t.join(", "):"(none)"}function dB(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var eB,tB,Qs,Za,zS=T(()=>{"use strict";eB={claude:"Claude",codex:"Codex",gemini:"Gemini",qwen:"Qwen",agy:"Antigravity"},tB={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"]},Qs=null});import{homedir as fB}from"node:os";import{basename as mB}from"node:path";function Qa(t,e){let r=new Set;return{text:t.replace(hB,(s,o)=>{let i=o.trim(),a=pB[i];return a===void 0?(r.add(i),s):a(e)}),unknownNames:[...r].sort()}}function el(t){return{workdir:t.workdir,teamfile:t.teamfile,date:_B(t.date)}}function _B(t){return t.toISOString().slice(0,10)}var pB,hB,Df=T(()=>{"use strict";pB={workdir:t=>t.workdir,teamfile:t=>t.teamfile,teamname:t=>{let e=mB(t.teamfile);return e.endsWith(".lmctl")?e.slice(0,-6):e},home:()=>fB(),date:t=>t.date},hB=/{{\s*([A-Za-z0-9_-]+)\s*}}/g});var no={};le(no,{GEMINI_PROVIDER_NOTICE:()=>tk,_setLintSessiondirFsOpsForTests:()=>kB,_setTeamfileSeedForTests:()=>SB,buildRootTeamRegistrationRow:()=>ik,registerRootTeam:()=>ak,runHire:()=>LB,runLint:()=>$B,runRefresh:()=>jB,runSeed:()=>sk,sha256Text:()=>ok});import{createHash as gB}from"node:crypto";import{accessSync as yB,constants as ZS,existsSync as wB,readFileSync as nl,realpathSync as Uf,statSync as EB,writeFileSync as rl}from"node:fs";import{dirname as Hr,resolve as ek}from"node:path";function SB(t){rk=t??(async e=>{let{seed:r}=await Promise.resolve().then(()=>(kt(),Dc)),n=await r(e);return n.success?{sessionId:n.sessionId}:{error:n.error??"provider seed failed"}})}function kB(t){Br=t===null?Wf:{...Wf,...t}}function vB(t,e){let r=Hr(e),n=new Set,s=[];for(let o of t){if(o.teamfile!==void 0)continue;let i=o.sessiondir??r,a=ek(i);if(n.has(a))continue;let l=IB(a);l!==void 0&&(n.add(a),s.push(`${o.alias}: sessiondir ${a} is not writable (seed would fail: ${l}) \u2014 fix permissions or set a writable sessiondir`))}return s}function IB(t){try{if(Br.existsSync(t)){if(!Br.statSync(t).isDirectory())return"ENOTDIR";Br.accessSync(t,ZS.W_OK);return}let e=AB(t);if(e===void 0)return;if(!Br.statSync(e).isDirectory())return"ENOTDIR";Br.accessSync(e,ZS.W_OK);return}catch(e){return RB(e)??"permission check failed"}}function NB(t,e){let r=[];for(let n of t)n.teamfile!==void 0||n.sessiondir===void 0||nk(n.sessiondir,e)&&r.push(`${n.alias}: sessiondir equals the teamfile directory and is redundant; lmctl seed will remove it`);return r}function xB(t,e,r,n){let s=!1;for(let o of t){if(o.teamfile!==void 0||o.sessiondir===void 0||!nk(o.sessiondir,n))continue;let i=r.get(o.alias.toLowerCase());if(i===void 0)continue;let a=lk(e[i],"sessiondir");a!==e[i]&&(e[i]=a,s=!0),o.sessiondir=void 0}return s}function nk(t,e){return QS(t)===QS(e)}function QS(t){let e=ek(t);try{return Uf(e)}catch{return e}}function AB(t){let e=t;for(;;){try{if(Br.existsSync(e))return e}catch{return}let r=Hr(e);if(r===e)return;e=r}}function RB(t){if(typeof t=="object"&&t!==null&&"code"in t){let e=t.code;if(typeof e=="string"&&e.length>0)return e}}async function $B(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(TB),0;if(t.length!==1)return e.stderr.write(`usage: lmctl lint <teamfile.lmctl>
2325
+ `),2;let r=t[0],n;try{n=await j(e,c=>xe(r,c))}catch(c){return je(e,`${r}: ${c instanceof Error?c.message:String(c)}`)}let s;try{s=Pe(n)}catch(c){return je(e,`${r}: ${c instanceof Error?c.message:String(c)}`)}let o=tf(s,Hr(n)),i=Mf(s.members),a=nl(n,"utf8"),l=Qa(a,el({workdir:Hr(n),teamfile:n,date:new Date})).unknownNames;l.length>0&&i.push(`unknown template placeholder${l.length===1?"":"s"}: ${l.map(c=>`{{${c}}}`).join(", ")}`),i.push(...Zl(s.members,Hr(n))),i.push(...vB(s.members,n)),i.push(...NB(s.members,Hr(n)));for(let c of o)e.stderr.write(`error: ${c.field}: ${c.message}
2326
+ `);for(let c of s.members)Hf([c],e),c.session!==void 0&&c.session.length<to&&i.push(`${c.alias}: sessionid is shorter than ${to} chars; run lmctl seed to refresh it`);for(let c of i)e.stderr.write(`warning: ${c}
2327
+ `);return await j(e,c=>{Tb(n,c,u=>e.stderr.write(`${u}
2328
2328
  `))}),o.length>0?1:(e.stdout.write(`ok
2329
2329
  `),0)}async function sk(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(bB),0;if(t.length!==1)return e.stderr.write(`usage: lmctl seed <teamfile.lmctl>
2330
- `),2;let r=t[0],n;try{n=await L(e,_=>xe(r,_))}catch(_){return Le(e,`${r}: ${_ instanceof Error?_.message:String(_)}`)}let s;try{s=Uf(n)}catch(_){return Le(e,`${r}: ${_ instanceof Error?_.message:String(_)}`)}let o=Hr(n),i;try{i=Pe(n)}catch(_){return Le(e,`${r}: ${_ instanceof Error?_.message:String(_)}`)}let l=nl(n,"utf8").split(`
2330
+ `),2;let r=t[0],n;try{n=await j(e,_=>xe(r,_))}catch(_){return je(e,`${r}: ${_ instanceof Error?_.message:String(_)}`)}let s;try{s=Uf(n)}catch(_){return je(e,`${r}: ${_ instanceof Error?_.message:String(_)}`)}let o=Hr(n),i;try{i=Pe(n)}catch(_){return je(e,`${r}: ${_ instanceof Error?_.message:String(_)}`)}let l=nl(n,"utf8").split(`
2331
2331
  `),c=MB(l),u=xB(i.members,l,c,o),d=tf(i,o);if(d.length>0){Hf(i.members,e);for(let _ of d)e.stderr.write(`error: ${_.field}: ${_.message}
2332
2332
  `);return 1}try{mn(e,i,n)}catch{}Hf(i.members,e);for(let _ of Mf(i.members))e.stderr.write(`warning: ${_}
2333
2333
  `);for(let _ of Zl(i.members,o))e.stderr.write(`warning: ${_}
2334
- `);let f=0,m=i.members.filter(_=>_.teamfile!==void 0?!1:_.session===void 0||_.session.length<eo);for(let _ of m)if(!ck(_.provider))return e.stderr.write(`error: ${_.alias}: invalid provider "${_.provider}"
2335
- `),1;for(let _ of i.members){if(_.teamfile!==void 0)continue;if(_.session!==void 0&&_.session.length>=eo){e.stderr.write(`warning: ${_.alias}: existing sessionid preserved; skipping
2334
+ `);let f=0,m=i.members.filter(_=>_.teamfile!==void 0?!1:_.session===void 0||_.session.length<to);for(let _ of m)if(!ck(_.provider))return e.stderr.write(`error: ${_.alias}: invalid provider "${_.provider}"
2335
+ `),1;for(let _ of i.members){if(_.teamfile!==void 0)continue;if(_.session!==void 0&&_.session.length>=to){e.stderr.write(`warning: ${_.alias}: existing sessionid preserved; skipping
2336
2336
  `);continue}let S=_.sessiondir??o,w=await rk({provider:_.provider,cwd:S,..._.model!==void 0?{model:_.model}:{},..._.effort!==void 0?{effort:_.effort}:{},..._.alias.toLowerCase()==="lead"?{prompt:OB(n,l.join(`
2337
- `),i.members)}:{}});if(w.error!==void 0||w.sessionId===void 0||w.sessionId.length<eo){let x=`provider did not report a sessionid; no new session was found for ${S} (possible provider workspace/cwd mismatch)`;return e.stderr.write(`error: ${_.alias}: seed failed${w.error!==void 0?`: ${w.error}`:`; ${x}`}
2337
+ `),i.members)}:{}});if(w.error!==void 0||w.sessionId===void 0||w.sessionId.length<to){let x=`provider did not report a sessionid; no new session was found for ${S} (possible provider workspace/cwd mismatch)`;return e.stderr.write(`error: ${_.alias}: seed failed${w.error!==void 0?`: ${w.error}`:`; ${x}`}
2338
2338
  `),1}let E=c.get(_.alias.toLowerCase());if(E===void 0)return e.stderr.write(`error: ${_.alias}: could not find matching _MEMBER_ line to update
2339
2339
  `),1;let I=UB(l[E],"sessionid",w.sessionId);l[E]=I,f+=1,rl(n,l.join(`
2340
2340
  `),"utf8"),e.stdout.write(`${_.alias}: seeded ${w.sessionId} provider=${_.provider} sessiondir=${S}
2341
2341
  `)}let p=l.join(`
2342
2342
  `),h=BB(p,Uf(n));(h!==p||u)&&rl(n,h,"utf8"),f===0&&e.stdout.write(`no members needed seeding
2343
- `);let g=new Date().toISOString();return await L(e,_=>{ak(_,{teamfilePath:s,name:i.name,rawText:h,now:g})}),0}async function jB(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(tl),0;let r=D(t,["--provider","--sessiondir"],[]);if(r.error!==void 0)return Ff(e,r.error,tl);if(r.positionals.length!==2)return Ff(e,"expected <teamfile.lmctl> and <alias>",tl);let[n,s]=r.positionals;if(!FB(s))return Le(e,`invalid alias "${s}"`);if(s.toLowerCase()==="lead")return Le(e,"hire only applies to non-Lead members");let o=A(r,"--provider");if(o===void 0)return Ff(e,"missing value for --provider",tl);if(!ck(o))return Le(e,`invalid provider "${o}"`);let i;try{i=await L(e,d=>xe(n,d))}catch(d){return Le(e,`${n}: ${d instanceof Error?d.message:String(d)}`)}let a;try{a=nl(i,"utf8")}catch(d){return Le(e,`${n}: ${d instanceof Error?d.message:String(d)}`)}if(PB(a,s))return Le(e,`${s}: alias already exists in ${i}`);let l=A(r,"--sessiondir"),c=[`_MEMBER_ alias=${Bf(s)} provider=${o}`,...l===void 0?[]:[`sessiondir=${Bf(l)}`]].join(" "),u=WB(a,c);return rl(i,u,"utf8"),e.stdout.write(`Hired ${s} (${o}) -> ${i}
2343
+ `);let g=new Date().toISOString();return await j(e,_=>{ak(_,{teamfilePath:s,name:i.name,rawText:h,now:g})}),0}async function LB(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(tl),0;let r=D(t,["--provider","--sessiondir"],[]);if(r.error!==void 0)return Ff(e,r.error,tl);if(r.positionals.length!==2)return Ff(e,"expected <teamfile.lmctl> and <alias>",tl);let[n,s]=r.positionals;if(!FB(s))return je(e,`invalid alias "${s}"`);if(s.toLowerCase()==="lead")return je(e,"hire only applies to non-Lead members");let o=A(r,"--provider");if(o===void 0)return Ff(e,"missing value for --provider",tl);if(!ck(o))return je(e,`invalid provider "${o}"`);let i;try{i=await j(e,d=>xe(n,d))}catch(d){return je(e,`${n}: ${d instanceof Error?d.message:String(d)}`)}let a;try{a=nl(i,"utf8")}catch(d){return je(e,`${n}: ${d instanceof Error?d.message:String(d)}`)}if(PB(a,s))return je(e,`${s}: alias already exists in ${i}`);let l=A(r,"--sessiondir"),c=[`_MEMBER_ alias=${Bf(s)} provider=${o}`,...l===void 0?[]:[`sessiondir=${Bf(l)}`]].join(" "),u=WB(a,c);return rl(i,u,"utf8"),e.stdout.write(`Hired ${s} (${o}) -> ${i}
2344
2344
  `),e.stdout.write(`Run: lmctl seed ${i}
2345
- `),0}async function LB(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(Pf),0;let r,n;if(t.length===1){let d=Ur(t[0]);if(d===null)return e.stderr.write(Pf),2;r=d.teamfile,n=d.alias}else if(t.length===2)[r,n]=t;else return e.stderr.write(Pf),2;let s;try{s=await L(e,d=>xe(r,d))}catch(d){return Le(e,`${r}: ${d instanceof Error?d.message:String(d)}`)}let o;try{o=nl(s,"utf8")}catch(d){return Le(e,`${r}: ${d instanceof Error?d.message:String(d)}`)}let i=o.split(`
2346
- `),a=DB(i,n);if(a===void 0)return Le(e,`${n}: no active _MEMBER_ entry found`);let l=i[a];if(to(l,"teamfile")!==void 0)return Le(e,`${n}: refresh only applies to provider-backed members, not teamfile= members`);let c=(e.env??process.env)[ns],u=to(l,"sessionid");return c!==void 0&&c.length>0&&u===c?Le(e,`${n}: cannot refresh its own running session \u2014 a meta-Lead or the operator must run this refresh.`):(i[a]=lk(l,"sessionid"),a>0&&/^\s*#CreationTime:/u.test(i[a-1])&&i.splice(a-1,1),rl(s,i.join(`
2345
+ `),0}async function jB(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(Pf),0;let r,n;if(t.length===1){let d=Ur(t[0]);if(d===null)return e.stderr.write(Pf),2;r=d.teamfile,n=d.alias}else if(t.length===2)[r,n]=t;else return e.stderr.write(Pf),2;let s;try{s=await j(e,d=>xe(r,d))}catch(d){return je(e,`${r}: ${d instanceof Error?d.message:String(d)}`)}let o;try{o=nl(s,"utf8")}catch(d){return je(e,`${r}: ${d instanceof Error?d.message:String(d)}`)}let i=o.split(`
2346
+ `),a=DB(i,n);if(a===void 0)return je(e,`${n}: no active _MEMBER_ entry found`);let l=i[a];if(ro(l,"teamfile")!==void 0)return je(e,`${n}: refresh only applies to provider-backed members, not teamfile= members`);let c=(e.env??process.env)[ss],u=ro(l,"sessionid");return c!==void 0&&c.length>0&&u===c?je(e,`${n}: cannot refresh its own running session \u2014 a meta-Lead or the operator must run this refresh.`):(i[a]=lk(l,"sessionid"),a>0&&/^\s*#CreationTime:/u.test(i[a-1])&&i.splice(a-1,1),rl(s,i.join(`
2347
2347
  `),"utf8"),sk([s],e))}function ok(t){return gB("sha256").update(t).digest("hex")}function ik(t,e){return{teamfile_path:e.teamfilePath,name:e.name,raw_text:e.rawText,raw_sha256:ok(e.rawText),registered_at:t?.registered_at??e.now,last_seeded_at:e.now}}function ak(t,e){let r=ik(t.getRootTeam(e.teamfilePath),e);return t.upsertRootTeam(r),r}function OB(t,e,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(`
2348
2348
  `):"- (no non-Lead members)",o=r.find(a=>a.alias.toLowerCase()==="lead")?.provider??"",i=CB(o,t);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: ${t}`,"You are alias Lead for this AI-managed .lmctl team.","","Delegating work:",`- Blocking command shape: lmctl chat "${t}" <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.",i,"","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="${t}", 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 "${t}" <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 "${t}" <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 "${t}" <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",e.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(`
2349
- `)}function CB(t,e){let r=`lmctl chat "${e}" <alias> "your task here"`;switch(t.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 MB(t){let e=new Map;for(let r=0;r<t.length;r+=1){let n=t[r];if(!/^\s*_MEMBER_\s+\S/.test(n))continue;let s=to(n,"alias");s!==void 0&&e.set(s.toLowerCase(),r)}return e}function DB(t,e){let r=e.toLowerCase();for(let n=0;n<t.length;n+=1){let s=t[n];if(/^\s*_MEMBER_\s+\S/u.test(s)&&to(s,"alias")?.toLowerCase()===r)return n}}function PB(t,e){for(let r of t.split(`
2350
- `))if(/^\s*#?\s*_MEMBER_\s+\S/u.test(r)&&to(r,"alias")===e)return!0;return!1}function FB(t){return/^[A-Za-z][A-Za-z0-9_-]*$/u.test(t)}function to(t,e){let n=new RegExp(`(?:^|\\s)${e}=(?:"([^"]*)"|(\\S*))`).exec(t);return n===null?void 0:n[1]??n[2]??""}function UB(t,e,r){let n=`${e}=${Bf(r)}`,s=new RegExp(`(^|\\s)${e}=(?:"[^"]*"|\\S*)`);return s.test(t)?t.replace(s,(o,i)=>`${i}${n}`):`${t.trimEnd()} ${n}`}function lk(t,e){let r=new RegExp(`(^|\\s)${e}=(?:"[^"]*"|\\S*)`);return t.replace(r,"").replace(/\s+/gu," ").trimEnd()}function Bf(t){return/[\s"]/u.test(t)?`"${t.replace(/"/g,'\\"')}"`:t}function WB(t,e){let r=t.split(`
2349
+ `)}function CB(t,e){let r=`lmctl chat "${e}" <alias> "your task here"`;switch(t.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 MB(t){let e=new Map;for(let r=0;r<t.length;r+=1){let n=t[r];if(!/^\s*_MEMBER_\s+\S/.test(n))continue;let s=ro(n,"alias");s!==void 0&&e.set(s.toLowerCase(),r)}return e}function DB(t,e){let r=e.toLowerCase();for(let n=0;n<t.length;n+=1){let s=t[n];if(/^\s*_MEMBER_\s+\S/u.test(s)&&ro(s,"alias")?.toLowerCase()===r)return n}}function PB(t,e){for(let r of t.split(`
2350
+ `))if(/^\s*#?\s*_MEMBER_\s+\S/u.test(r)&&ro(r,"alias")===e)return!0;return!1}function FB(t){return/^[A-Za-z][A-Za-z0-9_-]*$/u.test(t)}function ro(t,e){let n=new RegExp(`(?:^|\\s)${e}=(?:"([^"]*)"|(\\S*))`).exec(t);return n===null?void 0:n[1]??n[2]??""}function UB(t,e,r){let n=`${e}=${Bf(r)}`,s=new RegExp(`(^|\\s)${e}=(?:"[^"]*"|\\S*)`);return s.test(t)?t.replace(s,(o,i)=>`${i}${n}`):`${t.trimEnd()} ${n}`}function lk(t,e){let r=new RegExp(`(^|\\s)${e}=(?:"[^"]*"|\\S*)`);return t.replace(r,"").replace(/\s+/gu," ").trimEnd()}function Bf(t){return/[\s"]/u.test(t)?`"${t.replace(/"/g,'\\"')}"`:t}function WB(t,e){let r=t.split(`
2351
2351
  `),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,e),r.join(`
2352
2352
  `);let s=r.length;for(;s>0&&r[s-1]==="";)s-=1;let o=r.slice(0,s).join(`
2353
2353
  `),i=r.slice(s).join(`
@@ -2360,11 +2360,11 @@ ${i}`:`
2360
2360
  ${o}`:`${r}
2361
2361
  `:t.length>0?`${r}
2362
2362
  ${t}`:`${r}
2363
- `}function ck(t){return t==="claude"||t==="codex"||t==="gemini"||t==="copilot"||t==="opencode"||t==="lmplayer"||t==="qwen"||t==="agy"||t==="ClaudeMock"}function Le(t,e){return t.stderr.write(`error: ${e}
2363
+ `}function ck(t){return t==="claude"||t==="codex"||t==="gemini"||t==="copilot"||t==="opencode"||t==="lmplayer"||t==="qwen"||t==="agy"||t==="ClaudeMock"}function je(t,e){return t.stderr.write(`error: ${e}
2364
2364
  `),1}function Ff(t,e,r){return t.stderr.write(`error: ${e}
2365
2365
  ${r}`),2}function Hf(t,e){for(let r of t)r.teamfile!==void 0&&e.stderr.write(`warning: member "${r.alias}" uses deprecated member-level teamfile=; cross-team calls now work at runtime without _CONNECT_
2366
2366
  `),r.provider==="gemini"&&e.stderr.write(`${tk.replace("%s",r.alias)}
2367
- `)}var eo,TB,bB,tl,Pf,tk,Wf,rk,Br,no=T(()=>{"use strict";Yt();zS();Ao();lt();Te();zt();Zt();zt();Df();bs();eo=5,TB=`usage: lmctl lint <teamfile.lmctl>
2367
+ `)}var to,TB,bB,tl,Pf,tk,Wf,rk,Br,so=T(()=>{"use strict";Yt();zS();Ao();lt();Te();zt();Zt();zt();Df();Ss();to=5,TB=`usage: lmctl lint <teamfile.lmctl>
2368
2368
 
2369
2369
  Validate an lmctl teamfile and warn about stale or placeholder session ids.
2370
2370
  `,bB=`usage: lmctl seed <teamfile.lmctl>
@@ -2384,7 +2384,7 @@ Refreshing the Lead drops its chat history; it re-reads durable-memory/ on
2384
2384
  re-seed.
2385
2385
  A member cannot refresh its own running session; run the refresh from a
2386
2386
  meta-Lead or operator shell outside that sessiondir.
2387
- `,tk='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:wB,statSync:EB,accessSync:yB},rk=async t=>{let{seed:e}=await Promise.resolve().then(()=>(kt(),Dc)),r=await e(t);return r.success?{sessionId:r.sessionId}:{error:r.error??"provider seed failed"}},Br=Wf});var pk={};ae(pk,{runClone:()=>YB});import{existsSync as qf,mkdirSync as HB,readFileSync as qB,readdirSync as JB,statSync as fk,writeFileSync as XB}from"node:fs";import{basename as uk,dirname as GB,extname as KB,join as mk,resolve as dk}from"node:path";async function YB(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(VB),0;if(t.length!==2)return e.stderr.write(`usage: lmctl clone <source> <dest>
2387
+ `,tk='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:wB,statSync:EB,accessSync:yB},rk=async t=>{let{seed:e}=await Promise.resolve().then(()=>(kt(),Dc)),r=await e(t);return r.success?{sessionId:r.sessionId}:{error:r.error??"provider seed failed"}},Br=Wf});var pk={};le(pk,{runClone:()=>YB});import{existsSync as qf,mkdirSync as HB,readFileSync as qB,readdirSync as JB,statSync as fk,writeFileSync as XB}from"node:fs";import{basename as uk,dirname as GB,extname as KB,join as mk,resolve as dk}from"node:path";async function YB(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(VB),0;if(t.length!==2)return e.stderr.write(`usage: lmctl clone <source> <dest>
2388
2388
  `),2;let[r,n]=t,s,o=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=dk(r);if(!qf(c))throw new Error(`source not found: ${r}`);let d=fk(c).isDirectory()?zB(c):c;s=qB(d,"utf8"),o=d}}catch(c){return e.stderr.write(`error: ${c instanceof Error?c.message:String(c)}
2389
2389
  `),1}let i=dk(n),a=ZB(i,o,n);if(qf(a))return e.stderr.write(`error: ${a} already exists.
2390
2390
  `),1;let l=e2(QB(s));return HB(GB(a),{recursive:!0}),XB(a,l,"utf8"),e.stdout.write(`Cloned ${r} -> ${a}
@@ -2401,7 +2401,7 @@ Copy a teamfile and strip its session ids, producing a static editable template.
2401
2401
 
2402
2402
  Examples:
2403
2403
  lmctl clone ./backend/backend.lmctl ./backend-v2/backend-v2.lmctl
2404
- `});var yk={};ae(yk,{runPlan:()=>a2});import{existsSync as t2,mkdirSync as r2,writeFileSync as n2}from"node:fs";import{basename as _k,extname as gk,join as s2,resolve as o2}from"node:path";async function a2(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(i2),0;let r=D(t,["--team","--provider"],[]);if(r.error!==void 0)return e.stderr.write(`error: ${r.error}
2404
+ `});var yk={};le(yk,{runPlan:()=>a2});import{existsSync as t2,mkdirSync as r2,writeFileSync as n2}from"node:fs";import{basename as _k,extname as gk,join as s2,resolve as o2}from"node:path";async function a2(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(i2),0;let r=D(t,["--team","--provider"],[]);if(r.error!==void 0)return e.stderr.write(`error: ${r.error}
2405
2405
  `),e.stderr.write(`usage: lmctl plan [options] <directory>
2406
2406
  `),2;if(r.positionals.length!==1)return e.stderr.write(`usage: lmctl plan [options] <directory>
2407
2407
  `),2;let n=o2(r.positionals[0]);r2(n,{recursive:!0});let s=A(r,"--team")??_k(n),o=A(r,"--provider")??"claude",i=s2(n,l2(s));if(t2(i))return e.stderr.write(`error: ${i} already exists.
@@ -2436,7 +2436,7 @@ Examples:
2436
2436
 
2437
2437
  # Same shape, codex for the Lead and Reviewer2
2438
2438
  lmctl plan ./backend --provider codex
2439
- `});var bk={};ae(bk,{SIZE_WARN_EST_TOKENS:()=>so,estimateTokens:()=>Tk,runTerminal:()=>p2});import{spawn as d2}from"node:child_process";import{statSync as f2}from"node:fs";async function p2(t,e){if(t.includes("--help")||t.includes("-h"))return w2(e);let r=D(t,["--project","--team","--alias","--run"],["--size","--json","--help"]);if(r.error!==void 0)return y(e,r.error);let n=A(r,"--run");if(n!==void 0){let s=Number.parseInt(n,10);if(!Number.isFinite(s)||s<=0||String(s)!==n)return y(e,`invalid --run "${n}" (expected a positive integer run id)`);if(r.positionals.length>0)return y(e,"--run is mutually exclusive with positional <teamfile>[:alias]");let o=["--team","--project","--size","--json"];for(let i of o)if(i==="--size"||i==="--json"?C(r,i):A(r,i)!==void 0)return y(e,`--run is mutually exclusive with ${i}`);try{return await L(e,async i=>{let a=A(r,"--alias"),l=mE(i,s,a);return"err"in l?y(e,l.err):Jf(e,{provider:l.ok.provider,sessionid:l.ok.sessionid,sessiondir:l.ok.sessiondir})})}catch(i){return he(e,i)}}if(r.positionals.length>0){let s=["--team","--project","--size","--alias","--json"];for(let l of s)if(l==="--size"||l==="--json"?C(r,l):A(r,l)!==void 0)return y(e,`positional <teamfile>[:alias] is mutually exclusive with ${l} (alias is the SECOND POSITIONAL: \`terminal <teamfile> <alias>\`).`);if(r.positionals.length>2)return y(e,`too many positionals (${r.positionals.length}); expected <teamfile>[:alias] [alias]`);let o=r.positionals[0],i=r.positionals[1],a=yr(m2,{target:o,alias:i,flags:{}});return a.mode==="error"?y(e,a.message):a.mode!=="ai-team"?y(e,`internal: terminal positional yielded unexpected mode "${a.mode}"`):a.alias===void 0?y(e,"terminal: alias required for the teamfile target"):await L(e,l=>h2(e,a.teamfile,a.alias,l))}try{return await L(e,async s=>{let o=_2(e,s,r);if(typeof o=="number")return o;let i=A(r,"--alias");return C(r,"--size")?y2(e,s,o,i,C(r,"--json")):g2(e,s,o,i)})}catch(s){return he(e,s)}}async function h2(t,e,r,n){let s;try{s=ot(e,r,n)}catch(l){return l instanceof Ee?y(t,l.message):he(t,l)}let o=Ln(n,{receiver_teamfile:s.teamfile,receiver_alias:s.alias,sender_teamfile:s.teamfile,sender_alias:"terminal",ttlMs:Mn()});if(!o.acquired)return y(t,`${s.alias} is busy/held by ${o.current.sender_alias} (${o.current.sender_teamfile}) since ${o.current.started_at}`);let i=Mb({teamfile:s.teamfile,alias:s.alias}),a=null;try{n.setTerminalLock(i),a=setInterval(()=>{try{!n.heartbeatTerminalLock(i.teamfile,i.alias,i.lock_id,new Date().toISOString())&&a!==null&&(clearInterval(a),a=null)}catch{}},Db()),a.unref?.();try{mn(t,Pe(s.teamfile),s.teamfile)}catch{}return await Jf(t,{provider:s.provider,sessionid:s.sessionid,sessiondir:s.sessiondir,isLead:s.isLead})}finally{a!==null&&clearInterval(a),n.clearTerminalLock(i.teamfile,i.alias,i.lock_id),n.releaseAgentInflight(o.lease)}}async function Jf(t,e){let{provider:r,sessionid:n,sessiondir:s}=e;if(!mi(r))return y(t,`no resume incantation for provider "${r}"`);if(!g_.test(n))return y(t,"refusing to resume: malformed sessionid");let o=ou(r,n,{isLead:e.isLead});if(o===null||o.length===0)return y(t,`no resume incantation for provider "${r}"`);let[i,...a]=o;return await new Promise(l=>{let c=d2(i,a,{stdio:"inherit",cwd:s,env:Be(process.env,s,n)});c.on("error",u=>{l(y(t,`failed to launch ${i}: ${u.message}`))}),c.on("exit",u=>l(u??0))})}function _2(t,e,r){let n=A(r,"--team");if(n!==void 0){let i=e.findTeamByName(n);return i===null?y(t,`team not found: ${n}`):i}let s=xi(t,e,A(r,"--project"));return typeof s=="number"?s:Ai(t,e,s,void 0)}async function g2(t,e,r,n){let s=Ri(t,e,r,n);if(typeof s=="number")return s;let o=s.sessionid;return o===null||o.trim().length===0?y(t,`member ${s.alias} has no session yet \u2014 run \`lmctl team seed ${r.name}\` first`):Jf(t,{provider:Ae(s),sessionid:o,sessiondir:s.sessiondir})}function Tk(t){if(t&&Array.isArray(t.messages)&&t.messages.length>0){let r=t.messages.reduce((n,s)=>n+(s.content?.length??0),0);return{chars:r,est:Math.ceil(r/4),messages:t.messages.length,bytes:null}}let e=t?.filePath;if(e!==void 0)try{let r=f2(e).size;return{chars:r,est:Math.ceil(r/4),messages:t?.messages?.length??null,bytes:r}}catch{}return{chars:0,est:0,messages:null,bytes:null}}async function y2(t,e,r,n,s){let o;if(n!==void 0){let a=e.findTeamMemberByAlias(r.id,n);if(a===null||a.state==="retired")return y(t,`member not found: ${n}`);o=[a]}else o=e.listTeamMembers(r.id).filter(a=>a.state!=="retired"&&a.sessionid!==null);let i=[];for(let a of o){let l=a.sessionid;if(l===null)continue;let c=Ae(a),u=null;mi(c)&&(u=await Ht(l,c));let d=Tk(u),f=d.est>so;i.push({alias:a.alias,provider:c,sessionid:l,messages:d.messages,bytes:d.bytes,est_tokens:d.est,estimate:!0,over_guide:f,resume_incantation:f?ln(c,l):null})}if(s)return U(t,{estimate:!0,legend:Ek,guide_tokens:so,members:i}),0;t.stdout.write(`session size \u2014 ESTIMATE only (nothing is changed automatically)
2439
+ `});var bk={};le(bk,{SIZE_WARN_EST_TOKENS:()=>oo,estimateTokens:()=>Tk,runTerminal:()=>p2});import{spawn as d2}from"node:child_process";import{statSync as f2}from"node:fs";async function p2(t,e){if(t.includes("--help")||t.includes("-h"))return T2(e);let r=D(t,["--project","--team","--alias","--run"],["--size","--json","--help"]);if(r.error!==void 0)return y(e,r.error);let n=A(r,"--run");if(n!==void 0){let s=Number.parseInt(n,10);if(!Number.isFinite(s)||s<=0||String(s)!==n)return y(e,`invalid --run "${n}" (expected a positive integer run id)`);if(r.positionals.length>0)return y(e,"--run is mutually exclusive with positional <teamfile>[:alias]");let o=["--team","--project","--size","--json"];for(let i of o)if(i==="--size"||i==="--json"?C(r,i):A(r,i)!==void 0)return y(e,`--run is mutually exclusive with ${i}`);try{return await j(e,async i=>{let a=A(r,"--alias"),l=mE(i,s,a);return"err"in l?y(e,l.err):Jf(e,{provider:l.ok.provider,sessionid:l.ok.sessionid,sessiondir:l.ok.sessiondir})})}catch(i){return he(e,i)}}if(r.positionals.length>0){let s=["--team","--project","--size","--alias","--json"];for(let l of s)if(l==="--size"||l==="--json"?C(r,l):A(r,l)!==void 0)return y(e,`positional <teamfile>[:alias] is mutually exclusive with ${l} (alias is the SECOND POSITIONAL: \`terminal <teamfile> <alias>\`).`);if(r.positionals.length>2)return y(e,`too many positionals (${r.positionals.length}); expected <teamfile>[:alias] [alias]`);let o=r.positionals[0],i=r.positionals[1],a=yr(m2,{target:o,alias:i,flags:{}});return a.mode==="error"?y(e,a.message):a.mode!=="ai-team"?y(e,`internal: terminal positional yielded unexpected mode "${a.mode}"`):a.alias===void 0?y(e,"terminal: alias required for the teamfile target"):await j(e,l=>h2(e,a.teamfile,a.alias,l))}try{return await j(e,async s=>{let o=y2(e,s,r);if(typeof o=="number")return o;let i=A(r,"--alias");return C(r,"--size")?E2(e,s,o,i,C(r,"--json")):w2(e,s,o,i)})}catch(s){return he(e,s)}}async function h2(t,e,r,n){let s;try{s=ot(e,r,n)}catch(u){return u instanceof Ee?y(t,u.message):he(t,u)}let o=jn(n,{receiver_teamfile:s.teamfile,receiver_alias:s.alias,sender_teamfile:s.teamfile,sender_alias:"terminal",ttlMs:Mn()});if(!o.acquired)return y(t,`${s.alias} is busy/held by ${o.current.sender_alias} (${o.current.sender_teamfile}) since ${o.current.started_at}`);let i=Mb({teamfile:s.teamfile,alias:s.alias}),a=null,l=null,c=null;try{n.setTerminalLock(i),l=_2(n,s),a=setInterval(()=>{try{!n.heartbeatTerminalLock(i.teamfile,i.alias,i.lock_id,new Date().toISOString())&&a!==null&&(clearInterval(a),a=null)}catch{}},Db()),a.unref?.();try{mn(t,Pe(s.teamfile),s.teamfile)}catch{}return c=await Jf(t,{provider:s.provider,sessionid:s.sessionid,sessiondir:s.sessiondir,isLead:s.isLead}),c}finally{a!==null&&clearInterval(a),n.clearTerminalLock(i.teamfile,i.alias,i.lock_id),n.releaseAgentInflight(o.lease),g2(n,l,c)}}function _2(t,e){try{return t.startTrackedInvocation({kind:"exec",origin:"operator",scope_teamfile:e.teamfile,from_identity:`${e.teamfile}:terminal`,target_teamfile:e.teamfile,target_alias:e.alias,root_teamfile:e.teamfile,cwd:e.sessiondir,command:`lmctl terminal ${e.teamfile} ${e.alias}`,holder_pid:process.pid,launch_source:"terminal",meta:JSON.stringify({provider:e.provider,sessionid:e.sessionid})}).id}catch{return null}}function g2(t,e,r){if(e!==null)try{t.finishTrackedInvocation(e,{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 Jf(t,e){let{provider:r,sessionid:n,sessiondir:s}=e;if(!mi(r))return y(t,`no resume incantation for provider "${r}"`);if(!g_.test(n))return y(t,"refusing to resume: malformed sessionid");let o=ou(r,n,{isLead:e.isLead});if(o===null||o.length===0)return y(t,`no resume incantation for provider "${r}"`);let[i,...a]=o;return await new Promise(l=>{let c=d2(i,a,{stdio:"inherit",cwd:s,env:Be(process.env,s,n)});c.on("error",u=>{l(y(t,`failed to launch ${i}: ${u.message}`))}),c.on("exit",u=>l(u??0))})}function y2(t,e,r){let n=A(r,"--team");if(n!==void 0){let i=e.findTeamByName(n);return i===null?y(t,`team not found: ${n}`):i}let s=xi(t,e,A(r,"--project"));return typeof s=="number"?s:Ai(t,e,s,void 0)}async function w2(t,e,r,n){let s=Ri(t,e,r,n);if(typeof s=="number")return s;let o=s.sessionid;return o===null||o.trim().length===0?y(t,`member ${s.alias} has no session yet \u2014 run \`lmctl team seed ${r.name}\` first`):Jf(t,{provider:Ae(s),sessionid:o,sessiondir:s.sessiondir})}function Tk(t){if(t&&Array.isArray(t.messages)&&t.messages.length>0){let r=t.messages.reduce((n,s)=>n+(s.content?.length??0),0);return{chars:r,est:Math.ceil(r/4),messages:t.messages.length,bytes:null}}let e=t?.filePath;if(e!==void 0)try{let r=f2(e).size;return{chars:r,est:Math.ceil(r/4),messages:t?.messages?.length??null,bytes:r}}catch{}return{chars:0,est:0,messages:null,bytes:null}}async function E2(t,e,r,n,s){let o;if(n!==void 0){let a=e.findTeamMemberByAlias(r.id,n);if(a===null||a.state==="retired")return y(t,`member not found: ${n}`);o=[a]}else o=e.listTeamMembers(r.id).filter(a=>a.state!=="retired"&&a.sessionid!==null);let i=[];for(let a of o){let l=a.sessionid;if(l===null)continue;let c=Ae(a),u=null;mi(c)&&(u=await Ht(l,c));let d=Tk(u),f=d.est>oo;i.push({alias:a.alias,provider:c,sessionid:l,messages:d.messages,bytes:d.bytes,est_tokens:d.est,estimate:!0,over_guide:f,resume_incantation:f?ln(c,l):null})}if(s)return U(t,{estimate:!0,legend:Ek,guide_tokens:oo,members:i}),0;t.stdout.write(`session size \u2014 ESTIMATE only (nothing is changed automatically)
2440
2440
  `),t.stdout.write(`${Ek}
2441
2441
  `);for(let a of i){let l=a.messages===null?"?":String(a.messages),c=a.bytes===null?"?":String(a.bytes);t.stdout.write(`${a.alias} ${a.provider} msgs=${l} bytes=${c} ~${a.est_tokens} tok (rough estimate)
2442
2442
  `),a.over_guide&&t.stdout.write(` \u26A0 ${a.alias}: estimated ~${a.est_tokens} tokens \u2014 ESTIMATE only, exceeds the 200K guide.
@@ -2444,7 +2444,7 @@ Examples:
2444
2444
  session yourself:
2445
2445
  ${a.resume_incantation??"(no resume incantation for provider "+a.provider+")"}
2446
2446
  (or: lmctl terminal --team ${r.name} --alias ${a.alias})
2447
- `)}return 0}function w2(t){return t.stdout.write(`usage: lmctl terminal <teamfile>:<alias>
2447
+ `)}return 0}function T2(t){return t.stdout.write(`usage: lmctl terminal <teamfile>:<alias>
2448
2448
  lmctl terminal <teamfile> <alias>
2449
2449
  lmctl terminal --run <id> [--alias A]
2450
2450
  lmctl terminal [--project P] [--team T] [--alias A] [--size] [--json]
@@ -2471,59 +2471,59 @@ Examples:
2471
2471
  exact provider count: the messages path slightly
2472
2472
  under-counts code-dense text; the byte fallback
2473
2473
  over-counts (JSONL overhead \u2192 safe over-warn); CJK is
2474
- denser (under-warns). At >${so} est
2474
+ denser (under-warns). At >${oo} est
2475
2475
  tokens it surfaces the resume incantation so YOU can
2476
2476
  open & self-compact. Nothing is ever changed
2477
- automatically; ${so} is a guide, not a gate.
2478
- `),0}var m2,so,Ek,Sk=T(()=>{"use strict";Ue();Lr();Te();wu();Zt();Yt();lt();bs();Ca();hf();yf();ba();m2={name:"terminal",allowsBareTeamfile:!1,supportsRaw:!1},so=2e5,Ek="est = rough local heuristic (~4 chars/token), NOT an exact provider token count \u2014 open the session to verify before acting."});import{resolve as Xf,dirname as Nk}from"node:path";function Gf(t,e){let r=Xf(t);for(;;){let n=E2(e,r);if(n!==null)return n;let s=Nk(r);if(s===r)return null;r=s}}function E2(t,e){return t.db.prepare("SELECT * FROM project WHERE local_path = ? LIMIT 1").get(e)??null}function sl(){return process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0}function ol(){return process.env.LMCTL_WORKSPACE!==void 0&&process.env.LMCTL_WORKSPACE.length>0}function Kf(t){if(t.io.dal!==void 0){let o=kk(t.io.dal,t.cwd,t.projectName);if(o===null)throw new it(vk(t.projectName));return{dal:t.io.dal,ownsDal:!1,dbPath:":injected:",workspaceName:null,project:o,matchedLocalPath:t.projectName===void 0?o.local_path:null,resolverMode:"injected"}}if(sl()||ol()){let o=de(),i=_e({path:o}),a=kk(i,t.cwd,t.projectName);if(a===null)throw i.close(),new it(vk(t.projectName));return{dal:i,ownsDal:!0,dbPath:o,workspaceName:ol()?process.env.LMCTL_WORKSPACE??null:null,project:a,matchedLocalPath:t.projectName===void 0?a.local_path:null,resolverMode:sl()?"explicit-db":"explicit-workspace"}}let e=t.projectName===void 0?Ak(t.cwd):T2(t.projectName),r=Rk(e,t.projectName===void 0?"cwd":"project"),n=_e({path:r.candidate.db_path}),s=n.getProject(r.project.id);if(s===null)throw n.close(),new it(`resolved project disappeared from workspace DB: ${r.project.name}`);return{dal:n,ownsDal:!0,dbPath:r.candidate.db_path,workspaceName:r.candidate.workspace_name,project:s,matchedLocalPath:r.matched_local_path,resolverMode:t.projectName===void 0?"cwd-scan":"project-scan"}}function xk(t){if(t.io.dal!==void 0)return{dal:t.io.dal,ownsDal:!1,dbPath:":injected:",workspaceName:null,resolverMode:"injected"};if(sl()||ol()){let n=de();return{dal:_e({path:n}),ownsDal:!0,dbPath:n,workspaceName:ol()?process.env.LMCTL_WORKSPACE??null:null,resolverMode:sl()?"explicit-db":"explicit-workspace"}}let e;try{e=Ak(t.cwd)}catch{throw new it("job ids are workspace-local and cwd does not resolve to a workspace DB; use --workspace <name> or --db <path>")}let r=Rk(e,"job-cwd");return{dal:_e({path:r.candidate.db_path}),ownsDal:!0,dbPath:r.candidate.db_path,workspaceName:r.candidate.workspace_name,resolverMode:"cwd-scan"}}function kk(t,e,r){return r!==void 0?t.findProjectByName(r):Gf(e,t)}function vk(t){return t!==void 0?`project not found: ${t}`:"no lmctl project found for cwd; pass --project or run from inside a registered project"}function T2(t){let e=[];for(let r of ml())for(let n of $k(r))n.name===t&&e.push({candidate:r,project:n,matched_local_path:null,match_depth:0});if(e.length===0)throw new it(`project not found in any workspace DB: ${t}`);return e}function Ak(t){let e=b2(t),r=new Map;e.forEach((s,o)=>{r.set(s,e.length-o)});let n=[];for(let s of ml())for(let o of $k(s)){let i=Xf(o.local_path),a=r.get(i);a!==void 0&&n.push({candidate:s,project:o,matched_local_path:i,match_depth:a})}if(n.length===0)throw new it("no lmctl project found for cwd in workspace DBs; pass --workspace and --project");return n}function Rk(t,e){let r=Math.max(...t.map(s=>s.match_depth)),n=t.filter(s=>s.match_depth===r);if(n.length===1)return n[0];throw e==="job-cwd"?new it(`job ids are workspace-local and cwd resolves ambiguously; use --workspace <name> or --db <path>
2477
+ automatically; ${oo} is a guide, not a gate.
2478
+ `),0}var m2,oo,Ek,Sk=T(()=>{"use strict";Ue();jr();Te();wu();Zt();Yt();lt();Ss();Ca();hf();yf();ba();m2={name:"terminal",allowsBareTeamfile:!1,supportsRaw:!1},oo=2e5,Ek="est = rough local heuristic (~4 chars/token), NOT an exact provider token count \u2014 open the session to verify before acting."});import{resolve as Xf,dirname as Nk}from"node:path";function Gf(t,e){let r=Xf(t);for(;;){let n=b2(e,r);if(n!==null)return n;let s=Nk(r);if(s===r)return null;r=s}}function b2(t,e){return t.db.prepare("SELECT * FROM project WHERE local_path = ? LIMIT 1").get(e)??null}function sl(){return process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0}function ol(){return process.env.LMCTL_WORKSPACE!==void 0&&process.env.LMCTL_WORKSPACE.length>0}function Kf(t){if(t.io.dal!==void 0){let o=kk(t.io.dal,t.cwd,t.projectName);if(o===null)throw new it(vk(t.projectName));return{dal:t.io.dal,ownsDal:!1,dbPath:":injected:",workspaceName:null,project:o,matchedLocalPath:t.projectName===void 0?o.local_path:null,resolverMode:"injected"}}if(sl()||ol()){let o=de(),i=_e({path:o}),a=kk(i,t.cwd,t.projectName);if(a===null)throw i.close(),new it(vk(t.projectName));return{dal:i,ownsDal:!0,dbPath:o,workspaceName:ol()?process.env.LMCTL_WORKSPACE??null:null,project:a,matchedLocalPath:t.projectName===void 0?a.local_path:null,resolverMode:sl()?"explicit-db":"explicit-workspace"}}let e=t.projectName===void 0?Ak(t.cwd):S2(t.projectName),r=Rk(e,t.projectName===void 0?"cwd":"project"),n=_e({path:r.candidate.db_path}),s=n.getProject(r.project.id);if(s===null)throw n.close(),new it(`resolved project disappeared from workspace DB: ${r.project.name}`);return{dal:n,ownsDal:!0,dbPath:r.candidate.db_path,workspaceName:r.candidate.workspace_name,project:s,matchedLocalPath:r.matched_local_path,resolverMode:t.projectName===void 0?"cwd-scan":"project-scan"}}function xk(t){if(t.io.dal!==void 0)return{dal:t.io.dal,ownsDal:!1,dbPath:":injected:",workspaceName:null,resolverMode:"injected"};if(sl()||ol()){let n=de();return{dal:_e({path:n}),ownsDal:!0,dbPath:n,workspaceName:ol()?process.env.LMCTL_WORKSPACE??null:null,resolverMode:sl()?"explicit-db":"explicit-workspace"}}let e;try{e=Ak(t.cwd)}catch{throw new it("job ids are workspace-local and cwd does not resolve to a workspace DB; use --workspace <name> or --db <path>")}let r=Rk(e,"job-cwd");return{dal:_e({path:r.candidate.db_path}),ownsDal:!0,dbPath:r.candidate.db_path,workspaceName:r.candidate.workspace_name,resolverMode:"cwd-scan"}}function kk(t,e,r){return r!==void 0?t.findProjectByName(r):Gf(e,t)}function vk(t){return t!==void 0?`project not found: ${t}`:"no lmctl project found for cwd; pass --project or run from inside a registered project"}function S2(t){let e=[];for(let r of ml())for(let n of $k(r))n.name===t&&e.push({candidate:r,project:n,matched_local_path:null,match_depth:0});if(e.length===0)throw new it(`project not found in any workspace DB: ${t}`);return e}function Ak(t){let e=k2(t),r=new Map;e.forEach((s,o)=>{r.set(s,e.length-o)});let n=[];for(let s of ml())for(let o of $k(s)){let i=Xf(o.local_path),a=r.get(i);a!==void 0&&n.push({candidate:s,project:o,matched_local_path:i,match_depth:a})}if(n.length===0)throw new it("no lmctl project found for cwd in workspace DBs; pass --workspace and --project");return n}function Rk(t,e){let r=Math.max(...t.map(s=>s.match_depth)),n=t.filter(s=>s.match_depth===r);if(n.length===1)return n[0];throw e==="job-cwd"?new it(`job ids are workspace-local and cwd resolves ambiguously; use --workspace <name> or --db <path>
2479
2479
  ${Ik(n)}`):new it(`ambiguous lmctl ${e} match; use --workspace <name> --project <name>
2480
2480
  ${Ik(n)}`)}function Ik(t){return t.map(e=>` workspace ${e.candidate.workspace_name??"(legacy)"} project ${e.project.name} ${e.project.local_path}`).join(`
2481
- `)}function b2(t){let e=[],r=Xf(t);for(;;){e.push(r);let n=Nk(r);if(n===r)return e;r=n}}function $k(t){let e=null;try{e=new po(t.db_path,{readonly:!0,fileMustExist:!0});let r=Number(e.pragma("user_version",{simple:!0})??0);if(!Number.isInteger(r)||r<=0||r>Al)return[];let n=e.prepare("PRAGMA table_info(project)").all(),s=new Set(n.map(o=>o.name));return!s.has("id")||!s.has("name")||!s.has("local_path")?[]:e.prepare("SELECT id, name, local_path FROM project").all()}catch{return[]}finally{e?.close()}}var it,Vf=T(()=>{"use strict";xl();$l();Ue();ze();it=class extends Error{constructor(e){super(e),this.name="CliContextError"}}});var tm={};ae(tm,{assertNoCrossWorkflowSubflowCycle:()=>Pk,firstUnregisteredArchetype:()=>em,runWorkflow:()=>M2});import{createHash as Zf,randomUUID as S2}from"node:crypto";import{existsSync as k2,readFileSync as ll,readdirSync as v2,writeFileSync as I2}from"node:fs";import{basename as N2,join as x2,resolve as A2}from"node:path";import{pathToFileURL as R2}from"node:url";function Qf(t,e){return{source_uri:R2(A2(t)).href,source_sha256:Zf("sha256").update(e).digest("hex")}}function Ok(t){return Zf("sha256").update(t).digest("hex")}async function O2(t){let e=await mo(t,{description:"remote workflow URL"});return{definition:e.toString("utf8"),source_uri:t,source_sha256:Ok(e),remote:!0}}async function al(t){if(ur(t)){let n=await Es(t),s=ll(n,"utf8");return{definition:s,source_uri:t,source_sha256:Ok(s),remote:!1}}let e=Kn(t,"remote workflow URLs");if(e!==null)throw new Error(e);if(Gn(t))return O2(t);let r=ll(t,"utf8");return{definition:r,...Qf(t,r),remote:!1}}function Ck(t){return Me(t.definition)}function Mk(t){if(t.definition_schema_version!==3)return null;let e=em(t);return e!==null?`unknown archetype \`${e.type}\` (step \`${e.id}\`) \u2014 not in the live archetype registry`:null}function C2(t){let e=new Set;if(t.definition_schema_version===3)for(let r of t.steps)e.add(r.type);else for(let r of Object.values(t.states))e.add(r.type);return Array.from(e).sort()}async function M2(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(L2),0;try{return r==="run"?await D2(n,e):await L(e,s=>{switch(r){case"load":return W2(n,e,s);case"author":return B2(n,e,s);case"list":return H2(n,e,s);case"sync":return q2(n,e,s);case"export":return J2(n,e,s);default:return y(e,"usage: lmctl workflow <load|author|list|sync|export|run>")}})}catch(s){return s instanceof it?y(e,s.message):he(e,s)}}async function D2(t,e){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(`${il}
2482
- `),0;let r=D(t,["--workflow","--project","--inputs","--job"],["--json","--verbose","--yes","--no-prompt"]);if(r.error!==void 0)return wr(e,r.error);if(r.positionals.length>1)return wr(e,il);let n=C(r,"--json"),s=A(r,"--workflow"),o=A(r,"--project"),i=A(r,"--job"),a=A(r,"--inputs"),l=C(r,"--verbose"),c=r.positionals[0],u=C(r,"--yes")||C(r,"--no-prompt");if(c!==void 0){if(s!==void 0||i!==void 0)return wr(e,"remote workflow URL cannot be combined with --workflow or --job");if(!El(c))return wr(e,il);if(ur(c))return jk(c,{io:e,json:n,projectName:o,inputsValue:a,verbose:l,yes:u});let m=Kn(c,"remote workflow URLs");return m!==null?y(e,m):jk(c,{io:e,json:n,projectName:o,inputsValue:a,verbose:l,yes:u})}if(s!==void 0&&i!==void 0)return wr(e,"--workflow and --job are mutually exclusive");if(s===void 0&&i===void 0)return wr(e,il);if(i!==void 0&&(o!==void 0||a!==void 0))return wr(e,"--job cannot be combined with --project or --inputs");if(i!==void 0){let m=P2(i);if(m===null)return wr(e,`invalid --job: ${i}`);let p=xk({cwd:process.cwd(),io:e});try{let h=await Ds({dal:p.dal,job_id:m,worker_id:Yf()});return zf(e,h,{json:n,workflowName:null,projectName:null,workspaceName:p.workspaceName,dbPath:p.dbPath,verbose:l})}finally{p.ownsDal&&p.dal.close()}}let d=Dk(a,e);if(d===cl)return 2;let f=Kf({cwd:process.cwd(),io:e,projectName:o});try{let m=f.dal.getWorkflowByName(s);if(m===null)return y(e,`workflow not found: ${s}`);let p=f.dal.enqueueJob({project_id:f.project.id,workflow_id_override:m.id,source:"cli-workflow-run",payload:JSON.stringify(d),priority:0}),h=await Ds({dal:f.dal,job_id:p.id,worker_id:Yf()});return zf(e,h,{json:n,workflowName:s,projectName:f.project.name,workspaceName:f.workspaceName,dbPath:f.dbPath,verbose:l})}finally{f.ownsDal&&f.dal.close()}}async function jk(t,e){let{io:r,json:n,projectName:s,inputsValue:o,verbose:i,yes:a}=e,l=Dk(o,r);if(l===cl)return 2;let c,u;try{c=await al(t),u=Ck(c)}catch(m){return y(r,m instanceof Error?m.message:String(m))}let d=Mk(u);if(d!==null)return y(r,d);if(c.remote&&!await F2(r,c,u,a))return 1;let f=Kf({cwd:process.cwd(),io:r,projectName:s});try{let m=f.dal.upsertWorkflow({name:u.name,definition_schema_version:u.definition_schema_version,definition:c.definition,source_uri:c.source_uri,source_sha256:c.source_sha256}),p=f.dal.enqueueJob({project_id:f.project.id,workflow_id_override:m.id,source:"cli-workflow-run",payload:JSON.stringify(l),priority:0}),h=await Ds({dal:f.dal,job_id:p.id,worker_id:Yf()});return zf(r,h,{json:n,workflowName:m.name,projectName:f.project.name,workspaceName:f.workspaceName,dbPath:f.dbPath,verbose:i})}finally{f.ownsDal&&f.dal.close()}}function wr(t,e){return t.stderr.write(`error: ${e}
2481
+ `)}function k2(t){let e=[],r=Xf(t);for(;;){e.push(r);let n=Nk(r);if(n===r)return e;r=n}}function $k(t){let e=null;try{e=new ho(t.db_path,{readonly:!0,fileMustExist:!0});let r=Number(e.pragma("user_version",{simple:!0})??0);if(!Number.isInteger(r)||r<=0||r>Al)return[];let n=e.prepare("PRAGMA table_info(project)").all(),s=new Set(n.map(o=>o.name));return!s.has("id")||!s.has("name")||!s.has("local_path")?[]:e.prepare("SELECT id, name, local_path FROM project").all()}catch{return[]}finally{e?.close()}}var it,Vf=T(()=>{"use strict";xl();$l();Ue();ze();it=class extends Error{constructor(e){super(e),this.name="CliContextError"}}});var tm={};le(tm,{assertNoCrossWorkflowSubflowCycle:()=>Pk,firstUnregisteredArchetype:()=>em,runWorkflow:()=>P2});import{createHash as Zf,randomUUID as v2}from"node:crypto";import{existsSync as I2,readFileSync as ll,readdirSync as N2,writeFileSync as x2}from"node:fs";import{basename as A2,join as R2,resolve as $2}from"node:path";import{pathToFileURL as L2}from"node:url";function Qf(t,e){return{source_uri:L2($2(t)).href,source_sha256:Zf("sha256").update(e).digest("hex")}}function Ok(t){return Zf("sha256").update(t).digest("hex")}async function M2(t){let e=await po(t,{description:"remote workflow URL"});return{definition:e.toString("utf8"),source_uri:t,source_sha256:Ok(e),remote:!0}}async function al(t){if(ur(t)){let n=await Ts(t),s=ll(n,"utf8");return{definition:s,source_uri:t,source_sha256:Ok(s),remote:!1}}let e=Kn(t,"remote workflow URLs");if(e!==null)throw new Error(e);if(Gn(t))return M2(t);let r=ll(t,"utf8");return{definition:r,...Qf(t,r),remote:!1}}function Ck(t){return Me(t.definition)}function Mk(t){if(t.definition_schema_version!==3)return null;let e=em(t);return e!==null?`unknown archetype \`${e.type}\` (step \`${e.id}\`) \u2014 not in the live archetype registry`:null}function D2(t){let e=new Set;if(t.definition_schema_version===3)for(let r of t.steps)e.add(r.type);else for(let r of Object.values(t.states))e.add(r.type);return Array.from(e).sort()}async function P2(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(C2),0;try{return r==="run"?await F2(n,e):await j(e,s=>{switch(r){case"load":return H2(n,e,s);case"author":return q2(n,e,s);case"list":return J2(n,e,s);case"sync":return X2(n,e,s);case"export":return G2(n,e,s);default:return y(e,"usage: lmctl workflow <load|author|list|sync|export|run>")}})}catch(s){return s instanceof it?y(e,s.message):he(e,s)}}async function F2(t,e){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(`${il}
2482
+ `),0;let r=D(t,["--workflow","--project","--inputs","--job"],["--json","--verbose","--yes","--no-prompt"]);if(r.error!==void 0)return wr(e,r.error);if(r.positionals.length>1)return wr(e,il);let n=C(r,"--json"),s=A(r,"--workflow"),o=A(r,"--project"),i=A(r,"--job"),a=A(r,"--inputs"),l=C(r,"--verbose"),c=r.positionals[0],u=C(r,"--yes")||C(r,"--no-prompt");if(c!==void 0){if(s!==void 0||i!==void 0)return wr(e,"remote workflow URL cannot be combined with --workflow or --job");if(!El(c))return wr(e,il);if(ur(c))return Lk(c,{io:e,json:n,projectName:o,inputsValue:a,verbose:l,yes:u});let m=Kn(c,"remote workflow URLs");return m!==null?y(e,m):Lk(c,{io:e,json:n,projectName:o,inputsValue:a,verbose:l,yes:u})}if(s!==void 0&&i!==void 0)return wr(e,"--workflow and --job are mutually exclusive");if(s===void 0&&i===void 0)return wr(e,il);if(i!==void 0&&(o!==void 0||a!==void 0))return wr(e,"--job cannot be combined with --project or --inputs");if(i!==void 0){let m=U2(i);if(m===null)return wr(e,`invalid --job: ${i}`);let p=xk({cwd:process.cwd(),io:e});try{let h=await Ps({dal:p.dal,job_id:m,worker_id:Yf()});return zf(e,h,{json:n,workflowName:null,projectName:null,workspaceName:p.workspaceName,dbPath:p.dbPath,verbose:l})}finally{p.ownsDal&&p.dal.close()}}let d=Dk(a,e);if(d===cl)return 2;let f=Kf({cwd:process.cwd(),io:e,projectName:o});try{let m=f.dal.getWorkflowByName(s);if(m===null)return y(e,`workflow not found: ${s}`);let p=f.dal.enqueueJob({project_id:f.project.id,workflow_id_override:m.id,source:"cli-workflow-run",payload:JSON.stringify(d),priority:0}),h=await Ps({dal:f.dal,job_id:p.id,worker_id:Yf()});return zf(e,h,{json:n,workflowName:s,projectName:f.project.name,workspaceName:f.workspaceName,dbPath:f.dbPath,verbose:l})}finally{f.ownsDal&&f.dal.close()}}async function Lk(t,e){let{io:r,json:n,projectName:s,inputsValue:o,verbose:i,yes:a}=e,l=Dk(o,r);if(l===cl)return 2;let c,u;try{c=await al(t),u=Ck(c)}catch(m){return y(r,m instanceof Error?m.message:String(m))}let d=Mk(u);if(d!==null)return y(r,d);if(c.remote&&!await W2(r,c,u,a))return 1;let f=Kf({cwd:process.cwd(),io:r,projectName:s});try{let m=f.dal.upsertWorkflow({name:u.name,definition_schema_version:u.definition_schema_version,definition:c.definition,source_uri:c.source_uri,source_sha256:c.source_sha256}),p=f.dal.enqueueJob({project_id:f.project.id,workflow_id_override:m.id,source:"cli-workflow-run",payload:JSON.stringify(l),priority:0}),h=await Ps({dal:f.dal,job_id:p.id,worker_id:Yf()});return zf(r,h,{json:n,workflowName:m.name,projectName:f.project.name,workspaceName:f.workspaceName,dbPath:f.dbPath,verbose:i})}finally{f.ownsDal&&f.dal.close()}}function wr(t,e){return t.stderr.write(`error: ${e}
2483
2483
  `),2}function Dk(t,e){if(t===void 0)return{};let r;try{r=JSON.parse(t)}catch(n){return e.stderr.write(`error: invalid --inputs JSON: ${n instanceof Error?n.message:String(n)}
2484
2484
  `),cl}return r===null||typeof r!="object"||Array.isArray(r)?(e.stderr.write(`error: --inputs must be a JSON object
2485
- `),cl):r}function P2(t){if(!/^[1-9][0-9]*$/.test(t))return null;let e=Number(t);return Number.isSafeInteger(e)?e:null}function Yf(){return`cli-${process.pid}-${S2().slice(0,8)}`}function zf(t,e,r){if(!e.claimed){let s={ok:!1,job_id:e.job_id,status:"not_claimed",reason:e.reason,job_status:e.status,locked_by:e.locked_by,locked_until:e.locked_until,...r.verbose?{db_path:r.dbPath,workspace:r.workspaceName}:{}};return r.json?U(t,s):t.stderr.write(`error: job ${e.job_id} not claimable: ${e.reason}${e.locked_by?` (locked_by=${e.locked_by})`:""}
2485
+ `),cl):r}function U2(t){if(!/^[1-9][0-9]*$/.test(t))return null;let e=Number(t);return Number.isSafeInteger(e)?e:null}function Yf(){return`cli-${process.pid}-${v2().slice(0,8)}`}function zf(t,e,r){if(!e.claimed){let s={ok:!1,job_id:e.job_id,status:"not_claimed",reason:e.reason,job_status:e.status,locked_by:e.locked_by,locked_until:e.locked_until,...r.verbose?{db_path:r.dbPath,workspace:r.workspaceName}:{}};return r.json?U(t,s):t.stderr.write(`error: job ${e.job_id} not claimable: ${e.reason}${e.locked_by?` (locked_by=${e.locked_by})`:""}
2486
2486
  `),1}let n={ok:e.status!=="failed",job_id:e.job_id,run_id:e.run_id,status:e.status,terminal_state:e.terminal_state,workflow:r.workflowName,project:r.projectName,workspace:r.workspaceName,ms:e.ms,...r.verbose?{db_path:r.dbPath}:{}};return r.json?U(t,n):e.status==="paused"?t.stdout.write(`workflow paused job=${e.job_id} run=${e.run_id}
2487
2487
  `):e.status==="failed"?t.stderr.write(`workflow failed job=${e.job_id}
2488
2488
  `):(t.stdout.write(`workflow completed job=${e.job_id} run=${e.run_id} terminal_state=${e.terminal_state??"null"}
2489
2489
  `),e.terminal_state!==null&&e.terminal_state!=="done"&&e.terminal_state!=="success"&&t.stderr.write(`warning: workflow terminal_state=${e.terminal_state}
2490
- `)),e.status==="failed"?1:0}async function F2(t,e,r,n){let s=C2(r);if(t.stderr.write(["remote workflow trust check:",` source: ${e.source_uri}`,` sha256: ${e.source_sha256}`,` workflow: ${r.name}@${r.version}`,` step archetypes: ${s.length>0?s.join(", "):"(none)"}`].join(`
2490
+ `)),e.status==="failed"?1:0}async function W2(t,e,r,n){let s=D2(r);if(t.stderr.write(["remote workflow trust check:",` source: ${e.source_uri}`,` sha256: ${e.source_sha256}`,` workflow: ${r.name}@${r.version}`,` step archetypes: ${s.length>0?s.join(", "):"(none)"}`].join(`
2491
2491
  `)+`
2492
- `),n)return!0;let o=t.stdin??process.stdin;if(o.isTTY!==!0)return!0;t.stderr.write("Run remote workflow? [y/N] ");let i=await U2(o),a=/^(y|yes)$/i.test(i.trim());return a||t.stderr.write(`aborted remote workflow run
2493
- `),a}function U2(t){return new Promise(e=>{t.setEncoding?.("utf8"),t.resume?.(),t.once("data",r=>{t.pause?.(),e(typeof r=="string"?r:r.toString("utf8"))})})}async function W2(t,e,r){let[n,s]=t;if(n===void 0||s===void 0)return y(e,"usage: workflow load <name> <path-to-json | lmctl://workflow/<name> | https://...>");let o;if(ur(s))try{o=await al(s)}catch(c){return y(e,c instanceof Error?c.message:String(c))}else if(Gn(s))try{o=await al(s)}catch(c){return y(e,c instanceof Error?c.message:String(c))}else{let c=Kn(s,"remote workflow URLs");if(c!==null)return y(e,c);o=await al(s)}let i;try{i=Ck(o)}catch(c){if(o.remote)return y(e,c instanceof Error?c.message:String(c));throw c}let a=o.remote?Mk(i):null;if(a!==null)return y(e,a);let l=r.upsertWorkflow({name:n,definition_schema_version:i.definition_schema_version,definition:o.definition,source_uri:o.source_uri,source_sha256:o.source_sha256});return e.stdout.write(`loaded workflow ${l.name}@${l.version}
2492
+ `),n)return!0;let o=t.stdin??process.stdin;if(o.isTTY!==!0)return!0;t.stderr.write("Run remote workflow? [y/N] ");let i=await B2(o),a=/^(y|yes)$/i.test(i.trim());return a||t.stderr.write(`aborted remote workflow run
2493
+ `),a}function B2(t){return new Promise(e=>{t.setEncoding?.("utf8"),t.resume?.(),t.once("data",r=>{t.pause?.(),e(typeof r=="string"?r:r.toString("utf8"))})})}async function H2(t,e,r){let[n,s]=t;if(n===void 0||s===void 0)return y(e,"usage: workflow load <name> <path-to-json | lmctl://workflow/<name> | https://...>");let o;if(ur(s))try{o=await al(s)}catch(c){return y(e,c instanceof Error?c.message:String(c))}else if(Gn(s))try{o=await al(s)}catch(c){return y(e,c instanceof Error?c.message:String(c))}else{let c=Kn(s,"remote workflow URLs");if(c!==null)return y(e,c);o=await al(s)}let i;try{i=Ck(o)}catch(c){if(o.remote)return y(e,c instanceof Error?c.message:String(c));throw c}let a=o.remote?Mk(i):null;if(a!==null)return y(e,a);let l=r.upsertWorkflow({name:n,definition_schema_version:i.definition_schema_version,definition:o.definition,source_uri:o.source_uri,source_sha256:o.source_sha256});return e.stdout.write(`loaded workflow ${l.name}@${l.version}
2494
2494
  `),o.remote&&e.stdout.write(`source: ${o.source_uri}
2495
2495
  sha256: ${o.source_sha256}
2496
- `),0}function em(t){let e=ra();for(let r of t.steps)if(e.get(r.type)===void 0)return{id:r.id,type:r.type};return null}function Lk(t){if(t===null||typeof t!="object")return[];let e=t,r=[],n=e.steps;if(Array.isArray(n))for(let o of n){if(o===null||typeof o!="object")continue;let i=o;if(i.type!=="lmctl/subflow"&&i.type!=="Subflow")continue;let a=i.parameters&&typeof i.parameters=="object"?i.parameters:{};typeof a.workflow_name=="string"&&a.workflow_name.length>0&&r.push(a.workflow_name)}let s=e.states;if(s!==null&&typeof s=="object")for(let o of Object.values(s)){if(o===null||typeof o!="object")continue;let i=o;i.type==="Subflow"&&typeof i.workflow_name=="string"&&i.workflow_name.length>0&&r.push(i.workflow_name)}return r}function Pk(t,e,r){let n=[],s=new Set,o=(i,a)=>{let l=n.indexOf(i);if(l>=0)throw new Error(`cross-workflow subflow cycle: ${[...n.slice(l),i].join(" -> ")}`);if(!s.has(i)){n.push(i);try{for(let c of a){let u=c===t?e:r(c);u!==null&&o(c,u)}}finally{n.pop()}s.add(i)}};o(t,e)}function B2(t,e,r){let n=process.env.LMCTL_DSL;if(n!==void 0&&["0","false","off"].includes(n.trim().toLowerCase()))return y(e,"workflow author is disabled by the LMCTL_DSL kill-switch (unset it to use the GA DSL path; durable-memory/composition-language-design.md \xA710)");let[s,o]=t;if(s===void 0)return y(e,"usage: lmctl workflow author <file.dsl> [name]");let i=ll(s,"utf8"),a;try{a=Me(i)}catch(m){return y(e,`compile failed: ${m instanceof Error?m.message:String(m)}`)}if(a.definition_schema_version!==3)return he(e,new Error("composition DSL must compile to a v3 graph workflow"));let l=a,c=em(l);if(c!==null)return y(e,`unknown archetype \`${c.type}\` (step \`${c.id}\`) \u2014 not in the live archetype registry`);let u=o??l.name,d=JSON.stringify(l);try{Pk(u,Lk(l),m=>{let p=r.getWorkflowByName(m);if(p===null)return null;try{return Lk(JSON.parse(p.definition))}catch{return null}})}catch(m){return y(e,`${m instanceof Error?m.message:String(m)}`)}let f;try{f=r.upsertWorkflow({name:u,definition_schema_version:3,definition:d,...Qf(s,i)})}catch(m){return y(e,`${m instanceof Error?m.message:String(m)}`)}return r.insertCompositionUnit({name:u,version:f.version,lang:"lmctl/dsl@1",source:i,source_sha:Zf("sha256").update(i).digest("hex"),compiled_workflow_version_id:f.active_version_id}),e.stdout.write(`authored workflow ${f.name}@${f.version} (composition_unit lang=lmctl/dsl@1)
2497
- `),0}function H2(t,e,r){let n=D(t,[]);if(n.error!==void 0)return y(e,n.error);let s=r.listWorkflows();return C(n,"--json")?U(e,s):e.stdout.write(`${s.map(o=>`${o.name}@${o.version}`).join(`
2496
+ `),0}function em(t){let e=ra();for(let r of t.steps)if(e.get(r.type)===void 0)return{id:r.id,type:r.type};return null}function jk(t){if(t===null||typeof t!="object")return[];let e=t,r=[],n=e.steps;if(Array.isArray(n))for(let o of n){if(o===null||typeof o!="object")continue;let i=o;if(i.type!=="lmctl/subflow"&&i.type!=="Subflow")continue;let a=i.parameters&&typeof i.parameters=="object"?i.parameters:{};typeof a.workflow_name=="string"&&a.workflow_name.length>0&&r.push(a.workflow_name)}let s=e.states;if(s!==null&&typeof s=="object")for(let o of Object.values(s)){if(o===null||typeof o!="object")continue;let i=o;i.type==="Subflow"&&typeof i.workflow_name=="string"&&i.workflow_name.length>0&&r.push(i.workflow_name)}return r}function Pk(t,e,r){let n=[],s=new Set,o=(i,a)=>{let l=n.indexOf(i);if(l>=0)throw new Error(`cross-workflow subflow cycle: ${[...n.slice(l),i].join(" -> ")}`);if(!s.has(i)){n.push(i);try{for(let c of a){let u=c===t?e:r(c);u!==null&&o(c,u)}}finally{n.pop()}s.add(i)}};o(t,e)}function q2(t,e,r){let n=process.env.LMCTL_DSL;if(n!==void 0&&["0","false","off"].includes(n.trim().toLowerCase()))return y(e,"workflow author is disabled by the LMCTL_DSL kill-switch (unset it to use the GA DSL path; durable-memory/composition-language-design.md \xA710)");let[s,o]=t;if(s===void 0)return y(e,"usage: lmctl workflow author <file.dsl> [name]");let i=ll(s,"utf8"),a;try{a=Me(i)}catch(m){return y(e,`compile failed: ${m instanceof Error?m.message:String(m)}`)}if(a.definition_schema_version!==3)return he(e,new Error("composition DSL must compile to a v3 graph workflow"));let l=a,c=em(l);if(c!==null)return y(e,`unknown archetype \`${c.type}\` (step \`${c.id}\`) \u2014 not in the live archetype registry`);let u=o??l.name,d=JSON.stringify(l);try{Pk(u,jk(l),m=>{let p=r.getWorkflowByName(m);if(p===null)return null;try{return jk(JSON.parse(p.definition))}catch{return null}})}catch(m){return y(e,`${m instanceof Error?m.message:String(m)}`)}let f;try{f=r.upsertWorkflow({name:u,definition_schema_version:3,definition:d,...Qf(s,i)})}catch(m){return y(e,`${m instanceof Error?m.message:String(m)}`)}return r.insertCompositionUnit({name:u,version:f.version,lang:"lmctl/dsl@1",source:i,source_sha:Zf("sha256").update(i).digest("hex"),compiled_workflow_version_id:f.active_version_id}),e.stdout.write(`authored workflow ${f.name}@${f.version} (composition_unit lang=lmctl/dsl@1)
2497
+ `),0}function J2(t,e,r){let n=D(t,[]);if(n.error!==void 0)return y(e,n.error);let s=r.listWorkflows();return C(n,"--json")?U(e,s):e.stdout.write(`${s.map(o=>`${o.name}@${o.version}`).join(`
2498
2498
  `)}${s.length>0?`
2499
- `:""}`),0}function q2(t,e,r){let n=D(t,[]);if(n.error!==void 0)return y(e,n.error);yi({swallow:!0});let s=b_(),o=[];try{o=k2(s)?v2(s).filter(c=>$2.some(u=>c.endsWith(u))):[]}catch{o=[]}let i=0,a=0,l=0;for(let c of[...o].sort()){let u=x2(s,c),d=ll(u,"utf8"),f;try{f=Me(d)}catch(I){return y(e,`compile failed for ${c}: ${I instanceof Error?I.message:String(I)}`)}let m=f.name,p=typeof m=="string"&&m.length>0?m:N2(c).replace(/\.(compound\.json|lmctl)$/i,""),h=c.endsWith(".lmctl"),g=h?JSON.stringify(f):d,_=h?3:f.definition_schema_version,S=Qf(u,d),w=r.getWorkflowByName(p);if(w!==null&&w.source_sha256===S.source_sha256){l+=1;continue}let E=w===null;r.upsertWorkflow({name:p,definition_schema_version:_,definition:g,...S}),E?i+=1:a+=1}return C(n,"--json")?U(e,{total:o.length,created:i,updated:a,unchanged:l}):e.stdout.write(`synced ${o.length} template(s): ${i} created, ${a} updated, ${l} unchanged
2500
- `),0}function J2(t,e,r){let n=D(t,["--out"]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0)return y(e,"usage: lmctl workflow export <name> [--out <file>] [--json]");let o=r.getWorkflowByName(s);if(o===null)return y(e,`workflow not found: ${s}`);let i;try{i=JSON.parse(o.definition)}catch{i=o.definition}let a={_lmctl_export:j2,inspection:{name:o.name,version:o.version,definition_schema_version:o.definition_schema_version,source_uri:o.source_uri,source_sha256:o.source_sha256,definition:i}},l=`${JSON.stringify(a,null,2)}
2501
- `,c=A(n,"--out");return c!==void 0?(I2(c,l),e.stdout.write(`exported ${o.name}@${o.version} \u2192 ${c} (inspection-only; NOT re-importable)
2502
- `)):e.stdout.write(l),0}var $2,j2,L2,il,cl,rm=T(()=>{"use strict";sd();En();Ei();cu();Te();Vf();Tl();Ps();$2=[".compound.json",".lmctl"],j2="INSPECTION ONLY \u2014 NOT a re-importable workflow source. Edit the basedir template then `lmctl workflow sync`; do NOT `workflow load` this file.",L2=`usage: lmctl workflow <load|author|list|sync|export|run>
2499
+ `:""}`),0}function X2(t,e,r){let n=D(t,[]);if(n.error!==void 0)return y(e,n.error);yi({swallow:!0});let s=b_(),o=[];try{o=I2(s)?N2(s).filter(c=>j2.some(u=>c.endsWith(u))):[]}catch{o=[]}let i=0,a=0,l=0;for(let c of[...o].sort()){let u=R2(s,c),d=ll(u,"utf8"),f;try{f=Me(d)}catch(I){return y(e,`compile failed for ${c}: ${I instanceof Error?I.message:String(I)}`)}let m=f.name,p=typeof m=="string"&&m.length>0?m:A2(c).replace(/\.(compound\.json|lmctl)$/i,""),h=c.endsWith(".lmctl"),g=h?JSON.stringify(f):d,_=h?3:f.definition_schema_version,S=Qf(u,d),w=r.getWorkflowByName(p);if(w!==null&&w.source_sha256===S.source_sha256){l+=1;continue}let E=w===null;r.upsertWorkflow({name:p,definition_schema_version:_,definition:g,...S}),E?i+=1:a+=1}return C(n,"--json")?U(e,{total:o.length,created:i,updated:a,unchanged:l}):e.stdout.write(`synced ${o.length} template(s): ${i} created, ${a} updated, ${l} unchanged
2500
+ `),0}function G2(t,e,r){let n=D(t,["--out"]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0)return y(e,"usage: lmctl workflow export <name> [--out <file>] [--json]");let o=r.getWorkflowByName(s);if(o===null)return y(e,`workflow not found: ${s}`);let i;try{i=JSON.parse(o.definition)}catch{i=o.definition}let a={_lmctl_export:O2,inspection:{name:o.name,version:o.version,definition_schema_version:o.definition_schema_version,source_uri:o.source_uri,source_sha256:o.source_sha256,definition:i}},l=`${JSON.stringify(a,null,2)}
2501
+ `,c=A(n,"--out");return c!==void 0?(x2(c,l),e.stdout.write(`exported ${o.name}@${o.version} \u2192 ${c} (inspection-only; NOT re-importable)
2502
+ `)):e.stdout.write(l),0}var j2,O2,C2,il,cl,rm=T(()=>{"use strict";sd();En();Ei();cu();Te();Vf();Tl();Fs();j2=[".compound.json",".lmctl"],O2="INSPECTION ONLY \u2014 NOT a re-importable workflow source. Edit the basedir template then `lmctl workflow sync`; do NOT `workflow load` this file.",C2=`usage: lmctl workflow <load|author|list|sync|export|run>
2503
2503
 
2504
2504
  Load, author, list, synchronize, inspect, or run workflow definitions. The
2505
2505
  load subcommand accepts local JSON, lmctl:// workflow URIs, and https:// JSON
2506
2506
  URLs. The run subcommand executes a loaded workflow/job, or one-shot runs a
2507
2507
  remote https:// workflow after a trust prompt.
2508
- `,il="usage: workflow run (<https-url | lmctl://workflow/<name>> [--project <name>] [--inputs <json-object>] [--yes|--no-prompt] [--verbose] | --workflow <name> [--project <name>] [--inputs <json-object>] [--verbose] | --job <id>) [--json]";cl=Symbol("inputs-error")});function nm(t,e){let r=X2[t],n=e("which",[t]);return n.status===0&&(n.stdout??"").toString().trim()!==""?e(t,["--version"]).status===0?{provider:t,status:"ok",detail:"installed, --version OK"}:{provider:t,status:"unverified",detail:"installed, session unverified (auth may be required)"}:r.optional?{provider:t,status:"skipped",detail:"not installed"}:{provider:t,status:"missing",detail:`not installed (install: ${r.install_hint})`,remediation:r.install_remediation}}var X2,Fk=T(()=>{"use strict";X2={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 Xk={};ae(Xk,{initWorkspace:()=>qk,runWorkspace:()=>Q2,setWorkspaceProvider:()=>Jk});import{copyFileSync as G2,cpSync as K2,existsSync as Fe,mkdirSync as Er,readdirSync as om,renameSync as V2,rmSync as ul,statSync as dl,writeFileSync as Y2}from"node:fs";import{spawnSync as z2}from"node:child_process";import{homedir as Uk}from"node:os";import{dirname as im,join as oo}from"node:path";async function Q2(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(Z2),0;switch(r){case"list":return eH(n,e);case"create":return tH(n,e);case"use":return rH(n,e);case"show":return nH(n,e);case"delete":return sH(n,e);case"migrate":return oH(n,e);case"init":return qk(n,e);case"set-provider":return Jk(n,e);default:return y(e,"usage: lmctl workspace <list|create|use|show|delete|migrate|init|set-provider>")}}function Bk(){let t=ao(),e=[],r=new Set,n=Sr.default,s=Fe(Bn()),o=Fe(Ot(n));if((s||o||t===null||t===n)&&(e.push({name:n,db_path:o?er(n):Bn(),active:t===null||t===n,legacy:!o&&s}),r.add(n)),Fe(br())){let i;try{i=om(br())}catch{i=[]}for(let a of i.sort()){if(r.has(a)||!Je(a))continue;let l=!1;try{l=dl(Ot(a)).isDirectory()}catch{l=!1}l&&(e.push({name:a,db_path:er(a),active:t===a,legacy:!1}),r.add(a))}}return e}function eH(t,e){let r=D(t,[]);if(r.error!==void 0)return y(e,r.error);if(r.positionals.length!==0)return y(e,"usage: lmctl workspace list");let n=Bk();if(C(r,"--json"))return U(e,n),0;for(let s of n){let o=s.active?"*":" ",i=s.legacy?" (legacy)":"";e.stdout.write(`${o} ${s.name} ${s.db_path}${i}
2509
- `)}return 0}function tH(t,e){let r=D(t,["--docroot"]);if(r.error!==void 0)return y(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return y(e,"usage: lmctl workspace create <name> [--docroot PATH]");if(!Je(n))return y(e,`invalid workspace name: ${n} (allowed: letters, digits, '.', '-', '_'; must start with alnum; \u226464 chars)`);let s=Ot(n);if(Fe(s))return y(e,`workspace already exists: ${n} (${s})`);let o=A(r,"--docroot")??pl(n);Er(s,{recursive:!0}),Er(o,{recursive:!0});let i=er(n);Er(im(i),{recursive:!0});let a=_e({path:i});try{a.setConfig("project.docroot",o)}finally{a.close()}let l={name:n,dir:s,db_path:i,docroot:o};return C(r,"--json")?U(e,l):e.stdout.write(`created workspace ${n} at ${s}
2510
- `),0}function rH(t,e){let r=D(t,[]);if(r.error!==void 0)return y(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return y(e,"usage: lmctl workspace use <name>");if(!Je(n))return y(e,`invalid workspace name: ${n}`);if(n!==Sr.default&&!Fe(Ot(n)))return y(e,`workspace not found: ${n} (run \`lmctl workspace create ${n}\` first)`);let s=io();return Er(im(s),{recursive:!0}),Y2(s,`${n}
2508
+ `,il="usage: workflow run (<https-url | lmctl://workflow/<name>> [--project <name>] [--inputs <json-object>] [--yes|--no-prompt] [--verbose] | --workflow <name> [--project <name>] [--inputs <json-object>] [--verbose] | --job <id>) [--json]";cl=Symbol("inputs-error")});function nm(t,e){let r=K2[t],n=e("which",[t]);return n.status===0&&(n.stdout??"").toString().trim()!==""?e(t,["--version"]).status===0?{provider:t,status:"ok",detail:"installed, --version OK"}:{provider:t,status:"unverified",detail:"installed, session unverified (auth may be required)"}:r.optional?{provider:t,status:"skipped",detail:"not installed"}:{provider:t,status:"missing",detail:`not installed (install: ${r.install_hint})`,remediation:r.install_remediation}}var K2,Fk=T(()=>{"use strict";K2={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 Xk={};le(Xk,{initWorkspace:()=>qk,runWorkspace:()=>tH,setWorkspaceProvider:()=>Jk});import{copyFileSync as V2,cpSync as Y2,existsSync as Fe,mkdirSync as Er,readdirSync as om,renameSync as z2,rmSync as ul,statSync as dl,writeFileSync as Z2}from"node:fs";import{spawnSync as Q2}from"node:child_process";import{homedir as Uk}from"node:os";import{dirname as im,join as io}from"node:path";async function tH(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(eH),0;switch(r){case"list":return rH(n,e);case"create":return nH(n,e);case"use":return sH(n,e);case"show":return oH(n,e);case"delete":return iH(n,e);case"migrate":return aH(n,e);case"init":return qk(n,e);case"set-provider":return Jk(n,e);default:return y(e,"usage: lmctl workspace <list|create|use|show|delete|migrate|init|set-provider>")}}function Bk(){let t=lo(),e=[],r=new Set,n=Sr.default,s=Fe(Bn()),o=Fe(Ot(n));if((s||o||t===null||t===n)&&(e.push({name:n,db_path:o?er(n):Bn(),active:t===null||t===n,legacy:!o&&s}),r.add(n)),Fe(br())){let i;try{i=om(br())}catch{i=[]}for(let a of i.sort()){if(r.has(a)||!Je(a))continue;let l=!1;try{l=dl(Ot(a)).isDirectory()}catch{l=!1}l&&(e.push({name:a,db_path:er(a),active:t===a,legacy:!1}),r.add(a))}}return e}function rH(t,e){let r=D(t,[]);if(r.error!==void 0)return y(e,r.error);if(r.positionals.length!==0)return y(e,"usage: lmctl workspace list");let n=Bk();if(C(r,"--json"))return U(e,n),0;for(let s of n){let o=s.active?"*":" ",i=s.legacy?" (legacy)":"";e.stdout.write(`${o} ${s.name} ${s.db_path}${i}
2509
+ `)}return 0}function nH(t,e){let r=D(t,["--docroot"]);if(r.error!==void 0)return y(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return y(e,"usage: lmctl workspace create <name> [--docroot PATH]");if(!Je(n))return y(e,`invalid workspace name: ${n} (allowed: letters, digits, '.', '-', '_'; must start with alnum; \u226464 chars)`);let s=Ot(n);if(Fe(s))return y(e,`workspace already exists: ${n} (${s})`);let o=A(r,"--docroot")??pl(n);Er(s,{recursive:!0}),Er(o,{recursive:!0});let i=er(n);Er(im(i),{recursive:!0});let a=_e({path:i});try{a.setConfig("project.docroot",o)}finally{a.close()}let l={name:n,dir:s,db_path:i,docroot:o};return C(r,"--json")?U(e,l):e.stdout.write(`created workspace ${n} at ${s}
2510
+ `),0}function sH(t,e){let r=D(t,[]);if(r.error!==void 0)return y(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return y(e,"usage: lmctl workspace use <name>");if(!Je(n))return y(e,`invalid workspace name: ${n}`);if(n!==Sr.default&&!Fe(Ot(n)))return y(e,`workspace not found: ${n} (run \`lmctl workspace create ${n}\` first)`);let s=ao();return Er(im(s),{recursive:!0}),Z2(s,`${n}
2511
2511
  `),C(r,"--json")?U(e,{active:n,path:s}):e.stdout.write(`active workspace set to ${n}
2512
- `),0}function nH(t,e){let r=D(t,[]);if(r.error!==void 0)return y(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return y(e,"usage: lmctl workspace show <name>");if(!Je(n))return y(e,`invalid workspace name: ${n}`);let s=Bk().find(u=>u.name===n);if(s===void 0)return y(e,`workspace not found: ${n}`);let o=0;try{o=Fe(s.db_path)?dl(s.db_path).size:0}catch{o=0}let i=0,a=null,l={};if(Fe(s.db_path)){let u=_e({path:s.db_path});try{i=u.listProjects().length,l=u.getConfigAll(),a=l["project.docroot"]??null}finally{u.close()}}let c={name:s.name,active:s.active,legacy:s.legacy,db_path:s.db_path,db_size_bytes:o,docroot:a,project_count:i,config_keys:Object.keys(l).sort()};return C(r,"--json")?U(e,c):e.stdout.write(`${JSON.stringify(c,null,2)}
2513
- `),0}function sH(t,e){let r=D(t,[],["--json","--confirm","--force"]);if(r.error!==void 0)return y(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return y(e,"usage: lmctl workspace delete <name> --confirm [--force]");if(!Je(n))return y(e,`invalid workspace name: ${n}`);if(!C(r,"--confirm"))return y(e,`refusing to delete workspace ${n} without --confirm`);if(n===Sr.default&&!C(r,"--force"))return y(e,"refusing to delete the default workspace without --force");if(ao()===n&&!C(r,"--force"))return y(e,`refusing to delete the active workspace (${n}) without --force`);let o=Ot(n);return Fe(o)?(ul(o,{recursive:!0,force:!0}),C(r,"--json")?U(e,{deleted:n,dir:o}):e.stdout.write(`deleted workspace ${n}
2514
- `),0):y(e,`workspace not found: ${n}`)}function sm(t,e,r){try{V2(t,e);return}catch(s){if(s.code!=="EXDEV")throw s}if(r.stderr.write(`note: cross-device move; copying ${t} -> ${e} then removing source
2515
- `),dl(t).isDirectory()?K2(t,e,{recursive:!0}):G2(t,e),!Fe(e))throw new Error(`migration copy verification failed: ${e} not present after copy`);ul(t,{recursive:!0,force:!0})}function oH(t,e){let r=D(t,[],["--json"]);if(r.error!==void 0)return y(e,r.error);let n=C(r,"--json"),s=hl(),o=br(),i=[],a=(f,m)=>{if(n)U(e,{migrated:f,reason:m??null,actions:i});else{for(let p of i)e.stdout.write(`${p}
2512
+ `),0}function oH(t,e){let r=D(t,[]);if(r.error!==void 0)return y(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return y(e,"usage: lmctl workspace show <name>");if(!Je(n))return y(e,`invalid workspace name: ${n}`);let s=Bk().find(u=>u.name===n);if(s===void 0)return y(e,`workspace not found: ${n}`);let o=0;try{o=Fe(s.db_path)?dl(s.db_path).size:0}catch{o=0}let i=0,a=null,l={};if(Fe(s.db_path)){let u=_e({path:s.db_path});try{i=u.listProjects().length,l=u.getConfigAll(),a=l["project.docroot"]??null}finally{u.close()}}let c={name:s.name,active:s.active,legacy:s.legacy,db_path:s.db_path,db_size_bytes:o,docroot:a,project_count:i,config_keys:Object.keys(l).sort()};return C(r,"--json")?U(e,c):e.stdout.write(`${JSON.stringify(c,null,2)}
2513
+ `),0}function iH(t,e){let r=D(t,[],["--json","--confirm","--force"]);if(r.error!==void 0)return y(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return y(e,"usage: lmctl workspace delete <name> --confirm [--force]");if(!Je(n))return y(e,`invalid workspace name: ${n}`);if(!C(r,"--confirm"))return y(e,`refusing to delete workspace ${n} without --confirm`);if(n===Sr.default&&!C(r,"--force"))return y(e,"refusing to delete the default workspace without --force");if(lo()===n&&!C(r,"--force"))return y(e,`refusing to delete the active workspace (${n}) without --force`);let o=Ot(n);return Fe(o)?(ul(o,{recursive:!0,force:!0}),C(r,"--json")?U(e,{deleted:n,dir:o}):e.stdout.write(`deleted workspace ${n}
2514
+ `),0):y(e,`workspace not found: ${n}`)}function sm(t,e,r){try{z2(t,e);return}catch(s){if(s.code!=="EXDEV")throw s}if(r.stderr.write(`note: cross-device move; copying ${t} -> ${e} then removing source
2515
+ `),dl(t).isDirectory()?Y2(t,e,{recursive:!0}):V2(t,e),!Fe(e))throw new Error(`migration copy verification failed: ${e} not present after copy`);ul(t,{recursive:!0,force:!0})}function aH(t,e){let r=D(t,[],["--json"]);if(r.error!==void 0)return y(e,r.error);let n=C(r,"--json"),s=hl(),o=br(),i=[],a=(f,m)=>{if(n)U(e,{migrated:f,reason:m??null,actions:i});else{for(let p of i)e.stdout.write(`${p}
2516
2516
  `);e.stdout.write(f?`migration complete
2517
2517
  `:`${m??"nothing to migrate"}
2518
- `)}return 0};if(!Fe(s))return a(!1,"no legacy ~/.lmctl/profiles/ found; nothing to migrate");let l;try{l=om(s).sort()}catch{l=[]}let c=l.filter(f=>{try{return dl(oo(s,f)).isDirectory()}catch{return!1}});if(c.length===0)ul(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`);else if(!Fe(o))sm(s,o,e),i.push(`renamed ${s} -> ${o}`);else{let f=c.filter(m=>Fe(oo(o,m)));if(f.length>0)return y(e,`refusing to migrate: ~/.lmctl/workspaces/ already has: ${f.join(", ")} (no files were moved; resolve the name collision, then re-run \`lmctl workspace migrate\`)`);Er(o,{recursive:!0});for(let m of c)sm(oo(s,m),oo(o,m),e),i.push(`moved ${m} -> workspaces/${m}`);try{om(s).length===0&&(ul(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`))}catch{}}let u=Tm(),d=io();return Fe(u)&&(Fe(d)?i.push("left active-profile in place (active-workspace already exists; not clobbering)"):(sm(u,d,e),i.push("renamed active-profile -> active-workspace"))),a(!0)}function Hk(t,e){return z2(t,e,{encoding:"utf8",timeout:5e3,maxBuffer:1024*1024})}function lH(t){return process.stderr.write(t),new Promise(e=>{let r=n=>{let s=(typeof n=="string"?n:n.toString("utf8")).trim();process.stdin.removeListener("data",r);try{process.stdin.pause()}catch{}e(s)};try{process.stdin.resume()}catch{}process.stdin.once("data",r)})}function Wk(t){return t==="~"?Uk():t.startsWith("~/")?oo(Uk(),t.slice(2)):t}async function qk(t,e,r={}){let n="usage: lmctl workspace init [--name N] [--basedir DIR] [--provider1 P] [--provider2 P] [--provider3 P]";if(t.includes("--help")||t.includes("-h"))return e.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: ${Fn.join(", ")}.`].join(`
2518
+ `)}return 0};if(!Fe(s))return a(!1,"no legacy ~/.lmctl/profiles/ found; nothing to migrate");let l;try{l=om(s).sort()}catch{l=[]}let c=l.filter(f=>{try{return dl(io(s,f)).isDirectory()}catch{return!1}});if(c.length===0)ul(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`);else if(!Fe(o))sm(s,o,e),i.push(`renamed ${s} -> ${o}`);else{let f=c.filter(m=>Fe(io(o,m)));if(f.length>0)return y(e,`refusing to migrate: ~/.lmctl/workspaces/ already has: ${f.join(", ")} (no files were moved; resolve the name collision, then re-run \`lmctl workspace migrate\`)`);Er(o,{recursive:!0});for(let m of c)sm(io(s,m),io(o,m),e),i.push(`moved ${m} -> workspaces/${m}`);try{om(s).length===0&&(ul(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`))}catch{}}let u=Tm(),d=ao();return Fe(u)&&(Fe(d)?i.push("left active-profile in place (active-workspace already exists; not clobbering)"):(sm(u,d,e),i.push("renamed active-profile -> active-workspace"))),a(!0)}function Hk(t,e){return Q2(t,e,{encoding:"utf8",timeout:5e3,maxBuffer:1024*1024})}function uH(t){return process.stderr.write(t),new Promise(e=>{let r=n=>{let s=(typeof n=="string"?n:n.toString("utf8")).trim();process.stdin.removeListener("data",r);try{process.stdin.pause()}catch{}e(s)};try{process.stdin.resume()}catch{}process.stdin.once("data",r)})}function Wk(t){return t==="~"?Uk():t.startsWith("~/")?io(Uk(),t.slice(2)):t}async function qk(t,e,r={}){let n="usage: lmctl workspace init [--name N] [--basedir DIR] [--provider1 P] [--provider2 P] [--provider3 P]";if(t.includes("--help")||t.includes("-h"))return e.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: ${Fn.join(", ")}.`].join(`
2519
2519
  `)+`
2520
2520
  `),0;let s=D(t,["--name","--basedir","--provider1","--provider2","--provider3"]);if(s.error!==void 0)return y(e,s.error);if(s.positionals.length!==0)return y(e,n);let o=r.spawn??Hk,a=Fn.map(x=>nm(x,o)).filter(x=>x.status==="ok"||x.status==="unverified").map(x=>x.provider);if(a.length===0)return e.stderr.write(`error: no provider CLI found on PATH; install/auth ${Fn.join("|")} first
2521
- `),2;let l=r.isTty??!!process.stdin.isTTY,c=r.promptLine??lH,u=r.promptLine!==void 0||l,d=x=>(e.stderr.write(`error: ${x} is required in non-interactive mode (no TTY); pass it explicitly
2521
+ `),2;let l=r.isTty??!!process.stdin.isTTY,c=r.promptLine??uH,u=r.promptLine!==void 0||l,d=x=>(e.stderr.write(`error: ${x} is required in non-interactive mode (no TTY); pass it explicitly
2522
2522
  `),2),f,m=A(s,"--name");if(m!==void 0){if(!Je(m))return e.stderr.write(`error: invalid workspace name: ${m}
2523
2523
  `),2;f=m}else{if(!u)return d("--name");for(;;){let x=(await c("Workspace name [default]: ")).trim(),H=x.length===0?"default":x;if(Je(H)){f=H;break}e.stderr.write(`invalid workspace name: ${H} (letters/digits/.-_, start alnum, \u226464)
2524
2524
  `)}}let p=Ot(f);if(Fe(p))return e.stderr.write(`error: workspace already exists: ${f} (${p}) \u2014 refusing to overwrite
2525
- `),2;let h,g=A(s,"--basedir"),_=pl(f);if(g!==void 0)h=Wk(g);else{if(!u)return d("--basedir");let x=(await c(`Base directory for this workspace's projects [${_}]: `)).trim();h=x.length===0?_:Wk(x)}let S={};for(let x of["provider1","provider2","provider3"]){let H=A(s,`--${x}`),ue=iH[x],q=a.includes(ue)?ue:a[0];if(H!==void 0){if(!a.includes(H))return e.stderr.write(`error: --${x} ${H} is not an available provider (available: ${a.join(", ")})
2526
- `),2;S[x]=H;continue}if(!u)return d(`--${x}`);for(;;){let P=(await c(`${x} (${aH[x]}) [${q}]: `)).trim(),R=P.length===0?q:P;if(a.includes(R)){S[x]=R;break}e.stderr.write(`not an available provider: ${R} (available: ${a.join(", ")})
2525
+ `),2;let h,g=A(s,"--basedir"),_=pl(f);if(g!==void 0)h=Wk(g);else{if(!u)return d("--basedir");let x=(await c(`Base directory for this workspace's projects [${_}]: `)).trim();h=x.length===0?_:Wk(x)}let S={};for(let x of["provider1","provider2","provider3"]){let H=A(s,`--${x}`),ue=lH[x],q=a.includes(ue)?ue:a[0];if(H!==void 0){if(!a.includes(H))return e.stderr.write(`error: --${x} ${H} is not an available provider (available: ${a.join(", ")})
2526
+ `),2;S[x]=H;continue}if(!u)return d(`--${x}`);for(;;){let P=(await c(`${x} (${cH[x]}) [${q}]: `)).trim(),R=P.length===0?q:P;if(a.includes(R)){S[x]=R;break}e.stderr.write(`not an available provider: ${R} (available: ${a.join(", ")})
2527
2527
  `)}}Er(p,{recursive:!0}),Er(h,{recursive:!0});let w=er(f);Er(im(w),{recursive:!0});let E=_e({path:w});try{E.setConfig("project.docroot",h),E.setConfig("workspace.provider1",S.provider1),E.setConfig("workspace.provider2",S.provider2),E.setConfig("workspace.provider3",S.provider3)}finally{E.close()}let I={name:f,dir:p,db_path:w,basedir:h,providers:{...S}};return C(s,"--json")?U(e,I):(e.stdout.write(`created workspace ${f} at ${p}
2528
2528
  `),e.stdout.write(` basedir: ${h}
2529
2529
  `),e.stdout.write(` provider1=${S.provider1} provider2=${S.provider2} provider3=${S.provider3}
@@ -2534,7 +2534,7 @@ remote https:// workflow after a trust prompt.
2534
2534
  `),2;let c=r.spawn??Hk,u=Fn.map(p=>nm(p,c)).filter(p=>p.status==="ok"||p.status==="unverified").map(p=>p.provider);if(u.length===0)return e.stderr.write(`error: no provider CLI found on PATH; install/auth ${Fn.join("|")} first
2535
2535
  `),2;if(!u.includes(i))return e.stderr.write(`error: ${i} is not an available provider (available: ${u.join(", ")})
2536
2536
  `),2;let d=e.dal===void 0,f=e.dal??_e({path:de()});try{f.setConfig(`workspace.${l}`,i)}finally{d&&f.close()}let m=Hn()??Sr.default;return e.stdout.write(`workspace.${l} = ${i} (workspace: ${m})
2537
- `),0}var Z2,Fn,iH,aH,Gk=T(()=>{"use strict";Ue();Fk();Te();ze();Z2=`usage: lmctl workspace list [--json]
2537
+ `),0}var eH,Fn,lH,cH,Gk=T(()=>{"use strict";Ue();Fk();Te();ze();eH=`usage: lmctl workspace list [--json]
2538
2538
  lmctl workspace create <name> [--docroot PATH] [--json]
2539
2539
  lmctl workspace use <name> [--json]
2540
2540
  lmctl workspace show <name> [--json]
@@ -2546,18 +2546,18 @@ remote https:// workflow after a trust prompt.
2546
2546
  Manage isolated workspace state directories, active workspace selection,
2547
2547
  legacy profile migration, and configured provider slots.
2548
2548
  delete requires --confirm; deleting default or active workspaces also requires --force.
2549
- `;Fn=["claude","codex","gemini","qwen"],iH={provider1:"claude",provider2:"codex",provider3:"gemini"},aH={provider1:"primary implementer",provider2:"independent reviewer",provider3:"auxiliary / tie-break"}});var Yk={};ae(Yk,{runProject:()=>fH});import{existsSync as cH,statSync as uH}from"node:fs";import{join as Vk}from"node:path";async function fH(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(dH),0;try{return await L(e,s=>{switch(r){case"create":return TH(n,e,s);case"list":return bH(n,e,s);case"show":return wH(n,e,s);case"status":return EH(n,e,s);case"workflow":return mH(n,e,s);default:return y(e,"usage: lmctl project <create|list|show|status|workflow>")}})}catch(s){return he(e,s)}}function mH(t,e,r){let[n,...s]=t;switch(n){case"add":return pH(s,e,r);case"list":return hH(s,e,r);case"show":return _H(s,e,r);case"remove":return gH(s,e,r);case"enable":return Kk(s,e,r,!0);case"disable":return Kk(s,e,r,!1);default:return y(e,"usage: lmctl project workflow <add|list|show|remove|enable|disable>")}}function pH(t,e,r){let n=D(t,["--condition","--params","--priority"]);if(n.error!==void 0)return y(e,n.error);let[s,o]=n.positionals;if(s===void 0||o===void 0||n.positionals.length!==2)return y(e,"usage: project workflow add <project> <workflow> [--condition JEXL] [--params JSON] [--priority N]");let i=r.findProjectByName(s);if(i===null)return y(e,`project not found: ${s}`);let a=r.getWorkflowByName(o);if(a===null)return y(e,`workflow not found: ${o}`);let l=A(n,"--condition")??null;if(l!==null)try{fr(l)}catch{return y(e,"invalid --condition JEXL")}let c=yH(A(n,"--params"));if(typeof c=="string")return y(e,c);let u=A(n,"--priority"),d=u===void 0?100:Number(u);if(!Number.isInteger(d))return y(e,`invalid --priority: ${u??""}`);let f=r.insertProjectWorkflow({project_id:i.id,workflow_id:a.id,condition:l,parameters_override:c?.json??null,priority:d});return C(n,"--json")?U(e,f):e.stdout.write(`added project workflow ${f.id}
2550
- `),0}function hH(t,e,r){let n=D(t,[]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0||n.positionals.length!==1)return y(e,"usage: project workflow list <project>");let o=r.findProjectByName(s);if(o===null)return y(e,`project not found: ${s}`);let i=r.listProjectWorkflows(o.id);return C(n,"--json")?U(e,i):e.stdout.write(`${i.map(a=>`${a.id} ${a.workflow_id} ${a.priority} ${a.enabled} ${a.condition??""}`).join(`
2549
+ `;Fn=["claude","codex","gemini","qwen"],lH={provider1:"claude",provider2:"codex",provider3:"gemini"},cH={provider1:"primary implementer",provider2:"independent reviewer",provider3:"auxiliary / tie-break"}});var Yk={};le(Yk,{runProject:()=>pH});import{existsSync as dH,statSync as fH}from"node:fs";import{join as Vk}from"node:path";async function pH(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(mH),0;try{return await j(e,s=>{switch(r){case"create":return SH(n,e,s);case"list":return kH(n,e,s);case"show":return TH(n,e,s);case"status":return bH(n,e,s);case"workflow":return hH(n,e,s);default:return y(e,"usage: lmctl project <create|list|show|status|workflow>")}})}catch(s){return he(e,s)}}function hH(t,e,r){let[n,...s]=t;switch(n){case"add":return _H(s,e,r);case"list":return gH(s,e,r);case"show":return yH(s,e,r);case"remove":return wH(s,e,r);case"enable":return Kk(s,e,r,!0);case"disable":return Kk(s,e,r,!1);default:return y(e,"usage: lmctl project workflow <add|list|show|remove|enable|disable>")}}function _H(t,e,r){let n=D(t,["--condition","--params","--priority"]);if(n.error!==void 0)return y(e,n.error);let[s,o]=n.positionals;if(s===void 0||o===void 0||n.positionals.length!==2)return y(e,"usage: project workflow add <project> <workflow> [--condition JEXL] [--params JSON] [--priority N]");let i=r.findProjectByName(s);if(i===null)return y(e,`project not found: ${s}`);let a=r.getWorkflowByName(o);if(a===null)return y(e,`workflow not found: ${o}`);let l=A(n,"--condition")??null;if(l!==null)try{fr(l)}catch{return y(e,"invalid --condition JEXL")}let c=EH(A(n,"--params"));if(typeof c=="string")return y(e,c);let u=A(n,"--priority"),d=u===void 0?100:Number(u);if(!Number.isInteger(d))return y(e,`invalid --priority: ${u??""}`);let f=r.insertProjectWorkflow({project_id:i.id,workflow_id:a.id,condition:l,parameters_override:c?.json??null,priority:d});return C(n,"--json")?U(e,f):e.stdout.write(`added project workflow ${f.id}
2550
+ `),0}function gH(t,e,r){let n=D(t,[]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0||n.positionals.length!==1)return y(e,"usage: project workflow list <project>");let o=r.findProjectByName(s);if(o===null)return y(e,`project not found: ${s}`);let i=r.listProjectWorkflows(o.id);return C(n,"--json")?U(e,i):e.stdout.write(`${i.map(a=>`${a.id} ${a.workflow_id} ${a.priority} ${a.enabled} ${a.condition??""}`).join(`
2551
2551
  `)}${i.length>0?`
2552
- `:""}`),0}function _H(t,e,r){let n=D(t,[]);if(n.error!==void 0)return y(e,n.error);let s=am(n.positionals[0]);if(typeof s=="string"||n.positionals.length!==1)return y(e,"usage: project workflow show <id>");let o=r.getProjectWorkflow(s);return o===null?y(e,`project workflow not found: ${s}`):(C(n,"--json")?U(e,o):e.stdout.write(`${JSON.stringify(o,null,2)}
2553
- `),0)}function gH(t,e,r){let n=D(t,[]);if(n.error!==void 0)return y(e,n.error);let s=am(n.positionals[0]);return typeof s=="string"||n.positionals.length!==1?y(e,"usage: project workflow remove <id>"):r.removeProjectWorkflow(s)?(e.stdout.write(`removed project workflow ${s}
2552
+ `:""}`),0}function yH(t,e,r){let n=D(t,[]);if(n.error!==void 0)return y(e,n.error);let s=am(n.positionals[0]);if(typeof s=="string"||n.positionals.length!==1)return y(e,"usage: project workflow show <id>");let o=r.getProjectWorkflow(s);return o===null?y(e,`project workflow not found: ${s}`):(C(n,"--json")?U(e,o):e.stdout.write(`${JSON.stringify(o,null,2)}
2553
+ `),0)}function wH(t,e,r){let n=D(t,[]);if(n.error!==void 0)return y(e,n.error);let s=am(n.positionals[0]);return typeof s=="string"||n.positionals.length!==1?y(e,"usage: project workflow remove <id>"):r.removeProjectWorkflow(s)?(e.stdout.write(`removed project workflow ${s}
2554
2554
  `),0):y(e,`project workflow not found: ${s}`)}function Kk(t,e,r,n){let s=D(t,[]);if(s.error!==void 0)return y(e,s.error);let o=am(s.positionals[0]),i=n?"enable":"disable";if(typeof o=="string"||s.positionals.length!==1)return y(e,`usage: project workflow ${i} <id>`);let a=r.setProjectWorkflowEnabled(o,n);return a===null?y(e,`project workflow not found: ${o}`):(C(s,"--json")?U(e,a):e.stdout.write(`${n?"enabled":"disabled"} project workflow ${o}
2555
- `),0)}function yH(t){if(t===void 0)return null;try{let e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)?{json:JSON.stringify(e)}:"--params must be a JSON object"}catch{return"--params must be valid JSON"}}function am(t){return t===void 0||!/^\d+$/.test(t)||Number(t)<=0?"invalid id":Number(t)}function wH(t,e,r){let n=D(t,[]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0)return y(e,"usage: project show <name>");let o=r.findProjectByName(s);if(o===null)return y(e,`project not found: ${s}`);let i=o.name.indexOf("/"),a=i>0?o.name.slice(0,i):null,l=i>0?o.name.slice(i+1):o.name,c={...o,owner:a,repo:l};return C(n,"--json")?U(e,c):e.stdout.write(`${JSON.stringify(c,null,2)}
2556
- `),0}function EH(t,e,r){let n=D(t,[]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0)return y(e,"usage: project status <name>");let o=r.findProjectByName(s);if(o===null)return y(e,`project not found: ${s}`);let i={project:o.name,workflow_name:o.workflow_name};return C(n,"--json")?U(e,i):e.stdout.write(`${JSON.stringify(i,null,2)}
2557
- `),0}function TH(t,e,r){let n=D(t,["--local-path","--workflow","--team","--default-branch","--owner","--repo","--test-argv","--durable-memory-mode"]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals,o=A(n,"--owner"),i=A(n,"--repo"),a=o!==void 0&&i!==void 0?`${o}/${i}`:s;if(a===void 0)return y(e,`usage: project create <name> --local-path P --workflow W --team T [--default-branch B] [--test-argv '["go","test","./..."]'] OR project create --owner OWNER --repo REPO ...`);let l=r.getConfig("project.docroot"),c=a.indexOf("/"),u=c>0?a.slice(c+1):a,d=A(n,"--local-path")??(l!==null?Vk(l,u):void 0),f=A(n,"--workflow"),m=A(n,"--team");if(d===void 0||f===void 0||m===void 0)return y(e,"project create requires --local-path (or `api config set project.docroot`), --workflow, and --team");if(r.getWorkflowByName(f)===null)return y(e,`workflow not found: ${f}`);let p=r.findTeamByName(m);if(p===null)return y(e,`team not found: ${m}`);let h=A(n,"--test-argv"),g=null;if(h!==void 0)try{let E=JSON.parse(h);if(!Array.isArray(E)||!E.every(I=>typeof I=="string")||E.length===0)return y(e,`--test-argv must be a non-empty JSON array of strings (e.g. '["go","test","./..."]')`);g=JSON.stringify(E)}catch{return y(e,"--test-argv must be valid JSON")}let _=A(n,"--durable-memory-mode");if(_!==void 0&&_!=="folder"&&_!=="db")return y(e,'--durable-memory-mode must be "folder" or "db"');let S=_!==void 0?_:SH(d)||_s(d)?"folder":"db",w=r.insertProject({name:a,local_path:d,workflow_name:f,team_id:p.id,default_branch:A(n,"--default-branch")??null,test_argv:g,durable_memory_mode:S});return C(n,"--json")?U(e,w):e.stdout.write(`created project ${w.name}
2558
- `),0}function bH(t,e,r){let n=D(t,[]);if(n.error!==void 0)return y(e,n.error);let s=r.listProjects();return C(n,"--json")?U(e,s):e.stdout.write(`${s.map(o=>`${o.id} ${o.name} ${o.workflow_name}`).join(`
2555
+ `),0)}function EH(t){if(t===void 0)return null;try{let e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)?{json:JSON.stringify(e)}:"--params must be a JSON object"}catch{return"--params must be valid JSON"}}function am(t){return t===void 0||!/^\d+$/.test(t)||Number(t)<=0?"invalid id":Number(t)}function TH(t,e,r){let n=D(t,[]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0)return y(e,"usage: project show <name>");let o=r.findProjectByName(s);if(o===null)return y(e,`project not found: ${s}`);let i=o.name.indexOf("/"),a=i>0?o.name.slice(0,i):null,l=i>0?o.name.slice(i+1):o.name,c={...o,owner:a,repo:l};return C(n,"--json")?U(e,c):e.stdout.write(`${JSON.stringify(c,null,2)}
2556
+ `),0}function bH(t,e,r){let n=D(t,[]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0)return y(e,"usage: project status <name>");let o=r.findProjectByName(s);if(o===null)return y(e,`project not found: ${s}`);let i={project:o.name,workflow_name:o.workflow_name};return C(n,"--json")?U(e,i):e.stdout.write(`${JSON.stringify(i,null,2)}
2557
+ `),0}function SH(t,e,r){let n=D(t,["--local-path","--workflow","--team","--default-branch","--owner","--repo","--test-argv","--durable-memory-mode"]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals,o=A(n,"--owner"),i=A(n,"--repo"),a=o!==void 0&&i!==void 0?`${o}/${i}`:s;if(a===void 0)return y(e,`usage: project create <name> --local-path P --workflow W --team T [--default-branch B] [--test-argv '["go","test","./..."]'] OR project create --owner OWNER --repo REPO ...`);let l=r.getConfig("project.docroot"),c=a.indexOf("/"),u=c>0?a.slice(c+1):a,d=A(n,"--local-path")??(l!==null?Vk(l,u):void 0),f=A(n,"--workflow"),m=A(n,"--team");if(d===void 0||f===void 0||m===void 0)return y(e,"project create requires --local-path (or `api config set project.docroot`), --workflow, and --team");if(r.getWorkflowByName(f)===null)return y(e,`workflow not found: ${f}`);let p=r.findTeamByName(m);if(p===null)return y(e,`team not found: ${m}`);let h=A(n,"--test-argv"),g=null;if(h!==void 0)try{let E=JSON.parse(h);if(!Array.isArray(E)||!E.every(I=>typeof I=="string")||E.length===0)return y(e,`--test-argv must be a non-empty JSON array of strings (e.g. '["go","test","./..."]')`);g=JSON.stringify(E)}catch{return y(e,"--test-argv must be valid JSON")}let _=A(n,"--durable-memory-mode");if(_!==void 0&&_!=="folder"&&_!=="db")return y(e,'--durable-memory-mode must be "folder" or "db"');let S=_!==void 0?_:vH(d)||gs(d)?"folder":"db",w=r.insertProject({name:a,local_path:d,workflow_name:f,team_id:p.id,default_branch:A(n,"--default-branch")??null,test_argv:g,durable_memory_mode:S});return C(n,"--json")?U(e,w):e.stdout.write(`created project ${w.name}
2558
+ `),0}function kH(t,e,r){let n=D(t,[]);if(n.error!==void 0)return y(e,n.error);let s=r.listProjects();return C(n,"--json")?U(e,s):e.stdout.write(`${s.map(o=>`${o.id} ${o.name} ${o.workflow_name}`).join(`
2559
2559
  `)}${s.length>0?`
2560
- `:""}`),0}function SH(t){try{let e=Vk(t,"durable-memory");return cH(e)&&uH(e).isDirectory()}catch{return!1}}var dH,zk=T(()=>{"use strict";Te();_n();gs();dH=`usage: lmctl project create <name> [--local-path P] --workflow W --team T [--default-branch B] [--test-argv JSON] [--durable-memory-mode folder|db] [--json]
2560
+ `:""}`),0}function vH(t){try{let e=Vk(t,"durable-memory");return dH(e)&&fH(e).isDirectory()}catch{return!1}}var mH,zk=T(()=>{"use strict";Te();_n();ys();mH=`usage: lmctl project create <name> [--local-path P] --workflow W --team T [--default-branch B] [--test-argv JSON] [--durable-memory-mode folder|db] [--json]
2561
2561
  lmctl project create --owner OWNER --repo REPO --workflow W --team T [--local-path P] [--default-branch B] [--test-argv JSON] [--durable-memory-mode folder|db] [--json]
2562
2562
  lmctl project list [--json]
2563
2563
  lmctl project show <name> [--json]
@@ -2572,7 +2572,7 @@ delete requires --confirm; deleting default or active workspaces also requires -
2572
2572
  Create, list, inspect, and check projects. The workflow subcommand manages
2573
2573
  per-project workflow bindings and routing conditions.
2574
2574
  If project create omits --local-path, project.docroot must be configured.
2575
- `});import{createHash as kH,randomBytes as vH}from"node:crypto";import{readFile as IH}from"node:fs/promises";function Zk(t=new Date,e=vH(4)){let r=t.getUTCFullYear().toString().padStart(4,"0"),n=(t.getUTCMonth()+1).toString().padStart(2,"0"),s=t.getUTCDate().toString().padStart(2,"0"),o=t.getUTCHours().toString().padStart(2,"0"),i=t.getUTCMinutes().toString().padStart(2,"0"),a=t.getUTCSeconds().toString().padStart(2,"0"),l=e.toString("hex").slice(0,8).padEnd(8,"0");return`dxx-${r}${n}${s}-${o}${i}${a}-${l}`}function NH(t){return kH("sha256").update(t).digest("hex")}async function Qk(t){return(await Promise.all(t.map(async({bundlePath:r,absPath:n})=>{let s=await IH(n);return{path:r,sha256:NH(s),size:s.byteLength}}))).sort((r,n)=>r.path<n.path?-1:r.path>n.path?1:0)}function ev(t){return{ticket_id:t.ticketId,lmctl_next_version:t.lmctlNextVersion,node_version:t.nodeVersion,platform:t.platform,generated_at:t.generatedAt.toISOString(),sanitized:t.sanitized,files:t.files}}var lm=T(()=>{"use strict"});import{spawnSync as tv}from"node:child_process";import{mkdir as cm,writeFile as rv,readFile as xH,rm as nv}from"node:fs/promises";import{tmpdir as AH}from"node:os";import{dirname as sv,join as um}from"node:path";async function ov(t){let e=t.stagingDir??um(AH(),`lmctl-diag-${t.ticketId}`),r=um(e,`diagnostic-${t.ticketId}`);await cm(r,{recursive:!0});let n=[],s=async(d,f)=>{let m=um(r,d);if(await cm(sv(m),{recursive:!0}),typeof f=="string")await rv(m,f);else{let p=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);await rv(m,new Uint8Array(p))}n.push({bundlePath:d,absPath:m})},o=d=>`${JSON.stringify(d,null,2)}
2575
+ `});import{createHash as IH,randomBytes as NH}from"node:crypto";import{readFile as xH}from"node:fs/promises";function Zk(t=new Date,e=NH(4)){let r=t.getUTCFullYear().toString().padStart(4,"0"),n=(t.getUTCMonth()+1).toString().padStart(2,"0"),s=t.getUTCDate().toString().padStart(2,"0"),o=t.getUTCHours().toString().padStart(2,"0"),i=t.getUTCMinutes().toString().padStart(2,"0"),a=t.getUTCSeconds().toString().padStart(2,"0"),l=e.toString("hex").slice(0,8).padEnd(8,"0");return`dxx-${r}${n}${s}-${o}${i}${a}-${l}`}function AH(t){return IH("sha256").update(t).digest("hex")}async function Qk(t){return(await Promise.all(t.map(async({bundlePath:r,absPath:n})=>{let s=await xH(n);return{path:r,sha256:AH(s),size:s.byteLength}}))).sort((r,n)=>r.path<n.path?-1:r.path>n.path?1:0)}function ev(t){return{ticket_id:t.ticketId,lmctl_next_version:t.lmctlNextVersion,node_version:t.nodeVersion,platform:t.platform,generated_at:t.generatedAt.toISOString(),sanitized:t.sanitized,files:t.files}}var lm=T(()=>{"use strict"});import{spawnSync as tv}from"node:child_process";import{mkdir as cm,writeFile as rv,readFile as RH,rm as nv}from"node:fs/promises";import{tmpdir as $H}from"node:os";import{dirname as sv,join as um}from"node:path";async function ov(t){let e=t.stagingDir??um($H(),`lmctl-diag-${t.ticketId}`),r=um(e,`diagnostic-${t.ticketId}`);await cm(r,{recursive:!0});let n=[],s=async(d,f)=>{let m=um(r,d);if(await cm(sv(m),{recursive:!0}),typeof f=="string")await rv(m,f);else{let p=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);await rv(m,new Uint8Array(p))}n.push({bundlePath:d,absPath:m})},o=d=>`${JSON.stringify(d,null,2)}
2576
2576
  `;if(t.data.serve!==void 0){let d=t.data.serve,f=d.pid===null?`no daemon (source=${d.pid_source})
2577
2577
  `:`${d.pid}
2578
2578
  # source=${d.pid_source} alive=${String(d.pid_alive)}
@@ -2590,31 +2590,31 @@ If project create omits --local-path, project.docroot must be configured.
2590
2590
  `:`# source=${f}
2591
2591
  # tail_lines=${d.tail_lines}
2592
2592
  `;await s("intents/recent.log",`${m}${d.tail}${d.tail.length>0?`
2593
- `:""}`)}if(await s("README.md",RH(t)),t.sanitized)for(let d of n){let f=await xH(d.absPath);try{Im(d.bundlePath,f.toString("utf8"))}catch(m){throw await nv(e,{recursive:!0,force:!0}),m instanceof kr,m}}let i=await Qk(n),a=ev({ticketId:t.ticketId,lmctlNextVersion:t.lmctlNextVersion,nodeVersion:process.version,platform:process.platform,generatedAt:t.generatedAt??new Date,sanitized:t.sanitized,files:i});await s("manifest.json",o(a)),await cm(sv(t.outputPath),{recursive:!0});let l=tv("tar",["-czf",t.outputPath,"-C",e,`diagnostic-${t.ticketId}`],{encoding:"utf8"});if(l.status!==0)throw new Error(`tar failed (status=${l.status}): ${l.stderr??""}`);let c=tv("stat",["-c","%s",t.outputPath],{encoding:"utf8"}),u=Number.parseInt((c.stdout??"0").trim(),10)||0;return await nv(e,{recursive:!0,force:!0}),{outputPath:t.outputPath,manifest:a,bundleSizeBytes:u}}function RH(t){let e=Object.keys(t.data).sort().join(", ")||"(none)";return[`# Diagnostic Bundle ${t.ticketId}`,"",`Generated by lmctl ${t.lmctlNextVersion}.`,"",`Sections included: ${e}`,`Sanitized: ${t.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(`
2594
- `)}var iv=T(()=>{"use strict";lm();lo()});import{spawnSync as $H}from"node:child_process";import{stat as jH}from"node:fs/promises";async function av(t){try{if(!(await jH(t.bundlePath)).isFile())return{mode:t.mode,ok:!1,message:`bundle not a regular file: ${t.bundlePath}`}}catch(e){return{mode:t.mode,ok:!1,message:`bundle missing: ${e instanceof Error?e.message:String(e)}`}}switch(t.mode){case"local":return{mode:"local",ok:!0,message:`bundle written: ${t.bundlePath}`,destination:t.bundlePath};case"internal-s3":return LH(t);case"hq":return OH(t)}}function LH(t){let r=$H("which",["aws"],{encoding:"utf8"}).status===0,s=`${t.s3Prefix??"s3://lmctl/diagnostics/"}${t.ticketId}.tar.gz`;return r?{mode:"internal-s3",ok:!0,message:`STUB (no actual upload performed): would run \`aws s3 cp ${t.bundlePath} ${s}\``,destination:s}:{mode:"internal-s3",ok:!1,message:`aws CLI not available; would upload ${t.bundlePath} -> ${s}`,destination:s}}function OH(t){let e=t.hqUrl??"https://lmctl.anthropic.com";return{mode:"hq",ok:!1,message:`headquarter upload not implemented in MVP; would POST to ${e}/diagnostics/init with ticket ${t.ticketId}`,destination:e}}var lv=T(()=>{"use strict"});var uv={};ae(uv,{parseDiagnoseArgs:()=>cv,runDiagnose:()=>DH});import{tmpdir as CH}from"node:os";import{join as MH}from"node:path";async function DH(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${UH()}
2593
+ `:""}`)}if(await s("README.md",LH(t)),t.sanitized)for(let d of n){let f=await RH(d.absPath);try{Im(d.bundlePath,f.toString("utf8"))}catch(m){throw await nv(e,{recursive:!0,force:!0}),m instanceof kr,m}}let i=await Qk(n),a=ev({ticketId:t.ticketId,lmctlNextVersion:t.lmctlNextVersion,nodeVersion:process.version,platform:process.platform,generatedAt:t.generatedAt??new Date,sanitized:t.sanitized,files:i});await s("manifest.json",o(a)),await cm(sv(t.outputPath),{recursive:!0});let l=tv("tar",["-czf",t.outputPath,"-C",e,`diagnostic-${t.ticketId}`],{encoding:"utf8"});if(l.status!==0)throw new Error(`tar failed (status=${l.status}): ${l.stderr??""}`);let c=tv("stat",["-c","%s",t.outputPath],{encoding:"utf8"}),u=Number.parseInt((c.stdout??"0").trim(),10)||0;return await nv(e,{recursive:!0,force:!0}),{outputPath:t.outputPath,manifest:a,bundleSizeBytes:u}}function LH(t){let e=Object.keys(t.data).sort().join(", ")||"(none)";return[`# Diagnostic Bundle ${t.ticketId}`,"",`Generated by lmctl ${t.lmctlNextVersion}.`,"",`Sections included: ${e}`,`Sanitized: ${t.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(`
2594
+ `)}var iv=T(()=>{"use strict";lm();co()});import{spawnSync as jH}from"node:child_process";import{stat as OH}from"node:fs/promises";async function av(t){try{if(!(await OH(t.bundlePath)).isFile())return{mode:t.mode,ok:!1,message:`bundle not a regular file: ${t.bundlePath}`}}catch(e){return{mode:t.mode,ok:!1,message:`bundle missing: ${e instanceof Error?e.message:String(e)}`}}switch(t.mode){case"local":return{mode:"local",ok:!0,message:`bundle written: ${t.bundlePath}`,destination:t.bundlePath};case"internal-s3":return CH(t);case"hq":return MH(t)}}function CH(t){let r=jH("which",["aws"],{encoding:"utf8"}).status===0,s=`${t.s3Prefix??"s3://lmctl/diagnostics/"}${t.ticketId}.tar.gz`;return r?{mode:"internal-s3",ok:!0,message:`STUB (no actual upload performed): would run \`aws s3 cp ${t.bundlePath} ${s}\``,destination:s}:{mode:"internal-s3",ok:!1,message:`aws CLI not available; would upload ${t.bundlePath} -> ${s}`,destination:s}}function MH(t){let e=t.hqUrl??"https://lmctl.anthropic.com";return{mode:"hq",ok:!1,message:`headquarter upload not implemented in MVP; would POST to ${e}/diagnostics/init with ticket ${t.ticketId}`,destination:e}}var lv=T(()=>{"use strict"});var uv={};le(uv,{parseDiagnoseArgs:()=>cv,runDiagnose:()=>FH});import{tmpdir as DH}from"node:os";import{join as PH}from"node:path";async function FH(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${BH()}
2595
2595
  `),0;let r=cv(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
2596
2596
  `),2;if(r.noSanitize&&(r.upload||r.internalS3||r.hqUrl!==void 0))return e.stderr.write(`error: --no-sanitize is incompatible with upload modes (--upload/--internal-s3/--hq)
2597
2597
  `),2;if(r.upload&&r.internalS3)return e.stderr.write(`error: pick one of --upload (HQ) or --internal-s3, not both
2598
- `),2;let n=Zk(),s=r.outputPath??FH(n),o=r.internalS3?"internal-s3":r.upload?"hq":"local";try{return await L(e,async i=>{let a=await xm({dal:i,include:r.include,dbPath:de(),intentLog:process.env.LMCTL_INTENT_LOG}),l;try{l=await ov({ticketId:n,data:a,outputPath:s,lmctlNextVersion:wt(),sanitized:!r.noSanitize})}catch(d){if(d instanceof kr)return e.stderr.write(`sanitization failed: ${d.message}
2598
+ `),2;let n=Zk(),s=r.outputPath??WH(n),o=r.internalS3?"internal-s3":r.upload?"hq":"local";try{return await j(e,async i=>{let a=await xm({dal:i,include:r.include,dbPath:de(),intentLog:process.env.LMCTL_INTENT_LOG}),l;try{l=await ov({ticketId:n,data:a,outputPath:s,lmctlNextVersion:wt(),sanitized:!r.noSanitize})}catch(d){if(d instanceof kr)return e.stderr.write(`sanitization failed: ${d.message}
2599
2599
  `),2;throw d}let c=await av({mode:o,bundlePath:l.outputPath,ticketId:n,hqUrl:r.hqUrl}),u={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?e.stdout.write(`${JSON.stringify(u,null,2)}
2600
2600
  `):(e.stdout.write(`ticket: ${n}
2601
2601
  `),e.stdout.write(`bundle: ${l.outputPath} (${l.bundleSizeBytes} bytes, ${l.manifest.files.length} files)
2602
2602
  `),e.stdout.write(`upload[${c.mode}]: ${c.ok?"ok":"noop"} \u2014 ${c.message}
2603
2603
  `)),c.ok||o==="local"?0:1})}catch(i){return e.stderr.write(`diagnose failed: ${i instanceof Error?i.message:String(i)}
2604
- `),1}}function cv(t){let e={upload:!1,internalS3:!1,noSanitize:!1,json:!1},r=[];for(let n=0;n<t.length;n+=1){let s=t[n];if(s==="--output"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --output";e.outputPath=o;continue}if(s==="--upload"){e.upload=!0;continue}if(s==="--internal-s3"){e.internalS3=!0;continue}if(s==="--hq"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --hq";e.hqUrl=o,e.upload=!0;continue}if(s==="--include"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --include";if(!PH(o))return`unknown section: ${o} (expected one of ${co.join(", ")})`;r.push(o);continue}if(s==="--no-sanitize"){e.noSanitize=!0;continue}if(s==="--json"){e.json=!0;continue}if(!(s==="--help"||s==="-h"))return`unknown argument: ${s}`}return r.length>0&&(e.include=r),e}function PH(t){return co.includes(t)}function FH(t){return MH(CH(),`lmctl-diag-${t}.tar.gz`)}function UH(){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(`
2605
- `)}var dv=T(()=>{"use strict";Xn();iv();lm();lo();lv();ze();Te()});var gv={};ae(gv,{ATTENTION_STATES:()=>mm,DAEMON_INTERVAL_FAST_MS:()=>fm,REQUIRED_TEAM_ALIASES:()=>fv,chooseDiagnoses:()=>hv,collectEvidence:()=>pv,diagnose:()=>mv,renderReport:()=>_v,runDiagnosePrompt:()=>HH});function mv(t,e){let r=pv(t,e),n=hv(r);return _v(r,n)}function pv(t,e){let r=e.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:Us(),lastTickAt:null}},s=null;try{s=t.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=BH(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 o=t.getJob(n.prompt.job_id);if(o!==null&&(n.job.exists=!0,n.job.status=o.status,n.job.attempt_count=o.attempt_count,n.job.last_error=o.last_error,n.job.available_at=o.available_at,n.job.locked_by=o.locked_by,n.job.run_id=o.run_id,o.run_id!==null))try{let i=t.getRun(o.run_id);if(i!==null){n.run.exists=!0,n.run.id=i.id,n.run.current_state=i.current_state,n.run.terminal_state=i.terminal_state,n.run.started_at=i.started_at,n.run.ended_at=i.ended_at;let a="__paused__:";n.run.paused_step=i.current_state!==null&&i.current_state.startsWith(a)?i.current_state.slice(a.length):null,n.run.paused_at=i.paused_at}}catch{n.run.sectionAvailable=!1}}catch{n.job.sectionAvailable=!1}if(n.prompt.project_id!==void 0)try{let o=t.getProject(n.prompt.project_id);if(o!==null){n.project.exists=!0,n.project.id=o.id,n.project.name=o.name,n.project.local_path=o.local_path,n.project.test_command=o.test_command,n.project.workflow_name=o.workflow_name,n.project.team_id=o.team_id;try{n.project.workflow_name_resolves=t.getWorkflowByName(o.workflow_name)!==null}catch{n.project.workflow_name_resolves=!1}}}catch{n.project.sectionAvailable=!1}if(n.project.id!==void 0)try{let o=t.listProjectWorkflows(n.project.id);n.workflows.count=o.length;for(let i of o){let a=`workflow_id=${i.workflow_id}`,l=0,c=null;try{let d=t.listWorkflows().find(f=>f.id===i.workflow_id);d!==void 0&&(a=d.name,l=d.version,c=d.source_uri)}catch{}n.workflows.rows.push({workflow_name:a,version:l,enabled:i.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 o=t.listTeamMembers(n.project.team_id);for(let a of o)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 i=new Set(o.map(a=>a.alias));n.team.missingAliases=fv.filter(a=>!i.has(a))}catch{n.team.sectionAvailable=!1}return n.daemon.workerPid=null,n.daemon.lastTickAt=null,n}function hv(t){let e=[];if(t.dispatch.sectionAvailable&&!t.dispatch.rowExists)return e.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"}),e;t.dispatch.rowExists&&t.job.exists&&(t.job.run_id===null||t.job.run_id===void 0)&&!t.run.exists&&e.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)"}),t.daemon.intervalMs>fm&&e.push({cause:`Daemon poll interval is ${t.daemon.intervalMs}ms (${Math.round(t.daemon.intervalMs/1e3)}s); WT/dev expected <=${fm}ms`,action:"Set LMCTL_DAEMON_INTERVAL_MS=5000 (or lower) in the agent's env before relaunching `lmctl-next-agent`"}),t.project.exists&&t.workflows.sectionAvailable&&t.workflows.count===0&&t.project.workflow_name_resolves!==!0&&e.push({cause:`Project ${t.project.name??`id=${t.project.id??"?"}`} has 0 workflows registered AND project.workflow_name does not resolve; engine can't dispatch`,action:"Run `lmctl workflow load <name>` then `lmctl project bind <project> <workflow>` (or check the v4-project bootstrap path)"}),t.team.sectionAvailable&&t.team.missingAliases.length>0&&e.push({cause:`Default team (team_id=${t.team.teamId??"?"}) missing required aliases: ${t.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=t.team.sectionAvailable?t.team.members.filter(s=>mm.has(s.state)):[];if(t.run.exists&&(t.run.paused_step??null)!==null||r.length>0){let s=t.run.paused_step??null,o=r.map(a=>a.alias).join(", "),i=s!==null&&o.length>0?`Run paused at ${s} awaiting operator escalation decision (member ${o} attention_needed)`:s!==null?`Run paused at ${s} awaiting operator escalation decision`:`Team member(s) ${o} awaiting operator attention`;e.push({cause:i,action:"Open the run in the SPA escalations panel (paused badge) or resolve via the operator-resume verb"})}return t.dispatch.rowExists&&t.job.exists&&!t.run.exists&&t.daemon.workerPid===null&&e.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"}),e.slice(0,3)}function _v(t,e){let r=[];if(r.push(`DIAGNOSE ${t.promptId}`),r.push(""),r.push("[PROMPT]"),t.prompt.exists?(r.push(` id: ${t.promptId}`),r.push(` project_id: ${t.prompt.project_id??"?"}`),r.push(` text: ${t.prompt.text_preview??"?"}`),r.push(` created_at: ${t.prompt.created_at??"?"}`),r.push(` completed_at: ${t.prompt.completed_at??"null"}`)):r.push(" not present in prompt_dispatch table"),r.push(""),r.push("[PROMPT_DISPATCH]"),t.dispatch.sectionAvailable?(r.push(` row exists in prompt_dispatch table: ${t.dispatch.rowExists?"YES":"NO"}`),t.dispatch.rowExists&&(r.push(` job_id: ${t.prompt.job_id??"?"}`),r.push(` dispatched_at: ${t.prompt.created_at??"?"}`),r.push(` last_seen_status: ${WH(t)}`))):r.push(" table not present (schema variation)"),r.push(""),r.push("[PROMPT_RUN]"),t.job.sectionAvailable?t.job.exists?t.run.exists?(r.push(" row exists in prompt_runs table: YES"),r.push(` run_id: ${t.run.id??"?"}`),r.push(` current_step: ${t.run.current_state??"null"}`),r.push(` status: ${t.run.terminal_state??"in_progress"}`),r.push(` started_at: ${t.run.started_at??"?"}`),r.push(` attempts: ${t.job.attempt_count??0}`)):(r.push(" row exists in prompt_runs table: NO"),r.push(` job_id: ${t.prompt.job_id??"?"} status=${t.job.status??"?"} attempts=${t.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]"),t.project.sectionAvailable?t.project.exists?(r.push(` id: ${t.project.id??"?"}`),r.push(` name: ${t.project.name??"?"}`),r.push(` local_path: ${t.project.local_path??"?"}`),r.push(` test_command: ${t.project.test_command??"null"}`),r.push(` default_workflow: ${t.project.workflow_name??"null"}`)):t.prompt.project_id===void 0?r.push(" not resolvable (no project_id on prompt)"):r.push(` not present (id=${t.prompt.project_id})`):r.push(" project table not accessible"),r.push(""),r.push("[WORKFLOWS REGISTERED FOR PROJECT]"),!t.workflows.sectionAvailable)r.push(" project_workflow table not accessible");else if(t.workflows.count===0&&t.project.exists&&t.project.workflow_name_resolves===!0)r.push(` default_workflow_name: ${t.project.workflow_name??"?"} (resolved via project.workflow_name)`),r.push(" project_workflow rows: 0 (uses fallback resolution; expected)");else{r.push(` count: ${t.workflows.count}`);for(let o of t.workflows.rows)r.push(` - ${o.workflow_name} v${o.version} enabled=${o.enabled===1?"true":"false"} source=${o.source_uri??"null"}`)}if(r.push(""),r.push("[TEAM MEMBERS FOR PROJECT'S DEFAULT TEAM]"),!t.team.sectionAvailable)r.push(" team_member table not accessible");else if(t.team.teamId===void 0)r.push(" not resolvable (no team_id on project)");else{t.team.members.length===0&&r.push(" (no members)");for(let o of t.team.members)r.push(` - alias=${o.alias} provider=${o.provider} state=${o.state} sessionid=${o.sessionid??"null"} sessiondir=${o.sessiondir}`);t.team.missingAliases.length>0&&r.push(` ! missing aliases: ${t.team.missingAliases.join(", ")}`)}r.push("");let n=t.team.sectionAvailable?t.team.members.filter(o=>mm.has(o.state)):[],s=t.run.exists?t.run.paused_step??null:null;if(s!==null||n.length>0){if(r.push("[ATTENTION/ESCALATION]"),s!==null){let o=t.run.paused_at??t.run.started_at??"?";r.push(` paused_step: ${s} (started: ${o})`)}if(n.length>0){let o=n.map(i=>`${i.alias} (state=${i.state}${i.state_updated_at?` since ${i.state_updated_at}`:""}${i.state_reason?`, reason="${i.state_reason}"`:""})`).join(", ");r.push(` members awaiting operator: ${o}`)}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: ${t.daemon.workerPid===null?"not observable from CLI":String(t.daemon.workerPid)}`),r.push(` daemon poll interval (LMCTL_DAEMON_INTERVAL_MS env): ${t.daemon.intervalMs}`),r.push(` last daemon tick: ${t.daemon.lastTickAt??"not exposed"}`),r.push(""),r.push("[DIAGNOSIS]"),e.length===0)r.push(" no obvious root cause flagged by the v1 rules (see brief Part 4)");else for(let o of e)r.push(` - ${o.cause}`),r.push(` -> ${o.action}`);return r.join(`
2604
+ `),1}}function cv(t){let e={upload:!1,internalS3:!1,noSanitize:!1,json:!1},r=[];for(let n=0;n<t.length;n+=1){let s=t[n];if(s==="--output"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --output";e.outputPath=o;continue}if(s==="--upload"){e.upload=!0;continue}if(s==="--internal-s3"){e.internalS3=!0;continue}if(s==="--hq"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --hq";e.hqUrl=o,e.upload=!0;continue}if(s==="--include"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --include";if(!UH(o))return`unknown section: ${o} (expected one of ${uo.join(", ")})`;r.push(o);continue}if(s==="--no-sanitize"){e.noSanitize=!0;continue}if(s==="--json"){e.json=!0;continue}if(!(s==="--help"||s==="-h"))return`unknown argument: ${s}`}return r.length>0&&(e.include=r),e}function UH(t){return uo.includes(t)}function WH(t){return PH(DH(),`lmctl-diag-${t}.tar.gz`)}function BH(){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(`
2605
+ `)}var dv=T(()=>{"use strict";Xn();iv();lm();co();lv();ze();Te()});var gv={};le(gv,{ATTENTION_STATES:()=>mm,DAEMON_INTERVAL_FAST_MS:()=>fm,REQUIRED_TEAM_ALIASES:()=>fv,chooseDiagnoses:()=>hv,collectEvidence:()=>pv,diagnose:()=>mv,renderReport:()=>_v,runDiagnosePrompt:()=>JH});function mv(t,e){let r=pv(t,e),n=hv(r);return _v(r,n)}function pv(t,e){let r=e.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:Ws(),lastTickAt:null}},s=null;try{s=t.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=qH(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 o=t.getJob(n.prompt.job_id);if(o!==null&&(n.job.exists=!0,n.job.status=o.status,n.job.attempt_count=o.attempt_count,n.job.last_error=o.last_error,n.job.available_at=o.available_at,n.job.locked_by=o.locked_by,n.job.run_id=o.run_id,o.run_id!==null))try{let i=t.getRun(o.run_id);if(i!==null){n.run.exists=!0,n.run.id=i.id,n.run.current_state=i.current_state,n.run.terminal_state=i.terminal_state,n.run.started_at=i.started_at,n.run.ended_at=i.ended_at;let a="__paused__:";n.run.paused_step=i.current_state!==null&&i.current_state.startsWith(a)?i.current_state.slice(a.length):null,n.run.paused_at=i.paused_at}}catch{n.run.sectionAvailable=!1}}catch{n.job.sectionAvailable=!1}if(n.prompt.project_id!==void 0)try{let o=t.getProject(n.prompt.project_id);if(o!==null){n.project.exists=!0,n.project.id=o.id,n.project.name=o.name,n.project.local_path=o.local_path,n.project.test_command=o.test_command,n.project.workflow_name=o.workflow_name,n.project.team_id=o.team_id;try{n.project.workflow_name_resolves=t.getWorkflowByName(o.workflow_name)!==null}catch{n.project.workflow_name_resolves=!1}}}catch{n.project.sectionAvailable=!1}if(n.project.id!==void 0)try{let o=t.listProjectWorkflows(n.project.id);n.workflows.count=o.length;for(let i of o){let a=`workflow_id=${i.workflow_id}`,l=0,c=null;try{let d=t.listWorkflows().find(f=>f.id===i.workflow_id);d!==void 0&&(a=d.name,l=d.version,c=d.source_uri)}catch{}n.workflows.rows.push({workflow_name:a,version:l,enabled:i.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 o=t.listTeamMembers(n.project.team_id);for(let a of o)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 i=new Set(o.map(a=>a.alias));n.team.missingAliases=fv.filter(a=>!i.has(a))}catch{n.team.sectionAvailable=!1}return n.daemon.workerPid=null,n.daemon.lastTickAt=null,n}function hv(t){let e=[];if(t.dispatch.sectionAvailable&&!t.dispatch.rowExists)return e.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"}),e;t.dispatch.rowExists&&t.job.exists&&(t.job.run_id===null||t.job.run_id===void 0)&&!t.run.exists&&e.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)"}),t.daemon.intervalMs>fm&&e.push({cause:`Daemon poll interval is ${t.daemon.intervalMs}ms (${Math.round(t.daemon.intervalMs/1e3)}s); WT/dev expected <=${fm}ms`,action:"Set LMCTL_DAEMON_INTERVAL_MS=5000 (or lower) in the agent's env before relaunching `lmctl-next-agent`"}),t.project.exists&&t.workflows.sectionAvailable&&t.workflows.count===0&&t.project.workflow_name_resolves!==!0&&e.push({cause:`Project ${t.project.name??`id=${t.project.id??"?"}`} has 0 workflows registered AND project.workflow_name does not resolve; engine can't dispatch`,action:"Run `lmctl workflow load <name>` then `lmctl project bind <project> <workflow>` (or check the v4-project bootstrap path)"}),t.team.sectionAvailable&&t.team.missingAliases.length>0&&e.push({cause:`Default team (team_id=${t.team.teamId??"?"}) missing required aliases: ${t.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=t.team.sectionAvailable?t.team.members.filter(s=>mm.has(s.state)):[];if(t.run.exists&&(t.run.paused_step??null)!==null||r.length>0){let s=t.run.paused_step??null,o=r.map(a=>a.alias).join(", "),i=s!==null&&o.length>0?`Run paused at ${s} awaiting operator escalation decision (member ${o} attention_needed)`:s!==null?`Run paused at ${s} awaiting operator escalation decision`:`Team member(s) ${o} awaiting operator attention`;e.push({cause:i,action:"Open the run in the SPA escalations panel (paused badge) or resolve via the operator-resume verb"})}return t.dispatch.rowExists&&t.job.exists&&!t.run.exists&&t.daemon.workerPid===null&&e.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"}),e.slice(0,3)}function _v(t,e){let r=[];if(r.push(`DIAGNOSE ${t.promptId}`),r.push(""),r.push("[PROMPT]"),t.prompt.exists?(r.push(` id: ${t.promptId}`),r.push(` project_id: ${t.prompt.project_id??"?"}`),r.push(` text: ${t.prompt.text_preview??"?"}`),r.push(` created_at: ${t.prompt.created_at??"?"}`),r.push(` completed_at: ${t.prompt.completed_at??"null"}`)):r.push(" not present in prompt_dispatch table"),r.push(""),r.push("[PROMPT_DISPATCH]"),t.dispatch.sectionAvailable?(r.push(` row exists in prompt_dispatch table: ${t.dispatch.rowExists?"YES":"NO"}`),t.dispatch.rowExists&&(r.push(` job_id: ${t.prompt.job_id??"?"}`),r.push(` dispatched_at: ${t.prompt.created_at??"?"}`),r.push(` last_seen_status: ${HH(t)}`))):r.push(" table not present (schema variation)"),r.push(""),r.push("[PROMPT_RUN]"),t.job.sectionAvailable?t.job.exists?t.run.exists?(r.push(" row exists in prompt_runs table: YES"),r.push(` run_id: ${t.run.id??"?"}`),r.push(` current_step: ${t.run.current_state??"null"}`),r.push(` status: ${t.run.terminal_state??"in_progress"}`),r.push(` started_at: ${t.run.started_at??"?"}`),r.push(` attempts: ${t.job.attempt_count??0}`)):(r.push(" row exists in prompt_runs table: NO"),r.push(` job_id: ${t.prompt.job_id??"?"} status=${t.job.status??"?"} attempts=${t.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]"),t.project.sectionAvailable?t.project.exists?(r.push(` id: ${t.project.id??"?"}`),r.push(` name: ${t.project.name??"?"}`),r.push(` local_path: ${t.project.local_path??"?"}`),r.push(` test_command: ${t.project.test_command??"null"}`),r.push(` default_workflow: ${t.project.workflow_name??"null"}`)):t.prompt.project_id===void 0?r.push(" not resolvable (no project_id on prompt)"):r.push(` not present (id=${t.prompt.project_id})`):r.push(" project table not accessible"),r.push(""),r.push("[WORKFLOWS REGISTERED FOR PROJECT]"),!t.workflows.sectionAvailable)r.push(" project_workflow table not accessible");else if(t.workflows.count===0&&t.project.exists&&t.project.workflow_name_resolves===!0)r.push(` default_workflow_name: ${t.project.workflow_name??"?"} (resolved via project.workflow_name)`),r.push(" project_workflow rows: 0 (uses fallback resolution; expected)");else{r.push(` count: ${t.workflows.count}`);for(let o of t.workflows.rows)r.push(` - ${o.workflow_name} v${o.version} enabled=${o.enabled===1?"true":"false"} source=${o.source_uri??"null"}`)}if(r.push(""),r.push("[TEAM MEMBERS FOR PROJECT'S DEFAULT TEAM]"),!t.team.sectionAvailable)r.push(" team_member table not accessible");else if(t.team.teamId===void 0)r.push(" not resolvable (no team_id on project)");else{t.team.members.length===0&&r.push(" (no members)");for(let o of t.team.members)r.push(` - alias=${o.alias} provider=${o.provider} state=${o.state} sessionid=${o.sessionid??"null"} sessiondir=${o.sessiondir}`);t.team.missingAliases.length>0&&r.push(` ! missing aliases: ${t.team.missingAliases.join(", ")}`)}r.push("");let n=t.team.sectionAvailable?t.team.members.filter(o=>mm.has(o.state)):[],s=t.run.exists?t.run.paused_step??null:null;if(s!==null||n.length>0){if(r.push("[ATTENTION/ESCALATION]"),s!==null){let o=t.run.paused_at??t.run.started_at??"?";r.push(` paused_step: ${s} (started: ${o})`)}if(n.length>0){let o=n.map(i=>`${i.alias} (state=${i.state}${i.state_updated_at?` since ${i.state_updated_at}`:""}${i.state_reason?`, reason="${i.state_reason}"`:""})`).join(", ");r.push(` members awaiting operator: ${o}`)}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: ${t.daemon.workerPid===null?"not observable from CLI":String(t.daemon.workerPid)}`),r.push(` daemon poll interval (LMCTL_DAEMON_INTERVAL_MS env): ${t.daemon.intervalMs}`),r.push(` last daemon tick: ${t.daemon.lastTickAt??"not exposed"}`),r.push(""),r.push("[DIAGNOSIS]"),e.length===0)r.push(" no obvious root cause flagged by the v1 rules (see brief Part 4)");else for(let o of e)r.push(` - ${o.cause}`),r.push(` -> ${o.action}`);return r.join(`
2606
2606
  `)+`
2607
- `}function WH(t){return t.dispatch.rowExists?t.prompt.completed_at!==null&&t.prompt.completed_at!==void 0?"done":t.job.exists?t.run.exists?t.run.terminal_state!==null&&t.run.terminal_state!==void 0?`terminal:${t.run.terminal_state}`:`running:${t.run.current_state??"?"}`:"pending (no run)":"pending (no job)":"unknown"}function BH(t){let e=t.replace(/\s+/g," ").trim();return e.length<=80?e:`${e.slice(0,80)}...`}async function HH(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${dm()}
2607
+ `}function HH(t){return t.dispatch.rowExists?t.prompt.completed_at!==null&&t.prompt.completed_at!==void 0?"done":t.job.exists?t.run.exists?t.run.terminal_state!==null&&t.run.terminal_state!==void 0?`terminal:${t.run.terminal_state}`:`running:${t.run.current_state??"?"}`:"pending (no run)":"pending (no job)":"unknown"}function qH(t){let e=t.replace(/\s+/g," ").trim();return e.length<=80?e:`${e.slice(0,80)}...`}async function JH(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${dm()}
2608
2608
  `),0;let r=[];for(let s of t){if(s.startsWith("--"))return e.stderr.write(`error: unknown flag: ${s}
2609
2609
  `),e.stderr.write(`${dm()}
2610
2610
  `),2;r.push(s)}if(r.length!==1)return e.stderr.write(`error: expected exactly one positional arg: <prompt_id>
2611
2611
  `),e.stderr.write(`${dm()}
2612
- `),2;let n=r[0];try{return await L(e,s=>(e.stdout.write(mv(s,n)),0))}catch(s){return e.stderr.write(`diagnose-prompt failed: ${s instanceof Error?s.message:String(s)}
2612
+ `),2;let n=r[0];try{return await j(e,s=>(e.stdout.write(mv(s,n)),0))}catch(s){return e.stderr.write(`diagnose-prompt failed: ${s instanceof Error?s.message:String(s)}
2613
2613
  `),1}}function dm(){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(`
2614
- `)}var fv,fm,mm,yv=T(()=>{"use strict";jd();Te();fv=["Coder","Reviewer1","Polisher"],fm=3e4,mm=new Set(["attention_needed","paused","escalation"])});var bv={};ae(bv,{appendIntent:()=>Tv,resolveIntentLogPath:()=>Ev,runStatus:()=>ZH});import{appendFileSync as qH,mkdirSync as JH}from"node:fs";import{homedir as XH}from"node:os";import{dirname as GH,join as KH}from"node:path";function Ev(){return process.env.LMCTL_INTENT_LOG??KH(XH(),".lmctl","recent-intents.log")}function Tv(t){try{let e=Ev();JH(GH(e),{recursive:!0});let r=JSON.stringify({ts:t.ts??new Date().toISOString(),cwd:t.cwd??process.cwd(),verb:t.verb,args:[...t.args]});qH(e,`${r}
2615
- `)}catch{}}async function ZH(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(zH),0;let r=D(t,["--project"],["--web","--json"]);if(r.error!==void 0)return y(e,r.error);if(r.positionals.length>0)return y(e,`unknown argument: ${r.positionals[0]}`);let n=C(r,"--web"),s=A(r,"--project"),o=C(r,"--json");return n&&s!==void 0?y(e,"--web and --project are mutually exclusive"):L(e,i=>{let a=QH(i,{web:n,projectFlag:s,cwd:process.cwd()});if(a.kind==="no-cwd-match")return e.stderr.write(`no project at this path; use --project to specify or cd into a project root.
2614
+ `)}var fv,fm,mm,yv=T(()=>{"use strict";Ld();Te();fv=["Coder","Reviewer1","Polisher"],fm=3e4,mm=new Set(["attention_needed","paused","escalation"])});var bv={};le(bv,{appendIntent:()=>Tv,resolveIntentLogPath:()=>Ev,runStatus:()=>eq});import{appendFileSync as XH,mkdirSync as GH}from"node:fs";import{homedir as KH}from"node:os";import{dirname as VH,join as YH}from"node:path";function Ev(){return process.env.LMCTL_INTENT_LOG??YH(KH(),".lmctl","recent-intents.log")}function Tv(t){try{let e=Ev();GH(VH(e),{recursive:!0});let r=JSON.stringify({ts:t.ts??new Date().toISOString(),cwd:t.cwd??process.cwd(),verb:t.verb,args:[...t.args]});XH(e,`${r}
2615
+ `)}catch{}}async function eq(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(QH),0;let r=D(t,["--project"],["--web","--json"]);if(r.error!==void 0)return y(e,r.error);if(r.positionals.length>0)return y(e,`unknown argument: ${r.positionals[0]}`);let n=C(r,"--web"),s=A(r,"--project"),o=C(r,"--json");return n&&s!==void 0?y(e,"--web and --project are mutually exclusive"):j(e,i=>{let a=tq(i,{web:n,projectFlag:s,cwd:process.cwd()});if(a.kind==="no-cwd-match")return e.stderr.write(`no project at this path; use --project to specify or cd into a project root.
2616
2616
  `),1;if(a.kind==="no-web-focus")return e.stderr.write(`no active webui focus; run lmctl status --web after navigating webui to a project, or omit --web.
2617
- `),1;if(a.kind==="project-not-found")return y(e,`project not found: ${a.name}`);let l=a.project,c=eq(i,l,a.source);return o?U(e,c):e.stdout.write(oq(c)),Tv({verb:"status",args:t}),0})}function QH(t,e){if(e.projectFlag!==void 0){let n=t.findProjectByName(e.projectFlag);return n===null?{kind:"project-not-found",name:e.projectFlag}:{kind:"ok",project:n,source:"project-flag"}}if(e.web){let n=t.getConfig("current.project_name");if(n===null||n.length===0)return{kind:"no-web-focus"};let s=t.findProjectByName(n);return s===null?{kind:"project-not-found",name:n}:{kind:"ok",project:s,source:"web"}}let r=Gf(e.cwd,t);return r===null?{kind:"no-cwd-match"}:{kind:"ok",project:r,source:"cwd"}}function eq(t,e,r){let n=t.getTeam(e.team_id),o=t.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",e.id)[0]??null,i=tq(t,e.id,YH),a=rq(t,e.id),l=nq(t,e.id,VH);return{project:{name:e.name,local_path:e.local_path,workflow_name:e.workflow_name,team_name:n?.name??null},active_run:o===null?null:{id:o.id,current_state:o.current_state,paused_at:o.paused_at,started_at:o.started_at},attentions:{unacked_count:a,recent:i.map(c=>({id:c.id,kind:c.kind,severity:c.severity,payload_summary:sq(c.payload),created_at:c.created_at}))},recent_runs:l.map(c=>({id:c.id,workflow_name:c.workflow_name,current_state:c.current_state,terminal_state:c.terminal_state,started_at:c.started_at,ended_at:c.ended_at})),context_source:r}}function tq(t,e,r){return t.db.prepare("SELECT * FROM attention WHERE project_id = ? AND acknowledged_at IS NULL ORDER BY id DESC LIMIT ?").all(e,r)}function rq(t,e){return t.db.prepare("SELECT COUNT(*) AS n FROM attention WHERE project_id = ? AND acknowledged_at IS NULL").get(e)?.n??0}function nq(t,e,r){return t.db.prepare(`
2617
+ `),1;if(a.kind==="project-not-found")return y(e,`project not found: ${a.name}`);let l=a.project,c=rq(i,l,a.source);return o?U(e,c):e.stdout.write(aq(c)),Tv({verb:"status",args:t}),0})}function tq(t,e){if(e.projectFlag!==void 0){let n=t.findProjectByName(e.projectFlag);return n===null?{kind:"project-not-found",name:e.projectFlag}:{kind:"ok",project:n,source:"project-flag"}}if(e.web){let n=t.getConfig("current.project_name");if(n===null||n.length===0)return{kind:"no-web-focus"};let s=t.findProjectByName(n);return s===null?{kind:"project-not-found",name:n}:{kind:"ok",project:s,source:"web"}}let r=Gf(e.cwd,t);return r===null?{kind:"no-cwd-match"}:{kind:"ok",project:r,source:"cwd"}}function rq(t,e,r){let n=t.getTeam(e.team_id),o=t.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",e.id)[0]??null,i=nq(t,e.id,ZH),a=sq(t,e.id),l=oq(t,e.id,zH);return{project:{name:e.name,local_path:e.local_path,workflow_name:e.workflow_name,team_name:n?.name??null},active_run:o===null?null:{id:o.id,current_state:o.current_state,paused_at:o.paused_at,started_at:o.started_at},attentions:{unacked_count:a,recent:i.map(c=>({id:c.id,kind:c.kind,severity:c.severity,payload_summary:iq(c.payload),created_at:c.created_at}))},recent_runs:l.map(c=>({id:c.id,workflow_name:c.workflow_name,current_state:c.current_state,terminal_state:c.terminal_state,started_at:c.started_at,ended_at:c.ended_at})),context_source:r}}function nq(t,e,r){return t.db.prepare("SELECT * FROM attention WHERE project_id = ? AND acknowledged_at IS NULL ORDER BY id DESC LIMIT ?").all(e,r)}function sq(t,e){return t.db.prepare("SELECT COUNT(*) AS n FROM attention WHERE project_id = ? AND acknowledged_at IS NULL").get(e)?.n??0}function oq(t,e,r){return t.db.prepare(`
2618
2618
  SELECT r.*, w.name AS workflow_name
2619
2619
  FROM run r
2620
2620
  JOIN job j ON j.id = r.job_id
@@ -2622,14 +2622,14 @@ If project create omits --local-path, project.docroot must be configured.
2622
2622
  WHERE j.project_id = ?
2623
2623
  ORDER BY r.id DESC
2624
2624
  LIMIT ?
2625
- `).all(e,r)}function sq(t){if(t===null||t.length===0)return null;try{let e=JSON.parse(t);if(e!==null&&typeof e=="object"&&!Array.isArray(e)){let r=e,n=["message","detail","reason","action","state"];for(let s of n){let o=r[s];if(typeof o=="string"&&o.length>0)return wv(o,100)}}}catch{}return wv(t,100)}function wv(t,e){return t.length<=e?t:`${t.slice(0,e-1)}\u2026`}function oq(t){let e=[];if(e.push(`project: ${t.project.name}`),e.push(` local_path: ${t.project.local_path}`),e.push(` workflow: ${t.project.workflow_name}`),t.project.team_name!==null&&e.push(` team: ${t.project.team_name}`),e.push(""),t.active_run===null)e.push("active run: none");else{let r=t.active_run.paused_at!==null?`paused at ${t.active_run.current_state??"?"}`:t.active_run.current_state??"unknown";e.push(`active run: #${t.active_run.id} (${r}, started ${t.active_run.started_at})`)}if(e.push(""),t.attentions.unacked_count===0)e.push("attentions: none");else{e.push(`attentions: ${t.attentions.unacked_count} unread`);for(let r of t.attentions.recent){let n=r.payload_summary===null?"":` \u2014 ${r.payload_summary}`;e.push(` - ${r.kind}: #${r.id}${n} (${r.created_at})`)}}if(e.push(""),t.recent_runs.length===0)e.push("recent runs: none");else{e.push("recent runs:");for(let r of t.recent_runs){let n=r.terminal_state??r.current_state??"pending";e.push(` #${r.id} ${r.workflow_name} ${n} (${r.started_at})`)}}return e.push(""),e.join(`
2626
- `)}var VH,YH,zH,Sv=T(()=>{"use strict";Te();Vf();VH=5,YH=10,zH=`usage: lmctl status [--project NAME|--web] [--json]
2625
+ `).all(e,r)}function iq(t){if(t===null||t.length===0)return null;try{let e=JSON.parse(t);if(e!==null&&typeof e=="object"&&!Array.isArray(e)){let r=e,n=["message","detail","reason","action","state"];for(let s of n){let o=r[s];if(typeof o=="string"&&o.length>0)return wv(o,100)}}}catch{}return wv(t,100)}function wv(t,e){return t.length<=e?t:`${t.slice(0,e-1)}\u2026`}function aq(t){let e=[];if(e.push(`project: ${t.project.name}`),e.push(` local_path: ${t.project.local_path}`),e.push(` workflow: ${t.project.workflow_name}`),t.project.team_name!==null&&e.push(` team: ${t.project.team_name}`),e.push(""),t.active_run===null)e.push("active run: none");else{let r=t.active_run.paused_at!==null?`paused at ${t.active_run.current_state??"?"}`:t.active_run.current_state??"unknown";e.push(`active run: #${t.active_run.id} (${r}, started ${t.active_run.started_at})`)}if(e.push(""),t.attentions.unacked_count===0)e.push("attentions: none");else{e.push(`attentions: ${t.attentions.unacked_count} unread`);for(let r of t.attentions.recent){let n=r.payload_summary===null?"":` \u2014 ${r.payload_summary}`;e.push(` - ${r.kind}: #${r.id}${n} (${r.created_at})`)}}if(e.push(""),t.recent_runs.length===0)e.push("recent runs: none");else{e.push("recent runs:");for(let r of t.recent_runs){let n=r.terminal_state??r.current_state??"pending";e.push(` #${r.id} ${r.workflow_name} ${n} (${r.started_at})`)}}return e.push(""),e.join(`
2626
+ `)}var zH,ZH,QH,Sv=T(()=>{"use strict";Te();Vf();zH=5,ZH=10,QH=`usage: lmctl status [--project NAME|--web] [--json]
2627
2627
 
2628
2628
  Show the current project context, active run, unacked attentions, and recent
2629
2629
  runs. Defaults to resolving the project from the current working directory;
2630
2630
  --project selects a project by name, and --web uses the web UI focus.
2631
- `});ze();Xn();Ie();import{pathToFileURL as iq}from"node:url";Tl();Xn();import{mkdirSync as _I,readFileSync as gI,renameSync as yI,writeFileSync as wI}from"node:fs";import{homedir as EI}from"node:os";import{dirname as TI,join as bI}from"node:path";var SI="https://registry.npmjs.org/@lmctl-ai/lmctl/latest",kI=60*60*1e3,vI=1500;function II(){let t=process.env.HOME??EI();return bI(t,".lmctl",".update-check.json")}function NI(t){return t.isTTY===!0}function xI(t,e){let r=o=>{let i=/^(\d+)\.(\d+)\.(\d+)(?:$|[-+])/.exec(o.trim());if(i===null)return null;let a=i.slice(1).map(l=>Number(l));return a.some(l=>!Number.isSafeInteger(l)||l<0)?null:a},n=r(t),s=r(e);if(n===null||s===null)return 0;for(let o=0;o<3;o+=1){if(n[o]>s[o])return 1;if(n[o]<s[o])return-1}return 0}function bl(t,e){return!!(process.env.LMCTL_NO_UPDATE_NOTIFIER==="1"||!NI(e.stderr)||t.includes("--json")||t.includes("--help")||t.includes("-h")||t[0]==="help"||t[0]==="mcp")}function AI(t,e){try{let r=JSON.parse(gI(t,"utf8"));if(typeof r.checkedAt=="number"&&Number.isFinite(r.checkedAt)&&typeof r.latest=="string"&&e-r.checkedAt<kI)return r.latest}catch{}return null}function RI(t,e){_I(TI(t),{recursive:!0});let r=`${t}.tmp-${process.pid}-${Math.random().toString(16).slice(2)}`;wI(r,`${JSON.stringify(e)}
2632
- `,"utf8"),yI(r,t)}async function $I(){let t=await mo(SI,{description:"lmctl npm metadata",timeoutMs:vI}),e=JSON.parse(t.toString("utf8"));if(typeof e.version!="string"||e.version.trim()==="")throw new Error("registry response missing version");return e.version}async function Dm(t,e=[],r={}){try{if(bl(e,t))return;let n=r.now?.()??Date.now(),s=r.cachePath??II();if(AI(s,n)!==null)return;let i=await(r.fetchLatest??$I)();try{RI(s,{checkedAt:n,latest:i})}catch{return}let a=r.currentVersion?.()??wt();xI(i,a)>0&&t.stderr.write(`update available: ${a} \u2192 ${i} run: npm i -g @lmctl-ai/lmctl@latest
2631
+ `});ze();Xn();Ie();import{pathToFileURL as lq}from"node:url";Tl();Xn();import{mkdirSync as _I,readFileSync as gI,renameSync as yI,writeFileSync as wI}from"node:fs";import{homedir as EI}from"node:os";import{dirname as TI,join as bI}from"node:path";var SI="https://registry.npmjs.org/@lmctl-ai/lmctl/latest",kI=60*60*1e3,vI=1500;function II(){let t=process.env.HOME??EI();return bI(t,".lmctl",".update-check.json")}function NI(t){return t.isTTY===!0}function xI(t,e){let r=o=>{let i=/^(\d+)\.(\d+)\.(\d+)(?:$|[-+])/.exec(o.trim());if(i===null)return null;let a=i.slice(1).map(l=>Number(l));return a.some(l=>!Number.isSafeInteger(l)||l<0)?null:a},n=r(t),s=r(e);if(n===null||s===null)return 0;for(let o=0;o<3;o+=1){if(n[o]>s[o])return 1;if(n[o]<s[o])return-1}return 0}function bl(t,e){return!!(process.env.LMCTL_NO_UPDATE_NOTIFIER==="1"||!NI(e.stderr)||t.includes("--json")||t.includes("--help")||t.includes("-h")||t[0]==="help"||t[0]==="mcp")}function AI(t,e){try{let r=JSON.parse(gI(t,"utf8"));if(typeof r.checkedAt=="number"&&Number.isFinite(r.checkedAt)&&typeof r.latest=="string"&&e-r.checkedAt<kI)return r.latest}catch{}return null}function RI(t,e){_I(TI(t),{recursive:!0});let r=`${t}.tmp-${process.pid}-${Math.random().toString(16).slice(2)}`;wI(r,`${JSON.stringify(e)}
2632
+ `,"utf8"),yI(r,t)}async function $I(){let t=await po(SI,{description:"lmctl npm metadata",timeoutMs:vI}),e=JSON.parse(t.toString("utf8"));if(typeof e.version!="string"||e.version.trim()==="")throw new Error("registry response missing version");return e.version}async function Dm(t,e=[],r={}){try{if(bl(e,t))return;let n=r.now?.()??Date.now(),s=r.cachePath??II();if(AI(s,n)!==null)return;let i=await(r.fetchLatest??$I)();try{RI(s,{checkedAt:n,latest:i})}catch{return}let a=r.currentVersion?.()??wt();xI(i,a)>0&&t.stderr.write(`update available: ${a} \u2192 ${i} run: npm i -g @lmctl-ai/lmctl@latest
2633
2633
  `)}catch{}}var Un=`usage: lmctl [--db PATH] [--workspace NAME] [--debug] <command> [args]
2634
2634
  `,pm=`${Un}
2635
2635
  Setup & status:
@@ -2687,14 +2687,14 @@ ${Un}Run 'lmctl help' for usage.
2687
2687
  ${Un}Run 'lmctl help' for usage.
2688
2688
  `),1):(t.stderr.write(`error: unknown command: ${e}
2689
2689
  ${Un}Run 'lmctl help' for usage.
2690
- `),1)}async function aq(t,e={stdout:process.stdout,stderr:process.stderr}){let r=Lm();try{return await lq(t,e)}finally{Om(r)}}async function lq(t,e={stdout:process.stdout,stderr:process.stderr}){let r=[];for(let a=0;a<t.length;a+=1){let l=t[a];if(l==="--db"){let c=t[++a];if(c===void 0||c.startsWith("--"))return hm(e,"missing value for --db");process.env.LMCTL_DB=c;continue}if(l==="--workspace"){let c=t[++a];if(c===void 0||c.startsWith("--"))return hm(e,"missing value for --workspace");if(!Je(c))return hm(e,`invalid workspace name: ${c}`);process.env.LMCTL_WORKSPACE=c;continue}if(l==="--debug"){jm();continue}r.push(l)}let n=r[0];if(n==="--version"||n==="-v"||n==="-V")return e.stdout.write(`lmctl ${wt()}
2691
- `),0;if(n==="--help"||n==="-h"||n===void 0)return e.stdout.write(pm),0;if(n==="help"){let[a,...l]=r.slice(1);return a===void 0||a==="--help"||a==="-h"?(e.stdout.write(pm),0):kv.has(a)?vv(a,[...l,"--help"],e):Iv(e,a)}Em(de(),e.stderr),bm(e.stderr);let[s,...o]=r;if(s===void 0)return e.stdout.write(pm),0;let i=Date.now();_m(s,o,{phase:"start",started_at:new Date(i).toISOString()});try{let a=await vv(s,o,e);return _m(s,o,{phase:"finish",outcome:a===0?"ok":"error",exit_code:a,duration_ms:Date.now()-i}),kv.has(s)&&!bl(r,e)&&await Dm(e,r),a}catch(a){let l=a instanceof Error?a:new Error(String(a));return _m(s,o,{phase:"fatal",outcome:"fatal",exit_code:1,duration_ms:Date.now()-i,error_class:l.name,error_message:l.message,error_stack:l.stack??null,causes:uq(l)}),cq(a,s,o,e)}}function _m(t,e,r){Xe({event:t,record_kind:"cli_action",command:t,argv:e,cwd:process.cwd(),db_path:de(),workspace:process.env.LMCTL_WORKSPACE??null,lmctl_version:wt(),node_version:process.version,...r})}function cq(t,e,r,n){let s=t instanceof Error?t:new Error(String(t));return n.stderr.write(`error: ${s.message}
2690
+ `),1)}async function cq(t,e={stdout:process.stdout,stderr:process.stderr}){let r=jm();try{return await uq(t,e)}finally{Om(r)}}async function uq(t,e={stdout:process.stdout,stderr:process.stderr}){let r=[];for(let a=0;a<t.length;a+=1){let l=t[a];if(l==="--db"){let c=t[++a];if(c===void 0||c.startsWith("--"))return hm(e,"missing value for --db");process.env.LMCTL_DB=c;continue}if(l==="--workspace"){let c=t[++a];if(c===void 0||c.startsWith("--"))return hm(e,"missing value for --workspace");if(!Je(c))return hm(e,`invalid workspace name: ${c}`);process.env.LMCTL_WORKSPACE=c;continue}if(l==="--debug"){Lm();continue}r.push(l)}let n=r[0];if(n==="--version"||n==="-v"||n==="-V")return e.stdout.write(`lmctl ${wt()}
2691
+ `),0;if(n==="--help"||n==="-h"||n===void 0)return e.stdout.write(pm),0;if(n==="help"){let[a,...l]=r.slice(1);return a===void 0||a==="--help"||a==="-h"?(e.stdout.write(pm),0):kv.has(a)?vv(a,[...l,"--help"],e):Iv(e,a)}Em(de(),e.stderr),bm(e.stderr);let[s,...o]=r;if(s===void 0)return e.stdout.write(pm),0;let i=Date.now();_m(s,o,{phase:"start",started_at:new Date(i).toISOString()});try{let a=await vv(s,o,e);return _m(s,o,{phase:"finish",outcome:a===0?"ok":"error",exit_code:a,duration_ms:Date.now()-i}),kv.has(s)&&!bl(r,e)&&await Dm(e,r),a}catch(a){let l=a instanceof Error?a:new Error(String(a));return _m(s,o,{phase:"fatal",outcome:"fatal",exit_code:1,duration_ms:Date.now()-i,error_class:l.name,error_message:l.message,error_stack:l.stack??null,causes:fq(l)}),dq(a,s,o,e)}}function _m(t,e,r){Xe({event:t,record_kind:"cli_action",command:t,argv:e,cwd:process.cwd(),db_path:de(),workspace:process.env.LMCTL_WORKSPACE??null,lmctl_version:wt(),node_version:process.version,...r})}function dq(t,e,r,n){let s=t instanceof Error?t:new Error(String(t));return n.stderr.write(`error: ${s.message}
2692
2692
  `),Cm()?(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 uq(t){let e=[],r=t.cause,n=0;for(;r!=null&&n<8;){let s=r instanceof Error?r:new Error(String(r));e.push({error_class:s.name,error_message:s.message,error_stack:s.stack??null}),r=s.cause,n+=1}return e}async function vv(t,e,r){switch(t){case"api":{let{runApi:n}=await Promise.resolve().then(()=>(Qc(),d_));return n(e,r)}case"code":{let{runCode:n}=await Promise.resolve().then(()=>(wu(),tg));return n(e,r)}case"serve":{let{runServe:n}=await Promise.resolve().then(()=>(mb(),fb));return n(e,r)}case"intake":{let{runIntake:n}=await Promise.resolve().then(()=>(hb(),pb));return n(e,r)}case"chat":{let{runChat:n}=await Promise.resolve().then(()=>(nS(),rS));return n(e,r)}case"recover":{let{runRecover:n}=await Promise.resolve().then(()=>(cS(),lS));return n(e,r)}case"mcp":{let{runMcp:n}=await Promise.resolve().then(()=>(_S(),hS));return n(e,r)}case"monitor":{let{runMonitor:n}=await Promise.resolve().then(()=>(kS(),SS));return n(e,r)}case"device":{let{runDevice:n}=await Promise.resolve().then(()=>(IS(),vS));return n(e,r)}case"team":{let{runTeam:n}=await Promise.resolve().then(()=>(AS(),xS));return n(e,r)}case"tail":{let{runTail:n}=await Promise.resolve().then(()=>(DS(),MS));return n(e,r)}case"health":{let{runInfo:n}=await Promise.resolve().then(()=>(JS(),qS));return n(e,r)}case"ls":{let{runLs:n}=await Promise.resolve().then(()=>(KS(),GS));return n(e,r)}case"lint":{let{runLint:n}=await Promise.resolve().then(()=>(no(),ro));return n(e,r)}case"seed":{let{runSeed:n}=await Promise.resolve().then(()=>(no(),ro));return n(e,r)}case"hire":{let{runHire:n}=await Promise.resolve().then(()=>(no(),ro));return n(e,r)}case"refresh":{let{runRefresh:n}=await Promise.resolve().then(()=>(no(),ro));return n(e,r)}case"clone":{let{runClone:n}=await Promise.resolve().then(()=>(hk(),pk));return n(e,r)}case"plan":{let{runPlan:n}=await Promise.resolve().then(()=>(wk(),yk));return n(e,r)}case"terminal":{let{runTerminal:n}=await Promise.resolve().then(()=>(Sk(),bk));return n(e,r)}case"workflow":{let{runWorkflow:n}=await Promise.resolve().then(()=>(rm(),tm));return n(e,r)}case"run":{let{runWorkflow:n}=await Promise.resolve().then(()=>(rm(),tm));return n(["run",...e],r)}case"workspace":{let{runWorkspace:n}=await Promise.resolve().then(()=>(Gk(),Xk));return n(e,r)}case"project":{let{runProject:n}=await Promise.resolve().then(()=>(zk(),Yk));return n(e,r)}case"diagnose":{let{runDiagnose:n}=await Promise.resolve().then(()=>(dv(),uv));return n(e,r)}case"diagnose-prompt":{let{runDiagnosePrompt:n}=await Promise.resolve().then(()=>(yv(),gv));return n(e,r)}case"status":{let{runStatus:n}=await Promise.resolve().then(()=>(Sv(),bv));return n(e,r)}case"db":return dq(e,r);default:return Iv(r,t)}}function dq(t,e){let[r,...n]=t;return r==="--help"||r==="-h"||r==="help"?(e.stdout.write(`usage: lmctl db downgrade --to <version> --confirm
2694
+ `),1)}function fq(t){let e=[],r=t.cause,n=0;for(;r!=null&&n<8;){let s=r instanceof Error?r:new Error(String(r));e.push({error_class:s.name,error_message:s.message,error_stack:s.stack??null}),r=s.cause,n+=1}return e}async function vv(t,e,r){switch(t){case"api":{let{runApi:n}=await Promise.resolve().then(()=>(Qc(),d_));return n(e,r)}case"code":{let{runCode:n}=await Promise.resolve().then(()=>(wu(),tg));return n(e,r)}case"serve":{let{runServe:n}=await Promise.resolve().then(()=>(mb(),fb));return n(e,r)}case"intake":{let{runIntake:n}=await Promise.resolve().then(()=>(hb(),pb));return n(e,r)}case"chat":{let{runChat:n}=await Promise.resolve().then(()=>(nS(),rS));return n(e,r)}case"recover":{let{runRecover:n}=await Promise.resolve().then(()=>(cS(),lS));return n(e,r)}case"mcp":{let{runMcp:n}=await Promise.resolve().then(()=>(_S(),hS));return n(e,r)}case"monitor":{let{runMonitor:n}=await Promise.resolve().then(()=>(kS(),SS));return n(e,r)}case"device":{let{runDevice:n}=await Promise.resolve().then(()=>(IS(),vS));return n(e,r)}case"team":{let{runTeam:n}=await Promise.resolve().then(()=>(AS(),xS));return n(e,r)}case"tail":{let{runTail:n}=await Promise.resolve().then(()=>(DS(),MS));return n(e,r)}case"health":{let{runInfo:n}=await Promise.resolve().then(()=>(JS(),qS));return n(e,r)}case"ls":{let{runLs:n}=await Promise.resolve().then(()=>(KS(),GS));return n(e,r)}case"lint":{let{runLint:n}=await Promise.resolve().then(()=>(so(),no));return n(e,r)}case"seed":{let{runSeed:n}=await Promise.resolve().then(()=>(so(),no));return n(e,r)}case"hire":{let{runHire:n}=await Promise.resolve().then(()=>(so(),no));return n(e,r)}case"refresh":{let{runRefresh:n}=await Promise.resolve().then(()=>(so(),no));return n(e,r)}case"clone":{let{runClone:n}=await Promise.resolve().then(()=>(hk(),pk));return n(e,r)}case"plan":{let{runPlan:n}=await Promise.resolve().then(()=>(wk(),yk));return n(e,r)}case"terminal":{let{runTerminal:n}=await Promise.resolve().then(()=>(Sk(),bk));return n(e,r)}case"workflow":{let{runWorkflow:n}=await Promise.resolve().then(()=>(rm(),tm));return n(e,r)}case"run":{let{runWorkflow:n}=await Promise.resolve().then(()=>(rm(),tm));return n(["run",...e],r)}case"workspace":{let{runWorkspace:n}=await Promise.resolve().then(()=>(Gk(),Xk));return n(e,r)}case"project":{let{runProject:n}=await Promise.resolve().then(()=>(zk(),Yk));return n(e,r)}case"diagnose":{let{runDiagnose:n}=await Promise.resolve().then(()=>(dv(),uv));return n(e,r)}case"diagnose-prompt":{let{runDiagnosePrompt:n}=await Promise.resolve().then(()=>(yv(),gv));return n(e,r)}case"status":{let{runStatus:n}=await Promise.resolve().then(()=>(Sv(),bv));return n(e,r)}case"db":return mq(e,r);default:return Iv(r,t)}}function mq(t,e){let[r,...n]=t;return r==="--help"||r==="-h"||r==="help"?(e.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"?(e.stderr.write(`not yet implemented; restore from backup, or run lmctl migrate (forward-migrates ok)
2699
2699
  `),1):(e.stderr.write(`usage: lmctl db downgrade --to <version> --confirm
2700
- `),1)}if(process.argv[1]!==void 0&&import.meta.url===iq(process.argv[1]).href){let t=await aq(process.argv.slice(2));process.exitCode=t}export{aq as runCli};
2700
+ `),1)}if(process.argv[1]!==void 0&&import.meta.url===lq(process.argv[1]).href){let t=await cq(process.argv.slice(2));process.exitCode=t}export{cq as runCli};