@lmctl-ai/lmctl 0.1.196 → 0.1.197

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/cli/index.js +262 -262
  2. package/package.json +1 -1
package/dist/cli/index.js CHANGED
@@ -1,19 +1,19 @@
1
- var hI=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var he=(t,e)=>{for(var r in e)hI(t,r,{get:e[r],enumerable:!0})};var vf={};he(vf,{defaultDbPath:()=>wf,describeStateLocation:()=>Zn,isSlowWslMount:()=>Tf,lmctlNextHome:()=>ai,resolveDbPath:()=>Q,warnIfSlowDbPath:()=>pl});import{platform as yf}from"node:os";import{homedir as gI}from"node:os";import{join as Ef}from"node:path";function ai(){let t=process.env.LMCTL_HOME;return t!==void 0&&t.length>0?t:Ef(gI(),yI)}function wf(){return Ef(ai(),EI)}function Q(t){return t!==void 0&&t.length>0?t:process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0?process.env.LMCTL_DB:wf()}function Zn(t){return process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0?`db: ${t} (overridden by --db/LMCTL_DB)`:`db: ${t}`}function Tf(t,e=yf()){return e!=="linux"?!1:t.startsWith("/mnt/c/")||t==="/mnt/c"}function pl(t,e=process.stderr,r=yf()){Tf(t,r)&&e.write(`warning: DB on /mnt/c is slow; consider moving to ~/.lmctl/state.db (set LMCTL_DB or use --db)
1
+ var hI=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var he=(t,e)=>{for(var r in e)hI(t,r,{get:e[r],enumerable:!0})};var vf={};he(vf,{defaultDbPath:()=>wf,describeStateLocation:()=>Zn,isSlowWslMount:()=>Tf,lmctlNextHome:()=>ai,resolveDbPath:()=>Q,warnIfSlowDbPath:()=>fl});import{platform as yf}from"node:os";import{homedir as gI}from"node:os";import{join as Ef}from"node:path";function ai(){let t=process.env.LMCTL_HOME;return t!==void 0&&t.length>0?t:Ef(gI(),yI)}function wf(){return Ef(ai(),EI)}function Q(t){return t!==void 0&&t.length>0?t:process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0?process.env.LMCTL_DB:wf()}function Zn(t){return process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0?`db: ${t} (overridden by --db/LMCTL_DB)`:`db: ${t}`}function Tf(t,e=yf()){return e!=="linux"?!1:t.startsWith("/mnt/c/")||t==="/mnt/c"}function fl(t,e=process.stderr,r=yf()){Tf(t,r)&&e.write(`warning: DB on /mnt/c is slow; consider moving to ~/.lmctl/state.db (set LMCTL_DB or use --db)
2
2
  `)}var yI,EI,Ye=E(()=>{"use strict";yI=".lmctl",EI="state.db"});function SI(t){for(let e of vI)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 bI(t){let e=t.toLowerCase();return!!(e==="::1"||e==="::"||e.startsWith("fe80:")||e.startsWith("fe80::"))}function NI(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 TI)e=e.replace(r,n);return e=e.replace(kI,r=>!NI(r)||SI(r)?r:Sf),e=e.replace(II,r=>bI(r)?r:Sf),e}function es(t){return t.split(`
3
3
  `).map(e=>Qn(e)).join(`
4
- `)}function kf(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:dt}:{key:t,value:Qn(e)}}function or(t){if(typeof t=="string")return Qn(t);if(Array.isArray(t))return t.map(e=>or(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"?dt:or(n):e[r]=or(n)}return e}return t}function If(t,e){for(let{name:r,re:n}of AI){let s=e.match(n);if(s!==null&&!s[0].includes(dt))throw new Lr(t,r)}}var dt,wI,Sf,bf,TI,vI,kI,II,AI,Lr,li=E(()=>{"use strict";dt="[REDACTED]",wI="[REDACTED_EMAIL]",Sf="[REDACTED_IP]",bf="[USER]",TI=[{re:/(authorization\s*[:=]\s*)(bearer\s+[^\s,;"']+)/gi,replacement:`$1Bearer ${dt}`},{re:/(authorization\s*[:=]\s*)(basic\s+[^\s,;"']+)/gi,replacement:`$1Basic ${dt}`},{re:/\b(Bearer\s+)[A-Za-z0-9_\-./+=]{8,}/g,replacement:`$1${dt}`},{re:/\bsk-ant-[A-Za-z0-9_\-]{8,}/g,replacement:dt},{re:/\bsk-[A-Za-z0-9_\-]{16,}/g,replacement:dt},{re:/\bgh[pousr]_[A-Za-z0-9]{30,}/g,replacement:dt},{re:/\bAKIA[0-9A-Z]{16}\b/g,replacement:dt},{re:/\b(api[_-]?key|token|secret|password|passwd)(\s*[:=]\s*"?)([A-Za-z0-9_\-./+=]{8,})("?)/gi,replacement:`$1$2${dt}$4`},{re:/(\/home\/)[^/\s"'`]+/g,replacement:`$1${bf}`},{re:/(\/Users\/)[^/\s"'`]+/g,replacement:`$1${bf}`},{re:/\b[A-Za-z0-9._%+\-]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,}\b/g,replacement:wI}],vI=["127.","10.","192.168.","0.0.0.0"];kI=/\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/g,II=/\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;AI=[{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"'`]+/}],Lr=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 xI}from"node:fs";import{readFile as gl,stat as Nf}from"node:fs/promises";import{homedir as RI}from"node:os";import{join as LI}from"node:path";import{fileURLToPath as OI}from"node:url";function bt(){try{let t=new URL("../../package.json",import.meta.url),e=JSON.parse(xI(OI(t),"utf8"));if(typeof e.version=="string")return e.version}catch{}return"0.0.0"}async function Af(t){let e=new Set(t.include??di),r={};return e.has("serve")&&(r.serve=await CI(t)),e.has("db")&&(r.db=MI(t)),e.has("runs")&&(r.runs=DI(t)),e.has("jobs")&&(r.jobs=jI(t)),e.has("attentions")&&(r.attentions=PI(t)),e.has("env")&&(r.env=await FI(t)),e.has("intents")&&(r.intents=await WI(t)),r}async function CI(t){let e=t.pidFile??process.env.LMCTL_PID_FILE,r=t.serveLog??process.env.LMCTL_SERVE_LOG,n=t.logTailLines??1e3,s=null,i="none";if(e!==void 0)try{let c=(await gl(e,"utf8")).trim(),u=Number.parseInt(c,10);Number.isInteger(u)&&u>0&&(s=u,i="pidfile")}catch{}let o=null;if(s!==null)try{process.kill(s,0),o=!0}catch{o=!1}let a="",l=null,d=0;if(r===void 0)l="no serve log configured (set LMCTL_SERVE_LOG or --serve-log)";else try{let u=(await gl(r,"utf8")).split(`
4
+ `)}function kf(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:dt}:{key:t,value:Qn(e)}}function or(t){if(typeof t=="string")return Qn(t);if(Array.isArray(t))return t.map(e=>or(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"?dt:or(n):e[r]=or(n)}return e}return t}function If(t,e){for(let{name:r,re:n}of AI){let s=e.match(n);if(s!==null&&!s[0].includes(dt))throw new Lr(t,r)}}var dt,wI,Sf,bf,TI,vI,kI,II,AI,Lr,li=E(()=>{"use strict";dt="[REDACTED]",wI="[REDACTED_EMAIL]",Sf="[REDACTED_IP]",bf="[USER]",TI=[{re:/(authorization\s*[:=]\s*)(bearer\s+[^\s,;"']+)/gi,replacement:`$1Bearer ${dt}`},{re:/(authorization\s*[:=]\s*)(basic\s+[^\s,;"']+)/gi,replacement:`$1Basic ${dt}`},{re:/\b(Bearer\s+)[A-Za-z0-9_\-./+=]{8,}/g,replacement:`$1${dt}`},{re:/\bsk-ant-[A-Za-z0-9_\-]{8,}/g,replacement:dt},{re:/\bsk-[A-Za-z0-9_\-]{16,}/g,replacement:dt},{re:/\bgh[pousr]_[A-Za-z0-9]{30,}/g,replacement:dt},{re:/\bAKIA[0-9A-Z]{16}\b/g,replacement:dt},{re:/\b(api[_-]?key|token|secret|password|passwd)(\s*[:=]\s*"?)([A-Za-z0-9_\-./+=]{8,})("?)/gi,replacement:`$1$2${dt}$4`},{re:/(\/home\/)[^/\s"'`]+/g,replacement:`$1${bf}`},{re:/(\/Users\/)[^/\s"'`]+/g,replacement:`$1${bf}`},{re:/\b[A-Za-z0-9._%+\-]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,}\b/g,replacement:wI}],vI=["127.","10.","192.168.","0.0.0.0"];kI=/\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/g,II=/\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;AI=[{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"'`]+/}],Lr=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 pl}from"node:child_process";import{readFileSync as xI}from"node:fs";import{readFile as hl,stat as Nf}from"node:fs/promises";import{homedir as RI}from"node:os";import{join as LI}from"node:path";import{fileURLToPath as OI}from"node:url";function bt(){try{let t=new URL("../../package.json",import.meta.url),e=JSON.parse(xI(OI(t),"utf8"));if(typeof e.version=="string")return e.version}catch{}return"0.0.0"}async function Af(t){let e=new Set(t.include??di),r={};return e.has("serve")&&(r.serve=await CI(t)),e.has("db")&&(r.db=MI(t)),e.has("runs")&&(r.runs=DI(t)),e.has("jobs")&&(r.jobs=jI(t)),e.has("attentions")&&(r.attentions=PI(t)),e.has("env")&&(r.env=await FI(t)),e.has("intents")&&(r.intents=await WI(t)),r}async function CI(t){let e=t.pidFile??process.env.LMCTL_PID_FILE,r=t.serveLog??process.env.LMCTL_SERVE_LOG,n=t.logTailLines??1e3,s=null,i="none";if(e!==void 0)try{let c=(await hl(e,"utf8")).trim(),u=Number.parseInt(c,10);Number.isInteger(u)&&u>0&&(s=u,i="pidfile")}catch{}let o=null;if(s!==null)try{process.kill(s,0),o=!0}catch{o=!1}let a="",l=null,d=0;if(r===void 0)l="no serve log configured (set LMCTL_SERVE_LOG or --serve-log)";else try{let u=(await hl(r,"utf8")).split(`
5
5
  `),m=u.slice(Math.max(0,u.length-n));d=m.length,a=es(m.join(`
6
6
  `))}catch(c){l=`serve log unreadable: ${c instanceof Error?c.message:String(c)}`}return{pid:s,pid_source:i,pid_alive:o,log_tail_lines:d,log_tail:a,log_note:l}}function MI(t){let{dal:e}=t,r="unknown";try{r=e.query("PRAGMA integrity_check;").map(o=>o.integrity_check??JSON.stringify(o)).join(`
7
- `)}catch(i){r=`integrity_check failed: ${i instanceof Error?i.message:String(i)}`}let n=0;try{n=e.query("PRAGMA user_version;")[0]?.user_version??0}catch{n=0}let s={};try{let i=e.query("SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' ORDER BY name");for(let{name:o}of i)try{let a=e.query(`SELECT COUNT(*) AS c FROM "${o.replace(/"/g,'""')}"`);s[o]=a[0]?.c??0}catch{s[o]=-1}}catch{}return{integrity_check:r,schema_version:n,table_counts:s}}function DI(t){let{dal:e}=t,r=(t.now??new Date).toISOString(),n=(t.staleThresholdMin??60)*6e4,s=new Date(Date.parse(r)-n).toISOString(),i=e.query(`SELECT ${hl} FROM run ORDER BY id DESC LIMIT 50`),o=e.query(`SELECT ${hl} FROM run WHERE paused_at IS NOT NULL AND terminal_state IS NULL ORDER BY paused_at DESC LIMIT 50`),a=e.query(`SELECT ${hl} FROM run
7
+ `)}catch(i){r=`integrity_check failed: ${i instanceof Error?i.message:String(i)}`}let n=0;try{n=e.query("PRAGMA user_version;")[0]?.user_version??0}catch{n=0}let s={};try{let i=e.query("SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' ORDER BY name");for(let{name:o}of i)try{let a=e.query(`SELECT COUNT(*) AS c FROM "${o.replace(/"/g,'""')}"`);s[o]=a[0]?.c??0}catch{s[o]=-1}}catch{}return{integrity_check:r,schema_version:n,table_counts:s}}function DI(t){let{dal:e}=t,r=(t.now??new Date).toISOString(),n=(t.staleThresholdMin??60)*6e4,s=new Date(Date.parse(r)-n).toISOString(),i=e.query(`SELECT ${_l} FROM run ORDER BY id DESC LIMIT 50`),o=e.query(`SELECT ${_l} FROM run WHERE paused_at IS NOT NULL AND terminal_state IS NULL ORDER BY paused_at DESC LIMIT 50`),a=e.query(`SELECT ${_l} FROM run
8
8
  WHERE terminal_state IS NULL
9
9
  AND started_at < ?
10
10
  ORDER BY started_at ASC LIMIT 50`,s);return{last_50:or(i),stale:or(a),paused:or(o)}}function jI(t){let{dal:e}=t,r=e.query("SELECT status, COUNT(*) AS c FROM job GROUP BY status"),n={pending:0,running:0,done:0,failed:0,paused:0};for(let{status:o,c:a}of r)o==="queued"?n.pending+=a:o==="running"?n.running+=a:o==="done"||o==="succeeded"?n.done+=a:o==="failed"?n.failed+=a:o==="paused"&&(n.paused+=a);let s=e.query("SELECT id FROM job WHERE status IN ('queued', 'available') ORDER BY id DESC LIMIT 100"),i=e.query("SELECT id FROM job WHERE status = 'running' ORDER BY id DESC LIMIT 100");return{queue_state:n,pending_ids:s.map(o=>o.id),running_ids:i.map(o=>o.id)}}function PI(t){let{dal:e}=t,r=e.query(`SELECT id, kind, severity, project_id, run_id, external_object_id, requires_user, created_at
11
- FROM attention WHERE acknowledged_at IS NULL ORDER BY created_at DESC LIMIT 100`);return{unacked:or(r)}}async function FI(t){let e=bt(),r=process.version,n=_l("uname",["-a"],{encoding:"utf8"}),s=es((n.stdout??"").trim()),i=[],o=t.dbPath??process.env.LMCTL_DB;if(o!==void 0)try{await Nf(o);let c=_l("du",["-sh",o],{encoding:"utf8"});c.status===0&&i.push(c.stdout.trim())}catch{}let a=t.sessiondir??process.env.LMCTL_SESSIONDIR;if(a!==void 0)try{await Nf(a);let c=_l("du",["-sh",a],{encoding:"utf8"});c.status===0&&i.push(c.stdout.trim())}catch{}let l=i.length===0?"(no paths configured)":es(i.join(`
12
- `)),d=[];for(let c of $I){let u=process.env[c];if(u===void 0){d.push({key:c,value:"(unset)"});continue}d.push(kf(c,u))}return{lmctl_next_version:e,node_version:r,os_info:s,disk_usage:l,env_keys_present:d}}function UI(){return process.env.LMCTL_INTENT_LOG??LI(RI(),".lmctl","recent-intents.log")}async function WI(t){let e=t.intentLog??UI(),r=t.intentLogTailLines??500;try{let s=(await gl(e,"utf8")).split(`
11
+ FROM attention WHERE acknowledged_at IS NULL ORDER BY created_at DESC LIMIT 100`);return{unacked:or(r)}}async function FI(t){let e=bt(),r=process.version,n=pl("uname",["-a"],{encoding:"utf8"}),s=es((n.stdout??"").trim()),i=[],o=t.dbPath??process.env.LMCTL_DB;if(o!==void 0)try{await Nf(o);let c=pl("du",["-sh",o],{encoding:"utf8"});c.status===0&&i.push(c.stdout.trim())}catch{}let a=t.sessiondir??process.env.LMCTL_SESSIONDIR;if(a!==void 0)try{await Nf(a);let c=pl("du",["-sh",a],{encoding:"utf8"});c.status===0&&i.push(c.stdout.trim())}catch{}let l=i.length===0?"(no paths configured)":es(i.join(`
12
+ `)),d=[];for(let c of $I){let u=process.env[c];if(u===void 0){d.push({key:c,value:"(unset)"});continue}d.push(kf(c,u))}return{lmctl_next_version:e,node_version:r,os_info:s,disk_usage:l,env_keys_present:d}}function UI(){return process.env.LMCTL_INTENT_LOG??LI(RI(),".lmctl","recent-intents.log")}async function WI(t){let e=t.intentLog??UI(),r=t.intentLogTailLines??500;try{let s=(await hl(e,"utf8")).split(`
13
13
  `).filter(o=>o.length>0),i=s.slice(Math.max(0,s.length-r));return{source_path:e,tail_lines:i.length,tail:es(i.join(`
14
- `)),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 di,$I,hl,ts=E(()=>{"use strict";li();di=["serve","db","runs","jobs","attentions","env","intents"];$I=["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"];hl=["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 Lf,appendFileSync as qI,mkdirSync as BI,existsSync as DX,readdirSync as jX,unlinkSync as PX}from"node:fs";import{join as ui,dirname as HI}from"node:path";import{homedir as XI}from"node:os";function yl(){return ui(XI(),".lmctl")}function Of(){rn=!0,process.env.LMCTL_DEBUG="1"}function $f(){return{cliDebug:rn,lmctlDebugEnv:process.env.LMCTL_DEBUG}}function Cf(t){rn=t.cliDebug,t.lmctlDebugEnv===void 0?delete process.env.LMCTL_DEBUG:process.env.LMCTL_DEBUG=t.lmctlDebugEnv}function ue(){if(rn||process.env.LMCTL_DEBUG==="1")return!0;let t=Date.now();return t-Rf>=JI&&(xf=KI(),Rf=t),xf}function Mf(){return rn||process.env.LMCTL_DEBUG==="1"}function GI(){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 Oe(t,e){if(e?.verbose){if(!rn)return}else if(!e?.always&&!ue())return;try{VI();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};qI(ci,JSON.stringify(r)+`
15
- `)}catch{}}function VI(){if(!ci){let e=GI().slice(0,13).replace("T","-");ci=ui(yl(),`debug-${e}.log`)}BI(HI(ci),{recursive:!0})}function je(...t){Oe({event:"legacy",msg:t.join(" ")})}function kt(...t){Oe({event:"legacy",msg:t.join(" ")},{verbose:!0})}function C(t){Oe(t,{always:!0})}function KI(){return YI()||zI()}function YI(){try{let t=Lf(ui(yl(),"config.toml"),"utf-8");for(let e of t.split(`
16
- `)){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 zI(){try{let t=Lf(ui(yl(),"config.json"),"utf-8"),e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)&&e.debug===!0}catch{}return!1}var rn,xf,Rf,JI,ci,me=E(()=>{"use strict";rn=!1,xf=!1,Rf=0,JI=5e3;ci=null});import{existsSync as hN}from"node:fs";import{createRequire as gN}from"node:module";function yN(){return wl===null&&(wl=gN(import.meta.url)("node:sqlite").DatabaseSync),wl}function Tl(t){return t.length===1&&EN(t[0])?[t[0]]:t}function EN(t){if(!bl(t))return!1;let e=Object.getPrototypeOf(t);return e===Object.prototype||e===null}function bl(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var wl,vl,Uf,Sl,Wf=E(()=>{"use strict";wl=null;vl=class{name;handle;transactionDepth=0;savepointId=0;constructor(e,r={}){if(r.fileMustExist===!0&&e!==":memory:"&&!hN(e))throw new Error("unable to open database file");this.name=e,this.handle=new(yN())(e,{readOnly:r.readonly===!0}),this.exec("PRAGMA busy_timeout = 5000")}prepare(e){return new Sl(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)}}},Uf=vl,Sl=class{handle;rawMode=!1;constructor(e){this.handle=e,this.handle.setAllowBareNamedParameters(!0)}get(...e){let r=this.handle.get(...Tl(e));return this.normalizeRow(r)}all(...e){return this.handle.all(...Tl(e)).map(r=>this.normalizeRow(r))}run(...e){let r=this.handle.run(...Tl(e));return{changes:Number(r.changes),lastInsertRowid:Number(r.lastInsertRowid)}}raw(){return this.rawMode=!0,this}normalizeRow(e){return e==null?e:this.rawMode&&bl(e)?Object.values(e):bl(e)?{...e}:e}}});var Yf={};he(Yf,{CURRENT_USER_VERSION:()=>Vf,migrate:()=>mi});import{existsSync as wN,mkdirSync as TN,readFileSync as Bf}from"node:fs";import{homedir as vN}from"node:os";import{dirname as Hf,join as SN,resolve as Xf}from"node:path";import{fileURLToPath as bN,pathToFileURL as kN}from"node:url";function mi(t){t.dbPath!==":memory:"&&TN(Hf(t.dbPath),{recursive:!0});let e=new Uf(t.dbPath);e.pragma("journal_mode = WAL"),e.pragma("synchronous = NORMAL"),e.pragma("foreign_keys = ON");let r=Kf(e);return r===0&&(e.exec(Bf(Gf,"utf8")),e.pragma(`user_version = ${Vf}`)),NN(e,r),e}function NN(t,e){let r=e;if(r<2&&r!==0&&(t.exec(`
14
+ `)),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 di,$I,_l,ts=E(()=>{"use strict";li();di=["serve","db","runs","jobs","attentions","env","intents"];$I=["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"];_l=["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 Lf,appendFileSync as qI,mkdirSync as BI,existsSync as jX,readdirSync as PX,unlinkSync as FX}from"node:fs";import{join as ui,dirname as HI}from"node:path";import{homedir as XI}from"node:os";function gl(){return ui(XI(),".lmctl")}function Of(){rn=!0,process.env.LMCTL_DEBUG="1"}function $f(){return{cliDebug:rn,lmctlDebugEnv:process.env.LMCTL_DEBUG}}function Cf(t){rn=t.cliDebug,t.lmctlDebugEnv===void 0?delete process.env.LMCTL_DEBUG:process.env.LMCTL_DEBUG=t.lmctlDebugEnv}function ue(){if(rn||process.env.LMCTL_DEBUG==="1")return!0;let t=Date.now();return t-Rf>=JI&&(xf=KI(),Rf=t),xf}function Mf(){return rn||process.env.LMCTL_DEBUG==="1"}function GI(){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 Oe(t,e){if(e?.verbose){if(!rn)return}else if(!e?.always&&!ue())return;try{VI();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};qI(ci,JSON.stringify(r)+`
15
+ `)}catch{}}function VI(){if(!ci){let e=GI().slice(0,13).replace("T","-");ci=ui(gl(),`debug-${e}.log`)}BI(HI(ci),{recursive:!0})}function je(...t){Oe({event:"legacy",msg:t.join(" ")})}function kt(...t){Oe({event:"legacy",msg:t.join(" ")},{verbose:!0})}function C(t){Oe(t,{always:!0})}function KI(){return YI()||zI()}function YI(){try{let t=Lf(ui(gl(),"config.toml"),"utf-8");for(let e of t.split(`
16
+ `)){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 zI(){try{let t=Lf(ui(gl(),"config.json"),"utf-8"),e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)&&e.debug===!0}catch{}return!1}var rn,xf,Rf,JI,ci,me=E(()=>{"use strict";rn=!1,xf=!1,Rf=0,JI=5e3;ci=null});import{existsSync as hN}from"node:fs";import{createRequire as gN}from"node:module";function yN(){return El===null&&(El=gN(import.meta.url)("node:sqlite").DatabaseSync),El}function wl(t){return t.length===1&&EN(t[0])?[t[0]]:t}function EN(t){if(!Sl(t))return!1;let e=Object.getPrototypeOf(t);return e===Object.prototype||e===null}function Sl(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var El,Tl,Uf,vl,Wf=E(()=>{"use strict";El=null;Tl=class{name;handle;transactionDepth=0;savepointId=0;constructor(e,r={}){if(r.fileMustExist===!0&&e!==":memory:"&&!hN(e))throw new Error("unable to open database file");this.name=e,this.handle=new(yN())(e,{readOnly:r.readonly===!0}),this.exec("PRAGMA busy_timeout = 5000")}prepare(e){return new vl(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)}}},Uf=Tl,vl=class{handle;rawMode=!1;constructor(e){this.handle=e,this.handle.setAllowBareNamedParameters(!0)}get(...e){let r=this.handle.get(...wl(e));return this.normalizeRow(r)}all(...e){return this.handle.all(...wl(e)).map(r=>this.normalizeRow(r))}run(...e){let r=this.handle.run(...wl(e));return{changes:Number(r.changes),lastInsertRowid:Number(r.lastInsertRowid)}}raw(){return this.rawMode=!0,this}normalizeRow(e){return e==null?e:this.rawMode&&Sl(e)?Object.values(e):Sl(e)?{...e}:e}}});var Yf={};he(Yf,{CURRENT_USER_VERSION:()=>Vf,migrate:()=>mi});import{existsSync as wN,mkdirSync as TN,readFileSync as Bf}from"node:fs";import{homedir as vN}from"node:os";import{dirname as Hf,join as SN,resolve as Xf}from"node:path";import{fileURLToPath as bN,pathToFileURL as kN}from"node:url";function mi(t){t.dbPath!==":memory:"&&TN(Hf(t.dbPath),{recursive:!0});let e=new Uf(t.dbPath);e.pragma("journal_mode = WAL"),e.pragma("synchronous = NORMAL"),e.pragma("foreign_keys = ON");let r=Kf(e);return r===0&&(e.exec(Bf(Gf,"utf8")),e.pragma(`user_version = ${Vf}`)),NN(e,r),e}function NN(t,e){let r=e;if(r<2&&r!==0&&(t.exec(`
17
17
  CREATE TABLE IF NOT EXISTS session_size (
18
18
  id INTEGER PRIMARY KEY AUTOINCREMENT,
19
19
  team_name TEXT NOT NULL,
@@ -709,7 +709,7 @@ var hI=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var he=(t,e)=>{f
709
709
  FROM team_chat_log;
710
710
  DROP TABLE team_chat_log;
711
711
  ALTER TABLE team_chat_log_v46 RENAME TO team_chat_log;
712
- `)}finally{t.pragma("foreign_keys = ON")}}function Kf(t){let e=t.pragma("user_version",{simple:!0});return typeof e=="number"?e:0}function AN(){return process.env.LMCTL_DB??SN(vN(),".lmctl","state.db")}var Jf,Gf,IN,Vf,kl=E(()=>{"use strict";Wf();Jf=Hf(bN(import.meta.url)),Gf=Xf(Jf,"schema.sql"),IN=Xf(Jf,"migrations"),Vf=53;if(process.argv[1]&&import.meta.url===kN(process.argv[1]).href){let t=mi({dbPath:process.argv[2]??AN()});try{process.stdout.write(`migrated user_version=${Kf(t)}
712
+ `)}finally{t.pragma("foreign_keys = ON")}}function Kf(t){let e=t.pragma("user_version",{simple:!0});return typeof e=="number"?e:0}function AN(){return process.env.LMCTL_DB??SN(vN(),".lmctl","state.db")}var Jf,Gf,IN,Vf,bl=E(()=>{"use strict";Wf();Jf=Hf(bN(import.meta.url)),Gf=Xf(Jf,"schema.sql"),IN=Xf(Jf,"migrations"),Vf=53;if(process.argv[1]&&import.meta.url===kN(process.argv[1]).href){let t=mi({dbPath:process.argv[2]??AN()});try{process.stdout.write(`migrated user_version=${Kf(t)}
713
713
  `)}finally{t.close()}}});function zf(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(`
714
714
  INSERT INTO agent_inflight (receiver_teamfile, receiver_alias, sender_teamfile, sender_alias, started_at, active_count, holder_pid)
715
715
  VALUES (@receiver_teamfile, @receiver_alias, @sender_teamfile, @sender_alias, @started_at, 1, @holder_pid)
@@ -1034,22 +1034,22 @@ var hI=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var he=(t,e)=>{f
1034
1034
  AND delivered_at IS NULL
1035
1035
  AND delivering_at IS NULL
1036
1036
  ORDER BY receiver_teamfile ASC, receiver_alias ASC, id ASC
1037
- `),deleteMailboxMessage:t.prepare("DELETE FROM agent_mailbox WHERE id = ?")}}function ns(t){if(Buffer.byteLength(t,"utf8")<=65536)return t;let r=Buffer.byteLength(rp,"utf8"),n=Math.max(0,65536-r),s=Buffer.from(t,"utf8"),i=n;for(;i>0&&(s[i]&192)===128;)i-=1;return`${s.subarray(0,i).toString("utf8")}${rp}`}var rp,Il=E(()=>{"use strict";rp=`
1038
- ...[truncated]`});function os(t,e){return JSON.stringify([t,e])}function sp(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 ss,is,ip=E(()=>{"use strict";ss="terminal_lock",is="member"});import{readFileSync as op}from"node:fs";function ze(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"}}function Nl(t){if(!Number.isInteger(t)||(t??0)<=0)return null;let e=xN();if(e===null)return null;try{let r=op(`/proc/${t}/stat`,"utf-8"),n=r.lastIndexOf(")");if(n<0)return null;let i=r.slice(n+2).trim().split(/\s+/)[19];return i===void 0||!/^\d+$/.test(i)?null:`${e}:${i}`}catch{return null}}function xN(){try{let t=op("/proc/sys/kernel/random/boot_id","utf-8").trim();return/^[0-9a-f-]{36}$/i.test(t)?t:null}catch{return null}}function RN(t){return typeof t=="string"&&/^[0-9a-f-]{36}:\d+$/i.test(t)}function ap(t,e){if(!ze(t))return"gone";if(!RN(e))return"unverified";let r=Nl(t);return r===null?"unverified":r===e?"same":"different"}var nn=E(()=>{"use strict"});import{createHash as LN}from"node:crypto";function ON(t,e,r){return LN("sha256").update(`${t}\0${e}\0${r}`).digest("hex")}function ke(t,e,r){let n=ON(e.stream_id,e.intentKey??e.event_type,e.observedLastSeq),s=t.prepare(`INSERT INTO message_event (event_id, ts, stream_id, event_type, payload)
1037
+ `),deleteMailboxMessage:t.prepare("DELETE FROM agent_mailbox WHERE id = ?")}}function ns(t){if(Buffer.byteLength(t,"utf8")<=65536)return t;let r=Buffer.byteLength(rp,"utf8"),n=Math.max(0,65536-r),s=Buffer.from(t,"utf8"),i=n;for(;i>0&&(s[i]&192)===128;)i-=1;return`${s.subarray(0,i).toString("utf8")}${rp}`}var rp,kl=E(()=>{"use strict";rp=`
1038
+ ...[truncated]`});function os(t,e){return JSON.stringify([t,e])}function sp(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 ss,is,ip=E(()=>{"use strict";ss="terminal_lock",is="member"});import{readFileSync as op}from"node:fs";function ze(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"}}function Il(t){if(!Number.isInteger(t)||(t??0)<=0)return null;let e=xN();if(e===null)return null;try{let r=op(`/proc/${t}/stat`,"utf-8"),n=r.lastIndexOf(")");if(n<0)return null;let i=r.slice(n+2).trim().split(/\s+/)[19];return i===void 0||!/^\d+$/.test(i)?null:`${e}:${i}`}catch{return null}}function xN(){try{let t=op("/proc/sys/kernel/random/boot_id","utf-8").trim();return/^[0-9a-f-]{36}$/i.test(t)?t:null}catch{return null}}function RN(t){return typeof t=="string"&&/^[0-9a-f-]{36}:\d+$/i.test(t)}function ap(t,e){if(!ze(t))return"gone";if(!RN(e))return"unverified";let r=Il(t);return r===null?"unverified":r===e?"same":"different"}var nn=E(()=>{"use strict"});import{createHash as LN}from"node:crypto";function ON(t,e,r){return LN("sha256").update(`${t}\0${e}\0${r}`).digest("hex")}function ke(t,e,r){let n=ON(e.stream_id,e.intentKey??e.event_type,e.observedLastSeq),s=t.prepare(`INSERT INTO message_event (event_id, ts, stream_id, event_type, payload)
1039
1039
  VALUES (?, ?, ?, ?, ?)
1040
- ON CONFLICT(event_id) DO NOTHING`),i=t.prepare("SELECT seq FROM message_event WHERE event_id = ?");return t.transaction(()=>{let a=s.run(n,e.ts??new Date().toISOString(),e.stream_id,e.event_type,JSON.stringify(e.payload));if(a.changes===0)return{appended:!1,seq:i.get(n).seq,event_id:n};let l=Number(a.lastInsertRowid);return r(l),{appended:!0,seq:l,event_id:n}})()}var fi=E(()=>{"use strict"});import{hostname as Al}from"node:os";function ar(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},i=t.getAgentInflight(e.receiver_teamfile,e.receiver_alias),o=i===null||i.holder_pid===null,a=t.tryAcquireAgentInflight(s,{...o?{stale_before:n}:{},force:e.force,reclaim_reason:e.reclaimReason});if(a.acquired){let d=i===null?null:e.force===!0?e.reclaimReason??"force":i.holder_pid===null&&i.started_at<n?"stale":null;return{acquired:!0,lease:a.current??s,previous:i,reclaimReason:d}}if(!_i(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},reclaim_reason:"dead-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 pi(t){return t.status!=="running"?null:t.holder_host===Al()&&t.holder_pid!==null&&t.holder_pid>0?ze(t.holder_pid)?"live":"dead":"unknown"}function Wt(t,e,r){let n=t.getTerminalLock(e,r);if(n!==null&&$N(n))return{busy:!0,reason:"terminal-held",source:"terminal-lock",terminalLock:n};let s=CN(t,e,r);if(s!==null)return{busy:!0,reason:"terminal-held",source:"terminal-invocation",terminalInvocation:s};let i=t.getAgentInflight(e,r);if(i===null)return{busy:!1};let o=new Date(Date.now()-hi()).toISOString();return _i(i,o)?{busy:!1}:{busy:!0,reason:"in-flight",inFlight:i}}function $N(t){if(t.holder_host===Al())return ze(t.holder_pid);let e=Date.parse(t.last_heartbeat);return Number.isFinite(e)?Date.now()-e<=MN():!1}function CN(t,e,r){let s=t.query(`SELECT id, started_at, last_heartbeat_at, holder_pid, holder_host
1040
+ ON CONFLICT(event_id) DO NOTHING`),i=t.prepare("SELECT seq FROM message_event WHERE event_id = ?");return t.transaction(()=>{let a=s.run(n,e.ts??new Date().toISOString(),e.stream_id,e.event_type,JSON.stringify(e.payload));if(a.changes===0)return{appended:!1,seq:i.get(n).seq,event_id:n};let l=Number(a.lastInsertRowid);return r(l),{appended:!0,seq:l,event_id:n}})()}var fi=E(()=>{"use strict"});import{hostname as Nl}from"node:os";function ar(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},i=t.getAgentInflight(e.receiver_teamfile,e.receiver_alias),o=i===null||i.holder_pid===null,a=t.tryAcquireAgentInflight(s,{...o?{stale_before:n}:{},force:e.force,reclaim_reason:e.reclaimReason});if(a.acquired){let d=i===null?null:e.force===!0?e.reclaimReason??"force":i.holder_pid===null&&i.started_at<n?"stale":null;return{acquired:!0,lease:a.current??s,previous:i,reclaimReason:d}}if(!_i(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},reclaim_reason:"dead-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 pi(t){return t.status!=="running"?null:t.holder_host===Nl()&&t.holder_pid!==null&&t.holder_pid>0?ze(t.holder_pid)?"live":"dead":"unknown"}function Wt(t,e,r){let n=t.getTerminalLock(e,r);if(n!==null&&$N(n))return{busy:!0,reason:"terminal-held",source:"terminal-lock",terminalLock:n};let s=CN(t,e,r);if(s!==null)return{busy:!0,reason:"terminal-held",source:"terminal-invocation",terminalInvocation:s};let i=t.getAgentInflight(e,r);if(i===null)return{busy:!1};let o=new Date(Date.now()-hi()).toISOString();return _i(i,o)?{busy:!1}:{busy:!0,reason:"in-flight",inFlight:i}}function $N(t){if(t.holder_host===Nl())return ze(t.holder_pid);let e=Date.parse(t.last_heartbeat);return Number.isFinite(e)?Date.now()-e<=MN():!1}function CN(t,e,r){let s=t.query(`SELECT id, started_at, last_heartbeat_at, holder_pid, holder_host
1041
1041
  FROM tracked_invocation
1042
1042
  WHERE target_teamfile = ?
1043
1043
  AND target_alias = ?
1044
1044
  AND status = 'running'
1045
1045
  AND launch_source = 'terminal'
1046
1046
  ORDER BY started_at DESC, id DESC
1047
- LIMIT 1`,e,r)[0];return s===void 0?null:s.holder_pid!==null&&(s.holder_host===null||s.holder_host===Al())?ze(s.holder_pid)?s:null:cp(s)?s:null}function cp(t){let e=Date.parse(t.last_heartbeat_at??t.started_at);return Number.isFinite(e)?Date.now()-e<=hi():!1}function _i(t,e){return t.holder_pid===null?t.started_at<e:!ze(t.holder_pid)}function hi(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return lp;let r=Number(e);return!Number.isFinite(r)||r<=0?lp:r}function MN(t=process.env){let e=t.LMCTL_TERMINAL_LOCK_STALE_MS;if(e===void 0||e.trim()==="")return dp;let r=Number(e);return!Number.isFinite(r)||r<=0?dp:r}var lp,dp,lr=E(()=>{"use strict";nn();lp=8*60*60*1e3,dp=12e4});import{randomUUID as mp}from"node:crypto";import{hostname as DN}from"node:os";function qt(t,e){return{teamfile:t,alias:e}}function xl(t,e,r={}){return{teamfile:t,alias:e,...r.provider===void 0||r.provider===null?{}:{provider:r.provider},...r.sessionId===void 0||r.sessionId===null?{}:{session_id:r.sessionId}}}function Rl(t,e){return t===null?null:qt(t,e??"")}function It(t){return`msg_mbx_${t}`}function an(t){return`inv_${t}`}function on(t,e,r){return t.prepare(`SELECT receiver_teamfile, receiver_alias, lease_id, sender_teamfile, sender_alias,
1047
+ LIMIT 1`,e,r)[0];return s===void 0?null:s.holder_pid!==null&&(s.holder_host===null||s.holder_host===Nl())?ze(s.holder_pid)?s:null:cp(s)?s:null}function cp(t){let e=Date.parse(t.last_heartbeat_at??t.started_at);return Number.isFinite(e)?Date.now()-e<=hi():!1}function _i(t,e){return t.holder_pid===null?t.started_at<e:!ze(t.holder_pid)}function hi(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return lp;let r=Number(e);return!Number.isFinite(r)||r<=0?lp:r}function MN(t=process.env){let e=t.LMCTL_TERMINAL_LOCK_STALE_MS;if(e===void 0||e.trim()==="")return dp;let r=Number(e);return!Number.isFinite(r)||r<=0?dp:r}var lp,dp,lr=E(()=>{"use strict";nn();lp=8*60*60*1e3,dp=12e4});import{randomUUID as mp}from"node:crypto";import{hostname as DN}from"node:os";function qt(t,e){return{teamfile:t,alias:e}}function Al(t,e,r={}){return{teamfile:t,alias:e,...r.provider===void 0||r.provider===null?{}:{provider:r.provider},...r.sessionId===void 0||r.sessionId===null?{}:{session_id:r.sessionId}}}function xl(t,e){return t===null?null:qt(t,e??"")}function It(t){return`msg_mbx_${t}`}function an(t){return`inv_${t}`}function on(t,e,r){return t.prepare(`SELECT receiver_teamfile, receiver_alias, lease_id, sender_teamfile, sender_alias,
1048
1048
  holder_pid, holder_host, started_at, terminal_lock_id,
1049
1049
  terminal_invocation_id, last_seq
1050
1050
  FROM agent_state
1051
- WHERE receiver_teamfile = ? AND receiver_alias = ?`).get(e,r)??null}function jN(t,e){let r=e??new Date(Date.now()-hi()).toISOString();return _i({holder_pid:t.holder_pid,started_at:t.started_at??""},r)}function PN(t,e,r){return e==="force"||e==="session-idle"?e:r?"force":t.holder_pid!==null&&!ze(t.holder_pid)?"dead-pid":"stale"}function FN(t){return{sender:Rl(t.sender_teamfile,t.sender_alias),holder_pid:t.holder_pid,holder_host:t.holder_host,started_at:t.started_at}}function sn(t,e){return t.prepare(`SELECT message_id, lifecycle_state, delivery_lease_id, last_seq
1052
- FROM message_pending WHERE message_id = ?`).get(e)??null}function Bt(t,e){if(t!==1)throw new Error(`event projection CAS failed during ${e}`)}function Ll(t,e={},r={}){return{message_id:It(t.id),message_type:t.message_type,sender:t.sender_teamfile===null?null:xl(t.sender_teamfile,t.sender_alias??"",r),receiver:xl(t.receiver_teamfile,t.receiver_alias,e),root_teamfile:t.root_teamfile,legacy:{table:"agent_mailbox",id:t.id}}}function Ol(t,e,r={},n={},s=[]){let i=It(e.id),o=e.message_type==="response",a=o&&e.request_mailbox_id!==null?UN(t,e.request_mailbox_id):{},l={provider:a.provider??r.provider,sessionId:a.sessionId??r.sessionId},d=e.request_mailbox_id===null?null:It(e.request_mailbox_id),c=Ll(e,l,n);ke(t,{stream_id:i,event_type:o?"RESPONSE_CREATE":"CREATE",observedLastSeq:0,ts:e.created_at,payload:{...c,content:e.payload,...o?{in_reply_to_message_id:d,...s.length>0?{batched_request_message_ids:s}:{}}:{}}},()=>{}),ke(t,{stream_id:i,event_type:o?"RESPONSE_ENQUEUE":"ENQUEUE",observedLastSeq:0,ts:e.created_at,payload:{...c,...o?{in_reply_to_message_id:d}:{}}},u=>{t.prepare(`INSERT INTO message_pending
1051
+ WHERE receiver_teamfile = ? AND receiver_alias = ?`).get(e,r)??null}function jN(t,e){let r=e??new Date(Date.now()-hi()).toISOString();return _i({holder_pid:t.holder_pid,started_at:t.started_at??""},r)}function PN(t,e,r){return e==="force"||e==="session-idle"?e:r?"force":t.holder_pid!==null&&!ze(t.holder_pid)?"dead-pid":"stale"}function FN(t){return{sender:xl(t.sender_teamfile,t.sender_alias),holder_pid:t.holder_pid,holder_host:t.holder_host,started_at:t.started_at}}function sn(t,e){return t.prepare(`SELECT message_id, lifecycle_state, delivery_lease_id, last_seq
1052
+ FROM message_pending WHERE message_id = ?`).get(e)??null}function Bt(t,e){if(t!==1)throw new Error(`event projection CAS failed during ${e}`)}function Rl(t,e={},r={}){return{message_id:It(t.id),message_type:t.message_type,sender:t.sender_teamfile===null?null:Al(t.sender_teamfile,t.sender_alias??"",r),receiver:Al(t.receiver_teamfile,t.receiver_alias,e),root_teamfile:t.root_teamfile,legacy:{table:"agent_mailbox",id:t.id}}}function Ll(t,e,r={},n={},s=[]){let i=It(e.id),o=e.message_type==="response",a=o&&e.request_mailbox_id!==null?UN(t,e.request_mailbox_id):{},l={provider:a.provider??r.provider,sessionId:a.sessionId??r.sessionId},d=e.request_mailbox_id===null?null:It(e.request_mailbox_id),c=Rl(e,l,n);ke(t,{stream_id:i,event_type:o?"RESPONSE_CREATE":"CREATE",observedLastSeq:0,ts:e.created_at,payload:{...c,content:e.payload,...o?{in_reply_to_message_id:d,...s.length>0?{batched_request_message_ids:s}:{}}:{}}},()=>{}),ke(t,{stream_id:i,event_type:o?"RESPONSE_ENQUEUE":"ENQUEUE",observedLastSeq:0,ts:e.created_at,payload:{...c,...o?{in_reply_to_message_id:d}:{}}},u=>{t.prepare(`INSERT INTO message_pending
1053
1053
  (message_id, message_type, in_reply_to, sender_teamfile, sender_alias,
1054
1054
  receiver_teamfile, receiver_alias, lifecycle_state, created_seq, last_seq)
1055
1055
  VALUES (?, ?, ?, ?, ?, ?, ?, 'queued', ?, ?)`).run(i,e.message_type,o?d:null,e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias,u,u)})}function UN(t,e){let r=t.prepare(`
@@ -1060,18 +1060,18 @@ var hI=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var he=(t,e)=>{f
1060
1060
  WHERE stream_id = ? AND event_type = 'CREATE'
1061
1061
  ORDER BY seq ASC
1062
1062
  LIMIT 1
1063
- `).get(It(e));return{provider:typeof r?.provider=="string"?r.provider:null,sessionId:typeof r?.session_id=="string"?r.session_id:null}}function fp(t,e,r){let n=`msg_tcl_${e}`,s=Rl(r.sender_teamfile,r.sender_alias),i=xl(r.receiver_teamfile,r.receiver_alias,{provider:r.receiver_provider,sessionId:r.receiver_session_id}),o={message_id:n,message_type:"request",sender:s,receiver:i,root_teamfile:r.root_teamfile,legacy:{table:"team_chat_log",id:e}};return ke(t,{stream_id:n,event_type:"CREATE",observedLastSeq:0,ts:r.created_at,payload:{...o,content:r.message,provider_prompt:r.provider_prompt??r.message,origin:r.origin}},()=>{}),ke(t,{stream_id:n,event_type:"HANDLED",observedLastSeq:1,ts:r.created_at,payload:{...o,outcome:r.status,receipt:r.response,error:r.error_detail,truncated:r.truncated===1}},()=>{}),n}function pp(t,e,r,n,s){let i=It(e.id),o=sn(t,i);if(o===null||o.lifecycle_state!=="queued")throw new Error(`message_pending ${i} is not queued during delivery claim`);let a=`delivery_${mp()}`;ke(t,{stream_id:i,event_type:"DELIVER_CLAIM",observedLastSeq:o.last_seq,ts:r,payload:{...Ll(e),lease_id:a,pid:n,host:s}},l=>{let d=t.prepare(`UPDATE message_pending
1063
+ `).get(It(e));return{provider:typeof r?.provider=="string"?r.provider:null,sessionId:typeof r?.session_id=="string"?r.session_id:null}}function fp(t,e,r){let n=`msg_tcl_${e}`,s=xl(r.sender_teamfile,r.sender_alias),i=Al(r.receiver_teamfile,r.receiver_alias,{provider:r.receiver_provider,sessionId:r.receiver_session_id}),o={message_id:n,message_type:"request",sender:s,receiver:i,root_teamfile:r.root_teamfile,legacy:{table:"team_chat_log",id:e}};return ke(t,{stream_id:n,event_type:"CREATE",observedLastSeq:0,ts:r.created_at,payload:{...o,content:r.message,provider_prompt:r.provider_prompt??r.message,origin:r.origin}},()=>{}),ke(t,{stream_id:n,event_type:"HANDLED",observedLastSeq:1,ts:r.created_at,payload:{...o,outcome:r.status,receipt:r.response,error:r.error_detail,truncated:r.truncated===1}},()=>{}),n}function pp(t,e,r,n,s){let i=It(e.id),o=sn(t,i);if(o===null||o.lifecycle_state!=="queued")throw new Error(`message_pending ${i} is not queued during delivery claim`);let a=`delivery_${mp()}`;ke(t,{stream_id:i,event_type:"DELIVER_CLAIM",observedLastSeq:o.last_seq,ts:r,payload:{...Rl(e),lease_id:a,pid:n,host:s}},l=>{let d=t.prepare(`UPDATE message_pending
1064
1064
  SET lifecycle_state = 'claimed',
1065
1065
  delivery_lease_id = ?,
1066
1066
  delivery_holder_pid = ?,
1067
1067
  last_seq = ?
1068
- WHERE message_id = ? AND lifecycle_state = 'queued' AND last_seq = ?`).run(a,n,l,i,o.last_seq);Bt(d.changes,"DELIVER_CLAIM")})}function $l(t,e,r,n=new Date().toISOString()){let s=It(e.id),i=sn(t,s);if(i===null||i.lifecycle_state!=="claimed")throw new Error(`message_pending ${s} is not claimed during delivery release`);let o={message_id:s,message_type:e.message_type,sender:Rl(e.sender_teamfile,e.sender_alias),receiver:qt(e.receiver_teamfile,e.receiver_alias),root_teamfile:e.root_teamfile,legacy:{table:"agent_mailbox",id:e.id}};ke(t,{stream_id:s,event_type:"DELIVER_CLAIM_RELEASE",observedLastSeq:i.last_seq,ts:n,payload:{...o,reason:r,delivery_lease_id:i.delivery_lease_id,previous_holder:{pid:e.delivery_holder_pid,host:e.delivery_holder_host}}},a=>{let l=t.prepare(`UPDATE message_pending
1068
+ WHERE message_id = ? AND lifecycle_state = 'queued' AND last_seq = ?`).run(a,n,l,i,o.last_seq);Bt(d.changes,"DELIVER_CLAIM")})}function Ol(t,e,r,n=new Date().toISOString()){let s=It(e.id),i=sn(t,s);if(i===null||i.lifecycle_state!=="claimed")throw new Error(`message_pending ${s} is not claimed during delivery release`);let o={message_id:s,message_type:e.message_type,sender:xl(e.sender_teamfile,e.sender_alias),receiver:qt(e.receiver_teamfile,e.receiver_alias),root_teamfile:e.root_teamfile,legacy:{table:"agent_mailbox",id:e.id}};ke(t,{stream_id:s,event_type:"DELIVER_CLAIM_RELEASE",observedLastSeq:i.last_seq,ts:n,payload:{...o,reason:r,delivery_lease_id:i.delivery_lease_id,previous_holder:{pid:e.delivery_holder_pid,host:e.delivery_holder_host}}},a=>{let l=t.prepare(`UPDATE message_pending
1069
1069
  SET lifecycle_state = 'queued',
1070
1070
  delivery_lease_id = NULL,
1071
1071
  delivery_holder_pid = NULL,
1072
1072
  last_seq = ?
1073
1073
  WHERE message_id = ? AND lifecycle_state = 'claimed'
1074
- AND delivery_lease_id IS ? AND last_seq = ?`).run(a,s,i.delivery_lease_id,i.last_seq);Bt(l.changes,"DELIVER_CLAIM_RELEASE")})}function as(t,e,r,n,s=null){let i=It(e.id),o=sn(t,i);if(o===null)throw new Error(`message_pending ${i} is missing during delivery`);ke(t,{stream_id:i,event_type:e.message_type==="response"?"RESPONSE_DELIVERED":"DELIVERED",observedLastSeq:o.last_seq,ts:n,payload:{...Ll(e),receipt:r,...s===null?{}:{batch_response_message_id:s}}},()=>{let a=t.prepare("DELETE FROM message_pending WHERE message_id = ? AND last_seq = ?").run(i,o.last_seq);Bt(a.changes,"DELIVERED")})}function WN(t){return{sender:qt(t.sender_teamfile,t.sender_alias),holder_pid:t.holder_pid,holder_host:null,started_at:t.started_at}}function _p(t,e,r,n){let s=t.prepare(`UPDATE agent_state
1074
+ AND delivery_lease_id IS ? AND last_seq = ?`).run(a,s,i.delivery_lease_id,i.last_seq);Bt(l.changes,"DELIVER_CLAIM_RELEASE")})}function as(t,e,r,n,s=null){let i=It(e.id),o=sn(t,i);if(o===null)throw new Error(`message_pending ${i} is missing during delivery`);ke(t,{stream_id:i,event_type:e.message_type==="response"?"RESPONSE_DELIVERED":"DELIVERED",observedLastSeq:o.last_seq,ts:n,payload:{...Rl(e),receipt:r,...s===null?{}:{batch_response_message_id:s}}},()=>{let a=t.prepare("DELETE FROM message_pending WHERE message_id = ? AND last_seq = ?").run(i,o.last_seq);Bt(a.changes,"DELIVERED")})}function WN(t){return{sender:qt(t.sender_teamfile,t.sender_alias),holder_pid:t.holder_pid,holder_host:null,started_at:t.started_at}}function _p(t,e,r,n){let s=t.prepare(`UPDATE agent_state
1075
1075
  SET lease_id = NULL, sender_teamfile = NULL, sender_alias = NULL,
1076
1076
  holder_pid = NULL, holder_host = NULL, started_at = NULL,
1077
1077
  last_heartbeat_at = NULL, last_seq = ?
@@ -1088,7 +1088,7 @@ var hI=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var he=(t,e)=>{f
1088
1088
  (receiver_teamfile, receiver_alias, terminal_lock_id, last_seq)
1089
1089
  VALUES (?, ?, ?, ?)`).run(e.teamfile,e.alias,e.lock_id,s);return}let i=t.prepare(`UPDATE agent_state SET terminal_lock_id = ?, last_seq = ?
1090
1090
  WHERE receiver_teamfile = ? AND receiver_alias = ?
1091
- AND terminal_lock_id IS NULL AND last_seq = ?`).run(e.lock_id,s,e.teamfile,e.alias,r.last_seq);Bt(i.changes,"TERMINAL_LOCK_TAKE")})}function Cl(t,e,r=!1){let n=on(t,e.teamfile,e.alias);n===null||n.terminal_lock_id!==e.lock_id||ke(t,{stream_id:e.lock_id,event_type:r?"TERMINAL_LOCK_EXPIRE":"TERMINAL_LOCK_RELEASE",observedLastSeq:n.last_seq,payload:{receiver:qt(e.teamfile,e.alias),lock_id:e.lock_id,holder_pid:e.holder_pid,holder_host:e.holder_host}},s=>{let i=t.prepare(`UPDATE agent_state SET terminal_lock_id = NULL, last_seq = ?
1091
+ AND terminal_lock_id IS NULL AND last_seq = ?`).run(e.lock_id,s,e.teamfile,e.alias,r.last_seq);Bt(i.changes,"TERMINAL_LOCK_TAKE")})}function $l(t,e,r=!1){let n=on(t,e.teamfile,e.alias);n===null||n.terminal_lock_id!==e.lock_id||ke(t,{stream_id:e.lock_id,event_type:r?"TERMINAL_LOCK_EXPIRE":"TERMINAL_LOCK_RELEASE",observedLastSeq:n.last_seq,payload:{receiver:qt(e.teamfile,e.alias),lock_id:e.lock_id,holder_pid:e.holder_pid,holder_host:e.holder_host}},s=>{let i=t.prepare(`UPDATE agent_state SET terminal_lock_id = NULL, last_seq = ?
1092
1092
  WHERE receiver_teamfile = ? AND receiver_alias = ?
1093
1093
  AND terminal_lock_id = ? AND last_seq = ?`).run(s,e.teamfile,e.alias,e.lock_id,n.last_seq);Bt(i.changes,r?"TERMINAL_LOCK_EXPIRE":"TERMINAL_LOCK_RELEASE")})}function yp(t,e,r){let n=on(t,r.targetTeamfile,r.targetAlias);if(n===null){t.prepare(`INSERT INTO agent_state
1094
1094
  (receiver_teamfile, receiver_alias, terminal_invocation_id,
@@ -1113,14 +1113,14 @@ var hI=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var he=(t,e)=>{f
1113
1113
  AND json_extract(payload, '$.acked_by') = ?
1114
1114
  ORDER BY seq LIMIT 1`).get(e.messageId,e.ackedBy),n=e.terminalizePending===!0,s=()=>t.prepare("DELETE FROM message_pending WHERE message_id = ? AND lifecycle_state = 'queued'").run(e.messageId).changes===1?(up(t,e.messageId,e.ackedBy,e.ts),"removed"):sn(t,e.messageId)===null?"not-pending":"claimed";if(r!==void 0)return{appended:!1,seq:r.seq,pending_outcome:n?s():"record-only"};let i=t.prepare("SELECT COALESCE(MAX(seq), 0) AS s FROM message_event WHERE stream_id = ?").get(e.messageId).s,o=sn(t,e.messageId),a=n?"not-pending":"record-only",l=ke(t,{stream_id:e.messageId,event_type:"MESSAGE_ACKNOWLEDGED",intentKey:`MESSAGE_ACKNOWLEDGED:${e.ackedBy}`,observedLastSeq:i,...e.ts!==void 0?{ts:e.ts}:{},payload:{acked_by:e.ackedBy,acked_at:e.ts??new Date().toISOString(),...e.note!==void 0?{note:e.note}:{},pid:e.holderPid??null,host:e.holderHost??null}},()=>{if(!n)return;t.prepare("DELETE FROM message_pending WHERE message_id = ? AND lifecycle_state = 'queued'").run(e.messageId).changes===1?(a="removed",up(t,e.messageId,e.ackedBy,e.ts)):o!==null&&(a="claimed")});if(!l.appended){let d=sn(t,e.messageId);a=n?d===null?"removed":"claimed":"record-only"}return{appended:l.appended,seq:l.seq,pending_outcome:a}}function up(t,e,r,n){let s=/^msg_mbx_(\d+)$/.exec(e);s!==null&&t.prepare(`UPDATE agent_mailbox
1115
1115
  SET delivered_at = ?, receipt = ?
1116
- WHERE id = ? AND delivered_at IS NULL`).run(n??new Date().toISOString(),`[acknowledged by ${r}]`,Number(s[1]))}var gi=E(()=>{"use strict";fi();lr();nn()});function vp(t,e){return t.prepare("SELECT last_seq FROM invocation_state WHERE invocation_id = ?").get(e)??null}function Ml(t){return t.launch_source==="terminal"&&t.target_teamfile!==null}function Sp(t,e){let r=an(e.id),n=e.target_teamfile===null?null:{teamfile:e.target_teamfile,alias:e.target_alias??""},s=e.last_heartbeat_at??e.started_at;ke(t,{stream_id:r,event_type:qN,observedLastSeq:0,ts:e.started_at,payload:{invocation_id:r,kind:e.kind,origin:e.origin,launch_source:e.launch_source,from_identity:e.from_identity,target:n,root_teamfile:e.root_teamfile,scope_teamfile:e.scope_teamfile,cwd:e.cwd,command:e.command,request_payload:e.request_payload,request_message_id:e.team_chat_log_id===null?null:`msg_tcl_${e.team_chat_log_id}`,holder_pid:e.holder_pid,holder_host:e.holder_host,started_at:e.started_at,legacy:{table:"tracked_invocation",id:e.id}}},i=>{t.prepare(`INSERT INTO invocation_state
1116
+ WHERE id = ? AND delivered_at IS NULL`).run(n??new Date().toISOString(),`[acknowledged by ${r}]`,Number(s[1]))}var gi=E(()=>{"use strict";fi();lr();nn()});function vp(t,e){return t.prepare("SELECT last_seq FROM invocation_state WHERE invocation_id = ?").get(e)??null}function Cl(t){return t.launch_source==="terminal"&&t.target_teamfile!==null}function Sp(t,e){let r=an(e.id),n=e.target_teamfile===null?null:{teamfile:e.target_teamfile,alias:e.target_alias??""},s=e.last_heartbeat_at??e.started_at;ke(t,{stream_id:r,event_type:qN,observedLastSeq:0,ts:e.started_at,payload:{invocation_id:r,kind:e.kind,origin:e.origin,launch_source:e.launch_source,from_identity:e.from_identity,target:n,root_teamfile:e.root_teamfile,scope_teamfile:e.scope_teamfile,cwd:e.cwd,command:e.command,request_payload:e.request_payload,request_message_id:e.team_chat_log_id===null?null:`msg_tcl_${e.team_chat_log_id}`,holder_pid:e.holder_pid,holder_host:e.holder_host,started_at:e.started_at,legacy:{table:"tracked_invocation",id:e.id}}},i=>{t.prepare(`INSERT INTO invocation_state
1117
1117
  (invocation_id, kind, origin, launch_source, from_identity, target_teamfile, target_alias,
1118
1118
  root_teamfile, cwd, command, request_message_id, request_payload, holder_pid, holder_host,
1119
1119
  status, started_at, last_heartbeat_at, last_seq)
1120
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'running', ?, ?, ?)`).run(r,e.kind,e.origin,e.launch_source??e.kind,e.from_identity,e.target_teamfile,e.target_alias,e.root_teamfile,e.cwd,e.command,e.team_chat_log_id===null?null:`msg_tcl_${e.team_chat_log_id}`,e.request_payload,e.holder_pid,e.holder_host,e.started_at,e.last_heartbeat_at,i),Ml(e)&&yp(t,i,{invocationId:r,targetTeamfile:e.target_teamfile,targetAlias:e.target_alias??"",holderPid:e.holder_pid,holderHost:e.holder_host,heartbeatAt:s})})}function Dl(t,e){let r=an(e.id),n=vp(t,r);return n===null?!1:(ke(t,{stream_id:r,event_type:BN,observedLastSeq:n.last_seq,ts:e.ended_at??e.started_at,payload:{invocation_id:r,status:e.status,ended_at:e.ended_at,exit_code:e.exit_code,signal:e.signal,result_summary:e.result_summary,error:e.error,legacy:{table:"tracked_invocation",id:e.id}}},s=>{if(t.prepare(`UPDATE invocation_state
1120
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'running', ?, ?, ?)`).run(r,e.kind,e.origin,e.launch_source??e.kind,e.from_identity,e.target_teamfile,e.target_alias,e.root_teamfile,e.cwd,e.command,e.team_chat_log_id===null?null:`msg_tcl_${e.team_chat_log_id}`,e.request_payload,e.holder_pid,e.holder_host,e.started_at,e.last_heartbeat_at,i),Cl(e)&&yp(t,i,{invocationId:r,targetTeamfile:e.target_teamfile,targetAlias:e.target_alias??"",holderPid:e.holder_pid,holderHost:e.holder_host,heartbeatAt:s})})}function Ml(t,e){let r=an(e.id),n=vp(t,r);return n===null?!1:(ke(t,{stream_id:r,event_type:BN,observedLastSeq:n.last_seq,ts:e.ended_at??e.started_at,payload:{invocation_id:r,status:e.status,ended_at:e.ended_at,exit_code:e.exit_code,signal:e.signal,result_summary:e.result_summary,error:e.error,legacy:{table:"tracked_invocation",id:e.id}}},s=>{if(t.prepare(`UPDATE invocation_state
1121
1121
  SET status = ?, ended_at = ?, result_summary = ?, error = ?, last_seq = ?
1122
- WHERE invocation_id = ? AND last_seq = ?`).run(e.status,e.ended_at,e.result_summary,e.error,s,r,n.last_seq).changes!==1)throw new Error(`invocation_state CAS failed during INVOCATION_FINISH for ${r}`);Ml(e)&&wp(t,s,r)}),!0)}function bp(t,e,r,n){let s=an(e.id),i=vp(t,s);return i===null?!1:(ke(t,{stream_id:s,event_type:HN,observedLastSeq:i.last_seq,ts:n,payload:{invocation_id:s,notified_by:r,notified_at:n,legacy:{table:"tracked_invocation",id:e.id}}},o=>{if(t.prepare("UPDATE invocation_state SET notified_by = ?, notified_at = ?, last_seq = ? WHERE invocation_id = ? AND last_seq = ?").run(r,n,o,s,i.last_seq).changes!==1)throw new Error(`invocation_state CAS failed during INVOCATION_NOTIFY_CLAIM for ${s}`)}),!0)}function kp(t,e,r){let n=an(e.id);t.prepare("UPDATE invocation_state SET last_heartbeat_at = ? WHERE invocation_id = ?").run(r,n),Ml(e)&&Ep(t,n,r)}function Ip(t,e,r){t.prepare("UPDATE invocation_state SET request_payload = ? WHERE invocation_id = ?").run(r,an(e))}var qN,BN,HN,Np=E(()=>{"use strict";fi();gi();qN="INVOCATION_START",BN="INVOCATION_FINISH",HN="INVOCATION_NOTIFY_CLAIM"});function ln(t){return typeof t=="string"&&XN.has(t)}function Rp(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: ${yi[0]}`,` STANCE: ${yi[1]}`,` STANCE: ${yi[2]}`,` STANCE: ${Ap}: <one short sentence: why no declared outcome fits>`,"Never invent a different outcome; never leave the STANCE line out."].join(`
1123
- `)}var Ap,yi,XN,ds,xp,jl,Ei,cs=E(()=>{"use strict";Ap="other",yi=["not_enough_information","dont_know","other_work"],XN=new Set([Ap,...yi]),ds="@abort",xp="invalid_decision",jl="escalation_aborted",Ei="workflow_escalation"});import{randomUUID as Lp}from"node:crypto";import{hostname as us}from"node:os";function Xe(t){return t.provider_resolved??t.provider}function $(){return new Date().toISOString()}function Je(t){return new Pl(mi({dbPath:t.path}))}function Op(t,e,r){let n=$p(e);if(n.length===0)return;let s=new Set,i=[],o=l=>{if(l===t)return n;let d=r(l);if(d===null)throw new Error(`unknown workflow reference: ${l}`);return $p(d.definition)},a=l=>{let d=i.indexOf(l);if(d>=0)throw new Error(`cycle detected: ${[...i.slice(d),l].join(" -> ")}`);if(!s.has(l)){i.push(l);try{for(let c of o(l))a(c)}finally{i.pop()}s.add(l)}};a(t)}function $p(t){let e=JN(t),r=e===null?null:GN(e,"states");if(r===null)return[];let n=[];for(let s of Object.values(r))wi(s)&&s.type==="Subflow"&&typeof s.workflow_name=="string"&&s.workflow_name.length>0&&n.push(s.workflow_name);return n}function JN(t){try{let e=JSON.parse(t);return wi(e)?e:null}catch{return null}}function GN(t,e){let r=t[e];return wi(r)?r:null}function wi(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function VN(t){try{let e=JSON.parse(t);return!wi(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 KN(t,e){return t===null?!0:t.holder_host===us()?!ze(t.holder_pid):t.last_heartbeat<e}function YN(t,e){if(t.delivering_at===null)return{reclaim:!1,reason:"not-delivering",holderPidAlive:null};let r=t.delivering_at<e;if(t.delivery_holder_host===us()&&zN(t.delivery_holder_pid)){let n=ze(t.delivery_holder_pid);return n?r?{reclaim:!0,reason:"stale-live-local-pid",holderPidAlive:n}:{reclaim:!1,reason:"pid-still-alive",holderPidAlive:n}:{reclaim:!0,reason:"dead-local-pid",holderPidAlive:n}}return r?{reclaim:!0,reason:"stale-other-holder",holderPidAlive:null}:{reclaim:!1,reason:"not-yet-stale",holderPidAlive:null}}function dr(t,e,r={}){let n=new Date().toISOString(),s=e.delivering_at===null?NaN:Date.parse(e.delivering_at),i=Date.parse(n);C({event:t,event_at:n,message_id:e.id,message_type:e.message_type,lane_key:JSON.stringify([e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias]),sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,message_created_at:e.created_at,delivering_at:e.delivering_at,delivered_at:e.delivered_at,delivery_holder_pid:e.delivery_holder_pid,delivery_holder_host:e.delivery_holder_host,lease_age_ms:Number.isFinite(s)&&Number.isFinite(i)?Math.max(0,i-s):null,...r})}function zN(t){return Number.isInteger(t)&&(t??0)>0}function ZN(t){return{...np(t),getRuntimeState:t.prepare("SELECT * FROM runtime_state WHERE scope = ? AND key = ? AND kind = ?"),upsertRuntimeState:t.prepare(`
1122
+ WHERE invocation_id = ? AND last_seq = ?`).run(e.status,e.ended_at,e.result_summary,e.error,s,r,n.last_seq).changes!==1)throw new Error(`invocation_state CAS failed during INVOCATION_FINISH for ${r}`);Cl(e)&&wp(t,s,r)}),!0)}function bp(t,e,r,n){let s=an(e.id),i=vp(t,s);return i===null?!1:(ke(t,{stream_id:s,event_type:HN,observedLastSeq:i.last_seq,ts:n,payload:{invocation_id:s,notified_by:r,notified_at:n,legacy:{table:"tracked_invocation",id:e.id}}},o=>{if(t.prepare("UPDATE invocation_state SET notified_by = ?, notified_at = ?, last_seq = ? WHERE invocation_id = ? AND last_seq = ?").run(r,n,o,s,i.last_seq).changes!==1)throw new Error(`invocation_state CAS failed during INVOCATION_NOTIFY_CLAIM for ${s}`)}),!0)}function kp(t,e,r){let n=an(e.id);t.prepare("UPDATE invocation_state SET last_heartbeat_at = ? WHERE invocation_id = ?").run(r,n),Cl(e)&&Ep(t,n,r)}function Ip(t,e,r){t.prepare("UPDATE invocation_state SET request_payload = ? WHERE invocation_id = ?").run(r,an(e))}var qN,BN,HN,Np=E(()=>{"use strict";fi();gi();qN="INVOCATION_START",BN="INVOCATION_FINISH",HN="INVOCATION_NOTIFY_CLAIM"});function ln(t){return typeof t=="string"&&XN.has(t)}function Rp(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: ${yi[0]}`,` STANCE: ${yi[1]}`,` STANCE: ${yi[2]}`,` STANCE: ${Ap}: <one short sentence: why no declared outcome fits>`,"Never invent a different outcome; never leave the STANCE line out."].join(`
1123
+ `)}var Ap,yi,XN,ds,xp,Dl,Ei,cs=E(()=>{"use strict";Ap="other",yi=["not_enough_information","dont_know","other_work"],XN=new Set([Ap,...yi]),ds="@abort",xp="invalid_decision",Dl="escalation_aborted",Ei="workflow_escalation"});import{randomUUID as Lp}from"node:crypto";import{hostname as us}from"node:os";function Xe(t){return t.provider_resolved??t.provider}function $(){return new Date().toISOString()}function Je(t){return new jl(mi({dbPath:t.path}))}function Op(t,e,r){let n=$p(e);if(n.length===0)return;let s=new Set,i=[],o=l=>{if(l===t)return n;let d=r(l);if(d===null)throw new Error(`unknown workflow reference: ${l}`);return $p(d.definition)},a=l=>{let d=i.indexOf(l);if(d>=0)throw new Error(`cycle detected: ${[...i.slice(d),l].join(" -> ")}`);if(!s.has(l)){i.push(l);try{for(let c of o(l))a(c)}finally{i.pop()}s.add(l)}};a(t)}function $p(t){let e=JN(t),r=e===null?null:GN(e,"states");if(r===null)return[];let n=[];for(let s of Object.values(r))wi(s)&&s.type==="Subflow"&&typeof s.workflow_name=="string"&&s.workflow_name.length>0&&n.push(s.workflow_name);return n}function JN(t){try{let e=JSON.parse(t);return wi(e)?e:null}catch{return null}}function GN(t,e){let r=t[e];return wi(r)?r:null}function wi(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function VN(t){try{let e=JSON.parse(t);return!wi(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 KN(t,e){return t===null?!0:t.holder_host===us()?!ze(t.holder_pid):t.last_heartbeat<e}function YN(t,e){if(t.delivering_at===null)return{reclaim:!1,reason:"not-delivering",holderPidAlive:null};let r=t.delivering_at<e;if(t.delivery_holder_host===us()&&zN(t.delivery_holder_pid)){let n=ze(t.delivery_holder_pid);return n?r?{reclaim:!0,reason:"stale-live-local-pid",holderPidAlive:n}:{reclaim:!1,reason:"pid-still-alive",holderPidAlive:n}:{reclaim:!0,reason:"dead-local-pid",holderPidAlive:n}}return r?{reclaim:!0,reason:"stale-other-holder",holderPidAlive:null}:{reclaim:!1,reason:"not-yet-stale",holderPidAlive:null}}function dr(t,e,r={}){let n=new Date().toISOString(),s=e.delivering_at===null?NaN:Date.parse(e.delivering_at),i=Date.parse(n);C({event:t,event_at:n,message_id:e.id,message_type:e.message_type,lane_key:JSON.stringify([e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias]),sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,message_created_at:e.created_at,delivering_at:e.delivering_at,delivered_at:e.delivered_at,delivery_holder_pid:e.delivery_holder_pid,delivery_holder_host:e.delivery_holder_host,lease_age_ms:Number.isFinite(s)&&Number.isFinite(i)?Math.max(0,i-s):null,...r})}function zN(t){return Number.isInteger(t)&&(t??0)>0}function ZN(t){return{...np(t),getRuntimeState:t.prepare("SELECT * FROM runtime_state WHERE scope = ? AND key = ? AND kind = ?"),upsertRuntimeState:t.prepare(`
1124
1124
  INSERT INTO runtime_state (scope, key, kind, data, updated_at)
1125
1125
  VALUES (?, ?, ?, ?, ?)
1126
1126
  ON CONFLICT(scope, key, kind) DO UPDATE SET
@@ -1520,54 +1520,54 @@ var hI=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var he=(t,e)=>{f
1520
1520
  error_detail = ?,
1521
1521
  truncated = ?
1522
1522
  WHERE id = ?
1523
- `),...ep(t),...zf(t)}}function QN(t,e){return e===void 0?{resumed:!1,reason:t}:{resumed:!1,reason:t,valid:e}}var Pl,ct=E(()=>{"use strict";kl();Zf();tp();Il();ip();nn();me();gi();Np();cs();Pl=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;tryAcquireAgentInflightTxn;recvMailboxMessagesTxn;constructor(e){e.pragma("foreign_keys = ON"),this.db=e,this.stmts=ZN(e),this.claimTxn=e.transaction((r,n,s)=>{let i=this.stmts.selectClaimableJob.get(s,s,s);return i===void 0||this.stmts.claimJob.run(r,n,s,i.id,s,s,s).changes!==1?null:this.getJob(i.id)}),this.claimWithConcurrencyTxn=e.transaction((r,n,s,i)=>{let o=this.stmts.selectClaimableJobs.all(s,s,s);for(let a of o){let l=this.getJob(a.id);if(l===null)continue;let d=i(l);if(d.concurrency_key!==null&&(l.concurrency_key_resolved!==d.concurrency_key&&this.stmts.setJobConcurrencyKey.run(d.concurrency_key,l.id),(this.stmts.countRunningByConcurrencyKey.get(d.concurrency_key,s,l.id)?.count??0)>=Math.max(1,d.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,i,o)=>{let a=this.getJob(r);if(a===null)return{claimed:!1,reason:"not_found",job_id:r};if(a.locked_until!==null&&a.locked_until>=i)return{claimed:!1,reason:"locked",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let d=a.status==="queued"&&a.available_at<=i,c=a.status==="running"&&a.locked_until!==null&&a.locked_until<i;if(!d&&!c)return{claimed:!1,reason:"not_claimable",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let u=o(a);if(u.concurrency_key!==null&&(a.concurrency_key_resolved!==u.concurrency_key&&this.stmts.setJobConcurrencyKey.run(u.concurrency_key,a.id),(this.stmts.countRunningByConcurrencyKey.get(u.concurrency_key,i,a.id)?.count??0)>=Math.max(1,u.concurrent_limit)))return{claimed:!1,reason:"concurrency_limit",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};if(this.stmts.claimJob.run(n,s,i,a.id,i,i,i).changes!==1){let p=this.getJob(a.id);return{claimed:!1,reason:p?.locked_until!==null&&p?.locked_until!==void 0&&p.locked_until>=i?"locked":"not_claimable",job_id:r,status:p?.status??a.status,locked_by:p?.locked_by??a.locked_by,locked_until:p?.locked_until??a.locked_until}}let f=this.getJob(a.id);return f===null?{claimed:!1,reason:"not_found",job_id:r}:{claimed:!0,job:f}}),this.resumeRunTxn=e.transaction((r,n,s)=>QN("state_not_found")),this.resumeInteractiveTxn=e.transaction((r,n,s,i)=>{let o=this.getInteractiveSessionByStepId(r);if(o===null)return{resumed:!1,reason:"not_found"};if(o.status!=="waiting_operator")return{resumed:!1,reason:"not_waiting_operator"};let a=this.getRun(o.run_id);if(a===null)return{resumed:!1,reason:"run_not_found"};let l=s?"done":"waiting_agent";return this.stmts.updateInteractiveSession.run(l,n,Date.now(),o.id),this.stmts.resumeRunState.run(o.state_name,a.id),this.stmts.requeuePausedJob.run(i,a.job_id),{resumed:!0,session:this.getInteractiveSessionByStepId(r),run:this.getRun(a.id),job:this.getJob(a.job_id)}}),this.resumeEscalationTxn=e.transaction((r,n,s)=>{let i=this.stmts.getAttention.get(r);if(i===void 0)return{resumed:!1,reason:"not_found"};if(i.kind!==Ei)return{resumed:!1,reason:"wrong_kind"};if(i.acknowledged_at!==null)return{resumed:!1,reason:"already_acked"};if(i.run_id===null)return{resumed:!1,reason:"run_not_found"};let o=null,a=[];if(i.payload!==null)try{let c=JSON.parse(i.payload);c.step!==void 0&&typeof c.step.id=="string"&&c.step.id.length>0&&(o=c.step.id),Array.isArray(c.declared_outcomes)&&(a=c.declared_outcomes.filter(u=>typeof u=="string"))}catch{}if(o===null)return{resumed:!1,reason:"no_step"};let l=this.getRun(i.run_id);if(l===null)return{resumed:!1,reason:"run_not_found"};if(n!==ds&&!a.includes(n))return{resumed:!1,reason:xp};let d={};if(l.pending_escalation_decision!==null)try{let c=JSON.parse(l.pending_escalation_decision);c!==null&&typeof c=="object"&&!Array.isArray(c)&&(d=c)}catch{d={}}return d[o]=n,this.stmts.setRunPendingEscalationDecision.run(JSON.stringify(d),l.id),this.stmts.resumeRunState.run(o,l.id),this.stmts.requeuePausedJob.run(s,l.job_id),this.stmts.ackAttention.run(s,r),{resumed:!0,run:this.getRun(l.id),job:this.getJob(l.job_id)}}),this.tryAcquireAgentInflightTxn=(r,n={})=>{this.db.exec("BEGIN IMMEDIATE");try{let s=this.getAgentInflight(r.receiver_teamfile,r.receiver_alias),i=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:i?.sender_teamfile??null,reclaim_observed_sender_alias:i?.sender_alias??null,reclaim_observed_started_at:i?.started_at??null,reclaim_observed_holder_pid:typeof i?.holder_pid=="number"?i.holder_pid:null}),a=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")})()};if(o!==void 0){let l=s===null?null:n.reclaim_reason??(n.force===!0?"force":n.reclaim_observed!==void 0?"dead-pid":"stale");hp(this.db,o,s,l,n.stale_before??null,n.force===!0)}return this.db.exec("COMMIT"),a}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 i of s)as(this.db,i,"",$()),this.stmts.deleteMailboxMessage.run(i.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,o=>this.getWorkflowByName(o));let r=this.stmts.insertWorkflow.run(e.name,e.version??1,e.definition_schema_version??1,e.definition,$()),n=this.getWorkflow(Number(r.lastInsertRowid)),s=this.stmts.insertWorkflowVersion.run(n.id,n.version,e.definition,e.author??null,$());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 i=this.getWorkflow(n.id);return this.syncWorkflowTriggers(n.id,e.definition),i}upsertWorkflow(e){Op(e.name,e.definition,o=>this.getWorkflowByName(o));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,i=this.stmts.insertWorkflowVersion.run(r.id,s,e.definition,e.author??null,$());return this.stmts.updateWorkflowActiveVersionDefinitionAndVersion.run(Number(i.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,$())}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 i=(this.stmts.getLatestWorkflowVersion.get(e)?.version??0)+1,o=this.stmts.insertWorkflowVersion.run(e,i,r,n??null,$());return this.stmts.getWorkflowVersion.get(o.lastInsertRowid)}activateWorkflowVersion(e,r){let n=this.getWorkflowVersionById(r);if(n===null||n.workflow_id!==e)return null;let s=1;try{let i=JSON.parse(n.definition);typeof i.definition_schema_version=="number"&&(s=i.definition_schema_version)}catch{}return this.stmts.updateWorkflowActiveVersionAndDefinition.run(r,n.definition,s,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,$()),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,$(),e),this.stmts.getTriggerInstance.get(e)??null}setTriggerFailure(e,r){return this.stmts.setTriggerFailure.run($(),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 i of s){if(i===null||typeof i!="object"||Array.isArray(i))continue;let o=i;typeof o.id!="string"||o.id.length===0||typeof o.type!="string"||o.type.length===0||this.upsertTriggerInstance({workflow_id:e,trigger_id:o.id,trigger_type:o.type,parameters:JSON.stringify(o.parameters??{})})}}insertTeam(e){let r=this.stmts.insertTeam.run(e.name,$());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,$());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,$(),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"),i=Object.prototype.hasOwnProperty.call(r,"model"),o=Object.prototype.hasOwnProperty.call(r,"provider");return this.stmts.updateTeamMemberMeta.run(s?r.role_prompt??null:n.role_prompt,i?r.model??null:n.model,o?r.provider??n.provider:n.provider,e),this.stmts.getTeamMember.get(e)??null}insertTeamMemberCompanion(e){let r=this.stmts.insertTeamMemberCompanion.run(e.interpreter_id,e.companion_id,$());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",$());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"),i=Object.prototype.hasOwnProperty.call(r,"durable_memory_mode"),o=Object.prototype.hasOwnProperty.call(r,"default_branch"),a=Object.prototype.hasOwnProperty.call(r,"intake_config");return this.stmts.updateProjectSettings.run(s?r.local_path:n.local_path,i?r.durable_memory_mode:n.durable_memory_mode,o?r.default_branch??null:n.default_branch,a?r.intake_config??null:n.intake_config,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,$());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=$(),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,$(),e)??null}claimIssue(e,r){return this.stmts.claimIssue.get(r,$(),e)??null}closeIssue(e,r,n){let s=$(),i=this.stmts.closeIssue.get(r,n??null,s,s,e);if(i===void 0)throw new Error(`issue not found: ${e}`);return i}reopenIssue(e,r){let n=this.stmts.reopenIssue.get(r,$(),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"),i=Object.prototype.hasOwnProperty.call(r,"ai_test_path"),o=this.stmts.updateIssue.get(r.title??n.title,r.body??n.body,r.severity??n.severity,s?r.labels??null:n.labels,i?r.ai_test_path??null:n.ai_test_path,$(),e);if(o===void 0)throw new Error(`issue not found: ${e}`);return o}listWorkflows(){return this.stmts.listWorkflows.all()}getOrCreateWebuiSession(e,r){let n=this.stmts.getWebuiSession.get(e);if(n!==void 0)return n;let s=$();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,i){if(this.stmts.updateWebuiSessionTransition.run(r,n,s,i,$(),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,$(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}createChatbotSession(e,r){let n=Lp(),s=$();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 i=$(),o=this.stmts.insertChatbotMessage.run(e,r,n,s??null,i);return this.stmts.touchChatbotSession.run(i,e),this.stmts.getChatbotMessage.get(o.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,$())}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??$(),e.dedupe_key??null,e.concurrency_key??null,$());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=$(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimTxn(e.worker_id,n,r)}claimNextJobWithConcurrency(e){let r=$(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimWithConcurrencyTxn(e.worker_id,n,r,e.evaluator)}claimJobByIdWithConcurrency(e){let r=$(),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:$();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,$()),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,$()),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??$(),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,$());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=$(),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),i=this.getWebProject(s);if(i===null)throw new Error(`web_project ${s} missing after insert`);return i}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,$(),e.id),this.getWebProject(e.id))}softDeleteWebProject(e){return this.stmts.softDeleteWebProject.run($(),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){return this.db.transaction(()=>{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),n=Number(r.lastInsertRowid);return fp(this.db,n,e),n})()}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){return this.db.transaction(()=>this.startTrackedInvocationInner(e))()}startTrackedInvocationInner(e){let r=e.started_at??$(),n=e.holder_host??us(),s=e.last_heartbeat_at??r,i=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,Ut(e.command),r,e.holder_pid??null,n,s,Ut(e.meta),e.launch_source??e.kind,e.request_payload??null),o=this.getTrackedInvocation(Number(i.lastInsertRowid));return Sp(this.db,o),o}getTrackedInvocation(e){return this.stmts.getTrackedInvocation.get(e)??null}listAllRunningTrackedInvocations(){return this.stmts.listAllRunningTrackedInvocations.all()}finishTrackedInvocation(e,r){return this.db.transaction(()=>{let n=r.ended_at??$();if(this.stmts.finishTrackedInvocation.run(r.status,n,r.exit_code??null,r.signal??null,Ut(r.result_summary),Ut(r.error),r.team_chat_log_id??null,Ut(r.meta),n,e).changes!==1)return null;let i=this.getTrackedInvocation(e);return Dl(this.db,i),i})()}reclaimTrackedInvocationIfUnchanged(e,r,n){return this.db.transaction(()=>{let s=n.ended_at??$();if(this.stmts.reclaimTrackedInvocationIfUnchanged.run(n.status,s,n.exit_code??null,n.signal??null,Ut(n.result_summary),Ut(n.error),n.team_chat_log_id??null,Ut(n.meta),s,e,r.holder_pid,r.holder_host,r.started_at,r.last_heartbeat_at).changes!==1)return null;let o=this.getTrackedInvocation(e);return Dl(this.db,o),o})()}heartbeatTrackedInvocation(e,r=$()){return this.db.transaction(()=>{if(this.stmts.heartbeatTrackedInvocation.run(r,e).changes!==1)return null;let s=this.getTrackedInvocation(e);return kp(this.db,s,r),s})()}updateTrackedInvocationRequestPayload(e,r){return this.db.transaction(()=>this.stmts.updateTrackedInvocationRequestPayload.run(r,e).changes!==1?null:(Ip(this.db,e,r),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=$()){return this.db.transaction(()=>{if(this.stmts.claimTrackedInvocationNotification.run(r,n,e).changes!==1)return null;let i=this.getTrackedInvocation(e);return bp(this.db,i,r,n),i})()}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 i=r.length===0?"":` WHERE ${r.join(" AND ")}`;return this.db.prepare(`SELECT * FROM tracked_invocation${i} ORDER BY started_at DESC, id DESC LIMIT ?`).all(...n)}maxTrackedInvocationId(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 ")}`,i=this.db.prepare(`SELECT COALESCE(MAX(id), 0) AS max_id FROM tracked_invocation${s}`).get(...n);return Number(i?.max_id??0)}listRunningTrackedInvocations(e={}){return this.listTrackedInvocations({...e,status:"running"})}enqueueMail(e){return this.sendMailboxMessage(e)}sendMailboxMessage(e){return this.db.transaction(()=>{let n=this.stmts.insertMailboxMessage.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile??null,e.sender_alias??null,e.root_teamfile??null,ns(e.payload),e.created_at??$(),e.remote_transport??null,e.remote_message_id??null,e.remote_thread_id??null,e.meta??null,e.message_type??"request",e.reply_mode??"pull",e.request_mailbox_id??null),s=this.getMailboxMessage(Number(n.lastInsertRowid));return Ol(this.db,s,{provider:e.receiver_provider,sessionId:e.receiver_session_id},{provider:e.sender_provider,sessionId:e.sender_session_id}),s})()}listEnqueuedRequestMailFromSender(e,r,n,s){return this.stmts.listEnqueuedRequestMailFromSender.all(e,r,n,s)}listEnqueuedResponseMailFromSender(e,r,n,s){return this.stmts.listEnqueuedResponseMailFromSender.all(e,r,n,s)}listRelayMailboxLanes(e){return this.stmts.listRelayMailboxLanes.all(Math.max(1,Math.trunc(e)))}markMailDelivered(e,r,n){let s=[...new Set(e.map(a=>Math.trunc(a)).filter(a=>Number.isInteger(a)&&a>0))];if(s.length===0)return 0;let i=ns(r),o=[];this.db.exec("BEGIN IMMEDIATE");try{let a=0;for(let l of s){let d=this.getMailboxMessage(l),c=this.stmts.markMailboxMessageDelivered.run(n,i,l);a+=c.changes,c.changes===1&&d!==null&&(as(this.db,d,i,n),o.push(d))}this.db.exec("COMMIT");for(let l of o)dr("mailbox_delivery_delivered",l,{transition:l.delivering_at===null?"pending->delivered":"delivering->delivered",delivered_at:n});return a}catch(a){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),a}}markRelayRequestDelivered(e,r,n){let s=ns(r),i=[],o=[];this.db.exec("BEGIN IMMEDIATE");try{let a=0;for(let l of e){if(this.stmts.markMailboxMessageDeliveredIfUnchanged.run(n,s,l.id,l.delivering_at,l.delivery_holder_pid,l.delivery_holder_host).changes!==1){o.push(l);continue}as(this.db,l,s,n),a+=1,i.push(l)}this.db.exec("COMMIT");for(let l of i)dr("mailbox_delivery_delivered",l,{transition:"delivering->delivered",delivered_at:n,finalizer:"lease-cas"});for(let l of o)dr("mailbox_delivery_finalize_skipped",l,{delivered_at:n,finalizer:"lease-cas",reason:"observed delivery lease changed before finalization"});return a}catch(a){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),a}}markRelayRequestDeliveredAndEnqueueResponses(e,r,n){let s=ns(r),i=[],o=[];this.db.exec("BEGIN IMMEDIATE");try{let a=0,l=0;for(let f of e){if(this.stmts.markMailboxMessageDeliveredIfUnchanged.run(n,s,f.id,f.delivering_at,f.delivery_holder_pid,f.delivery_holder_host).changes!==1){o.push(f);continue}a+=1,i.push(f)}let d=[...i].sort((f,p)=>f.created_at.localeCompare(p.created_at)||f.id-p.id),c=d.at(-1)??null,u=null;if(c!==null&&c.sender_teamfile!==null&&c.sender_alias!==null){let f=this.stmts.insertMailboxResponseIfAbsent.run(c.sender_teamfile,c.sender_alias,c.receiver_teamfile,c.receiver_alias,c.root_teamfile,s,n,null,null,null,null,c.reply_mode,c.id);if(l=f.changes,f.changes===1&&(u=this.getMailboxMessage(Number(f.lastInsertRowid)),u===null))throw new Error("mailbox response disappeared during event append")}let m=u===null?null:It(u.id);for(let f of i)as(this.db,f,s,n,c!==null&&f.id!==c.id?m:null);u!==null&&Ol(this.db,u,{},{},d.map(f=>It(f.id))),this.db.exec("COMMIT");for(let f of i)dr("mailbox_delivery_delivered",f,{transition:"delivering->delivered",delivered_at:n,finalizer:"lease-cas-with-response"});for(let f of o)dr("mailbox_delivery_finalize_skipped",f,{delivered_at:n,finalizer:"lease-cas-with-response",reason:"observed delivery lease changed before finalization"});return{marked:a,responses:l}}catch(a){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),a}}claimMailForDelivery(e,r,n=process.pid,s=us()){let i=[...new Set(e.map(o=>Math.trunc(o)).filter(o=>Number.isInteger(o)&&o>0))];if(i.length===0)return[];this.db.exec("BEGIN IMMEDIATE");try{let o=[];for(let l of i)if(this.stmts.claimMailboxMessageDelivery.run(r,n,s,l).changes===1){let c=this.getMailboxMessage(l);c!==null&&(pp(this.db,c,r,n,s),o.push(c))}this.db.exec("COMMIT");let a=o.map(l=>l.id);for(let l of o)dr("mailbox_delivery_claimed",l,{transition:"pending->delivering",batch_ids:a,delivering_at:r,delivery_holder_pid:n,delivery_holder_host:s});return o}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}clearMailDelivery(e){let r=[...new Set(e.map(s=>Math.trunc(s)).filter(s=>Number.isInteger(s)&&s>0))];if(r.length===0)return 0;let n=[];this.db.exec("BEGIN IMMEDIATE");try{let s=0;for(let i of r){let o=this.getMailboxMessage(i),a=this.stmts.clearMailboxMessageDelivery.run(i);s+=a.changes,a.changes===1&&o!==null&&o.delivering_at!==null&&($l(this.db,o,"explicit-clear"),n.push(o))}this.db.exec("COMMIT");for(let i of n)dr("mailbox_delivery_cleared",i,{transition:"delivering->pending",reason:"explicit non-CAS clear"});return s}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}reclaimMailboxDeliveryIfUnchanged(e,r="delivery-failure"){return this.db.transaction(()=>{let s=this.getMailboxMessage(e.id);if(this.stmts.clearMailboxMessageDeliveryIfUnchanged.run(e.id,e.delivering_at,e.delivery_holder_pid,e.delivery_holder_host).changes!==1)return null;if(s===null)throw new Error("mailbox row disappeared during claim release");return s.delivering_at!==null&&$l(this.db,s,r),this.getMailboxMessage(e.id)})()}reclaimStaleMailboxDeliveries(e){let r=this.stmts.listInFlightMailboxDeliveries.all(),n=[],s=[];this.db.exec("BEGIN IMMEDIATE");try{for(let i of r){let o=YN(i,e);if(!o.reclaim){s.push({row:i,decision:o,reclaimed:!1});continue}let a=this.reclaimMailboxDeliveryIfUnchanged(i,o.reason),l=a!==null;s.push({row:i,decision:o,reclaimed:l}),l&&n.push(a)}this.db.exec("COMMIT");for(let i of s)dr(i.decision.reclaim?i.reclaimed?"mailbox_delivery_reclaimed":"mailbox_delivery_reclaim_raced":"mailbox_delivery_reclaim_deferred",i.row,{transition:i.reclaimed?"delivering->pending":"delivering->delivering",stale_before:e,reclaim_reason:i.decision.reason,holder_pid_alive:i.decision.holderPidAlive});return n}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}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.db.transaction(()=>{let s=this.getAgentInflight(e,r);if(s===null)return;this.stmts.clearAgentInflight.run(e,r).changes===1&&ls(this.db,s,"INFLIGHT_RECLAIM","stale")})()}clearObservedTerminalAgentInflight(e,r,n){return this.db.transaction(()=>{let i=this.getAgentInflight(e,r),o=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});return o.changes===1&&i!==null&&ls(this.db,i,"INFLIGHT_RELEASE"),o.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){let s=this.stmts.clearAgentInflightIfSender.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias);return s.changes===1&&ls(this.db,r,"INFLIGHT_RELEASE"),this.db.exec("COMMIT"),s.changes===1}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.db.transaction(()=>{let n=this.listAgentInflight().filter(i=>i.started_at<e),s=0;for(let i of n)this.stmts.clearAgentInflight.run(i.receiver_teamfile,i.receiver_alias).changes===1&&(ls(this.db,i,"INFLIGHT_RECLAIM","stale"),s+=1);return s})()}getTerminalLock(e,r){let n=this.stmts.getRuntimeState.get(ss,os(e,r),is);return n===void 0?null:sp(n.data)}setTerminalLock(e){this.db.transaction(()=>{let n=this.getTerminalLock(e.teamfile,e.alias);n!==null&&n.lock_id!==e.lock_id&&Cl(this.db,n,!0),this.stmts.upsertRuntimeState.run(ss,os(e.teamfile,e.alias),is,JSON.stringify(e),e.last_heartbeat),n?.lock_id!==e.lock_id&&gp(this.db,e)})()}heartbeatTerminalLock(e,r,n,s){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getTerminalLock(e,r);if(i===null||i.lock_id!==n)return this.db.exec("COMMIT"),!1;let o={...i,last_heartbeat:s};return this.stmts.upsertRuntimeState.run(ss,os(e,r),is,JSON.stringify(o),s),this.db.exec("COMMIT"),!0}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}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 i=this.stmts.deleteRuntimeState.run(ss,os(e,r),is);return i.changes===1&&Cl(this.db,s),this.db.exec("COMMIT"),i.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:VN(s.data)}tryAcquireRuntimeProcessLock(e,r,n,s,i=$()){this.db.exec("BEGIN IMMEDIATE");try{let o=this.getRuntimeProcessLock(e,r,n);if(o!==null&&!KN(o,s))return this.db.exec("COMMIT"),{acquired:!1,current:o};let a={lock_id:Lp(),holder_pid:process.pid,holder_host:us(),started_at:i,last_heartbeat:i};return this.stmts.upsertRuntimeState.run(e,r,n,JSON.stringify(a),i),this.db.exec("COMMIT"),{acquired:!0,lock:a,previous:o}}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}clearRuntimeProcessLock(e,r,n,s){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getRuntimeProcessLock(e,r,n);if(i===null||i.lock_id!==s)return this.db.exec("COMMIT"),!1;let o=this.stmts.deleteRuntimeState.run(e,r,n);return this.db.exec("COMMIT"),o.changes===1}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}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,$(),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,$())}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,$());return this.stmts.getStep.get(r.lastInsertRowid)}finishStep(e,r,n){return this.stmts.finishStep.run(r??null,n??null,$(),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??$(),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,$());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,$()).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,$()),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,$());return this.stmts.getAttention.get(r.lastInsertRowid)}acknowledgeAttention(e){return this.stmts.ackAttention.run($(),e),this.stmts.getAttention.get(e)??null}upsertDurableMemory(e){let r=$();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:i,type:o,updated_at:a})=>({name:s,description:i,type:o,updated_at:a})):this.stmts.listDurableMemory.all(e).map(({name:n,description:s,type:i,updated_at:o})=>({name:n,description:s,type:i,updated_at:o}))}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??$());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,i=0;for(let o of r)try{let a=JSON.parse(o.payload);typeof a.tokens_in=="number"&&(n+=a.tokens_in),typeof a.tokens_out=="number"&&(s+=a.tokens_out),i+=1}catch{}return{totalInputTokens:n,totalOutputTokens:s,agentCallCount:i}}addRollupValue(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,$())}resumeEscalation(e,r){return this.resumeEscalationTxn(e,r,$())}}});import{realpathSync as eA}from"node:fs";import{resolve as tA}from"node:path";function Fl(t){let e=tA(t);try{return eA(e)}catch{return e}}var Cp=E(()=>{"use strict"});import{platform as Mp}from"node:os";function Nt(t){let e=new ms;for(let r of t)e.registerAdapter(r);return e}var ms,Ul=E(()=>{"use strict";Cp();ms=class{providers=[];adapters=new Map;register(e){this.providers.push(e)}async listAll(e){let r=[],n=e?.provider?this.providers.filter(o=>o.name===e.provider):this.providers,s=await Promise.all(n.map(o=>o.discoverSessions()));for(let o of s)r.push(...o);let i=r;if(e?.workspace){let o=Fl(e.workspace);i=i.filter(a=>Fl(a.cwd)===o)}if(e?.from){let o=e.from.getTime();i=i.filter(a=>a.modifiedAt.getTime()>=o)}if(e?.to){let o=e.to.getTime();i=i.filter(a=>a.modifiedAt.getTime()<=o)}return i.sort((o,a)=>a.modifiedAt.getTime()-o.modifiedAt.getTime()),e?.limit&&(i=i.slice(0,e.limit)),i}async getSession(e,r){let n=r?this.providers.filter(s=>s.name===r):this.providers;for(let s of n){let i=await s.loadSession(e);if(i)return i}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(i=>i.name===r):this.providers,s=[];for(let i of n){let o=await i.resolveSessionPath(e);o&&s.push({provider:i,filePath:o})}return s}getWatchTargets(){let e=Mp()==="darwin"||Mp()==="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 Dp}from"node:fs";import{createInterface as jp}from"node:readline";import{stat as rA}from"node:fs/promises";import{homedir as nA}from"node:os";async function*Ge(t){let e=Dp(t,{encoding:"utf-8"}),r=jp({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 Pe(t,e){let r=[],n=Dp(t,{encoding:"utf-8"}),s=jp({input:n,crlfDelay:1/0});try{for await(let i of s){let o=i.trim();if(o){try{r.push(JSON.parse(o))}catch{}if(r.length>=e)break}}}finally{s.close(),n.destroy()}return r}async function Re(t){let e=await rA(t);return{createdAt:e.birthtime,modifiedAt:e.mtime}}function pe(t){return t.replace(/\\n/g,`
1524
- `).replace(/\\t/g," ").replace(/\\r/g,"\r")}function H(t,e){return t.length<=e?t:t.slice(0,e-3)+"..."}var Ie,cr=E(()=>{"use strict";Ie=nA()});import{readdir as Ti,stat as Pp,unlink as sA}from"node:fs/promises";import{join as dn,basename as Fp}from"node:path";function iA(t){return t==="file-history-snapshot"||t==="progress"||t==="system"||t==="queue-operation"}function oA(t){if(t.type==="system"){let e=t.message?.content;if(typeof e=="string"&&e.trim())return pe(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 Up(t){let e=0,r=0,n=0,s=0,i=0,o=0,a;for await(let l of Ge(t))if(!l.isSidechain){if(l.type==="user"&&!l.isMeta&&l.message){let d=l.message.content;if(typeof d=="string"){if(d.includes("<command-name>")||d.includes("<local-command-"))continue;e++}}else if(l.type==="assistant"&&l.message){let d=l.message.content;if(Array.isArray(d))for(let u of d)u.type==="text"&&e++;let c=l.message.usage;if(c){let u=c.input_tokens||0,m=c.cache_creation_input_tokens||0,f=c.cache_read_input_tokens||0,p=c.output_tokens||0;r+=u+m+f,n+=f,s+=m,i+=p;let h=u+m+f;h&&(o=h),a={inputTokens:u,cacheWriteInputTokens:m,cachedInputTokens:f,outputTokens:p}}}}return{messageCount:e,totalInputTokens:r,totalCacheReadInputTokens:n,totalCacheWriteInputTokens:s,totalOutputTokens:i,lastInputTokens:o,lastTokenUsage:a}}var vi,Wp=E(()=>{"use strict";cr();vi=class{name="claude";claudeDir;projectsDir;constructor(e={}){this.claudeDir=e.claudeDir||dn(Ie,".claude"),this.projectsDir=dn(this.claudeDir,"projects")}getWatchPaths(){return[{directory:this.projectsDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await Ti(this.projectsDir)}catch{return e}for(let n of r){let s=dn(this.projectsDir,n);if(!(await Pp(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await Ti(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=Fp(a,".jsonl");if(!/^[0-9a-f]{8}-/.test(l))continue;let d=dn(s,a);try{let c=await this.extractSummary(d,l);c&&e.push(c)}catch{}}}return e}async extractSummary(e,r){let n=await Pe(e,50),s=await Re(e),i="",o,a,l,d,c,u;for(let f of n)if(!iA(f.type)&&(!i&&f.cwd&&(i=f.cwd),!o&&f.slug&&(o=f.slug),!a&&f.version&&(a=f.version),!u&&f.timestamp&&(u=new Date(f.timestamp)),f.type==="assistant"&&f.message?.model&&(l=f.message.model),f.type==="user"&&!f.isMeta&&f.message)){let p=f.message.content;if(typeof p=="string"){if(p.includes("<command-name>")||p.includes("<local-command-"))continue;d||(d=H(p.trim(),80)),c=H(p.trim(),80)}}if(!i)return null;let m=await Up(e);return{provider:"claude",sessionId:r,slug:o,cwd:i,createdAt:u||s.createdAt,modifiedAt:s.modifiedAt,model:l,cliVersion:a,startCommand:"claude",firstUserMessage:d,lastUserMessage:c,messageCount:m.messageCount,filePath:e,totalInputTokens:m.totalInputTokens||void 0,totalCachedInputTokens:m.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:m.totalCacheWriteInputTokens||void 0,totalOutputTokens:m.totalOutputTokens||void 0,lastInputTokens:m.lastInputTokens||void 0,lastTokenUsage:m.lastTokenUsage}}async loadSession(e){let r=await this.resolveSessionFile(e);if(!r)return null;let n=await Re(r),s=[],i="",o,a,l,d,c,u,m,f=e;for await(let h of Ge(r))if(h.type!=="file-history-snapshot"&&!h.isSidechain){if(!i&&h.cwd&&(i=h.cwd),!o&&h.slug&&(o=h.slug),!a&&h.version&&(a=h.version),!d&&h.gitBranch&&(d=h.gitBranch),!m&&h.timestamp&&(m=new Date(h.timestamp)),h.sessionId&&(f=h.sessionId),h.type==="system"||h.type==="progress"||h.type==="queue-operation"){s.push({role:"system",timestamp:new Date(h.timestamp||0),content:oA(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;c||(c=H(_.trim(),80)),u=H(_.trim(),80),s.push({role:"user",timestamp:g,content:pe(_.trim())})}else if(Array.isArray(_)){for(let y of _)if(y.type==="tool_result"){let T=typeof y.content=="string"?pe(y.content):JSON.stringify(y.content);s.push({role:"tool_result",timestamp:g,content:T,toolCallId:y.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 y of _)y.type==="text"&&y.text?s.push({role:"assistant",timestamp:g,content:pe(y.text),model:h.message.model}):y.type==="tool_use"?s.push({role:"tool_use",timestamp:g,content:y.name||"unknown tool",toolName:y.name,toolInput:JSON.stringify(y.input,null,2),toolCallId:y.id,model:h.message.model}):y.type==="thinking"&&y.thinking&&s.push({role:"thinking",timestamp:g,content:y.thinking})}}if(!i)return null;let p=await Up(r);return{provider:"claude",sessionId:f,slug:o,cwd:i,createdAt:m||n.createdAt,modifiedAt:n.modifiedAt,model:l,cliVersion:a,startCommand:"claude",gitBranch:d,firstUserMessage:c,lastUserMessage:u,messageCount:p.messageCount,filePath:r,totalInputTokens:p.totalInputTokens||void 0,totalCachedInputTokens:p.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:p.totalCacheWriteInputTokens||void 0,totalOutputTokens:p.totalOutputTokens||void 0,lastInputTokens:p.lastInputTokens||void 0,lastTokenUsage:p.lastTokenUsage,messages:s}}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await sA(r),!0):!1}async resolveSessionFile(e){let r;try{r=await Ti(this.projectsDir)}catch{return null}let n=[];for(let o of r){let a=dn(this.projectsDir,o);if(!(await Pp(a).catch(()=>null))?.isDirectory())continue;let d;try{d=await Ti(a)}catch{continue}for(let c of d){if(!c.endsWith(".jsonl"))continue;let u=Fp(c,".jsonl");/^[0-9a-f]{8}-/.test(u)&&n.push({filePath:dn(a,c),fileSessionId:u})}}let s=n.find(o=>o.fileSessionId===e);if(s)return s.filePath;let i=n.filter(o=>o.fileSessionId.startsWith(e));if(i.length===1)return i[0].filePath;for(let o of n){let a=await Pe(o.filePath,20);for(let l of a)if(l.slug&&l.slug===e)return o.filePath}return null}}});function Si(t){return"'"+t.replace(/'/g,"'\\''")+"'"}function lA(t,e,r){if(!r)return"";let n=t.tools[e]??Wl[e],s=n?.profiles?.[r]?.flags??Wl[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 qp(t,e){return!!t.tools[e]}function Bp(t,e,r,n,s){let i=t.tools[e]??Wl[e],o;if(i?.agent){let l=Si(n);o=i.agent.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,l)}else{let l=aA[e];if(!l)throw new Error(`No agent command configured for tool "${e}"`);let d=l.argv.map(c=>c.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,n));if(l.mode==="stdin"){let c=d.map(Si).join(" ");o=`printf '%s\\n' ${Si(n)} | ${c}`}else o=d.map(Si).join(" ")}let a=lA(t,e,s);return a&&(o+=" "+a),o}var Wl,aA,Hp=E(()=>{"use strict";Wl={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:""}}}},aA={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 Xp(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 Jp=E(()=>{"use strict"});var dA,Ee,bi,At=E(()=>{"use strict";dA="ACK: waiting for explicit lmctl task.",Ee=`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: ${dA}`,bi=`send this exact lmctl seed instruction: "${Ee}"`});function ur(t,e){let r={...t??process.env,PWD:e};return delete r.OLDPWD,r}function uA(t,e){return e===void 0||e.length===0?t:{...t??process.env,[fs]:e}}function Fe(t,e,r,n="chat"){return{...uA(ur(t,e),r),[cA]:n}}var fs,cA,ut=E(()=>{"use strict";fs="LMCTL_SELF_SESSIONID",cA="LMCTL_LAUNCH_SOURCE"});import{spawn as Gp}from"node:child_process";import{mkdirSync as mA}from"node:fs";var ql,Le,Ht=E(()=>{"use strict";Hp();Jp();At();ut();ql=class t extends Error{cancelReason;constructor(e,r){super(e),this.name="TurnAbortError",this.cancelReason=r,Object.setPrototypeOf(this,t.prototype)}},Le=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===Ee?r:n)}seed(e,r){return mA(e,{recursive:!0}),new Promise(n=>{let s;try{s=Gp(this.binary,this.seedArgsFor(r),{cwd:e,env:ur(void 0,e),stdio:["pipe","pipe","pipe"],timeout:6e4})}catch(a){return n({success:!1,error:a instanceof Error?a.message:String(a)})}let i="";s.stderr?.on("data",a=>{i+=a.toString()});let o=r?.prompt!==void 0&&this.seedStdin!==void 0?`${r.prompt}
1525
- `:this.seedStdin;o&&s.stdin?.write(o),s.stdin?.end(),s.on("exit",a=>{n(a===0||a===null?{success:!0}:{success:!1,error:i.trim().slice(0,200)||`exit code ${a}`})}),s.on("error",a=>{n({success:!1,error:a.message})})})}resumeCommand(e,r){return this.resumeTemplate.replace(/\{\{session_id\}\}/g,e)}startCommand(e){return this.startTemplate}manualSeedHint(e){return{launchCommand:`cd ${e} && ${this.binary}`,postLaunchNote:bi,lsCommand:`lmctl ls --provider ${this.name} --sessiondir ${e}`}}static DEFAULT_IDLE_TIMEOUT_MS=8*60*60*1e3;sendTurn(e,r){if(r.userConfig&&qp(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,i,o,a="",l,d=()=>{e<=0||(clearTimeout(i),i=setTimeout(()=>{n.onIdleWarning?.(e),c(),s.abort(),l&&l({text:a,sessionId:n.sessionId,durationMs:e,status:"stalled",stalledAfterMs:e})},e))},c=()=>{clearTimeout(i)};n.signal&&(n.signal.aborted?(o="external",s.abort()):n.signal.addEventListener("abort",()=>{o="external",s.abort()},{once:!0})),d();let u={...n,binary:this.binary,signal:s.signal,onDelta:p=>{a+=p,d(),n.onDelta?.(p)},onProgress:p=>{p.kind!=="api_retry"&&d(),n.onProgress?.(p)}},m=this.transportFn(r,u).then(p=>(c(),{...p,status:"ok"})).catch(p=>{throw c(),o==="external"?new ql("Turn cancelled","external"):p}),f=new Promise(p=>{l=p});return Promise.race([m,f])}runOneShotAgent(e,r,n){let s=Bp(r.userConfig,this.name,r.sessionId,e,r.profile),i=Date.now();return new Promise((o,a)=>{let l=Xp(r.env),d=Gp(s,{shell:!0,cwd:r.cwd,env:Fe(r.env,r.cwd,r.sessionId),stdio:["pipe","pipe","pipe"]}),c=!1,u=!1,m=setTimeout(()=>{u=!0,d.kill()},l),f="",p="";if(d.stdout?.on("data",h=>{let g=h.toString();f+=g,r.onDelta?.(g)}),d.stderr?.on("data",h=>{p+=h.toString()}),r.signal){if(r.signal.aborted)return clearTimeout(m),d.kill(),a(new Error("Aborted"));r.signal.addEventListener("abort",()=>d.kill(),{once:!0})}d.on("exit",h=>{if(c)return;c=!0,clearTimeout(m);let g=Date.now()-i;u?a(new Error(`Agent command timed out after ${l}ms`)):h===0||h===null?o({text:f.trim(),sessionId:r.sessionId,durationMs:g}):a(new Error(p.trim().slice(0,200)||`Agent command exited with code ${h}`))}),d.on("error",h=>{c||(c=!0,clearTimeout(m),a(h))})})}}});function Ii(t,e){let r;if(e&&typeof e=="object"){let n=e.code;typeof n=="number"&&(r=n)}return new Jt(t,r,e)}var st,we,Xt,ki,Jt,cn=E(()=>{"use strict";st=class extends Error{constructor(e,r){super(e,r),this.name=this.constructor.name}},we=class extends st{},Xt=class extends st{exitCode;signal;stderr;constructor(e,r,n=null,s){super(e),this.exitCode=r,this.signal=n,this.stderr=s}},ki=class extends st{line;constructor(e,r,n){super(e,{cause:n}),this.line=r}},Jt=class extends st{rpcCode;rpcData;constructor(e,r,n){super(e),r!==void 0&&(this.rpcCode=r),n!==void 0&&(this.rpcData=n)}}});import*as Hl from"node:child_process";function pA(t){if(typeof Hl.spawnSync=="function")try{Hl.spawnSync("taskkill",["/T","/F","/PID",String(t)],{windowsHide:!0})}catch{}}function Vp(t){return t.exitCode!==null||t.signalCode!==null}function Bl(t,e){return Vp(t)?Promise.resolve(!0):new Promise(r=>{let n=!1,s=()=>{n||(n=!0,clearTimeout(i),r(!0))},i=setTimeout(()=>{n||(n=!0,t.removeListener("exit",s),r(!1))},e);t.once("exit",s)})}async function it(t,e={}){let r=Date.now(),n=e.stdinEnd!==!1,s=e.softDelayMs??5e3,i=e.killDelayMs??5e3,o=e.platform??process.platform,a=e.runTaskkill??pA;if(Vp(t))return{signal:"natural",elapsedMs:Date.now()-r};if(n&&t.stdin&&!t.stdin.destroyed)try{t.stdin.end()}catch{}if(await Bl(t,s))return{signal:"stdin",elapsedMs:Date.now()-r};if(o==="win32"&&typeof t.pid=="number")a(t.pid);else try{t.kill("SIGTERM")}catch{}if(await Bl(t,i))return{signal:"SIGTERM",elapsedMs:Date.now()-r};if(o!=="win32")try{t.kill("SIGKILL")}catch{}return await Bl(t,fA)?{signal:"SIGKILL",elapsedMs:Date.now()-r}:{signal:"abandoned",elapsedMs:Date.now()-r}}var fA,Ni=E(()=>{"use strict";fA=1e3});function Kp(t){ue()&&Oe({event:"legacy",msg:`[debug] ${t}`},{always:!0})}function mr(t,e){let r=hA[t];if(r)return r[e]??r.yolo}function yA(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 mt(t,e,r="yolo"){if(gA.has(t)){Kp(`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"?mr(t,"plan"):_A[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 C({event:"yolo_assert_failed",provider:t,reason:"unconfigured_provider",args:e.join(" "),message:s}),new we(s)}if(!yA(e,n)){let s=n.join(" "),i=`${t} spawn missing YOLO flag '${s}' \u2014 YOLO is mandatory for every provider; see src/providers/yolo-contract.ts. Got argv: [${e.map(o=>JSON.stringify(o)).join(", ")}]`;throw C({event:"yolo_assert_failed",provider:t,reason:"flag_missing",required_flag:s,mode:r,args:e.join(" "),message:i}),new we(i)}Kp(`YOLO ${t} [mode=${r}]: argv flag '${n.join(" ")}'`)}var _A,hA,gA,un=E(()=>{"use strict";cn();me();_A={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"],gemini:["-y"],copilot:["--yolo"],agy:["--dangerously-skip-permissions"],lmplayer:["--dangerously-skip-permissions"]},hA={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"]}};gA=new Set(["codex","opencode"])});function Yp(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(`
1523
+ `),...ep(t),...zf(t)}}function QN(t,e){return e===void 0?{resumed:!1,reason:t}:{resumed:!1,reason:t,valid:e}}var jl,ct=E(()=>{"use strict";bl();Zf();tp();kl();ip();nn();me();gi();Np();cs();jl=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;tryAcquireAgentInflightTxn;recvMailboxMessagesTxn;constructor(e){e.pragma("foreign_keys = ON"),this.db=e,this.stmts=ZN(e),this.claimTxn=e.transaction((r,n,s)=>{let i=this.stmts.selectClaimableJob.get(s,s,s);return i===void 0||this.stmts.claimJob.run(r,n,s,i.id,s,s,s).changes!==1?null:this.getJob(i.id)}),this.claimWithConcurrencyTxn=e.transaction((r,n,s,i)=>{let o=this.stmts.selectClaimableJobs.all(s,s,s);for(let a of o){let l=this.getJob(a.id);if(l===null)continue;let d=i(l);if(d.concurrency_key!==null&&(l.concurrency_key_resolved!==d.concurrency_key&&this.stmts.setJobConcurrencyKey.run(d.concurrency_key,l.id),(this.stmts.countRunningByConcurrencyKey.get(d.concurrency_key,s,l.id)?.count??0)>=Math.max(1,d.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,i,o)=>{let a=this.getJob(r);if(a===null)return{claimed:!1,reason:"not_found",job_id:r};if(a.locked_until!==null&&a.locked_until>=i)return{claimed:!1,reason:"locked",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let d=a.status==="queued"&&a.available_at<=i,c=a.status==="running"&&a.locked_until!==null&&a.locked_until<i;if(!d&&!c)return{claimed:!1,reason:"not_claimable",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let u=o(a);if(u.concurrency_key!==null&&(a.concurrency_key_resolved!==u.concurrency_key&&this.stmts.setJobConcurrencyKey.run(u.concurrency_key,a.id),(this.stmts.countRunningByConcurrencyKey.get(u.concurrency_key,i,a.id)?.count??0)>=Math.max(1,u.concurrent_limit)))return{claimed:!1,reason:"concurrency_limit",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};if(this.stmts.claimJob.run(n,s,i,a.id,i,i,i).changes!==1){let p=this.getJob(a.id);return{claimed:!1,reason:p?.locked_until!==null&&p?.locked_until!==void 0&&p.locked_until>=i?"locked":"not_claimable",job_id:r,status:p?.status??a.status,locked_by:p?.locked_by??a.locked_by,locked_until:p?.locked_until??a.locked_until}}let f=this.getJob(a.id);return f===null?{claimed:!1,reason:"not_found",job_id:r}:{claimed:!0,job:f}}),this.resumeRunTxn=e.transaction((r,n,s)=>QN("state_not_found")),this.resumeInteractiveTxn=e.transaction((r,n,s,i)=>{let o=this.getInteractiveSessionByStepId(r);if(o===null)return{resumed:!1,reason:"not_found"};if(o.status!=="waiting_operator")return{resumed:!1,reason:"not_waiting_operator"};let a=this.getRun(o.run_id);if(a===null)return{resumed:!1,reason:"run_not_found"};let l=s?"done":"waiting_agent";return this.stmts.updateInteractiveSession.run(l,n,Date.now(),o.id),this.stmts.resumeRunState.run(o.state_name,a.id),this.stmts.requeuePausedJob.run(i,a.job_id),{resumed:!0,session:this.getInteractiveSessionByStepId(r),run:this.getRun(a.id),job:this.getJob(a.job_id)}}),this.resumeEscalationTxn=e.transaction((r,n,s)=>{let i=this.stmts.getAttention.get(r);if(i===void 0)return{resumed:!1,reason:"not_found"};if(i.kind!==Ei)return{resumed:!1,reason:"wrong_kind"};if(i.acknowledged_at!==null)return{resumed:!1,reason:"already_acked"};if(i.run_id===null)return{resumed:!1,reason:"run_not_found"};let o=null,a=[];if(i.payload!==null)try{let c=JSON.parse(i.payload);c.step!==void 0&&typeof c.step.id=="string"&&c.step.id.length>0&&(o=c.step.id),Array.isArray(c.declared_outcomes)&&(a=c.declared_outcomes.filter(u=>typeof u=="string"))}catch{}if(o===null)return{resumed:!1,reason:"no_step"};let l=this.getRun(i.run_id);if(l===null)return{resumed:!1,reason:"run_not_found"};if(n!==ds&&!a.includes(n))return{resumed:!1,reason:xp};let d={};if(l.pending_escalation_decision!==null)try{let c=JSON.parse(l.pending_escalation_decision);c!==null&&typeof c=="object"&&!Array.isArray(c)&&(d=c)}catch{d={}}return d[o]=n,this.stmts.setRunPendingEscalationDecision.run(JSON.stringify(d),l.id),this.stmts.resumeRunState.run(o,l.id),this.stmts.requeuePausedJob.run(s,l.job_id),this.stmts.ackAttention.run(s,r),{resumed:!0,run:this.getRun(l.id),job:this.getJob(l.job_id)}}),this.tryAcquireAgentInflightTxn=(r,n={})=>{this.db.exec("BEGIN IMMEDIATE");try{let s=this.getAgentInflight(r.receiver_teamfile,r.receiver_alias),i=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:i?.sender_teamfile??null,reclaim_observed_sender_alias:i?.sender_alias??null,reclaim_observed_started_at:i?.started_at??null,reclaim_observed_holder_pid:typeof i?.holder_pid=="number"?i.holder_pid:null}),a=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")})()};if(o!==void 0){let l=s===null?null:n.reclaim_reason??(n.force===!0?"force":n.reclaim_observed!==void 0?"dead-pid":"stale");hp(this.db,o,s,l,n.stale_before??null,n.force===!0)}return this.db.exec("COMMIT"),a}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 i of s)as(this.db,i,"",$()),this.stmts.deleteMailboxMessage.run(i.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,o=>this.getWorkflowByName(o));let r=this.stmts.insertWorkflow.run(e.name,e.version??1,e.definition_schema_version??1,e.definition,$()),n=this.getWorkflow(Number(r.lastInsertRowid)),s=this.stmts.insertWorkflowVersion.run(n.id,n.version,e.definition,e.author??null,$());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 i=this.getWorkflow(n.id);return this.syncWorkflowTriggers(n.id,e.definition),i}upsertWorkflow(e){Op(e.name,e.definition,o=>this.getWorkflowByName(o));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,i=this.stmts.insertWorkflowVersion.run(r.id,s,e.definition,e.author??null,$());return this.stmts.updateWorkflowActiveVersionDefinitionAndVersion.run(Number(i.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,$())}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 i=(this.stmts.getLatestWorkflowVersion.get(e)?.version??0)+1,o=this.stmts.insertWorkflowVersion.run(e,i,r,n??null,$());return this.stmts.getWorkflowVersion.get(o.lastInsertRowid)}activateWorkflowVersion(e,r){let n=this.getWorkflowVersionById(r);if(n===null||n.workflow_id!==e)return null;let s=1;try{let i=JSON.parse(n.definition);typeof i.definition_schema_version=="number"&&(s=i.definition_schema_version)}catch{}return this.stmts.updateWorkflowActiveVersionAndDefinition.run(r,n.definition,s,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,$()),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,$(),e),this.stmts.getTriggerInstance.get(e)??null}setTriggerFailure(e,r){return this.stmts.setTriggerFailure.run($(),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 i of s){if(i===null||typeof i!="object"||Array.isArray(i))continue;let o=i;typeof o.id!="string"||o.id.length===0||typeof o.type!="string"||o.type.length===0||this.upsertTriggerInstance({workflow_id:e,trigger_id:o.id,trigger_type:o.type,parameters:JSON.stringify(o.parameters??{})})}}insertTeam(e){let r=this.stmts.insertTeam.run(e.name,$());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,$());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,$(),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"),i=Object.prototype.hasOwnProperty.call(r,"model"),o=Object.prototype.hasOwnProperty.call(r,"provider");return this.stmts.updateTeamMemberMeta.run(s?r.role_prompt??null:n.role_prompt,i?r.model??null:n.model,o?r.provider??n.provider:n.provider,e),this.stmts.getTeamMember.get(e)??null}insertTeamMemberCompanion(e){let r=this.stmts.insertTeamMemberCompanion.run(e.interpreter_id,e.companion_id,$());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",$());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"),i=Object.prototype.hasOwnProperty.call(r,"durable_memory_mode"),o=Object.prototype.hasOwnProperty.call(r,"default_branch"),a=Object.prototype.hasOwnProperty.call(r,"intake_config");return this.stmts.updateProjectSettings.run(s?r.local_path:n.local_path,i?r.durable_memory_mode:n.durable_memory_mode,o?r.default_branch??null:n.default_branch,a?r.intake_config??null:n.intake_config,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,$());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=$(),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,$(),e)??null}claimIssue(e,r){return this.stmts.claimIssue.get(r,$(),e)??null}closeIssue(e,r,n){let s=$(),i=this.stmts.closeIssue.get(r,n??null,s,s,e);if(i===void 0)throw new Error(`issue not found: ${e}`);return i}reopenIssue(e,r){let n=this.stmts.reopenIssue.get(r,$(),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"),i=Object.prototype.hasOwnProperty.call(r,"ai_test_path"),o=this.stmts.updateIssue.get(r.title??n.title,r.body??n.body,r.severity??n.severity,s?r.labels??null:n.labels,i?r.ai_test_path??null:n.ai_test_path,$(),e);if(o===void 0)throw new Error(`issue not found: ${e}`);return o}listWorkflows(){return this.stmts.listWorkflows.all()}getOrCreateWebuiSession(e,r){let n=this.stmts.getWebuiSession.get(e);if(n!==void 0)return n;let s=$();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,i){if(this.stmts.updateWebuiSessionTransition.run(r,n,s,i,$(),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,$(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}createChatbotSession(e,r){let n=Lp(),s=$();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 i=$(),o=this.stmts.insertChatbotMessage.run(e,r,n,s??null,i);return this.stmts.touchChatbotSession.run(i,e),this.stmts.getChatbotMessage.get(o.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,$())}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??$(),e.dedupe_key??null,e.concurrency_key??null,$());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=$(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimTxn(e.worker_id,n,r)}claimNextJobWithConcurrency(e){let r=$(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimWithConcurrencyTxn(e.worker_id,n,r,e.evaluator)}claimJobByIdWithConcurrency(e){let r=$(),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:$();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,$()),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,$()),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??$(),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,$());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=$(),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),i=this.getWebProject(s);if(i===null)throw new Error(`web_project ${s} missing after insert`);return i}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,$(),e.id),this.getWebProject(e.id))}softDeleteWebProject(e){return this.stmts.softDeleteWebProject.run($(),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){return this.db.transaction(()=>{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),n=Number(r.lastInsertRowid);return fp(this.db,n,e),n})()}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){return this.db.transaction(()=>this.startTrackedInvocationInner(e))()}startTrackedInvocationInner(e){let r=e.started_at??$(),n=e.holder_host??us(),s=e.last_heartbeat_at??r,i=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,Ut(e.command),r,e.holder_pid??null,n,s,Ut(e.meta),e.launch_source??e.kind,e.request_payload??null),o=this.getTrackedInvocation(Number(i.lastInsertRowid));return Sp(this.db,o),o}getTrackedInvocation(e){return this.stmts.getTrackedInvocation.get(e)??null}listAllRunningTrackedInvocations(){return this.stmts.listAllRunningTrackedInvocations.all()}finishTrackedInvocation(e,r){return this.db.transaction(()=>{let n=r.ended_at??$();if(this.stmts.finishTrackedInvocation.run(r.status,n,r.exit_code??null,r.signal??null,Ut(r.result_summary),Ut(r.error),r.team_chat_log_id??null,Ut(r.meta),n,e).changes!==1)return null;let i=this.getTrackedInvocation(e);return Ml(this.db,i),i})()}reclaimTrackedInvocationIfUnchanged(e,r,n){return this.db.transaction(()=>{let s=n.ended_at??$();if(this.stmts.reclaimTrackedInvocationIfUnchanged.run(n.status,s,n.exit_code??null,n.signal??null,Ut(n.result_summary),Ut(n.error),n.team_chat_log_id??null,Ut(n.meta),s,e,r.holder_pid,r.holder_host,r.started_at,r.last_heartbeat_at).changes!==1)return null;let o=this.getTrackedInvocation(e);return Ml(this.db,o),o})()}heartbeatTrackedInvocation(e,r=$()){return this.db.transaction(()=>{if(this.stmts.heartbeatTrackedInvocation.run(r,e).changes!==1)return null;let s=this.getTrackedInvocation(e);return kp(this.db,s,r),s})()}updateTrackedInvocationRequestPayload(e,r){return this.db.transaction(()=>this.stmts.updateTrackedInvocationRequestPayload.run(r,e).changes!==1?null:(Ip(this.db,e,r),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=$()){return this.db.transaction(()=>{if(this.stmts.claimTrackedInvocationNotification.run(r,n,e).changes!==1)return null;let i=this.getTrackedInvocation(e);return bp(this.db,i,r,n),i})()}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 i=r.length===0?"":` WHERE ${r.join(" AND ")}`;return this.db.prepare(`SELECT * FROM tracked_invocation${i} ORDER BY started_at DESC, id DESC LIMIT ?`).all(...n)}maxTrackedInvocationId(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 ")}`,i=this.db.prepare(`SELECT COALESCE(MAX(id), 0) AS max_id FROM tracked_invocation${s}`).get(...n);return Number(i?.max_id??0)}listRunningTrackedInvocations(e={}){return this.listTrackedInvocations({...e,status:"running"})}enqueueMail(e){return this.sendMailboxMessage(e)}sendMailboxMessage(e){return this.db.transaction(()=>{let n=this.stmts.insertMailboxMessage.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile??null,e.sender_alias??null,e.root_teamfile??null,ns(e.payload),e.created_at??$(),e.remote_transport??null,e.remote_message_id??null,e.remote_thread_id??null,e.meta??null,e.message_type??"request",e.reply_mode??"pull",e.request_mailbox_id??null),s=this.getMailboxMessage(Number(n.lastInsertRowid));return Ll(this.db,s,{provider:e.receiver_provider,sessionId:e.receiver_session_id},{provider:e.sender_provider,sessionId:e.sender_session_id}),s})()}listEnqueuedRequestMailFromSender(e,r,n,s){return this.stmts.listEnqueuedRequestMailFromSender.all(e,r,n,s)}listEnqueuedResponseMailFromSender(e,r,n,s){return this.stmts.listEnqueuedResponseMailFromSender.all(e,r,n,s)}listRelayMailboxLanes(e){return this.stmts.listRelayMailboxLanes.all(Math.max(1,Math.trunc(e)))}markMailDelivered(e,r,n){let s=[...new Set(e.map(a=>Math.trunc(a)).filter(a=>Number.isInteger(a)&&a>0))];if(s.length===0)return 0;let i=ns(r),o=[];this.db.exec("BEGIN IMMEDIATE");try{let a=0;for(let l of s){let d=this.getMailboxMessage(l),c=this.stmts.markMailboxMessageDelivered.run(n,i,l);a+=c.changes,c.changes===1&&d!==null&&(as(this.db,d,i,n),o.push(d))}this.db.exec("COMMIT");for(let l of o)dr("mailbox_delivery_delivered",l,{transition:l.delivering_at===null?"pending->delivered":"delivering->delivered",delivered_at:n});return a}catch(a){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),a}}markRelayRequestDelivered(e,r,n){let s=ns(r),i=[],o=[];this.db.exec("BEGIN IMMEDIATE");try{let a=0;for(let l of e){if(this.stmts.markMailboxMessageDeliveredIfUnchanged.run(n,s,l.id,l.delivering_at,l.delivery_holder_pid,l.delivery_holder_host).changes!==1){o.push(l);continue}as(this.db,l,s,n),a+=1,i.push(l)}this.db.exec("COMMIT");for(let l of i)dr("mailbox_delivery_delivered",l,{transition:"delivering->delivered",delivered_at:n,finalizer:"lease-cas"});for(let l of o)dr("mailbox_delivery_finalize_skipped",l,{delivered_at:n,finalizer:"lease-cas",reason:"observed delivery lease changed before finalization"});return a}catch(a){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),a}}markRelayRequestDeliveredAndEnqueueResponses(e,r,n){let s=ns(r),i=[],o=[];this.db.exec("BEGIN IMMEDIATE");try{let a=0,l=0;for(let f of e){if(this.stmts.markMailboxMessageDeliveredIfUnchanged.run(n,s,f.id,f.delivering_at,f.delivery_holder_pid,f.delivery_holder_host).changes!==1){o.push(f);continue}a+=1,i.push(f)}let d=[...i].sort((f,p)=>f.created_at.localeCompare(p.created_at)||f.id-p.id),c=d.at(-1)??null,u=null;if(c!==null&&c.sender_teamfile!==null&&c.sender_alias!==null){let f=this.stmts.insertMailboxResponseIfAbsent.run(c.sender_teamfile,c.sender_alias,c.receiver_teamfile,c.receiver_alias,c.root_teamfile,s,n,null,null,null,null,c.reply_mode,c.id);if(l=f.changes,f.changes===1&&(u=this.getMailboxMessage(Number(f.lastInsertRowid)),u===null))throw new Error("mailbox response disappeared during event append")}let m=u===null?null:It(u.id);for(let f of i)as(this.db,f,s,n,c!==null&&f.id!==c.id?m:null);u!==null&&Ll(this.db,u,{},{},d.map(f=>It(f.id))),this.db.exec("COMMIT");for(let f of i)dr("mailbox_delivery_delivered",f,{transition:"delivering->delivered",delivered_at:n,finalizer:"lease-cas-with-response"});for(let f of o)dr("mailbox_delivery_finalize_skipped",f,{delivered_at:n,finalizer:"lease-cas-with-response",reason:"observed delivery lease changed before finalization"});return{marked:a,responses:l}}catch(a){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),a}}claimMailForDelivery(e,r,n=process.pid,s=us()){let i=[...new Set(e.map(o=>Math.trunc(o)).filter(o=>Number.isInteger(o)&&o>0))];if(i.length===0)return[];this.db.exec("BEGIN IMMEDIATE");try{let o=[];for(let l of i)if(this.stmts.claimMailboxMessageDelivery.run(r,n,s,l).changes===1){let c=this.getMailboxMessage(l);c!==null&&(pp(this.db,c,r,n,s),o.push(c))}this.db.exec("COMMIT");let a=o.map(l=>l.id);for(let l of o)dr("mailbox_delivery_claimed",l,{transition:"pending->delivering",batch_ids:a,delivering_at:r,delivery_holder_pid:n,delivery_holder_host:s});return o}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}clearMailDelivery(e){let r=[...new Set(e.map(s=>Math.trunc(s)).filter(s=>Number.isInteger(s)&&s>0))];if(r.length===0)return 0;let n=[];this.db.exec("BEGIN IMMEDIATE");try{let s=0;for(let i of r){let o=this.getMailboxMessage(i),a=this.stmts.clearMailboxMessageDelivery.run(i);s+=a.changes,a.changes===1&&o!==null&&o.delivering_at!==null&&(Ol(this.db,o,"explicit-clear"),n.push(o))}this.db.exec("COMMIT");for(let i of n)dr("mailbox_delivery_cleared",i,{transition:"delivering->pending",reason:"explicit non-CAS clear"});return s}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}reclaimMailboxDeliveryIfUnchanged(e,r="delivery-failure"){return this.db.transaction(()=>{let s=this.getMailboxMessage(e.id);if(this.stmts.clearMailboxMessageDeliveryIfUnchanged.run(e.id,e.delivering_at,e.delivery_holder_pid,e.delivery_holder_host).changes!==1)return null;if(s===null)throw new Error("mailbox row disappeared during claim release");return s.delivering_at!==null&&Ol(this.db,s,r),this.getMailboxMessage(e.id)})()}reclaimStaleMailboxDeliveries(e){let r=this.stmts.listInFlightMailboxDeliveries.all(),n=[],s=[];this.db.exec("BEGIN IMMEDIATE");try{for(let i of r){let o=YN(i,e);if(!o.reclaim){s.push({row:i,decision:o,reclaimed:!1});continue}let a=this.reclaimMailboxDeliveryIfUnchanged(i,o.reason),l=a!==null;s.push({row:i,decision:o,reclaimed:l}),l&&n.push(a)}this.db.exec("COMMIT");for(let i of s)dr(i.decision.reclaim?i.reclaimed?"mailbox_delivery_reclaimed":"mailbox_delivery_reclaim_raced":"mailbox_delivery_reclaim_deferred",i.row,{transition:i.reclaimed?"delivering->pending":"delivering->delivering",stale_before:e,reclaim_reason:i.decision.reason,holder_pid_alive:i.decision.holderPidAlive});return n}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}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.db.transaction(()=>{let s=this.getAgentInflight(e,r);if(s===null)return;this.stmts.clearAgentInflight.run(e,r).changes===1&&ls(this.db,s,"INFLIGHT_RECLAIM","stale")})()}clearObservedTerminalAgentInflight(e,r,n){return this.db.transaction(()=>{let i=this.getAgentInflight(e,r),o=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});return o.changes===1&&i!==null&&ls(this.db,i,"INFLIGHT_RELEASE"),o.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){let s=this.stmts.clearAgentInflightIfSender.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias);return s.changes===1&&ls(this.db,r,"INFLIGHT_RELEASE"),this.db.exec("COMMIT"),s.changes===1}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.db.transaction(()=>{let n=this.listAgentInflight().filter(i=>i.started_at<e),s=0;for(let i of n)this.stmts.clearAgentInflight.run(i.receiver_teamfile,i.receiver_alias).changes===1&&(ls(this.db,i,"INFLIGHT_RECLAIM","stale"),s+=1);return s})()}getTerminalLock(e,r){let n=this.stmts.getRuntimeState.get(ss,os(e,r),is);return n===void 0?null:sp(n.data)}setTerminalLock(e){this.db.transaction(()=>{let n=this.getTerminalLock(e.teamfile,e.alias);n!==null&&n.lock_id!==e.lock_id&&$l(this.db,n,!0),this.stmts.upsertRuntimeState.run(ss,os(e.teamfile,e.alias),is,JSON.stringify(e),e.last_heartbeat),n?.lock_id!==e.lock_id&&gp(this.db,e)})()}heartbeatTerminalLock(e,r,n,s){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getTerminalLock(e,r);if(i===null||i.lock_id!==n)return this.db.exec("COMMIT"),!1;let o={...i,last_heartbeat:s};return this.stmts.upsertRuntimeState.run(ss,os(e,r),is,JSON.stringify(o),s),this.db.exec("COMMIT"),!0}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}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 i=this.stmts.deleteRuntimeState.run(ss,os(e,r),is);return i.changes===1&&$l(this.db,s),this.db.exec("COMMIT"),i.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:VN(s.data)}tryAcquireRuntimeProcessLock(e,r,n,s,i=$()){this.db.exec("BEGIN IMMEDIATE");try{let o=this.getRuntimeProcessLock(e,r,n);if(o!==null&&!KN(o,s))return this.db.exec("COMMIT"),{acquired:!1,current:o};let a={lock_id:Lp(),holder_pid:process.pid,holder_host:us(),started_at:i,last_heartbeat:i};return this.stmts.upsertRuntimeState.run(e,r,n,JSON.stringify(a),i),this.db.exec("COMMIT"),{acquired:!0,lock:a,previous:o}}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}clearRuntimeProcessLock(e,r,n,s){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getRuntimeProcessLock(e,r,n);if(i===null||i.lock_id!==s)return this.db.exec("COMMIT"),!1;let o=this.stmts.deleteRuntimeState.run(e,r,n);return this.db.exec("COMMIT"),o.changes===1}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}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,$(),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,$())}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,$());return this.stmts.getStep.get(r.lastInsertRowid)}finishStep(e,r,n){return this.stmts.finishStep.run(r??null,n??null,$(),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??$(),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,$());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,$()).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,$()),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,$());return this.stmts.getAttention.get(r.lastInsertRowid)}acknowledgeAttention(e){return this.stmts.ackAttention.run($(),e),this.stmts.getAttention.get(e)??null}upsertDurableMemory(e){let r=$();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:i,type:o,updated_at:a})=>({name:s,description:i,type:o,updated_at:a})):this.stmts.listDurableMemory.all(e).map(({name:n,description:s,type:i,updated_at:o})=>({name:n,description:s,type:i,updated_at:o}))}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??$());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,i=0;for(let o of r)try{let a=JSON.parse(o.payload);typeof a.tokens_in=="number"&&(n+=a.tokens_in),typeof a.tokens_out=="number"&&(s+=a.tokens_out),i+=1}catch{}return{totalInputTokens:n,totalOutputTokens:s,agentCallCount:i}}addRollupValue(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,$())}resumeEscalation(e,r){return this.resumeEscalationTxn(e,r,$())}}});import{realpathSync as eA}from"node:fs";import{resolve as tA}from"node:path";function Pl(t){let e=tA(t);try{return eA(e)}catch{return e}}var Cp=E(()=>{"use strict"});import{platform as Mp}from"node:os";function Nt(t){let e=new ms;for(let r of t)e.registerAdapter(r);return e}var ms,Fl=E(()=>{"use strict";Cp();ms=class{providers=[];adapters=new Map;register(e){this.providers.push(e)}async listAll(e){let r=[],n=e?.provider?this.providers.filter(o=>o.name===e.provider):this.providers,s=await Promise.all(n.map(o=>o.discoverSessions()));for(let o of s)r.push(...o);let i=r;if(e?.workspace){let o=Pl(e.workspace);i=i.filter(a=>Pl(a.cwd)===o)}if(e?.from){let o=e.from.getTime();i=i.filter(a=>a.modifiedAt.getTime()>=o)}if(e?.to){let o=e.to.getTime();i=i.filter(a=>a.modifiedAt.getTime()<=o)}return i.sort((o,a)=>a.modifiedAt.getTime()-o.modifiedAt.getTime()),e?.limit&&(i=i.slice(0,e.limit)),i}async getSession(e,r){let n=r?this.providers.filter(s=>s.name===r):this.providers;for(let s of n){let i=await s.loadSession(e);if(i)return i}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(i=>i.name===r):this.providers,s=[];for(let i of n){let o=await i.resolveSessionPath(e);o&&s.push({provider:i,filePath:o})}return s}getWatchTargets(){let e=Mp()==="darwin"||Mp()==="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 Dp}from"node:fs";import{createInterface as jp}from"node:readline";import{stat as rA}from"node:fs/promises";import{homedir as nA}from"node:os";async function*Ge(t){let e=Dp(t,{encoding:"utf-8"}),r=jp({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 Pe(t,e){let r=[],n=Dp(t,{encoding:"utf-8"}),s=jp({input:n,crlfDelay:1/0});try{for await(let i of s){let o=i.trim();if(o){try{r.push(JSON.parse(o))}catch{}if(r.length>=e)break}}}finally{s.close(),n.destroy()}return r}async function Re(t){let e=await rA(t);return{createdAt:e.birthtime,modifiedAt:e.mtime}}function pe(t){return t.replace(/\\n/g,`
1524
+ `).replace(/\\t/g," ").replace(/\\r/g,"\r")}function H(t,e){return t.length<=e?t:t.slice(0,e-3)+"..."}var Ie,cr=E(()=>{"use strict";Ie=nA()});import{readdir as Ti,stat as Pp,unlink as sA}from"node:fs/promises";import{join as dn,basename as Fp}from"node:path";function iA(t){return t==="file-history-snapshot"||t==="progress"||t==="system"||t==="queue-operation"}function oA(t){if(t.type==="system"){let e=t.message?.content;if(typeof e=="string"&&e.trim())return pe(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 Up(t){let e=0,r=0,n=0,s=0,i=0,o=0,a;for await(let l of Ge(t))if(!l.isSidechain){if(l.type==="user"&&!l.isMeta&&l.message){let d=l.message.content;if(typeof d=="string"){if(d.includes("<command-name>")||d.includes("<local-command-"))continue;e++}}else if(l.type==="assistant"&&l.message){let d=l.message.content;if(Array.isArray(d))for(let u of d)u.type==="text"&&e++;let c=l.message.usage;if(c){let u=c.input_tokens||0,m=c.cache_creation_input_tokens||0,f=c.cache_read_input_tokens||0,p=c.output_tokens||0;r+=u+m+f,n+=f,s+=m,i+=p;let h=u+m+f;h&&(o=h),a={inputTokens:u,cacheWriteInputTokens:m,cachedInputTokens:f,outputTokens:p}}}}return{messageCount:e,totalInputTokens:r,totalCacheReadInputTokens:n,totalCacheWriteInputTokens:s,totalOutputTokens:i,lastInputTokens:o,lastTokenUsage:a}}var vi,Wp=E(()=>{"use strict";cr();vi=class{name="claude";claudeDir;projectsDir;constructor(e={}){this.claudeDir=e.claudeDir||dn(Ie,".claude"),this.projectsDir=dn(this.claudeDir,"projects")}getWatchPaths(){return[{directory:this.projectsDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await Ti(this.projectsDir)}catch{return e}for(let n of r){let s=dn(this.projectsDir,n);if(!(await Pp(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await Ti(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=Fp(a,".jsonl");if(!/^[0-9a-f]{8}-/.test(l))continue;let d=dn(s,a);try{let c=await this.extractSummary(d,l);c&&e.push(c)}catch{}}}return e}async extractSummary(e,r){let n=await Pe(e,50),s=await Re(e),i="",o,a,l,d,c,u;for(let f of n)if(!iA(f.type)&&(!i&&f.cwd&&(i=f.cwd),!o&&f.slug&&(o=f.slug),!a&&f.version&&(a=f.version),!u&&f.timestamp&&(u=new Date(f.timestamp)),f.type==="assistant"&&f.message?.model&&(l=f.message.model),f.type==="user"&&!f.isMeta&&f.message)){let p=f.message.content;if(typeof p=="string"){if(p.includes("<command-name>")||p.includes("<local-command-"))continue;d||(d=H(p.trim(),80)),c=H(p.trim(),80)}}if(!i)return null;let m=await Up(e);return{provider:"claude",sessionId:r,slug:o,cwd:i,createdAt:u||s.createdAt,modifiedAt:s.modifiedAt,model:l,cliVersion:a,startCommand:"claude",firstUserMessage:d,lastUserMessage:c,messageCount:m.messageCount,filePath:e,totalInputTokens:m.totalInputTokens||void 0,totalCachedInputTokens:m.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:m.totalCacheWriteInputTokens||void 0,totalOutputTokens:m.totalOutputTokens||void 0,lastInputTokens:m.lastInputTokens||void 0,lastTokenUsage:m.lastTokenUsage}}async loadSession(e){let r=await this.resolveSessionFile(e);if(!r)return null;let n=await Re(r),s=[],i="",o,a,l,d,c,u,m,f=e;for await(let h of Ge(r))if(h.type!=="file-history-snapshot"&&!h.isSidechain){if(!i&&h.cwd&&(i=h.cwd),!o&&h.slug&&(o=h.slug),!a&&h.version&&(a=h.version),!d&&h.gitBranch&&(d=h.gitBranch),!m&&h.timestamp&&(m=new Date(h.timestamp)),h.sessionId&&(f=h.sessionId),h.type==="system"||h.type==="progress"||h.type==="queue-operation"){s.push({role:"system",timestamp:new Date(h.timestamp||0),content:oA(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;c||(c=H(_.trim(),80)),u=H(_.trim(),80),s.push({role:"user",timestamp:g,content:pe(_.trim())})}else if(Array.isArray(_)){for(let y of _)if(y.type==="tool_result"){let T=typeof y.content=="string"?pe(y.content):JSON.stringify(y.content);s.push({role:"tool_result",timestamp:g,content:T,toolCallId:y.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 y of _)y.type==="text"&&y.text?s.push({role:"assistant",timestamp:g,content:pe(y.text),model:h.message.model}):y.type==="tool_use"?s.push({role:"tool_use",timestamp:g,content:y.name||"unknown tool",toolName:y.name,toolInput:JSON.stringify(y.input,null,2),toolCallId:y.id,model:h.message.model}):y.type==="thinking"&&y.thinking&&s.push({role:"thinking",timestamp:g,content:y.thinking})}}if(!i)return null;let p=await Up(r);return{provider:"claude",sessionId:f,slug:o,cwd:i,createdAt:m||n.createdAt,modifiedAt:n.modifiedAt,model:l,cliVersion:a,startCommand:"claude",gitBranch:d,firstUserMessage:c,lastUserMessage:u,messageCount:p.messageCount,filePath:r,totalInputTokens:p.totalInputTokens||void 0,totalCachedInputTokens:p.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:p.totalCacheWriteInputTokens||void 0,totalOutputTokens:p.totalOutputTokens||void 0,lastInputTokens:p.lastInputTokens||void 0,lastTokenUsage:p.lastTokenUsage,messages:s}}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await sA(r),!0):!1}async resolveSessionFile(e){let r;try{r=await Ti(this.projectsDir)}catch{return null}let n=[];for(let o of r){let a=dn(this.projectsDir,o);if(!(await Pp(a).catch(()=>null))?.isDirectory())continue;let d;try{d=await Ti(a)}catch{continue}for(let c of d){if(!c.endsWith(".jsonl"))continue;let u=Fp(c,".jsonl");/^[0-9a-f]{8}-/.test(u)&&n.push({filePath:dn(a,c),fileSessionId:u})}}let s=n.find(o=>o.fileSessionId===e);if(s)return s.filePath;let i=n.filter(o=>o.fileSessionId.startsWith(e));if(i.length===1)return i[0].filePath;for(let o of n){let a=await Pe(o.filePath,20);for(let l of a)if(l.slug&&l.slug===e)return o.filePath}return null}}});function Si(t){return"'"+t.replace(/'/g,"'\\''")+"'"}function lA(t,e,r){if(!r)return"";let n=t.tools[e]??Ul[e],s=n?.profiles?.[r]?.flags??Ul[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 qp(t,e){return!!t.tools[e]}function Bp(t,e,r,n,s){let i=t.tools[e]??Ul[e],o;if(i?.agent){let l=Si(n);o=i.agent.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,l)}else{let l=aA[e];if(!l)throw new Error(`No agent command configured for tool "${e}"`);let d=l.argv.map(c=>c.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,n));if(l.mode==="stdin"){let c=d.map(Si).join(" ");o=`printf '%s\\n' ${Si(n)} | ${c}`}else o=d.map(Si).join(" ")}let a=lA(t,e,s);return a&&(o+=" "+a),o}var Ul,aA,Hp=E(()=>{"use strict";Ul={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:""}}}},aA={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 Xp(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 Jp=E(()=>{"use strict"});var dA,Ee,bi,At=E(()=>{"use strict";dA="ACK: waiting for explicit lmctl task.",Ee=`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: ${dA}`,bi=`send this exact lmctl seed instruction: "${Ee}"`});function ur(t,e){let r={...t??process.env,PWD:e};return delete r.OLDPWD,r}function uA(t,e){return e===void 0||e.length===0?t:{...t??process.env,[fs]:e}}function Fe(t,e,r,n="chat"){return{...uA(ur(t,e),r),[cA]:n}}var fs,cA,ut=E(()=>{"use strict";fs="LMCTL_SELF_SESSIONID",cA="LMCTL_LAUNCH_SOURCE"});import{spawn as Gp}from"node:child_process";import{mkdirSync as mA}from"node:fs";var Wl,Le,Ht=E(()=>{"use strict";Hp();Jp();At();ut();Wl=class t extends Error{cancelReason;constructor(e,r){super(e),this.name="TurnAbortError",this.cancelReason=r,Object.setPrototypeOf(this,t.prototype)}},Le=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===Ee?r:n)}seed(e,r){return mA(e,{recursive:!0}),new Promise(n=>{let s;try{s=Gp(this.binary,this.seedArgsFor(r),{cwd:e,env:ur(void 0,e),stdio:["pipe","pipe","pipe"],timeout:6e4})}catch(a){return n({success:!1,error:a instanceof Error?a.message:String(a)})}let i="";s.stderr?.on("data",a=>{i+=a.toString()});let o=r?.prompt!==void 0&&this.seedStdin!==void 0?`${r.prompt}
1525
+ `:this.seedStdin;o&&s.stdin?.write(o),s.stdin?.end(),s.on("exit",a=>{n(a===0||a===null?{success:!0}:{success:!1,error:i.trim().slice(0,200)||`exit code ${a}`})}),s.on("error",a=>{n({success:!1,error:a.message})})})}resumeCommand(e,r){return this.resumeTemplate.replace(/\{\{session_id\}\}/g,e)}startCommand(e){return this.startTemplate}manualSeedHint(e){return{launchCommand:`cd ${e} && ${this.binary}`,postLaunchNote:bi,lsCommand:`lmctl ls --provider ${this.name} --sessiondir ${e}`}}static DEFAULT_IDLE_TIMEOUT_MS=8*60*60*1e3;sendTurn(e,r){if(r.userConfig&&qp(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,i,o,a="",l,d=()=>{e<=0||(clearTimeout(i),i=setTimeout(()=>{n.onIdleWarning?.(e),c(),s.abort(),l&&l({text:a,sessionId:n.sessionId,durationMs:e,status:"stalled",stalledAfterMs:e})},e))},c=()=>{clearTimeout(i)};n.signal&&(n.signal.aborted?(o="external",s.abort()):n.signal.addEventListener("abort",()=>{o="external",s.abort()},{once:!0})),d();let u={...n,binary:this.binary,signal:s.signal,onDelta:p=>{a+=p,d(),n.onDelta?.(p)},onProgress:p=>{p.kind!=="api_retry"&&d(),n.onProgress?.(p)}},m=this.transportFn(r,u).then(p=>(c(),{...p,status:"ok"})).catch(p=>{throw c(),o==="external"?new Wl("Turn cancelled","external"):p}),f=new Promise(p=>{l=p});return Promise.race([m,f])}runOneShotAgent(e,r,n){let s=Bp(r.userConfig,this.name,r.sessionId,e,r.profile),i=Date.now();return new Promise((o,a)=>{let l=Xp(r.env),d=Gp(s,{shell:!0,cwd:r.cwd,env:Fe(r.env,r.cwd,r.sessionId),stdio:["pipe","pipe","pipe"]}),c=!1,u=!1,m=setTimeout(()=>{u=!0,d.kill()},l),f="",p="";if(d.stdout?.on("data",h=>{let g=h.toString();f+=g,r.onDelta?.(g)}),d.stderr?.on("data",h=>{p+=h.toString()}),r.signal){if(r.signal.aborted)return clearTimeout(m),d.kill(),a(new Error("Aborted"));r.signal.addEventListener("abort",()=>d.kill(),{once:!0})}d.on("exit",h=>{if(c)return;c=!0,clearTimeout(m);let g=Date.now()-i;u?a(new Error(`Agent command timed out after ${l}ms`)):h===0||h===null?o({text:f.trim(),sessionId:r.sessionId,durationMs:g}):a(new Error(p.trim().slice(0,200)||`Agent command exited with code ${h}`))}),d.on("error",h=>{c||(c=!0,clearTimeout(m),a(h))})})}}});function Ii(t,e){let r;if(e&&typeof e=="object"){let n=e.code;typeof n=="number"&&(r=n)}return new Jt(t,r,e)}var st,we,Xt,ki,Jt,cn=E(()=>{"use strict";st=class extends Error{constructor(e,r){super(e,r),this.name=this.constructor.name}},we=class extends st{},Xt=class extends st{exitCode;signal;stderr;constructor(e,r,n=null,s){super(e),this.exitCode=r,this.signal=n,this.stderr=s}},ki=class extends st{line;constructor(e,r,n){super(e,{cause:n}),this.line=r}},Jt=class extends st{rpcCode;rpcData;constructor(e,r,n){super(e),r!==void 0&&(this.rpcCode=r),n!==void 0&&(this.rpcData=n)}}});import*as Bl from"node:child_process";function pA(t){if(typeof Bl.spawnSync=="function")try{Bl.spawnSync("taskkill",["/T","/F","/PID",String(t)],{windowsHide:!0})}catch{}}function Vp(t){return t.exitCode!==null||t.signalCode!==null}function ql(t,e){return Vp(t)?Promise.resolve(!0):new Promise(r=>{let n=!1,s=()=>{n||(n=!0,clearTimeout(i),r(!0))},i=setTimeout(()=>{n||(n=!0,t.removeListener("exit",s),r(!1))},e);t.once("exit",s)})}async function it(t,e={}){let r=Date.now(),n=e.stdinEnd!==!1,s=e.softDelayMs??5e3,i=e.killDelayMs??5e3,o=e.platform??process.platform,a=e.runTaskkill??pA;if(Vp(t))return{signal:"natural",elapsedMs:Date.now()-r};if(n&&t.stdin&&!t.stdin.destroyed)try{t.stdin.end()}catch{}if(await ql(t,s))return{signal:"stdin",elapsedMs:Date.now()-r};if(o==="win32"&&typeof t.pid=="number")a(t.pid);else try{t.kill("SIGTERM")}catch{}if(await ql(t,i))return{signal:"SIGTERM",elapsedMs:Date.now()-r};if(o!=="win32")try{t.kill("SIGKILL")}catch{}return await ql(t,fA)?{signal:"SIGKILL",elapsedMs:Date.now()-r}:{signal:"abandoned",elapsedMs:Date.now()-r}}var fA,Ni=E(()=>{"use strict";fA=1e3});function Kp(t){ue()&&Oe({event:"legacy",msg:`[debug] ${t}`},{always:!0})}function mr(t,e){let r=hA[t];if(r)return r[e]??r.yolo}function yA(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 mt(t,e,r="yolo"){if(gA.has(t)){Kp(`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"?mr(t,"plan"):_A[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 C({event:"yolo_assert_failed",provider:t,reason:"unconfigured_provider",args:e.join(" "),message:s}),new we(s)}if(!yA(e,n)){let s=n.join(" "),i=`${t} spawn missing YOLO flag '${s}' \u2014 YOLO is mandatory for every provider; see src/providers/yolo-contract.ts. Got argv: [${e.map(o=>JSON.stringify(o)).join(", ")}]`;throw C({event:"yolo_assert_failed",provider:t,reason:"flag_missing",required_flag:s,mode:r,args:e.join(" "),message:i}),new we(i)}Kp(`YOLO ${t} [mode=${r}]: argv flag '${n.join(" ")}'`)}var _A,hA,gA,un=E(()=>{"use strict";cn();me();_A={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"],gemini:["-y"],copilot:["--yolo"],agy:["--dangerously-skip-permissions"],lmplayer:["--dangerously-skip-permissions"]},hA={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"]}};gA=new Set(["codex","opencode"])});function Yp(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(`
1526
1526
 
1527
1527
  --- additional response (turn ${r+1} of ${t.length}; likely an injected mid-call notification) ---
1528
1528
 
1529
- `+t[r]);return e.join("")}function Xl(t={}){let e=[],r="",n=!1;return{processLine(s){if(!s.trim())return;let i;try{i=JSON.parse(s)}catch{return}t.onEvent?.(i);let o=i.type;if(o==="system"&&i.subtype==="init"&&(r=i.session_id||r),o==="assistant"){let l=i.message?.content;if(Array.isArray(l))for(let d of l)d.type==="text"&&d.text&&t.onText?.(d.text)}o==="result"&&(n=!0,e.push(i))},sawResult(){return n},finalize(){if(!n)return null;let s=zp(e);return{result:Yp(s.resultTexts),sessionId:s.sessionId||r,durationMs:s.durationMs,numTurns:s.numTurns}}}}function zp(t){let e=[],r=0,n=0,s="";for(let i of t){e.push(i.result||"");let o=i.duration_ms;typeof o=="number"&&Number.isFinite(o)&&(r+=o);let a=i.num_turns;typeof a=="number"&&Number.isFinite(a)&&(n=a);let l=i.session_id;typeof l=="string"&&l&&(s=l)}return{resultTexts:e,durationMs:r,numTurns:n,sessionId:s}}var Jl=E(()=>{"use strict"});import{spawn as EA}from"node:child_process";import{existsSync as wA}from"node:fs";function vA(t){let e=t.stderr.trim().slice(0,500),r=`lmctl: ${t.tool} exited with code ${t.exitCode} before returning a final result event.
1529
+ `+t[r]);return e.join("")}function Hl(t={}){let e=[],r="",n=!1;return{processLine(s){if(!s.trim())return;let i;try{i=JSON.parse(s)}catch{return}t.onEvent?.(i);let o=i.type;if(o==="system"&&i.subtype==="init"&&(r=i.session_id||r),o==="assistant"){let l=i.message?.content;if(Array.isArray(l))for(let d of l)d.type==="text"&&d.text&&t.onText?.(d.text)}o==="result"&&(n=!0,e.push(i))},sawResult(){return n},finalize(){if(!n)return null;let s=zp(e);return{result:Yp(s.resultTexts),sessionId:s.sessionId||r,durationMs:s.durationMs,numTurns:s.numTurns}}}}function zp(t){let e=[],r=0,n=0,s="";for(let i of t){e.push(i.result||"");let o=i.duration_ms;typeof o=="number"&&Number.isFinite(o)&&(r+=o);let a=i.num_turns;typeof a=="number"&&Number.isFinite(a)&&(n=a);let l=i.session_id;typeof l=="string"&&l&&(s=l)}return{resultTexts:e,durationMs:r,numTurns:n,sessionId:s}}var Xl=E(()=>{"use strict"});import{spawn as EA}from"node:child_process";import{existsSync as wA}from"node:fs";function vA(t){let e=t.stderr.trim().slice(0,500),r=`lmctl: ${t.tool} exited with code ${t.exitCode} before returning a final result event.
1530
1530
  One possible cause: the provider stream ended before a complete response was delivered; for Claude Code this can appear as "API Error: Stream idle timeout - partial response received".`;return e?`Original provider error:
1531
1531
  ${e}
1532
1532
 
1533
- ${r}`:r}function Zp(t,e){return new Promise((r,n)=>{let s=e.tool||"claude",i=e.binaryPath||TA[s]||"claude",o=["-p","","--output-format","stream-json","--input-format","stream-json"];s==="claude"&&o.push("--verbose"),e.sessionId&&o.push("--resume",e.sessionId),e.model&&o.push("--model",e.model);let a=e.permissionMode??"yolo",l=mr(s,a)??SA[s]??["--dangerously-skip-permissions"];o.push(...l);try{mt(s,o,a)}catch(g){return n(g)}if(e.cwd&&!wA(e.cwd))return C({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),n(new we(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let d=EA(i,o,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Fe(e.env,e.cwd,e.sessionId)}),c=!1;if(e.signal){if(e.signal.aborted)return c=!0,C({event:"transport_abort",provider:s,phase:"pre_spawn"}),it(d).catch(()=>{}),n(new Error("Aborted"));e.signal.addEventListener("abort",()=>{c=!0,C({event:"transport_abort",provider:s}),it(d).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let u=Xl({onEvent:e.onEvent,onText:e.onText}),m="";function f(g){let _=u.sawResult();u.processLine(g),!_&&u.sawResult()&&d.stdin?.end()}d.stdout?.on("data",g=>{m+=g.toString();let _=m.split(`
1533
+ ${r}`:r}function Zp(t,e){return new Promise((r,n)=>{let s=e.tool||"claude",i=e.binaryPath||TA[s]||"claude",o=["-p","","--output-format","stream-json","--input-format","stream-json"];s==="claude"&&o.push("--verbose"),e.sessionId&&o.push("--resume",e.sessionId),e.model&&o.push("--model",e.model);let a=e.permissionMode??"yolo",l=mr(s,a)??SA[s]??["--dangerously-skip-permissions"];o.push(...l);try{mt(s,o,a)}catch(g){return n(g)}if(e.cwd&&!wA(e.cwd))return C({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),n(new we(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let d=EA(i,o,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Fe(e.env,e.cwd,e.sessionId)}),c=!1;if(e.signal){if(e.signal.aborted)return c=!0,C({event:"transport_abort",provider:s,phase:"pre_spawn"}),it(d).catch(()=>{}),n(new Error("Aborted"));e.signal.addEventListener("abort",()=>{c=!0,C({event:"transport_abort",provider:s}),it(d).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let u=Hl({onEvent:e.onEvent,onText:e.onText}),m="";function f(g){let _=u.sawResult();u.processLine(g),!_&&u.sawResult()&&d.stdin?.end()}d.stdout?.on("data",g=>{m+=g.toString();let _=m.split(`
1534
1534
  `);m=_.pop()||"";for(let y of _)f(y)});let p="";d.stderr?.on("data",g=>{p+=g.toString()}),d.on("error",g=>{C({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:g.message}),n(new we(`Failed to spawn ${i}: ${g.message}`,{cause:g}))}),d.on("exit",g=>{if(c)return;m.trim()&&f(m);let _=u.finalize();_?(kt(`stream-json: result ${_.result.slice(0,80)}${_.result.length>80?"...":""} (${_.durationMs}ms)`),r({..._,exitCode:g})):(C({event:"transport_error",provider:s,error_class:"Error",reason:"provider_no_result",exit_code:g,stderr_tail:p.slice(0,500)}),n(new Error(vA({tool:s,exitCode:g,stderr:p}))))});let h=JSON.stringify({type:"user",message:{role:"user",content:t}});d.stdin?.write(h+`
1535
- `),kt(`stream-json: prompt sent (${t.length} chars)`)})}var TA,SA,Qp=E(()=>{"use strict";cn();Ni();un();me();ut();Jl();Jl();TA={claude:"claude",qwen:"qwen"};SA={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"]}});function Ai(t={}){return[]}var Gl=E(()=>{"use strict"});function Vl(t){return t==="plan"?"read-only":"danger-full-access"}function e_(t="0.0.0"){return{clientInfo:{name:"lmctl",title:"lmctl",version:t},capabilities:{experimentalApi:!1}}}function Kl(){return{agentItems:new Map,resultText:""}}function xi(t,e,r,n){let s=t.method;if(!s)return!1;let i=t.params;if(s==="turn/started")return e.agentItems.clear(),e.resultText="",!1;if(s==="item/started"){let o=i?.item;if(o?.type==="agentMessage"&&typeof o.id=="string"){let a=typeof o.phase=="string"?o.phase:void 0,l=a==="commentary"||a==="final_answer"?a:void 0;return e.agentItems.set(o.id,{phase:l,buffer:""}),!0}return!1}if(s==="item/agentMessage/delta"){let o=i?.delta||"",a=typeof i?.itemId=="string"?i.itemId:void 0;if(!o)return!0;let l=a?e.agentItems.get(a):void 0;return l?(l.phase==="commentary"||(l.buffer+=o),r?.(o),l.phase&&i&&(i._lmctlItemPhase=l.phase)):(e.resultText+=o,r?.(o)),!0}if(s==="item/completed"){let o=i?.item;if(o?.type==="agentMessage"&&typeof o.id=="string"){let a=e.agentItems.get(o.id);if(a){if(a.phase!=="commentary"){let l=typeof o.text=="string"?o.text:a.buffer;if(n&&typeof o.text=="string"&&o.text!==a.buffer){let d=typeof i?.threadId=="string"?i.threadId:void 0,c=typeof i?.turnId=="string"?i.turnId:void 0;n({itemId:o.id,threadId:d,turnId:c,expectedFromItemText:o.text,gotFromBuffer:a.buffer})}e.resultText+=l}e.agentItems.delete(o.id)}return!0}return!1}return!1}function Yl(t){for(let[,e]of t.agentItems.entries())e.phase!=="commentary"&&e.buffer&&(t.resultText+=e.buffer);t.agentItems.clear()}function t_(t){let e=t.params,r=e?.error,n=typeof r?.message=="string"?r.message:void 0,s=n&&n.length>0?n:"(no message)";return e?.willRetry===!0?{willRetry:!0}:{willRetry:!1,turnError:new Error(`Turn errored: ${s}`)}}function zl(){return{pendingCodexError:null}}function Zl(t,e){let r=t_(t);return r.willRetry||(e.pendingCodexError=r.turnError),r}function Ql(t,e){if(e.pendingCodexError){let i=e.pendingCodexError;return e.pendingCodexError=null,{shouldReject:!0,turnError:i}}let n=t.params?.turn;if((typeof n?.status=="string"?n.status:void 0)==="failed"){let i=n?.error,o=typeof i?.message=="string"?i.message:void 0,a=o&&o.length>0?o:"(no message)";return{shouldReject:!0,turnError:new Error(`Turn errored: ${a}`)}}return{shouldReject:!1}}var ed=E(()=>{"use strict"});import{spawn as bA}from"node:child_process";import{createInterface as kA}from"node:readline";import{existsSync as IA,readFileSync as NA}from"node:fs";import{fileURLToPath as AA}from"node:url";function RA(){return e_(xA)}function fr(t,e){kt(`[codex:${t}] ${JSON.stringify(e)}`)}function LA(t){let e=t.stderr.trim().slice(0,500),r=`lmctl: codex app-server exited with code ${t.exitCode} before completing the turn.
1535
+ `),kt(`stream-json: prompt sent (${t.length} chars)`)})}var TA,SA,Qp=E(()=>{"use strict";cn();Ni();un();me();ut();Xl();Xl();TA={claude:"claude",qwen:"qwen"};SA={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"]}});function Ai(t={}){return[]}var Jl=E(()=>{"use strict"});function Gl(t){return t==="plan"?"read-only":"danger-full-access"}function e_(t="0.0.0"){return{clientInfo:{name:"lmctl",title:"lmctl",version:t},capabilities:{experimentalApi:!1}}}function Vl(){return{agentItems:new Map,resultText:""}}function xi(t,e,r,n){let s=t.method;if(!s)return!1;let i=t.params;if(s==="turn/started")return e.agentItems.clear(),e.resultText="",!1;if(s==="item/started"){let o=i?.item;if(o?.type==="agentMessage"&&typeof o.id=="string"){let a=typeof o.phase=="string"?o.phase:void 0,l=a==="commentary"||a==="final_answer"?a:void 0;return e.agentItems.set(o.id,{phase:l,buffer:""}),!0}return!1}if(s==="item/agentMessage/delta"){let o=i?.delta||"",a=typeof i?.itemId=="string"?i.itemId:void 0;if(!o)return!0;let l=a?e.agentItems.get(a):void 0;return l?(l.phase==="commentary"||(l.buffer+=o),r?.(o),l.phase&&i&&(i._lmctlItemPhase=l.phase)):(e.resultText+=o,r?.(o)),!0}if(s==="item/completed"){let o=i?.item;if(o?.type==="agentMessage"&&typeof o.id=="string"){let a=e.agentItems.get(o.id);if(a){if(a.phase!=="commentary"){let l=typeof o.text=="string"?o.text:a.buffer;if(n&&typeof o.text=="string"&&o.text!==a.buffer){let d=typeof i?.threadId=="string"?i.threadId:void 0,c=typeof i?.turnId=="string"?i.turnId:void 0;n({itemId:o.id,threadId:d,turnId:c,expectedFromItemText:o.text,gotFromBuffer:a.buffer})}e.resultText+=l}e.agentItems.delete(o.id)}return!0}return!1}return!1}function Kl(t){for(let[,e]of t.agentItems.entries())e.phase!=="commentary"&&e.buffer&&(t.resultText+=e.buffer);t.agentItems.clear()}function t_(t){let e=t.params,r=e?.error,n=typeof r?.message=="string"?r.message:void 0,s=n&&n.length>0?n:"(no message)";return e?.willRetry===!0?{willRetry:!0}:{willRetry:!1,turnError:new Error(`Turn errored: ${s}`)}}function Yl(){return{pendingCodexError:null}}function zl(t,e){let r=t_(t);return r.willRetry||(e.pendingCodexError=r.turnError),r}function Zl(t,e){if(e.pendingCodexError){let i=e.pendingCodexError;return e.pendingCodexError=null,{shouldReject:!0,turnError:i}}let n=t.params?.turn;if((typeof n?.status=="string"?n.status:void 0)==="failed"){let i=n?.error,o=typeof i?.message=="string"?i.message:void 0,a=o&&o.length>0?o:"(no message)";return{shouldReject:!0,turnError:new Error(`Turn errored: ${a}`)}}return{shouldReject:!1}}var Ql=E(()=>{"use strict"});import{spawn as bA}from"node:child_process";import{createInterface as kA}from"node:readline";import{existsSync as IA,readFileSync as NA}from"node:fs";import{fileURLToPath as AA}from"node:url";function RA(){return e_(xA)}function fr(t,e){kt(`[codex:${t}] ${JSON.stringify(e)}`)}function LA(t){let e=t.stderr.trim().slice(0,500),r=`lmctl: codex app-server exited with code ${t.exitCode} before completing the turn.
1536
1536
  One possible cause: Codex stopped before delivering a terminal turn/completed event.`;return e?`Original provider error:
1537
1537
  ${e}
1538
1538
 
1539
- ${r}`:r}function r_(t,e){return new Promise((r,n)=>{let s=e.binaryPath||"codex",i=["app-server","--listen","stdio://"];e.model&&i.push("-c",`model=${JSON.stringify(e.model)}`);let o=e.isLead??e.alias?.toLowerCase()==="lead",a=o?Ai():[];i.push(...a),ue()&&je(JSON.stringify({event:"codex_mcp_inject",alias:e.alias??null,isLead:o,injected:a.length>0}));let l=e.permissionMode??"yolo",d=Vl(l);try{mt("codex",i,l)}catch(W){return n(W)}if(e.cwd&&!IA(e.cwd))return C({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`}),n(new we(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=bA(s,i,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Fe(e.env,e.cwd,e.threadId)}),u=!1;if(e.signal){if(e.signal.aborted)return u=!0,C({event:"transport_abort",provider:"codex",phase:"pre_spawn"}),it(c).catch(()=>{}),n(new Error("Aborted"));e.signal.addEventListener("abort",()=>{u=!0,C({event:"transport_abort",provider:"codex"}),it(c).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let m=kA({input:c.stdout}),f=new Map,p=1,h=e.threadId||"",g="",_=!1,y=!1,T=Date.now(),v=Kl(),k=zl();function A(W,F={}){return new Promise((R,Z)=>{let q=p++;f.set(q,{resolve:R,reject:Z});let b=JSON.stringify({jsonrpc:"2.0",id:q,method:W,params:F});c.stdin?.write(b+`
1539
+ ${r}`:r}function r_(t,e){return new Promise((r,n)=>{let s=e.binaryPath||"codex",i=["app-server","--listen","stdio://"];e.model&&i.push("-c",`model=${JSON.stringify(e.model)}`);let o=e.isLead??e.alias?.toLowerCase()==="lead",a=o?Ai():[];i.push(...a),ue()&&je(JSON.stringify({event:"codex_mcp_inject",alias:e.alias??null,isLead:o,injected:a.length>0}));let l=e.permissionMode??"yolo",d=Gl(l);try{mt("codex",i,l)}catch(W){return n(W)}if(e.cwd&&!IA(e.cwd))return C({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`}),n(new we(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=bA(s,i,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Fe(e.env,e.cwd,e.threadId)}),u=!1;if(e.signal){if(e.signal.aborted)return u=!0,C({event:"transport_abort",provider:"codex",phase:"pre_spawn"}),it(c).catch(()=>{}),n(new Error("Aborted"));e.signal.addEventListener("abort",()=>{u=!0,C({event:"transport_abort",provider:"codex"}),it(c).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let m=kA({input:c.stdout}),f=new Map,p=1,h=e.threadId||"",g="",_=!1,y=!1,T=Date.now(),v=Vl(),k=Yl();function A(W,F={}){return new Promise((R,Z)=>{let q=p++;f.set(q,{resolve:R,reject:Z});let b=JSON.stringify({jsonrpc:"2.0",id:q,method:W,params:F});c.stdin?.write(b+`
1540
1540
  `)})}function z(W,F={}){let R=JSON.stringify({jsonrpc:"2.0",method:W,params:F});c.stdin?.write(R+`
1541
- `)}m.on("line",W=>{let F;try{F=JSON.parse(W)}catch{return}if(typeof F.id=="number"&&f.has(F.id)){let q=f.get(F.id);if(f.delete(F.id),F.error){let b=F.error,I=typeof b?.message=="string"&&b.message.length>0?b.message:JSON.stringify(F.error);q.reject(Ii(`codex app-server error: ${I}`,b))}else q.resolve(F);e.onEvent?.(F);return}let R=F.method;if(!R){e.onEvent?.(F);return}if(R==="thread/started"){let b=F.params?.thread;b?.id&&(h=b.id)}let Z=ue()?q=>{fr("item.text/buffer-mismatch",{itemId:q.itemId,threadId:q.threadId??null,turnId:q.turnId??null,expectedFromItemText:q.expectedFromItemText,gotFromBuffer:q.gotFromBuffer,expectedLen:q.expectedFromItemText.length,gotLen:q.gotFromBuffer.length})}:void 0;if(R==="turn/started"){let q=F.params,b=q?.turn;b?.id&&(g=b.id),xi(F,v,e.onDelta,Z),ue()&&fr("turn/started",{params:q??null})}if(ue()&&(R==="item/started"||R==="item/completed")){let q=F.params;q?.item?.type==="agentMessage"&&fr(R,{params:q??null})}if(R==="item/started"||R==="item/agentMessage/delta"||R==="item/completed"){if(R==="item/agentMessage/delta"){let q=F.params;ue()&&fr("agentMessage/delta",{params:q??null})}xi(F,v,e.onDelta,Z)}if(R==="turn/completed"){let q=F.params;if(ue())for(let[I,L]of v.agentItems.entries())L.buffer&&fr("turn/completed/unflushed-item",{itemId:I,phase:L.phase,bufferLen:L.buffer.length});Yl(v),ue()&&fr("turn/completed",{params:q??null});let b=Ql(F,k);b.shouldReject?(ue()&&fr("turn/completed/terminal-reject",{message:b.turnError.message}),y=!0,_=!0,c.stdin?.end(),n(b.turnError)):(_=!0,c.stdin?.end())}if(R==="error"){let q=Zl(F,k);if(ue()){let b=F.params,I=b?.error,L=typeof I?.message=="string"?I.message:"(no message)";fr(q.willRetry?"error/retry":"error/terminal-deferred",{message:L,willRetry:q.willRetry,params:b??null})}}e.onEvent?.(F)});let Se="";c.stderr?.on("data",W=>{Se+=W.toString()}),c.on("error",W=>{C({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:W.message}),n(new we(`Failed to spawn codex app-server: ${W.message}`,{cause:W}))}),c.on("exit",W=>{if(!u&&!y){if(_){r({result:v.resultText,threadId:h,turnId:g,durationMs:Date.now()-T,exitCode:W});return}if(k.pendingCodexError){n(k.pendingCodexError);return}C({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:W,stderr_tail:Se.slice(0,500)}),n(new Error(LA({exitCode:W,stderr:Se})))}}),(async()=>{try{if(await A("initialize",RA()),z("initialized",{}),e.threadId)try{let W=A("thread/resume",{threadId:e.threadId,sandbox:d,approvalPolicy:"never",...e.model?{model:e.model}:{}}),F=new Promise((R,Z)=>setTimeout(()=>Z(new Error("resume timeout")),5e3));await Promise.race([W,F]),h=e.threadId}catch(W){process.stderr.write(`[codex] thread/resume failed, creating new thread
1542
- `),C({event:"codex_thread_resume_fallback",provider:"codex",thread_id:e.threadId,error_message:W instanceof Error?W.message:String(W)});let R=(await A("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:d,...e.model?{model:e.model}:{}})).result?.thread;R?.id&&(h=R.id)}else{let F=(await A("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:d,...e.model?{model:e.model}:{}})).result?.thread;F?.id&&(h=F.id)}await A("turn/start",{threadId:h,input:[{type:"text",text:t}],...e.model?{model:e.model}:{}})}catch(W){it(c).catch(()=>{}),n(W instanceof Error?W:new Error(String(W)))}})()})}var xA,n_=E(()=>{"use strict";me();me();cn();Ni();un();Gl();me();ut();ed();ed();xA=(()=>{try{let t=new URL("../../../package.json",import.meta.url),e=JSON.parse(NA(AA(t),"utf8"));return typeof e.version=="string"?e.version:"0.0.0"}catch{return"0.0.0"}})()});import{existsSync as o_,mkdirSync as OA,readFileSync as a_,writeFileSync as s_}from"node:fs";import{join as ps,resolve as $A}from"node:path";function l_(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 td(t,e,r={existsSync:o_,readFileSync:a_}){let n=[];for(let s of t){if(s.provider.trim().toLowerCase()!=="opencode")continue;let i=$A(e,s.sessiondir??e);for(let o of CA(i)){let a=MA(o,r);a!==void 0&&Object.prototype.hasOwnProperty.call(a,"permission")&&(l_(a.permission)||n.push(`[${s.alias}] ${o} sets a non-allow \`permission\`, which opencode merges over lmctl's YOLO (.opencode/opencode.json permission:"allow") \u2014 the member may hang on permission prompts. Set \`permission: "allow"\` in that file (or remove the key).`))}}return n}function CA(t){return[ps(t,".opencode","opencode.jsonc"),ps(t,"opencode.jsonc"),ps(t,"opencode.json")]}function MA(t,e){try{if(!e.existsSync(t))return;let r=e.readFileSync(t,"utf-8"),n=JSON.parse(DA(r));return n===null||typeof n!="object"||Array.isArray(n)?void 0:n}catch{return}}function DA(t){let e="",r=!1,n="",s=!1;for(let i=0;i<t.length;i+=1){let o=t[i],a=t[i+1];if(r){e+=o,s?s=!1:o==="\\"?s=!0:o===n&&(r=!1,n="");continue}if(o==='"'||o==="'"){r=!0,n=o,e+=o;continue}if(o==="/"&&a==="/"){for(;i<t.length&&t[i]!==`
1541
+ `)}m.on("line",W=>{let F;try{F=JSON.parse(W)}catch{return}if(typeof F.id=="number"&&f.has(F.id)){let q=f.get(F.id);if(f.delete(F.id),F.error){let b=F.error,I=typeof b?.message=="string"&&b.message.length>0?b.message:JSON.stringify(F.error);q.reject(Ii(`codex app-server error: ${I}`,b))}else q.resolve(F);e.onEvent?.(F);return}let R=F.method;if(!R){e.onEvent?.(F);return}if(R==="thread/started"){let b=F.params?.thread;b?.id&&(h=b.id)}let Z=ue()?q=>{fr("item.text/buffer-mismatch",{itemId:q.itemId,threadId:q.threadId??null,turnId:q.turnId??null,expectedFromItemText:q.expectedFromItemText,gotFromBuffer:q.gotFromBuffer,expectedLen:q.expectedFromItemText.length,gotLen:q.gotFromBuffer.length})}:void 0;if(R==="turn/started"){let q=F.params,b=q?.turn;b?.id&&(g=b.id),xi(F,v,e.onDelta,Z),ue()&&fr("turn/started",{params:q??null})}if(ue()&&(R==="item/started"||R==="item/completed")){let q=F.params;q?.item?.type==="agentMessage"&&fr(R,{params:q??null})}if(R==="item/started"||R==="item/agentMessage/delta"||R==="item/completed"){if(R==="item/agentMessage/delta"){let q=F.params;ue()&&fr("agentMessage/delta",{params:q??null})}xi(F,v,e.onDelta,Z)}if(R==="turn/completed"){let q=F.params;if(ue())for(let[I,L]of v.agentItems.entries())L.buffer&&fr("turn/completed/unflushed-item",{itemId:I,phase:L.phase,bufferLen:L.buffer.length});Kl(v),ue()&&fr("turn/completed",{params:q??null});let b=Zl(F,k);b.shouldReject?(ue()&&fr("turn/completed/terminal-reject",{message:b.turnError.message}),y=!0,_=!0,c.stdin?.end(),n(b.turnError)):(_=!0,c.stdin?.end())}if(R==="error"){let q=zl(F,k);if(ue()){let b=F.params,I=b?.error,L=typeof I?.message=="string"?I.message:"(no message)";fr(q.willRetry?"error/retry":"error/terminal-deferred",{message:L,willRetry:q.willRetry,params:b??null})}}e.onEvent?.(F)});let Se="";c.stderr?.on("data",W=>{Se+=W.toString()}),c.on("error",W=>{C({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:W.message}),n(new we(`Failed to spawn codex app-server: ${W.message}`,{cause:W}))}),c.on("exit",W=>{if(!u&&!y){if(_){r({result:v.resultText,threadId:h,turnId:g,durationMs:Date.now()-T,exitCode:W});return}if(k.pendingCodexError){n(k.pendingCodexError);return}C({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:W,stderr_tail:Se.slice(0,500)}),n(new Error(LA({exitCode:W,stderr:Se})))}}),(async()=>{try{if(await A("initialize",RA()),z("initialized",{}),e.threadId)try{let W=A("thread/resume",{threadId:e.threadId,sandbox:d,approvalPolicy:"never",...e.model?{model:e.model}:{}}),F=new Promise((R,Z)=>setTimeout(()=>Z(new Error("resume timeout")),5e3));await Promise.race([W,F]),h=e.threadId}catch(W){process.stderr.write(`[codex] thread/resume failed, creating new thread
1542
+ `),C({event:"codex_thread_resume_fallback",provider:"codex",thread_id:e.threadId,error_message:W instanceof Error?W.message:String(W)});let R=(await A("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:d,...e.model?{model:e.model}:{}})).result?.thread;R?.id&&(h=R.id)}else{let F=(await A("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:d,...e.model?{model:e.model}:{}})).result?.thread;F?.id&&(h=F.id)}await A("turn/start",{threadId:h,input:[{type:"text",text:t}],...e.model?{model:e.model}:{}})}catch(W){it(c).catch(()=>{}),n(W instanceof Error?W:new Error(String(W)))}})()})}var xA,n_=E(()=>{"use strict";me();me();cn();Ni();un();Jl();me();ut();Ql();Ql();xA=(()=>{try{let t=new URL("../../../package.json",import.meta.url),e=JSON.parse(NA(AA(t),"utf8"));return typeof e.version=="string"?e.version:"0.0.0"}catch{return"0.0.0"}})()});import{existsSync as o_,mkdirSync as OA,readFileSync as a_,writeFileSync as s_}from"node:fs";import{join as ps,resolve as $A}from"node:path";function l_(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 ed(t,e,r={existsSync:o_,readFileSync:a_}){let n=[];for(let s of t){if(s.provider.trim().toLowerCase()!=="opencode")continue;let i=$A(e,s.sessiondir??e);for(let o of CA(i)){let a=MA(o,r);a!==void 0&&Object.prototype.hasOwnProperty.call(a,"permission")&&(l_(a.permission)||n.push(`[${s.alias}] ${o} sets a non-allow \`permission\`, which opencode merges over lmctl's YOLO (.opencode/opencode.json permission:"allow") \u2014 the member may hang on permission prompts. Set \`permission: "allow"\` in that file (or remove the key).`))}}return n}function CA(t){return[ps(t,".opencode","opencode.jsonc"),ps(t,"opencode.jsonc"),ps(t,"opencode.json")]}function MA(t,e){try{if(!e.existsSync(t))return;let r=e.readFileSync(t,"utf-8"),n=JSON.parse(DA(r));return n===null||typeof n!="object"||Array.isArray(n)?void 0:n}catch{return}}function DA(t){let e="",r=!1,n="",s=!1;for(let i=0;i<t.length;i+=1){let o=t[i],a=t[i+1];if(r){e+=o,s?s=!1:o==="\\"?s=!0:o===n&&(r=!1,n="");continue}if(o==='"'||o==="'"){r=!0,n=o,e+=o;continue}if(o==="/"&&a==="/"){for(;i<t.length&&t[i]!==`
1543
1543
  `;)i+=1;i<t.length&&(e+=t[i]);continue}if(o==="/"&&a==="*"){for(i+=2;i<t.length&&!(t[i]==="*"&&t[i+1]==="/");)i+=1;i+=1;continue}e+=o}return e.replace(/,\s*([}\]])/g,"$1")}function Ri(t,e={}){let r=ps(t,".opencode"),n=ps(r,"opencode.json");if(!o_(n)){OA(r,{recursive:!0});let o=JSON.stringify({permission:"allow"},null,2);return s_(n,o+`
1544
1544
  `,"utf-8"),!0}let s;try{s=JSON.parse(a_(n,"utf-8"))}catch{return console.log(i_.yellow(` .opencode/opencode.json at ${n} is malformed \u2014 skipping opencode config install.`)),!1}if(typeof s!="object"||s===null)return console.log(i_.yellow(` .opencode/opencode.json at ${n} is not an object \u2014 skipping opencode config install.`)),!1;let i=!1;return s.permission===void 0&&(s.permission="allow",i=!0),l_(s.permission)||C({event:"opencode_yolo_override",provider:"opencode",config_path:n,user_permission:s.permission,message:`opencode.json has a user-set 'permission' value other than 'allow' \u2014 lmctl's YOLO contract is NOT in effect; turns may hang waiting on permission prompts. Set permission: "allow" or remove the key to restore YOLO.`}),i&&s_(n,JSON.stringify(s,null,2)+`
1545
- `,"utf-8"),i}var i_,Li=E(()=>{"use strict";me();i_={yellow:t=>t}});function u_(t){let e=[...t.matchAll(jA)];if(e.length>0){let r=e[e.length-1],n=(r.index??0)+r[0].length;return d_(t.slice(n).trimStart())}return d_(qA(t.replace(PA,"")))}function qA(t){let e=FA.exec(t);if(e===null)return t;let r=t.slice(e[0].length),n=[...r.matchAll(UA)];if(n.length<2)return t;let s=n[0],i=(s.index??0)+s[0].length;return r.slice(i).trimStart()}function d_(t){let e=[...t.matchAll(WA)];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 mn(t,e=""){let r=t.result;return typeof r?.sessionId=="string"&&r.sessionId.length>0?r.sessionId:e}function m_(t){let e=t.result;return typeof e?.stopReason=="string"?e.stopReason:""}function rd(t={}){let e="",r="",n="",s=!1,i=!1,o=()=>({result:t.tool==="gemini"?u_(r):r,sessionId:e,stopReason:n});return{setSessionId(a){e=a},beginTurn(){r="",n="",s=!1,i=!0},completeTurn(a){return n=m_(a),s=!0,i=!1,o()},processMessage(a){if(a.method!=="session/update")return!1;let d=a.params?.update;if(d?.sessionUpdate!=="agent_message_chunk")return!1;let c=d.content,u=typeof c?.text=="string"?c.text:"";return u&&i&&(r+=u,t.onDelta?.(u)),!0},finalize(){return s?o():null}}}var c_,jA,PA,FA,UA,WA,nd=E(()=>{"use strict";c_="(?:png|jpe?g|webp|heic|pdf)",jA=new RegExp(`\\bSTANCE:\\s*\\S+_\\d{6,}\\.${c_}\\s*`,"gi"),PA=new RegExp(`^ACK:\\s*waiting for explicit lmctl task\\.\\d{6,}\\.${c_}\\s*`,"i"),FA=/^ACK:\s*waiting for explicit lmctl task[._]?\s*/i,UA=/^STANCE:\s+\S+\s*$/gim,WA=/\[Thought:\s*true\]\s*/gi});import{spawn as f_}from"node:child_process";import{existsSync as BA}from"node:fs";import{createInterface as HA}from"node:readline";function XA(t){let e=t.stderr.trim().slice(0,500),r=`lmctl: ${t.tool} ACP process exited with code ${t.exitCode} before completing the prompt.
1545
+ `,"utf-8"),i}var i_,Li=E(()=>{"use strict";me();i_={yellow:t=>t}});function u_(t){let e=[...t.matchAll(jA)];if(e.length>0){let r=e[e.length-1],n=(r.index??0)+r[0].length;return d_(t.slice(n).trimStart())}return d_(qA(t.replace(PA,"")))}function qA(t){let e=FA.exec(t);if(e===null)return t;let r=t.slice(e[0].length),n=[...r.matchAll(UA)];if(n.length<2)return t;let s=n[0],i=(s.index??0)+s[0].length;return r.slice(i).trimStart()}function d_(t){let e=[...t.matchAll(WA)];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 mn(t,e=""){let r=t.result;return typeof r?.sessionId=="string"&&r.sessionId.length>0?r.sessionId:e}function m_(t){let e=t.result;return typeof e?.stopReason=="string"?e.stopReason:""}function td(t={}){let e="",r="",n="",s=!1,i=!1,o=()=>({result:t.tool==="gemini"?u_(r):r,sessionId:e,stopReason:n});return{setSessionId(a){e=a},beginTurn(){r="",n="",s=!1,i=!0},completeTurn(a){return n=m_(a),s=!0,i=!1,o()},processMessage(a){if(a.method!=="session/update")return!1;let d=a.params?.update;if(d?.sessionUpdate!=="agent_message_chunk")return!1;let c=d.content,u=typeof c?.text=="string"?c.text:"";return u&&i&&(r+=u,t.onDelta?.(u)),!0},finalize(){return s?o():null}}}var c_,jA,PA,FA,UA,WA,rd=E(()=>{"use strict";c_="(?:png|jpe?g|webp|heic|pdf)",jA=new RegExp(`\\bSTANCE:\\s*\\S+_\\d{6,}\\.${c_}\\s*`,"gi"),PA=new RegExp(`^ACK:\\s*waiting for explicit lmctl task\\.\\d{6,}\\.${c_}\\s*`,"i"),FA=/^ACK:\s*waiting for explicit lmctl task[._]?\s*/i,UA=/^STANCE:\s+\S+\s*$/gim,WA=/\[Thought:\s*true\]\s*/gi});import{spawn as f_}from"node:child_process";import{existsSync as BA}from"node:fs";import{createInterface as HA}from"node:readline";function XA(t){let e=t.stderr.trim().slice(0,500),r=`lmctl: ${t.tool} ACP process exited with code ${t.exitCode} before completing the prompt.
1546
1546
  One possible cause: the provider process failed before a complete ACP response was delivered.`;return e?`Original provider error:
1547
1547
  ${e}
1548
1548
 
1549
1549
  ${r}`:r}function p_(t,e){let r=HA({input:t.stdout}),n=new Map,s=(o,a={})=>new Promise((l,d)=>{let c=JA++;n.set(c,{resolve:l,reject:d});let u=JSON.stringify({jsonrpc:"2.0",id:c,method:o,params:a});Oe({event:"acp_send",direction:"SEND",provider:e.provider,method:o,id:c,params:a}),t.stdin?.write(`${u}
1550
1550
  `)}),i=(o,a={})=>{t.stdin?.write(`${JSON.stringify({jsonrpc:"2.0",method:o,params:a})}
1551
1551
  `)};return r.on("line",o=>{let a;try{a=JSON.parse(o)}catch{return}if(Oe({event:"acp_recv",direction:"RECV",provider:e.provider,id:typeof a.id=="number"?a.id:void 0,method:typeof a.method=="string"?a.method:void 0,preview:JSON.stringify(a).slice(0,300)}),e.onEvent?.(a),typeof a.id=="number"&&n.has(a.id)){let d=n.get(a.id);if(n.delete(a.id),a.error){let c=a.error,u=typeof c?.message=="string"&&c.message.length>0?c.message:JSON.stringify(a.error);d.reject(Ii(`ACP RPC error: ${u}`,c))}else d.resolve(a);return}let l=a.method;if(l){if(typeof a.id=="number"){C({event:"acp_unhandled_request",provider:e.provider,method:l,id:a.id,params:a.params});let d=JSON.stringify({jsonrpc:"2.0",id:a.id,error:{code:-32601,message:`Method not found: ${l} (lmctl does not implement server-side ACP methods)`}});Oe({event:"acp_send",direction:"SEND",provider:e.provider,replyTo:a.id,error:"method not found"}),t.stdin?.write(`${d}
1552
- `);return}e.onNotification?.(a)}}),{sendRpc:s,sendNotification:i,close(o=new we("ACP RPC channel closed")){r.close();for(let a of n.values())a.reject(o);n.clear()}}}function id(t){let e;try{e=f_(t.binaryPath??sd.opencode.binary,sd.opencode.args,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:Fe(t.env,t.cwd,void 0,"unknown")})}catch(s){return Promise.resolve({status:"unavailable",reason:"spawn",error:s instanceof Error?s.message:String(s)})}let r=p_(e,{provider:"opencode"}),n=t.timeoutMs??5e3;return new Promise(s=>{let i=!1,o=(c,u=!0)=>{if(!i){if(i=!0,clearTimeout(d),e.removeListener("error",a),e.removeListener("exit",l),r.close(),!u){s(c);return}it(e,{softDelayMs:100,killDelayMs:100}).finally(()=>s(c))}},a=c=>{o({status:"unavailable",reason:"spawn",error:c.message},!1)},l=(c,u)=>{o({status:"unavailable",reason:"handshake",error:`opencode ACP exited before verification (code=${String(c)}, signal=${String(u)})`},!1)};e.once("error",a),e.once("exit",l);let d=setTimeout(()=>{o({status:"unavailable",reason:"timeout"})},n);(async()=>{try{await r.sendRpc("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),r.sendNotification("notifications/initialized");let c=await r.sendRpc("session/new",{cwd:t.cwd,mcpServers:[]}),u=mn(c);try{await r.sendRpc("session/set_config_option",{sessionId:u,configId:"model",value:t.model})}catch(m){o({status:"rejected",option:"model",value:t.model,error:m instanceof Error?m.message:String(m)});return}if(t.effort!==void 0)try{await r.sendRpc("session/set_config_option",{sessionId:u,configId:"effort",value:t.effort})}catch(m){o({status:"rejected",option:"effort",value:t.effort,error:m instanceof Error?m.message:String(m)});return}o({status:"verified"})}catch(c){o({status:"unavailable",reason:"handshake",error:c instanceof Error?c.message:String(c)})}})()})}function __(t,e){let r=sd[e.tool];return r?new Promise((n,s)=>{let i=e.binaryPath||r.binary;if(e.tool==="opencode")try{Ri(e.cwd)}catch(y){C({event:"opencode_config_install_failed",cwd:e.cwd,error_message:y instanceof Error?y.message:String(y)})}let o=e.permissionMode??"yolo",a=[...r.args];if(o==="plan")if(e.tool==="gemini"){let y=mr("gemini","plan"),T=mr("gemini","yolo");a=a.filter(v=>!(T??[]).includes(v)),y&&a.push(...y)}else e.tool==="copilot"&&(process.stderr.write(`[acp] copilot has no plan-mode flag in --acp mode; --permission-mode plan is not honored (running yolo). See src/providers/yolo-contract.ts.
1552
+ `);return}e.onNotification?.(a)}}),{sendRpc:s,sendNotification:i,close(o=new we("ACP RPC channel closed")){r.close();for(let a of n.values())a.reject(o);n.clear()}}}function sd(t){let e;try{e=f_(t.binaryPath??nd.opencode.binary,nd.opencode.args,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:Fe(t.env,t.cwd,void 0,"unknown")})}catch(s){return Promise.resolve({status:"unavailable",reason:"spawn",error:s instanceof Error?s.message:String(s)})}let r=p_(e,{provider:"opencode"}),n=t.timeoutMs??5e3;return new Promise(s=>{let i=!1,o=(c,u=!0)=>{if(!i){if(i=!0,clearTimeout(d),e.removeListener("error",a),e.removeListener("exit",l),r.close(),!u){s(c);return}it(e,{softDelayMs:100,killDelayMs:100}).finally(()=>s(c))}},a=c=>{o({status:"unavailable",reason:"spawn",error:c.message},!1)},l=(c,u)=>{o({status:"unavailable",reason:"handshake",error:`opencode ACP exited before verification (code=${String(c)}, signal=${String(u)})`},!1)};e.once("error",a),e.once("exit",l);let d=setTimeout(()=>{o({status:"unavailable",reason:"timeout"})},n);(async()=>{try{await r.sendRpc("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),r.sendNotification("notifications/initialized");let c=await r.sendRpc("session/new",{cwd:t.cwd,mcpServers:[]}),u=mn(c);try{await r.sendRpc("session/set_config_option",{sessionId:u,configId:"model",value:t.model})}catch(m){o({status:"rejected",option:"model",value:t.model,error:m instanceof Error?m.message:String(m)});return}if(t.effort!==void 0)try{await r.sendRpc("session/set_config_option",{sessionId:u,configId:"effort",value:t.effort})}catch(m){o({status:"rejected",option:"effort",value:t.effort,error:m instanceof Error?m.message:String(m)});return}o({status:"verified"})}catch(c){o({status:"unavailable",reason:"handshake",error:c instanceof Error?c.message:String(c)})}})()})}function __(t,e){let r=nd[e.tool];return r?new Promise((n,s)=>{let i=e.binaryPath||r.binary;if(e.tool==="opencode")try{Ri(e.cwd)}catch(y){C({event:"opencode_config_install_failed",cwd:e.cwd,error_message:y instanceof Error?y.message:String(y)})}let o=e.permissionMode??"yolo",a=[...r.args];if(o==="plan")if(e.tool==="gemini"){let y=mr("gemini","plan"),T=mr("gemini","yolo");a=a.filter(v=>!(T??[]).includes(v)),y&&a.push(...y)}else e.tool==="copilot"&&(process.stderr.write(`[acp] copilot has no plan-mode flag in --acp mode; --permission-mode plan is not honored (running yolo). See src/providers/yolo-contract.ts.
1553
1553
  `),C({event:"acp_plan_mode_unsupported",provider:e.tool,requested_mode:"plan",effective_mode:"yolo"}));e.model&&e.tool==="gemini"&&a.push("--model",e.model);let l=e.tool==="copilot"?"yolo":o;try{mt(e.tool,a,l)}catch(y){return s(y)}if(e.model&&e.tool==="copilot"&&(process.stderr.write(`[acp] copilot does not support per-session model selection in --acp mode (model="${e.model}" ignored). Set the default via copilot's /model slash command in an interactive \`lmctl terminal\` session.
1554
- `),C({event:"acp_model_unsupported",provider:e.tool,model:e.model})),e.cwd&&!BA(e.cwd))return C({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),s(new we(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let d=f_(i,a,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Fe(e.env,e.cwd,e.sessionId)}),c=Date.now(),u=!1;if(e.signal){if(e.signal.aborted)return u=!0,C({event:"transport_abort",provider:e.tool,phase:"pre_spawn"}),it(d).catch(()=>{}),s(new Error("Aborted"));e.signal.addEventListener("abort",()=>{u=!0,C({event:"transport_abort",provider:e.tool,elapsed_ms:Date.now()-c}),it(d).catch(()=>{}),s(new Error("Aborted"))},{once:!0})}let m=e.sessionId||"",f=rd({tool:e.tool,onDelta:e.onDelta});f.setSessionId(m);let p=p_(d,{provider:e.tool,onEvent:e.onEvent,onNotification:y=>f.processMessage(y)}),{sendRpc:h,sendNotification:g}=p,_="";d.stderr?.on("data",y=>{_+=y.toString()}),d.on("error",y=>{p.close(y),C({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:y.message,elapsed_ms:Date.now()-c}),s(new we(`Failed to spawn ${r.binary} ${r.args.join(" ")}: ${y.message}`,{cause:y}))}),d.on("exit",y=>{if(p.close(new we(`ACP process exited with code ${String(y)}`)),u)return;let T=f.finalize();T!==null?n({result:T.result,sessionId:T.sessionId,durationMs:Date.now()-c,stopReason:T.stopReason,exitCode:y}):(C({event:"transport_error",provider:e.tool,error_class:"Error",reason:"provider_no_result",exit_code:y,stderr_tail:_.slice(0,500),elapsed_ms:Date.now()-c}),s(new Error(XA({tool:e.tool,exitCode:y,stderr:_}))))}),(async()=>{try{if(await h("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),g("notifications/initialized"),e.sessionId)try{let v=await h("session/load",{sessionId:e.sessionId,cwd:e.cwd,mcpServers:[]});m=mn(v,e.sessionId),f.setSessionId(m)}catch(v){if(e.requireResume)throw new Error(`Cannot resume session ${e.sessionId} via ACP: ${v instanceof Error?v.message:String(v)}`);process.stderr.write(`[acp] session/load failed for ${e.sessionId}, creating new session
1554
+ `),C({event:"acp_model_unsupported",provider:e.tool,model:e.model})),e.cwd&&!BA(e.cwd))return C({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),s(new we(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let d=f_(i,a,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Fe(e.env,e.cwd,e.sessionId)}),c=Date.now(),u=!1;if(e.signal){if(e.signal.aborted)return u=!0,C({event:"transport_abort",provider:e.tool,phase:"pre_spawn"}),it(d).catch(()=>{}),s(new Error("Aborted"));e.signal.addEventListener("abort",()=>{u=!0,C({event:"transport_abort",provider:e.tool,elapsed_ms:Date.now()-c}),it(d).catch(()=>{}),s(new Error("Aborted"))},{once:!0})}let m=e.sessionId||"",f=td({tool:e.tool,onDelta:e.onDelta});f.setSessionId(m);let p=p_(d,{provider:e.tool,onEvent:e.onEvent,onNotification:y=>f.processMessage(y)}),{sendRpc:h,sendNotification:g}=p,_="";d.stderr?.on("data",y=>{_+=y.toString()}),d.on("error",y=>{p.close(y),C({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:y.message,elapsed_ms:Date.now()-c}),s(new we(`Failed to spawn ${r.binary} ${r.args.join(" ")}: ${y.message}`,{cause:y}))}),d.on("exit",y=>{if(p.close(new we(`ACP process exited with code ${String(y)}`)),u)return;let T=f.finalize();T!==null?n({result:T.result,sessionId:T.sessionId,durationMs:Date.now()-c,stopReason:T.stopReason,exitCode:y}):(C({event:"transport_error",provider:e.tool,error_class:"Error",reason:"provider_no_result",exit_code:y,stderr_tail:_.slice(0,500),elapsed_ms:Date.now()-c}),s(new Error(XA({tool:e.tool,exitCode:y,stderr:_}))))}),(async()=>{try{if(await h("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),g("notifications/initialized"),e.sessionId)try{let v=await h("session/load",{sessionId:e.sessionId,cwd:e.cwd,mcpServers:[]});m=mn(v,e.sessionId),f.setSessionId(m)}catch(v){if(e.requireResume)throw new Error(`Cannot resume session ${e.sessionId} via ACP: ${v instanceof Error?v.message:String(v)}`);process.stderr.write(`[acp] session/load failed for ${e.sessionId}, creating new session
1555
1555
  `),C({event:"acp_session_resume_fallback",provider:e.tool,session_id:e.sessionId,error_message:v instanceof Error?v.message:String(v)});let k=await h("session/new",{cwd:e.cwd,mcpServers:[]});m=mn(k),f.setSessionId(m)}else{let v=await h("session/new",{cwd:e.cwd,mcpServers:[]});m=mn(v),f.setSessionId(m)}if(e.model&&e.tool==="opencode")try{await h("session/set_config_option",{sessionId:m,configId:"model",value:e.model}),kt(`acp: set_config_option(model=${e.model}) ok`)}catch(v){let k=v instanceof Error?v.message:String(v);process.stderr.write(`[acp] set_config_option(model=${e.model}) failed: ${k}
1556
1556
  `),C({event:"acp_config_option_failed",provider:e.tool,config_id:"model",value:e.model,error_message:k})}if(e.effort&&e.tool==="opencode")try{await h("session/set_config_option",{sessionId:m,configId:"effort",value:e.effort}),kt(`acp: set_config_option(effort=${e.effort}) ok`)}catch(v){let k=v instanceof Error?v.message:String(v);process.stderr.write(`[acp] set_config_option(effort=${e.effort}) failed: ${k}
1557
- `),C({event:"acp_config_option_failed",provider:e.tool,config_id:"effort",value:e.effort,error_message:k})}f.beginTurn(),kt(`acp: prompt sent (${t.length} chars)`);let y=await h("session/prompt",{sessionId:m,prompt:[{type:"text",text:t}]}),T=f.completeTurn(y);kt(`acp: result received (${T.result.length} chars, stopReason=${T.stopReason})`),d.stdin?.end()}catch(y){it(d).catch(()=>{}),s(y instanceof Error?y:new Error(String(y)))}})()}):Promise.reject(new Error(`No ACP config for tool "${e.tool}"`))}var sd,JA,od=E(()=>{"use strict";me();cn();Ni();un();Li();me();ut();nd();nd();sd={gemini:{binary:"gemini",args:["--acp","-y","--skip-trust"]},copilot:{binary:"copilot",args:["--acp","--yolo"]},opencode:{binary:"opencode",args:["acp"]}},JA=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 h_(t,e){return r=>{if(r.kind==="tool_use"&&typeof r.id=="string"){if(t.size>=GA){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 VA(){let t=new Map;return(e,r)=>{KA(e,h_(t,r))}}function KA(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,i=typeof t.max_retries=="number"?t.max_retries:void 0,o=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,d=[];s!==void 0&&d.push(i!==void 0?`attempt ${s}/${i}`:`attempt ${s}`),o!==void 0&&d.push(`HTTP ${o}`),l!==void 0&&d.push(`retry in ${Math.round(l/1e3)}s`),a&&d.push(ge(a,60));let c=d.length>0?d.join(", "):n;e({kind:"api_retry",summary:c});return}if(n==="api_error"){let s=typeof t.error_status=="number"?t.error_status:void 0,i=typeof t.error=="string"?t.error:void 0,o=["api_error"];s!==void 0&&o.push(`HTTP ${s}`),i&&o.push(ge(i,80)),e({kind:"other",summary:o.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 i of s){let o=i.type;if(o==="text"){let a=i.text||"";a&&e({kind:"text",summary:ge(a),raw:i})}else if(o==="tool_use"){let a=i.name||"tool",l=typeof i.id=="string"?i.id:void 0,d=i.input,c="";d&&(typeof d.command=="string"?c=d.command:typeof d.file_path=="string"?c=d.file_path:typeof d.path=="string"?c=d.path:typeof d.pattern=="string"?c=d.pattern:typeof d.url=="string"?c=d.url:c=ge(JSON.stringify(d))),e({kind:"tool_use",tool:a,summary:ge(c),id:l,raw:i})}else if(o==="thinking"){let a=i.thinking||"";e({kind:"thinking",summary:ge(a),raw:i})}else if(o==="tool_result"){let l=i.is_error===!0?"error":"ok",d=typeof i.tool_use_id=="string"?i.tool_use_id:void 0,c,u=i.content;if(typeof u=="string")c=`${u.split(`
1557
+ `),C({event:"acp_config_option_failed",provider:e.tool,config_id:"effort",value:e.effort,error_message:k})}f.beginTurn(),kt(`acp: prompt sent (${t.length} chars)`);let y=await h("session/prompt",{sessionId:m,prompt:[{type:"text",text:t}]}),T=f.completeTurn(y);kt(`acp: result received (${T.result.length} chars, stopReason=${T.stopReason})`),d.stdin?.end()}catch(y){it(d).catch(()=>{}),s(y instanceof Error?y:new Error(String(y)))}})()}):Promise.reject(new Error(`No ACP config for tool "${e.tool}"`))}var nd,JA,id=E(()=>{"use strict";me();cn();Ni();un();Li();me();ut();rd();rd();nd={gemini:{binary:"gemini",args:["--acp","-y","--skip-trust"]},copilot:{binary:"copilot",args:["--acp","--yolo"]},opencode:{binary:"opencode",args:["acp"]}},JA=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 h_(t,e){return r=>{if(r.kind==="tool_use"&&typeof r.id=="string"){if(t.size>=GA){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 VA(){let t=new Map;return(e,r)=>{KA(e,h_(t,r))}}function KA(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,i=typeof t.max_retries=="number"?t.max_retries:void 0,o=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,d=[];s!==void 0&&d.push(i!==void 0?`attempt ${s}/${i}`:`attempt ${s}`),o!==void 0&&d.push(`HTTP ${o}`),l!==void 0&&d.push(`retry in ${Math.round(l/1e3)}s`),a&&d.push(ge(a,60));let c=d.length>0?d.join(", "):n;e({kind:"api_retry",summary:c});return}if(n==="api_error"){let s=typeof t.error_status=="number"?t.error_status:void 0,i=typeof t.error=="string"?t.error:void 0,o=["api_error"];s!==void 0&&o.push(`HTTP ${s}`),i&&o.push(ge(i,80)),e({kind:"other",summary:o.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 i of s){let o=i.type;if(o==="text"){let a=i.text||"";a&&e({kind:"text",summary:ge(a),raw:i})}else if(o==="tool_use"){let a=i.name||"tool",l=typeof i.id=="string"?i.id:void 0,d=i.input,c="";d&&(typeof d.command=="string"?c=d.command:typeof d.file_path=="string"?c=d.file_path:typeof d.path=="string"?c=d.path:typeof d.pattern=="string"?c=d.pattern:typeof d.url=="string"?c=d.url:c=ge(JSON.stringify(d))),e({kind:"tool_use",tool:a,summary:ge(c),id:l,raw:i})}else if(o==="thinking"){let a=i.thinking||"";e({kind:"thinking",summary:ge(a),raw:i})}else if(o==="tool_result"){let l=i.is_error===!0?"error":"ok",d=typeof i.tool_use_id=="string"?i.tool_use_id:void 0,c,u=i.content;if(typeof u=="string")c=`${u.split(`
1558
1558
  `).length} lines, ${u.length} chars`;else if(Array.isArray(u)){let m=u.map(f=>typeof f=="object"&&f&&"text"in f?f.text:"").filter(Boolean).join("");m&&(c=`${m.split(`
1559
1559
  `).length} lines, ${m.length} chars`)}e({kind:"tool_result",status:l,summary:c,id:d,raw:i})}else o&&e({kind:"other",summary:o,raw:i})}return}if(r==="result"){e({kind:"system",summary:"result",raw:t});return}}async function Oi(t,e){let r=e.binary==="qwen"?"qwen":"claude",n=e.onProgress?VA():void 0,s=await Zp(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?i=>n(i,e.onProgress):void 0,signal:e.signal});return{text:s.result,sessionId:s.sessionId,durationMs:s.durationMs,numTurns:s.numTurns}}function YA(){let t=new Map;return(e,r)=>{zA(e,h_(t,r))}}function zA(t,e){if(t.method!=="session/update")return;let s=t.params?.update;if(!s)return;let i=s.sessionUpdate;if(i){if(i==="agent_message_chunk"){let a=s.content?.text||"";a&&e({kind:"text",summary:ge(a)});return}if(i==="agent_thought_chunk"){let a=s.content?.text||"";e({kind:"thinking",summary:ge(a)});return}if(i==="tool_call"){let o=s.title||s.kind||"tool",a=typeof s.toolCallId=="string"?s.toolCallId:void 0,l="",d=s.rawInput;d&&(typeof d.command=="string"?l=d.command:typeof d.file_path=="string"?l=d.file_path:typeof d.path=="string"?l=d.path:l=ge(JSON.stringify(d))),e({kind:"tool_use",tool:o,summary:ge(l),id:a});return}if(i==="tool_call_update"){let o=s.status||"",a=typeof s.toolCallId=="string"?s.toolCallId:void 0;if(o==="completed"||o==="failed")e({kind:"tool_result",summary:o,status:o==="failed"?"error":"ok",id:a});else if(o==="in_progress"){let l=s.content,d=typeof l=="string"?l:typeof l?.text=="string"?l.text:"",c=d?`running\u2026 ${ge(d,80)}`:"running\u2026";e({kind:"other",summary:c,id:a})}return}e({kind:"other",summary:i})}}async function fn(t,e){let r=e.acpTool||e.binary;e.model&&r==="copilot"&&Oe({event:"model_ignored",provider:r,model:e.model,reason:"copilot --acp does not implement per-session model selection"});let n=e.onProgress?YA():void 0,s=await __(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?i=>n(i,e.onProgress):void 0,signal:e.signal});return{text:s.result,sessionId:s.sessionId,durationMs:s.durationMs,stopReason:s.stopReason}}function ZA(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,i=typeof s?.message=="string"?s.message:void 0,o=i&&i.length>0?i:"(no message)",a=n?.willRetry===!0;e(a?{kind:"api_retry",summary:`codex retry: ${ge(o,120)}`}:{kind:"other",summary:`codex error: ${ge(o,120)}`});return}if(r==="item/started"||r==="item/completed"){let s=n?.item;if(!s)return;let i=s.type,o=r==="item/started";switch(i){case"commandExecution":{let a=typeof s.id=="string"?s.id:void 0,l=s.command,d=Array.isArray(l)?l.join(" "):typeof l=="string"?l:"";if(o)e({kind:"tool_use",tool:"Bash",summary:ge(d||"(command)"),id:a});else{let c=s.exitCode,u=s.status||"",m=typeof s.durationMs=="number"?s.durationMs:void 0,f=typeof c=="number"?`exit ${c}`:u||"done",p=[];typeof c=="number"?p.push(`exit ${c}`):u&&p.push(u),typeof m=="number"&&p.push(`${Math.round(m/1e3)}s`),e({kind:"tool_result",summary:p.join(", ")||"done",status:f,elapsedMs:m,id:a})}return}case"fileChange":{let a=typeof s.id=="string"?s.id:void 0;if(o){let l=s.changes,d=Array.isArray(l)?l.map(c=>c.path||"").filter(Boolean).join(", "):"";e({kind:"tool_use",tool:"FileChange",summary:ge(d||"(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",d=s.tool||"tool";if(o)e({kind:"tool_use",tool:`${l}/${d}`,summary:"",id:a});else{let c=s.status||"done";e({kind:"tool_result",summary:c,status:c,id:a})}return}case"webSearch":{let a=typeof s.id=="string"?s.id:void 0;e(o?{kind:"tool_use",tool:"WebSearch",summary:ge(s.query||""),id:a}:{kind:"tool_result",summary:"done",status:"done",id:a});return}case"reasoning":{o&&e({kind:"thinking",summary:""});return}case"agentMessage":case"userMessage":return;default:{i&&e({kind:o?"tool_use":"tool_result",tool:i,summary:""});return}}}if(r==="item/agentMessage/delta"){let s=n?.delta||"";if(s){let i=typeof n?._lmctlItemPhase=="string"?n._lmctlItemPhase:void 0;e(i==="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 i=s.split(`
1560
1560
  `).filter(l=>l.length>0),o=i[i.length-1]||"",a=i.length>1?`${i.length} lines: ${ge(o,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 i=s.split(`
1561
- `).filter(l=>l.length>0),o=i[i.length-1]||"",a=i.length>1?`${i.length} lines: ${ge(o,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 g_(t,e){let r=await r_(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=>ZA(n,e.onProgress):void 0,signal:e.signal});return{text:r.result,sessionId:r.threadId,durationMs:r.durationMs}}var GA,$r=E(()=>{"use strict";Qp();n_();od();me();GA=256});function ld(t){return new ad(t)}var ad,dd=E(()=>{"use strict";Wp();Ht();$r();At();ad=class extends Le{constructor(e){super({provider:new vi(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"claude",seedArgs:["-p",Ee,"--dangerously-skip-permissions"],resumeTemplate:"claude --resume {{session_id}}",startTemplate:"claude",transport:Oi})}seedArgsFor(e){let r=super.seedArgsFor(e);return e?.model?[...r,"--model",e.model]:r}}});import{readdir as QA,stat as y_,unlink as ex}from"node:fs/promises";import{join as _s,basename as tx}from"node:path";function rx(t,e,r){return`${t}|${e.toISOString()}|${r}`}function hs(t,e,r){let n=rx(r.role,r.timestamp,r.content);e.has(n)||(e.add(n),t.push(r))}function E_(t,e){return e==="exec"||t==="codex_exec"?"codex exec":"codex"}function nx(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 $i(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 $i(r)}).filter(r=>r.length>0).join(`
1561
+ `).filter(l=>l.length>0),o=i[i.length-1]||"",a=i.length>1?`${i.length} lines: ${ge(o,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 g_(t,e){let r=await r_(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=>ZA(n,e.onProgress):void 0,signal:e.signal});return{text:r.result,sessionId:r.threadId,durationMs:r.durationMs}}var GA,$r=E(()=>{"use strict";Qp();n_();id();me();GA=256});function ad(t){return new od(t)}var od,ld=E(()=>{"use strict";Wp();Ht();$r();At();od=class extends Le{constructor(e){super({provider:new vi(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"claude",seedArgs:["-p",Ee,"--dangerously-skip-permissions"],resumeTemplate:"claude --resume {{session_id}}",startTemplate:"claude",transport:Oi})}seedArgsFor(e){let r=super.seedArgsFor(e);return e?.model?[...r,"--model",e.model]:r}}});import{readdir as QA,stat as y_,unlink as ex}from"node:fs/promises";import{join as _s,basename as tx}from"node:path";function rx(t,e,r){return`${t}|${e.toISOString()}|${r}`}function hs(t,e,r){let n=rx(r.role,r.timestamp,r.content);e.has(n)||(e.add(n),t.push(r))}function E_(t,e){return e==="exec"||t==="codex_exec"?"codex exec":"codex"}function nx(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 $i(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 $i(r)}).filter(r=>r.length>0).join(`
1562
1562
  `);try{return JSON.stringify(t)}catch{return String(t)}}async function w_(t){let e=0,r=0,n=0,s=0,i=0,o,a;for await(let l of Ge(t)){if(l.type==="response_item"&&l.payload){let d=l.payload;if(d.type==="message"&&d.role==="user"&&d.content)for(let c of d.content)c.type==="input_text"&&typeof c.text=="string"&&c.text&&e++;else if(d.type==="message"&&d.role==="assistant"&&d.content)for(let c of d.content)c.type==="output_text"&&typeof c.text=="string"&&c.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 d=l.payload.info.total_token_usage;r=d.input_tokens??r,n=d.cached_input_tokens??d.cache_read_input_tokens??n,s=d.output_tokens??s,i=d.reasoning_output_tokens??i;let c=nx(l.payload.info.last_token_usage);c&&(o=c),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:i,lastTokenUsage:o,modelContextWindow:a}}var Ci,T_=E(()=>{"use strict";cr();Ci=class{name="codex";codexDirs;constructor(e={}){let r=[_s(Ie,".codex"),_s(Ie,".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:_s(e,"sessions"),filePattern:/\.jsonl$/}))}async getSessionsDirs(){let e=[];for(let r of this.codexDirs){let n=_s(r,"sessions");try{await y_(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 i of s)try{let o=await this.extractSummary(i);o&&e.push(o)}catch{}}return e}async findSessionFiles(e){let r=[],n;try{n=await QA(e)}catch{return r}for(let s of n){let i=_s(e,s),o=await y_(i).catch(()=>null);if(o)if(o.isDirectory()){let a=await this.findSessionFiles(i);r.push(...a)}else s.endsWith(".jsonl")&&r.push(i)}return r}extractSessionIdFromFilename(e){let r=tx(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 Pe(e,30),n=await Re(e),s=this.extractSessionIdFromFilename(e),i="",o,a,l,d,c,u,m;for(let p of r){if(p.type==="session_meta"&&p.payload&&(p.payload.id&&(s=p.payload.id),p.payload.cwd&&(i=p.payload.cwd),p.payload.cli_version&&(o=p.payload.cli_version),p.payload.timestamp&&(l=new Date(p.payload.timestamp)),p.payload.originator&&(u=p.payload.originator),p.payload.source&&(m=p.payload.source)),p.type==="turn_context"&&p.payload&&(p.payload.model&&(a=p.payload.model),!i&&p.payload.cwd&&(i=p.payload.cwd)),p.type==="event_msg"&&p.payload?.type==="user_message"){let h=p.payload.message||p.payload.text;h&&(d||(d=H(h.trim(),80)),c=H(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"&&(d||(d=H(h.text.trim(),80)),c=H(h.text.trim(),80))}}if(!i)return null;let f=await w_(e);return{provider:"codex",sessionId:s,cwd:i,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:o,startCommand:E_(u,m),firstUserMessage:d,lastUserMessage:c,messageCount:f.messageCount,filePath:e,totalInputTokens:f.totalInputTokens||void 0,totalCachedInputTokens:f.totalCachedInputTokens||void 0,totalOutputTokens:f.totalOutputTokens||void 0,totalReasoningOutputTokens:f.totalReasoningOutputTokens||void 0,lastInputTokens:f.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:f.lastTokenUsage,modelContextWindow:f.modelContextWindow}}async loadSession(e){let r=await this.resolveSessionFile(e);if(!r)return null;let n=await Re(r),s=[],i="",o,a,l,d,c,u=e,m,f=new Set;for await(let h of Ge(r)){let g=h.timestamp?new Date(h.timestamp):new Date;if(h.type==="session_meta"&&h.payload){h.payload.id&&(u=h.payload.id),h.payload.cwd&&(i=h.payload.cwd),h.payload.cli_version&&(o=h.payload.cli_version),h.payload.timestamp&&(l=new Date(h.payload.timestamp)),m=E_(h.payload.originator,h.payload.source);continue}if(h.type==="turn_context"&&h.payload){h.payload.model&&(a=h.payload.model),!i&&h.payload.cwd&&(i=h.payload.cwd);continue}if(h.type==="response_item"&&h.payload){let _=h.payload;if(_.type==="message"){if(_.role==="user"&&_.content){for(let y of _.content)if(y.type==="input_text"&&typeof y.text=="string"&&y.text){let T=y.text.trim();d||(d=H(T,80)),c=H(T,80),hs(s,f,{role:"user",timestamp:g,content:pe(T)})}continue}if(_.role==="assistant"&&_.content){for(let y of _.content)y.type==="output_text"&&typeof y.text=="string"&&y.text&&hs(s,f,{role:"assistant",timestamp:g,content:pe(y.text),model:a});continue}if(_.role!=="user"&&_.role!=="assistant"&&_.content){for(let y of _.content)(y.type==="input_text"||y.type==="output_text")&&typeof y.text=="string"&&y.text&&hs(s,f,{role:"system",timestamp:g,content:pe(y.text.trim())});continue}}if(_.type==="function_call"){s.push({role:"tool_use",timestamp:g,content:_.name||"unknown tool",toolName:_.name,toolInput:_.arguments!==void 0?pe($i(_.arguments)):void 0,toolCallId:_.call_id});continue}if(_.type==="function_call_output"){s.push({role:"tool_result",timestamp:g,content:pe($i(_.output)),toolCallId:_.call_id});continue}if(_.type==="reasoning"&&_.summary){let y=_.summary.map(T=>$i(T.text)).join(`
1563
- `);y.trim()&&hs(s,f,{role:"thinking",timestamp:g,content:pe(y)});continue}}if(h.type==="event_msg"&&h.payload&&h.payload.type==="agent_reasoning"){let _=h.payload.message||h.payload.text;_&&hs(s,f,{role:"thinking",timestamp:g,content:pe(_)})}}if(!i)return null;let p=await w_(r);return{provider:"codex",sessionId:u,cwd:i,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:o,startCommand:m,firstUserMessage:d,lastUserMessage:c,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 ex(r),!0):!1}async resolveSessionFile(e){let r=await this.getSessionsDirs(),n=[];for(let i of r){let o=await this.findSessionFiles(i);n.push(...o)}for(let i of n)if(this.extractSessionIdFromFilename(i)===e)return i;let s=[];for(let i of n)this.extractSessionIdFromFilename(i).startsWith(e)&&s.push(i);if(s.length===1)return s[0];for(let i of n){let o=await Pe(i,1);if(o.length>0&&o[0].type==="session_meta"){let a=o[0].payload?.id;if(a===e||a&&a.startsWith(e))return i}}return null}}});function ud(t){return new cd(t)}var cd,md=E(()=>{"use strict";T_();Ht();$r();At();cd=class extends Le{constructor(e){super({provider:new Ci(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:`${Ee}
1563
+ `);y.trim()&&hs(s,f,{role:"thinking",timestamp:g,content:pe(y)});continue}}if(h.type==="event_msg"&&h.payload&&h.payload.type==="agent_reasoning"){let _=h.payload.message||h.payload.text;_&&hs(s,f,{role:"thinking",timestamp:g,content:pe(_)})}}if(!i)return null;let p=await w_(r);return{provider:"codex",sessionId:u,cwd:i,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:o,startCommand:m,firstUserMessage:d,lastUserMessage:c,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 ex(r),!0):!1}async resolveSessionFile(e){let r=await this.getSessionsDirs(),n=[];for(let i of r){let o=await this.findSessionFiles(i);n.push(...o)}for(let i of n)if(this.extractSessionIdFromFilename(i)===e)return i;let s=[];for(let i of n)this.extractSessionIdFromFilename(i).startsWith(e)&&s.push(i);if(s.length===1)return s[0];for(let i of n){let o=await Pe(i,1);if(o.length>0&&o[0].type==="session_meta"){let a=o[0].payload?.id;if(a===e||a&&a.startsWith(e))return i}}return null}}});function cd(t){return new dd(t)}var dd,ud=E(()=>{"use strict";T_();Ht();$r();At();dd=class extends Le{constructor(e){super({provider:new Ci(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:`${Ee}
1564
1564
  `,resumeTemplate:"codex resume {{session_id}}",startTemplate:"codex",transport:g_})}seedArgsFor(e){let r=super.seedArgsFor(e);return e?.model?[...r.slice(0,-1),"--model",e.model,r[r.length-1]]:r}}});function gs(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 Mi(t){let e=gs(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(`
1565
1565
  `).map(a=>a).filter(a=>a.trim().length>0);if(r.length===0)throw new Error("gemini session file is empty");let n=r[0],s;try{s=JSON.parse(n)}catch(a){throw new Error(`gemini JSONL session: metadata line failed to parse: ${a instanceof Error?a.message:String(a)}`)}if(s===null||typeof s!="object")throw new Error("gemini JSONL session: metadata line is not an object");let i=[],o=new Map;for(let a=1;a<r.length;a++){let l;try{l=JSON.parse(r[a])}catch{continue}if(l===null||typeof l!="object")continue;let d=l;if("$set"in d&&d.$set&&typeof d.$set=="object"){Object.assign(s,d.$set);continue}if(typeof d.id=="string"||typeof d.type=="string"){let c=d;if(typeof c.id=="string"){let u=o.get(c.id);u?sx(u,c):(i.push(c),o.set(c.id,c))}else i.push(c)}}return{sessionId:typeof s.sessionId=="string"?s.sessionId:void 0,projectHash:typeof s.projectHash=="string"?s.projectHash:void 0,startTime:typeof s.startTime=="string"?s.startTime:void 0,lastUpdated:typeof s.lastUpdated=="string"?s.lastUpdated:void 0,kind:typeof s.kind=="string"?s.kind:void 0,messages:i}}function sx(t,e){for(let[r,n]of Object.entries(e))if(n!==void 0){if(r==="tokens"&&v_(t.tokens)&&v_(n)){t.tokens={...t.tokens,...n};continue}t[r]=n}}function v_(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function S_(t,e){if(e==="json")return JSON.stringify(t,null,2);let{messages:r,...n}=t,s=[JSON.stringify(n)];for(let i of r)s.push(JSON.stringify(i));return s.join(`
1566
1566
  `)+`
1567
- `}var fd=E(()=>{"use strict"});import{createHash as ix}from"node:crypto";import{readdir as ys,readFile as b_,stat as Di,unlink as ox}from"node:fs/promises";import{join as Ze,basename as ax,dirname as lx}from"node:path";import{cwd as dx}from"node:process";function k_(t){return t?typeof t=="string"?t:Array.isArray(t)?t.map(e=>e.text||"").join(""):"":""}function I_(t){return t==="user"}function pd(t){return t==="gemini"||t==="assistant"}function Cr(t,e=new Date(0)){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function cx(t){return`${t.sessionId}\0${t.cwd}`}function ux(t,e){let r=t.filePaths??[t.filePath],n=e.filePaths??[e.filePath],s=[...new Set([...r,...n])],i=e.modifiedAt.getTime()>=t.modifiedAt.getTime()?e:t;return{...i,createdAt:t.createdAt.getTime()<=e.createdAt.getTime()?t.createdAt:e.createdAt,modifiedAt:i.modifiedAt,filePath:i.filePath,filePaths:s}}function ji(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}function N_(t){let e=0,r=0,n=0,s=0,i=0,o;for(let a of t){if(!pd(a.type)||!a.tokens)continue;let l=ji(a.tokens.input),d=ji(a.tokens.cached),c=Math.max(l-d,0),u=ji(a.tokens.output),m=ji(a.tokens.thoughts);e+=l,r+=d,n+=u,s+=m,i=l,o={inputTokens:c,cachedInputTokens:d,cacheWriteInputTokens:0,outputTokens:u,reasoningOutputTokens:m,totalTokens:l+u+m}}return{totalInputTokens:e,totalCachedInputTokens:r,totalOutputTokens:n,totalReasoningOutputTokens:s,lastInputTokens:i,lastTokenUsage:o}}function mx(t){return ix("sha256").update(t).digest("hex")}function Es(t,e){let r=e;for(;r&&!t.has(r);){t.add(r);let n=lx(r);if(n===r)break;r=n}}var Pi,A_=E(()=>{"use strict";cr();fd();me();Pi=class{name="gemini";workspaceHashMap;geminiProjectsFile;geminiTmpDir;claudeProjectsDir;codexSessionDirs;extraWorkspacePaths;constructor(e={}){let r=e.geminiDir||Ze(Ie,".gemini");this.geminiProjectsFile=Ze(r,"projects.json"),this.geminiTmpDir=Ze(r,"tmp");let n=e.claudeDir||Ze(Ie,".claude");this.claudeProjectsDir=Ze(n,"projects");let s=[Ze(Ie,".codex"),Ze(Ie,".code")],i=e.codexDirs&&e.codexDirs.length>0?e.codexDirs:[e.codexDir||s[0],e.codeDir||s[1]];this.codexSessionDirs=[...new Set(i)].map(o=>Ze(o,"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 i=cx(s),o=r.get(i);r.set(i,o?ux(o,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),i=[],o=n.messages||[],a=n.sessionId||this.extractSessionIdFromFilename(r),l=n.projectHash||"",d=await this.resolveWorkspace(l),c,u,m;for(let g of o){let _=Cr(g.timestamp),y=g.type,T=pe(k_(g.content));if(I_(y)){let k=T.trim();k&&(c||(c=H(k,80)),u=H(k,80)),i.push({role:"user",timestamp:_,content:k||T});continue}if(pd(y)){g.model&&(m=g.model);for(let k of g.thoughts||[]){let A=[k.subject,k.description].filter(Boolean).join(`
1568
- `).trim();A&&i.push({role:"thinking",timestamp:Cr(k.timestamp,_),content:pe(A)})}i.push({role:"assistant",timestamp:_,content:T,model:g.model});continue}let v=y?`[${y}] `:"";i.push({role:"system",timestamp:_,content:`${v}${T}`.trim()})}let f=Cr(n.startTime,s.createdAt),p=Cr(n.lastUpdated,s.modifiedAt),h=N_(o);return{provider:"gemini",sessionId:a,cwd:d,createdAt:f,modifiedAt:p,model:m,startCommand:"gemini",firstUserMessage:c,lastUserMessage:u,messageCount:i.filter(g=>g.role==="user"||g.role==="assistant").length,filePath:r,totalInputTokens:h.totalInputTokens||void 0,totalCachedInputTokens:h.totalCachedInputTokens||void 0,totalOutputTokens:h.totalOutputTokens||void 0,totalReasoningOutputTokens:h.totalReasoningOutputTokens||void 0,lastInputTokens:h.lastInputTokens||void 0,lastTokenUsage:h.lastTokenUsage,messages:i}}async extractSummary(e){let r=await this.readSessionFile(e);if(!r)return null;let n=await Re(e),s=r.messages||[],i=r.sessionId||this.extractSessionIdFromFilename(e),o=r.projectHash||"",a=await this.resolveWorkspace(o),l,d,c,u=0;for(let f of s)if(I_(f.type)){u++;let p=k_(f.content).trim();p&&(l||(l=H(pe(p),80)),d=H(pe(p),80))}else pd(f.type)&&(u++,f.model&&(c=f.model));let m=N_(s);return{provider:"gemini",sessionId:i,cwd:a,createdAt:Cr(r.startTime,n.createdAt),modifiedAt:Cr(r.lastUpdated,n.modifiedAt),model:c,startCommand:"gemini",firstUserMessage:l,lastUserMessage:d,messageCount:u,filePath:e,totalInputTokens:m.totalInputTokens||void 0,totalCachedInputTokens:m.totalCachedInputTokens||void 0,totalOutputTokens:m.totalOutputTokens||void 0,totalReasoningOutputTokens:m.totalReasoningOutputTokens||void 0,lastInputTokens:m.lastInputTokens||void 0,lastTokenUsage:m.lastTokenUsage}}async readSessionFile(e){let r=await b_(e,"utf-8");if(gs(r)==="unknown")return C({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 Mi(r)}catch{return null}}extractSessionIdFromFilename(e){let r=ax(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 ys(this.geminiTmpDir)}catch{return e}for(let n of r){let s=Ze(this.geminiTmpDir,n,"chats");if(!(await Di(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await ys(s)}catch{continue}for(let a of o)a.startsWith("session-")&&(!a.endsWith(".json")&&!a.endsWith(".jsonl")||e.push(Ze(s,a)))}return e}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await ox(r),!0):!1}async resolveSessionFile(e){let r=await this.findSessionFiles(),n=[];for(let s of r){let i=await this.readSessionFile(s).catch(()=>null),o=this.extractSessionIdFromFilename(s),a=i?.sessionId||o,l=a===e||a.startsWith(e),d=o===e||o.startsWith(e)||o.length>=8&&e.startsWith(o);if(!l&&!d)continue;let c=await Re(s).catch(()=>({createdAt:new Date(0),modifiedAt:new Date(0)}));n.push({filePath:s,modifiedAt:Cr(i?.lastUpdated,c.modifiedAt)})}return n.sort((s,i)=>{let o=i.modifiedAt.getTime()-s.modifiedAt.getTime();return o!==0?o:i.filePath.localeCompare(s.filePath)}),n[0]?.filePath??null}async resolveWorkspace(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;Es(e,dx());for(let n of this.extraWorkspacePaths)Es(e,n);for(let n of await this.collectGeminiProjectPaths())Es(e,n);for(let n of await this.collectCodexCwds())Es(e,n);for(let n of await this.collectClaudeCwds())Es(e,n);let r=new Map;for(let n of e)r.set(mx(n),n);return this.workspaceHashMap=r,r}async collectGeminiProjectPaths(){let e;try{e=await b_(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 o=(await Pe(s,1).catch(()=>[]))[0]?.payload?.cwd;o&&e.add(o)}}return[...e]}async collectClaudeCwds(){let e=new Set,r;try{r=await ys(this.claudeProjectsDir)}catch{return[]}for(let n of r){let s=Ze(this.claudeProjectsDir,n);if(!(await Di(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await ys(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=Ze(s,a),c=(await Pe(l,1).catch(()=>[]))[0]?.cwd;c&&e.add(c)}}return[...e]}async findJsonlFiles(e){let r=[];if(!(await Di(e).catch(()=>null))?.isDirectory())return r;let s;try{s=await ys(e)}catch{return r}for(let i of s){let o=Ze(e,i),a=await Di(o).catch(()=>null);if(a)if(a.isDirectory()){let l=await this.findJsonlFiles(o);r.push(...l)}else i.endsWith(".jsonl")&&r.push(o)}return r}}});import{readFileSync as fx,writeFileSync as px,mkdirSync as _x}from"node:fs";import{join as hx,dirname as gx}from"node:path";import{randomUUID as yx}from"node:crypto";function hd(t){return new _d(t)}var _d,gd=E(()=>{"use strict";A_();Ht();$r();At();fd();_d=class extends Le{constructor(e){super({provider:new Pi(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",Ee,"-y","--skip-trust"],resumeTemplate:"gemini --resume {{session_id}} --skip-trust",startTemplate:"gemini --skip-trust",transport:(r,n)=>fn(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(`
1567
+ `}var md=E(()=>{"use strict"});import{createHash as ix}from"node:crypto";import{readdir as ys,readFile as b_,stat as Di,unlink as ox}from"node:fs/promises";import{join as Ze,basename as ax,dirname as lx}from"node:path";import{cwd as dx}from"node:process";function k_(t){return t?typeof t=="string"?t:Array.isArray(t)?t.map(e=>e.text||"").join(""):"":""}function I_(t){return t==="user"}function fd(t){return t==="gemini"||t==="assistant"}function Cr(t,e=new Date(0)){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function cx(t){return`${t.sessionId}\0${t.cwd}`}function ux(t,e){let r=t.filePaths??[t.filePath],n=e.filePaths??[e.filePath],s=[...new Set([...r,...n])],i=e.modifiedAt.getTime()>=t.modifiedAt.getTime()?e:t;return{...i,createdAt:t.createdAt.getTime()<=e.createdAt.getTime()?t.createdAt:e.createdAt,modifiedAt:i.modifiedAt,filePath:i.filePath,filePaths:s}}function ji(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}function N_(t){let e=0,r=0,n=0,s=0,i=0,o;for(let a of t){if(!fd(a.type)||!a.tokens)continue;let l=ji(a.tokens.input),d=ji(a.tokens.cached),c=Math.max(l-d,0),u=ji(a.tokens.output),m=ji(a.tokens.thoughts);e+=l,r+=d,n+=u,s+=m,i=l,o={inputTokens:c,cachedInputTokens:d,cacheWriteInputTokens:0,outputTokens:u,reasoningOutputTokens:m,totalTokens:l+u+m}}return{totalInputTokens:e,totalCachedInputTokens:r,totalOutputTokens:n,totalReasoningOutputTokens:s,lastInputTokens:i,lastTokenUsage:o}}function mx(t){return ix("sha256").update(t).digest("hex")}function Es(t,e){let r=e;for(;r&&!t.has(r);){t.add(r);let n=lx(r);if(n===r)break;r=n}}var Pi,A_=E(()=>{"use strict";cr();md();me();Pi=class{name="gemini";workspaceHashMap;geminiProjectsFile;geminiTmpDir;claudeProjectsDir;codexSessionDirs;extraWorkspacePaths;constructor(e={}){let r=e.geminiDir||Ze(Ie,".gemini");this.geminiProjectsFile=Ze(r,"projects.json"),this.geminiTmpDir=Ze(r,"tmp");let n=e.claudeDir||Ze(Ie,".claude");this.claudeProjectsDir=Ze(n,"projects");let s=[Ze(Ie,".codex"),Ze(Ie,".code")],i=e.codexDirs&&e.codexDirs.length>0?e.codexDirs:[e.codexDir||s[0],e.codeDir||s[1]];this.codexSessionDirs=[...new Set(i)].map(o=>Ze(o,"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 i=cx(s),o=r.get(i);r.set(i,o?ux(o,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),i=[],o=n.messages||[],a=n.sessionId||this.extractSessionIdFromFilename(r),l=n.projectHash||"",d=await this.resolveWorkspace(l),c,u,m;for(let g of o){let _=Cr(g.timestamp),y=g.type,T=pe(k_(g.content));if(I_(y)){let k=T.trim();k&&(c||(c=H(k,80)),u=H(k,80)),i.push({role:"user",timestamp:_,content:k||T});continue}if(fd(y)){g.model&&(m=g.model);for(let k of g.thoughts||[]){let A=[k.subject,k.description].filter(Boolean).join(`
1568
+ `).trim();A&&i.push({role:"thinking",timestamp:Cr(k.timestamp,_),content:pe(A)})}i.push({role:"assistant",timestamp:_,content:T,model:g.model});continue}let v=y?`[${y}] `:"";i.push({role:"system",timestamp:_,content:`${v}${T}`.trim()})}let f=Cr(n.startTime,s.createdAt),p=Cr(n.lastUpdated,s.modifiedAt),h=N_(o);return{provider:"gemini",sessionId:a,cwd:d,createdAt:f,modifiedAt:p,model:m,startCommand:"gemini",firstUserMessage:c,lastUserMessage:u,messageCount:i.filter(g=>g.role==="user"||g.role==="assistant").length,filePath:r,totalInputTokens:h.totalInputTokens||void 0,totalCachedInputTokens:h.totalCachedInputTokens||void 0,totalOutputTokens:h.totalOutputTokens||void 0,totalReasoningOutputTokens:h.totalReasoningOutputTokens||void 0,lastInputTokens:h.lastInputTokens||void 0,lastTokenUsage:h.lastTokenUsage,messages:i}}async extractSummary(e){let r=await this.readSessionFile(e);if(!r)return null;let n=await Re(e),s=r.messages||[],i=r.sessionId||this.extractSessionIdFromFilename(e),o=r.projectHash||"",a=await this.resolveWorkspace(o),l,d,c,u=0;for(let f of s)if(I_(f.type)){u++;let p=k_(f.content).trim();p&&(l||(l=H(pe(p),80)),d=H(pe(p),80))}else fd(f.type)&&(u++,f.model&&(c=f.model));let m=N_(s);return{provider:"gemini",sessionId:i,cwd:a,createdAt:Cr(r.startTime,n.createdAt),modifiedAt:Cr(r.lastUpdated,n.modifiedAt),model:c,startCommand:"gemini",firstUserMessage:l,lastUserMessage:d,messageCount:u,filePath:e,totalInputTokens:m.totalInputTokens||void 0,totalCachedInputTokens:m.totalCachedInputTokens||void 0,totalOutputTokens:m.totalOutputTokens||void 0,totalReasoningOutputTokens:m.totalReasoningOutputTokens||void 0,lastInputTokens:m.lastInputTokens||void 0,lastTokenUsage:m.lastTokenUsage}}async readSessionFile(e){let r=await b_(e,"utf-8");if(gs(r)==="unknown")return C({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 Mi(r)}catch{return null}}extractSessionIdFromFilename(e){let r=ax(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 ys(this.geminiTmpDir)}catch{return e}for(let n of r){let s=Ze(this.geminiTmpDir,n,"chats");if(!(await Di(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await ys(s)}catch{continue}for(let a of o)a.startsWith("session-")&&(!a.endsWith(".json")&&!a.endsWith(".jsonl")||e.push(Ze(s,a)))}return e}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await ox(r),!0):!1}async resolveSessionFile(e){let r=await this.findSessionFiles(),n=[];for(let s of r){let i=await this.readSessionFile(s).catch(()=>null),o=this.extractSessionIdFromFilename(s),a=i?.sessionId||o,l=a===e||a.startsWith(e),d=o===e||o.startsWith(e)||o.length>=8&&e.startsWith(o);if(!l&&!d)continue;let c=await Re(s).catch(()=>({createdAt:new Date(0),modifiedAt:new Date(0)}));n.push({filePath:s,modifiedAt:Cr(i?.lastUpdated,c.modifiedAt)})}return n.sort((s,i)=>{let o=i.modifiedAt.getTime()-s.modifiedAt.getTime();return o!==0?o:i.filePath.localeCompare(s.filePath)}),n[0]?.filePath??null}async resolveWorkspace(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;Es(e,dx());for(let n of this.extraWorkspacePaths)Es(e,n);for(let n of await this.collectGeminiProjectPaths())Es(e,n);for(let n of await this.collectCodexCwds())Es(e,n);for(let n of await this.collectClaudeCwds())Es(e,n);let r=new Map;for(let n of e)r.set(mx(n),n);return this.workspaceHashMap=r,r}async collectGeminiProjectPaths(){let e;try{e=await b_(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 o=(await Pe(s,1).catch(()=>[]))[0]?.payload?.cwd;o&&e.add(o)}}return[...e]}async collectClaudeCwds(){let e=new Set,r;try{r=await ys(this.claudeProjectsDir)}catch{return[]}for(let n of r){let s=Ze(this.claudeProjectsDir,n);if(!(await Di(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await ys(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=Ze(s,a),c=(await Pe(l,1).catch(()=>[]))[0]?.cwd;c&&e.add(c)}}return[...e]}async findJsonlFiles(e){let r=[];if(!(await Di(e).catch(()=>null))?.isDirectory())return r;let s;try{s=await ys(e)}catch{return r}for(let i of s){let o=Ze(e,i),a=await Di(o).catch(()=>null);if(a)if(a.isDirectory()){let l=await this.findJsonlFiles(o);r.push(...l)}else i.endsWith(".jsonl")&&r.push(o)}return r}}});import{readFileSync as fx,writeFileSync as px,mkdirSync as _x}from"node:fs";import{join as hx,dirname as gx}from"node:path";import{randomUUID as yx}from"node:crypto";function _d(t){return new pd(t)}var pd,hd=E(()=>{"use strict";A_();Ht();$r();At();md();pd=class extends Le{constructor(e){super({provider:new Pi(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",Ee,"-y","--skip-trust"],resumeTemplate:"gemini --resume {{session_id}} --skip-trust",startTemplate:"gemini --skip-trust",transport:(r,n)=>fn(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(`
1569
1569
  `)}seedArgsFor(e){let r=super.seedArgsFor(e);return e?.model?[...r,"--model",e.model]:r}manualSeedHint(e){return{launchCommand:`cd ${e} && gemini --skip-trust`,postLaunchNote:bi,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=fx(n,"utf-8"),i=gs(s),o=Mi(s),a=yx();o.sessionId=a,o.kind="main";let l=gx(n),d=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),c=i==="jsonl"?".jsonl":".json",u=`session-${d}-${a.slice(0,8)}${c}`,m=hx(l,u);return _x(l,{recursive:!0}),px(m,S_(o,i),"utf-8"),{success:!0,sessionId:a,filePath:m}}catch(s){return{success:!1,error:s instanceof Error?s.message:String(s)}}}}});import{readdir as x_,readFile as Ex,rm as wx,stat as pn}from"node:fs/promises";import{basename as Tx,join as ft}from"node:path";function vx(t){let e={};for(let r of t.split(`
1570
- `)){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 Mr(t){if(!t)return;let e=new Date(t);return Number.isNaN(e.getTime())?void 0:e}async function Sx(t){let e=0;for await(let r of Ge(t))(r.type==="user.message"||r.type==="assistant.message"&&(r.data?.content||"").trim())&&e++;return e}var Fi,R_=E(()=>{"use strict";cr();Fi=class{name="copilot";sessionStateDir;constructor(e={}){let r=e.copilotDir||ft(Ie,".copilot");this.sessionStateDir=ft(r,"session-state")}getWatchPaths(){return[{directory:this.sessionStateDir,filePattern:/events\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await x_(this.sessionStateDir)}catch{return e}for(let n of r){let s=ft(this.sessionStateDir,n);if((await pn(s).catch(()=>null))?.isDirectory())try{let o=await this.extractSummary(s,n);o&&e.push(o)}catch{}}return e}async loadSession(e){let r=await this.resolveSessionDir(e);if(!r)return null;let n=await this.readWorkspaceYaml(r),s=ft(r,"events.jsonl"),i=await pn(s).catch(()=>null),o=i?s:ft(r,"workspace.yaml"),a=await Re(i?s:r),l=[],d=n?.cwd||"(unknown workspace)",c,u,m,f,p,h,g=n?.id||Tx(r)||e;if(i)for await(let _ of Ge(s)){let y=Mr(_.timestamp)||a.modifiedAt;if(_.type==="session.start"&&_.data){_.data.sessionId&&(g=_.data.sessionId),_.data.copilotVersion&&(u=_.data.copilotVersion),_.data.startTime&&(h=Mr(_.data.startTime)),_.data.selectedModel&&(c=_.data.selectedModel),_.data.context&&(_.data.context.cwd&&(d=_.data.context.cwd),_.data.context.branch&&(m=_.data.context.branch));continue}if(_.type==="session.model_change"&&_.data?.newModel){c=_.data.newModel;continue}if(_.type==="user.message"&&_.data){let T=_.data.content||"",v=T.trim();v&&(f||(f=H(v,80)),p=H(v,80)),l.push({role:"user",timestamp:y,content:pe(v||T)});continue}if(_.type==="assistant.message"&&_.data){let T=(_.data.content||"").trim();if(T&&l.push({role:"assistant",timestamp:y,content:pe(T),model:c}),_.data.toolRequests)for(let v of _.data.toolRequests)l.push({role:"tool_use",timestamp:y,content:v.name||"unknown tool",toolName:v.name,toolInput:v.arguments?JSON.stringify(v.arguments,null,2):void 0,toolCallId:v.toolCallId});continue}if(_.type==="tool.execution_complete"&&_.data){let T=_.data.result?.content||"",v=_.data.result?.detailedContent||"";l.push({role:"tool_result",timestamp:y,content:pe(T),toolDetailedContent:v?pe(v):void 0,toolCallId:_.data.toolCallId});continue}if(_.type==="assistant.reasoning"&&_.data?.content){l.push({role:"thinking",timestamp:y,content:pe(_.data.content)});continue}if(_.type==="session.error"||_.type==="session.warning"||_.type==="session.info"||_.type==="system.message"){let T=_.data?.message||"";T.trim()&&l.push({role:"system",timestamp:y,content:pe(T)});continue}}if(!f){let _=(n?.summary||"").trim();_&&(f=H(_,80))}return{provider:"copilot",sessionId:g,cwd:d,createdAt:h??Mr(n?.created_at)??a.createdAt,modifiedAt:Mr(n?.updated_at)??a.modifiedAt,model:c,cliVersion:u,startCommand:"copilot",gitBranch:m,firstUserMessage:f,lastUserMessage:p,messageCount:l.filter(_=>_.role==="user"||_.role==="assistant").length,filePath:o,messages:l}}async extractSummary(e,r){let n=await this.readWorkspaceYaml(e),s=ft(e,"events.jsonl"),i=await pn(s).catch(()=>null),o=i?s:ft(e,"workspace.yaml"),a=await Re(i?s:e),l=i?await Pe(s,20):[],d=n?.id||r,c=n?.cwd||"(unknown workspace)",u,m,f,p,h;for(let _ of l)if(_.type==="session.start"&&_.data&&(_.data.sessionId&&(d=_.data.sessionId),_.data.copilotVersion&&(m=_.data.copilotVersion),_.data.startTime&&(f=Mr(_.data.startTime)),_.data.selectedModel&&(u=_.data.selectedModel),_.data.context?.cwd&&(c=_.data.context.cwd)),_.type==="session.model_change"&&_.data?.newModel&&(u||(u=_.data.newModel)),_.type==="user.message"&&_.data){let y=(_.data.content||"").trim();y&&(p||(p=H(y,80)),h=H(y,80))}if(!p){let _=(n?.summary||"").trim();_&&(p=H(_,80))}let g=i?await Sx(s):0;return{provider:"copilot",sessionId:d,cwd:c,createdAt:f??Mr(n?.created_at)??a.createdAt,modifiedAt:Mr(n?.updated_at)??a.modifiedAt,model:u,cliVersion:m,startCommand:"copilot",firstUserMessage:p,lastUserMessage:h,messageCount:g,filePath:o}}async readWorkspaceYaml(e){let r=ft(e,"workspace.yaml");try{let n=await Ex(r,"utf-8");return vx(n)}catch{return null}}async resolveSessionPath(e){return this.resolveSessionDir(e)}async deleteSession(e){let r=await this.resolveSessionDir(e);return r?(await wx(r,{recursive:!0}),!0):!1}async resolveSessionDir(e){let r;try{r=await x_(this.sessionStateDir)}catch{return null}if(r.includes(e)){let s=ft(this.sessionStateDir,e);if((await pn(s).catch(()=>null))?.isDirectory())return s}let n=[];for(let s of r)if(s.startsWith(e)){let i=ft(this.sessionStateDir,s);(await pn(i).catch(()=>null))?.isDirectory()&&n.push(i)}if(n.length===1)return n[0];for(let s of r){let i=ft(this.sessionStateDir,s);if(!(await pn(i).catch(()=>null))?.isDirectory())continue;let a=await this.readWorkspaceYaml(i);if(a&&(a.id===e||a.id?.startsWith(e)))return i}return null}}});function Ed(t){return new yd(t)}var yd,wd=E(()=>{"use strict";R_();Ht();$r();me();At();yd=class extends Le{constructor(e){super({provider:new Fi(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"copilot",seedArgs:["-p",Ee,"--yolo"],resumeTemplate:"copilot --resume={{session_id}}",startTemplate:"copilot",transport:(r,n)=>fn(r,{...n,acpTool:"copilot"})})}async seed(e,r){let n=await super.seed(e,r);if(r?.model===void 0||r.model.trim().length===0)return n;let s="copilot seed does not implement per-session model selection";return Oe({event:"model_ignored",provider:"copilot",model:r.model,reason:s}),{...n,warnings:[...n.warnings??[],`copilot seed ignored model=${r.model}: ${s}`]}}}});import{existsSync as L_,readdirSync as bx,statSync as O_}from"node:fs";import{join as pr}from"node:path";import{createRequire as kx}from"node:module";function $_(){return Td===null&&(Td=kx(import.meta.url)("node:sqlite").DatabaseSync),Td}function Ix(){let t=process.env.XDG_DATA_HOME||pr(Ie,".local","share"),e=process.env.XDG_CONFIG_HOME||pr(Ie,".config");return[pr(t,"opencode","opencode.db"),pr(e,"opencode","opencode.db")]}function Nx(){if(process.env.OPENCODE_DB)return[process.env.OPENCODE_DB];let t=process.env.XDG_DATA_HOME||pr(Ie,".local","share"),e=pr(t,"lmplayer"),r=pr(e,"opencode-local.db"),n=[r];try{let s=bx(e).filter(i=>/^opencode.*\.db$/u.test(i)).map(i=>pr(e,i)).filter(i=>i!==r).sort((i,o)=>{try{return O_(o).mtimeMs-O_(i).mtimeMs}catch{return 0}});n.push(...s)}catch{}return n}function Ax(t){return t==="lmplayer"?Nx():Ix()}var Td,_n,vd=E(()=>{"use strict";cr();Td=null;_n=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=Ax(this.name)}existingDbPaths(){return this.dbPaths.filter(e=>L_(e))}openDb(e){return L_(e)?new($_())(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,i=n.prepare("SELECT id, worktree, name FROM project").all();for(let a of i)s.set(a.id,a);let o=n.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
1570
+ `)){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 Mr(t){if(!t)return;let e=new Date(t);return Number.isNaN(e.getTime())?void 0:e}async function Sx(t){let e=0;for await(let r of Ge(t))(r.type==="user.message"||r.type==="assistant.message"&&(r.data?.content||"").trim())&&e++;return e}var Fi,R_=E(()=>{"use strict";cr();Fi=class{name="copilot";sessionStateDir;constructor(e={}){let r=e.copilotDir||ft(Ie,".copilot");this.sessionStateDir=ft(r,"session-state")}getWatchPaths(){return[{directory:this.sessionStateDir,filePattern:/events\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await x_(this.sessionStateDir)}catch{return e}for(let n of r){let s=ft(this.sessionStateDir,n);if((await pn(s).catch(()=>null))?.isDirectory())try{let o=await this.extractSummary(s,n);o&&e.push(o)}catch{}}return e}async loadSession(e){let r=await this.resolveSessionDir(e);if(!r)return null;let n=await this.readWorkspaceYaml(r),s=ft(r,"events.jsonl"),i=await pn(s).catch(()=>null),o=i?s:ft(r,"workspace.yaml"),a=await Re(i?s:r),l=[],d=n?.cwd||"(unknown workspace)",c,u,m,f,p,h,g=n?.id||Tx(r)||e;if(i)for await(let _ of Ge(s)){let y=Mr(_.timestamp)||a.modifiedAt;if(_.type==="session.start"&&_.data){_.data.sessionId&&(g=_.data.sessionId),_.data.copilotVersion&&(u=_.data.copilotVersion),_.data.startTime&&(h=Mr(_.data.startTime)),_.data.selectedModel&&(c=_.data.selectedModel),_.data.context&&(_.data.context.cwd&&(d=_.data.context.cwd),_.data.context.branch&&(m=_.data.context.branch));continue}if(_.type==="session.model_change"&&_.data?.newModel){c=_.data.newModel;continue}if(_.type==="user.message"&&_.data){let T=_.data.content||"",v=T.trim();v&&(f||(f=H(v,80)),p=H(v,80)),l.push({role:"user",timestamp:y,content:pe(v||T)});continue}if(_.type==="assistant.message"&&_.data){let T=(_.data.content||"").trim();if(T&&l.push({role:"assistant",timestamp:y,content:pe(T),model:c}),_.data.toolRequests)for(let v of _.data.toolRequests)l.push({role:"tool_use",timestamp:y,content:v.name||"unknown tool",toolName:v.name,toolInput:v.arguments?JSON.stringify(v.arguments,null,2):void 0,toolCallId:v.toolCallId});continue}if(_.type==="tool.execution_complete"&&_.data){let T=_.data.result?.content||"",v=_.data.result?.detailedContent||"";l.push({role:"tool_result",timestamp:y,content:pe(T),toolDetailedContent:v?pe(v):void 0,toolCallId:_.data.toolCallId});continue}if(_.type==="assistant.reasoning"&&_.data?.content){l.push({role:"thinking",timestamp:y,content:pe(_.data.content)});continue}if(_.type==="session.error"||_.type==="session.warning"||_.type==="session.info"||_.type==="system.message"){let T=_.data?.message||"";T.trim()&&l.push({role:"system",timestamp:y,content:pe(T)});continue}}if(!f){let _=(n?.summary||"").trim();_&&(f=H(_,80))}return{provider:"copilot",sessionId:g,cwd:d,createdAt:h??Mr(n?.created_at)??a.createdAt,modifiedAt:Mr(n?.updated_at)??a.modifiedAt,model:c,cliVersion:u,startCommand:"copilot",gitBranch:m,firstUserMessage:f,lastUserMessage:p,messageCount:l.filter(_=>_.role==="user"||_.role==="assistant").length,filePath:o,messages:l}}async extractSummary(e,r){let n=await this.readWorkspaceYaml(e),s=ft(e,"events.jsonl"),i=await pn(s).catch(()=>null),o=i?s:ft(e,"workspace.yaml"),a=await Re(i?s:e),l=i?await Pe(s,20):[],d=n?.id||r,c=n?.cwd||"(unknown workspace)",u,m,f,p,h;for(let _ of l)if(_.type==="session.start"&&_.data&&(_.data.sessionId&&(d=_.data.sessionId),_.data.copilotVersion&&(m=_.data.copilotVersion),_.data.startTime&&(f=Mr(_.data.startTime)),_.data.selectedModel&&(u=_.data.selectedModel),_.data.context?.cwd&&(c=_.data.context.cwd)),_.type==="session.model_change"&&_.data?.newModel&&(u||(u=_.data.newModel)),_.type==="user.message"&&_.data){let y=(_.data.content||"").trim();y&&(p||(p=H(y,80)),h=H(y,80))}if(!p){let _=(n?.summary||"").trim();_&&(p=H(_,80))}let g=i?await Sx(s):0;return{provider:"copilot",sessionId:d,cwd:c,createdAt:f??Mr(n?.created_at)??a.createdAt,modifiedAt:Mr(n?.updated_at)??a.modifiedAt,model:u,cliVersion:m,startCommand:"copilot",firstUserMessage:p,lastUserMessage:h,messageCount:g,filePath:o}}async readWorkspaceYaml(e){let r=ft(e,"workspace.yaml");try{let n=await Ex(r,"utf-8");return vx(n)}catch{return null}}async resolveSessionPath(e){return this.resolveSessionDir(e)}async deleteSession(e){let r=await this.resolveSessionDir(e);return r?(await wx(r,{recursive:!0}),!0):!1}async resolveSessionDir(e){let r;try{r=await x_(this.sessionStateDir)}catch{return null}if(r.includes(e)){let s=ft(this.sessionStateDir,e);if((await pn(s).catch(()=>null))?.isDirectory())return s}let n=[];for(let s of r)if(s.startsWith(e)){let i=ft(this.sessionStateDir,s);(await pn(i).catch(()=>null))?.isDirectory()&&n.push(i)}if(n.length===1)return n[0];for(let s of r){let i=ft(this.sessionStateDir,s);if(!(await pn(i).catch(()=>null))?.isDirectory())continue;let a=await this.readWorkspaceYaml(i);if(a&&(a.id===e||a.id?.startsWith(e)))return i}return null}}});function yd(t){return new gd(t)}var gd,Ed=E(()=>{"use strict";R_();Ht();$r();me();At();gd=class extends Le{constructor(e){super({provider:new Fi(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"copilot",seedArgs:["-p",Ee,"--yolo"],resumeTemplate:"copilot --resume={{session_id}}",startTemplate:"copilot",transport:(r,n)=>fn(r,{...n,acpTool:"copilot"})})}async seed(e,r){let n=await super.seed(e,r);if(r?.model===void 0||r.model.trim().length===0)return n;let s="copilot seed does not implement per-session model selection";return Oe({event:"model_ignored",provider:"copilot",model:r.model,reason:s}),{...n,warnings:[...n.warnings??[],`copilot seed ignored model=${r.model}: ${s}`]}}}});import{existsSync as L_,readdirSync as bx,statSync as O_}from"node:fs";import{join as pr}from"node:path";import{createRequire as kx}from"node:module";function $_(){return wd===null&&(wd=kx(import.meta.url)("node:sqlite").DatabaseSync),wd}function Ix(){let t=process.env.XDG_DATA_HOME||pr(Ie,".local","share"),e=process.env.XDG_CONFIG_HOME||pr(Ie,".config");return[pr(t,"opencode","opencode.db"),pr(e,"opencode","opencode.db")]}function Nx(){if(process.env.OPENCODE_DB)return[process.env.OPENCODE_DB];let t=process.env.XDG_DATA_HOME||pr(Ie,".local","share"),e=pr(t,"lmplayer"),r=pr(e,"opencode-local.db"),n=[r];try{let s=bx(e).filter(i=>/^opencode.*\.db$/u.test(i)).map(i=>pr(e,i)).filter(i=>i!==r).sort((i,o)=>{try{return O_(o).mtimeMs-O_(i).mtimeMs}catch{return 0}});n.push(...s)}catch{}return n}function Ax(t){return t==="lmplayer"?Nx():Ix()}var wd,_n,Td=E(()=>{"use strict";cr();wd=null;_n=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=Ax(this.name)}existingDbPaths(){return this.dbPaths.filter(e=>L_(e))}openDb(e){return L_(e)?new($_())(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,i=n.prepare("SELECT id, worktree, name FROM project").all();for(let a of i)s.set(a.id,a);let o=n.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
1571
1571
  s.time_created, s.time_updated
1572
1572
  FROM session s
1573
1573
  ORDER BY s.time_updated DESC`).all();for(let a of o){let l=s.get(a.project_id),d=a.directory||l?.worktree||"(unknown)",c=n.prepare(`SELECT m.id, m.data, m.time_created FROM message m
@@ -1580,12 +1580,12 @@ ${r}`:r}function p_(t,e){let r=HA({input:t.stdout}),n=new Map,s=(o,a={})=>new Pr
1580
1580
  FROM session s
1581
1581
  WHERE s.id LIKE ?
1582
1582
  ORDER BY s.time_updated DESC
1583
- LIMIT 2`).all(`${r}%`);return s.length!==1?null:s[0]}}});function bd(){return new Sd}var Sd,kd=E(()=>{"use strict";vd();Ht();$r();At();Sd=class extends Le{constructor(){super({provider:new _n,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",Ee],resumeTemplate:"opencode --session {{session_id}}",startTemplate:"opencode",transport:(e,r)=>fn(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??Ee),r}}});import{spawn as xx}from"node:child_process";import{mkdirSync as Rx}from"node:fs";function Nd(t){return new Id(t)}async function Lx(t,e){let r=Date.now(),n=C_({prompt:t,sessionId:e.sessionId,model:e.model,effort:e.effort,formatJson:!0,permissionMode:e.permissionMode??"yolo"});mt("lmplayer",n,e.permissionMode??"yolo");let s=await M_(e.binary,n,{cwd:e.cwd,env:Fe(e.env,e.cwd,e.sessionId),signal:e.signal,onText:i=>{e.onProgress?.({kind:"text",summary:i.slice(0,120)}),e.onDelta?.(i)}});if(s.code!==0&&s.code!==null)throw new Error(s.stderr.trim().slice(0,200)||`lmplayer exited with code ${s.code}`);return{text:s.text.trim(),sessionId:s.sessionId??e.sessionId,durationMs:Date.now()-r}}function C_(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(...mr("lmplayer",t.permissionMode)??[]),e.push(t.prompt),e}function M_(t,e,r){return new Promise((n,s)=>{let i;try{i=xx(t,e,{cwd:r.cwd,env:r.env,stdio:["ignore","pipe","pipe"]})}catch(g){s(g);return}let o="",a="",l="",d,c,u=[],m=!1,f=r.timeoutMs===void 0?void 0:setTimeout(()=>{m||(m=!0,i.kill(),p(),s(new Error(`lmplayer seed timed out after ${r.timeoutMs}ms`)))},r.timeoutMs),p=()=>{f!==void 0&&clearTimeout(f)},h=g=>{let _=g.trim();if(!_)return;let y;try{y=JSON.parse(_)}catch{u.push(g),r.onText?.(g);return}if(!Wi(y))return;let T=Ui(y,!1);d===void 0&&T!==void 0&&(d=T),c=Ui(y,!0)??c;let v=D_(y);v&&(u.push(v),r.onText?.(v))};i.stdout?.on("data",g=>{let _=g.toString("utf8");o+=_,l+=_;let y=l.indexOf(`
1583
+ LIMIT 2`).all(`${r}%`);return s.length!==1?null:s[0]}}});function Sd(){return new vd}var vd,bd=E(()=>{"use strict";Td();Ht();$r();At();vd=class extends Le{constructor(){super({provider:new _n,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",Ee],resumeTemplate:"opencode --session {{session_id}}",startTemplate:"opencode",transport:(e,r)=>fn(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??Ee),r}}});import{spawn as xx}from"node:child_process";import{mkdirSync as Rx}from"node:fs";function Id(t){return new kd(t)}async function Lx(t,e){let r=Date.now(),n=C_({prompt:t,sessionId:e.sessionId,model:e.model,effort:e.effort,formatJson:!0,permissionMode:e.permissionMode??"yolo"});mt("lmplayer",n,e.permissionMode??"yolo");let s=await M_(e.binary,n,{cwd:e.cwd,env:Fe(e.env,e.cwd,e.sessionId),signal:e.signal,onText:i=>{e.onProgress?.({kind:"text",summary:i.slice(0,120)}),e.onDelta?.(i)}});if(s.code!==0&&s.code!==null)throw new Error(s.stderr.trim().slice(0,200)||`lmplayer exited with code ${s.code}`);return{text:s.text.trim(),sessionId:s.sessionId??e.sessionId,durationMs:Date.now()-r}}function C_(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(...mr("lmplayer",t.permissionMode)??[]),e.push(t.prompt),e}function M_(t,e,r){return new Promise((n,s)=>{let i;try{i=xx(t,e,{cwd:r.cwd,env:r.env,stdio:["ignore","pipe","pipe"]})}catch(g){s(g);return}let o="",a="",l="",d,c,u=[],m=!1,f=r.timeoutMs===void 0?void 0:setTimeout(()=>{m||(m=!0,i.kill(),p(),s(new Error(`lmplayer seed timed out after ${r.timeoutMs}ms`)))},r.timeoutMs),p=()=>{f!==void 0&&clearTimeout(f)},h=g=>{let _=g.trim();if(!_)return;let y;try{y=JSON.parse(_)}catch{u.push(g),r.onText?.(g);return}if(!Wi(y))return;let T=Ui(y,!1);d===void 0&&T!==void 0&&(d=T),c=Ui(y,!0)??c;let v=D_(y);v&&(u.push(v),r.onText?.(v))};i.stdout?.on("data",g=>{let _=g.toString("utf8");o+=_,l+=_;let y=l.indexOf(`
1584
1584
  `);for(;y>=0;){let T=l.slice(0,y);l=l.slice(y+1),h(T),y=l.indexOf(`
1585
- `)}}),i.stderr?.on("data",g=>{a+=g.toString("utf8")}),r.signal&&(r.signal.aborted?i.kill():r.signal.addEventListener("abort",()=>i.kill(),{once:!0})),i.on("exit",g=>{m||(m=!0,p(),l.length>0&&h(l),n({code:g,stdout:o,stderr:a,sessionId:d??c,text:u.join("")}))}),i.on("error",g=>{m||(m=!0,p(),s(g))})})}function D_(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(Wi(r)){let n=D_(r);if(n)return n}}}function Ui(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(Wi(r)){let n=Ui(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(Wi(s)){let i=Ui(s,e);if(i!==void 0)return i}}}function Wi(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Id,Ad=E(()=>{"use strict";vd();Ht();At();un();ut();Id=class extends Le{constructor(e){super({provider:new _n({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",Ee],resumeTemplate:"lmplayer run --session {{session_id}} --dangerously-skip-permissions",startTemplate:"lmplayer run --dangerously-skip-permissions",transport:Lx})}seedArgsFor(e){return C_({prompt:e?.prompt??Ee,model:e?.model,effort:e?.effort,formatJson:!0,permissionMode:"yolo"})}async seed(e,r){Rx(e,{recursive:!0});let n=this.seedArgsFor(r);mt("lmplayer",n);try{let s=await M_(this.binary,n,{cwd:e,env:ur(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 "${Ee}"`,postLaunchNote:"Copy the sessionID reported by lmplayer into this member's sessionid= field.",lsCommand:`lmctl ls --provider lmplayer --sessiondir ${e}`}}}});import{readdir as qi,readFile as Ox,rm as $x}from"node:fs/promises";import{basename as j_,join as _r}from"node:path";function P_(t){return t.type==="user"||t.message?.role==="user"}function F_(t){return t.type==="assistant"||t.message?.role==="assistant"||t.message?.role==="model"}function U_(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(`
1585
+ `)}}),i.stderr?.on("data",g=>{a+=g.toString("utf8")}),r.signal&&(r.signal.aborted?i.kill():r.signal.addEventListener("abort",()=>i.kill(),{once:!0})),i.on("exit",g=>{m||(m=!0,p(),l.length>0&&h(l),n({code:g,stdout:o,stderr:a,sessionId:d??c,text:u.join("")}))}),i.on("error",g=>{m||(m=!0,p(),s(g))})})}function D_(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(Wi(r)){let n=D_(r);if(n)return n}}}function Ui(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(Wi(r)){let n=Ui(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(Wi(s)){let i=Ui(s,e);if(i!==void 0)return i}}}function Wi(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var kd,Nd=E(()=>{"use strict";Td();Ht();At();un();ut();kd=class extends Le{constructor(e){super({provider:new _n({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",Ee],resumeTemplate:"lmplayer run --session {{session_id}} --dangerously-skip-permissions",startTemplate:"lmplayer run --dangerously-skip-permissions",transport:Lx})}seedArgsFor(e){return C_({prompt:e?.prompt??Ee,model:e?.model,effort:e?.effort,formatJson:!0,permissionMode:"yolo"})}async seed(e,r){Rx(e,{recursive:!0});let n=this.seedArgsFor(r);mt("lmplayer",n);try{let s=await M_(this.binary,n,{cwd:e,env:ur(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 "${Ee}"`,postLaunchNote:"Copy the sessionID reported by lmplayer into this member's sessionid= field.",lsCommand:`lmctl ls --provider lmplayer --sessiondir ${e}`}}}});import{readdir as qi,readFile as Ox,rm as $x}from"node:fs/promises";import{basename as j_,join as _r}from"node:path";function P_(t){return t.type==="user"||t.message?.role==="user"}function F_(t){return t.type==="assistant"||t.message?.role==="assistant"||t.message?.role==="model"}function U_(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(`
1586
1586
  `):Array.isArray(e.parts)?e.parts.filter(r=>!r.thought&&r.type!=="thinking").map(r=>r.text||"").join(`
1587
- `):"":""}function W_(t){return t.model||t.message?.model}var Bi,q_=E(()=>{"use strict";cr();Bi=class{name="qwen";baseDir;constructor(e){this.baseDir=e?.qwenDir||_r(Ie,".qwen")}async discoverSessions(){let e=_r(this.baseDir,"projects"),r;try{r=await qi(e)}catch{return[]}let n=[];for(let s of r){let i=_r(e,s,"chats"),o;try{o=await qi(i)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),d=_r(i,a);try{let c=await this.extractSummary(d,l);c&&n.push(c)}catch{}}}return n}async extractSummary(e,r){let n=await Pe(e,30);if(n.length===0)return null;let s=await Re(e),i="(unknown)",o,a,l,d,c=0;for(let u of n){if(u.cwd&&(i=u.cwd,u.version&&(a=u.version)),u.type==="system"&&u.cwd&&(i=u.cwd,u.version&&(a=u.version),u.model&&(o=u.model)),P_(u)){let m=U_(u).trim();m&&(l||(l=H(m,80)),d=H(m,80)),c++}if(F_(u)){let m=W_(u);m&&(o=m),c++}}return{provider:"qwen",sessionId:r,cwd:i,createdAt:s.createdAt,modifiedAt:s.modifiedAt,model:o,cliVersion:a,startCommand:"qwen",firstUserMessage:l,lastUserMessage:d,messageCount:c,filePath:e}}async loadSession(e){let r=await this.resolveSessionPath(e);if(!r)return null;let n=j_(r,".jsonl");return this.loadFromFile(r,n)}async loadFromFile(e,r){let n=await Re(e),s="(unknown)",i,o,a,l,d,c,u=[];for await(let m of Ge(e)){if(m.cwd&&(s=m.cwd,m.version&&(o=m.version),m.gitBranch&&(a=m.gitBranch)),m.type==="system"&&m.cwd&&(s=m.cwd,m.version&&(o=m.version),m.model&&(i=m.model),m.gitBranch&&(a=m.gitBranch)),!m.message)continue;let f=m.message,p=m.timestamp?new Date(m.timestamp):n.modifiedAt;if(P_(m)){let h=U_(m);h.trim()&&(d||(d=H(h.trim(),80)),c=H(h.trim(),80)),u.push({role:"user",timestamp:p,content:h})}else if(F_(m)){let h=W_(m);if(h&&(i=h),Array.isArray(f.content))for(let g of f.content)g.type==="text"&&g.text?u.push({role:"assistant",timestamp:p,content:g.text,model:h}):g.type==="thinking"&&g.thinking&&u.push({role:"thinking",timestamp:p,content:g.thinking});else if(typeof f.content=="string")u.push({role:"assistant",timestamp:p,content:f.content,model:h});else if(Array.isArray(f.parts))for(let g of f.parts)if(g.thought||g.type==="thinking"){let _=g.thinking||g.text;_&&u.push({role:"thinking",timestamp:p,content:_})}else g.text&&u.push({role:"assistant",timestamp:p,content:g.text,model:h})}}return{provider:"qwen",sessionId:r,slug:l,cwd:s,createdAt:n.createdAt,modifiedAt:n.modifiedAt,model:i,cliVersion:o,gitBranch:a,startCommand:"qwen",firstUserMessage:d,lastUserMessage:c,messageCount:u.length,filePath:e,messages:u}}async resolveSessionPath(e){let r=_r(this.baseDir,"projects");try{let n=await qi(r),s=[];for(let i of n){let o=_r(r,i,"chats",`${e}.jsonl`);try{return await Ox(o,{flag:"r"}),o}catch{continue}}for(let i of n){let o=_r(r,i,"chats"),a;try{a=await qi(o)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;j_(l,".jsonl").startsWith(e)&&s.push(_r(o,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 $x(r),!0}catch{return!1}}}});function Rd(){return new xd}var xd,Ld=E(()=>{"use strict";q_();Ht();$r();At();xd=class extends Le{constructor(){super({provider:new Bi,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"qwen",seedArgs:["-p",Ee,"--approval-mode","yolo"],resumeTemplate:"qwen --resume {{session_id}}",startTemplate:"qwen",transport:Oi})}seedArgsFor(e){let r=super.seedArgsFor(e);return e?.model?[...r,"--model",e.model]:r}}});import{readdir as B_,readFile as Cx,rm as H_,stat as X_}from"node:fs/promises";import{basename as Od,join as Gt}from"node:path";async function Mx(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 Dx(t,e){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function J_(t){return t.type==="USER_INPUT"}function G_(t){return t.source==="MODEL"&&t.type==="PLANNER_RESPONSE"}function jx(t){return t.source==="MODEL"&&t.type!=="PLANNER_RESPONSE"}function V_(t){if(!t)return"";let e=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(t);return e?e[1]:t}function K_(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 Px(t){if(t===void 0)return"";try{return JSON.stringify(t)}catch{return String(t)}}async function Fx(t){for await(let e of Ge(t)){let r=e.tool_calls?.map(s=>s.args)??[];for(let s of r){let i=Ux(s);if(i)return i}let n=Wx(e.content);if(n)return n}return null}function Ux(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 Wx(t){return t?/"Cwd":"([^"]+)"/.exec(t)?.[1]??null:null}function Y_(t){if(t.endsWith(".db"))return Od(t,".db");let e="/brain/",r=t.indexOf(e);return r===-1?null:t.slice(r+e.length).split("/")[0]||null}var Hi,z_=E(()=>{"use strict";cr();Hi=class{name="agy";baseDir;constructor(e={}){this.baseDir=e.agyDir||Gt(Ie,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:Gt(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let e=Gt(this.baseDir,"conversations"),r;try{r=await B_(e)}catch{return[]}let n=[];for(let s of r){if(!s.endsWith(".db"))continue;let i=Od(s,".db");try{let o=await this.extractSummary(i);o&&n.push(o)}catch{}}return n}conversationPath(e){return Gt(this.baseDir,"conversations",`${e}.db`)}transcriptPath(e){return Gt(this.baseDir,"brain",e,".system_generated","logs","transcript.jsonl")}async existingTranscriptPath(e){let r=this.transcriptPath(e);try{return await X_(r),r}catch{return null}}async extractSummary(e){let r=this.conversationPath(e),n=await this.existingTranscriptPath(e),s=n??r,i=await Mx([r,n].filter(Boolean)),o=await this.resolveCwd(e,n),a,l,d,c=0;if(n){let u=await Pe(n,80);for(let m of u){let f=K_(m.content);if(f&&(a=f),J_(m)){let p=V_(m.content).trim();p&&(l||(l=H(p,80)),d=H(p,80)),c++}else G_(m)&&c++}}return{provider:"agy",sessionId:e,cwd:o,createdAt:i.createdAt,modifiedAt:i.modifiedAt,model:a,startCommand:"agy",firstUserMessage:l,lastUserMessage:d,messageCount:c,filePath:s,filePaths:n?[r,n]:[r]}}async loadSession(e){let r=await this.resolveSessionPath(e);if(!r)return null;let n=Y_(r);if(!n)return null;let s=await this.extractSummary(n);if(!s)return null;let i=await this.existingTranscriptPath(n),o=[],a=s.model,l=s.firstUserMessage,d=s.lastUserMessage;if(i)for await(let c of Ge(i)){let u=Dx(c.created_at,s.modifiedAt),m=K_(c.content);if(m&&(a=m),J_(c)){let f=V_(c.content),p=f.trim();p&&(l||(l=H(p,80)),d=H(p,80)),o.push({role:"user",timestamp:u,content:f});continue}if(Array.isArray(c.tool_calls))for(let f of c.tool_calls)o.push({role:"tool_use",timestamp:u,content:Px(f.args),toolName:f.name||"tool"});G_(c)&&c.content?o.push({role:"assistant",timestamp:u,content:c.content,model:a}):jx(c)&&c.content&&o.push({role:"tool_result",timestamp:u,content:c.content,toolName:c.type?.toLowerCase()}),c.thinking&&o.push({role:"thinking",timestamp:u,content:c.thinking})}return{...s,model:a,firstUserMessage:l,lastUserMessage:d,messageCount:o.length,messages:o}}async resolveSessionPath(e){let r=this.conversationPath(e);try{return await X_(r),r}catch{}let n=Gt(this.baseDir,"conversations");try{let s=[];for(let i of await B_(n)){if(!i.endsWith(".db"))continue;Od(i,".db").startsWith(e)&&s.push(Gt(n,i))}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=Y_(r);return n?(await H_(this.conversationPath(n),{force:!0}),await H_(Gt(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 Fx(r);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(e){let r=Gt(this.baseDir,"cache","last_conversations.json");try{let n=JSON.parse(await Cx(r,"utf8"));for(let[s,i]of Object.entries(n))if(i===e)return s}catch{}return null}}});import{spawn as qx}from"node:child_process";function Cd(t){return new $d(t)}async function Bx(t,e){let r=Date.now(),n=["--conversation",e.sessionId,"-p",t,"--dangerously-skip-permissions","--print-timeout",Xx(e.timeoutMs)];e.model&&n.push("--model",e.model),mt("agy",n,e.permissionMode??"yolo"),e.onProgress?.({kind:"system",summary:"agy -p one-shot started (no streaming events)"});let{stdout:s}=await Hx(e.binary,n,{cwd:e.cwd,env:Fe(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 Hx(t,e,r){return new Promise((n,s)=>{let i;try{i=qx(t,e,{cwd:r.cwd,env:r.env,stdio:["ignore","pipe","pipe"]})}catch(d){s(d);return}let o="",a="";i.stdout?.on("data",d=>{o+=d.toString()}),i.stderr?.on("data",d=>{a+=d.toString()});let l=()=>{i.kill("SIGTERM"),s(new Error("agy turn aborted"))};if(r.signal){if(r.signal.aborted){l();return}r.signal.addEventListener("abort",l,{once:!0})}i.on("error",d=>{r.signal?.removeEventListener("abort",l),s(d)}),i.on("exit",(d,c)=>{if(r.signal?.removeEventListener("abort",l),d===0){n({stdout:o,stderr:a});return}let u=c?`signal ${c}`:`exit code ${d}`,m=a.trim()||o.trim();s(new Error(`agy failed (${u})${m?`: ${m}`:""}`))})})}function Xx(t){return!t||t<=0?"8h":`${Math.max(1,Math.ceil(t/1e3))}s`}var $d,Md=E(()=>{"use strict";z_();Ht();At();ut();un();$d=class extends Le{constructor(e){super({provider:new Hi(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",Ee,"--dangerously-skip-permissions","--print-timeout","2m"],resumeTemplate:"agy --conversation {{session_id}} --dangerously-skip-permissions",startTemplate:"agy --dangerously-skip-permissions",transport:Bx})}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 Jx}from"node:crypto";import{existsSync as Gx,mkdirSync as Vx,readFileSync as Kx,renameSync as Yx,writeFileSync as zx}from"node:fs";import{dirname as rh,join as Z_,resolve as Dd}from"node:path";function Zx(t){return Jx("sha256").update(t).digest("hex").slice(0,8)}function Qx(t){let e=t.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"session"}function eR(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 nh(t){return t.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function Xi(t){return Math.max(1,Math.ceil(t.length/4))}function gn(t=process.cwd()){let e=process.env.LMCTL_CLAUDE_MOCK_STORE;if(e!==void 0&&e.trim().length>0)return Dd(e);let r=process.env.LMCTL_DB;return r!==void 0&&r.trim().length>0?Z_(rh(Dd(r)),".lmctl-claude-mock","sessions.json"):Z_(Dd(t),".lmctl-claude-mock","sessions.json")}function Q_(){return{schemaVersion:1,sessions:{}}}function ws(t){if(!Gx(t))return Q_();try{let e=JSON.parse(Kx(t,"utf8")),r=typeof e.sessions=="object"&&e.sessions!==null?e.sessions:{},n=typeof e.script=="object"&&e.script!==null?e.script:void 0;return{schemaVersion:1,sessions:r,...n!==void 0?{script:n}:{}}}catch{return Q_()}}function sh(t,e){Vx(rh(t),{recursive:!0});let r=`${t}.${process.pid}.${Date.now()}.tmp`;zx(r,`${JSON.stringify(e,null,2)}
1588
- `,"utf8"),Yx(r,t)}function tR(t){return{...t,timestamp:t.timestamp.toISOString()}}function rR(t){return{...t,timestamp:new Date(t.timestamp)}}function nR(t){return{...t,createdAt:t.createdAt.toISOString(),modifiedAt:t.modifiedAt.toISOString(),messages:t.messages.map(tR)}}function ih(t){return{...t,createdAt:new Date(t.createdAt),modifiedAt:new Date(t.modifiedAt),messages:t.messages.map(rR)}}function Ji(t,e=process.cwd()){let r=hn.get(t);if(r!==void 0)return r;let s=ws(gn(e)).sessions[t];if(s===void 0)return;let i=ih(s);return hn.set(i.sessionId,i),i}function eh(t){hn.set(t.sessionId,t);let e=gn(t.cwd),r=ws(e);r.sessions[t.sessionId]=nR({...t,filePath:e}),sh(e,r)}function sR(){let t=ws(gn()),e=Object.values(t.sessions).map(ih);for(let r of e)hn.set(r.sessionId,r);return e}function iR(t,e){let r=e.script;if(r===void 0)return;let n=r[t],s=r[nh(t)],i=n??s;if(typeof i=="string")return i;if(i!==void 0&&typeof i.text=="string")return i.text}function th(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 Fd(){return new Pd}var hn,jd,Pd,Ud=E(()=>{"use strict";hn=new Map;jd=class{name="ClaudeMock";async discoverSessions(){let e=new Map;for(let r of sR())e.set(r.sessionId,r);for(let r of hn.values())e.set(r.sessionId,r);return[...e.values()].map(th)}async loadSession(e){let r=Ji(e);return r===void 0?null:{...th(r),messages:r.messages.slice()}}async resolveSessionPath(e){return Ji(e)?.filePath??null}async deleteSession(e){let r=hn.delete(e),n=gn(),s=ws(n),i=s.sessions[e]!==void 0;return delete s.sessions[e],i&&sh(n,s),r||i}},Pd=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new jd;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=Qx(eR(e,r)),s=`mock-${n}-${Zx(`${e}:${n}`)}`,i=new Date,o=gn(e),a=Ji(s,e),l=r?.prompt??"ClaudeMock seed",d=Xi(l),c={sessionId:s,cwd:e,filePath:o,createdAt:a?.createdAt??i,modifiedAt:i,messages:a?.messages.slice()??[],totalInputTokens:a?.totalInputTokens??0,totalOutputTokens:a?.totalOutputTokens??0};return c.messages.push({role:"user",timestamp:i,content:l}),c.messages.push({role:"assistant",timestamp:i,content:"ACK: ClaudeMock seeded"}),c.totalInputTokens+=d,c.totalOutputTokens+=Xi("ACK: ClaudeMock seeded"),eh(c),{success:!0,sessionId:s}}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=Ji(r.sessionId,r.cwd);if(s===void 0)throw new Error(`ClaudeMock session not found: ${r.sessionId}`);let i=new Date,o=ws(gn(r.cwd)),a=iR(e,o)??`ClaudeMock ack: ${nh(e)}`;return s.messages.push({role:"user",timestamp:i,content:e}),s.messages.push({role:"assistant",timestamp:i,content:a,model:r.model??"claude-mock"}),s.modifiedAt=i,s.totalInputTokens+=Xi(e),s.totalOutputTokens+=Xi(a),eh(s),r.onProgress?.({kind:"text",summary:"ClaudeMock deterministic reply"}),{text:a,sessionId:r.sessionId,durationMs:Math.max(1,Date.now()-n),stopReason:"mock_stop",numTurns:1,status:"ok"}}}});function xt(t){let e=[ld({claudeDir:t?.claudeDir}),ud({codexDir:t?.codexDir,codeDir:t?.codeDir}),hd({geminiDir:t?.geminiDir,claudeDir:t?.claudeDir,codexDir:t?.codexDir,codeDir:t?.codeDir}),Ed({copilotDir:t?.copilotDir}),bd(),Nd({lmplayerDbPath:t?.lmplayerDbPath}),Rd(),Cd({agyDir:t?.agyDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&e.push(Fd()),e}var Wd=E(()=>{"use strict";dd();md();gd();wd();kd();Ad();Ld();Md();Ud();dd();md();gd();wd();kd();Ad();Ld();Md();Ud()});var Xd={};he(Xd,{ProviderRegistry:()=>ms,TransportConnectionError:()=>we,TransportError:()=>st,TransportJsonError:()=>ki,TransportProcessError:()=>Xt,TransportRpcError:()=>Jt,_resetDefaultRegistryForTests:()=>oR,chat:()=>Rt,countTokens:()=>Hd,createAdapterRegistry:()=>Nt,createAllAdapters:()=>xt,listSessions:()=>Bd,seed:()=>qd});function Vi(){return Gi===null&&(Gi=Nt(xt())),Gi}function oR(){Gi=null}function ah(t,e){let r=t.getAdapter(e);if(!r)throw new Error(`provider "${e}" is not registered in this registry`);return r}async function Rt(t){let e=t.registry??Vi(),r=ah(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 qd(t){let e=t.registry??Vi(),r=ah(e,t.provider),n=await oh(e,t.provider,t.cwd),s=await r.seed(t.cwd,{model:t.model,effort:t.effort,prompt:t.prompt}),i=s.warnings!==void 0&&s.warnings.length>0?{warnings:s.warnings}:{};if(!s.success)return{success:!1,error:s.error,...i};if(s.sessionId)return{success:!0,sessionId:s.sessionId,...i};let o=await oh(e,t.provider,t.cwd),a=aR(n,o);return a?{success:!0,sessionId:a,...i}:{success:!0,...i}}async function oh(t,e,r){let n=await t.listAll({provider:e,workspace:r}),s=new Map;for(let i of n)s.set(i.sessionId,i.modifiedAt);return s}function aR(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 Bd(t={}){return(t.registry??Vi()).listAll({provider:t.provider,workspace:t.workspace,limit:t.limit,from:t.from,to:t.to})}async function Hd(t){let r=await(t.registry??Vi()).getSession(t.sessionId,t.provider);if(!r)throw new Error(`session "${t.sessionId}" not found`);let n=r.totalInputTokens??0,s=r.totalCachedInputTokens??0,i=r.totalCacheWriteInputTokens??0,o=r.totalOutputTokens??0,a=r.totalReasoningOutputTokens??0;return{provider:r.provider,sessionId:r.sessionId,input:n,cachedInput:s,cacheWriteInput:i,output:o,reasoningOutput:a,total:n+s+i+o+a,lastTurn:r.lastTokenUsage}}var Gi,Lt=E(()=>{"use strict";Ul();Wd();Ul();Wd();cn();Gi=null});function lR(){return Jd===null&&(Jd=Nt(xt())),Jd}async function Ki(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,i;try{return await cR(t)}catch(o){throw s=!0,i=o,o}finally{if(n)if(!s)yn.delete(r),e.setMemberState(r,"idle");else{let o=dR(i,r);e.setMemberState(r,o!==null?"attention_needed":"idle",o)}}}function dR(t,e){if(!(t instanceof Ne))return yn.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=(yn.get(e)??0)+1;return r>=3?(yn.delete(e),"consecutive_timeouts"):(yn.set(e,r),null)}return yn.delete(e),null}async function cR(t){let e=t.timeoutMs,r=typeof e=="number"&&e>0,n=lR(),s;try{let c=await n.resolveSession(t.sessionid);if(!c)return Promise.reject(new Ne("other",null,`library: sessionid "${t.sessionid}" matched no registered provider`,Gd(t.sessionid,t.sessiondir,"unresolved")));s=c.provider.name}catch(c){return Promise.reject(new Ne("other",null,`library: session resolution failed: ${lh(c)}`,Gd(t.sessionid,t.sessiondir,"unresolved")))}let i=Gd(t.sessionid,t.sessiondir,s),o=new AbortController,a=r?setTimeout(()=>o.abort(),e):null,l=!1;o.signal.addEventListener("abort",()=>{l=!0},{once:!0});let d=Date.now();try{let c=await Rt({provider:s,sessionId:t.sessionid,cwd:t.sessiondir,prompt:t.prompt,timeoutMs:0,signal:o.signal,registry:n,onProgress:t.onProgress,permissionMode:t.permissionMode});if(c.status==="stalled")throw new Ne("timeout",null,`library: stalled after ${c.stalledAfterMs??0}ms`,i);return{text:c.text,ms:Date.now()-d,exit_status:0,argv:i}}catch(c){throw l?new Ne("timeout",null,`library: wall-clock timeout after ${e??0}ms`,i):uR(c,i)}finally{a!==null&&clearTimeout(a)}}function Gd(t,e,r){return["<library>","chat",t,e,"--provider",r]}function lh(t){return t instanceof Error?t.message:String(t)}function uR(t,e){if(t instanceof Ne)return t;if(t instanceof we){let r=t.cause;return r?.code==="ENOENT_CWD"?new Ne("sessiondir_missing",null,t.message,e):r?.code==="ENOENT"?new Ne("enoent",null,t.message,e):new Ne("other",null,t.message,e)}return t instanceof Xt?new Ne("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof Jt?new Ne("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof st?new Ne("other",null,t.message,e):new Ne("other",null,lh(t),e)}var Ne,Jd,yn,Yi=E(()=>{"use strict";Lt();Ne=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"}},Jd=null;yn=new Map});function dh(){return Vd===null&&(Vd=Nt(xt())),Vd}function fR(t,e){if(!mR.test(t))return t;let r=e.getConfig(`workspace.${t}`);if(r===null||r.length===0)throw new xe("other",null,`no provider mapping for ${t} (set lmctl_config workspace.${t})`,["<library>","seed","--provider",t]);return r}async function zi(t){let e=fR(t.member.provider,t.dal),r=e===t.member.provider?t.member:{...t.member,provider:e},n=await pR({member:r});return t.dal.setMemberProviderResolved(t.member.id,e),{sessionid:n.sessionid,provider_resolved:e}}async function pR(t){let e=t.member.provider,r=t.member.sessiondir,n=Kd("seed",r,e);try{let s=await qd({provider:e,cwd:r,registry:dh()});if(!s.success)throw hR(s.error,n);if(!s.sessionId)throw new xe("parse",0,"",n);return{sessionid:s.sessionId}}catch(s){throw s instanceof xe?s:Yd(s,n)}}async function ch(t){return _R(t)}async function _R(t){let e=dh(),r=Kd("tokens",t.sessionid,"unresolved"),n;try{let i=await e.resolveSession(t.sessionid);if(!i)throw new xe("parse",0,`library: sessionid "${t.sessionid}" matched no registered provider`,r);n=i.provider.name}catch(i){throw i instanceof xe?i:Yd(i,r)}let s=Kd("tokens",t.sessionid,n);try{let i=await Hd({sessionId:t.sessionid,provider:n,registry:e});return{input_tokens:i.input,cache_tokens:i.cachedInput+i.cacheWriteInput,output_tokens:i.output,total_tokens:i.total}}catch(i){throw i instanceof xe?i:Yd(i,s)}}function Kd(t,e,r){return["<library>",t,e,"--provider",r]}function hR(t,e){let r=t??"";if(/\bENOENT\b/i.test(r))return new xe("enoent",null,r,e);if(/timed?\s*out/i.test(r))return new xe("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 xe("nonzero_exit",Number(n[1]),r,e)}return new xe("other",null,r,e)}function Yd(t,e){return t instanceof xe?t:t instanceof we?t.cause?.code==="ENOENT"?new xe("enoent",null,t.message,e):new xe("other",null,t.message,e):t instanceof Xt?new xe("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof Jt?new xe("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof st?new xe("other",null,t.message,e):new xe("other",null,t instanceof Error?t.message:String(t),e)}var xe,Vd,mR,zd=E(()=>{"use strict";Lt();xe=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"}},Vd=null;mR=/^provider[123]$/});function Zi(t){return Buffer.from(t,"utf8").toString("base64url")}function vs(t){return Buffer.from(t,"base64url").toString("utf8")}async function uh(t,e=r=>ch({sessionid:r})){if(process.env.LMCTL_SESSION_SIZE_DISABLED==="1")return{recorded:0,failed:0};let r=0,n=0;for(let s of gR(t)){let i=s.member.sessionid;if(i!==null)try{let o=await e(i);t.recordSessionSize({team_name:s.team_name,alias:s.member.alias,sessionid:i,...o}),r+=1}catch(o){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:i,error:o instanceof Error?o.message:String(o)})})}catch{}}}return{recorded:r,failed:n}}async function mh(t,e,r){let n=fh(t,e,r);if(n===null||n.member.sessionid===null)throw new Error("session member not found");if(n.member.state!=="idle")throw new Ts(r,n.member.state);t.setMemberState(n.member.id,"in_chat","compacting");try{return await Ki({sessionid:n.member.sessionid,sessiondir:n.member.sessiondir,prompt:"/compact"}),t.setMemberState(n.member.id,"idle",null),{ok:!0,row:ph(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 Zd(t,e,r){let n=fh(t,e,r);if(n===null)throw new Error("session member not found");let s=await zi({member:n.member,dal:t});return t.updateTeamMemberSession(n.member.id,s.sessionid),{ok:!0,sessionid:s.sessionid,row:ph(t,e,r)}}function gR(t){return t.listTeams().flatMap(e=>t.listTeamMembers(e.id).filter(r=>r.sessionid!==null).map(r=>({team_name:e.name,member:r})))}function fh(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 ph(t,e,r){return t.sessionSizeHistory(e,r,1)[0]??null}var Ts,Qi=E(()=>{"use strict";Yi();zd();Ts=class extends Error{constructor(e,r){super(`member ${e} is currently ${r}; cannot compact while busy`),this.name="MemberBusyError"}}});async function Qd(t){let e=t.dal,r=t.nowMs??Date.now(),n=t.thresholdMs??ER(e),s=r-n,i=e.query(`
1587
+ `):"":""}function W_(t){return t.model||t.message?.model}var Bi,q_=E(()=>{"use strict";cr();Bi=class{name="qwen";baseDir;constructor(e){this.baseDir=e?.qwenDir||_r(Ie,".qwen")}async discoverSessions(){let e=_r(this.baseDir,"projects"),r;try{r=await qi(e)}catch{return[]}let n=[];for(let s of r){let i=_r(e,s,"chats"),o;try{o=await qi(i)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),d=_r(i,a);try{let c=await this.extractSummary(d,l);c&&n.push(c)}catch{}}}return n}async extractSummary(e,r){let n=await Pe(e,30);if(n.length===0)return null;let s=await Re(e),i="(unknown)",o,a,l,d,c=0;for(let u of n){if(u.cwd&&(i=u.cwd,u.version&&(a=u.version)),u.type==="system"&&u.cwd&&(i=u.cwd,u.version&&(a=u.version),u.model&&(o=u.model)),P_(u)){let m=U_(u).trim();m&&(l||(l=H(m,80)),d=H(m,80)),c++}if(F_(u)){let m=W_(u);m&&(o=m),c++}}return{provider:"qwen",sessionId:r,cwd:i,createdAt:s.createdAt,modifiedAt:s.modifiedAt,model:o,cliVersion:a,startCommand:"qwen",firstUserMessage:l,lastUserMessage:d,messageCount:c,filePath:e}}async loadSession(e){let r=await this.resolveSessionPath(e);if(!r)return null;let n=j_(r,".jsonl");return this.loadFromFile(r,n)}async loadFromFile(e,r){let n=await Re(e),s="(unknown)",i,o,a,l,d,c,u=[];for await(let m of Ge(e)){if(m.cwd&&(s=m.cwd,m.version&&(o=m.version),m.gitBranch&&(a=m.gitBranch)),m.type==="system"&&m.cwd&&(s=m.cwd,m.version&&(o=m.version),m.model&&(i=m.model),m.gitBranch&&(a=m.gitBranch)),!m.message)continue;let f=m.message,p=m.timestamp?new Date(m.timestamp):n.modifiedAt;if(P_(m)){let h=U_(m);h.trim()&&(d||(d=H(h.trim(),80)),c=H(h.trim(),80)),u.push({role:"user",timestamp:p,content:h})}else if(F_(m)){let h=W_(m);if(h&&(i=h),Array.isArray(f.content))for(let g of f.content)g.type==="text"&&g.text?u.push({role:"assistant",timestamp:p,content:g.text,model:h}):g.type==="thinking"&&g.thinking&&u.push({role:"thinking",timestamp:p,content:g.thinking});else if(typeof f.content=="string")u.push({role:"assistant",timestamp:p,content:f.content,model:h});else if(Array.isArray(f.parts))for(let g of f.parts)if(g.thought||g.type==="thinking"){let _=g.thinking||g.text;_&&u.push({role:"thinking",timestamp:p,content:_})}else g.text&&u.push({role:"assistant",timestamp:p,content:g.text,model:h})}}return{provider:"qwen",sessionId:r,slug:l,cwd:s,createdAt:n.createdAt,modifiedAt:n.modifiedAt,model:i,cliVersion:o,gitBranch:a,startCommand:"qwen",firstUserMessage:d,lastUserMessage:c,messageCount:u.length,filePath:e,messages:u}}async resolveSessionPath(e){let r=_r(this.baseDir,"projects");try{let n=await qi(r),s=[];for(let i of n){let o=_r(r,i,"chats",`${e}.jsonl`);try{return await Ox(o,{flag:"r"}),o}catch{continue}}for(let i of n){let o=_r(r,i,"chats"),a;try{a=await qi(o)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;j_(l,".jsonl").startsWith(e)&&s.push(_r(o,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 $x(r),!0}catch{return!1}}}});function xd(){return new Ad}var Ad,Rd=E(()=>{"use strict";q_();Ht();$r();At();Ad=class extends Le{constructor(){super({provider:new Bi,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"qwen",seedArgs:["-p",Ee,"--approval-mode","yolo"],resumeTemplate:"qwen --resume {{session_id}}",startTemplate:"qwen",transport:Oi})}seedArgsFor(e){let r=super.seedArgsFor(e);return e?.model?[...r,"--model",e.model]:r}}});import{readdir as B_,readFile as Cx,rm as H_,stat as X_}from"node:fs/promises";import{basename as Ld,join as Gt}from"node:path";async function Mx(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 Dx(t,e){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function J_(t){return t.type==="USER_INPUT"}function G_(t){return t.source==="MODEL"&&t.type==="PLANNER_RESPONSE"}function jx(t){return t.source==="MODEL"&&t.type!=="PLANNER_RESPONSE"}function V_(t){if(!t)return"";let e=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(t);return e?e[1]:t}function K_(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 Px(t){if(t===void 0)return"";try{return JSON.stringify(t)}catch{return String(t)}}async function Fx(t){for await(let e of Ge(t)){let r=e.tool_calls?.map(s=>s.args)??[];for(let s of r){let i=Ux(s);if(i)return i}let n=Wx(e.content);if(n)return n}return null}function Ux(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 Wx(t){return t?/"Cwd":"([^"]+)"/.exec(t)?.[1]??null:null}function Y_(t){if(t.endsWith(".db"))return Ld(t,".db");let e="/brain/",r=t.indexOf(e);return r===-1?null:t.slice(r+e.length).split("/")[0]||null}var Hi,z_=E(()=>{"use strict";cr();Hi=class{name="agy";baseDir;constructor(e={}){this.baseDir=e.agyDir||Gt(Ie,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:Gt(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let e=Gt(this.baseDir,"conversations"),r;try{r=await B_(e)}catch{return[]}let n=[];for(let s of r){if(!s.endsWith(".db"))continue;let i=Ld(s,".db");try{let o=await this.extractSummary(i);o&&n.push(o)}catch{}}return n}conversationPath(e){return Gt(this.baseDir,"conversations",`${e}.db`)}transcriptPath(e){return Gt(this.baseDir,"brain",e,".system_generated","logs","transcript.jsonl")}async existingTranscriptPath(e){let r=this.transcriptPath(e);try{return await X_(r),r}catch{return null}}async extractSummary(e){let r=this.conversationPath(e),n=await this.existingTranscriptPath(e),s=n??r,i=await Mx([r,n].filter(Boolean)),o=await this.resolveCwd(e,n),a,l,d,c=0;if(n){let u=await Pe(n,80);for(let m of u){let f=K_(m.content);if(f&&(a=f),J_(m)){let p=V_(m.content).trim();p&&(l||(l=H(p,80)),d=H(p,80)),c++}else G_(m)&&c++}}return{provider:"agy",sessionId:e,cwd:o,createdAt:i.createdAt,modifiedAt:i.modifiedAt,model:a,startCommand:"agy",firstUserMessage:l,lastUserMessage:d,messageCount:c,filePath:s,filePaths:n?[r,n]:[r]}}async loadSession(e){let r=await this.resolveSessionPath(e);if(!r)return null;let n=Y_(r);if(!n)return null;let s=await this.extractSummary(n);if(!s)return null;let i=await this.existingTranscriptPath(n),o=[],a=s.model,l=s.firstUserMessage,d=s.lastUserMessage;if(i)for await(let c of Ge(i)){let u=Dx(c.created_at,s.modifiedAt),m=K_(c.content);if(m&&(a=m),J_(c)){let f=V_(c.content),p=f.trim();p&&(l||(l=H(p,80)),d=H(p,80)),o.push({role:"user",timestamp:u,content:f});continue}if(Array.isArray(c.tool_calls))for(let f of c.tool_calls)o.push({role:"tool_use",timestamp:u,content:Px(f.args),toolName:f.name||"tool"});G_(c)&&c.content?o.push({role:"assistant",timestamp:u,content:c.content,model:a}):jx(c)&&c.content&&o.push({role:"tool_result",timestamp:u,content:c.content,toolName:c.type?.toLowerCase()}),c.thinking&&o.push({role:"thinking",timestamp:u,content:c.thinking})}return{...s,model:a,firstUserMessage:l,lastUserMessage:d,messageCount:o.length,messages:o}}async resolveSessionPath(e){let r=this.conversationPath(e);try{return await X_(r),r}catch{}let n=Gt(this.baseDir,"conversations");try{let s=[];for(let i of await B_(n)){if(!i.endsWith(".db"))continue;Ld(i,".db").startsWith(e)&&s.push(Gt(n,i))}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=Y_(r);return n?(await H_(this.conversationPath(n),{force:!0}),await H_(Gt(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 Fx(r);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(e){let r=Gt(this.baseDir,"cache","last_conversations.json");try{let n=JSON.parse(await Cx(r,"utf8"));for(let[s,i]of Object.entries(n))if(i===e)return s}catch{}return null}}});import{spawn as qx}from"node:child_process";function $d(t){return new Od(t)}async function Bx(t,e){let r=Date.now(),n=["--conversation",e.sessionId,"-p",t,"--dangerously-skip-permissions","--print-timeout",Xx(e.timeoutMs)];e.model&&n.push("--model",e.model),mt("agy",n,e.permissionMode??"yolo"),e.onProgress?.({kind:"system",summary:"agy -p one-shot started (no streaming events)"});let{stdout:s}=await Hx(e.binary,n,{cwd:e.cwd,env:Fe(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 Hx(t,e,r){return new Promise((n,s)=>{let i;try{i=qx(t,e,{cwd:r.cwd,env:r.env,stdio:["ignore","pipe","pipe"]})}catch(d){s(d);return}let o="",a="";i.stdout?.on("data",d=>{o+=d.toString()}),i.stderr?.on("data",d=>{a+=d.toString()});let l=()=>{i.kill("SIGTERM"),s(new Error("agy turn aborted"))};if(r.signal){if(r.signal.aborted){l();return}r.signal.addEventListener("abort",l,{once:!0})}i.on("error",d=>{r.signal?.removeEventListener("abort",l),s(d)}),i.on("exit",(d,c)=>{if(r.signal?.removeEventListener("abort",l),d===0){n({stdout:o,stderr:a});return}let u=c?`signal ${c}`:`exit code ${d}`,m=a.trim()||o.trim();s(new Error(`agy failed (${u})${m?`: ${m}`:""}`))})})}function Xx(t){return!t||t<=0?"8h":`${Math.max(1,Math.ceil(t/1e3))}s`}var Od,Cd=E(()=>{"use strict";z_();Ht();At();ut();un();Od=class extends Le{constructor(e){super({provider:new Hi(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",Ee,"--dangerously-skip-permissions","--print-timeout","2m"],resumeTemplate:"agy --conversation {{session_id}} --dangerously-skip-permissions",startTemplate:"agy --dangerously-skip-permissions",transport:Bx})}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 Jx}from"node:crypto";import{existsSync as Gx,mkdirSync as Vx,readFileSync as Kx,renameSync as Yx,writeFileSync as zx}from"node:fs";import{dirname as rh,join as Z_,resolve as Md}from"node:path";function Zx(t){return Jx("sha256").update(t).digest("hex").slice(0,8)}function Qx(t){let e=t.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"session"}function eR(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 nh(t){return t.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function Xi(t){return Math.max(1,Math.ceil(t.length/4))}function gn(t=process.cwd()){let e=process.env.LMCTL_CLAUDE_MOCK_STORE;if(e!==void 0&&e.trim().length>0)return Md(e);let r=process.env.LMCTL_DB;return r!==void 0&&r.trim().length>0?Z_(rh(Md(r)),".lmctl-claude-mock","sessions.json"):Z_(Md(t),".lmctl-claude-mock","sessions.json")}function Q_(){return{schemaVersion:1,sessions:{}}}function ws(t){if(!Gx(t))return Q_();try{let e=JSON.parse(Kx(t,"utf8")),r=typeof e.sessions=="object"&&e.sessions!==null?e.sessions:{},n=typeof e.script=="object"&&e.script!==null?e.script:void 0;return{schemaVersion:1,sessions:r,...n!==void 0?{script:n}:{}}}catch{return Q_()}}function sh(t,e){Vx(rh(t),{recursive:!0});let r=`${t}.${process.pid}.${Date.now()}.tmp`;zx(r,`${JSON.stringify(e,null,2)}
1588
+ `,"utf8"),Yx(r,t)}function tR(t){return{...t,timestamp:t.timestamp.toISOString()}}function rR(t){return{...t,timestamp:new Date(t.timestamp)}}function nR(t){return{...t,createdAt:t.createdAt.toISOString(),modifiedAt:t.modifiedAt.toISOString(),messages:t.messages.map(tR)}}function ih(t){return{...t,createdAt:new Date(t.createdAt),modifiedAt:new Date(t.modifiedAt),messages:t.messages.map(rR)}}function Ji(t,e=process.cwd()){let r=hn.get(t);if(r!==void 0)return r;let s=ws(gn(e)).sessions[t];if(s===void 0)return;let i=ih(s);return hn.set(i.sessionId,i),i}function eh(t){hn.set(t.sessionId,t);let e=gn(t.cwd),r=ws(e);r.sessions[t.sessionId]=nR({...t,filePath:e}),sh(e,r)}function sR(){let t=ws(gn()),e=Object.values(t.sessions).map(ih);for(let r of e)hn.set(r.sessionId,r);return e}function iR(t,e){let r=e.script;if(r===void 0)return;let n=r[t],s=r[nh(t)],i=n??s;if(typeof i=="string")return i;if(i!==void 0&&typeof i.text=="string")return i.text}function th(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 Pd(){return new jd}var hn,Dd,jd,Fd=E(()=>{"use strict";hn=new Map;Dd=class{name="ClaudeMock";async discoverSessions(){let e=new Map;for(let r of sR())e.set(r.sessionId,r);for(let r of hn.values())e.set(r.sessionId,r);return[...e.values()].map(th)}async loadSession(e){let r=Ji(e);return r===void 0?null:{...th(r),messages:r.messages.slice()}}async resolveSessionPath(e){return Ji(e)?.filePath??null}async deleteSession(e){let r=hn.delete(e),n=gn(),s=ws(n),i=s.sessions[e]!==void 0;return delete s.sessions[e],i&&sh(n,s),r||i}},jd=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new Dd;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=Qx(eR(e,r)),s=`mock-${n}-${Zx(`${e}:${n}`)}`,i=new Date,o=gn(e),a=Ji(s,e),l=r?.prompt??"ClaudeMock seed",d=Xi(l),c={sessionId:s,cwd:e,filePath:o,createdAt:a?.createdAt??i,modifiedAt:i,messages:a?.messages.slice()??[],totalInputTokens:a?.totalInputTokens??0,totalOutputTokens:a?.totalOutputTokens??0};return c.messages.push({role:"user",timestamp:i,content:l}),c.messages.push({role:"assistant",timestamp:i,content:"ACK: ClaudeMock seeded"}),c.totalInputTokens+=d,c.totalOutputTokens+=Xi("ACK: ClaudeMock seeded"),eh(c),{success:!0,sessionId:s}}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=Ji(r.sessionId,r.cwd);if(s===void 0)throw new Error(`ClaudeMock session not found: ${r.sessionId}`);let i=new Date,o=ws(gn(r.cwd)),a=iR(e,o)??`ClaudeMock ack: ${nh(e)}`;return s.messages.push({role:"user",timestamp:i,content:e}),s.messages.push({role:"assistant",timestamp:i,content:a,model:r.model??"claude-mock"}),s.modifiedAt=i,s.totalInputTokens+=Xi(e),s.totalOutputTokens+=Xi(a),eh(s),r.onProgress?.({kind:"text",summary:"ClaudeMock deterministic reply"}),{text:a,sessionId:r.sessionId,durationMs:Math.max(1,Date.now()-n),stopReason:"mock_stop",numTurns:1,status:"ok"}}}});function xt(t){let e=[ad({claudeDir:t?.claudeDir}),cd({codexDir:t?.codexDir,codeDir:t?.codeDir}),_d({geminiDir:t?.geminiDir,claudeDir:t?.claudeDir,codexDir:t?.codexDir,codeDir:t?.codeDir}),yd({copilotDir:t?.copilotDir}),Sd(),Id({lmplayerDbPath:t?.lmplayerDbPath}),xd(),$d({agyDir:t?.agyDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&e.push(Pd()),e}var Ud=E(()=>{"use strict";ld();ud();hd();Ed();bd();Nd();Rd();Cd();Fd();ld();ud();hd();Ed();bd();Nd();Rd();Cd();Fd()});var Hd={};he(Hd,{ProviderRegistry:()=>ms,TransportConnectionError:()=>we,TransportError:()=>st,TransportJsonError:()=>ki,TransportProcessError:()=>Xt,TransportRpcError:()=>Jt,_resetDefaultRegistryForTests:()=>oR,chat:()=>Rt,countTokens:()=>Bd,createAdapterRegistry:()=>Nt,createAllAdapters:()=>xt,listSessions:()=>qd,seed:()=>Wd});function Vi(){return Gi===null&&(Gi=Nt(xt())),Gi}function oR(){Gi=null}function ah(t,e){let r=t.getAdapter(e);if(!r)throw new Error(`provider "${e}" is not registered in this registry`);return r}async function Rt(t){let e=t.registry??Vi(),r=ah(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 Wd(t){let e=t.registry??Vi(),r=ah(e,t.provider),n=await oh(e,t.provider,t.cwd),s=await r.seed(t.cwd,{model:t.model,effort:t.effort,prompt:t.prompt}),i=s.warnings!==void 0&&s.warnings.length>0?{warnings:s.warnings}:{};if(!s.success)return{success:!1,error:s.error,...i};if(s.sessionId)return{success:!0,sessionId:s.sessionId,...i};let o=await oh(e,t.provider,t.cwd),a=aR(n,o);return a?{success:!0,sessionId:a,...i}:{success:!0,...i}}async function oh(t,e,r){let n=await t.listAll({provider:e,workspace:r}),s=new Map;for(let i of n)s.set(i.sessionId,i.modifiedAt);return s}function aR(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 qd(t={}){return(t.registry??Vi()).listAll({provider:t.provider,workspace:t.workspace,limit:t.limit,from:t.from,to:t.to})}async function Bd(t){let r=await(t.registry??Vi()).getSession(t.sessionId,t.provider);if(!r)throw new Error(`session "${t.sessionId}" not found`);let n=r.totalInputTokens??0,s=r.totalCachedInputTokens??0,i=r.totalCacheWriteInputTokens??0,o=r.totalOutputTokens??0,a=r.totalReasoningOutputTokens??0;return{provider:r.provider,sessionId:r.sessionId,input:n,cachedInput:s,cacheWriteInput:i,output:o,reasoningOutput:a,total:n+s+i+o+a,lastTurn:r.lastTokenUsage}}var Gi,Lt=E(()=>{"use strict";Fl();Ud();Fl();Ud();cn();Gi=null});function lR(){return Xd===null&&(Xd=Nt(xt())),Xd}async function Ki(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,i;try{return await cR(t)}catch(o){throw s=!0,i=o,o}finally{if(n)if(!s)yn.delete(r),e.setMemberState(r,"idle");else{let o=dR(i,r);e.setMemberState(r,o!==null?"attention_needed":"idle",o)}}}function dR(t,e){if(!(t instanceof Ne))return yn.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=(yn.get(e)??0)+1;return r>=3?(yn.delete(e),"consecutive_timeouts"):(yn.set(e,r),null)}return yn.delete(e),null}async function cR(t){let e=t.timeoutMs,r=typeof e=="number"&&e>0,n=lR(),s;try{let c=await n.resolveSession(t.sessionid);if(!c)return Promise.reject(new Ne("other",null,`library: sessionid "${t.sessionid}" matched no registered provider`,Jd(t.sessionid,t.sessiondir,"unresolved")));s=c.provider.name}catch(c){return Promise.reject(new Ne("other",null,`library: session resolution failed: ${lh(c)}`,Jd(t.sessionid,t.sessiondir,"unresolved")))}let i=Jd(t.sessionid,t.sessiondir,s),o=new AbortController,a=r?setTimeout(()=>o.abort(),e):null,l=!1;o.signal.addEventListener("abort",()=>{l=!0},{once:!0});let d=Date.now();try{let c=await Rt({provider:s,sessionId:t.sessionid,cwd:t.sessiondir,prompt:t.prompt,timeoutMs:0,signal:o.signal,registry:n,onProgress:t.onProgress,permissionMode:t.permissionMode});if(c.status==="stalled")throw new Ne("timeout",null,`library: stalled after ${c.stalledAfterMs??0}ms`,i);return{text:c.text,ms:Date.now()-d,exit_status:0,argv:i}}catch(c){throw l?new Ne("timeout",null,`library: wall-clock timeout after ${e??0}ms`,i):uR(c,i)}finally{a!==null&&clearTimeout(a)}}function Jd(t,e,r){return["<library>","chat",t,e,"--provider",r]}function lh(t){return t instanceof Error?t.message:String(t)}function uR(t,e){if(t instanceof Ne)return t;if(t instanceof we){let r=t.cause;return r?.code==="ENOENT_CWD"?new Ne("sessiondir_missing",null,t.message,e):r?.code==="ENOENT"?new Ne("enoent",null,t.message,e):new Ne("other",null,t.message,e)}return t instanceof Xt?new Ne("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof Jt?new Ne("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof st?new Ne("other",null,t.message,e):new Ne("other",null,lh(t),e)}var Ne,Xd,yn,Yi=E(()=>{"use strict";Lt();Ne=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"}},Xd=null;yn=new Map});function dh(){return Gd===null&&(Gd=Nt(xt())),Gd}function fR(t,e){if(!mR.test(t))return t;let r=e.getConfig(`workspace.${t}`);if(r===null||r.length===0)throw new xe("other",null,`no provider mapping for ${t} (set lmctl_config workspace.${t})`,["<library>","seed","--provider",t]);return r}async function zi(t){let e=fR(t.member.provider,t.dal),r=e===t.member.provider?t.member:{...t.member,provider:e},n=await pR({member:r});return t.dal.setMemberProviderResolved(t.member.id,e),{sessionid:n.sessionid,provider_resolved:e}}async function pR(t){let e=t.member.provider,r=t.member.sessiondir,n=Vd("seed",r,e);try{let s=await Wd({provider:e,cwd:r,registry:dh()});if(!s.success)throw hR(s.error,n);if(!s.sessionId)throw new xe("parse",0,"",n);return{sessionid:s.sessionId}}catch(s){throw s instanceof xe?s:Kd(s,n)}}async function ch(t){return _R(t)}async function _R(t){let e=dh(),r=Vd("tokens",t.sessionid,"unresolved"),n;try{let i=await e.resolveSession(t.sessionid);if(!i)throw new xe("parse",0,`library: sessionid "${t.sessionid}" matched no registered provider`,r);n=i.provider.name}catch(i){throw i instanceof xe?i:Kd(i,r)}let s=Vd("tokens",t.sessionid,n);try{let i=await Bd({sessionId:t.sessionid,provider:n,registry:e});return{input_tokens:i.input,cache_tokens:i.cachedInput+i.cacheWriteInput,output_tokens:i.output,total_tokens:i.total}}catch(i){throw i instanceof xe?i:Kd(i,s)}}function Vd(t,e,r){return["<library>",t,e,"--provider",r]}function hR(t,e){let r=t??"";if(/\bENOENT\b/i.test(r))return new xe("enoent",null,r,e);if(/timed?\s*out/i.test(r))return new xe("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 xe("nonzero_exit",Number(n[1]),r,e)}return new xe("other",null,r,e)}function Kd(t,e){return t instanceof xe?t:t instanceof we?t.cause?.code==="ENOENT"?new xe("enoent",null,t.message,e):new xe("other",null,t.message,e):t instanceof Xt?new xe("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof Jt?new xe("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof st?new xe("other",null,t.message,e):new xe("other",null,t instanceof Error?t.message:String(t),e)}var xe,Gd,mR,Yd=E(()=>{"use strict";Lt();xe=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"}},Gd=null;mR=/^provider[123]$/});function Zi(t){return Buffer.from(t,"utf8").toString("base64url")}function vs(t){return Buffer.from(t,"base64url").toString("utf8")}async function uh(t,e=r=>ch({sessionid:r})){if(process.env.LMCTL_SESSION_SIZE_DISABLED==="1")return{recorded:0,failed:0};let r=0,n=0;for(let s of gR(t)){let i=s.member.sessionid;if(i!==null)try{let o=await e(i);t.recordSessionSize({team_name:s.team_name,alias:s.member.alias,sessionid:i,...o}),r+=1}catch(o){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:i,error:o instanceof Error?o.message:String(o)})})}catch{}}}return{recorded:r,failed:n}}async function mh(t,e,r){let n=fh(t,e,r);if(n===null||n.member.sessionid===null)throw new Error("session member not found");if(n.member.state!=="idle")throw new Ts(r,n.member.state);t.setMemberState(n.member.id,"in_chat","compacting");try{return await Ki({sessionid:n.member.sessionid,sessiondir:n.member.sessiondir,prompt:"/compact"}),t.setMemberState(n.member.id,"idle",null),{ok:!0,row:ph(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 zd(t,e,r){let n=fh(t,e,r);if(n===null)throw new Error("session member not found");let s=await zi({member:n.member,dal:t});return t.updateTeamMemberSession(n.member.id,s.sessionid),{ok:!0,sessionid:s.sessionid,row:ph(t,e,r)}}function gR(t){return t.listTeams().flatMap(e=>t.listTeamMembers(e.id).filter(r=>r.sessionid!==null).map(r=>({team_name:e.name,member:r})))}function fh(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 ph(t,e,r){return t.sessionSizeHistory(e,r,1)[0]??null}var Ts,Qi=E(()=>{"use strict";Yi();Yd();Ts=class extends Error{constructor(e,r){super(`member ${e} is currently ${r}; cannot compact while busy`),this.name="MemberBusyError"}}});async function Zd(t){let e=t.dal,r=t.nowMs??Date.now(),n=t.thresholdMs??ER(e),s=r-n,i=e.query(`
1589
1589
  SELECT
1590
1590
  isess.id AS interactive_session_id,
1591
1591
  isess.run_id,
@@ -1611,16 +1611,16 @@ ${r}`:r}function p_(t,e){let r=HA({input:t.stdout}),n=new Map,s=(o,a={})=>new Pr
1611
1611
  JOIN step s ON s.id = isess.step_id
1612
1612
  WHERE isess.status = 'waiting_agent'
1613
1613
  AND r.terminal_state IS NULL
1614
- `),o={scanned:i.length,hung_detected:0,attentions_created:0,duplicates_suppressed:0};for(let a of i){let l=vR(a.workflow_definition,a.session_state_name,a.step_state_name);if(l===null)continue;let d=wR(e,a.team_id,l);if(d===null||d.sessionid===null)continue;let c=d.alias.toLowerCase()!=="lead",u=a.last_activity_at<s&&(a.last_event_at===null||a.last_event_at<s),m=a.started_at<s;if(!c||!u||!m)continue;let f={session_id:d.sessionid,step_id:a.step_id,member_alias:d.alias,provider:Xe(d),last_activity_at:a.last_activity_at,elapsed_ms:r-a.started_at,session_state:a.session_status,factors:{leaf:!0,no_activity:!0,elapsed:!0}};if(o.hung_detected+=1,TR(e,a.run_id,a.step_id,d.sessionid)){o.duplicates_suppressed+=1;continue}let p={run_id:a.run_id,project_id:a.project_id,payload:f};e.raiseAttention({kind:"session_hung",severity:"warn",project_id:a.project_id,run_id:a.run_id,requires_user:!0,payload:JSON.stringify(f)}),o.attentions_created+=1,t.enableKillHook===!0&&t.killHook!==void 0&&await t.killHook(p)}return o}function ER(t){return _h(t.getConfig(eo),yR)*1e3}function ec(t,e){return _h(t.getConfig(to),e)}function _h(t,e){if(t===null||t.trim().length===0)return e;let r=Number(t);return Number.isFinite(r)&&r>0?Math.floor(r):e}function wR(t,e,r){return t.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",e,r)[0]??null}function TR(t,e,r,n){return t.query(`SELECT * FROM attention
1614
+ `),o={scanned:i.length,hung_detected:0,attentions_created:0,duplicates_suppressed:0};for(let a of i){let l=vR(a.workflow_definition,a.session_state_name,a.step_state_name);if(l===null)continue;let d=wR(e,a.team_id,l);if(d===null||d.sessionid===null)continue;let c=d.alias.toLowerCase()!=="lead",u=a.last_activity_at<s&&(a.last_event_at===null||a.last_event_at<s),m=a.started_at<s;if(!c||!u||!m)continue;let f={session_id:d.sessionid,step_id:a.step_id,member_alias:d.alias,provider:Xe(d),last_activity_at:a.last_activity_at,elapsed_ms:r-a.started_at,session_state:a.session_status,factors:{leaf:!0,no_activity:!0,elapsed:!0}};if(o.hung_detected+=1,TR(e,a.run_id,a.step_id,d.sessionid)){o.duplicates_suppressed+=1;continue}let p={run_id:a.run_id,project_id:a.project_id,payload:f};e.raiseAttention({kind:"session_hung",severity:"warn",project_id:a.project_id,run_id:a.run_id,requires_user:!0,payload:JSON.stringify(f)}),o.attentions_created+=1,t.enableKillHook===!0&&t.killHook!==void 0&&await t.killHook(p)}return o}function ER(t){return _h(t.getConfig(eo),yR)*1e3}function Qd(t,e){return _h(t.getConfig(to),e)}function _h(t,e){if(t===null||t.trim().length===0)return e;let r=Number(t);return Number.isFinite(r)&&r>0?Math.floor(r):e}function wR(t,e,r){return t.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",e,r)[0]??null}function TR(t,e,r,n){return t.query(`SELECT * FROM attention
1615
1615
  WHERE kind = 'session_hung'
1616
1616
  AND run_id = ?
1617
- AND acknowledged_at IS NULL`,e).some(i=>{let o=hh(i.payload);return o!==null&&o.step_id===r&&o.session_id===n})}function vR(t,e,r){let n=hh(t);return n===null?null:SR(n,e,r)??bR(n,e,r)}function SR(t,e,r){if(!Array.isArray(t.steps))return null;let n=t.steps.filter(kR),s=n.find(a=>a.id===e)??n.find(a=>a.name===e)??n.find(a=>a.name===r);if(s===void 0||s.type!=="lmctl/interactive")return null;let i=Dr(s.members)?s.members:null,o=i!==null&&Dr(i.agent)?i.agent:null;return typeof o?.alias=="string"?o.alias:null}function bR(t,e,r){if(!Dr(t.states))return null;let n=t.states[e]??t.states[r];if(!Dr(n))return null;let s=n;if(!Dr(s.agent))return null;let i=s.agent;return typeof i.alias=="string"?i.alias:null}function kR(t){return Dr(t)}function hh(t){if(t===null)return null;try{let e=JSON.parse(t);return Dr(e)?e:null}catch{return null}}function Dr(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var eo,to,yR,tc=E(()=>{"use strict";ct();eo="monitor.session_hung.elapsed_threshold_seconds",to="monitor.session_hung.check_interval_ms",yR=600});function no(t){let e=t.query(`
1617
+ AND acknowledged_at IS NULL`,e).some(i=>{let o=hh(i.payload);return o!==null&&o.step_id===r&&o.session_id===n})}function vR(t,e,r){let n=hh(t);return n===null?null:SR(n,e,r)??bR(n,e,r)}function SR(t,e,r){if(!Array.isArray(t.steps))return null;let n=t.steps.filter(kR),s=n.find(a=>a.id===e)??n.find(a=>a.name===e)??n.find(a=>a.name===r);if(s===void 0||s.type!=="lmctl/interactive")return null;let i=Dr(s.members)?s.members:null,o=i!==null&&Dr(i.agent)?i.agent:null;return typeof o?.alias=="string"?o.alias:null}function bR(t,e,r){if(!Dr(t.states))return null;let n=t.states[e]??t.states[r];if(!Dr(n))return null;let s=n;if(!Dr(s.agent))return null;let i=s.agent;return typeof i.alias=="string"?i.alias:null}function kR(t){return Dr(t)}function hh(t){if(t===null)return null;try{let e=JSON.parse(t);return Dr(e)?e:null}catch{return null}}function Dr(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var eo,to,yR,ec=E(()=>{"use strict";ct();eo="monitor.session_hung.elapsed_threshold_seconds",to="monitor.session_hung.check_interval_ms",yR=600});function no(t){let e=t.query(`
1618
1618
  SELECT status, COUNT(*) AS count FROM job GROUP BY status
1619
- `),r={queued:ro(e,"queued"),running:ro(e,"running"),done:ro(e,"done"),failed:ro(e,"failed"),total:nc(e)},n=t.query(`
1619
+ `),r={queued:ro(e,"queued"),running:ro(e,"running"),done:ro(e,"done"),failed:ro(e,"failed"),total:rc(e)},n=t.query(`
1620
1620
  SELECT terminal_state, COUNT(*) AS count FROM run GROUP BY terminal_state
1621
1621
  `),s=t.query(`
1622
1622
  SELECT acknowledged_at, COUNT(*) AS count FROM attention GROUP BY acknowledged_at IS NOT NULL
1623
- `);return{generated_at:new Date().toISOString(),jobs:r,runs:{active:n.filter(i=>i.terminal_state===null).reduce((i,o)=>i+o.count,0),terminal:n.filter(i=>i.terminal_state!==null).reduce((i,o)=>i+o.count,0),total:nc(n)},attentions:{unacked:s.filter(i=>i.acknowledged_at===null).reduce((i,o)=>i+o.count,0),total:nc(s)},projects:rc(t,"project"),teams:rc(t,"team"),workflows:rc(t,"workflow")}}function so(t){return t.listProjects()}function Eh(t){return t.listTeams().map(e=>({...e,members:t.listTeamMembers(e.id)}))}function io(t){return t.query(`
1623
+ `);return{generated_at:new Date().toISOString(),jobs:r,runs:{active:n.filter(i=>i.terminal_state===null).reduce((i,o)=>i+o.count,0),terminal:n.filter(i=>i.terminal_state!==null).reduce((i,o)=>i+o.count,0),total:rc(n)},attentions:{unacked:s.filter(i=>i.acknowledged_at===null).reduce((i,o)=>i+o.count,0),total:rc(s)},projects:tc(t,"project"),teams:tc(t,"team"),workflows:tc(t,"workflow")}}function so(t){return t.listProjects()}function Eh(t){return t.listTeams().map(e=>({...e,members:t.listTeamMembers(e.id)}))}function io(t){return t.query(`
1624
1624
  SELECT w.*
1625
1625
  FROM workflow w
1626
1626
  JOIN (
@@ -1629,7 +1629,7 @@ ${r}`:r}function p_(t,e){let r=HA({input:t.stdout}),n=new Map,s=(o,a={})=>new Pr
1629
1629
  GROUP BY name
1630
1630
  ) latest ON latest.name = w.name AND latest.version = w.version
1631
1631
  ORDER BY w.name ASC
1632
- `)}function wh(t,e={}){return e.status!==void 0?t.query("SELECT * FROM job WHERE status = ? ORDER BY priority DESC, id ASC",e.status):t.query("SELECT * FROM job ORDER BY priority DESC, id ASC LIMIT 100")}function Th(t,e={}){if(e.pr_url!==void 0){let r=t.findSubmittedPrByUrl(e.pr_url);return r===null?[]:[r]}return t.listSubmittedPrs({status:e.status})}function vh(t,e){return t.getSubmittedPr(e)}function oo(t,e){return t.query("SELECT * FROM job WHERE id = ?",e)[0]??null}function En(t,e={}){return t.query("SELECT * FROM run ORDER BY id DESC LIMIT ?",e.limit??100)}function jr(t,e){let r=t.query("SELECT * FROM run WHERE id = ?",e)[0];return r===void 0?null:{...r,job:oo(t,r.job_id),workflow:t.query("SELECT * FROM workflow WHERE id = ?",r.workflow_id)[0]??null,team:t.getTeam(r.team_id),steps:IR(t,r.id)}}function IR(t,e){return t.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",e).map(r=>({...r,artifacts:Sh(t,r.id)}))}function sc(t,e,r){let n=t.query("SELECT * FROM step WHERE run_id = ? AND id = ?",e,r)[0];return n===void 0?null:{...n,artifacts:Sh(t,n.id)}}function Sh(t,e){return t.query("SELECT * FROM step_artifact WHERE step_id = ? ORDER BY id ASC",e)}function Pr(t,e,r){let n=r===void 0?"SELECT sa.*, s.state_name FROM step_artifact sa JOIN step s ON sa.step_id = s.id WHERE s.run_id = ? ORDER BY sa.id ASC":"SELECT sa.*, s.state_name FROM step_artifact sa JOIN step s ON sa.step_id = s.id WHERE s.run_id = ? AND sa.kind = ? ORDER BY sa.id ASC";return r===void 0?t.query(n,e):t.query(n,e,r)}function bh(t,e,r){let n=sc(t,e,r);return n===null?null:(n.artifacts.find(i=>i.kind===`${n.state_name}_transcript`)??n.artifacts.find(i=>i.content!==null))?.content??null}function kh(t,e={}){return e.type!==void 0?t.query("SELECT * FROM external_object WHERE type = ? ORDER BY id DESC",e.type):t.query("SELECT * FROM external_object ORDER BY id DESC LIMIT 100")}function Ih(t,e={}){return e.unhandled===!0?t.query("SELECT * FROM external_signal WHERE handled_at IS NULL ORDER BY id DESC"):t.query("SELECT * FROM external_signal ORDER BY id DESC LIMIT 100")}function gr(t,e={}){return e.unacked===!0?t.query("SELECT * FROM attention WHERE acknowledged_at IS NULL ORDER BY id DESC"):t.query("SELECT * FROM attention ORDER BY id DESC LIMIT 100")}function ao(t,e={}){let r=[],n="a.kind IN ('interactive_waiting_operator', 'workflow_escalation')";return e.all!==!0&&(n+=" AND a.acknowledged_at IS NULL"),e.project!==void 0&&(n+=" AND p.name = ?",r.push(e.project)),e.since!==void 0&&(n+=" AND a.created_at >= ?",r.push(e.since)),t.query(`${Nh}
1632
+ `)}function wh(t,e={}){return e.status!==void 0?t.query("SELECT * FROM job WHERE status = ? ORDER BY priority DESC, id ASC",e.status):t.query("SELECT * FROM job ORDER BY priority DESC, id ASC LIMIT 100")}function Th(t,e={}){if(e.pr_url!==void 0){let r=t.findSubmittedPrByUrl(e.pr_url);return r===null?[]:[r]}return t.listSubmittedPrs({status:e.status})}function vh(t,e){return t.getSubmittedPr(e)}function oo(t,e){return t.query("SELECT * FROM job WHERE id = ?",e)[0]??null}function En(t,e={}){return t.query("SELECT * FROM run ORDER BY id DESC LIMIT ?",e.limit??100)}function jr(t,e){let r=t.query("SELECT * FROM run WHERE id = ?",e)[0];return r===void 0?null:{...r,job:oo(t,r.job_id),workflow:t.query("SELECT * FROM workflow WHERE id = ?",r.workflow_id)[0]??null,team:t.getTeam(r.team_id),steps:IR(t,r.id)}}function IR(t,e){return t.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",e).map(r=>({...r,artifacts:Sh(t,r.id)}))}function nc(t,e,r){let n=t.query("SELECT * FROM step WHERE run_id = ? AND id = ?",e,r)[0];return n===void 0?null:{...n,artifacts:Sh(t,n.id)}}function Sh(t,e){return t.query("SELECT * FROM step_artifact WHERE step_id = ? ORDER BY id ASC",e)}function Pr(t,e,r){let n=r===void 0?"SELECT sa.*, s.state_name FROM step_artifact sa JOIN step s ON sa.step_id = s.id WHERE s.run_id = ? ORDER BY sa.id ASC":"SELECT sa.*, s.state_name FROM step_artifact sa JOIN step s ON sa.step_id = s.id WHERE s.run_id = ? AND sa.kind = ? ORDER BY sa.id ASC";return r===void 0?t.query(n,e):t.query(n,e,r)}function bh(t,e,r){let n=nc(t,e,r);return n===null?null:(n.artifacts.find(i=>i.kind===`${n.state_name}_transcript`)??n.artifacts.find(i=>i.content!==null))?.content??null}function kh(t,e={}){return e.type!==void 0?t.query("SELECT * FROM external_object WHERE type = ? ORDER BY id DESC",e.type):t.query("SELECT * FROM external_object ORDER BY id DESC LIMIT 100")}function Ih(t,e={}){return e.unhandled===!0?t.query("SELECT * FROM external_signal WHERE handled_at IS NULL ORDER BY id DESC"):t.query("SELECT * FROM external_signal ORDER BY id DESC LIMIT 100")}function gr(t,e={}){return e.unacked===!0?t.query("SELECT * FROM attention WHERE acknowledged_at IS NULL ORDER BY id DESC"):t.query("SELECT * FROM attention ORDER BY id DESC LIMIT 100")}function ao(t,e={}){let r=[],n="a.kind IN ('interactive_waiting_operator', 'workflow_escalation')";return e.all!==!0&&(n+=" AND a.acknowledged_at IS NULL"),e.project!==void 0&&(n+=" AND p.name = ?",r.push(e.project)),e.since!==void 0&&(n+=" AND a.created_at >= ?",r.push(e.since)),t.query(`${Nh}
1633
1633
  WHERE ${n}
1634
1634
  ORDER BY a.created_at DESC`,...r).map(Ah)}function Ot(t,e){let n=t.query(`${Nh}
1635
1635
  WHERE a.id = ?`,e)[0];return n===void 0?null:Ah(n)}function Ah(t){let{payload_json:e,...r}=t,n={...r,node_path:null,expected_response:null,transcript_tail:null,paused_at:null,created_run_inputs:null,workflow_version_id:null,workflow_step:null,escalation_tier:null,escalation_token:null,escalation_reason:null,declared_outcomes:null,agent_output:null};if(e==null)return n;let s;try{s=JSON.parse(e)}catch{return n}if(s===null||typeof s!="object")return n;let i=s;if(Array.isArray(i.node_path)&&i.node_path.every(o=>typeof o=="string")&&(n.node_path=i.node_path),i.expected_response!==null&&typeof i.expected_response=="object"){let o=i.expected_response;if(typeof o.kind=="string"){let a=Array.isArray(o.choices)&&o.choices.every(l=>typeof l=="string")?o.choices:null;n.expected_response={kind:o.kind,choices:a}}}if(Array.isArray(i.transcript_tail)&&i.transcript_tail.every(o=>typeof o=="string")&&(n.transcript_tail=i.transcript_tail),typeof i.paused_at=="string"&&(n.paused_at=i.paused_at),i.created_run_inputs!==null&&typeof i.created_run_inputs=="object"&&!Array.isArray(i.created_run_inputs)&&(n.created_run_inputs=i.created_run_inputs),typeof i.workflow_version_id=="number"?n.workflow_version_id=i.workflow_version_id:i.workflow_version_id===null&&(n.workflow_version_id=null),i.step!==null&&typeof i.step=="object"&&!Array.isArray(i.step)){let o=i.step;typeof o.id=="string"&&o.id.length>0&&(n.workflow_step={id:o.id,name:typeof o.name=="string"?o.name:null,type:typeof o.type=="string"?o.type:null})}return typeof i.tier=="string"&&(n.escalation_tier=i.tier),typeof i.token=="string"&&(n.escalation_token=i.token),typeof i.reason=="string"&&(n.escalation_reason=i.reason),Array.isArray(i.declared_outcomes)&&i.declared_outcomes.every(o=>typeof o=="string")&&(n.declared_outcomes=i.declared_outcomes),typeof i.agent_output=="string"&&(n.agent_output=i.agent_output),n}function xh(t){return t.query(`
@@ -1638,7 +1638,7 @@ ${r}`:r}function p_(t,e){let r=HA({input:t.stdout}),n=new Map,s=(o,a={})=>new Pr
1638
1638
  JOIN workflow w ON w.id = r.workflow_id
1639
1639
  GROUP BY w.name, r.terminal_state
1640
1640
  ORDER BY w.name ASC, r.terminal_state ASC
1641
- `)}function rc(t,e){return t.query(`SELECT COUNT(*) AS count FROM ${e}`)[0]?.count??0}function ro(t,e){return t.find(r=>r.status===e)?.count??0}function nc(t){return t.reduce((e,r)=>e+r.count,0)}function ic(t,e,r){let n=r!==void 0?new Date(Date.now()-Math.trunc(r)*864e5).toISOString():null,s=[e];n!==null&&s.push(n);let i=t.query(`SELECT s.state_name, s.outcome
1641
+ `)}function tc(t,e){return t.query(`SELECT COUNT(*) AS count FROM ${e}`)[0]?.count??0}function ro(t,e){return t.find(r=>r.status===e)?.count??0}function rc(t){return t.reduce((e,r)=>e+r.count,0)}function sc(t,e,r){let n=r!==void 0?new Date(Date.now()-Math.trunc(r)*864e5).toISOString():null,s=[e];n!==null&&s.push(n);let i=t.query(`SELECT s.state_name, s.outcome
1642
1642
  FROM step s
1643
1643
  JOIN run r ON r.id = s.run_id
1644
1644
  JOIN job j ON j.id = r.job_id
@@ -1662,7 +1662,7 @@ ${r}`:r}function p_(t,e){let r=HA({input:t.stdout}),n=new Map,s=(o,a={})=>new Pr
1662
1662
  WHERE j.project_id = ?
1663
1663
  ${n!==null?"AND r.started_at >= ?":""}
1664
1664
  GROUP BY s.run_id, s.state_name
1665
- HAVING COUNT(*) > 1`,...s),_=new Map;for(let T of g){let v=_.get(T.state_name)??{runs:0,total_attempts:0};v.runs++,v.total_attempts+=T.attempt_count,_.set(T.state_name,v)}let y=[..._.entries()].map(([T,v])=>({state_name:T,retried_runs:v.runs,avg_retries:v.runs>0?Number((v.total_attempts/v.runs).toFixed(2)):0}));return{request_changes_rate:c,step_duration_histogram:h,retry_counts:y}}function oc(t,e={}){let r=e.since_days!==void 0?Date.now()-Math.trunc(e.since_days)*864e5:0,n=e.project_id!==void 0?t.query(`SELECT json_extract(se.payload, '$.tool') AS tool_name, COUNT(*) AS cnt
1665
+ HAVING COUNT(*) > 1`,...s),_=new Map;for(let T of g){let v=_.get(T.state_name)??{runs:0,total_attempts:0};v.runs++,v.total_attempts+=T.attempt_count,_.set(T.state_name,v)}let y=[..._.entries()].map(([T,v])=>({state_name:T,retried_runs:v.runs,avg_retries:v.runs>0?Number((v.total_attempts/v.runs).toFixed(2)):0}));return{request_changes_rate:c,step_duration_histogram:h,retry_counts:y}}function ic(t,e={}){let r=e.since_days!==void 0?Date.now()-Math.trunc(e.since_days)*864e5:0,n=e.project_id!==void 0?t.query(`SELECT json_extract(se.payload, '$.tool') AS tool_name, COUNT(*) AS cnt
1666
1666
  FROM session_event se
1667
1667
  JOIN run r ON r.id = se.run_id
1668
1668
  JOIN job j ON j.id = r.job_id
@@ -1798,7 +1798,7 @@ ${r}`:r}function p_(t,e){let r=HA({input:t.stdout}),n=new Map,s=(o,a={})=>new Pr
1798
1798
  `),1;if(!c.ok){let m=await c.text();return e.stderr.write(`error: HTTP ${c.status}: ${m}
1799
1799
  `),c.status===400?2:1}let u=await c.json();return r?e.stdout.write(`${JSON.stringify(u,null,2)}
1800
1800
  `):e.stdout.write(`ok: attention ${i} acknowledged; step ${u.step_id} resumed (session_status=${String(u.session_status)})
1801
- `),0}function Lh(t,e,r){return t!=="api.token"||r?e:e.length<=8?"***":`${e.slice(0,8)}\u2026(masked; use --show-secrets to reveal)`}function i0(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===eo||t===to){let r=Number(e);if(!Number.isInteger(r)||r<=0)return`invalid ${t}: ${e}`}return null}function o0(t,e){let r=UR(t),n=r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength),s=new FormData;return s.append("image",new Blob([n],{type:a0(t)}),WR(t)),e!==void 0&&s.append("project",e),s}function a0(t){switch(qR(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 l0(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 d0(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api pr <id|list|get>";if(r==="list")return Ss(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 Ph(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 po(t,e,r){return t.length>0?ie(t[0]):{method:"GET",path:e,accept:r?"application/json":"text/html",json:r}}function Ss(t,e,r,n,s,i=!1){let o;for(let l=0;l<t.length;l+=1){let d=t[l];if(d!==e)return ie(d);let c=t[++l];if(c===void 0||c.startsWith("--"))return`missing value for ${e}`;if(i&&(!/^\d+$/.test(c)||Number(c)<=0))return`invalid ${e}: ${c}`;o=c}let a=o===void 0?"":`?${n}=${encodeURIComponent(o)}`;return{method:"GET",path:`${r}${a}`,accept:s?"application/json":"text/html",json:s}}function Oh(t,e,r,n,s){let i=!1;for(let o of t){if(o!==e)return ie(o);i=!0}return{method:"GET",path:`${r}${i?`?${n}=true`:""}`,accept:s?"application/json":"text/html",json:s}}function c0(t,e,r){if(t.length!==1)return`usage: lmctl api ${r} <id>`;let n=oe(t[0],"id");return typeof n=="string"?n:{method:"GET",path:`${e}/${n}`,accept:"application/json",json:!0}}function u0(t,e){let[r,...n]=t;if(r!==void 0&&n.length===0&&r!=="enqueue"&&r!=="run")return c0([r],"/api/jobs","job");if(r==="enqueue"){let s,i,o="manual",a,l,d;for(let u=0;u<n.length;u+=1){let m=n[u],f=n[++u];if(f===void 0||f.startsWith("--"))return`missing value for ${m}`;if(m==="--project")s=f;else if(m==="--project-id"){let p=Number(f);if(!Number.isInteger(p))return`invalid --project-id: ${f}`;i=p}else if(m==="--source")o=f;else if(m==="--payload")a=f;else if(m==="--dedupe-key")l=f;else if(m==="--priority"){let p=Number(f);if(!Number.isInteger(p))return`invalid --priority: ${f}`;d=p}else return ie(m)}if(s===void 0&&i===void 0)return"usage: lmctl api job enqueue (--project NAME | --project-id ID) [--source S] [--payload JSON] [--dedupe-key K] [--priority N]";let c={source:o};return s!==void 0&&(c.project=s),i!==void 0&&(c.project_id=i),a!==void 0&&(c.payload=ac(a)),l!==void 0&&(c.dedupe_key=l),d!==void 0&&(c.priority=d),{method:"POST",path:"/api/jobs",accept:"application/json",json:e,body:JSON.stringify(c)}}if(r==="run"){if(n.length!==1)return"usage: lmctl api job run <id>";let s=oe(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 m0(t,e){let[r,...n]=t;if(r==="list"){let[s,...i]=n;if(s===void 0||s.startsWith("--"))return"usage: lmctl api issues list <project> [--status STATUS] [--severity SEVERITY] [--ai-test-path P]";let o=new URLSearchParams;for(let l=0;l<i.length;l+=1){let d=i[l],c=i[++l];if(c===void 0||c.startsWith("--"))return`missing value for ${d}`;if(d==="--status")o.set("status",c);else if(d==="--severity")o.set("severity",c);else if(d==="--ai-test-path")o.set("ai_test_path",c);else return ie(d)}let a=o.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=oe(n[0],"id");return typeof s=="string"?s:{method:"GET",path:`/api/issues/${s}`,accept:"application/json",json:e}}return r==="create"?Fh(n,e):r==="claim"?Uh(n,e):r==="claim-next"?Wh(n,e):r==="close"?qh(n,e):r==="reopen"?Bh(n,e):"usage: lmctl api issues <list|show|create|claim|claim-next|close|reopen>"}function Fh(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"]),i={};for(let o=0;o<n.length;o+=1){let a=n[o],l=n[++o];if(l===void 0)return`missing value for ${a}`;if(!s.has(a)&&l.startsWith("--"))return`missing value for ${a}`;if(a==="--title")i.title=l;else if(a==="--body")i.body=l;else if(a==="--severity")i.severity=l;else if(a==="--labels")i.labels=ac(l);else if(a==="--ai-test-path")i.ai_test_path=l;else if(a==="--source-run-id"){let d=oe(l,"--source-run-id");if(typeof d=="string")return d;i.source_run_id=d}else return ie(a)}return typeof i.title!="string"?"missing value for --title":typeof i.body!="string"?"missing value for --body":{method:"POST",path:`/api/projects/${encodeURIComponent(r)}/issues`,accept:"application/json",json:e,body:JSON.stringify(i)}}function Uh(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api issues claim <id> --assigned-run-id RUN";let s=oe(r,"id");if(typeof s=="string")return s;let i={};for(let o=0;o<n.length;o+=1){let a=n[o],l=n[++o];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--assigned-run-id"){let d=oe(l,"--assigned-run-id");if(typeof d=="string")return d;i.assigned_run_id=d}else return ie(a)}return typeof i.assigned_run_id!="number"?"missing value for --assigned-run-id":{method:"POST",path:`/api/issues/${s}/claim`,accept:"application/json",json:e,body:JSON.stringify(i)}}function Wh(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 i=0;i<n.length;i+=1){let o=n[i],a=n[++i];if(a===void 0||a.startsWith("--"))return`missing value for ${o}`;if(o==="--assigned-run-id"){let l=oe(a,"--assigned-run-id");if(typeof l=="string")return l;s.assigned_run_id=l}else return ie(o)}return typeof s.assigned_run_id!="number"?"missing value for --assigned-run-id":{method:"POST",path:`/api/projects/${encodeURIComponent(r)}/issues/claim-next`,accept:"application/json",json:e,body:JSON.stringify(s)}}function qh(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=oe(r,"id");if(typeof s=="string")return s;let i={};for(let o=0;o<n.length;o+=1){let a=n[o],l=n[++o];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--commit-hash")i.commit_hash=l;else if(a==="--closed-run-id"){let d=oe(l,"--closed-run-id");if(typeof d=="string")return d;i.closed_run_id=d}else return ie(a)}return{method:"POST",path:`/api/issues/${s}/close`,accept:"application/json",json:e,body:JSON.stringify(i)}}function Bh(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api issues reopen <id> [--source-run-id RUN]";let s=oe(r,"id");if(typeof s=="string")return s;let i={};for(let o=0;o<n.length;o+=1){let a=n[o],l=n[++o];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--source-run-id"){let d=oe(l,"--source-run-id");if(typeof d=="string")return d;i.source_run_id=d}else return ie(a)}return{method:"POST",path:`/api/issues/${s}/reopen`,accept:"application/json",json:e,body:JSON.stringify(i)}}function f0(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 i=0;i<n.length;i+=1){let o=n[i];if(o!=="--project")return ie(o);let a=n[++i];if(a===void 0||a.startsWith("--"))return"missing value for --project";s=a}return{method:"POST",path:"/api/uploads",accept:"application/json",json:e,upload:{filePath:r,project:s}}}function p0(t,e){let r,n,s,i;for(let a=0;a<t.length;a+=1){let l=t[a],d=t[++a];if(d===void 0||d.startsWith("--"))return`missing value for ${l}`;if(l==="--workflow")r=d;else if(l==="--workflow-id-override"){let c=Number(d);if(!Number.isInteger(c)||c<=0)return`invalid --workflow-id-override: ${d}`;n=c}else if(l==="--project")s=d;else if(l==="--inputs")try{let c=JSON.parse(d);if(c===null||typeof c!="object"||Array.isArray(c))return"--inputs must be a JSON object";i=c}catch{return"invalid --inputs JSON"}else return ie(l)}if(r===void 0&&n===void 0)return"missing value for --workflow";if(i===void 0)return"missing value for --inputs";let o={source:"api-submit-job",payload:i};return r!==void 0&&(o.workflow=r),n!==void 0&&(o.workflow_id_override=n),s!==void 0&&(o.project=s),{method:"POST",path:"/api/jobs",accept:"application/json",json:e,body:JSON.stringify(o),runAfterSubmit:!0}}function ac(t){try{return JSON.parse(t)}catch{return t}}function _0(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 h0(t,e){for(let r of t)if(!(r==="--json"||r==="--text"))return ie(r);return{method:"GET",path:"/api/workflows/verify",accept:e==="text"?"text/plain":"application/json",json:e!=="text"}}function g0(t,e){let[r,n,...s]=t;return r==="workflow"?y0([n,...s].filter(i=>i!==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 y0(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=oe(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=oe(n[0],"id");if(typeof s=="string")return s;let i=r==="remove"?"DELETE":"POST",o=r==="remove"?"":`/${r}`;return{method:i,path:`/api/projects/workflows/${s}${o}`,accept:"application/json",json:e}}if(r==="add"){let s=E0(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 E0(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 i=0;i<n.length;i+=1){let o=n[i],a=n[++i];if(a===void 0||a.startsWith("--"))return`missing value for ${o}`;if(o==="--condition")s.condition=a;else if(o==="--params")s.params=ac(a);else if(o==="--priority"){let l=Number(a);if(!Number.isInteger(l))return`invalid --priority: ${a}`;s.priority=l}else return ie(o)}return{project:e,body:s}}function w0(t,e){if(t[0]!=="get")return"usage: lmctl api artifact get --run R --kind K [--raw]";let r,n,s=!1;for(let o=1;o<t.length;o+=1){let a=t[o];if(a==="--raw"){s=!0;continue}let l=t[++o];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--run"){let d=oe(l,"run");if(typeof d=="string")return d;r=d}else if(a==="--kind")n=l;else return ie(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 T0(t,e){if(t[0]!=="ack"||t.length!==2)return"usage: lmctl api attention ack <id>";let r=oe(t[1],"id");return typeof r=="string"?r:{method:"POST",path:`/api/attentions/${r}/ack`,accept:e?"application/json":"text/html",json:e}}function v0(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 S0(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 b0(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 k0(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=Zi(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 I0(t,e){let[r,n,s,i]=t;if(r!==void 0&&/^\d+$/.test(r)&&n===void 0){let o=oe(r,"run_id");return typeof o=="string"?o:{method:"GET",path:`/api/runs/${o}`,accept:"application/json",json:e!=="text"}}if(r==="resume"){if(n===void 0)return"usage: lmctl api run resume <run_id> --outcome <value>";let o=oe(n,"run_id");if(typeof o=="string")return o;let a;for(let l=2;l<t.length;l+=1){let d=t[l];if(d!=="--outcome")return ie(d);let c=t[++l];if(c===void 0||c.startsWith("--"))return"missing value for --outcome";a=c}return a===void 0?"missing value for --outcome":{method:"POST",path:`/api/runs/${o}/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 o=oe(n,"run_id");return typeof o=="string"?o:{method:"GET",path:`/api/runs/${o}`,accept:"application/json",json:e!=="text"}}if(r==="step"||r==="transcript"||r==="messages"){if(n===void 0||s===void 0||i!==void 0)return`usage: lmctl api run ${r} <run_id> <step_id>`;let o=oe(n,"run_id");if(typeof o=="string")return o;let a=oe(s,"step_id");if(typeof a=="string")return a;let l=r==="step"?"":`/${r}`,d=r==="transcript"&&e==="text";return{method:"GET",path:`/api/runs/${o}/steps/${a}${l}`,accept:d?"text/plain":"application/json",json:!d}}if(r==="artifacts"){if(n===void 0)return"usage: lmctl api run artifacts <run_id> [--kind K]";let o=oe(n,"run_id");if(typeof o=="string")return o;let a;for(let d=2;d<t.length;d+=1){let c=t[d];if(c!=="--kind")return ie(c);let u=t[++d];if(u===void 0)return"missing value for --kind";a=u}let l=a===void 0?"":`?kind=${encodeURIComponent(a)}`;return{method:"GET",path:`/api/runs/${o}/artifacts${l}`,accept:"application/json",json:e!=="text"}}if(r==="where"){if(n===void 0||s!==void 0)return"usage: lmctl api run where <run_id>";let o=oe(n,"run_id");return typeof o=="string"?o:{method:"GET",path:`/api/runs/${o}/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 o=oe(n,"run_id");return typeof o=="string"?o:{method:"GET",path:`/api/runs/${o}/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 oe(t,e){return t===void 0||t.startsWith("--")?`missing value for ${e}`:!/^\d+$/.test(t)||Number(t)<=0?`invalid ${e}: ${t}`:Number(t)}function ie(t){return t.startsWith("--")?`unknown flag: ${t}`:`unknown argument: ${t}`}function Hh(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 N0(t,e){let r=Ph(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
1801
+ `),0}function Lh(t,e,r){return t!=="api.token"||r?e:e.length<=8?"***":`${e.slice(0,8)}\u2026(masked; use --show-secrets to reveal)`}function i0(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===eo||t===to){let r=Number(e);if(!Number.isInteger(r)||r<=0)return`invalid ${t}: ${e}`}return null}function o0(t,e){let r=UR(t),n=r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength),s=new FormData;return s.append("image",new Blob([n],{type:a0(t)}),WR(t)),e!==void 0&&s.append("project",e),s}function a0(t){switch(qR(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 l0(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 d0(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api pr <id|list|get>";if(r==="list")return Ss(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 Ph(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 po(t,e,r){return t.length>0?ie(t[0]):{method:"GET",path:e,accept:r?"application/json":"text/html",json:r}}function Ss(t,e,r,n,s,i=!1){let o;for(let l=0;l<t.length;l+=1){let d=t[l];if(d!==e)return ie(d);let c=t[++l];if(c===void 0||c.startsWith("--"))return`missing value for ${e}`;if(i&&(!/^\d+$/.test(c)||Number(c)<=0))return`invalid ${e}: ${c}`;o=c}let a=o===void 0?"":`?${n}=${encodeURIComponent(o)}`;return{method:"GET",path:`${r}${a}`,accept:s?"application/json":"text/html",json:s}}function Oh(t,e,r,n,s){let i=!1;for(let o of t){if(o!==e)return ie(o);i=!0}return{method:"GET",path:`${r}${i?`?${n}=true`:""}`,accept:s?"application/json":"text/html",json:s}}function c0(t,e,r){if(t.length!==1)return`usage: lmctl api ${r} <id>`;let n=oe(t[0],"id");return typeof n=="string"?n:{method:"GET",path:`${e}/${n}`,accept:"application/json",json:!0}}function u0(t,e){let[r,...n]=t;if(r!==void 0&&n.length===0&&r!=="enqueue"&&r!=="run")return c0([r],"/api/jobs","job");if(r==="enqueue"){let s,i,o="manual",a,l,d;for(let u=0;u<n.length;u+=1){let m=n[u],f=n[++u];if(f===void 0||f.startsWith("--"))return`missing value for ${m}`;if(m==="--project")s=f;else if(m==="--project-id"){let p=Number(f);if(!Number.isInteger(p))return`invalid --project-id: ${f}`;i=p}else if(m==="--source")o=f;else if(m==="--payload")a=f;else if(m==="--dedupe-key")l=f;else if(m==="--priority"){let p=Number(f);if(!Number.isInteger(p))return`invalid --priority: ${f}`;d=p}else return ie(m)}if(s===void 0&&i===void 0)return"usage: lmctl api job enqueue (--project NAME | --project-id ID) [--source S] [--payload JSON] [--dedupe-key K] [--priority N]";let c={source:o};return s!==void 0&&(c.project=s),i!==void 0&&(c.project_id=i),a!==void 0&&(c.payload=oc(a)),l!==void 0&&(c.dedupe_key=l),d!==void 0&&(c.priority=d),{method:"POST",path:"/api/jobs",accept:"application/json",json:e,body:JSON.stringify(c)}}if(r==="run"){if(n.length!==1)return"usage: lmctl api job run <id>";let s=oe(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 m0(t,e){let[r,...n]=t;if(r==="list"){let[s,...i]=n;if(s===void 0||s.startsWith("--"))return"usage: lmctl api issues list <project> [--status STATUS] [--severity SEVERITY] [--ai-test-path P]";let o=new URLSearchParams;for(let l=0;l<i.length;l+=1){let d=i[l],c=i[++l];if(c===void 0||c.startsWith("--"))return`missing value for ${d}`;if(d==="--status")o.set("status",c);else if(d==="--severity")o.set("severity",c);else if(d==="--ai-test-path")o.set("ai_test_path",c);else return ie(d)}let a=o.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=oe(n[0],"id");return typeof s=="string"?s:{method:"GET",path:`/api/issues/${s}`,accept:"application/json",json:e}}return r==="create"?Fh(n,e):r==="claim"?Uh(n,e):r==="claim-next"?Wh(n,e):r==="close"?qh(n,e):r==="reopen"?Bh(n,e):"usage: lmctl api issues <list|show|create|claim|claim-next|close|reopen>"}function Fh(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"]),i={};for(let o=0;o<n.length;o+=1){let a=n[o],l=n[++o];if(l===void 0)return`missing value for ${a}`;if(!s.has(a)&&l.startsWith("--"))return`missing value for ${a}`;if(a==="--title")i.title=l;else if(a==="--body")i.body=l;else if(a==="--severity")i.severity=l;else if(a==="--labels")i.labels=oc(l);else if(a==="--ai-test-path")i.ai_test_path=l;else if(a==="--source-run-id"){let d=oe(l,"--source-run-id");if(typeof d=="string")return d;i.source_run_id=d}else return ie(a)}return typeof i.title!="string"?"missing value for --title":typeof i.body!="string"?"missing value for --body":{method:"POST",path:`/api/projects/${encodeURIComponent(r)}/issues`,accept:"application/json",json:e,body:JSON.stringify(i)}}function Uh(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api issues claim <id> --assigned-run-id RUN";let s=oe(r,"id");if(typeof s=="string")return s;let i={};for(let o=0;o<n.length;o+=1){let a=n[o],l=n[++o];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--assigned-run-id"){let d=oe(l,"--assigned-run-id");if(typeof d=="string")return d;i.assigned_run_id=d}else return ie(a)}return typeof i.assigned_run_id!="number"?"missing value for --assigned-run-id":{method:"POST",path:`/api/issues/${s}/claim`,accept:"application/json",json:e,body:JSON.stringify(i)}}function Wh(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 i=0;i<n.length;i+=1){let o=n[i],a=n[++i];if(a===void 0||a.startsWith("--"))return`missing value for ${o}`;if(o==="--assigned-run-id"){let l=oe(a,"--assigned-run-id");if(typeof l=="string")return l;s.assigned_run_id=l}else return ie(o)}return typeof s.assigned_run_id!="number"?"missing value for --assigned-run-id":{method:"POST",path:`/api/projects/${encodeURIComponent(r)}/issues/claim-next`,accept:"application/json",json:e,body:JSON.stringify(s)}}function qh(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=oe(r,"id");if(typeof s=="string")return s;let i={};for(let o=0;o<n.length;o+=1){let a=n[o],l=n[++o];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--commit-hash")i.commit_hash=l;else if(a==="--closed-run-id"){let d=oe(l,"--closed-run-id");if(typeof d=="string")return d;i.closed_run_id=d}else return ie(a)}return{method:"POST",path:`/api/issues/${s}/close`,accept:"application/json",json:e,body:JSON.stringify(i)}}function Bh(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api issues reopen <id> [--source-run-id RUN]";let s=oe(r,"id");if(typeof s=="string")return s;let i={};for(let o=0;o<n.length;o+=1){let a=n[o],l=n[++o];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--source-run-id"){let d=oe(l,"--source-run-id");if(typeof d=="string")return d;i.source_run_id=d}else return ie(a)}return{method:"POST",path:`/api/issues/${s}/reopen`,accept:"application/json",json:e,body:JSON.stringify(i)}}function f0(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 i=0;i<n.length;i+=1){let o=n[i];if(o!=="--project")return ie(o);let a=n[++i];if(a===void 0||a.startsWith("--"))return"missing value for --project";s=a}return{method:"POST",path:"/api/uploads",accept:"application/json",json:e,upload:{filePath:r,project:s}}}function p0(t,e){let r,n,s,i;for(let a=0;a<t.length;a+=1){let l=t[a],d=t[++a];if(d===void 0||d.startsWith("--"))return`missing value for ${l}`;if(l==="--workflow")r=d;else if(l==="--workflow-id-override"){let c=Number(d);if(!Number.isInteger(c)||c<=0)return`invalid --workflow-id-override: ${d}`;n=c}else if(l==="--project")s=d;else if(l==="--inputs")try{let c=JSON.parse(d);if(c===null||typeof c!="object"||Array.isArray(c))return"--inputs must be a JSON object";i=c}catch{return"invalid --inputs JSON"}else return ie(l)}if(r===void 0&&n===void 0)return"missing value for --workflow";if(i===void 0)return"missing value for --inputs";let o={source:"api-submit-job",payload:i};return r!==void 0&&(o.workflow=r),n!==void 0&&(o.workflow_id_override=n),s!==void 0&&(o.project=s),{method:"POST",path:"/api/jobs",accept:"application/json",json:e,body:JSON.stringify(o),runAfterSubmit:!0}}function oc(t){try{return JSON.parse(t)}catch{return t}}function _0(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 h0(t,e){for(let r of t)if(!(r==="--json"||r==="--text"))return ie(r);return{method:"GET",path:"/api/workflows/verify",accept:e==="text"?"text/plain":"application/json",json:e!=="text"}}function g0(t,e){let[r,n,...s]=t;return r==="workflow"?y0([n,...s].filter(i=>i!==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 y0(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=oe(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=oe(n[0],"id");if(typeof s=="string")return s;let i=r==="remove"?"DELETE":"POST",o=r==="remove"?"":`/${r}`;return{method:i,path:`/api/projects/workflows/${s}${o}`,accept:"application/json",json:e}}if(r==="add"){let s=E0(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 E0(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 i=0;i<n.length;i+=1){let o=n[i],a=n[++i];if(a===void 0||a.startsWith("--"))return`missing value for ${o}`;if(o==="--condition")s.condition=a;else if(o==="--params")s.params=oc(a);else if(o==="--priority"){let l=Number(a);if(!Number.isInteger(l))return`invalid --priority: ${a}`;s.priority=l}else return ie(o)}return{project:e,body:s}}function w0(t,e){if(t[0]!=="get")return"usage: lmctl api artifact get --run R --kind K [--raw]";let r,n,s=!1;for(let o=1;o<t.length;o+=1){let a=t[o];if(a==="--raw"){s=!0;continue}let l=t[++o];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--run"){let d=oe(l,"run");if(typeof d=="string")return d;r=d}else if(a==="--kind")n=l;else return ie(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 T0(t,e){if(t[0]!=="ack"||t.length!==2)return"usage: lmctl api attention ack <id>";let r=oe(t[1],"id");return typeof r=="string"?r:{method:"POST",path:`/api/attentions/${r}/ack`,accept:e?"application/json":"text/html",json:e}}function v0(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 S0(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 b0(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 k0(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=Zi(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 I0(t,e){let[r,n,s,i]=t;if(r!==void 0&&/^\d+$/.test(r)&&n===void 0){let o=oe(r,"run_id");return typeof o=="string"?o:{method:"GET",path:`/api/runs/${o}`,accept:"application/json",json:e!=="text"}}if(r==="resume"){if(n===void 0)return"usage: lmctl api run resume <run_id> --outcome <value>";let o=oe(n,"run_id");if(typeof o=="string")return o;let a;for(let l=2;l<t.length;l+=1){let d=t[l];if(d!=="--outcome")return ie(d);let c=t[++l];if(c===void 0||c.startsWith("--"))return"missing value for --outcome";a=c}return a===void 0?"missing value for --outcome":{method:"POST",path:`/api/runs/${o}/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 o=oe(n,"run_id");return typeof o=="string"?o:{method:"GET",path:`/api/runs/${o}`,accept:"application/json",json:e!=="text"}}if(r==="step"||r==="transcript"||r==="messages"){if(n===void 0||s===void 0||i!==void 0)return`usage: lmctl api run ${r} <run_id> <step_id>`;let o=oe(n,"run_id");if(typeof o=="string")return o;let a=oe(s,"step_id");if(typeof a=="string")return a;let l=r==="step"?"":`/${r}`,d=r==="transcript"&&e==="text";return{method:"GET",path:`/api/runs/${o}/steps/${a}${l}`,accept:d?"text/plain":"application/json",json:!d}}if(r==="artifacts"){if(n===void 0)return"usage: lmctl api run artifacts <run_id> [--kind K]";let o=oe(n,"run_id");if(typeof o=="string")return o;let a;for(let d=2;d<t.length;d+=1){let c=t[d];if(c!=="--kind")return ie(c);let u=t[++d];if(u===void 0)return"missing value for --kind";a=u}let l=a===void 0?"":`?kind=${encodeURIComponent(a)}`;return{method:"GET",path:`/api/runs/${o}/artifacts${l}`,accept:"application/json",json:e!=="text"}}if(r==="where"){if(n===void 0||s!==void 0)return"usage: lmctl api run where <run_id>";let o=oe(n,"run_id");return typeof o=="string"?o:{method:"GET",path:`/api/runs/${o}/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 o=oe(n,"run_id");return typeof o=="string"?o:{method:"GET",path:`/api/runs/${o}/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 oe(t,e){return t===void 0||t.startsWith("--")?`missing value for ${e}`:!/^\d+$/.test(t)||Number(t)<=0?`invalid ${e}: ${t}`:Number(t)}function ie(t){return t.startsWith("--")?`unknown flag: ${t}`:`unknown argument: ${t}`}function Hh(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 N0(t,e){let r=Ph(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
1802
1802
  `),2;let n=r.args,s=r.format!=="text",[i,...o]=n;if(i===void 0)return e.stderr.write(`error: --direct requires a subcommand (issues|status|projects|workflows|runs|attentions)
1803
1803
  `),2;let a=e.dal===void 0,l=e.dal??Je({path:Q()});try{if(i==="issues"){let[d,...c]=o;return d===void 0?(e.stderr.write(`error: --direct issues requires a subcommand (list|show|create|claim|claim-next|close|reopen)
1804
1804
  `),2):d==="create"?A0(l,c,e,s):d==="claim"?x0(l,c,e,s):d==="claim-next"?R0(l,c,e,s):d==="close"?L0(l,c,e,s):d==="reopen"?O0(l,c,e,s):d==="list"?D0(l,c,e,s):d==="show"?j0(l,c,e,s):(e.stderr.write(`error: --direct does not support: issues ${d} (supported: list, show, create, claim, claim-next, close, reopen)
@@ -1885,7 +1885,7 @@ ${r}`:r}function p_(t,e){let r=HA({input:t.stdout}),n=new Map,s=(o,a={})=>new Pr
1885
1885
  `),2;let c=t.resumeInteractive(l.step_id,a,s);if(!c.resumed)return r.stderr.write(`error: interactive respond failed: ${c.reason} (step_id=${l.step_id})
1886
1886
  `),2;let u=t.acknowledgeAttention(o),m={ok:!0,attention_id:o,step_id:l.step_id,session_status:c.session.status,acknowledged_at:u?.acknowledged_at??null};return n?r.stdout.write(`${JSON.stringify(m,null,2)}
1887
1887
  `):r.stdout.write(`ok: attention ${o} acknowledged; step ${l.step_id} resumed (session_status=${m.session_status})
1888
- `),0}function $h(t,e){let r=t.split(",").map(n=>n.trim()).filter(n=>n.length>0);if(r.length===0)return`invalid value: ${t}`;for(let n of r)if(!e.includes(n))return`invalid value: ${n}`;return r}var BR,HR,Ch,fo,KR,YR,zR,ZR,M0,lc=E(()=>{"use strict";ct();Ye();Qi();tc();Vt();BR="http://127.0.0.1:8787",HR=`usage: lmctl api [--direct] <subcommand> ...
1888
+ `),0}function $h(t,e){let r=t.split(",").map(n=>n.trim()).filter(n=>n.length>0);if(r.length===0)return`invalid value: ${t}`;for(let n of r)if(!e.includes(n))return`invalid value: ${n}`;return r}var BR,HR,Ch,fo,KR,YR,zR,ZR,M0,ac=E(()=>{"use strict";ct();Ye();Qi();ec();Vt();BR="http://127.0.0.1:8787",HR=`usage: lmctl api [--direct] <subcommand> ...
1889
1889
 
1890
1890
  Call the lmctl HTTP API using the configured daemon URL/token (see
1891
1891
  \`api config\`). Most subcommands require a running \`lmctl serve\`.
@@ -2024,27 +2024,27 @@ and \`lmctl api escalations\` (no args) print detailed usage.
2024
2024
 
2025
2025
  Verify every workflows/*.compound.json file: load/validate the workflow graph
2026
2026
  and report the first step that would be started. Default output is the TTY
2027
- table; --json emits the structured WorkflowVerifyReport payload.`;M0=["open","assigned","closed","reopened"]});import Gh from"jexl";function Tn(t){Gh.compile(Vh(t))}async function Ur(t,e){return Gh.eval(Vh(t),e)}function Vh(t){return t.replace(/([A-Za-z_$][\w$.[\]]*)\.includes\(([^()]+)\)/g,"($2 in $1)")}var ks=E(()=>{"use strict"});import{z as w}from"zod";function _c(t){let e=t.trim();return e.startsWith("={{")&&e.endsWith("}}")?e.slice(3,-2).trim():t}var K0,Kh,dc,cc,uc,mc,fc,pc,Yh,Y0,z0,Z0,Is,Q0,ho,go,yo,Eo,wo,zh,eL,tL,rL,nL,To,vn=E(()=>{"use strict";ks();K0=w.object({kind:w.enum(["success","neutral","failure"])}),Kh=w.enum(["string","number","boolean","object","array"]),dc=w.object({name:w.string().min(1),type:Kh,required:w.boolean().optional(),default:w.unknown().optional(),description:w.string().optional()}),cc=w.object({name:w.string().min(1),type:Kh,source_step_id:w.string().min(1),source_field:w.string().min(1),description:w.string().optional()}),uc=w.object({id:w.string().min(1),type:w.string().min(1),parameters:w.record(w.string(),w.unknown()).default({})}),mc="__failure__",fc=w.object({tools:w.array(w.string().min(1)).optional(),auth:w.array(w.string().min(1)).optional()}).strict().optional(),pc=w.object({on_unhandled_failure:w.object({attention_kind:w.string().min(1).default("workflow_failed"),severity:w.enum(["warn","error","critical"]).default("warn"),capture_evidence:w.boolean().default(!0),recommend_recovery:w.string().min(1).optional()}).optional(),on_unhandled_failure_state:w.string().min(1).optional()}).optional(),Yh=w.object({type:w.literal("AssertRepoClean"),fail_message:w.string().min(1).optional(),next:w.string().min(1)}),Y0=w.object({name:w.string().min(1),command:w.string().min(1).optional(),args:w.array(w.string()).optional(),env:w.record(w.string(),w.string()).optional(),type:w.enum(["stdio","http","sse"]).optional(),url:w.string().min(1).optional(),headers:w.record(w.string(),w.string()).optional()}).strict(),z0=w.union([w.string().min(1),Y0]),Z0=w.union([w.string().min(1),w.object({name:w.string().min(1),content:w.string().min(1)}).strict()]),Is=w.object({team:w.string().min(1),alias:w.string().min(1),prompt_template:w.string().optional(),mcp:w.array(z0).optional(),skills:w.array(Z0).optional()}),Q0=w.object({kind:w.literal("shell"),command:w.string().min(1),description:w.string().optional()}),ho=w.object({type:w.literal("Review"),state_name:w.string().min(1),coder:Is,pre_checks:w.array(Q0).optional(),reviewers:w.array(Is.extend({rubric_artifact:w.string().optional()})).optional(),outcomes:w.object({approve:w.string().min(1),request_changes:w.string().optional(),fail_pre_check:w.string().optional(),max_loops_exceeded:w.string().optional()}),writes_to_project_path:w.boolean().optional(),durable_memory_tags:w.array(w.string().min(1)).optional(),write_back_durable_memory:w.union([w.boolean(),w.string().min(1)]).optional(),max_loops:w.number().int().positive().default(5),loop_feedback_artifact:w.string().optional(),outcomes_from_stance:w.record(w.string(),w.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"})}),go=w.object({type:w.literal("Consolidate"),state_name:w.string().min(1),researchers:w.array(Is.extend({topic:w.string().min(1)})).optional(),consolidator:Is,outcomes:w.object({ok:w.string().min(1),error:w.string().optional()}),research_artifact_prefix:w.string().optional(),durable_memory_tags:w.array(w.string().min(1)).optional(),write_back_durable_memory:w.union([w.boolean(),w.string().min(1)]).optional()}),yo=w.object({type:w.literal("Interactive"),state_name:w.string().min(1),agent:Is.extend({initial_prompt_template:w.string().min(1)}),termination:w.object({operator_signal:w.boolean().default(!0),agent_signal:w.string().optional(),max_turns:w.number().int().positive().default(20),timeout_seconds:w.number().int().positive().optional()}),outcomes:w.object({done:w.string().min(1),timeout:w.string().optional()}),artifact_name:w.string().optional(),durable_memory_tags:w.array(w.string().min(1)).optional(),write_back_durable_memory:w.union([w.boolean(),w.string().min(1)]).optional()}),Eo=w.object({type:w.literal("Loop"),state_name:w.string().min(1),over:w.string().min(1),item_var:w.string().min(1),body:w.string().min(1),outcomes:w.object({ok:w.string().min(1),error:w.string().optional()}),stop_on_error:w.boolean().default(!0),max_items:w.number().int().positive().default(1e3)}),wo=w.object({type:w.literal("ShellStep"),state_name:w.string().min(1),command:w.string().min(1),outcomes_from_exit:w.record(w.string(),w.string().min(1)),timeout_ms:w.number().int().nonnegative().optional(),capture_output_to:w.string().optional(),writes_to_project_path:w.boolean().optional()}),zh=w.object({type:w.literal("Choice"),state_name:w.string().min(1),branches:w.array(w.object({when:w.string().min(1),next:w.string().min(1)})).default([]),default_next:w.string().min(1).optional()}).superRefine((t,e)=>{for(let[r,n]of t.branches.entries())try{Tn(_c(n.when))}catch(s){let i=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["branches",r,"when"],message:`invalid jexl expression: ${i}`})}}),eL=w.discriminatedUnion("type",[Yh,ho,go,yo,Eo,wo,zh]),tL=w.object({type:w.literal("ForEach"),state_name:w.string().min(1),items_from:w.string().min(1),mode:w.enum(["sequential","parallel"]).default("sequential"),max_concurrency:w.number().int().positive().default(1),on_item_failure:w.enum(["continue","stop"]).default("stop"),body:eL,outcomes:w.object({all_ok:w.string().min(1),any_failed:w.string().optional()})}).superRefine((t,e)=>{try{Tn(_c(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}`})}}),rL=w.object({type:w.literal("Subflow"),state_name:w.string().min(1),workflow_name:w.string().min(1),inputs:w.record(w.string(),w.string().min(1)).optional(),outcomes:w.record(w.string(),w.string().min(1))}).superRefine((t,e)=>{for(let[r,n]of Object.entries(t.inputs??{}))try{Tn(_c(n))}catch(s){let i=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["inputs",r],message:`invalid jexl expression: ${i}`})}}),nL=w.discriminatedUnion("type",[Yh,ho,go,yo,Eo,wo,zh,tL,rL]),To=w.object({name:w.string().min(1),version:w.number().int().positive(),definition_schema_version:w.union([w.literal(1),w.literal(2)]),description:w.string().optional(),estimated_duration_ms:w.number().int().nonnegative().optional(),primitive_version:w.union([w.literal(1),w.literal(2)]).default(1),start_at:w.string().min(1),states:w.record(w.string().min(1),nL),terminals:w.record(w.string().min(1),K0),errors:pc,concurrency_key:w.string().min(1).optional(),concurrent_limit:w.number().int().positive().optional(),default_task_timeout_ms:w.number().int().positive().max(216e5).optional(),inputs:w.array(dc).optional(),outputs:w.array(cc).optional(),triggers:w.array(uc).optional(),read_only:w.boolean().optional(),requires:fc}).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 as V}from"zod";var sL,vo,iL,oL,aL,$t,Sn=E(()=>{"use strict";vn();sL=/^s-[a-z0-9-]+-[a-f0-9]{4}$/,vo=V.string().regex(sL),iL=V.object({step_id:vo,type:V.literal("main"),index:V.number().int().min(0)}),oL=V.record(vo,V.record(V.string().min(1),V.array(V.array(iL)))),aL=V.object({id:vo,name:V.string().min(1),type:V.string().min(1),typeVersion:V.number().int().positive().default(1),parameters:V.record(V.string(),V.unknown()).default({}),members:V.record(V.string(),V.unknown()).optional(),estimated_duration_ms:V.number().int().nonnegative().optional()}),$t=V.object({schema_version:V.literal("lmctl/v3"),definition_schema_version:V.literal(3),name:V.string().min(1),version:V.number().int().positive(),description:V.string().optional(),estimated_duration_ms:V.number().int().nonnegative().optional(),default_task_timeout_ms:V.number().int().positive().max(216e5).optional(),concurrency_key:V.string().min(1).optional(),concurrent_limit:V.number().int().positive().optional(),errors:pc,inputs:V.array(dc).optional(),outputs:V.array(cc).optional(),steps:V.array(aL).min(1),connections:oL.default({}),entry_step_id:vo,triggers:V.array(uc).optional(),read_only:V.boolean().optional(),requires:fc}).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[i,o]of Object.entries(s))for(let[a,l]of o.entries())for(let[d,c]of l.entries())r.has(c.step_id)||e.addIssue({code:"custom",path:["connections",n,i,a,d,"step_id"],message:`connection target does not reference an existing step: ${c.step_id}`})}})});function So(t){return gc(t)}function gc(t){if(Array.isArray(t))return t.map(gc);if(t===null||typeof t!="object")return t;let e=t,r={};for(let n of Object.keys(e))r[n]=gc(e[n]);if(typeof r.type=="string"){let n=dL[r.type];n!==void 0&&(r.type=n)}return r}var hc,lL,dL,yc=E(()=>{"use strict";hc="lmctl.builtin.",lL={Review:`${hc}Review`,Research:`${hc}Research`,Consolidate:`${hc}Consolidate`},dL=Object.fromEntries(Object.entries(lL).map(([t,e])=>[e,t]))});import{readFileSync as cL}from"node:fs";function eg(t){return uL(t)}function uL(t){let e=So(pL(t));if(fL(e),tg(e)===3)return mL(e);let r=To.safeParse(e);if(!r.success)throw new Kt({errors:r.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message}))});let n=_L(r.data);if(n.errors.length>0||n.unresolvedRefs.length>0)throw new Kt(n);return r.data}function mL(t){let e=$t.safeParse(t);if(!e.success)throw new Kt({errors:e.error.issues.map(r=>({path:r.path.length===0?"$":r.path.map(String).join("."),message:r.message}))});return e.data}function fL(t){if(typeof t!="object"||t===null||!("definition_schema_version"in t))return;let e=tg(t);if(!(e===null||Zh.includes(e)))throw new Kt({errors:[{path:"definition_schema_version",message:`unsupported definition_schema_version ${e}; supported versions: ${Zh.join(", ")}`}]})}function tg(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 pL(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
2028
- `)||e.startsWith("{")||e.startsWith("[")?Qh(t,"$"):e.endsWith(".json")?Qh(cL(e,"utf8"),e):t}function Qh(t,e){try{return JSON.parse(t)}catch(r){let n=r instanceof Error?r.message:"invalid JSON";throw new Kt({errors:[{path:e,message:`invalid JSON: ${n}`}]})}}function _L(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"}),hL(t,n,r);for(let[s,i]of Object.entries(t.states))new Set(Object.keys(t.terminals));return{errors:e,unresolvedRefs:r}}function hL(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 Zh,Kt,rg=E(()=>{"use strict";vn();Sn();yc();Zh=[1,2,3],Kt=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 gL}from"node:crypto";function ng(t,e){let r=yL(e),n=gL("sha1").update(`${t}:${e}`).digest("hex").slice(0,4);return`s-${r}-${n}`}function yL(t){let e=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"step"}var sg=E(()=>{"use strict";Sn()});function TL(t,e){let r=wL[t]??[],n={},s={};for(let[i,o]of Object.entries(e))r.includes(i)?s[i]=o:n[i]=o;return{params:n,members:s}}function lg(t){let e=[],r=(b,I)=>{throw new bn([{line:b,message:I}])},n=t.split(`
2029
- `),s=[];for(let b=0;b<n.length;b+=1){let L=bL(n[b]).trim();L.length>0&&s.push({n:b+1,text:L})}s.length===0&&r(1,"empty composition: expected a `workflow <name> v<version>` header");let i=/^workflow\s+(\S+)\s+v(\d+)$/.exec(s[0].text)??r(s[0].n,`expected header \`workflow <name> v<version>\`, got: ${s[0].text}`),o=i[1],a=Number.parseInt(i[2],10),l=new Map,d=[],c=[],u=[],m,f={},p=new Map,h=new Map,g=new Map,_=(b,I,L,U,j,D)=>{l.has(b)&&r(U,`duplicate step/terminal id: ${b}`),/^[A-Za-z][\w-]*$/.test(b)||r(U,`invalid id (must start with a letter): ${b}`),l.set(b,{declId:b,type:I,params:L,line:U,isTerminal:j,...D?{members:D}:{}}),c.push(b)},y=b=>{let I=[],L=b+1;for(;L<s.length;L+=1){let U=/^([A-Za-z][\w-]*|default)\s*->\s*([A-Za-z][\w-]*)$/.exec(s[L].text);if(U===null)break;I.push({label:U[1],dst:U[2]})}return{branches:I,nextIdx:L-1}};for(let b=1;b<s.length;b+=1){let{n:I,text:L}=s[b],U=L.split(/\s+/,1)[0];if(/^meta\s*\(/.test(L)){b!==1&&r(I,"`meta(...)` must be the preamble \u2014 the FIRST line after the `workflow` header (at most one, before any construct)");let j=/^meta\s*\((.*)\)\s*$/.exec(L)??r(I,`malformed \`meta\` (expected \`meta({ "requires"?:\u2026, "default_task_timeout_ms"?:\u2026, "errors"?:\u2026, "concurrency_key"?:\u2026, "concurrent_limit"?:\u2026 })\`): ${L}`),D=Er(j[1],I,r);for(let Y of Object.keys(D))og.has(Y)||r(I,`unknown \`meta\` key \`${Y}\` \u2014 only workflow-level runtime metadata is allowed: ${[...og].join(", ")} (no grammar inflation; bounded)`);f=D;continue}if(U==="step"){let j=/^step\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(L)??r(I,`malformed \`step\` (expected \`step <id> = <archetype>(k=v, ...)\`): ${L}`),D=j[1],Y=j[2],ye=j[3],de=ig[Y];de===void 0&&r(I,`unknown step type: ${Y} (supported \`step\` archetypes: ${Object.keys(ig).join(", ")}; choice/terminal/loop/foreach/call/decide have their own constructs)`);let{params:be,members:Ft}=TL(de,Er(ye,I,r));_(D,de,be,I,!1,Object.keys(Ft).length>0?Ft:void 0);continue}if(U==="trigger"){let j=/^trigger\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(L)??r(I,`malformed \`trigger\` (expected \`trigger <id> = <trigger-type>({ ...json... })\`): ${L}`),D=j[1],Y=j[2],ye=j[3],de=ag[Y];de===void 0&&r(I,`unknown trigger type: ${Y} (registered trigger archetypes: ${Object.keys(ag).join(", ")})`),p.has(D)&&r(I,`duplicate trigger id: ${D}`),p.set(D,{id:D,type:de,parameters:Er(ye,I,r)});continue}if(U==="mcp"||U==="skill"){let j=new RegExp(`^${U}\\s+([A-Za-z][\\w-]*)\\s*=\\s*(.+)$`).exec(L)??r(I,`malformed \`${U}\` decl (expected \`${U} <name> = {json} | ${U} <name> = "<file|url>"\`): ${L}`),D=j[1],Y=j[2].trim(),ye=U==="mcp"?h:g;ye.has(D)&&r(I,`duplicate ${U} declaration: ${D}`);let de;if(Y.startsWith("{")){let be=Er(Y,I,r);U==="mcp"?de={...be,name:D}:((typeof be.content!="string"||be.content.length===0)&&r(I,`\`skill ${D}\`: inline form requires a non-empty string \`content\` (a SKILL.md body)`),de={name:D,content:be.content})}else{let be=dg(Y);(typeof be!="string"||be.length===0)&&r(I,`\`${U} ${D}\`: string form must be a non-empty file path or http(s) URL`),de=be}ye.set(D,de);continue}if(U==="terminal"){let j=/^terminal\s+([A-Za-z][\w-]*)\s*=\s*([A-Za-z][\w-]*)(?:\s+(success|failure|neutral))?\s*$/.exec(L)??r(I,`malformed \`terminal\` (expected \`terminal <id> = <name> [success|failure|neutral]\`): ${L}`);_(j[1],"lmctl/terminal",{name:j[2],kind:j[3]??"neutral"},I,!0);continue}if(U==="seq"){let D=L.slice(3).trim().split(/\s*(->|-[a-z0-9_]+->)\s*/).map(Y=>Y.trim()).filter(Y=>Y.length>0);(D.length<3||D.length%2===0)&&r(I,`malformed \`seq\` (expected \`<id> -> <id> [ -> <id> ... ]\`, optional \`-<port>->\`): ${L}`);for(let Y=0;Y+2<D.length+1&&!(Y+2>D.length-1);Y+=2){let ye=D[Y],de=D[Y+1],be=D[Y+2],Ft=de==="->"?"main":de.slice(1,-2);d.push({srcDeclId:ye,port:Ft,dstDeclId:be,line:I})}continue}if(U==="choice"){let D=(/^choice\s+([A-Za-z][\w-]*)\s*:$/.exec(L)??r(I,`malformed \`choice\` (expected \`choice <id>:\` then \`when <predicate> -<port>-> <id>\` lines): ${L}`))[1],Y=[],ye,de=b+1;for(;de<s.length;de+=1){let be=s[de].text,Ft=/^when\s+(.+)\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(be);if(Ft!==null){ye!==void 0&&r(s[de].n,`\`choice ${D}\`: a \`when\` branch may not follow \`default\` (branches are ordered, default is the fallback)`);let zn=Ft[2];Y.push({when:Ft[1].trim(),next:`@terminal:${zn}`}),d.push({srcDeclId:D,port:zn,dstDeclId:Ft[3],line:s[de].n});continue}let fl=/^default\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(be);if(fl!==null){ye!==void 0&&r(s[de].n,`\`choice ${D}\` has more than one \`default\``);let zn=fl[1];ye=`@terminal:${zn}`,d.push({srcDeclId:D,port:zn,dstDeclId:fl[2],line:s[de].n});continue}break}Y.length===0&&r(I,`\`choice ${D}\` has no \`when\` branches (need \u22651 \`when <jexl-predicate> -<port>-> <id>\`)`),_(D,"lmctl/choice",{branches:Y,...ye!==void 0?{default_next:ye}:{}},I,!1),b=de-1;continue}if(U==="loop"){let j=/^loop\s+([A-Za-z][\w-]*)\s*=\s*loop\s*\((.*)\)\s*$/.exec(L)??r(I,`malformed \`loop\` (expected \`loop <id> = loop(k=v, ...)\`): ${L}`);_(j[1],"lmctl/loop",Er(j[2],I,r),I,!1);continue}if(U==="foreach"){let j=/^foreach\s+([A-Za-z][\w-]*)\s*=\s*foreach\s*\((.*)\)\s*$/.exec(L)??r(I,`malformed \`foreach\` (expected \`foreach <id> = foreach(items=<expr>, ...)\`): ${L}`),D=Er(j[2],I,r);"mode"in D&&r(I,"foreach is SEQUENTIAL-ONLY: `mode` is not permitted (single-thread; durable-memory/composition-language-design.md \xA7Execution model)"),_(j[1],"lmctl/foreach",D,I,!1);continue}if(U==="call"){let j=/^call\s+([A-Za-z][\w-]*)\s*=\s*call\s*\((.*)\)\s*$/.exec(L)??r(I,`malformed \`call\` (expected \`call <id> = call(workflow=<name>, ...)\`): ${L}`),D=j[1],Y=Er(j[2],I,r),ye=Y.workflow;(typeof ye!="string"||ye.length===0)&&r(I,`\`call ${D}\` requires a \`workflow=<name>\` argument`);let{workflow:de,...be}=Y;_(D,"lmctl/subflow",{workflow_name:ye,...be},I,!1),u.push({declId:D,target:ye,line:I});continue}if(U==="decide"){let j=/^decide\s+([A-Za-z][\w-]*)\s+by\s+agent\s*\((.*)\)\s*:$/.exec(L)??r(I,`malformed \`decide\` (expected \`decide <id> by agent(k=v, ...):\`): ${L}`),D=j[1],Y=Er(j[2],I,r),{branches:ye,nextIdx:de}=y(b);ye.length===0&&r(I,`\`decide ${D}\` has no outcomes (need at least one \`<outcome> -> <id>\`)`),_(D,"lmctl/interactive",{termination:{operator_signal:!0}},I,!1,{agent:Y});for(let be of ye)d.push({srcDeclId:D,port:be.label,dstDeclId:be.dst,line:I});b=de;continue}if(U==="entry"){let j=/^entry\s+([A-Za-z][\w-]*)$/.exec(L)??r(I,`malformed \`entry\` (expected \`entry <id>\`): ${L}`);m!==void 0&&r(I,`duplicate \`entry\` (already set to ${m})`),m=j[1];continue}r(I,`unknown statement \`${U}\` (grammar: workflow / meta / trigger / mcp / skill / step / terminal / seq / choice / loop / foreach / call / decide / entry)`)}c.length===0&&r(s[0].n,"composition declares no steps"),m===void 0&&(m=c[0]),l.has(m)||r(s[0].n,`entry references undeclared step: ${m}`);let T=b=>{if(Array.isArray(b)){for(let L of b)T(L);return}if(typeof b!="object"||b===null)return;let I=b;if(typeof I.alias=="string")for(let[L,U]of[["mcp",h],["skills",g]]){let j=I[L];Array.isArray(j)&&(I[L]=j.map(D=>typeof D=="string"&&U.has(D)?structuredClone(U.get(D)):D))}for(let L of Object.values(I))T(L)};for(let b of c){let I=l.get(b);I.members!==void 0&&T(I.members)}let v=b=>ng(o,b),k=c.map(b=>{let I=l.get(b);return{id:v(b),name:b,type:I.type,typeVersion:1,parameters:I.params,...I.members?{members:I.members}:{}}}),A={};for(let b of d){l.has(b.srcDeclId)||r(b.line,`edge source references undeclared step: ${b.srcDeclId}`),l.has(b.dstDeclId)||r(b.line,`dangling edge target: ${b.dstDeclId} is not declared`),l.get(b.srcDeclId).isTerminal&&r(b.line,`terminal \`${b.srcDeclId}\` cannot have an outgoing edge`);let I=v(b.srcDeclId);A[I]??={},A[I][b.port]!==void 0&&r(b.line,`duplicate edge port \`${b.port}\` on step \`${b.srcDeclId}\``),A[I][b.port]=[[{step_id:v(b.dstDeclId),type:"main",index:0}]]}for(let b of c){let I=l.get(b);vL.has(I.type)||r(I.line,`unknown archetype \`${I.type}\` for step \`${b}\` \u2014 not a registered builtin (src/engine/archetypes/index.ts:17-32)`)}for(let b of u)b.target===o&&r(b.line,`subflow cycle: \`call ${b.declId}\` invokes this workflow (\`${o}\`) \u2014 direct recursion is not allowed (cross-workflow A\u2192B\u2192A cycle detection is deferred to the M3 compile.ts seam)`);let z=new Map;for(let b of d){let I=z.get(b.srcDeclId);I===void 0?z.set(b.srcDeclId,[b.dstDeclId]):I.push(b.dstDeclId)}for(let b of c){let I=l.get(b);if(I.type!=="lmctl/loop")continue;let L=I.params.body;if(typeof L=="string"&&l.has(L)){let U=z.get(b);U===void 0?z.set(b,[L]):U.push(L)}}let Se=new Set([m]),W=[m];for(;W.length>0;){let b=W.shift();for(let I of z.get(b)??[])Se.has(I)||(Se.add(I),W.push(I))}for(let b of c)Se.has(b)||r(l.get(b).line,`step \`${b}\` is unreachable from entry \`${m}\``);let F=new Map;for(let b of d){let I=F.get(b.srcDeclId);I===void 0&&(I=new Set,F.set(b.srcDeclId,I)),I.add(b.port)}let R=new Set(["approve","request_changes","fail_pre_check","max_loops_exceeded"]);for(let b of c){let I=l.get(b);if(I.isTerminal)continue;let L=F.get(b)??new Set;if(I.type==="lmctl/review"){let j=[...L].some(D=>!R.has(D));!L.has("approve")&&!j&&r(I.line,`uncovered outcome: review step \`${b}\` wires neither \`approve\` nor any stance outcome \u2014 route \`approve\` (\`seq ${b} -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 U=SL[I.type];if(U!==void 0)for(let j of U)L.has(j)||r(I.line,`uncovered outcome: required outcome \`${j}\` of step \`${b}\` (\`${I.type}\`) has no connection \u2014 route it (\`seq ${b} -${j}-> <target|terminal>\`)`);else L.size===0&&r(I.line,`uncovered outcome: non-terminal step \`${b}\` (\`${I.type}\`) has no outgoing connection \u2014 wire it with \`seq\` or route to a \`terminal\``)}for(let b of c){let I=l.get(b),L=EL[I.type];if(L===void 0)continue;let U={...I.params,...I.members??{},type:L.v2type,state_name:b,...Object.keys(L.outcomes).length>0?{outcomes:L.outcomes}:{}},j=L.schema.safeParse(U);if(!j.success){let D=j.error.issues[0],Y=D.path.length===0?"$":D.path.map(String).join(".");r(I.line,`step \`${b}\` (\`${I.type}\`) has invalid params for archetype \`${L.v2type}\` at \`${Y}\`: ${D.message} \u2014 this would crash the engine (it derefs this field unguarded). Provide it via the structured form: \`step ${b} = ${I.type.replace("lmctl/","")}({ ... })\``)}}let Z={schema_version:"lmctl/v3",definition_schema_version:3,name:o,version:a,...f,...p.size>0?{triggers:[...p.values()]}:{},steps:k,connections:A,entry_step_id:v(m)},q=$t.safeParse(Z);if(!q.success)throw new bn(q.error.issues.map(b=>({line:s[0].n,message:`emitted V3 invalid at ${b.path.length===0?"$":b.path.map(String).join(".")}: ${b.message}`})));return q.data}function bL(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 Er(t,e,r){let n=t.trim();if(n.length===0)return{};if(n.startsWith("{")){let i;try{i=JSON.parse(n)}catch(o){r(e,`malformed structured args (expected a single-line JSON object): ${o.message}`)}return(i===null||typeof i!="object"||Array.isArray(i))&&r(e,"structured args must be a JSON object"),i}let s={};for(let i of kL(n)){let o=i.indexOf("=");o===-1&&r(e,`malformed arg (expected k=v): ${i}`);let a=i.slice(0,o).trim(),l=i.slice(o+1).trim();/^[A-Za-z_][\w-]*$/.test(a)||r(e,`invalid arg name: ${a}`),s[a]=dg(l)}return s}function kL(t){return t.split(",").map(e=>e.trim()).filter(e=>e.length>0)}function dg(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 EL,wL,ig,bn,vL,SL,og,ag,cg=E(()=>{"use strict";Sn();sg();vn();EL={"lmctl/review":{v2type:"Review",outcomes:{approve:"_"},schema:ho},"lmctl/consolidate":{v2type:"Consolidate",outcomes:{ok:"_"},schema:go},"lmctl/interactive":{v2type:"Interactive",outcomes:{done:"_"},schema:yo},"lmctl/loop":{v2type:"Loop",outcomes:{ok:"_"},schema:Eo},"lmctl/shell-step":{v2type:"ShellStep",outcomes:{},schema:wo}},wL={"lmctl/review":["coder","reviewers"],"lmctl/consolidate":["researchers","consolidator"],"lmctl/interactive":["agent"]};ig={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"},bn=class extends Error{issues;constructor(e){super(`composition DSL compile failed:
2027
+ table; --json emits the structured WorkflowVerifyReport payload.`;M0=["open","assigned","closed","reopened"]});import Gh from"jexl";function Tn(t){Gh.compile(Vh(t))}async function Ur(t,e){return Gh.eval(Vh(t),e)}function Vh(t){return t.replace(/([A-Za-z_$][\w$.[\]]*)\.includes\(([^()]+)\)/g,"($2 in $1)")}var ks=E(()=>{"use strict"});import{z as w}from"zod";function pc(t){let e=t.trim();return e.startsWith("={{")&&e.endsWith("}}")?e.slice(3,-2).trim():t}var K0,Kh,lc,dc,cc,uc,mc,fc,Yh,Y0,z0,Z0,Is,Q0,ho,go,yo,Eo,wo,zh,eL,tL,rL,nL,To,vn=E(()=>{"use strict";ks();K0=w.object({kind:w.enum(["success","neutral","failure"])}),Kh=w.enum(["string","number","boolean","object","array"]),lc=w.object({name:w.string().min(1),type:Kh,required:w.boolean().optional(),default:w.unknown().optional(),description:w.string().optional()}),dc=w.object({name:w.string().min(1),type:Kh,source_step_id:w.string().min(1),source_field:w.string().min(1),description:w.string().optional()}),cc=w.object({id:w.string().min(1),type:w.string().min(1),parameters:w.record(w.string(),w.unknown()).default({})}),uc="__failure__",mc=w.object({tools:w.array(w.string().min(1)).optional(),auth:w.array(w.string().min(1)).optional()}).strict().optional(),fc=w.object({on_unhandled_failure:w.object({attention_kind:w.string().min(1).default("workflow_failed"),severity:w.enum(["warn","error","critical"]).default("warn"),capture_evidence:w.boolean().default(!0),recommend_recovery:w.string().min(1).optional()}).optional(),on_unhandled_failure_state:w.string().min(1).optional()}).optional(),Yh=w.object({type:w.literal("AssertRepoClean"),fail_message:w.string().min(1).optional(),next:w.string().min(1)}),Y0=w.object({name:w.string().min(1),command:w.string().min(1).optional(),args:w.array(w.string()).optional(),env:w.record(w.string(),w.string()).optional(),type:w.enum(["stdio","http","sse"]).optional(),url:w.string().min(1).optional(),headers:w.record(w.string(),w.string()).optional()}).strict(),z0=w.union([w.string().min(1),Y0]),Z0=w.union([w.string().min(1),w.object({name:w.string().min(1),content:w.string().min(1)}).strict()]),Is=w.object({team:w.string().min(1),alias:w.string().min(1),prompt_template:w.string().optional(),mcp:w.array(z0).optional(),skills:w.array(Z0).optional()}),Q0=w.object({kind:w.literal("shell"),command:w.string().min(1),description:w.string().optional()}),ho=w.object({type:w.literal("Review"),state_name:w.string().min(1),coder:Is,pre_checks:w.array(Q0).optional(),reviewers:w.array(Is.extend({rubric_artifact:w.string().optional()})).optional(),outcomes:w.object({approve:w.string().min(1),request_changes:w.string().optional(),fail_pre_check:w.string().optional(),max_loops_exceeded:w.string().optional()}),writes_to_project_path:w.boolean().optional(),durable_memory_tags:w.array(w.string().min(1)).optional(),write_back_durable_memory:w.union([w.boolean(),w.string().min(1)]).optional(),max_loops:w.number().int().positive().default(5),loop_feedback_artifact:w.string().optional(),outcomes_from_stance:w.record(w.string(),w.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"})}),go=w.object({type:w.literal("Consolidate"),state_name:w.string().min(1),researchers:w.array(Is.extend({topic:w.string().min(1)})).optional(),consolidator:Is,outcomes:w.object({ok:w.string().min(1),error:w.string().optional()}),research_artifact_prefix:w.string().optional(),durable_memory_tags:w.array(w.string().min(1)).optional(),write_back_durable_memory:w.union([w.boolean(),w.string().min(1)]).optional()}),yo=w.object({type:w.literal("Interactive"),state_name:w.string().min(1),agent:Is.extend({initial_prompt_template:w.string().min(1)}),termination:w.object({operator_signal:w.boolean().default(!0),agent_signal:w.string().optional(),max_turns:w.number().int().positive().default(20),timeout_seconds:w.number().int().positive().optional()}),outcomes:w.object({done:w.string().min(1),timeout:w.string().optional()}),artifact_name:w.string().optional(),durable_memory_tags:w.array(w.string().min(1)).optional(),write_back_durable_memory:w.union([w.boolean(),w.string().min(1)]).optional()}),Eo=w.object({type:w.literal("Loop"),state_name:w.string().min(1),over:w.string().min(1),item_var:w.string().min(1),body:w.string().min(1),outcomes:w.object({ok:w.string().min(1),error:w.string().optional()}),stop_on_error:w.boolean().default(!0),max_items:w.number().int().positive().default(1e3)}),wo=w.object({type:w.literal("ShellStep"),state_name:w.string().min(1),command:w.string().min(1),outcomes_from_exit:w.record(w.string(),w.string().min(1)),timeout_ms:w.number().int().nonnegative().optional(),capture_output_to:w.string().optional(),writes_to_project_path:w.boolean().optional()}),zh=w.object({type:w.literal("Choice"),state_name:w.string().min(1),branches:w.array(w.object({when:w.string().min(1),next:w.string().min(1)})).default([]),default_next:w.string().min(1).optional()}).superRefine((t,e)=>{for(let[r,n]of t.branches.entries())try{Tn(pc(n.when))}catch(s){let i=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["branches",r,"when"],message:`invalid jexl expression: ${i}`})}}),eL=w.discriminatedUnion("type",[Yh,ho,go,yo,Eo,wo,zh]),tL=w.object({type:w.literal("ForEach"),state_name:w.string().min(1),items_from:w.string().min(1),mode:w.enum(["sequential","parallel"]).default("sequential"),max_concurrency:w.number().int().positive().default(1),on_item_failure:w.enum(["continue","stop"]).default("stop"),body:eL,outcomes:w.object({all_ok:w.string().min(1),any_failed:w.string().optional()})}).superRefine((t,e)=>{try{Tn(pc(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}`})}}),rL=w.object({type:w.literal("Subflow"),state_name:w.string().min(1),workflow_name:w.string().min(1),inputs:w.record(w.string(),w.string().min(1)).optional(),outcomes:w.record(w.string(),w.string().min(1))}).superRefine((t,e)=>{for(let[r,n]of Object.entries(t.inputs??{}))try{Tn(pc(n))}catch(s){let i=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["inputs",r],message:`invalid jexl expression: ${i}`})}}),nL=w.discriminatedUnion("type",[Yh,ho,go,yo,Eo,wo,zh,tL,rL]),To=w.object({name:w.string().min(1),version:w.number().int().positive(),definition_schema_version:w.union([w.literal(1),w.literal(2)]),description:w.string().optional(),estimated_duration_ms:w.number().int().nonnegative().optional(),primitive_version:w.union([w.literal(1),w.literal(2)]).default(1),start_at:w.string().min(1),states:w.record(w.string().min(1),nL),terminals:w.record(w.string().min(1),K0),errors:fc,concurrency_key:w.string().min(1).optional(),concurrent_limit:w.number().int().positive().optional(),default_task_timeout_ms:w.number().int().positive().max(216e5).optional(),inputs:w.array(lc).optional(),outputs:w.array(dc).optional(),triggers:w.array(cc).optional(),read_only:w.boolean().optional(),requires:mc}).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 as V}from"zod";var sL,vo,iL,oL,aL,$t,Sn=E(()=>{"use strict";vn();sL=/^s-[a-z0-9-]+-[a-f0-9]{4}$/,vo=V.string().regex(sL),iL=V.object({step_id:vo,type:V.literal("main"),index:V.number().int().min(0)}),oL=V.record(vo,V.record(V.string().min(1),V.array(V.array(iL)))),aL=V.object({id:vo,name:V.string().min(1),type:V.string().min(1),typeVersion:V.number().int().positive().default(1),parameters:V.record(V.string(),V.unknown()).default({}),members:V.record(V.string(),V.unknown()).optional(),estimated_duration_ms:V.number().int().nonnegative().optional()}),$t=V.object({schema_version:V.literal("lmctl/v3"),definition_schema_version:V.literal(3),name:V.string().min(1),version:V.number().int().positive(),description:V.string().optional(),estimated_duration_ms:V.number().int().nonnegative().optional(),default_task_timeout_ms:V.number().int().positive().max(216e5).optional(),concurrency_key:V.string().min(1).optional(),concurrent_limit:V.number().int().positive().optional(),errors:fc,inputs:V.array(lc).optional(),outputs:V.array(dc).optional(),steps:V.array(aL).min(1),connections:oL.default({}),entry_step_id:vo,triggers:V.array(cc).optional(),read_only:V.boolean().optional(),requires:mc}).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[i,o]of Object.entries(s))for(let[a,l]of o.entries())for(let[d,c]of l.entries())r.has(c.step_id)||e.addIssue({code:"custom",path:["connections",n,i,a,d,"step_id"],message:`connection target does not reference an existing step: ${c.step_id}`})}})});function So(t){return hc(t)}function hc(t){if(Array.isArray(t))return t.map(hc);if(t===null||typeof t!="object")return t;let e=t,r={};for(let n of Object.keys(e))r[n]=hc(e[n]);if(typeof r.type=="string"){let n=dL[r.type];n!==void 0&&(r.type=n)}return r}var _c,lL,dL,gc=E(()=>{"use strict";_c="lmctl.builtin.",lL={Review:`${_c}Review`,Research:`${_c}Research`,Consolidate:`${_c}Consolidate`},dL=Object.fromEntries(Object.entries(lL).map(([t,e])=>[e,t]))});import{readFileSync as cL}from"node:fs";function eg(t){return uL(t)}function uL(t){let e=So(pL(t));if(fL(e),tg(e)===3)return mL(e);let r=To.safeParse(e);if(!r.success)throw new Kt({errors:r.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message}))});let n=_L(r.data);if(n.errors.length>0||n.unresolvedRefs.length>0)throw new Kt(n);return r.data}function mL(t){let e=$t.safeParse(t);if(!e.success)throw new Kt({errors:e.error.issues.map(r=>({path:r.path.length===0?"$":r.path.map(String).join("."),message:r.message}))});return e.data}function fL(t){if(typeof t!="object"||t===null||!("definition_schema_version"in t))return;let e=tg(t);if(!(e===null||Zh.includes(e)))throw new Kt({errors:[{path:"definition_schema_version",message:`unsupported definition_schema_version ${e}; supported versions: ${Zh.join(", ")}`}]})}function tg(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 pL(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
2028
+ `)||e.startsWith("{")||e.startsWith("[")?Qh(t,"$"):e.endsWith(".json")?Qh(cL(e,"utf8"),e):t}function Qh(t,e){try{return JSON.parse(t)}catch(r){let n=r instanceof Error?r.message:"invalid JSON";throw new Kt({errors:[{path:e,message:`invalid JSON: ${n}`}]})}}function _L(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"}),hL(t,n,r);for(let[s,i]of Object.entries(t.states))new Set(Object.keys(t.terminals));return{errors:e,unresolvedRefs:r}}function hL(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 Zh,Kt,rg=E(()=>{"use strict";vn();Sn();gc();Zh=[1,2,3],Kt=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 gL}from"node:crypto";function ng(t,e){let r=yL(e),n=gL("sha1").update(`${t}:${e}`).digest("hex").slice(0,4);return`s-${r}-${n}`}function yL(t){let e=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"step"}var sg=E(()=>{"use strict";Sn()});function TL(t,e){let r=wL[t]??[],n={},s={};for(let[i,o]of Object.entries(e))r.includes(i)?s[i]=o:n[i]=o;return{params:n,members:s}}function lg(t){let e=[],r=(b,I)=>{throw new bn([{line:b,message:I}])},n=t.split(`
2029
+ `),s=[];for(let b=0;b<n.length;b+=1){let L=bL(n[b]).trim();L.length>0&&s.push({n:b+1,text:L})}s.length===0&&r(1,"empty composition: expected a `workflow <name> v<version>` header");let i=/^workflow\s+(\S+)\s+v(\d+)$/.exec(s[0].text)??r(s[0].n,`expected header \`workflow <name> v<version>\`, got: ${s[0].text}`),o=i[1],a=Number.parseInt(i[2],10),l=new Map,d=[],c=[],u=[],m,f={},p=new Map,h=new Map,g=new Map,_=(b,I,L,U,j,D)=>{l.has(b)&&r(U,`duplicate step/terminal id: ${b}`),/^[A-Za-z][\w-]*$/.test(b)||r(U,`invalid id (must start with a letter): ${b}`),l.set(b,{declId:b,type:I,params:L,line:U,isTerminal:j,...D?{members:D}:{}}),c.push(b)},y=b=>{let I=[],L=b+1;for(;L<s.length;L+=1){let U=/^([A-Za-z][\w-]*|default)\s*->\s*([A-Za-z][\w-]*)$/.exec(s[L].text);if(U===null)break;I.push({label:U[1],dst:U[2]})}return{branches:I,nextIdx:L-1}};for(let b=1;b<s.length;b+=1){let{n:I,text:L}=s[b],U=L.split(/\s+/,1)[0];if(/^meta\s*\(/.test(L)){b!==1&&r(I,"`meta(...)` must be the preamble \u2014 the FIRST line after the `workflow` header (at most one, before any construct)");let j=/^meta\s*\((.*)\)\s*$/.exec(L)??r(I,`malformed \`meta\` (expected \`meta({ "requires"?:\u2026, "default_task_timeout_ms"?:\u2026, "errors"?:\u2026, "concurrency_key"?:\u2026, "concurrent_limit"?:\u2026 })\`): ${L}`),D=Er(j[1],I,r);for(let Y of Object.keys(D))og.has(Y)||r(I,`unknown \`meta\` key \`${Y}\` \u2014 only workflow-level runtime metadata is allowed: ${[...og].join(", ")} (no grammar inflation; bounded)`);f=D;continue}if(U==="step"){let j=/^step\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(L)??r(I,`malformed \`step\` (expected \`step <id> = <archetype>(k=v, ...)\`): ${L}`),D=j[1],Y=j[2],ye=j[3],de=ig[Y];de===void 0&&r(I,`unknown step type: ${Y} (supported \`step\` archetypes: ${Object.keys(ig).join(", ")}; choice/terminal/loop/foreach/call/decide have their own constructs)`);let{params:be,members:Ft}=TL(de,Er(ye,I,r));_(D,de,be,I,!1,Object.keys(Ft).length>0?Ft:void 0);continue}if(U==="trigger"){let j=/^trigger\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(L)??r(I,`malformed \`trigger\` (expected \`trigger <id> = <trigger-type>({ ...json... })\`): ${L}`),D=j[1],Y=j[2],ye=j[3],de=ag[Y];de===void 0&&r(I,`unknown trigger type: ${Y} (registered trigger archetypes: ${Object.keys(ag).join(", ")})`),p.has(D)&&r(I,`duplicate trigger id: ${D}`),p.set(D,{id:D,type:de,parameters:Er(ye,I,r)});continue}if(U==="mcp"||U==="skill"){let j=new RegExp(`^${U}\\s+([A-Za-z][\\w-]*)\\s*=\\s*(.+)$`).exec(L)??r(I,`malformed \`${U}\` decl (expected \`${U} <name> = {json} | ${U} <name> = "<file|url>"\`): ${L}`),D=j[1],Y=j[2].trim(),ye=U==="mcp"?h:g;ye.has(D)&&r(I,`duplicate ${U} declaration: ${D}`);let de;if(Y.startsWith("{")){let be=Er(Y,I,r);U==="mcp"?de={...be,name:D}:((typeof be.content!="string"||be.content.length===0)&&r(I,`\`skill ${D}\`: inline form requires a non-empty string \`content\` (a SKILL.md body)`),de={name:D,content:be.content})}else{let be=dg(Y);(typeof be!="string"||be.length===0)&&r(I,`\`${U} ${D}\`: string form must be a non-empty file path or http(s) URL`),de=be}ye.set(D,de);continue}if(U==="terminal"){let j=/^terminal\s+([A-Za-z][\w-]*)\s*=\s*([A-Za-z][\w-]*)(?:\s+(success|failure|neutral))?\s*$/.exec(L)??r(I,`malformed \`terminal\` (expected \`terminal <id> = <name> [success|failure|neutral]\`): ${L}`);_(j[1],"lmctl/terminal",{name:j[2],kind:j[3]??"neutral"},I,!0);continue}if(U==="seq"){let D=L.slice(3).trim().split(/\s*(->|-[a-z0-9_]+->)\s*/).map(Y=>Y.trim()).filter(Y=>Y.length>0);(D.length<3||D.length%2===0)&&r(I,`malformed \`seq\` (expected \`<id> -> <id> [ -> <id> ... ]\`, optional \`-<port>->\`): ${L}`);for(let Y=0;Y+2<D.length+1&&!(Y+2>D.length-1);Y+=2){let ye=D[Y],de=D[Y+1],be=D[Y+2],Ft=de==="->"?"main":de.slice(1,-2);d.push({srcDeclId:ye,port:Ft,dstDeclId:be,line:I})}continue}if(U==="choice"){let D=(/^choice\s+([A-Za-z][\w-]*)\s*:$/.exec(L)??r(I,`malformed \`choice\` (expected \`choice <id>:\` then \`when <predicate> -<port>-> <id>\` lines): ${L}`))[1],Y=[],ye,de=b+1;for(;de<s.length;de+=1){let be=s[de].text,Ft=/^when\s+(.+)\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(be);if(Ft!==null){ye!==void 0&&r(s[de].n,`\`choice ${D}\`: a \`when\` branch may not follow \`default\` (branches are ordered, default is the fallback)`);let zn=Ft[2];Y.push({when:Ft[1].trim(),next:`@terminal:${zn}`}),d.push({srcDeclId:D,port:zn,dstDeclId:Ft[3],line:s[de].n});continue}let ml=/^default\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(be);if(ml!==null){ye!==void 0&&r(s[de].n,`\`choice ${D}\` has more than one \`default\``);let zn=ml[1];ye=`@terminal:${zn}`,d.push({srcDeclId:D,port:zn,dstDeclId:ml[2],line:s[de].n});continue}break}Y.length===0&&r(I,`\`choice ${D}\` has no \`when\` branches (need \u22651 \`when <jexl-predicate> -<port>-> <id>\`)`),_(D,"lmctl/choice",{branches:Y,...ye!==void 0?{default_next:ye}:{}},I,!1),b=de-1;continue}if(U==="loop"){let j=/^loop\s+([A-Za-z][\w-]*)\s*=\s*loop\s*\((.*)\)\s*$/.exec(L)??r(I,`malformed \`loop\` (expected \`loop <id> = loop(k=v, ...)\`): ${L}`);_(j[1],"lmctl/loop",Er(j[2],I,r),I,!1);continue}if(U==="foreach"){let j=/^foreach\s+([A-Za-z][\w-]*)\s*=\s*foreach\s*\((.*)\)\s*$/.exec(L)??r(I,`malformed \`foreach\` (expected \`foreach <id> = foreach(items=<expr>, ...)\`): ${L}`),D=Er(j[2],I,r);"mode"in D&&r(I,"foreach is SEQUENTIAL-ONLY: `mode` is not permitted (single-thread; durable-memory/composition-language-design.md \xA7Execution model)"),_(j[1],"lmctl/foreach",D,I,!1);continue}if(U==="call"){let j=/^call\s+([A-Za-z][\w-]*)\s*=\s*call\s*\((.*)\)\s*$/.exec(L)??r(I,`malformed \`call\` (expected \`call <id> = call(workflow=<name>, ...)\`): ${L}`),D=j[1],Y=Er(j[2],I,r),ye=Y.workflow;(typeof ye!="string"||ye.length===0)&&r(I,`\`call ${D}\` requires a \`workflow=<name>\` argument`);let{workflow:de,...be}=Y;_(D,"lmctl/subflow",{workflow_name:ye,...be},I,!1),u.push({declId:D,target:ye,line:I});continue}if(U==="decide"){let j=/^decide\s+([A-Za-z][\w-]*)\s+by\s+agent\s*\((.*)\)\s*:$/.exec(L)??r(I,`malformed \`decide\` (expected \`decide <id> by agent(k=v, ...):\`): ${L}`),D=j[1],Y=Er(j[2],I,r),{branches:ye,nextIdx:de}=y(b);ye.length===0&&r(I,`\`decide ${D}\` has no outcomes (need at least one \`<outcome> -> <id>\`)`),_(D,"lmctl/interactive",{termination:{operator_signal:!0}},I,!1,{agent:Y});for(let be of ye)d.push({srcDeclId:D,port:be.label,dstDeclId:be.dst,line:I});b=de;continue}if(U==="entry"){let j=/^entry\s+([A-Za-z][\w-]*)$/.exec(L)??r(I,`malformed \`entry\` (expected \`entry <id>\`): ${L}`);m!==void 0&&r(I,`duplicate \`entry\` (already set to ${m})`),m=j[1];continue}r(I,`unknown statement \`${U}\` (grammar: workflow / meta / trigger / mcp / skill / step / terminal / seq / choice / loop / foreach / call / decide / entry)`)}c.length===0&&r(s[0].n,"composition declares no steps"),m===void 0&&(m=c[0]),l.has(m)||r(s[0].n,`entry references undeclared step: ${m}`);let T=b=>{if(Array.isArray(b)){for(let L of b)T(L);return}if(typeof b!="object"||b===null)return;let I=b;if(typeof I.alias=="string")for(let[L,U]of[["mcp",h],["skills",g]]){let j=I[L];Array.isArray(j)&&(I[L]=j.map(D=>typeof D=="string"&&U.has(D)?structuredClone(U.get(D)):D))}for(let L of Object.values(I))T(L)};for(let b of c){let I=l.get(b);I.members!==void 0&&T(I.members)}let v=b=>ng(o,b),k=c.map(b=>{let I=l.get(b);return{id:v(b),name:b,type:I.type,typeVersion:1,parameters:I.params,...I.members?{members:I.members}:{}}}),A={};for(let b of d){l.has(b.srcDeclId)||r(b.line,`edge source references undeclared step: ${b.srcDeclId}`),l.has(b.dstDeclId)||r(b.line,`dangling edge target: ${b.dstDeclId} is not declared`),l.get(b.srcDeclId).isTerminal&&r(b.line,`terminal \`${b.srcDeclId}\` cannot have an outgoing edge`);let I=v(b.srcDeclId);A[I]??={},A[I][b.port]!==void 0&&r(b.line,`duplicate edge port \`${b.port}\` on step \`${b.srcDeclId}\``),A[I][b.port]=[[{step_id:v(b.dstDeclId),type:"main",index:0}]]}for(let b of c){let I=l.get(b);vL.has(I.type)||r(I.line,`unknown archetype \`${I.type}\` for step \`${b}\` \u2014 not a registered builtin (src/engine/archetypes/index.ts:17-32)`)}for(let b of u)b.target===o&&r(b.line,`subflow cycle: \`call ${b.declId}\` invokes this workflow (\`${o}\`) \u2014 direct recursion is not allowed (cross-workflow A\u2192B\u2192A cycle detection is deferred to the M3 compile.ts seam)`);let z=new Map;for(let b of d){let I=z.get(b.srcDeclId);I===void 0?z.set(b.srcDeclId,[b.dstDeclId]):I.push(b.dstDeclId)}for(let b of c){let I=l.get(b);if(I.type!=="lmctl/loop")continue;let L=I.params.body;if(typeof L=="string"&&l.has(L)){let U=z.get(b);U===void 0?z.set(b,[L]):U.push(L)}}let Se=new Set([m]),W=[m];for(;W.length>0;){let b=W.shift();for(let I of z.get(b)??[])Se.has(I)||(Se.add(I),W.push(I))}for(let b of c)Se.has(b)||r(l.get(b).line,`step \`${b}\` is unreachable from entry \`${m}\``);let F=new Map;for(let b of d){let I=F.get(b.srcDeclId);I===void 0&&(I=new Set,F.set(b.srcDeclId,I)),I.add(b.port)}let R=new Set(["approve","request_changes","fail_pre_check","max_loops_exceeded"]);for(let b of c){let I=l.get(b);if(I.isTerminal)continue;let L=F.get(b)??new Set;if(I.type==="lmctl/review"){let j=[...L].some(D=>!R.has(D));!L.has("approve")&&!j&&r(I.line,`uncovered outcome: review step \`${b}\` wires neither \`approve\` nor any stance outcome \u2014 route \`approve\` (\`seq ${b} -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 U=SL[I.type];if(U!==void 0)for(let j of U)L.has(j)||r(I.line,`uncovered outcome: required outcome \`${j}\` of step \`${b}\` (\`${I.type}\`) has no connection \u2014 route it (\`seq ${b} -${j}-> <target|terminal>\`)`);else L.size===0&&r(I.line,`uncovered outcome: non-terminal step \`${b}\` (\`${I.type}\`) has no outgoing connection \u2014 wire it with \`seq\` or route to a \`terminal\``)}for(let b of c){let I=l.get(b),L=EL[I.type];if(L===void 0)continue;let U={...I.params,...I.members??{},type:L.v2type,state_name:b,...Object.keys(L.outcomes).length>0?{outcomes:L.outcomes}:{}},j=L.schema.safeParse(U);if(!j.success){let D=j.error.issues[0],Y=D.path.length===0?"$":D.path.map(String).join(".");r(I.line,`step \`${b}\` (\`${I.type}\`) has invalid params for archetype \`${L.v2type}\` at \`${Y}\`: ${D.message} \u2014 this would crash the engine (it derefs this field unguarded). Provide it via the structured form: \`step ${b} = ${I.type.replace("lmctl/","")}({ ... })\``)}}let Z={schema_version:"lmctl/v3",definition_schema_version:3,name:o,version:a,...f,...p.size>0?{triggers:[...p.values()]}:{},steps:k,connections:A,entry_step_id:v(m)},q=$t.safeParse(Z);if(!q.success)throw new bn(q.error.issues.map(b=>({line:s[0].n,message:`emitted V3 invalid at ${b.path.length===0?"$":b.path.map(String).join(".")}: ${b.message}`})));return q.data}function bL(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 Er(t,e,r){let n=t.trim();if(n.length===0)return{};if(n.startsWith("{")){let i;try{i=JSON.parse(n)}catch(o){r(e,`malformed structured args (expected a single-line JSON object): ${o.message}`)}return(i===null||typeof i!="object"||Array.isArray(i))&&r(e,"structured args must be a JSON object"),i}let s={};for(let i of kL(n)){let o=i.indexOf("=");o===-1&&r(e,`malformed arg (expected k=v): ${i}`);let a=i.slice(0,o).trim(),l=i.slice(o+1).trim();/^[A-Za-z_][\w-]*$/.test(a)||r(e,`invalid arg name: ${a}`),s[a]=dg(l)}return s}function kL(t){return t.split(",").map(e=>e.trim()).filter(e=>e.length>0)}function dg(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 EL,wL,ig,bn,vL,SL,og,ag,cg=E(()=>{"use strict";Sn();sg();vn();EL={"lmctl/review":{v2type:"Review",outcomes:{approve:"_"},schema:ho},"lmctl/consolidate":{v2type:"Consolidate",outcomes:{ok:"_"},schema:go},"lmctl/interactive":{v2type:"Interactive",outcomes:{done:"_"},schema:yo},"lmctl/loop":{v2type:"Loop",outcomes:{ok:"_"},schema:Eo},"lmctl/shell-step":{v2type:"ShellStep",outcomes:{},schema:wo}},wL={"lmctl/review":["coder","reviewers"],"lmctl/consolidate":["researchers","consolidator"],"lmctl/interactive":["agent"]};ig={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"},bn=class extends Error{issues;constructor(e){super(`composition DSL compile failed:
2030
2030
  ${e.map(r=>` line ${r.line}: ${r.message}`).join(`
2031
2031
  `)}`),this.issues=e,this.name="DslCompileError"}},vL=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"]),SL={"lmctl/consolidate":["ok"],"lmctl/interactive":["done"],"lmctl/loop":["ok"],"lmctl/foreach":["all_ok"]},og=new Set(["requires","default_task_timeout_ms","errors","concurrency_key","concurrent_limit"]),ag={"trigger-schedule":"lmctl/trigger-schedule","trigger-gh-issue":"lmctl/trigger-gh-issue"}});import{readFileSync as IL}from"node:fs";function NL(){let t=process.env.LMCTL_DSL;return t===void 0?!0:!["0","false","off"].includes(t.trim().toLowerCase())}function AL(t){for(let e of t.split(`
2032
- `)){let r=e.replace(/#.*/,"").trim();if(r.length!==0)return/^workflow\s+\S+\s+v\d+\s*$/.test(r)}return!1}function pt(t){if(typeof t=="string"&&NL()&&AL(t)){let r;try{r=lg(t)}catch(s){throw s instanceof bn?new Yt(s.issues.map(i=>({path:`dsl:${i.line}`,message:i.message}))):s}let n=$t.safeParse(r);if(!n.success)throw new Yt(n.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));return n.data}let e=So(RL(t));if(LL(e)&&e.definition_schema_version===3){let r=$t.safeParse(e);if(!r.success)throw new Yt(r.error.issues.map(n=>({path:n.path.length===0?"$":n.path.map(String).join("."),message:n.message})));return r.data}return xL(e)}function xL(t){let e=To.safeParse(t);if(!e.success)throw new Yt(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,i]of Object.entries(r.states))if(n.has(i.type))throw new Yt([{path:`states.${s}`,message:`v2 workflows (primitive_version: 2) may not use v1 primitive type: ${i.type}`}]);try{return eg(r)}catch(s){throw s instanceof Kt?new Ec(s):s}}function RL(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
2033
- `)||e.startsWith("{")||e.startsWith("[")?ug(t):e.endsWith(".json")?ug(IL(e,"utf8")):t}function ug(t){return JSON.parse(t)}function LL(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Ec,Yt,Ns=E(()=>{"use strict";vn();rg();yc();Sn();cg();Ec=class extends Error{causeError;constructor(e){super("compiler emitted invalid atomic workflow"),this.causeError=e,this.name="CompilerInvariantError"}},Yt=class extends Error{issues;constructor(e){super("compound workflow validation failed"),this.issues=e,this.name="CompilerValidationError"}}});function bo(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:OL(r,{job:{id:t.job.id,kind:t.job.source,source:t.job.source,source_ref:t.job.source_ref,payload:CL(t.job.payload)},project:t.project===null?null:{id:t.project.id,name:t.project.name}}),concurrent_limit:e}}function OL(t,e){return t.replace(/\{\{\s*([^}]+?)\s*\}\}/g,(r,n)=>{let s=$L(e,n.trim());return s==null?"":typeof s=="string"?s:typeof s=="number"||typeof s=="boolean"?String(s):JSON.stringify(s)})}function $L(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 CL(t){if(t===null||t.trim().length===0)return null;try{return JSON.parse(t)}catch{return t}}var wc=E(()=>{"use strict"});var mg={};he(mg,{enqueueFromAgentOutput:()=>DL,enqueueFromGitHubIssue:()=>Tc,enqueueManual:()=>ML,enqueueScheduled:()=>jL});function Tc(t,e){return Io(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:ko(e.payload),concurrency_key:e.concurrency_key,priority:e.priority})}function ML(t,e){return Io(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:ko(e.payload),concurrency_key:e.concurrency_key})}function DL(t,e){let r=e.sequence===void 0?`run:${e.parent_run_id}`:`run:${e.parent_run_id}:${e.sequence}`;return Io(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:ko(e.payload),concurrency_key:e.concurrency_key})}function jL(t,e){return Io(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:ko(e.payload),concurrency_key:e.concurrency_key})}function ko(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function Io(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 i=pt(s.definition),o={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=bo({workflow:i,job:o,project:n});return t.enqueueJob({...e,concurrency_key:a.concurrency_key})}catch{return t.enqueueJob(e)}}var vc=E(()=>{"use strict";Ns();wc()});async function pg(t){let e=t.dal.listProjectWorkflows(t.project.id,{enabled_only:!0});if(e.length===0)return fg(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 i of e){if(!await PL(i.condition,r))continue;let o=`${t.issue.url}#workflow:${i.workflow_id}`,a={issue:t.issue,...FL(i.parameters_override)},l=fg(t.dal,t.project.id,t.issue,o,i.workflow_id,a,-i.priority);n.push(...l.jobs),s+=l.new_jobs}return{jobs:n,new_jobs:s}}function fg(t,e,r,n,s,i,o){let a=t.findJobBySourceAndDedupe("gh_issue",n);return{jobs:[Tc(t,{project_id:e,issue_url:r.url,payload:i,workflow_id_override:s,dedupe_key:n,priority:o})],new_jobs:a===null?1:0}}async function PL(t,e){if(t===null||t.trim().length===0)return!0;try{return await Ur(t,e)===!0}catch{return!1}}function FL(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 _g=E(()=>{"use strict";ks();vc()});import{spawnSync as UL}from"node:child_process";async function WL(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=UL(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 i;try{i=JSON.parse(s.stdout??"[]")}catch{throw new Error("gh issue list returned malformed JSON")}if(!BL(i))throw new Error("gh issue list returned unexpected JSON shape");let o=0;for(let a of i){let l=await pg({dal:t.dal,project:t.project,issue:HL(a)});o+=l.new_jobs}return{scanned:i.length,new_jobs:o}}async function No(t){if(process.env.LMCTL_INTAKE_DISABLED==="1")return[];let e=[];for(let r of t.listProjectsWithIntakeEnabled()){let n=qL(r.intake_config);try{let s=await WL({dal:t,project:r,labels:n.labels,state:n.state});e.push({project_id:r.id,project_name:r.name,...s})}catch(s){let i=s instanceof Error?s.message:String(s);e.push({project_id:r.id,project_name:r.name,scanned:0,new_jobs:0,error:i});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:i})})}catch{}}}return e}function qL(t){if(t===null)return{};try{let e=JSON.parse(t);if(!Sc(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 BL(t){return Array.isArray(t)&&t.every(e=>{if(!Sc(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:Sc(n)&&typeof n.name=="string"))})}function HL(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 Sc(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var bc=E(()=>{"use strict";_g()});function gg(t){return async e=>JL(t.app,e,t.log!==void 0?{log:t.log}:{})}async function JL(t,e,r={}){let n=GL(e.path),s={"content-type":"application/json",...e.headers??{},[Ao]:kc},i={method:e.method,headers:s};e.body!==void 0&&e.method!=="GET"&&e.method!=="DELETE"&&(i.body=typeof e.body=="string"?e.body:JSON.stringify(e.body));let o=new Request(n,i),a=Date.now();try{let l=await t.fetch(o),d=await VL(l);if(r.log!==void 0){let c=Date.now()-a;r.log(`[mailbox-dispatch] ${e.method} ${hg(e.path)} \u2192 ${d.status} (${c}ms)`)}return d}catch(l){if(r.log!==void 0){let d=Date.now()-a;r.log(`[mailbox-dispatch] ${e.method} ${hg(e.path)} \u2192 ERR (${d}ms)`)}throw l}}function hg(t){let e=t.startsWith("/")?t:`/${t}`,r=e.search(/[?#]/);return r===-1?e:e.slice(0,r)}function GL(t){let e=t.startsWith("/")?t:`/${t}`;return`${XL}${e}`}async function VL(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((i,o)=>{o.toLowerCase()!==Ao&&(n[o]=i)});let s={status:t.status};return Object.keys(n).length>0&&(s.headers=n),r!==void 0&&(s.body=r),s}var Ao,kc,XL,Ic=E(()=>{"use strict";Ao="x-mailbox-channel",kc="1",XL="http://mailbox.local"});import{createHash as yg,createHmac as KL,timingSafeEqual as YL}from"node:crypto";function Eg(t={}){return async(e,r)=>{if(t.disabled===!0){await r();return}let n=wg();if(n===null||tO(e.req.path)){await r();return}if(e.req.path.startsWith("/mailbox/")&&e.req.header(Ao)===kc){await r();return}let s=e.req.query("token");if(s!==void 0&&xo(s,n)){Ac(e,n),await r();return}if(eO(e,n)){await r();return}return e.req.path.startsWith("/api/")||e.req.path.startsWith("/mailbox/")?e.json({error:"API requires auth; set LMCTL_API_TOKEN"},401):e.redirect("/login",302)}}function wg(){let t=process.env.LMCTL_API_TOKEN;return t&&t.length>0?t:null}function Tg(t){let e=wg();return e!==null&&xo(t,e)}function Ac(t,e,r=new Date){t.header("Set-Cookie",`${Nc}=${ZL(e,r)}; Path=/; HttpOnly; SameSite=Lax`)}function vg(t){t.header("Set-Cookie",`${Nc}=; Path=/; HttpOnly; SameSite=Lax; Max-Age=0`)}function ZL(t,e=new Date){let n=`auth=ok|${new Date(e.getTime()+zL*24*60*60*1e3).toISOString()}`;return Buffer.from(`${n}|${Sg(t,n)}`,"utf8").toString("base64url")}function QL(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 i=new Date(s[1]);return Number.isNaN(i.getTime())||i.getTime()<=r.getTime()?!1:xo(s[2],Sg(e,`${s[0]}|${s[1]}`))}function xo(t,e){return YL(yg("sha256").update(t).digest(),yg("sha256").update(e).digest())}function eO(t,e){let r=/^Bearer\s+(.+)$/i.exec(t.req.header("authorization")??"")?.[1];if(r!==void 0&&xo(r,e))return!0;let n=rO(t.req.header("cookie")??"")[Nc];return n!==void 0&&QL(n,e)}function tO(t){return t==="/login"||t==="/logout"}function rO(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 Sg(t,e){return KL("sha256",t).update(e).digest("hex")}var Nc,zL,bg=E(()=>{"use strict";Ic();Nc="lmctl_next_session",zL=30});import{existsSync as kn,mkdirSync as nO,readdirSync as sO,readFileSync as Ro,unlinkSync as iO,writeFileSync as Lc}from"node:fs";import{join as Wr}from"node:path";function ot(t){if(!oO.test(t))throw new Error(`invalid memory name "${t}": only alphanumeric characters, underscores, and hyphens are allowed`)}function Ig(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(),i=n.match(/^type:\s*(.+)$/m),o=n.match(/^description:\s*(.+)$/m),a=i?.[1]?.trim()??"";return cO(a)?{name:t,type:a,description:o?.[1]?.trim()??null,body:s,created_at:kg,updated_at:kg}:null}function aO(t,e,r,n){let s=r!==null?`
2032
+ `)){let r=e.replace(/#.*/,"").trim();if(r.length!==0)return/^workflow\s+\S+\s+v\d+\s*$/.test(r)}return!1}function pt(t){if(typeof t=="string"&&NL()&&AL(t)){let r;try{r=lg(t)}catch(s){throw s instanceof bn?new Yt(s.issues.map(i=>({path:`dsl:${i.line}`,message:i.message}))):s}let n=$t.safeParse(r);if(!n.success)throw new Yt(n.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));return n.data}let e=So(RL(t));if(LL(e)&&e.definition_schema_version===3){let r=$t.safeParse(e);if(!r.success)throw new Yt(r.error.issues.map(n=>({path:n.path.length===0?"$":n.path.map(String).join("."),message:n.message})));return r.data}return xL(e)}function xL(t){let e=To.safeParse(t);if(!e.success)throw new Yt(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,i]of Object.entries(r.states))if(n.has(i.type))throw new Yt([{path:`states.${s}`,message:`v2 workflows (primitive_version: 2) may not use v1 primitive type: ${i.type}`}]);try{return eg(r)}catch(s){throw s instanceof Kt?new yc(s):s}}function RL(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
2033
+ `)||e.startsWith("{")||e.startsWith("[")?ug(t):e.endsWith(".json")?ug(IL(e,"utf8")):t}function ug(t){return JSON.parse(t)}function LL(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var yc,Yt,Ns=E(()=>{"use strict";vn();rg();gc();Sn();cg();yc=class extends Error{causeError;constructor(e){super("compiler emitted invalid atomic workflow"),this.causeError=e,this.name="CompilerInvariantError"}},Yt=class extends Error{issues;constructor(e){super("compound workflow validation failed"),this.issues=e,this.name="CompilerValidationError"}}});function bo(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:OL(r,{job:{id:t.job.id,kind:t.job.source,source:t.job.source,source_ref:t.job.source_ref,payload:CL(t.job.payload)},project:t.project===null?null:{id:t.project.id,name:t.project.name}}),concurrent_limit:e}}function OL(t,e){return t.replace(/\{\{\s*([^}]+?)\s*\}\}/g,(r,n)=>{let s=$L(e,n.trim());return s==null?"":typeof s=="string"?s:typeof s=="number"||typeof s=="boolean"?String(s):JSON.stringify(s)})}function $L(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 CL(t){if(t===null||t.trim().length===0)return null;try{return JSON.parse(t)}catch{return t}}var Ec=E(()=>{"use strict"});var mg={};he(mg,{enqueueFromAgentOutput:()=>DL,enqueueFromGitHubIssue:()=>wc,enqueueManual:()=>ML,enqueueScheduled:()=>jL});function wc(t,e){return Io(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:ko(e.payload),concurrency_key:e.concurrency_key,priority:e.priority})}function ML(t,e){return Io(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:ko(e.payload),concurrency_key:e.concurrency_key})}function DL(t,e){let r=e.sequence===void 0?`run:${e.parent_run_id}`:`run:${e.parent_run_id}:${e.sequence}`;return Io(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:ko(e.payload),concurrency_key:e.concurrency_key})}function jL(t,e){return Io(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:ko(e.payload),concurrency_key:e.concurrency_key})}function ko(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function Io(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 i=pt(s.definition),o={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=bo({workflow:i,job:o,project:n});return t.enqueueJob({...e,concurrency_key:a.concurrency_key})}catch{return t.enqueueJob(e)}}var Tc=E(()=>{"use strict";Ns();Ec()});async function pg(t){let e=t.dal.listProjectWorkflows(t.project.id,{enabled_only:!0});if(e.length===0)return fg(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 i of e){if(!await PL(i.condition,r))continue;let o=`${t.issue.url}#workflow:${i.workflow_id}`,a={issue:t.issue,...FL(i.parameters_override)},l=fg(t.dal,t.project.id,t.issue,o,i.workflow_id,a,-i.priority);n.push(...l.jobs),s+=l.new_jobs}return{jobs:n,new_jobs:s}}function fg(t,e,r,n,s,i,o){let a=t.findJobBySourceAndDedupe("gh_issue",n);return{jobs:[wc(t,{project_id:e,issue_url:r.url,payload:i,workflow_id_override:s,dedupe_key:n,priority:o})],new_jobs:a===null?1:0}}async function PL(t,e){if(t===null||t.trim().length===0)return!0;try{return await Ur(t,e)===!0}catch{return!1}}function FL(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 _g=E(()=>{"use strict";ks();Tc()});import{spawnSync as UL}from"node:child_process";async function WL(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=UL(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 i;try{i=JSON.parse(s.stdout??"[]")}catch{throw new Error("gh issue list returned malformed JSON")}if(!BL(i))throw new Error("gh issue list returned unexpected JSON shape");let o=0;for(let a of i){let l=await pg({dal:t.dal,project:t.project,issue:HL(a)});o+=l.new_jobs}return{scanned:i.length,new_jobs:o}}async function No(t){if(process.env.LMCTL_INTAKE_DISABLED==="1")return[];let e=[];for(let r of t.listProjectsWithIntakeEnabled()){let n=qL(r.intake_config);try{let s=await WL({dal:t,project:r,labels:n.labels,state:n.state});e.push({project_id:r.id,project_name:r.name,...s})}catch(s){let i=s instanceof Error?s.message:String(s);e.push({project_id:r.id,project_name:r.name,scanned:0,new_jobs:0,error:i});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:i})})}catch{}}}return e}function qL(t){if(t===null)return{};try{let e=JSON.parse(t);if(!vc(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 BL(t){return Array.isArray(t)&&t.every(e=>{if(!vc(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:vc(n)&&typeof n.name=="string"))})}function HL(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 vc(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var Sc=E(()=>{"use strict";_g()});function gg(t){return async e=>JL(t.app,e,t.log!==void 0?{log:t.log}:{})}async function JL(t,e,r={}){let n=GL(e.path),s={"content-type":"application/json",...e.headers??{},[Ao]:bc},i={method:e.method,headers:s};e.body!==void 0&&e.method!=="GET"&&e.method!=="DELETE"&&(i.body=typeof e.body=="string"?e.body:JSON.stringify(e.body));let o=new Request(n,i),a=Date.now();try{let l=await t.fetch(o),d=await VL(l);if(r.log!==void 0){let c=Date.now()-a;r.log(`[mailbox-dispatch] ${e.method} ${hg(e.path)} \u2192 ${d.status} (${c}ms)`)}return d}catch(l){if(r.log!==void 0){let d=Date.now()-a;r.log(`[mailbox-dispatch] ${e.method} ${hg(e.path)} \u2192 ERR (${d}ms)`)}throw l}}function hg(t){let e=t.startsWith("/")?t:`/${t}`,r=e.search(/[?#]/);return r===-1?e:e.slice(0,r)}function GL(t){let e=t.startsWith("/")?t:`/${t}`;return`${XL}${e}`}async function VL(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((i,o)=>{o.toLowerCase()!==Ao&&(n[o]=i)});let s={status:t.status};return Object.keys(n).length>0&&(s.headers=n),r!==void 0&&(s.body=r),s}var Ao,bc,XL,kc=E(()=>{"use strict";Ao="x-mailbox-channel",bc="1",XL="http://mailbox.local"});import{createHash as yg,createHmac as KL,timingSafeEqual as YL}from"node:crypto";function Eg(t={}){return async(e,r)=>{if(t.disabled===!0){await r();return}let n=wg();if(n===null||tO(e.req.path)){await r();return}if(e.req.path.startsWith("/mailbox/")&&e.req.header(Ao)===bc){await r();return}let s=e.req.query("token");if(s!==void 0&&xo(s,n)){Nc(e,n),await r();return}if(eO(e,n)){await r();return}return e.req.path.startsWith("/api/")||e.req.path.startsWith("/mailbox/")?e.json({error:"API requires auth; set LMCTL_API_TOKEN"},401):e.redirect("/login",302)}}function wg(){let t=process.env.LMCTL_API_TOKEN;return t&&t.length>0?t:null}function Tg(t){let e=wg();return e!==null&&xo(t,e)}function Nc(t,e,r=new Date){t.header("Set-Cookie",`${Ic}=${ZL(e,r)}; Path=/; HttpOnly; SameSite=Lax`)}function vg(t){t.header("Set-Cookie",`${Ic}=; Path=/; HttpOnly; SameSite=Lax; Max-Age=0`)}function ZL(t,e=new Date){let n=`auth=ok|${new Date(e.getTime()+zL*24*60*60*1e3).toISOString()}`;return Buffer.from(`${n}|${Sg(t,n)}`,"utf8").toString("base64url")}function QL(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 i=new Date(s[1]);return Number.isNaN(i.getTime())||i.getTime()<=r.getTime()?!1:xo(s[2],Sg(e,`${s[0]}|${s[1]}`))}function xo(t,e){return YL(yg("sha256").update(t).digest(),yg("sha256").update(e).digest())}function eO(t,e){let r=/^Bearer\s+(.+)$/i.exec(t.req.header("authorization")??"")?.[1];if(r!==void 0&&xo(r,e))return!0;let n=rO(t.req.header("cookie")??"")[Ic];return n!==void 0&&QL(n,e)}function tO(t){return t==="/login"||t==="/logout"}function rO(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 Sg(t,e){return KL("sha256",t).update(e).digest("hex")}var Ic,zL,bg=E(()=>{"use strict";kc();Ic="lmctl_next_session",zL=30});import{existsSync as kn,mkdirSync as nO,readdirSync as sO,readFileSync as Ro,unlinkSync as iO,writeFileSync as Rc}from"node:fs";import{join as Wr}from"node:path";function ot(t){if(!oO.test(t))throw new Error(`invalid memory name "${t}": only alphanumeric characters, underscores, and hyphens are allowed`)}function Ig(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(),i=n.match(/^type:\s*(.+)$/m),o=n.match(/^description:\s*(.+)$/m),a=i?.[1]?.trim()??"";return cO(a)?{name:t,type:a,description:o?.[1]?.trim()??null,body:s,created_at:kg,updated_at:kg}:null}function aO(t,e,r,n){let s=r!==null?`
2034
2034
  description: ${r}`:"";return`---
2035
2035
  name: ${t}${s}
2036
2036
  type: ${e}
2037
2037
  ---
2038
- ${n}`}function lO(t,e,r,n){let s=Wr(t,Oc),i=`- [${e}.md](${e}.md)${n!==null?` \u2014 ${n}`:""} (${r})`,o=kn(s)?Ro(s,"utf8"):"",a=new RegExp(`^- \\[${Ng(e)}\\.md\\].*$`,"m");a.test(o)?o=o.replace(a,i):o=o.length>0&&!o.endsWith(`
2038
+ ${n}`}function lO(t,e,r,n){let s=Wr(t,Lc),i=`- [${e}.md](${e}.md)${n!==null?` \u2014 ${n}`:""} (${r})`,o=kn(s)?Ro(s,"utf8"):"",a=new RegExp(`^- \\[${Ng(e)}\\.md\\].*$`,"m");a.test(o)?o=o.replace(a,i):o=o.length>0&&!o.endsWith(`
2039
2039
  `)?`${o}
2040
2040
  ${i}
2041
2041
  `:`${o}${i}
2042
- `,Lc(s,o,"utf8")}function dO(t,e){let r=Wr(t,Oc);if(!kn(r))return;let n=Ro(r,"utf8"),s=new RegExp(`^- \\[${Ng(e)}\\.md\\].*$\\r?\\n?`,"m");s.test(n)&&Lc(r,n.replace(s,""),"utf8")}function Ng(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function cO(t){return t==="user"||t==="feedback"||t==="project"||t==="reference"}function _t(t,e){return t.durable_memory_mode==="db"?new Rc(e,t.id):new xc(t.local_path)}var oO,Oc,kg,xc,Rc,$c=E(()=>{"use strict";oO=/^[a-zA-Z0-9_-]+$/;Oc="MEMORY.md",kg="1970-01-01T00:00:00.000Z",xc=class{dir;constructor(e){this.dir=Wr(e,"durable-memory")}read(e){ot(e);let r=Wr(this.dir,`${e}.md`);if(!kn(r))return null;let n=Ro(r,"utf8");return Ig(e,n)}write(e){ot(e.name),nO(this.dir,{recursive:!0});let r=Wr(this.dir,`${e.name}.md`),n=!kn(r),s=aO(e.name,e.type,e.description??null,e.body);return Lc(r,s,"utf8"),lO(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:i})=>({name:r,type:n,description:s,updated_at:i}))}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){ot(e);let r=Wr(this.dir,`${e}.md`);return kn(r)?(iO(r),dO(this.dir,e),!0):!1}listFiles(){if(!kn(this.dir))return[];let e=sO(this.dir).filter(n=>n.endsWith(".md")&&n!==Oc),r=[];for(let n of e){let s=n.slice(0,-3),i=Ro(Wr(this.dir,n),"utf8"),o=Ig(s,i);o!==null&&r.push(o)}return r.sort((n,s)=>n.name.localeCompare(s.name))}};Rc=class{dal;projectId;constructor(e,r){this.dal=e,this.projectId=r}read(e){ot(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){ot(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 ot(e),this.dal.deleteDurableMemory(this.projectId,e)}}});function xg(t,e){let{dal:r}=e;t.get("/api/durable-memory/index/:project_id",n=>{let s=Number(n.req.param("project_id")),i=r.getProject(s);if(i===null)return n.json({error:"project not found"},404);let o=_t(i,r),a=n.req.query("types"),l=a!==void 0&&a.length>0?a.split(",").map(d=>d.trim()).filter(Boolean):void 0;return n.json(o.index(l))}),t.get("/api/durable-memory/read/:project_id/:name",n=>{let s=Number(n.req.param("project_id")),i=n.req.param("name"),o=r.getProject(s);if(o===null)return n.json({error:"project not found"},404);let a=_t(o,r),l;try{l=a.read(i)}catch(d){return n.json({error:d.message},400)}return l===null?n.json({error:`memory entry not found: ${i}`},404):n.json(l)}),t.post("/api/durable-memory/write/:project_id",async n=>{let s=Number(n.req.param("project_id")),i=r.getProject(s);if(i===null)return n.json({error:"project not found"},404);let o;try{o=await n.req.json()}catch{return n.json({error:"invalid JSON body"},400)}let a=typeof o.type=="string"?o.type:null,l=typeof o.name=="string"?o.name:null,d=typeof o.body=="string"?o.body:null,c=typeof o.description=="string"?o.description:null;if(a===null||!Ag.has(a))return n.json({error:`invalid type: must be one of ${[...Ag].join("|")}`},400);if(l===null)return n.json({error:"missing name"},400);if(d===null)return n.json({error:"missing body"},400);let u=_t(i,r),m;try{({created:m}=u.write({type:a,name:l,description:c,body:d}))}catch(f){return n.json({error:f.message},400)}return n.json({success:!0,created_or_updated:m?"created":"updated"})}),t.get("/api/durable-memory/list/:project_id",n=>{let s=Number(n.req.param("project_id")),i=r.getProject(s);if(i===null)return n.json({error:"project not found"},404);let o=_t(i,r),a=n.req.query("type");return n.json(o.list(a))})}var Ag,Rg=E(()=>{"use strict";$c();Ag=new Set(["user","feedback","project","reference"])});function mO(t){let e=4294967295;for(let r=0;r<t.length;r+=1)e=(uO[(e^t[r])&255]^e>>>8)>>>0;return(e^4294967295)>>>0}function fO(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 Lg(t,e=new Date){let{time:r,date:n}=fO(e),s=[],i=[],o=0,a=new TextEncoder;for(let h of t){let g=a.encode(h.name),_=mO(h.data),y=h.data.length,T=new Uint8Array(30+g.length),v=new DataView(T.buffer);v.setUint32(0,67324752,!0),v.setUint16(4,20,!0),v.setUint16(6,0,!0),v.setUint16(8,0,!0),v.setUint16(10,r,!0),v.setUint16(12,n,!0),v.setUint32(14,_,!0),v.setUint32(18,y,!0),v.setUint32(22,y,!0),v.setUint16(26,g.length,!0),v.setUint16(28,0,!0),T.set(g,30),s.push(T,h.data);let k=new Uint8Array(46+g.length),A=new DataView(k.buffer);A.setUint32(0,33639248,!0),A.setUint16(4,20,!0),A.setUint16(6,20,!0),A.setUint16(8,0,!0),A.setUint16(10,0,!0),A.setUint16(12,r,!0),A.setUint16(14,n,!0),A.setUint32(16,_,!0),A.setUint32(20,y,!0),A.setUint32(24,y,!0),A.setUint16(28,g.length,!0),A.setUint16(30,0,!0),A.setUint16(32,0,!0),A.setUint16(34,0,!0),A.setUint16(36,0,!0),A.setUint32(38,0,!0),A.setUint32(42,o,!0),k.set(g,46),i.push(k),o+=T.length+h.data.length}let l=o,d=0;for(let h of i)d+=h.length;let c=new Uint8Array(22),u=new DataView(c.buffer);u.setUint32(0,101010256,!0),u.setUint16(4,0,!0),u.setUint16(6,0,!0),u.setUint16(8,t.length,!0),u.setUint16(10,t.length,!0),u.setUint32(12,d,!0),u.setUint32(16,l,!0),u.setUint16(20,0,!0);let m=l+d+c.length,f=new Uint8Array(m),p=0;for(let h of s)f.set(h,p),p+=h.length;for(let h of i)f.set(h,p),p+=h.length;return f.set(c,p),f}var uO,Og=E(()=>{"use strict";uO=(()=>{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 $o,mkdirSync as pO,readdirSync as _O,readFileSync as Mg,statSync as hO,unlinkSync as gO,writeFileSync as yO}from"node:fs";import{join as Rs}from"node:path";function Dg(t,e){let{dal:r}=e;t.post("/api/projects",async n=>{let s=await ht(n);if(typeof s=="string")return x(n,s,400);let i=ce(s,"name"),o=ce(s,"local_path");if(i===null||i.length===0)return x(n,"missing or empty name",400);if(o===null||o.length===0)return x(n,"missing or empty local_path",400);if(r.findProjectByName(i)!==null)return x(n,`project already exists: ${i}`,409);let a=ce(s,"workflow_name")??"bugfix",l,d=ce(s,"team_name");if(d!==null&&d.length>0){let u=r.findTeamByName(d);if(u===null)return x(n,`team not found: ${d}`,404);l=u.id}else{let u=r.listTeams();if(u.length===0)return x(n,"no teams exist; create a team first",400);l=u[0].id}let c=r.insertProject({name:i,local_path:o,workflow_name:a,team_id:l,default_branch:ce(s,"default_branch")});return n.json(c,201)}),t.patch("/api/projects/:name",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return x(n,"project not found",404);let i=await ht(n);if(typeof i=="string")return x(n,i,400);let o={};if(Object.prototype.hasOwnProperty.call(i,"local_path")){let l=i.local_path;if(typeof l!="string"||l.length===0)return x(n,"local_path must be a non-empty string",400);o.local_path=l}if(Object.prototype.hasOwnProperty.call(i,"durable_memory_mode")){let l=i.durable_memory_mode;if(l!=="folder"&&l!=="db")return x(n,'durable_memory_mode must be "folder" or "db"',400);o.durable_memory_mode=l}if(Object.prototype.hasOwnProperty.call(i,"default_branch")){let l=i.default_branch;if(l!==null&&typeof l!="string")return x(n,"default_branch must be string or null",400);o.default_branch=l}if(Object.prototype.hasOwnProperty.call(i,"intake_config")){let l=i.intake_config;if(l===null)o.intake_config=null;else if(typeof l=="string")o.intake_config=l;else if(typeof l=="object"&&!Array.isArray(l))o.intake_config=JSON.stringify(l);else return x(n,"intake_config must be a JSON object, string, or null",400)}let a=r.updateProjectSettings(s.id,o);return a===null?x(n,"project not found",404):n.json(a)}),t.post("/api/teams",async n=>{let s=await ht(n);if(typeof s=="string")return x(n,s,400);let i=ce(s,"name");if(i===null||i.length===0)return x(n,"missing or empty name",400);if(r.findTeamByName(i)!==null)return x(n,`team already exists: ${i}`,409);let o=r.insertTeam({name:i});return n.json(o,201)}),t.post("/api/teams/:name/members",async n=>{let s=r.findTeamByName(n.req.param("name"));if(s===null)return x(n,"team not found",404);let i=await ht(n);if(typeof i=="string")return x(n,i,400);let o=ce(i,"alias"),a=ce(i,"provider");if(o===null||o.length===0)return x(n,"missing or empty alias",400);if(a===null||a.length===0)return x(n,"missing or empty provider",400);if(r.findTeamMemberByAlias(s.id,o)!==null)return x(n,`member already exists: ${o}`,409);let l=ce(i,"model"),d=r.insertTeamMember({team_id:s.id,alias:o,provider:a,model:l,sessiondir:`.lmctl/sessions/${s.name}/${o}`}),c=ce(i,"role_prompt");c!==null&&r.setMemberRolePrompt(d.id,c);let u=r.findTeamMemberByAlias(s.id,o);return n.json(u??d,201)}),t.put("/api/teams/:name/members/:alias",async n=>{let s=r.findTeamByName(n.req.param("name"));if(s===null)return x(n,"team not found",404);let i=r.findTeamMemberByAlias(s.id,n.req.param("alias"));if(i===null)return x(n,"member not found",404);let o=await ht(n);if(typeof o=="string")return x(n,o,400);let a={};if(Object.prototype.hasOwnProperty.call(o,"role_prompt")){let d=o.role_prompt;if(d!==null&&typeof d!="string")return x(n,"role_prompt must be string or null",400);a.role_prompt=d}if(Object.prototype.hasOwnProperty.call(o,"model")){let d=o.model;if(d!==null&&typeof d!="string")return x(n,"model must be string or null",400);a.model=d}if(Object.prototype.hasOwnProperty.call(o,"provider")){let d=o.provider;if(typeof d!="string"||d.length===0)return x(n,"provider must be a non-empty string",400);a.provider=d}if(Object.keys(a).length===0)return x(n,"no updatable fields provided",400);let l=r.updateTeamMemberMeta(i.id,a);return l===null?x(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 x(n,"project not found",404);let i=_t(s,r);return n.json(i.index())}),t.post("/api/projects/:name/durable-memory",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return x(n,"project not found",404);let i=await ht(n);if(typeof i=="string")return x(n,i,400);let o=ce(i,"name"),a=ce(i,"body"),l=ce(i,"type");if(o===null||o.length===0)return x(n,"missing or empty name",400);if(a===null)return x(n,"missing body",400);if(l===null||!Lo.includes(l))return x(n,`invalid type: must be one of ${Lo.join("|")}`,400);try{ot(o)}catch(u){return x(n,u.message,400)}let d=_t(s,r);try{if(d.read(o)!==null)return x(n,`chapter already exists: ${o}`,409)}catch(u){return x(n,u.message,400)}try{d.write({type:l,name:o,description:ce(i,"description"),body:a})}catch(u){return x(n,u.message,400)}let c=d.read(o);return c===null?x(n,"chapter created but unreadable",500):n.json(c,201)}),t.get("/api/projects/:name/durable-memory/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return x(n,"project not found",404);let i=_t(s,r),o;try{o=i.read(n.req.param("chapter"))}catch(a){return x(n,a.message,400)}return o===null?x(n,"chapter not found",404):n.json(o)}),t.put("/api/projects/:name/durable-memory/:chapter",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return x(n,"project not found",404);let i=n.req.param("chapter"),o=await ht(n);if(typeof o=="string")return x(n,o,400);let a=_t(s,r),l;try{l=a.read(i)}catch(f){return x(n,f.message,400)}if(l===null)return x(n,"chapter not found",404);let d=ce(o,"body")??l.body,c=Object.prototype.hasOwnProperty.call(o,"description")?ce(o,"description"):l.description,u=ce(o,"type")??l.type;if(!Lo.includes(u))return x(n,`invalid type: must be one of ${Lo.join("|")}`,400);try{a.write({type:u,name:i,description:c,body:d})}catch(f){return x(n,f.message,400)}let m=a.read(i);return m===null?x(n,"chapter updated but unreadable",500):n.json(m)}),t.delete("/api/projects/:name/durable-memory/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return x(n,"project not found",404);let i=_t(s,r),o;try{o=i.delete(n.req.param("chapter"))}catch(a){return x(n,a.message,400)}return o?n.json({removed:!0}):x(n,"chapter not found",404)}),t.get("/api/projects/:name/ai-test",n=>{let s=r.findProjectByName(n.req.param("name"));return s===null?x(n,"project not found",404):n.json(wO(s.local_path))}),t.post("/api/projects/:name/ai-test",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return x(n,"project not found",404);let i=await ht(n);if(typeof i=="string")return x(n,i,400);let o=ce(i,"name"),a=ce(i,"body"),l=ce(i,"type");if(o===null||o.length===0)return x(n,"missing or empty name",400);if(a===null)return x(n,"missing body",400);if(l===null||!Oo.has(l))return x(n,`invalid type: must be one of ${[...Oo].join("|")}`,400);try{ot(o)}catch(m){return x(n,m.message,400)}let d=As(s.local_path),c=Rs(d,`${o}.md`);if($o(c))return x(n,`chapter already exists: ${o}`,409);pO(d,{recursive:!0}),Cg(c,o,l,ce(i,"description"),a);let u=xs(d,o);return u===null?x(n,"chapter created but unreadable",500):n.json(u,201)}),t.get("/api/projects/:name/ai-test/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return x(n,"project not found",404);try{ot(n.req.param("chapter"))}catch(o){return x(n,o.message,400)}let i=xs(As(s.local_path),n.req.param("chapter"));return i===null?x(n,"chapter not found",404):n.json(i)}),t.put("/api/projects/:name/ai-test/:chapter",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return x(n,"project not found",404);let i=n.req.param("chapter");try{ot(i)}catch(f){return x(n,f.message,400)}let o=As(s.local_path),a=xs(o,i);if(a===null)return x(n,"chapter not found",404);let l=await ht(n);if(typeof l=="string")return x(n,l,400);let d=ce(l,"body")??a.body,c=Object.prototype.hasOwnProperty.call(l,"description")?ce(l,"description"):a.description,u=ce(l,"type")??a.type;if(!Oo.has(u))return x(n,`invalid type: must be one of ${[...Oo].join("|")}`,400);Cg(Rs(o,`${i}.md`),i,u,c,d);let m=xs(o,i);return m===null?x(n,"chapter updated but unreadable",500):n.json(m)}),t.delete("/api/projects/:name/ai-test/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return x(n,"project not found",404);let i=n.req.param("chapter");try{ot(i)}catch(a){return x(n,a.message,400)}let o=Rs(As(s.local_path),`${i}.md`);return $o(o)?(gO(o),n.json({removed:!0})):x(n,"chapter not found",404)}),t.get("/api/tokens",n=>n.json([])),t.post("/api/tokens",n=>x(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"?x(n,s,400):n.json({accepted:s,note:"settings persistence not yet implemented"})}),t.get("/api/chat/sessions",n=>n.json(r.listChatbotSessions($g))),t.post("/api/chat/sessions",async n=>{let s=await EO(n);if(typeof s=="string")return x(n,s,400);let i=s!==null?ce(s,"title"):null,o=r.createChatbotSession($g,i);return n.json(o,201)}),t.get("/api/chat/sessions/:id/messages",n=>{let s=n.req.param("id");return r.getChatbotSession(s)===null?x(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 x(n,"chat session not found",404);let i=await ht(n);if(typeof i=="string")return x(n,i,400);let o=ce(i,"role"),a=ce(i,"content");if(o===null||o!=="user"&&o!=="assistant"&&o!=="tool")return x(n,"role must be one of user|assistant|tool",400);if(a===null)return x(n,"missing content",400);let l=r.appendChatbotMessage(s,o,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 x(n,"invalid run id",400);if(r.getRun(s)===null)return x(n,"run not found",404);let o=Pr(r,s),a=[];for(let d of o){let c=vO(d),u=null;if(d.content!==null&&d.content!==void 0)u=new TextEncoder().encode(d.content);else if(d.path!==null&&d.path!==void 0)try{let m=Mg(d.path),f=m.buffer.slice(m.byteOffset,m.byteOffset+m.byteLength);u=new Uint8Array(f)}catch{u=new Uint8Array(0)}u!==null&&a.push({name:c,data:u})}let l=Lg(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 x(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 EO(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 ce(t,e){let r=t[e];return typeof r!="string"?null:r}function As(t){return Rs(t,"ai-test")}function xs(t,e){let r=Rs(t,`${e}.md`);if(!$o(r))return null;let n=Mg(r,"utf8"),s=TO(n),i=hO(r).mtime.toISOString();return{name:e,type:s.type,description:s.description,body:s.body,updated_at:i}}function wO(t){let e=As(t);return $o(e)?_O(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:i,description:o,updated_at:a}=n;return{name:s,type:i,description:o,updated_at:a}}).filter(r=>r!==null):[]}function Cg(t,e,r,n,s){let i=n!==null&&n.length>0?`
2042
+ `,Rc(s,o,"utf8")}function dO(t,e){let r=Wr(t,Lc);if(!kn(r))return;let n=Ro(r,"utf8"),s=new RegExp(`^- \\[${Ng(e)}\\.md\\].*$\\r?\\n?`,"m");s.test(n)&&Rc(r,n.replace(s,""),"utf8")}function Ng(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function cO(t){return t==="user"||t==="feedback"||t==="project"||t==="reference"}function _t(t,e){return t.durable_memory_mode==="db"?new xc(e,t.id):new Ac(t.local_path)}var oO,Lc,kg,Ac,xc,Oc=E(()=>{"use strict";oO=/^[a-zA-Z0-9_-]+$/;Lc="MEMORY.md",kg="1970-01-01T00:00:00.000Z",Ac=class{dir;constructor(e){this.dir=Wr(e,"durable-memory")}read(e){ot(e);let r=Wr(this.dir,`${e}.md`);if(!kn(r))return null;let n=Ro(r,"utf8");return Ig(e,n)}write(e){ot(e.name),nO(this.dir,{recursive:!0});let r=Wr(this.dir,`${e.name}.md`),n=!kn(r),s=aO(e.name,e.type,e.description??null,e.body);return Rc(r,s,"utf8"),lO(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:i})=>({name:r,type:n,description:s,updated_at:i}))}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){ot(e);let r=Wr(this.dir,`${e}.md`);return kn(r)?(iO(r),dO(this.dir,e),!0):!1}listFiles(){if(!kn(this.dir))return[];let e=sO(this.dir).filter(n=>n.endsWith(".md")&&n!==Lc),r=[];for(let n of e){let s=n.slice(0,-3),i=Ro(Wr(this.dir,n),"utf8"),o=Ig(s,i);o!==null&&r.push(o)}return r.sort((n,s)=>n.name.localeCompare(s.name))}};xc=class{dal;projectId;constructor(e,r){this.dal=e,this.projectId=r}read(e){ot(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){ot(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 ot(e),this.dal.deleteDurableMemory(this.projectId,e)}}});function xg(t,e){let{dal:r}=e;t.get("/api/durable-memory/index/:project_id",n=>{let s=Number(n.req.param("project_id")),i=r.getProject(s);if(i===null)return n.json({error:"project not found"},404);let o=_t(i,r),a=n.req.query("types"),l=a!==void 0&&a.length>0?a.split(",").map(d=>d.trim()).filter(Boolean):void 0;return n.json(o.index(l))}),t.get("/api/durable-memory/read/:project_id/:name",n=>{let s=Number(n.req.param("project_id")),i=n.req.param("name"),o=r.getProject(s);if(o===null)return n.json({error:"project not found"},404);let a=_t(o,r),l;try{l=a.read(i)}catch(d){return n.json({error:d.message},400)}return l===null?n.json({error:`memory entry not found: ${i}`},404):n.json(l)}),t.post("/api/durable-memory/write/:project_id",async n=>{let s=Number(n.req.param("project_id")),i=r.getProject(s);if(i===null)return n.json({error:"project not found"},404);let o;try{o=await n.req.json()}catch{return n.json({error:"invalid JSON body"},400)}let a=typeof o.type=="string"?o.type:null,l=typeof o.name=="string"?o.name:null,d=typeof o.body=="string"?o.body:null,c=typeof o.description=="string"?o.description:null;if(a===null||!Ag.has(a))return n.json({error:`invalid type: must be one of ${[...Ag].join("|")}`},400);if(l===null)return n.json({error:"missing name"},400);if(d===null)return n.json({error:"missing body"},400);let u=_t(i,r),m;try{({created:m}=u.write({type:a,name:l,description:c,body:d}))}catch(f){return n.json({error:f.message},400)}return n.json({success:!0,created_or_updated:m?"created":"updated"})}),t.get("/api/durable-memory/list/:project_id",n=>{let s=Number(n.req.param("project_id")),i=r.getProject(s);if(i===null)return n.json({error:"project not found"},404);let o=_t(i,r),a=n.req.query("type");return n.json(o.list(a))})}var Ag,Rg=E(()=>{"use strict";Oc();Ag=new Set(["user","feedback","project","reference"])});function mO(t){let e=4294967295;for(let r=0;r<t.length;r+=1)e=(uO[(e^t[r])&255]^e>>>8)>>>0;return(e^4294967295)>>>0}function fO(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 Lg(t,e=new Date){let{time:r,date:n}=fO(e),s=[],i=[],o=0,a=new TextEncoder;for(let h of t){let g=a.encode(h.name),_=mO(h.data),y=h.data.length,T=new Uint8Array(30+g.length),v=new DataView(T.buffer);v.setUint32(0,67324752,!0),v.setUint16(4,20,!0),v.setUint16(6,0,!0),v.setUint16(8,0,!0),v.setUint16(10,r,!0),v.setUint16(12,n,!0),v.setUint32(14,_,!0),v.setUint32(18,y,!0),v.setUint32(22,y,!0),v.setUint16(26,g.length,!0),v.setUint16(28,0,!0),T.set(g,30),s.push(T,h.data);let k=new Uint8Array(46+g.length),A=new DataView(k.buffer);A.setUint32(0,33639248,!0),A.setUint16(4,20,!0),A.setUint16(6,20,!0),A.setUint16(8,0,!0),A.setUint16(10,0,!0),A.setUint16(12,r,!0),A.setUint16(14,n,!0),A.setUint32(16,_,!0),A.setUint32(20,y,!0),A.setUint32(24,y,!0),A.setUint16(28,g.length,!0),A.setUint16(30,0,!0),A.setUint16(32,0,!0),A.setUint16(34,0,!0),A.setUint16(36,0,!0),A.setUint32(38,0,!0),A.setUint32(42,o,!0),k.set(g,46),i.push(k),o+=T.length+h.data.length}let l=o,d=0;for(let h of i)d+=h.length;let c=new Uint8Array(22),u=new DataView(c.buffer);u.setUint32(0,101010256,!0),u.setUint16(4,0,!0),u.setUint16(6,0,!0),u.setUint16(8,t.length,!0),u.setUint16(10,t.length,!0),u.setUint32(12,d,!0),u.setUint32(16,l,!0),u.setUint16(20,0,!0);let m=l+d+c.length,f=new Uint8Array(m),p=0;for(let h of s)f.set(h,p),p+=h.length;for(let h of i)f.set(h,p),p+=h.length;return f.set(c,p),f}var uO,Og=E(()=>{"use strict";uO=(()=>{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 $o,mkdirSync as pO,readdirSync as _O,readFileSync as Mg,statSync as hO,unlinkSync as gO,writeFileSync as yO}from"node:fs";import{join as Rs}from"node:path";function Dg(t,e){let{dal:r}=e;t.post("/api/projects",async n=>{let s=await ht(n);if(typeof s=="string")return x(n,s,400);let i=ce(s,"name"),o=ce(s,"local_path");if(i===null||i.length===0)return x(n,"missing or empty name",400);if(o===null||o.length===0)return x(n,"missing or empty local_path",400);if(r.findProjectByName(i)!==null)return x(n,`project already exists: ${i}`,409);let a=ce(s,"workflow_name")??"bugfix",l,d=ce(s,"team_name");if(d!==null&&d.length>0){let u=r.findTeamByName(d);if(u===null)return x(n,`team not found: ${d}`,404);l=u.id}else{let u=r.listTeams();if(u.length===0)return x(n,"no teams exist; create a team first",400);l=u[0].id}let c=r.insertProject({name:i,local_path:o,workflow_name:a,team_id:l,default_branch:ce(s,"default_branch")});return n.json(c,201)}),t.patch("/api/projects/:name",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return x(n,"project not found",404);let i=await ht(n);if(typeof i=="string")return x(n,i,400);let o={};if(Object.prototype.hasOwnProperty.call(i,"local_path")){let l=i.local_path;if(typeof l!="string"||l.length===0)return x(n,"local_path must be a non-empty string",400);o.local_path=l}if(Object.prototype.hasOwnProperty.call(i,"durable_memory_mode")){let l=i.durable_memory_mode;if(l!=="folder"&&l!=="db")return x(n,'durable_memory_mode must be "folder" or "db"',400);o.durable_memory_mode=l}if(Object.prototype.hasOwnProperty.call(i,"default_branch")){let l=i.default_branch;if(l!==null&&typeof l!="string")return x(n,"default_branch must be string or null",400);o.default_branch=l}if(Object.prototype.hasOwnProperty.call(i,"intake_config")){let l=i.intake_config;if(l===null)o.intake_config=null;else if(typeof l=="string")o.intake_config=l;else if(typeof l=="object"&&!Array.isArray(l))o.intake_config=JSON.stringify(l);else return x(n,"intake_config must be a JSON object, string, or null",400)}let a=r.updateProjectSettings(s.id,o);return a===null?x(n,"project not found",404):n.json(a)}),t.post("/api/teams",async n=>{let s=await ht(n);if(typeof s=="string")return x(n,s,400);let i=ce(s,"name");if(i===null||i.length===0)return x(n,"missing or empty name",400);if(r.findTeamByName(i)!==null)return x(n,`team already exists: ${i}`,409);let o=r.insertTeam({name:i});return n.json(o,201)}),t.post("/api/teams/:name/members",async n=>{let s=r.findTeamByName(n.req.param("name"));if(s===null)return x(n,"team not found",404);let i=await ht(n);if(typeof i=="string")return x(n,i,400);let o=ce(i,"alias"),a=ce(i,"provider");if(o===null||o.length===0)return x(n,"missing or empty alias",400);if(a===null||a.length===0)return x(n,"missing or empty provider",400);if(r.findTeamMemberByAlias(s.id,o)!==null)return x(n,`member already exists: ${o}`,409);let l=ce(i,"model"),d=r.insertTeamMember({team_id:s.id,alias:o,provider:a,model:l,sessiondir:`.lmctl/sessions/${s.name}/${o}`}),c=ce(i,"role_prompt");c!==null&&r.setMemberRolePrompt(d.id,c);let u=r.findTeamMemberByAlias(s.id,o);return n.json(u??d,201)}),t.put("/api/teams/:name/members/:alias",async n=>{let s=r.findTeamByName(n.req.param("name"));if(s===null)return x(n,"team not found",404);let i=r.findTeamMemberByAlias(s.id,n.req.param("alias"));if(i===null)return x(n,"member not found",404);let o=await ht(n);if(typeof o=="string")return x(n,o,400);let a={};if(Object.prototype.hasOwnProperty.call(o,"role_prompt")){let d=o.role_prompt;if(d!==null&&typeof d!="string")return x(n,"role_prompt must be string or null",400);a.role_prompt=d}if(Object.prototype.hasOwnProperty.call(o,"model")){let d=o.model;if(d!==null&&typeof d!="string")return x(n,"model must be string or null",400);a.model=d}if(Object.prototype.hasOwnProperty.call(o,"provider")){let d=o.provider;if(typeof d!="string"||d.length===0)return x(n,"provider must be a non-empty string",400);a.provider=d}if(Object.keys(a).length===0)return x(n,"no updatable fields provided",400);let l=r.updateTeamMemberMeta(i.id,a);return l===null?x(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 x(n,"project not found",404);let i=_t(s,r);return n.json(i.index())}),t.post("/api/projects/:name/durable-memory",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return x(n,"project not found",404);let i=await ht(n);if(typeof i=="string")return x(n,i,400);let o=ce(i,"name"),a=ce(i,"body"),l=ce(i,"type");if(o===null||o.length===0)return x(n,"missing or empty name",400);if(a===null)return x(n,"missing body",400);if(l===null||!Lo.includes(l))return x(n,`invalid type: must be one of ${Lo.join("|")}`,400);try{ot(o)}catch(u){return x(n,u.message,400)}let d=_t(s,r);try{if(d.read(o)!==null)return x(n,`chapter already exists: ${o}`,409)}catch(u){return x(n,u.message,400)}try{d.write({type:l,name:o,description:ce(i,"description"),body:a})}catch(u){return x(n,u.message,400)}let c=d.read(o);return c===null?x(n,"chapter created but unreadable",500):n.json(c,201)}),t.get("/api/projects/:name/durable-memory/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return x(n,"project not found",404);let i=_t(s,r),o;try{o=i.read(n.req.param("chapter"))}catch(a){return x(n,a.message,400)}return o===null?x(n,"chapter not found",404):n.json(o)}),t.put("/api/projects/:name/durable-memory/:chapter",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return x(n,"project not found",404);let i=n.req.param("chapter"),o=await ht(n);if(typeof o=="string")return x(n,o,400);let a=_t(s,r),l;try{l=a.read(i)}catch(f){return x(n,f.message,400)}if(l===null)return x(n,"chapter not found",404);let d=ce(o,"body")??l.body,c=Object.prototype.hasOwnProperty.call(o,"description")?ce(o,"description"):l.description,u=ce(o,"type")??l.type;if(!Lo.includes(u))return x(n,`invalid type: must be one of ${Lo.join("|")}`,400);try{a.write({type:u,name:i,description:c,body:d})}catch(f){return x(n,f.message,400)}let m=a.read(i);return m===null?x(n,"chapter updated but unreadable",500):n.json(m)}),t.delete("/api/projects/:name/durable-memory/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return x(n,"project not found",404);let i=_t(s,r),o;try{o=i.delete(n.req.param("chapter"))}catch(a){return x(n,a.message,400)}return o?n.json({removed:!0}):x(n,"chapter not found",404)}),t.get("/api/projects/:name/ai-test",n=>{let s=r.findProjectByName(n.req.param("name"));return s===null?x(n,"project not found",404):n.json(wO(s.local_path))}),t.post("/api/projects/:name/ai-test",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return x(n,"project not found",404);let i=await ht(n);if(typeof i=="string")return x(n,i,400);let o=ce(i,"name"),a=ce(i,"body"),l=ce(i,"type");if(o===null||o.length===0)return x(n,"missing or empty name",400);if(a===null)return x(n,"missing body",400);if(l===null||!Oo.has(l))return x(n,`invalid type: must be one of ${[...Oo].join("|")}`,400);try{ot(o)}catch(m){return x(n,m.message,400)}let d=As(s.local_path),c=Rs(d,`${o}.md`);if($o(c))return x(n,`chapter already exists: ${o}`,409);pO(d,{recursive:!0}),Cg(c,o,l,ce(i,"description"),a);let u=xs(d,o);return u===null?x(n,"chapter created but unreadable",500):n.json(u,201)}),t.get("/api/projects/:name/ai-test/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return x(n,"project not found",404);try{ot(n.req.param("chapter"))}catch(o){return x(n,o.message,400)}let i=xs(As(s.local_path),n.req.param("chapter"));return i===null?x(n,"chapter not found",404):n.json(i)}),t.put("/api/projects/:name/ai-test/:chapter",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return x(n,"project not found",404);let i=n.req.param("chapter");try{ot(i)}catch(f){return x(n,f.message,400)}let o=As(s.local_path),a=xs(o,i);if(a===null)return x(n,"chapter not found",404);let l=await ht(n);if(typeof l=="string")return x(n,l,400);let d=ce(l,"body")??a.body,c=Object.prototype.hasOwnProperty.call(l,"description")?ce(l,"description"):a.description,u=ce(l,"type")??a.type;if(!Oo.has(u))return x(n,`invalid type: must be one of ${[...Oo].join("|")}`,400);Cg(Rs(o,`${i}.md`),i,u,c,d);let m=xs(o,i);return m===null?x(n,"chapter updated but unreadable",500):n.json(m)}),t.delete("/api/projects/:name/ai-test/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return x(n,"project not found",404);let i=n.req.param("chapter");try{ot(i)}catch(a){return x(n,a.message,400)}let o=Rs(As(s.local_path),`${i}.md`);return $o(o)?(gO(o),n.json({removed:!0})):x(n,"chapter not found",404)}),t.get("/api/tokens",n=>n.json([])),t.post("/api/tokens",n=>x(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"?x(n,s,400):n.json({accepted:s,note:"settings persistence not yet implemented"})}),t.get("/api/chat/sessions",n=>n.json(r.listChatbotSessions($g))),t.post("/api/chat/sessions",async n=>{let s=await EO(n);if(typeof s=="string")return x(n,s,400);let i=s!==null?ce(s,"title"):null,o=r.createChatbotSession($g,i);return n.json(o,201)}),t.get("/api/chat/sessions/:id/messages",n=>{let s=n.req.param("id");return r.getChatbotSession(s)===null?x(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 x(n,"chat session not found",404);let i=await ht(n);if(typeof i=="string")return x(n,i,400);let o=ce(i,"role"),a=ce(i,"content");if(o===null||o!=="user"&&o!=="assistant"&&o!=="tool")return x(n,"role must be one of user|assistant|tool",400);if(a===null)return x(n,"missing content",400);let l=r.appendChatbotMessage(s,o,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 x(n,"invalid run id",400);if(r.getRun(s)===null)return x(n,"run not found",404);let o=Pr(r,s),a=[];for(let d of o){let c=vO(d),u=null;if(d.content!==null&&d.content!==void 0)u=new TextEncoder().encode(d.content);else if(d.path!==null&&d.path!==void 0)try{let m=Mg(d.path),f=m.buffer.slice(m.byteOffset,m.byteOffset+m.byteLength);u=new Uint8Array(f)}catch{u=new Uint8Array(0)}u!==null&&a.push({name:c,data:u})}let l=Lg(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 x(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 EO(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 ce(t,e){let r=t[e];return typeof r!="string"?null:r}function As(t){return Rs(t,"ai-test")}function xs(t,e){let r=Rs(t,`${e}.md`);if(!$o(r))return null;let n=Mg(r,"utf8"),s=TO(n),i=hO(r).mtime.toISOString();return{name:e,type:s.type,description:s.description,body:s.body,updated_at:i}}function wO(t){let e=As(t);return $o(e)?_O(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:i,description:o,updated_at:a}=n;return{name:s,type:i,description:o,updated_at:a}}).filter(r=>r!==null):[]}function Cg(t,e,r,n,s){let i=n!==null&&n.length>0?`
2043
2043
  description: ${n}`:"",o=`---
2044
2044
  name: ${e}${i}
2045
2045
  type: ${r}
2046
2046
  ---
2047
- ${s}`;yO(t,o,"utf8")}function TO(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),i=r.match(/^description:\s*(.+)$/m);return{type:s?.[1]?.trim()??"scenario",description:i?.[1]?.trim()??null,body:n}}function vO(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?SO(t.path):bO(t.kind);return`step-${t.step_id}-${e}/${t.id}-${r}${n}`}function SO(t){let e=t.lastIndexOf(".");if(e<0)return"";let r=t.slice(e);return/^\.[A-Za-z0-9]+$/.test(r)?r:""}function bO(t){return t.endsWith("_md")||t.includes("markdown")?".md":t.endsWith("_json")||t.includes("json")?".json":".txt"}var Lo,Oo,$g,jg=E(()=>{"use strict";Vt();Og();$c();Lo=["user","feedback","project","reference"],Oo=new Set(["smoke","integration","vision","scenario","regression"]),$g="operator"});function $e(t,e){return`<!doctype html>
2047
+ ${s}`;yO(t,o,"utf8")}function TO(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),i=r.match(/^description:\s*(.+)$/m);return{type:s?.[1]?.trim()??"scenario",description:i?.[1]?.trim()??null,body:n}}function vO(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?SO(t.path):bO(t.kind);return`step-${t.step_id}-${e}/${t.id}-${r}${n}`}function SO(t){let e=t.lastIndexOf(".");if(e<0)return"";let r=t.slice(e);return/^\.[A-Za-z0-9]+$/.test(r)?r:""}function bO(t){return t.endsWith("_md")||t.includes("markdown")?".md":t.endsWith("_json")||t.includes("json")?".json":".txt"}var Lo,Oo,$g,jg=E(()=>{"use strict";Vt();Og();Oc();Lo=["user","feedback","project","reference"],Oo=new Set(["smoke","integration","vision","scenario","regression"]),$g="operator"});function $e(t,e){return`<!doctype html>
2048
2048
  <html lang="en">
2049
2049
  <head>
2050
2050
  <meta charset="utf-8">
@@ -2105,23 +2105,23 @@ ${s}`;yO(t,o,"utf8")}function TO(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r
2105
2105
  </nav>
2106
2106
  <main>${e}</main>
2107
2107
  </body>
2108
- </html>`}function S(t){return String(t??"").replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&#39;")}function _e(t,e){let r=t.map(s=>`<th>${S(s)}</th>`).join(""),n=e.length===0?`<tr><td colspan="${t.length}"><span class="muted">(empty)</span></td></tr>`:e.map(s=>`<tr>${s.map(i=>`<td>${i}</td>`).join("")}</tr>`).join("");return`<table><thead><tr>${r}</tr></thead><tbody>${n}</tbody></table>`}function fe(t){return`<pre>${S(JSON.stringify(t,null,2))}</pre>`}var Cc=E(()=>{"use strict"});import{createHash as kO}from"node:crypto";import{existsSync as Ls,mkdirSync as Fg,readFileSync as Os,readdirSync as IO,renameSync as NO,statSync as AO,unlinkSync as xO,writeFileSync as Co}from"node:fs";import{homedir as RO}from"node:os";import{dirname as Mc,isAbsolute as Pg,join as gt,relative as LO,resolve as In}from"node:path";import{fileURLToPath as OO}from"node:url";function Wg(t){let e=In(t);for(;;){let r=gt(e,Dc);try{if(AO(r).isDirectory())return r}catch{}let n=Mc(e);if(n===e)return null;e=n}}function jc(t=process.cwd()){let e=process.env.LMCTL_HOME;if(e!==void 0&&e.trim().length>0)return In(e);let r=Wg(t);return r!==null?r:gt(Ug(),Dc)}function qg(){return In(Mc(OO(import.meta.url)),"..","..","workflows")}function $O(t){let e=gt(t,Bg);try{let r=JSON.parse(Os(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 CO(t,e){Fg(t,{recursive:!0});let r=gt(t,Bg),n=`${r}.tmp-${process.pid}`;Co(n,`${JSON.stringify(e,null,2)}
2109
- `,"utf8"),NO(n,r)}function MO(t){if(typeof t=="object"&&t!==null&&"code"in t){let e=t.code;if(typeof e=="string")return e}}function DO(t,e,r,n,s){let i=`${e}.dist-${r}`;for(let o=0;o<1e3;o+=1){let a=o===0?i:`${i}-${o}`,l=gt(t,a);try{return Co(l,n,{flag:"wx"}),a}catch(d){if(MO(d)!=="EEXIST")throw d;if(Mo(Os(l))===s)return a}}throw new Error(`could not find available dist shadow path for ${e}`)}function jO(t,e){if(Pg(e)||Mc(e)!=="workflows")return null;let r=e.slice(10);if(r.length===0||r.includes("/")||r.includes("\\")||r.includes(".."))return null;let n=In(t,"templates","workflows"),s=In(t,"templates",e),i=LO(n,s);return i.length===0||i.startsWith("..")||Pg(i)||i.includes("/")||i.includes("\\")?null:s}function PO(t,e,r){for(let[n,s]of Object.entries(e.files)){if(r.has(n))continue;let i=jO(t,n);if(i===null){delete e.files[n];continue}if(!Ls(i)){delete e.files[n];continue}try{if(Mo(Os(i))!==s)continue;xO(i),delete e.files[n]}catch{}}}function Hg(t={}){let e=jc(t.cwd),r=gt(e,"templates","workflows"),n=qg(),s={basedir:e,copied:[],refreshed:[],preserved:[],shadowed:[]};try{let i=Ls(n)?IO(n).filter(d=>d.endsWith(".compound.json")||d.endsWith(".lmctl")||d==="index.jsonl"):[];if(i.length===0)return s;Fg(r,{recursive:!0});let o=$O(e),a=bt(),l=new Set(i.map(d=>`workflows/${d}`));for(let d of i){let c=`workflows/${d}`,u=Os(gt(n,d)),m=Mo(u),f=gt(r,d);if(!Ls(f)){try{Co(f,u,{flag:"wx"}),s.copied.push(d)}catch{}o.files[c]=m;continue}let p=Mo(Os(f));if(p===m){o.files[c]=m;continue}let h=o.files[c];if(h!==void 0&&p===h)Co(f,u),o.files[c]=m,s.refreshed.push(d);else{let g=DO(r,d,a,u,m);s.preserved.push(d),s.shadowed.push(g)}}PO(e,o,l),CO(e,{version:a,files:o.files})}catch(i){if(t.swallow!==!0)throw i}return s}function Pc(t){let e=[],r=process.env.LMCTL_HOME;r!==void 0&&r.trim().length>0&&e.push(In(r));let n=Wg(t??process.cwd());return n!==null&&e.push(n),e.push(gt(Ug(),Dc)),e}function Do(t,e){let r=Pc(e),n=[`${t}.compound.json`,`${t}.lmctl`];for(let s of r)for(let i of n){let o=gt(s,"templates","workflows",i);if(Ls(o))return o}for(let s of n){let i=gt(qg(),s);if(Ls(i))return i}return null}var Dc,Ug,Mo,Bg,Fc=E(()=>{"use strict";ts();Dc=".lmctl",Ug=()=>process.env.HOME??RO(),Mo=t=>kO("sha256").update(t).digest("hex");Bg=".dist-manifest.json"});function Xg(t,e){if(e.query(`SELECT sa.id FROM step_artifact sa
2108
+ </html>`}function S(t){return String(t??"").replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&#39;")}function _e(t,e){let r=t.map(s=>`<th>${S(s)}</th>`).join(""),n=e.length===0?`<tr><td colspan="${t.length}"><span class="muted">(empty)</span></td></tr>`:e.map(s=>`<tr>${s.map(i=>`<td>${i}</td>`).join("")}</tr>`).join("");return`<table><thead><tr>${r}</tr></thead><tbody>${n}</tbody></table>`}function fe(t){return`<pre>${S(JSON.stringify(t,null,2))}</pre>`}var $c=E(()=>{"use strict"});import{createHash as kO}from"node:crypto";import{existsSync as Ls,mkdirSync as Fg,readFileSync as Os,readdirSync as IO,renameSync as NO,statSync as AO,unlinkSync as xO,writeFileSync as Co}from"node:fs";import{homedir as RO}from"node:os";import{dirname as Cc,isAbsolute as Pg,join as gt,relative as LO,resolve as In}from"node:path";import{fileURLToPath as OO}from"node:url";function Wg(t){let e=In(t);for(;;){let r=gt(e,Mc);try{if(AO(r).isDirectory())return r}catch{}let n=Cc(e);if(n===e)return null;e=n}}function Dc(t=process.cwd()){let e=process.env.LMCTL_HOME;if(e!==void 0&&e.trim().length>0)return In(e);let r=Wg(t);return r!==null?r:gt(Ug(),Mc)}function qg(){return In(Cc(OO(import.meta.url)),"..","..","workflows")}function $O(t){let e=gt(t,Bg);try{let r=JSON.parse(Os(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 CO(t,e){Fg(t,{recursive:!0});let r=gt(t,Bg),n=`${r}.tmp-${process.pid}`;Co(n,`${JSON.stringify(e,null,2)}
2109
+ `,"utf8"),NO(n,r)}function MO(t){if(typeof t=="object"&&t!==null&&"code"in t){let e=t.code;if(typeof e=="string")return e}}function DO(t,e,r,n,s){let i=`${e}.dist-${r}`;for(let o=0;o<1e3;o+=1){let a=o===0?i:`${i}-${o}`,l=gt(t,a);try{return Co(l,n,{flag:"wx"}),a}catch(d){if(MO(d)!=="EEXIST")throw d;if(Mo(Os(l))===s)return a}}throw new Error(`could not find available dist shadow path for ${e}`)}function jO(t,e){if(Pg(e)||Cc(e)!=="workflows")return null;let r=e.slice(10);if(r.length===0||r.includes("/")||r.includes("\\")||r.includes(".."))return null;let n=In(t,"templates","workflows"),s=In(t,"templates",e),i=LO(n,s);return i.length===0||i.startsWith("..")||Pg(i)||i.includes("/")||i.includes("\\")?null:s}function PO(t,e,r){for(let[n,s]of Object.entries(e.files)){if(r.has(n))continue;let i=jO(t,n);if(i===null){delete e.files[n];continue}if(!Ls(i)){delete e.files[n];continue}try{if(Mo(Os(i))!==s)continue;xO(i),delete e.files[n]}catch{}}}function Hg(t={}){let e=Dc(t.cwd),r=gt(e,"templates","workflows"),n=qg(),s={basedir:e,copied:[],refreshed:[],preserved:[],shadowed:[]};try{let i=Ls(n)?IO(n).filter(d=>d.endsWith(".compound.json")||d.endsWith(".lmctl")||d==="index.jsonl"):[];if(i.length===0)return s;Fg(r,{recursive:!0});let o=$O(e),a=bt(),l=new Set(i.map(d=>`workflows/${d}`));for(let d of i){let c=`workflows/${d}`,u=Os(gt(n,d)),m=Mo(u),f=gt(r,d);if(!Ls(f)){try{Co(f,u,{flag:"wx"}),s.copied.push(d)}catch{}o.files[c]=m;continue}let p=Mo(Os(f));if(p===m){o.files[c]=m;continue}let h=o.files[c];if(h!==void 0&&p===h)Co(f,u),o.files[c]=m,s.refreshed.push(d);else{let g=DO(r,d,a,u,m);s.preserved.push(d),s.shadowed.push(g)}}PO(e,o,l),CO(e,{version:a,files:o.files})}catch(i){if(t.swallow!==!0)throw i}return s}function jc(t){let e=[],r=process.env.LMCTL_HOME;r!==void 0&&r.trim().length>0&&e.push(In(r));let n=Wg(t??process.cwd());return n!==null&&e.push(n),e.push(gt(Ug(),Mc)),e}function Do(t,e){let r=jc(e),n=[`${t}.compound.json`,`${t}.lmctl`];for(let s of r)for(let i of n){let o=gt(s,"templates","workflows",i);if(Ls(o))return o}for(let s of n){let i=gt(qg(),s);if(Ls(i))return i}return null}var Mc,Ug,Mo,Bg,Pc=E(()=>{"use strict";ts();Mc=".lmctl",Ug=()=>process.env.HOME??RO(),Mo=t=>kO("sha256").update(t).digest("hex");Bg=".dist-manifest.json"});function Xg(t,e){if(e.query(`SELECT sa.id FROM step_artifact sa
2110
2110
  JOIN step s ON s.id = sa.step_id
2111
2111
  WHERE s.run_id = ? AND sa.kind = 'run_report' LIMIT 1`,t).length>0)return;let n=e.getRun(t);if(n===null)return;let s=e.query("SELECT id FROM step WHERE run_id = ? ORDER BY id DESC LIMIT 1",t);if(s.length===0)return;let i=s[0].id,o=e.query("SELECT id, state_name, outcome, started_at, ended_at FROM step WHERE run_id = ? ORDER BY id ASC",t),a=e.query(`SELECT sa.id, sa.step_id, sa.kind FROM step_artifact sa
2112
2112
  JOIN step s ON s.id = sa.step_id
2113
2113
  WHERE s.run_id = ? ORDER BY sa.id ASC`,t),l=new Map;for(let R of a){let Z=l.get(R.step_id)??[];Z.push({kind:R.kind,id:R.id}),l.set(R.step_id,Z)}let d=o.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)??[]})),c=e.query("SELECT kind, COUNT(*) AS count FROM session_event WHERE run_id = ? GROUP BY kind",t),u=e.query("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'tool_result' AND payload_truncated = 0",t),m=0;for(let R of u)try{let Z=JSON.parse(R.payload);typeof Z.elapsedMs=="number"&&Z.elapsedMs>0&&(m+=Z.elapsedMs)}catch{}let f=c.map(R=>({kind:R.kind,count:R.count,total_elapsed_ms:R.kind==="tool_result"?m:0})),p=d.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(),T=e.query("SELECT project_id FROM job WHERE id = ?",n.job_id)[0]?.project_id??null,v=T!==null?e.query(`SELECT id, signal_kind, severity, description, detected_at FROM drift_signal
2114
2114
  WHERE project_id = ? AND detected_at >= ? AND detected_at <= ? ORDER BY detected_at ASC`,T,g,_):[],A=e.query(`SELECT SUM(input_tokens) AS input, SUM(output_tokens) AS output
2115
- FROM session_size WHERE observed_at >= ? AND observed_at <= ?`,n.started_at,n.ended_at??new Date().toISOString())[0],z=A?.input!==null&&A?.input!==void 0?`input: ${A.input}, output: ${A.output??0}`:"n/a",Se=e.getWorkflow(n.workflow_id),W=n.started_at!==null&&n.ended_at!==null?Math.max(0,new Date(n.ended_at).getTime()-new Date(n.started_at).getTime()):null,F={run_id:t,workflow_name:Se?.name??null,started_at:n.started_at,ended_at:n.ended_at,terminal_state:n.terminal_state,duration_ms:W,steps:d,tool_stats:f,reviewer_interventions:{count:p.length,state_names:h},drift_signals:v,token_totals:z};e.insertStepArtifact({step_id:i,kind:"run_report",content:JSON.stringify(F)})}var Jg=E(()=>{"use strict"});import{spawnSync as Vg}from"node:child_process";function Uc(t){return FO[t]??`no install hint; ensure '${t}' is on PATH`}function UO(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 Gg(t){return Vg("which",[t],{encoding:"utf8"}).status===0}function Kg(t){if(t===void 0)return null;for(let e of t.tools??[])if(!Gg(e)){let r=Uc(e);return{kind:"missing_tool",tool:e,install_hint:r,message:`missing dependency: ${e}; ${r}`}}for(let e of t.auth??[]){if(!Gg(e)){let s=Uc(e);return{kind:"missing_tool",tool:e,install_hint:s,message:`missing dependency: ${e}; ${s}`}}let r=UO(e);if(r===null)continue;let n=Vg(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:Uc(e),message:`${e} not authenticated; run \`${e} login\` or equivalent`,detail:s.length>0?s:void 0}}}return null}var FO,Yg=E(()=>{"use strict";FO={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 WO,readdirSync as qO,readFileSync as BO}from"node:fs";import{join as zg}from"node:path";function HO(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(i=>i.trim()).filter(Boolean);let s=r.match(/^tags:\s*\n((?:\s*-\s+.+\n?)*)/m);return s?s[1].split(`
2116
- `).map(i=>i.replace(/^\s*-\s+/,"").trim()).filter(Boolean):[]}function Zg(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 Qg(t,e){if(e.length===0)return null;let r=zg(t,"durable-memory");if(!WO(r))return null;let n;try{n=qO(r).filter(i=>i.endsWith(".md")&&i!=="index.md")}catch{return null}let s=[];for(let i of n)try{let o=BO(zg(r,i),"utf8");if(HO(o).some(l=>e.includes(l))){let l=Zg(o,"name")??i.replace(".md",""),d=Zg(o,"description");s.push(d?`${l} (${d})`:l)}}catch{}return s.length===0?null:`[Durable-memory entries relevant to this task: ${s.join(", ")}. Pull the full chapter as needed.]`}var ey=E(()=>{"use strict"});function Bc(t){let e=t.trim().replace(XO,"").trim();for(let r=0;r<4;r+=1){let n=JO.exec(e);if(n===null)break;e=n[2].trim()}return e}function ty(t){let e=t.trim(),r=GO.exec(e);if(r!==null)return r[2];let n=VO.exec(e);return n!==null?n[0]:null}function $s(t,e){let r=t.split(`
2117
- `),n=null,s=-1;for(let o=0;o<r.length;o+=1){let a=Bc(r[o]),l=Wc.exec(a);if(l===null)continue;let d=l[1].trim();if(qc.test(d))continue;let c=ty(d);c!==null&&(n=c,s=o)}if(n===null)return{outcome:null,reason:"no_stance"};if(!e.includes(n))return{outcome:null,reason:"unknown_outcome",actual:n};let i={};for(let o=s-1;o>=0;o-=1){let a=Bc(r[o]),l=Wc.exec(a);if(l===null)break;let d=qc.exec(l[1].trim());if(d===null)break;i[d[1]]=d[2].trim()}return{outcome:n,evidence:i}}function ry(t){let e=t.split(`
2118
- `),r=null;for(let n=0;n<e.length;n+=1){let s=Bc(e[n]),i=Wc.exec(s);if(i===null)continue;let o=i[1].trim();if(qc.test(o))continue;let a=ty(o);if(a===null||!ln(a))continue;let d=o.slice(o.indexOf(a)+a.length).replace(/^[`*_:\s\-–—]+/,"").trim();r={token:a,reason:d}}return r}var XO,JO,Wc,qc,GO,VO,Hc=E(()=>{"use strict";cs();XO=/^#{1,6}\s+/,JO=/^(```|\*\*|__|`|\*|_)([\s\S]+?)\1$/,Wc=/^STANCE:\s+(.+)$/,qc=/^([A-Z][A-Z0-9_]*):\s*(.+)$/,GO=/^(```|\*\*|__|`|\*|_)([A-Za-z0-9_-]+)\1/,VO=/^[A-Za-z0-9_-]+/});function ny(t,e,r){return n=>{let s=r(),i=Date.now(),o=JSON.stringify({kind:n.kind,tool:n.tool??null,summary:n.summary??null,id:n.id??null,elapsedMs:n.elapsedMs??null,status:n.status??null}),a=Buffer.byteLength(o,"utf8");if(a<=262144){t.insertSessionEvent({run_id:e,step_id:s,kind:n.kind,timestamp_ms:i,payload:o});return}let l=o.slice(0,1024),d=JSON.stringify({truncated:!0,size:a,preview:l});if(s!==null){let c=t.insertStepArtifact({step_id:s,kind:"session_event_overflow",content:o});t.insertSessionEvent({run_id:e,step_id:s,kind:n.kind,timestamp_ms:i,payload:d,payload_truncated:1,overflow_artifact_id:c.id})}else t.insertSessionEvent({run_id:e,step_id:null,kind:n.kind,timestamp_ms:i,payload:d,payload_truncated:1,overflow_artifact_id:null})}}var sy=E(()=>{"use strict"});import{readFileSync as KO}from"node:fs";import{dirname as YO,join as zO}from"node:path";import{fileURLToPath as ZO}from"node:url";function t$(t){return t.rules.map(e=>({command:e.command,subcommands:e.argv_patterns.map(r=>r.trim().split(/\s+/)),kind:e.kind}))}function i$(t){let e=[],r=[];for(let n of t)QO.has(n)?(r.length>0&&e.push(r),r=[]):r.push(n);return r.length>0&&e.push(r),e}function o$(t,e){if(t.length===0)return{matched:!1};let r=0;for(;r<t.length&&e$.test(t[r]);)r+=1;if(r>=t.length)return{matched:!1};let n=t[r],s=t.slice(r+1);for(let i of e)if(n===i.command){for(let o of i.subcommands)if(o.every((l,d)=>s[d]===l))return{matched:!0,kind:i.kind}}return{matched:!1}}function a$(t,e){if(t.length===0)return{matched:!1};let r=i$(t);for(let n of r){let s=o$(n,e);if(s.matched)return s}return{matched:!1}}function Xc(t){return a$(t,s$)}function l$(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 Jc(t){return l$(t).split(" ").filter(e=>e.length>0)}var QO,e$,r$,n$,s$,iy=E(()=>{"use strict";QO=new Set(["&&","||",";","|",">",">>","<","<<"]),e$=/^[A-Za-z_][A-Za-z0-9_]*=/;r$=YO(ZO(import.meta.url)),n$=JSON.parse(KO(zO(r$,"side_effect_classifier.json"),"utf-8")),s$=t$(n$)});function jo(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 oy(t,e){try{return await Ur(Gc(t)??t,jo(e))===!0}catch{return!1}}async function Po(t,e){try{return await Ur(Gc(t)??t,jo(e))}catch{return}}async function ay(t,e){if(typeof t!="string")return t;let r=Gc(t);if(r===null)return t;try{return await Ur(r,jo(e))}catch{return}}async function ly(t,e){let r=Array.from(t.matchAll(/=\{\{([\s\S]*?)\}\}/g));if(r.length===0)return t;let n="",s=0;for(let i of r){let o=i.index??0;n+=t.slice(s,o);let a=i[1]?.trim()??"";try{n+=d$(await Ur(a,jo(e)))}catch{n+=""}s=o+i[0].length}return n+=t.slice(s),n}function Gc(t){let e=t.trim();return!e.startsWith("={{")||!e.endsWith("}}")?null:e.slice(3,-2).trim()}function d$(t){return t==null?"":typeof t=="string"?t:JSON.stringify(t)}var Cs=E(()=>{"use strict";ks()});import{existsSync as dy,readdirSync as cy,readFileSync as c$,statSync as uy}from"node:fs";import{join as Uo}from"node:path";function my(t,e,r,n){return Object.assign(t,{stateId:e,state:r,displayName:n})}function B(t,e){return t.dal.insertStep({...e,parent_step_id:t.parent_step_id})}function X(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 at(t,e,r,n,s={}){let i=$(),o=B(t,{run_id:t.run_id,state_name:e.name});t.steps_executed+=1,t.dal.finishStep(o.id,null,`escalation:${n}`.slice(0,480)),t.dal.setRunPausedState(t.run_id,`${Ms}${e.id}`,i);let a=t.dal.getRun(t.run_id),l=ln(r)?"generic":"unhandled";return t.dal.raiseAttention({kind:Ei,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:o.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:u$(s.agent_output??n),paused_at:i,created_at:i})}),t.dal.pauseJob(t.job.id),{kind:"paused"}}function u$(t){return t.length>8e3?`${t.slice(0,8e3)}
2119
- \u2026[truncated ${t.length-8e3} chars]`:t}function J(t,e,r,n){t.outcomes[e]=n,r!==e&&(t.outcomes[r]=n)}function K(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 fy(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 i=wr(t.job.payload)?.[n];if(Array.isArray(i)&&i.every(o=>typeof o=="string"))return i}return null}async function et(t,e,r){let n=t.replace(/(?<!=)\{\{\s*([a-zA-Z0-9_.]+)\s*\}\}/g,(s,i)=>{if(i==="run_id")return String(e.run_id);if(i==="state_id")return r;if(i==="item")return e.iteration?.item??"";if(i==="index")return e.iteration===null?"":String(e.iteration.index);if(i.startsWith("project.")){let o=i.slice(8);if(o==="id")return String(e.project.id);if(o==="name")return e.project.name;if(o==="local_path")return e.project.local_path;if(o==="default_branch")return e.project.default_branch??"";if(o==="owner"){let a=e.project.name.indexOf("/");return a>0?e.project.name.slice(0,a):""}if(o==="repo"){let a=e.project.name.indexOf("/");return a>0?e.project.name.slice(a+1):e.project.name}if(o==="test_command"){let a=e.project.test_command;return a===null||a===""?"npm test":a}return""}if(i==="job_payload"){let o=wr(e.job.payload);return o===null?"":JSON.stringify(o)}if(i.startsWith("job_payload.")){let o=i.slice(12),l=wr(e.job.payload)?.[o];return l==null?"":String(l)}if(i.startsWith("outcomes.")){let o=m$(e.outcomes,i.slice(9));return o==null?"":typeof o=="string"?o:JSON.stringify(o)}return""});return ly(n,e)}function m$(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 wr(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 Ds(t){let{context:e,stateId:r,member:n,prompt:s,stepId:i,timeoutMs:o,writesToProjectPath:a}=t,l=ny(e.dal,e.run_id,()=>i),d=Vc(e,r),c={violation:null},u=y=>{if(l(y),c.violation===null&&y.kind==="tool_use"&&y.tool==="Bash"&&y.summary){let T=Jc(y.summary),v=Xc(T);v.matched&&!d&&(c.violation={summary:y.summary,kind:v.kind})}},m=new Date(Date.now()-1),f=0,p=0,h=y=>{u(y),f$(y,(T,v)=>{f+=T,p+=v})},g=await Ki({sessionid:n.sessionid,sessiondir:n.sessiondir,prompt:s,timeoutMs:o,dal:e.dal,team_member_id:n.id,onProgress:h});e.dal.insertSessionEvent({run_id:e.run_id,step_id:i,kind:"agent_call",timestamp_ms:Date.now(),payload:JSON.stringify({alias:n.alias,provider:Xe(n),model:n.model??"unknown",tokens_in:f,tokens_out:p,wall_time_ms:g.ms})}),p$(e.project,e.dal,m);let _=c.violation;return _!==null?{kind:"g3_violation",summary:_.summary,violationKind:_.kind}:!a&&e.project.local_path.trim().length>0&&Kc(e.project.local_path,m)?{kind:"g2_violation"}:{kind:"ok",text:g.text,ms:g.ms,argv:g.argv}}function f$(t,e){let r=t.raw;if(r==null)return;let s=r.message?.usage;if(s!==void 0){let o=Fo(s.input_tokens),a=Fo(s.output_tokens);(o>0||a>0)&&e(o,a);return}let i=r.usage;if(i!==void 0){let o=Fo(i.input_tokens),a=Fo(i.output_tokens);(o>0||a>0)&&e(o,a)}}function Fo(t){return typeof t=="number"&&Number.isFinite(t)&&t>=0?t:0}async function zt(t,e,r,n){if(r.sessionid===null)return;let s=`${e}:write_back`,i=B(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 Ds({context:t,stateId:s,member:r,prompt:a,stepId:i.id,timeoutMs:t.workflow.default_task_timeout_ms,writesToProjectPath:!1});if(l.kind==="ok"){t.dal.insertStepArtifact({step_id:i.id,kind:"write_back_transcript",content:l.text});let d=!l.text.includes("STANCE: no_writeback");t.dal.finishStep(i.id,d?"wrote_back":"no_writeback","write_back_turn")}else t.dal.finishStep(i.id,null,`write_back_${l.kind}`)}catch{t.dal.finishStep(i.id,null,"write_back_error")}}async function Nn(t,e,r,n,s,i,o,a=!1,l){let d=t.membersByAlias.get(r.alias);if(d===void 0||d.sessionid===null)return{outcome:null,text:"",status_detail:`missing_agent:${r.alias}`};let c=B(t,{run_id:t.run_id,state_name:e});t.steps_executed+=1;let u=[];d.prompt_snapshot!==null&&d.prompt_snapshot.length>0&&u.push(d.prompt_snapshot),i&&u.push(Rp(s)),l!=null&&l.length>0&&u.push(l);let m=r.prompt_template!==void 0?await et(r.prompt_template,t,e):"";m.length>0&&u.push(m),n!==null&&n.length>0&&u.push(n);let f=u.join(`
2115
+ FROM session_size WHERE observed_at >= ? AND observed_at <= ?`,n.started_at,n.ended_at??new Date().toISOString())[0],z=A?.input!==null&&A?.input!==void 0?`input: ${A.input}, output: ${A.output??0}`:"n/a",Se=e.getWorkflow(n.workflow_id),W=n.started_at!==null&&n.ended_at!==null?Math.max(0,new Date(n.ended_at).getTime()-new Date(n.started_at).getTime()):null,F={run_id:t,workflow_name:Se?.name??null,started_at:n.started_at,ended_at:n.ended_at,terminal_state:n.terminal_state,duration_ms:W,steps:d,tool_stats:f,reviewer_interventions:{count:p.length,state_names:h},drift_signals:v,token_totals:z};e.insertStepArtifact({step_id:i,kind:"run_report",content:JSON.stringify(F)})}var Jg=E(()=>{"use strict"});import{spawnSync as Vg}from"node:child_process";function Fc(t){return FO[t]??`no install hint; ensure '${t}' is on PATH`}function UO(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 Gg(t){return Vg("which",[t],{encoding:"utf8"}).status===0}function Kg(t){if(t===void 0)return null;for(let e of t.tools??[])if(!Gg(e)){let r=Fc(e);return{kind:"missing_tool",tool:e,install_hint:r,message:`missing dependency: ${e}; ${r}`}}for(let e of t.auth??[]){if(!Gg(e)){let s=Fc(e);return{kind:"missing_tool",tool:e,install_hint:s,message:`missing dependency: ${e}; ${s}`}}let r=UO(e);if(r===null)continue;let n=Vg(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:Fc(e),message:`${e} not authenticated; run \`${e} login\` or equivalent`,detail:s.length>0?s:void 0}}}return null}var FO,Yg=E(()=>{"use strict";FO={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 WO,readdirSync as qO,readFileSync as BO}from"node:fs";import{join as zg}from"node:path";function HO(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(i=>i.trim()).filter(Boolean);let s=r.match(/^tags:\s*\n((?:\s*-\s+.+\n?)*)/m);return s?s[1].split(`
2116
+ `).map(i=>i.replace(/^\s*-\s+/,"").trim()).filter(Boolean):[]}function Zg(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 Qg(t,e){if(e.length===0)return null;let r=zg(t,"durable-memory");if(!WO(r))return null;let n;try{n=qO(r).filter(i=>i.endsWith(".md")&&i!=="index.md")}catch{return null}let s=[];for(let i of n)try{let o=BO(zg(r,i),"utf8");if(HO(o).some(l=>e.includes(l))){let l=Zg(o,"name")??i.replace(".md",""),d=Zg(o,"description");s.push(d?`${l} (${d})`:l)}}catch{}return s.length===0?null:`[Durable-memory entries relevant to this task: ${s.join(", ")}. Pull the full chapter as needed.]`}var ey=E(()=>{"use strict"});function qc(t){let e=t.trim().replace(XO,"").trim();for(let r=0;r<4;r+=1){let n=JO.exec(e);if(n===null)break;e=n[2].trim()}return e}function ty(t){let e=t.trim(),r=GO.exec(e);if(r!==null)return r[2];let n=VO.exec(e);return n!==null?n[0]:null}function $s(t,e){let r=t.split(`
2117
+ `),n=null,s=-1;for(let o=0;o<r.length;o+=1){let a=qc(r[o]),l=Uc.exec(a);if(l===null)continue;let d=l[1].trim();if(Wc.test(d))continue;let c=ty(d);c!==null&&(n=c,s=o)}if(n===null)return{outcome:null,reason:"no_stance"};if(!e.includes(n))return{outcome:null,reason:"unknown_outcome",actual:n};let i={};for(let o=s-1;o>=0;o-=1){let a=qc(r[o]),l=Uc.exec(a);if(l===null)break;let d=Wc.exec(l[1].trim());if(d===null)break;i[d[1]]=d[2].trim()}return{outcome:n,evidence:i}}function ry(t){let e=t.split(`
2118
+ `),r=null;for(let n=0;n<e.length;n+=1){let s=qc(e[n]),i=Uc.exec(s);if(i===null)continue;let o=i[1].trim();if(Wc.test(o))continue;let a=ty(o);if(a===null||!ln(a))continue;let d=o.slice(o.indexOf(a)+a.length).replace(/^[`*_:\s\-–—]+/,"").trim();r={token:a,reason:d}}return r}var XO,JO,Uc,Wc,GO,VO,Bc=E(()=>{"use strict";cs();XO=/^#{1,6}\s+/,JO=/^(```|\*\*|__|`|\*|_)([\s\S]+?)\1$/,Uc=/^STANCE:\s+(.+)$/,Wc=/^([A-Z][A-Z0-9_]*):\s*(.+)$/,GO=/^(```|\*\*|__|`|\*|_)([A-Za-z0-9_-]+)\1/,VO=/^[A-Za-z0-9_-]+/});function ny(t,e,r){return n=>{let s=r(),i=Date.now(),o=JSON.stringify({kind:n.kind,tool:n.tool??null,summary:n.summary??null,id:n.id??null,elapsedMs:n.elapsedMs??null,status:n.status??null}),a=Buffer.byteLength(o,"utf8");if(a<=262144){t.insertSessionEvent({run_id:e,step_id:s,kind:n.kind,timestamp_ms:i,payload:o});return}let l=o.slice(0,1024),d=JSON.stringify({truncated:!0,size:a,preview:l});if(s!==null){let c=t.insertStepArtifact({step_id:s,kind:"session_event_overflow",content:o});t.insertSessionEvent({run_id:e,step_id:s,kind:n.kind,timestamp_ms:i,payload:d,payload_truncated:1,overflow_artifact_id:c.id})}else t.insertSessionEvent({run_id:e,step_id:null,kind:n.kind,timestamp_ms:i,payload:d,payload_truncated:1,overflow_artifact_id:null})}}var sy=E(()=>{"use strict"});import{readFileSync as KO}from"node:fs";import{dirname as YO,join as zO}from"node:path";import{fileURLToPath as ZO}from"node:url";function t$(t){return t.rules.map(e=>({command:e.command,subcommands:e.argv_patterns.map(r=>r.trim().split(/\s+/)),kind:e.kind}))}function i$(t){let e=[],r=[];for(let n of t)QO.has(n)?(r.length>0&&e.push(r),r=[]):r.push(n);return r.length>0&&e.push(r),e}function o$(t,e){if(t.length===0)return{matched:!1};let r=0;for(;r<t.length&&e$.test(t[r]);)r+=1;if(r>=t.length)return{matched:!1};let n=t[r],s=t.slice(r+1);for(let i of e)if(n===i.command){for(let o of i.subcommands)if(o.every((l,d)=>s[d]===l))return{matched:!0,kind:i.kind}}return{matched:!1}}function a$(t,e){if(t.length===0)return{matched:!1};let r=i$(t);for(let n of r){let s=o$(n,e);if(s.matched)return s}return{matched:!1}}function Hc(t){return a$(t,s$)}function l$(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 Xc(t){return l$(t).split(" ").filter(e=>e.length>0)}var QO,e$,r$,n$,s$,iy=E(()=>{"use strict";QO=new Set(["&&","||",";","|",">",">>","<","<<"]),e$=/^[A-Za-z_][A-Za-z0-9_]*=/;r$=YO(ZO(import.meta.url)),n$=JSON.parse(KO(zO(r$,"side_effect_classifier.json"),"utf-8")),s$=t$(n$)});function jo(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 oy(t,e){try{return await Ur(Jc(t)??t,jo(e))===!0}catch{return!1}}async function Po(t,e){try{return await Ur(Jc(t)??t,jo(e))}catch{return}}async function ay(t,e){if(typeof t!="string")return t;let r=Jc(t);if(r===null)return t;try{return await Ur(r,jo(e))}catch{return}}async function ly(t,e){let r=Array.from(t.matchAll(/=\{\{([\s\S]*?)\}\}/g));if(r.length===0)return t;let n="",s=0;for(let i of r){let o=i.index??0;n+=t.slice(s,o);let a=i[1]?.trim()??"";try{n+=d$(await Ur(a,jo(e)))}catch{n+=""}s=o+i[0].length}return n+=t.slice(s),n}function Jc(t){let e=t.trim();return!e.startsWith("={{")||!e.endsWith("}}")?null:e.slice(3,-2).trim()}function d$(t){return t==null?"":typeof t=="string"?t:JSON.stringify(t)}var Cs=E(()=>{"use strict";ks()});import{existsSync as dy,readdirSync as cy,readFileSync as c$,statSync as uy}from"node:fs";import{join as Uo}from"node:path";function my(t,e,r,n){return Object.assign(t,{stateId:e,state:r,displayName:n})}function B(t,e){return t.dal.insertStep({...e,parent_step_id:t.parent_step_id})}function X(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 at(t,e,r,n,s={}){let i=$(),o=B(t,{run_id:t.run_id,state_name:e.name});t.steps_executed+=1,t.dal.finishStep(o.id,null,`escalation:${n}`.slice(0,480)),t.dal.setRunPausedState(t.run_id,`${Ms}${e.id}`,i);let a=t.dal.getRun(t.run_id),l=ln(r)?"generic":"unhandled";return t.dal.raiseAttention({kind:Ei,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:o.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:u$(s.agent_output??n),paused_at:i,created_at:i})}),t.dal.pauseJob(t.job.id),{kind:"paused"}}function u$(t){return t.length>8e3?`${t.slice(0,8e3)}
2119
+ \u2026[truncated ${t.length-8e3} chars]`:t}function J(t,e,r,n){t.outcomes[e]=n,r!==e&&(t.outcomes[r]=n)}function K(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 fy(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 i=wr(t.job.payload)?.[n];if(Array.isArray(i)&&i.every(o=>typeof o=="string"))return i}return null}async function et(t,e,r){let n=t.replace(/(?<!=)\{\{\s*([a-zA-Z0-9_.]+)\s*\}\}/g,(s,i)=>{if(i==="run_id")return String(e.run_id);if(i==="state_id")return r;if(i==="item")return e.iteration?.item??"";if(i==="index")return e.iteration===null?"":String(e.iteration.index);if(i.startsWith("project.")){let o=i.slice(8);if(o==="id")return String(e.project.id);if(o==="name")return e.project.name;if(o==="local_path")return e.project.local_path;if(o==="default_branch")return e.project.default_branch??"";if(o==="owner"){let a=e.project.name.indexOf("/");return a>0?e.project.name.slice(0,a):""}if(o==="repo"){let a=e.project.name.indexOf("/");return a>0?e.project.name.slice(a+1):e.project.name}if(o==="test_command"){let a=e.project.test_command;return a===null||a===""?"npm test":a}return""}if(i==="job_payload"){let o=wr(e.job.payload);return o===null?"":JSON.stringify(o)}if(i.startsWith("job_payload.")){let o=i.slice(12),l=wr(e.job.payload)?.[o];return l==null?"":String(l)}if(i.startsWith("outcomes.")){let o=m$(e.outcomes,i.slice(9));return o==null?"":typeof o=="string"?o:JSON.stringify(o)}return""});return ly(n,e)}function m$(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 wr(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 Ds(t){let{context:e,stateId:r,member:n,prompt:s,stepId:i,timeoutMs:o,writesToProjectPath:a}=t,l=ny(e.dal,e.run_id,()=>i),d=Gc(e,r),c={violation:null},u=y=>{if(l(y),c.violation===null&&y.kind==="tool_use"&&y.tool==="Bash"&&y.summary){let T=Xc(y.summary),v=Hc(T);v.matched&&!d&&(c.violation={summary:y.summary,kind:v.kind})}},m=new Date(Date.now()-1),f=0,p=0,h=y=>{u(y),f$(y,(T,v)=>{f+=T,p+=v})},g=await Ki({sessionid:n.sessionid,sessiondir:n.sessiondir,prompt:s,timeoutMs:o,dal:e.dal,team_member_id:n.id,onProgress:h});e.dal.insertSessionEvent({run_id:e.run_id,step_id:i,kind:"agent_call",timestamp_ms:Date.now(),payload:JSON.stringify({alias:n.alias,provider:Xe(n),model:n.model??"unknown",tokens_in:f,tokens_out:p,wall_time_ms:g.ms})}),p$(e.project,e.dal,m);let _=c.violation;return _!==null?{kind:"g3_violation",summary:_.summary,violationKind:_.kind}:!a&&e.project.local_path.trim().length>0&&Vc(e.project.local_path,m)?{kind:"g2_violation"}:{kind:"ok",text:g.text,ms:g.ms,argv:g.argv}}function f$(t,e){let r=t.raw;if(r==null)return;let s=r.message?.usage;if(s!==void 0){let o=Fo(s.input_tokens),a=Fo(s.output_tokens);(o>0||a>0)&&e(o,a);return}let i=r.usage;if(i!==void 0){let o=Fo(i.input_tokens),a=Fo(i.output_tokens);(o>0||a>0)&&e(o,a)}}function Fo(t){return typeof t=="number"&&Number.isFinite(t)&&t>=0?t:0}async function zt(t,e,r,n){if(r.sessionid===null)return;let s=`${e}:write_back`,i=B(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 Ds({context:t,stateId:s,member:r,prompt:a,stepId:i.id,timeoutMs:t.workflow.default_task_timeout_ms,writesToProjectPath:!1});if(l.kind==="ok"){t.dal.insertStepArtifact({step_id:i.id,kind:"write_back_transcript",content:l.text});let d=!l.text.includes("STANCE: no_writeback");t.dal.finishStep(i.id,d?"wrote_back":"no_writeback","write_back_turn")}else t.dal.finishStep(i.id,null,`write_back_${l.kind}`)}catch{t.dal.finishStep(i.id,null,"write_back_error")}}async function Nn(t,e,r,n,s,i,o,a=!1,l){let d=t.membersByAlias.get(r.alias);if(d===void 0||d.sessionid===null)return{outcome:null,text:"",status_detail:`missing_agent:${r.alias}`};let c=B(t,{run_id:t.run_id,state_name:e});t.steps_executed+=1;let u=[];d.prompt_snapshot!==null&&d.prompt_snapshot.length>0&&u.push(d.prompt_snapshot),i&&u.push(Rp(s)),l!=null&&l.length>0&&u.push(l);let m=r.prompt_template!==void 0?await et(r.prompt_template,t,e):"";m.length>0&&u.push(m),n!==null&&n.length>0&&u.push(n);let f=u.join(`
2120
2120
 
2121
- `);try{let p=await Ds({context:t,stateId:e,member:d,prompt:f,stepId:c.id,timeoutMs:o,writesToProjectPath:a});if(p.kind==="g3_violation"||p.kind==="g2_violation"){let g=p.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${p.violationKind}`:"policy_violation:writes_to_project_path";return t.dal.insertSessionEvent({run_id:t.run_id,step_id:c.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(c.id,null,g),{outcome:null,text:"",status_detail:g}}if(t.dal.insertStepArtifact({step_id:c.id,kind:`${e}_transcript`,content:p.text}),t.transcripts[e]=p.text,!i)return t.dal.finishStep(c.id,"done",`chat_ms=${p.ms}`),t.outcomes[e]="done",{outcome:"done",text:p.text,status_detail:`chat_ms=${p.ms}`};let h=$s(p.text,s);return t.dal.finishStep(c.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 Ne?`chat_${p.kind}`:"chat_other";return t.dal.finishStep(c.id,null,h),{outcome:null,text:"",status_detail:h}}}function An(t,e){return(e?.length??0)>0?Qg(t.project.local_path,e):null}function py(t){return Xc(Jc(t))}function Vc(t,e){let r=t.dal.query(`SELECT state_name, outcome FROM step
2121
+ `);try{let p=await Ds({context:t,stateId:e,member:d,prompt:f,stepId:c.id,timeoutMs:o,writesToProjectPath:a});if(p.kind==="g3_violation"||p.kind==="g2_violation"){let g=p.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${p.violationKind}`:"policy_violation:writes_to_project_path";return t.dal.insertSessionEvent({run_id:t.run_id,step_id:c.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(c.id,null,g),{outcome:null,text:"",status_detail:g}}if(t.dal.insertStepArtifact({step_id:c.id,kind:`${e}_transcript`,content:p.text}),t.transcripts[e]=p.text,!i)return t.dal.finishStep(c.id,"done",`chat_ms=${p.ms}`),t.outcomes[e]="done",{outcome:"done",text:p.text,status_detail:`chat_ms=${p.ms}`};let h=$s(p.text,s);return t.dal.finishStep(c.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 Ne?`chat_${p.kind}`:"chat_other";return t.dal.finishStep(c.id,null,h),{outcome:null,text:"",status_detail:h}}}function An(t,e){return(e?.length??0)>0?Qg(t.project.local_path,e):null}function py(t){return Hc(Xc(t))}function Gc(t,e){let r=t.dal.query(`SELECT state_name, outcome FROM step
2122
2122
  WHERE run_id = ? AND state_name != ? AND ended_at IS NOT NULL
2123
- 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 Kc(t,e){if(!dy(t))return!1;let r=Uo(t,"durable-memory");function n(s){let i;try{i=cy(s,{withFileTypes:!0})}catch{return!1}for(let o of i){if(o.name===".git")continue;let a=Uo(s,o.name);if(a!==r)if(o.isDirectory()){if(n(a))return!0}else try{if(uy(a).mtime>e)return!0}catch{}}return!1}return n(t)}function p$(t,e,r){let n=Uo(t.local_path,"durable-memory");if(!dy(n))return;let s;try{s=cy(n)}catch{return}for(let i of s){if(!i.endsWith(".md")||i==="MEMORY.md")continue;let o=Uo(n,i),a;try{a=uy(o).mtime}catch{continue}if(a<=r)continue;let l;try{l=c$(o,"utf8")}catch{continue}let d=h$(l);if(d===null){process.stderr.write(`[durable-memory-sync] warning: ${i} has no valid frontmatter, skipping
2124
- `),C({event:"durable_memory_frontmatter_invalid",project_id:t.id,file:i,path:o});continue}if(t.durable_memory_mode==="db")try{e.upsertDurableMemory({project_id:t.id,type:d.type,name:d.name,description:d.description,body:d.body})}catch{}}}function h$(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),i=r.match(/^type:\s*(.+)$/m),o=r.match(/^description:\s*(.+)$/m),a=s?.[1]?.trim(),l=i?.[1]?.trim();return a===void 0||a.length===0||l===void 0||!_$.has(l)?null:{name:a,type:l,description:o?.[1]?.trim()??null,body:n}}var Ms,_$,Ve=E(()=>{"use strict";ct();vn();Yi();ey();Hc();cs();sy();me();iy();Cs();Ms="__paused__:";_$=new Set(["user","feedback","project","reference"])});import{spawnSync as _y}from"node:child_process";function g$(t,e){let r=t.stateId,n=t.displayName,s=B(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let i=t.project.local_path,o=_y("git",["diff","--quiet"],{cwd:i}).status!==0,a=_y("git",["diff","--cached","--quiet"],{cwd:i}).status!==0;if(o||a){let l=e.fail_message??"repository has uncommitted changes";return t.dal.finishStep(s.id,null,l),J(t,r,n,mc),{kind:"terminal",terminal:K(t.workflow)}}return t.dal.finishStep(s.id,"clean","repo_clean"),J(t,r,n,"clean"),X(t.workflow,e.next)}var hy,gy=E(()=>{"use strict";Ve();hy={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=>g$(t,t.state)}});async function y$(t,e){let r=t.stateId,n=t.displayName,s=B(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;for(let i of e.branches)if(await oy(i.when,t))return t.dal.finishStep(s.id,"matched",i.when),J(t,r,n,"matched"),X(t.workflow,i.next);return t.dal.finishStep(s.id,"no_match","choice_no_match"),J(t,r,n,"no_match"),e.default_next!==void 0?X(t.workflow,e.default_next):{kind:"terminal",terminal:t.workflow.terminals.no_match?"no_match":K(t.workflow)}}var yy,Ey=E(()=>{"use strict";Ve();Cs();yy={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=>y$(t,t.state)}});async function E$(t,e){let r=t.stateId,n=t.displayName,s=t.workflow.default_task_timeout_ms,i=e.researchers??[],o=An(t,e.durable_memory_tags),a=new Array(i.length).fill(null);await Promise.all(i.map(async(f,p)=>{let h=`${n}:researcher_${f.alias}[${p}]`,g=await Nn(t,h,f,`TOPIC: ${f.topic}`,[],!1,s,!1,o);g.text.length>0&&(a[p]=g.text)}));let l=a.map((f,p)=>f!==null?`# Research ${p+1}: ${i[p]?.topic??""}
2123
+ 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 Vc(t,e){if(!dy(t))return!1;let r=Uo(t,"durable-memory");function n(s){let i;try{i=cy(s,{withFileTypes:!0})}catch{return!1}for(let o of i){if(o.name===".git")continue;let a=Uo(s,o.name);if(a!==r)if(o.isDirectory()){if(n(a))return!0}else try{if(uy(a).mtime>e)return!0}catch{}}return!1}return n(t)}function p$(t,e,r){let n=Uo(t.local_path,"durable-memory");if(!dy(n))return;let s;try{s=cy(n)}catch{return}for(let i of s){if(!i.endsWith(".md")||i==="MEMORY.md")continue;let o=Uo(n,i),a;try{a=uy(o).mtime}catch{continue}if(a<=r)continue;let l;try{l=c$(o,"utf8")}catch{continue}let d=h$(l);if(d===null){process.stderr.write(`[durable-memory-sync] warning: ${i} has no valid frontmatter, skipping
2124
+ `),C({event:"durable_memory_frontmatter_invalid",project_id:t.id,file:i,path:o});continue}if(t.durable_memory_mode==="db")try{e.upsertDurableMemory({project_id:t.id,type:d.type,name:d.name,description:d.description,body:d.body})}catch{}}}function h$(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),i=r.match(/^type:\s*(.+)$/m),o=r.match(/^description:\s*(.+)$/m),a=s?.[1]?.trim(),l=i?.[1]?.trim();return a===void 0||a.length===0||l===void 0||!_$.has(l)?null:{name:a,type:l,description:o?.[1]?.trim()??null,body:n}}var Ms,_$,Ve=E(()=>{"use strict";ct();vn();Yi();ey();Bc();cs();sy();me();iy();Cs();Ms="__paused__:";_$=new Set(["user","feedback","project","reference"])});import{spawnSync as _y}from"node:child_process";function g$(t,e){let r=t.stateId,n=t.displayName,s=B(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let i=t.project.local_path,o=_y("git",["diff","--quiet"],{cwd:i}).status!==0,a=_y("git",["diff","--cached","--quiet"],{cwd:i}).status!==0;if(o||a){let l=e.fail_message??"repository has uncommitted changes";return t.dal.finishStep(s.id,null,l),J(t,r,n,uc),{kind:"terminal",terminal:K(t.workflow)}}return t.dal.finishStep(s.id,"clean","repo_clean"),J(t,r,n,"clean"),X(t.workflow,e.next)}var hy,gy=E(()=>{"use strict";Ve();hy={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=>g$(t,t.state)}});async function y$(t,e){let r=t.stateId,n=t.displayName,s=B(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;for(let i of e.branches)if(await oy(i.when,t))return t.dal.finishStep(s.id,"matched",i.when),J(t,r,n,"matched"),X(t.workflow,i.next);return t.dal.finishStep(s.id,"no_match","choice_no_match"),J(t,r,n,"no_match"),e.default_next!==void 0?X(t.workflow,e.default_next):{kind:"terminal",terminal:t.workflow.terminals.no_match?"no_match":K(t.workflow)}}var yy,Ey=E(()=>{"use strict";Ve();Cs();yy={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=>y$(t,t.state)}});async function E$(t,e){let r=t.stateId,n=t.displayName,s=t.workflow.default_task_timeout_ms,i=e.researchers??[],o=An(t,e.durable_memory_tags),a=new Array(i.length).fill(null);await Promise.all(i.map(async(f,p)=>{let h=`${n}:researcher_${f.alias}[${p}]`,g=await Nn(t,h,f,`TOPIC: ${f.topic}`,[],!1,s,!1,o);g.text.length>0&&(a[p]=g.text)}));let l=a.map((f,p)=>f!==null?`# Research ${p+1}: ${i[p]?.topic??""}
2125
2125
  ${f}`:null).filter(f=>f!==null).join(`
2126
2126
 
2127
2127
  `),d=`${n}:consolidator`,c=await Nn(t,d,e.consolidator,l.length>0?l:null,["ok","error"],!0,s,!1,o),u=B(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,c.outcome===null||c.outcome==="error"){t.dal.finishStep(u.id,c.outcome,c.status_detail),c.outcome==="error"&&J(t,r,n,"error");let f=e.outcomes.error;return f!==void 0?X(t.workflow,f):{kind:"terminal",terminal:K(t.workflow)}}let m=e.research_artifact_prefix??n;if(t.dal.insertStepArtifact({step_id:u.id,kind:`${m}_consolidated`,content:c.text}),t.dal.finishStep(u.id,"ok","consolidated"),J(t,r,n,"ok"),e.write_back_durable_memory){let f=t.membersByAlias.get(e.consolidator.alias);f!==void 0&&await zt(t,n,f,e.write_back_durable_memory)}return X(t.workflow,e.outcomes.ok)}var wy,Ty=E(()=>{"use strict";Ve();wy={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=>E$(t,t.state)}});async function w$(t,e){let r=t.stateId,n=t.displayName,s=B(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let i=t.progress_step_id;t.progress_step_id=s.id;try{let o=await Po(e.items_from,t),a=b$(o);if(a===null){t.dal.finishStep(s.id,null,`foreach_invalid_items:${e.items_from}`);let m=e.outcomes.any_failed;return m!==void 0?X(t.workflow,m):{kind:"terminal",terminal:K(t.workflow)}}let l={routed:null},d=e.mode==="parallel"?await v$(t,e,s.id,a,l):await T$(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 c=d.some(m=>m.outcome===null||m.outcome==="__failure__"),u=c?"any_failed":"all_ok";if(t.dal.finishStep(s.id,u,JSON.stringify({iterations:d,count:a.length})),J(t,r,n,u),c){let m=e.outcomes.any_failed;return m!==void 0?X(t.workflow,m):{kind:"terminal",terminal:K(t.workflow)}}return X(t.workflow,e.outcomes.all_ok)}finally{t.progress_step_id=i}}async function T$(t,e,r,n,s){let i=[];for(let o=0;o<n.length;o+=1){let a=await Sy(t,e,r,n[o],o,s);if(s.routed!==null||(i.push(a),(a.outcome===null||a.outcome==="__failure__")&&e.on_item_failure==="stop"))break}return i}async function v$(t,e,r,n,s){let i=new Array(n.length),o=0,a=Array.from({length:Math.min(e.max_concurrency,n.length)},async()=>{for(;o<n.length&&s.routed===null;){let l=o;o+=1,i[l]=await Sy(t,e,r,n[l],l,s)}});return await Promise.all(a),i}async function Sy(t,e,r,n,s,i){let o=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=o}(l.kind==="paused"||l.kind==="escalate")&&i.routed===null&&(i.routed=l);let c=l.kind==="terminal"&&t.workflow.terminals[l.terminal]?.kind==="failure"?"__failure__":S$(t.outcomes[a]);return t.emit_progress?.({kind:c===null||c==="__failure__"?"item_failed":"item_completed",data:{index:s,item:n,outcome:c}}),{index:s,value:n,outcome:c}}function S$(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function b$(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 vy,by=E(()=>{"use strict";Ve();Cs();vy={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=>w$(t,t.state)}});async function k$(t,e){let r=t.stateId,n=t.displayName,s=e.termination.timeout_seconds!==void 0?e.termination.timeout_seconds*1e3:void 0,i=t.membersByAlias.get(e.agent.alias);if(i===void 0||i.sessionid===null){let m=B(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(m.id,null,`missing_agent:${e.agent.alias}`),{kind:"terminal",terminal:K(t.workflow)}}let o=An(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 zt(t,n,i,e.write_back_durable_memory),X(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}`),J(t,r,n,"timeout");let f=e.outcomes.timeout;return f!==void 0?X(t.workflow,f):{kind:"terminal",terminal:K(t.workflow)}}let m=a.last_operator_input??"";try{let f=await Ds({context:t,stateId:n,member:i,prompt:m,stepId:a.step_id,timeoutMs:s,writesToProjectPath:!1});if(f.kind==="g3_violation"||f.kind==="g2_violation"){let p=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:a.step_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(a.step_id,null,p),{kind:"terminal",terminal:K(t.workflow)}}return t.dal.setInteractiveAgentOutput(a.id,f.text,"waiting_operator"),e.termination.agent_signal!==void 0&&f.text.includes(e.termination.agent_signal)?(e.artifact_name!==void 0&&t.dal.insertStepArtifact({step_id:a.step_id,kind:e.artifact_name,content:f.text}),t.dal.finishStep(a.step_id,"done","agent_signal"),J(t,r,n,"done"),e.write_back_durable_memory&&await zt(t,n,i,e.write_back_durable_memory),X(t.workflow,e.outcomes.done)):(ky({context:t,state:e,stateId:r,displayName:n,stepId:a.step_id,agentText:f.text}),{kind:"paused"})}catch(f){let p=f instanceof Ne?`chat_${f.kind}`:"chat_other";return t.dal.finishStep(a.step_id,null,p),{kind:"terminal",terminal:K(t.workflow)}}}return{kind:"paused"}}let l=B(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let d=t.dal.insertInteractiveSession({run_id:t.run_id,step_id:l.id,state_name:r,status:"waiting_agent"}),c=await et(e.agent.initial_prompt_template,t,n),u=o?`${o}
@@ -2133,19 +2133,19 @@ ${c}`:c;try{let m=await Ds({context:t,stateId:n,member:i,prompt:u,stepId:l.id,ti
2133
2133
  AND s.state_name LIKE ?
2134
2134
  AND sa.content IS NOT NULL
2135
2135
  ORDER BY sa.id DESC
2136
- LIMIT 1`,t.run_id,`${n}:coder[%`);return i[0]?.content===void 0?null:Wo(i[0].content)}function Wo(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}async function tC(t,e){let r=$y(J$.lexer(t,{gfm:!0})),n=new P$({title:e,numbering:{config:[{reference:"ordered-list",levels:[{level:0,format:U$.DECIMAL,text:"%1."}]}]},sections:[{children:r.length===0?[new yt("")]:r}]});return W$.toBuffer(n)}function $y(t){let e=[];for(let r of t)switch(r.type){case"space":break;case"heading":e.push(new yt({heading:lC(r.depth),children:vr(Tr(r))}));break;case"paragraph":e.push(new yt({children:vr(Tr(r))}));break;case"text":e.push(new yt({children:Tr(r).length===0?[new Et(r.text)]:vr(Tr(r))}));break;case"blockquote":e.push(...$y(Tr(r)).map(n=>n instanceof yt?n:new yt({children:[new Et(r.text)]})));break;case"list":iC(r)&&e.push(...rC(r));break;case"table":oC(r)&&e.push(nC(r));break;case"code":aC(r)&&e.push(...sC(r));break;case"hr":e.push(new yt(""));break;case"html":r.text.trim().length>0&&e.push(new yt({children:[new Et(r.text)]}));break;default:break}return e}function vr(t,e){let r=[];for(let n of t)switch(n.type){case"text":case"escape":r.push(new Et({text:n.text,...Yc(e)}));break;case"strong":r.push(...vr(Tr(n),{...e,bold:!0}));break;case"em":r.push(...vr(Tr(n),{...e,italics:!0}));break;case"codespan":r.push(new Et({text:n.text,...Yc({...e,code:!0})}));break;case"link":r.push(new F$({link:n.href,children:vr(Tr(n),{...e})}));break;case"br":r.push(new Et({text:"",break:1}));break;case"image":r.push(new Et({text:`[image: ${n.text}]`,italics:!0}));break;case"del":r.push(new Et({text:n.text,strike:!0}));break;default:r.push(new Et({text:n.raw,...Yc(e)}));break}return r.length===0?[new Et("")]:r}function Yc(t){return{...t?.bold===!0?{bold:!0}:{},...t?.italics===!0?{italics:!0}:{},...t?.code===!0?{font:"Courier New"}:{}}}function rC(t){return t.items.map(e=>new yt({children:vr(e.tokens.length===1&&e.tokens[0]?.type==="text"?[{...e.tokens[0],text:Ry(e)+e.tokens[0].text}]:[{type:"text",raw:e.text,text:Ry(e)+e.text}]),...t.ordered?{numbering:{reference:"ordered-list",level:0}}:{bullet:{level:0}}}))}function Ry(t){return t.task?`[${t.checked?"x":" "}] `:""}function nC(t){let e=[t.header,...t.rows].map(r=>new H$({children:r.map(n=>new B$({children:[new yt({children:vr(n.tokens,n.header?{bold:!0}:void 0)})]}))}));return new q$({width:{size:100,type:X$.PERCENTAGE},rows:e})}function sC(t){return t.text.split(`
2136
+ LIMIT 1`,t.run_id,`${n}:coder[%`);return i[0]?.content===void 0?null:Wo(i[0].content)}function Wo(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}async function tC(t,e){let r=$y(J$.lexer(t,{gfm:!0})),n=new P$({title:e,numbering:{config:[{reference:"ordered-list",levels:[{level:0,format:U$.DECIMAL,text:"%1."}]}]},sections:[{children:r.length===0?[new yt("")]:r}]});return W$.toBuffer(n)}function $y(t){let e=[];for(let r of t)switch(r.type){case"space":break;case"heading":e.push(new yt({heading:lC(r.depth),children:vr(Tr(r))}));break;case"paragraph":e.push(new yt({children:vr(Tr(r))}));break;case"text":e.push(new yt({children:Tr(r).length===0?[new Et(r.text)]:vr(Tr(r))}));break;case"blockquote":e.push(...$y(Tr(r)).map(n=>n instanceof yt?n:new yt({children:[new Et(r.text)]})));break;case"list":iC(r)&&e.push(...rC(r));break;case"table":oC(r)&&e.push(nC(r));break;case"code":aC(r)&&e.push(...sC(r));break;case"hr":e.push(new yt(""));break;case"html":r.text.trim().length>0&&e.push(new yt({children:[new Et(r.text)]}));break;default:break}return e}function vr(t,e){let r=[];for(let n of t)switch(n.type){case"text":case"escape":r.push(new Et({text:n.text,...Kc(e)}));break;case"strong":r.push(...vr(Tr(n),{...e,bold:!0}));break;case"em":r.push(...vr(Tr(n),{...e,italics:!0}));break;case"codespan":r.push(new Et({text:n.text,...Kc({...e,code:!0})}));break;case"link":r.push(new F$({link:n.href,children:vr(Tr(n),{...e})}));break;case"br":r.push(new Et({text:"",break:1}));break;case"image":r.push(new Et({text:`[image: ${n.text}]`,italics:!0}));break;case"del":r.push(new Et({text:n.text,strike:!0}));break;default:r.push(new Et({text:n.raw,...Kc(e)}));break}return r.length===0?[new Et("")]:r}function Kc(t){return{...t?.bold===!0?{bold:!0}:{},...t?.italics===!0?{italics:!0}:{},...t?.code===!0?{font:"Courier New"}:{}}}function rC(t){return t.items.map(e=>new yt({children:vr(e.tokens.length===1&&e.tokens[0]?.type==="text"?[{...e.tokens[0],text:Ry(e)+e.tokens[0].text}]:[{type:"text",raw:e.text,text:Ry(e)+e.text}]),...t.ordered?{numbering:{reference:"ordered-list",level:0}}:{bullet:{level:0}}}))}function Ry(t){return t.task?`[${t.checked?"x":" "}] `:""}function nC(t){let e=[t.header,...t.rows].map(r=>new H$({children:r.map(n=>new B$({children:[new yt({children:vr(n.tokens,n.header?{bold:!0}:void 0)})]}))}));return new q$({width:{size:100,type:X$.PERCENTAGE},rows:e})}function sC(t){return t.text.split(`
2137
2137
  `).map(r=>new yt({children:[new Et({text:r.length===0?" ":r,font:"Courier New"})]}))}function Tr(t){let e=t.tokens;return Array.isArray(e)?e:[]}function iC(t){return t.type==="list"&&Array.isArray(t.items)}function oC(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function aC(t){return t.type==="code"&&typeof t.text=="string"}function lC(t){switch(t){case 1:return xn.HEADING_1;case 2:return xn.HEADING_2;case 3:return xn.HEADING_3;case 4:return xn.HEADING_4;case 5:return xn.HEADING_5;default:return xn.HEADING_6}}var Oy,Cy=E(()=>{"use strict";Ve();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=>G$(t,t.state)}});import{createHash as dC}from"node:crypto";import{existsSync as cC,mkdirSync as uC,readFileSync as My,statSync as mC}from"node:fs";import{dirname as fC,isAbsolute as Dy,normalize as pC,resolve as Ps}from"node:path";import{marked as _C}from"marked";import hC from"write-excel-file/node";async function gC(t,e){let r=t.stateId,n=t.displayName,s=B(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;try{let i=await yC(t,e),o=EC(e.input_format),a=await wC(t,e),l=await TC(t,e.title),d=o==="markdown"?RC(i):kC(i);await LC({sheets:d.length===0?[{name:"Sheet1",headers:[],rows:[]}]:d,outputPath:a,title:l??t.workflow.name});let c=mC(a).size;if(c===0)throw new Error("rendered XLSX file was empty");let u=dC("sha256").update(My(a)).digest("hex");return t.dal.insertStepArtifact({step_id:s.id,kind:"render_xlsx",path:a,sha:u,provider_call_mode:"library"}),t.dal.finishStep(s.id,"done",`wrote:${a}`),J(t,r,n,{output_path:a,path:a,bytes:c}),X(t.workflow,e.outcomes?.done??"@terminal:done")}catch(i){let o=i instanceof Error?i.message:String(i);return t.dal.finishStep(s.id,"error",o),J(t,r,n,{error:o}),X(t.workflow,e.outcomes?.error??"@terminal:error")}}async function yC(t,e){if(typeof e.source!="string"||e.source.trim().length===0)return"";let r=(await et(e.source,t,t.stateId)).trim(),n=SC(t.project.local_path,r);if(n!==null){if(!cC(n))throw new Error(`source file not found: ${n}`);return My(n,"utf8")}return r}function EC(t){if(t==null||t==="")return"json";if(t==="json"||t==="markdown")return t;throw new Error(`unsupported input_format: ${String(t)}`)}async function wC(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let r=(await et(e.output_path,t,t.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=vC(t.project.local_path,r);if(!n.endsWith(".xlsx"))throw new Error(`output_path must end with .xlsx: ${n}`);return n}async function TC(t,e){if(typeof e!="string"||e.trim().length===0)return null;let r=(await et(e,t,t.stateId)).trim();return r.length===0?null:r}function vC(t,e){let r=Ps(t);return pC(Dy(e)?Ps(e):Ps(r,e))}function SC(t,e){return bC(e)?Dy(e)?Ps(e):Ps(t,e):null}function bC(t){return t.endsWith(".json")||t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function kC(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(!qo(e)||!Array.isArray(e.sheets))throw new Error("JSON source must be an object with sheets[]");return e.sheets.map((r,n)=>IC(r,n))}function IC(t,e){if(!qo(t))throw new Error(`sheets[${e}] must be an object`);let r=NC(t.headers,`sheets[${e}].headers`),n=AC(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:xC(t.styles)}}function NC(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 AC(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,i)=>{if(s===null||typeof s=="string"||typeof s=="number"||typeof s=="boolean")return s;throw new Error(`${e}[${n}][${i}] must be string, number, boolean, or null`)})})}function xC(t){if(!qo(t)||!qo(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 RC(t){let e=_C.lexer(t,{gfm:!0}),r=[],n=null;for(let s of e){if(PC(s)){n=s.text;continue}FC(s)&&(r.push({name:n??`Sheet${r.length+1}`,headers:s.header.map(i=>i.text),rows:s.rows.map(i=>i.map(o=>o.text)),headerStyle:{bold:!0}}),n=null)}return r}async function LC(t){uC(fC(t.outputPath),{recursive:!0});let e=new Set,r=t.sheets.map(n=>({sheet:MC(n.name,e),data:OC(n),columns:CC(n)}));await hC(r).toFile(t.outputPath)}function OC(t){let e=[];if(t.headers.length>0){let r=jC(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($C));return e.length===0?[[{}]]:e}function $C(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 CC(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(o=>o[n-1])],i=Math.min(60,Math.max(10,...s.map(o=>String(o??"").length+2)));r.push({width:i})}return r}function MC(t,e){let r=DC(t),n=r,s=2;for(;e.has(n.toLowerCase());){let i=` ${s}`;n=`${r.slice(0,31-i.length)}${i}`,s+=1}return e.add(n.toLowerCase()),n}function DC(t){let e=t.replace(/[\[\]:*?/\\]/g," ").trim();return(e.length===0?"Sheet":e).slice(0,31)}function jC(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 PC(t){return t.type==="heading"&&typeof t.text=="string"}function FC(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function qo(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var jy,Py=E(()=>{"use strict";Ve();jy={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=>gC(t,t.state)}});import{spawnSync as UC}from"node:child_process";async function qC(t,e){let r=t.stateId,n=t.displayName,s=t.workflow.default_task_timeout_ms;for(let m of e.pre_checks??[])if(UC("sh",["-c",m.command],{cwd:t.project.local_path}).status!==0){let p=B(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(p.id,"fail_pre_check",`pre_check_failed:${m.description??m.command}`),J(t,r,n,"fail_pre_check");let h=e.outcomes.fail_pre_check;return h!==void 0?X(t.workflow,h):{kind:"terminal",terminal:K(t.workflow)}}let i=An(t,e.durable_memory_tags),o=e.reviewers??[],a=null,l=o.length===0&&e.outcomes_from_stance!==void 0,d=l?Object.keys(e.outcomes_from_stance):[];for(let m=0;m<e.max_loops;m+=1){let f=`${n}:coder[${m}]`,p=await Nn(t,f,e.coder,a!==null?`PRIOR REVIEW FEEDBACK:
2138
2138
  ${a}`:null,d,l,s,e.writes_to_project_path===!0,i);if(l){let g=ry(p.text);if(g!==null){let _=B(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=B(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(o.length===0){if(e.outcomes_from_stance!==void 0){let y=Object.keys(e.outcomes_from_stance),T=$s(p.text,y);if(T.outcome===null){let k=B(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(k.id,null,`unhandled_stance:${T.reason}`),{kind:"escalate",token:"",reason:`no_stance:${T.reason}`}}let v=B(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(v.id,T.outcome,"outcomes_from_stance"),J(t,r,n,T.outcome),X(t.workflow,e.outcomes_from_stance[T.outcome])}let g=$s(p.text,WC);if(g.outcome!==null){let y=B(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(y.id,g.outcome,"default_failure_stance"),J(t,r,n,g.outcome),{kind:"escalate",token:g.outcome,reason:`failure_stance:${g.outcome}`}}let _=B(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,t.dal.finishStep(_.id,"approve","no_reviewers"),J(t,r,n,"approve"),e.write_back_durable_memory){let y=t.membersByAlias.get(e.coder.alias);y!==void 0&&await zt(t,n,y,e.write_back_durable_memory)}return X(t.workflow,e.outcomes.approve)}let h=await Promise.all(o.map(g=>Nn(t,`${n}:reviewer_${g.alias}[${m}]`,g,`CODER OUTPUT:
2139
2139
  ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));if(h.every(g=>g.outcome==="approve")){let g=B(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,t.dal.finishStep(g.id,"approve",`loop=${m}`),J(t,r,n,"approve"),e.write_back_durable_memory){let _=t.membersByAlias.get(e.coder.alias);_!==void 0&&await zt(t,n,_,e.write_back_durable_memory)}return X(t.workflow,e.outcomes.approve)}if(a=h.filter(g=>g.outcome==="request_changes").map(g=>g.text).join(`
2140
2140
 
2141
- `),e.loop_feedback_artifact!==void 0){let g=B(t,{run_id:t.run_id,state_name:`${n}:feedback[${m}]`});t.steps_executed+=1,t.dal.finishStep(g.id,"feedback_captured",`loop=${m}`),t.dal.insertStepArtifact({step_id:g.id,kind:e.loop_feedback_artifact,content:a})}}let c=B(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(c.id,"max_loops_exceeded",`loops=${e.max_loops}`),J(t,r,n,"max_loops_exceeded");let u=e.outcomes.max_loops_exceeded;return u!==void 0?X(t.workflow,u):{kind:"terminal",terminal:K(t.workflow)}}var WC,Fy,Uy=E(()=>{"use strict";Hc();Ve();WC=["blocked","failed","aborted"],Fy={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=>qC(t,t.state)}});import{spawnSync as BC}from"node:child_process";async function HC(t,e){let r=t.stateId,n=t.displayName,s=await et(e.command,t,n),i=Vc(t,n),o=py(s);if(o.matched&&!i){let h=B(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:o.kind,command:s,message:`ShellStep ${n} runs a classified side-effect command (${o.kind}) without a preceding approved gate`})}),t.dal.finishStep(h.id,null,`policy_violation:side_effect_without_pause:${o.kind}`),{kind:"terminal",terminal:K(t.workflow)}}let a=new Date(Date.now()-1),l=typeof e.timeout_ms=="number"&&e.timeout_ms>0,d=BC("sh",["-c",s],{cwd:t.project.local_path,...l?{timeout:e.timeout_ms}:{},encoding:"utf8",env:{...process.env}}),c=B(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let u=typeof d.stderr=="string"?d.stderr:"",m=d.error;if((u.length>0||m!==void 0)&&t.dal.insertSessionEvent({run_id:t.run_id,step_id:c.id,kind:"shellstep_stderr",timestamp_ms:Date.now(),payload:JSON.stringify({state_id:n,exit_status:d.status,stderr:u,spawn_error:m===void 0?null:m instanceof Error?m.message:String(m),command:s})}),d.status===null)return l?(t.dal.finishStep(c.id,null,`timeout:${e.timeout_ms}ms`),{kind:"terminal",terminal:"shell_step_timeout"}):(t.dal.finishStep(c.id,null,"shell_step_signal_terminated"),{kind:"terminal",terminal:K(t.workflow)});if(e.writes_to_project_path!==!0&&t.project.local_path.trim().length>0&&Kc(t.project.local_path,a))return t.dal.insertSessionEvent({run_id:t.run_id,step_id:c.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(c.id,null,"policy_violation:writes_to_project_path"),{kind:"terminal",terminal:K(t.workflow)};if(e.capture_output_to!==void 0){let h=d.stdout??"";t.dal.insertStepArtifact({step_id:c.id,kind:e.capture_output_to,content:h})}let f=String(d.status),p=e.outcomes_from_exit[f]??e.outcomes_from_exit.default;return p===void 0?(t.dal.insertStepArtifact({step_id:c.id,kind:"unhandled_exit",content:f}),t.dal.finishStep(c.id,null,`shell_step_unhandled_exit:${f}`),{kind:"terminal",terminal:"shell_step_unhandled_exit"}):(t.dal.finishStep(c.id,f,`exit=${d.status}`),J(t,r,n,f),X(t.workflow,p))}var Wy,qy=E(()=>{"use strict";Ve();Wy={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=>HC(t,t.state)}});async function XC(t,e){let r=t.stateId,n=t.displayName,s=B(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let i=t.dal.getWorkflowByName(e.workflow_name);if(i===null)return t.dal.finishStep(s.id,null,`subflow_missing_workflow:${e.workflow_name}`),{kind:"terminal",terminal:K(t.workflow)};let o=pt(i.definition),a=await JC(t,e),l=await t.runChildWorkflow(i,o,a);if(l.paused===!0)return t.dal.finishStep(s.id,null,`subflow_paused:${l.run_id}`),{kind:"paused"};let d=l.terminal_state;if(d===null)return t.dal.finishStep(s.id,null,`subflow_no_terminal:${l.run_id}`),{kind:"terminal",terminal:K(t.workflow)};J(t,r,n,GC(t,l.run_id,o.outputs??[])),t.dal.finishStep(s.id,d,`child_run=${l.run_id}`);let c=e.outcomes[d]??e.outcomes.default;return c===void 0?{kind:"terminal",terminal:K(t.workflow)}:X(t.workflow,c)}async function JC(t,e){let r={};for(let[n,s]of Object.entries(e.inputs??{})){let i=await ay(s,t);r[n]=i===s?await Po(s,t):i}return r}function GC(t,e,r){let n={};for(let s of r)n[s.name]=VC(t,e,s);return n}function VC(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 i=KC(s,r.source_field);if(i.found)return i.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 KC(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 By,Hy=E(()=>{"use strict";Ns();Ve();Cs();By={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=>XC(t,t.state)}});function YC(t,e){let r=t.stateId,n=t.displayName,s=e.name??n,i=B(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(i.id,s,e.kind??"neutral"),J(t,r,n,s),{kind:"terminal",terminal:s}}var Xy,Jy=E(()=>{"use strict";Ve();Xy={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=>YC(t,t.state)}});async function zC(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 i=await s.json();if(!Array.isArray(i))throw new Error("github issue trigger returned unexpected JSON");let o=ZC(t.cursor),a=i.filter(QC).filter(d=>d.id>o);if(a.length===0)return null;let l=Math.max(...a.map(d=>d.id));return{main:a.map(d=>({trigger_id:t.trigger_id,issue_id:d.id,issue_number:d.number,issue_url:d.html_url,title:d.title,cursor:String(l)}))}}function ZC(t){if(t===void 0)return 0;let e=Number(t);return Number.isFinite(e)?e:0}function QC(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 Gy,Vy=E(()=>{"use strict";Gy={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=>zC(t)}});async function eM(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 Ky,Yy=E(()=>{"use strict";Ky={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=>eM(t)}});function zy(t){t.register(hy),t.register(Fy),t.register(wy),t.register(Iy),t.register(Ay),t.register(Oy),t.register(jy),t.register(Wy),t.register(yy),t.register(vy),t.register(By),t.register(Xy),t.register(Ky),t.register(Gy)}var Zy=E(()=>{"use strict";gy();Ey();Ty();by();Ny();xy();Cy();Py();Uy();qy();Hy();Jy();Vy();Yy()});function Qy(){return Bo===null&&(Bo=new zc,zy(Bo)),Bo}var tM,zc,Bo,eE=E(()=>{"use strict";Zy();tM={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"},zc=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:tM[e];return r?this.types.get(r):void 0}list(){return Array.from(this.types.values())}},Bo=null});async function nE(t){lE(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=nM(e.definition,t.workflow),s=t.job.run_id===null?null:t.dal.getRun(t.job.run_id),i=Fs(n)?n.entry_step_id:n.start_at,o=s?.terminal_state===null?s:t.dal.insertRun({job_id:t.job.id,workflow_id:e.id,team_id:t.team.id,current_state:i}),a=n.requires,l=Kg(a);if(l!==null)return t.dal.setRunTerminalState(o.id,"aborted"),t.dal.raiseAttention({kind:"missing_workflow_dependency",severity:"error",project_id:r.id,run_id:o.id,payload:JSON.stringify({run_id:o.id,workflow_name:n.name,kind:l.kind,tool:l.tool,install_hint:l.install_hint,last_error:l.message,detail:l.detail??null})}),{run_id:o.id,terminal_state:"aborted",steps_executed:0};let d=new Map(t.members.map(f=>[f.alias,f]));if(Fs(n)){let f=Zc({dal:t.dal,workflow:Xo(n),job:t.job,project:r,run:o,membersByAlias:d,outcomes:s!==null&&o===s?t.dal.listLatestStepOutcomesByState(o.id):{},inputs:wr(t.job.payload)??{},team_id:t.team.id}),p=await iE(n,f,o.current_state??n.entry_step_id);return rE(t.dal,r.id,o.id,n.name,p),p}let c=s!==null&&o===s?t.dal.listLatestStepOutcomesByState(o.id):{},u=Zc({dal:t.dal,workflow:n,job:t.job,project:r,run:o,membersByAlias:d,outcomes:c,inputs:wr(t.job.payload)??{},team_id:t.team.id}),m=await sE(u,o.current_state??n.start_at);return rE(t.dal,r.id,o.id,n.name,m),m}function rE(t,e,r,n,s){if(s.paused===!0)return;let i=s.terminal_state;if(i===null)return;let o="unknown",a=!1;try{let c=t.getRun(r);if(c!==null){let u=t.getWorkflow(c.workflow_id);if(u!==null){let m=JSON.parse(u.definition),p=(m.terminals??{})[i];if(p!==void 0&&typeof p.kind=="string"&&(p.kind==="success"||p.kind==="failure"||p.kind==="neutral")&&(o=p.kind),o==="unknown"&&Array.isArray(m.steps)){for(let g of m.steps)if(g.type==="lmctl/terminal"&&g.parameters!==null&&typeof g.parameters=="object"){let _=g.parameters;if(_.name===i&&(_.kind==="success"||_.kind==="failure"||_.kind==="neutral")){o=_.kind;break}}}let h=m.errors;if(h!==null&&typeof h=="object"){let g=h;(g.on_unhandled_failure!==void 0||g.on_unhandled_failure_state!==void 0)&&(a=!0)}}}}catch{}if(o==="success"||o==="failure"&&a)return;let l=null;try{l=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 d=o==="failure"?"workflow_failed":"workflow_has_issues";t.raiseAttention({kind:d,severity:o==="failure"?"error":"warn",project_id:e,run_id:r,payload:JSON.stringify({run_id:r,workflow_name:n,terminal_state:i,terminal_kind:o,last_error:l})})}function Zc(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 i=e.parent_step_id,o=e.iteration;e.parent_step_id=s?.parent_step_id??i,e.iteration=s?.iteration??o;try{return await Qc(e,r,n,s?.display_name??r)}finally{e.parent_step_id=i,e.iteration=o}},runChildWorkflow:async(r,n,s)=>{lE(n);let i=Fs(n)?n.entry_step_id:n.start_at,o=t.dal.insertRun({job_id:t.job.id,workflow_id:r.id,team_id:t.team_id,current_state:i,parent_run_id:e.run_id}),a=Zc({dal:t.dal,workflow:Fs(n)?Xo(n):n,job:t.job,project:t.project,run:o,membersByAlias:t.membersByAlias,outcomes:{},inputs:s,team_id:t.team_id});return Fs(n)?iE(n,a,o.current_state??n.entry_step_id):sE(a,o.current_state??n.start_at)}};return e}async function sE(t,e){let r=e;if(r.startsWith(Ms))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 Zt(t,r.slice(10));t.dal.setRunCurrentState(t.run_id,r),t.last_state_id=r;let i=t.workflow.states[r];if(i===void 0){let l=Ho(t,K(t.workflow));if(l.kind==="paused")return Ue(t);if(l.kind==="escalate")return at(t,{id:r,name:r,type:"unknown"},l.token,l.reason),Ue(t);if(l.kind==="terminal")return Zt(t,l.terminal);r=l.state;continue}let o,a=aE(t,r);if(a!==null){let l=B(t,{run_id:t.run_id,state_name:r});if(t.steps_executed+=1,t.dal.finishStep(l.id,a,"escalation_resume"),J(t,r,r,a),a===ds)return Zt(t,jl);let d=i.outcomes?.[a];o=d!==void 0?X(t.workflow,d):at(t,{id:r,name:r,type:i.type},a,`no declared edge for resumed outcome '${a}' from state '${r}'`)}else o=await Qc(t,r,i);if(o.kind==="paused")return Ue(t);if(o.kind==="escalate")return at(t,{id:r,name:r,type:i.type},o.token,o.reason),Ue(t);if(o.kind==="terminal"){let l=Ho(t,o.terminal);if(l.kind==="paused")return Ue(t);if(l.kind==="escalate")return at(t,{id:r,name:r,type:i.type},l.token,l.reason),Ue(t);if(l.kind==="terminal")return Zt(t,l.terminal);r=l.state;continue}r=o.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=Ho(t,K(t.workflow));return n.kind==="terminal"?Zt(t,n.terminal):Zt(t,K(t.workflow))}async function iE(t,e,r){let n=new Map(t.steps.map(o=>[o.id,o])),s=new Map(t.steps.map(o=>[o.name,o])),i=r;for(let o=0;o<1e3;o+=1){e.dal.setRunCurrentState(e.run_id,i);let a=n.get(i);if(a===void 0)return at(e,{id:i,name:i,type:"unknown"},"",`internal:unknown v3 step '${i}'`),Ue(e);let l=aE(e,a.id);if(l!==null){let f=B(e,{run_id:e.run_id,state_name:a.name});if(e.steps_executed+=1,e.dal.finishStep(f.id,l,"escalation_resume"),J(e,a.id,a.name,l),l===ds)return Zt(e,jl);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 at(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}),Ue(e);i=h;continue}let d=await rM(e,t,a);if(d.kind==="paused")return Ue(e);let c=Object.keys(t.connections[a.id]??{});if(d.kind==="escalate")return at(e,{id:a.id,name:a.name,type:a.type},d.token,d.reason,{declared_outcomes:c}),Ue(e);let u=d.kind==="terminal"?d.terminal:d.state;if(a.type==="lmctl/terminal"){let f=e.workflow;e.workflow=Xo(t,a);try{let p=Ho(e,u);if(p.kind==="paused")return Ue(e);if(p.kind==="escalate")return at(e,{id:a.id,name:a.name,type:a.type},p.token,p.reason),Ue(e);if(p.kind==="terminal")return Zt(e,p.terminal);let h=s.get(p.state);if(h===void 0)return at(e,{id:a.id,name:a.name,type:a.type},"",`internal:unknown v3 error handler step '${p.state}'`),Ue(e);i=h.id;continue}finally{e.workflow=f}}if(ln(u))return at(e,{id:a.id,name:a.name,type:a.type},u,`generic escalation '${u}' from step '${a.id}'`,{declared_outcomes:c}),Ue(e);let m=t.connections[a.id]?.[u]?.[0]?.[0]?.step_id??t.connections[a.id]?.main?.[0]?.[0]?.step_id;if(m===void 0)return at(e,{id:a.id,name:a.name,type:a.type},u,`no declared edge for outcome '${u}' from step '${a.id}'`,{declared_outcomes:c}),Ue(e);i=m}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})}),Zt(e,"aborted")}async function rM(t,e,r){let n=oE(e,r),s=t.workflow;t.workflow=Xo(e,r);try{return await Qc(t,r.id,n,r.name)}finally{t.workflow=s}}function oE(t,e){let r=e.parameters,n=e.members??{},s=Object.keys(t.connections[e.id]??{}),i=Object.fromEntries(s.map(a=>[a,`@terminal:${a}`])),o={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{...o,type:"Review",...r,coder:n.coder,reviewers:n.reviewers,outcomes:{approve:i.approve??"@terminal:approve",...i.request_changes!==void 0?{request_changes:i.request_changes}:{},...i.fail_pre_check!==void 0?{fail_pre_check:i.fail_pre_check}:{},...i.max_loops_exceeded!==void 0?{max_loops_exceeded:i.max_loops_exceeded}:{}},...a.length>0?{outcomes_from_stance:Object.fromEntries(a.map(l=>[l,`@terminal:${l}`]))}:{}}}case"lmctl/consolidate":return{...o,type:"Consolidate",...r,researchers:n.researchers,consolidator:n.consolidator,outcomes:{ok:i.ok??"@terminal:ok",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/interactive":return{...o,type:"Interactive",...r,agent:n.agent,outcomes:{done:i.done??"@terminal:done",...i.timeout!==void 0?{timeout:i.timeout}:{}}};case"lmctl/loop":return{...o,type:"Loop",...r,outcomes:{ok:i.ok??"@terminal:ok",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/render-docx":return{...o,type:"lmctl/render-docx",...r,outcomes:{done:i.done??"@terminal:done",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/render-xlsx":return{...o,type:"lmctl/render-xlsx",...r,outcomes:{done:i.done??"@terminal:done",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/shell-step":return{...o,type:"ShellStep",...r,outcomes_from_exit:r.outcomes_from_exit??Object.fromEntries(s.map(a=>[a.slice(5),`@terminal:${a}`]))};case"lmctl/assert-repo-clean":return{...o,type:"AssertRepoClean",...r,next:i.main??"@terminal:main"};case"lmctl/choice":return{...o,type:"Choice",...r};case"lmctl/foreach":return{...o,type:"ForEach",...r,outcomes:{all_ok:i.all_ok??"@terminal:all_ok",...i.any_failed!==void 0?{any_failed:i.any_failed}:{}}};case"lmctl/subflow":return{...o,type:"Subflow",...r,outcomes:i};case"lmctl/terminal":return{...o,type:"Terminal",name:r.name,kind:r.kind};default:return{...o,type:e.type,...r}}}async function Qc(t,e,r,n){let s=Qy().get(r.type);if(s===void 0)throw new Error(`unknown archetype: ${r.type}`);if(s.execute===void 0)throw new Error(`archetype ${r.type} has no execute() - is it a trigger-only archetype used as a step?`);let i=t.emit_progress,o=t.progress_step_id;t.emit_progress=s.description.emits_progress===!0?oM(t,s):void 0,t.progress_step_id=null;try{return await s.execute(my(t,e,r,n??e))}finally{t.emit_progress=i,t.progress_step_id=o}}function nM(t,e){try{let r=JSON.parse(t);if(iM(r)&&r.definition_schema_version===3)return $t.parse(r)}catch{return e}return e}function Fs(t){return t.definition_schema_version===3}function Xo(t,e){let r=e===void 0?[]:Object.keys(t.connections[e.id]??{}),n=Object.fromEntries(r.map(i=>[i,{kind:i==="aborted"?"failure":"neutral"}])),s={};if(e?.type==="lmctl/loop"&&typeof e.parameters.body=="string"){let i=t.steps.find(o=>o.name===e.parameters.body);i!==void 0&&(s[e.parameters.body]=oE(t,i))}return e?.type==="lmctl/terminal"&&typeof e.parameters.name=="string"&&(n[e.parameters.name]={kind:sM(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 sM(t){return t==="success"||t==="failure"||t==="neutral"?t:"neutral"}function iM(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function oM(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 i=s instanceof Error?s.message:String(s);console.warn(`[progress] dropped ${r} event: ${i}`)}}}function Zt(t,e){t.dal.setRunTerminalState(t.run_id,e);try{Xg(t.run_id,t.dal)}catch{}return{run_id:t.run_id,terminal_state:e,steps_executed:t.steps_executed}}function Ue(t){return{run_id:t.run_id,terminal_state:null,steps_executed:t.steps_executed,paused:!0}}function aE(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 i=s[e];if(typeof i!="string")return null;delete s[e];let o=Object.keys(s).length>0?JSON.stringify(s):null;return t.dal.setRunPendingEscalationDecision(t.run_id,o),i}function Ho(t,e){if(!aM(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&&lM(t,e,r.on_unhandled_failure),{kind:"terminal",terminal:e}))}function aM(t,e){return t.definition_schema_version===2&&t.terminals[e]?.kind==="failure"}function lM(t,e,r){let n=dM(t),s=r.capture_evidence&&n!==null?cM(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 dM(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 cM(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 lE(t){if(!tE.includes(t.definition_schema_version))throw new Error(`unsupported definition_schema_version ${t.definition_schema_version}; supported versions: ${tE.join(", ")}`)}var tE,dE=E(()=>{"use strict";Sn();Jg();Yg();Ve();eE();cs();tE=[1,2,3]});import{readFileSync as uM,readdirSync as mM}from"node:fs";import{basename as fM,join as pM,resolve as _M}from"node:path";function mE(t={}){let e=_M(t.workflowsDir??"workflows"),r=mM(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=>hM(pM(e,n)))}}function hM(t){let e=fM(t);try{let r=uM(t,"utf8"),n=pt(r);return _E(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:hE(r)}}}function fE(t,e){try{let r=pt(e);return _E(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:hE(r)}}}function pE(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 i of t.rows){let o=(i.workflow_name??i.file).slice(0,36).padEnd(36),a=`${i.first_step_id??"-"}${i.first_step_type===null?"":` (${i.first_step_type})`}`;e.push(`${i.status.padEnd(17)} ${o} ${a.slice(0,52).padEnd(52)} ${i.note}`)}let r=t.rows.filter(i=>i.status==="PASS").length,n=t.rows.filter(i=>i.status==="PASS_NEEDS_INPUTS").length,s=t.rows.filter(i=>i.status==="FAIL").length;return e.push(""),e.push(`summary: ${r} pass, ${n} pass_needs_inputs, ${s} fail`),`${e.join(`
2141
+ `),e.loop_feedback_artifact!==void 0){let g=B(t,{run_id:t.run_id,state_name:`${n}:feedback[${m}]`});t.steps_executed+=1,t.dal.finishStep(g.id,"feedback_captured",`loop=${m}`),t.dal.insertStepArtifact({step_id:g.id,kind:e.loop_feedback_artifact,content:a})}}let c=B(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(c.id,"max_loops_exceeded",`loops=${e.max_loops}`),J(t,r,n,"max_loops_exceeded");let u=e.outcomes.max_loops_exceeded;return u!==void 0?X(t.workflow,u):{kind:"terminal",terminal:K(t.workflow)}}var WC,Fy,Uy=E(()=>{"use strict";Bc();Ve();WC=["blocked","failed","aborted"],Fy={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=>qC(t,t.state)}});import{spawnSync as BC}from"node:child_process";async function HC(t,e){let r=t.stateId,n=t.displayName,s=await et(e.command,t,n),i=Gc(t,n),o=py(s);if(o.matched&&!i){let h=B(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:o.kind,command:s,message:`ShellStep ${n} runs a classified side-effect command (${o.kind}) without a preceding approved gate`})}),t.dal.finishStep(h.id,null,`policy_violation:side_effect_without_pause:${o.kind}`),{kind:"terminal",terminal:K(t.workflow)}}let a=new Date(Date.now()-1),l=typeof e.timeout_ms=="number"&&e.timeout_ms>0,d=BC("sh",["-c",s],{cwd:t.project.local_path,...l?{timeout:e.timeout_ms}:{},encoding:"utf8",env:{...process.env}}),c=B(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let u=typeof d.stderr=="string"?d.stderr:"",m=d.error;if((u.length>0||m!==void 0)&&t.dal.insertSessionEvent({run_id:t.run_id,step_id:c.id,kind:"shellstep_stderr",timestamp_ms:Date.now(),payload:JSON.stringify({state_id:n,exit_status:d.status,stderr:u,spawn_error:m===void 0?null:m instanceof Error?m.message:String(m),command:s})}),d.status===null)return l?(t.dal.finishStep(c.id,null,`timeout:${e.timeout_ms}ms`),{kind:"terminal",terminal:"shell_step_timeout"}):(t.dal.finishStep(c.id,null,"shell_step_signal_terminated"),{kind:"terminal",terminal:K(t.workflow)});if(e.writes_to_project_path!==!0&&t.project.local_path.trim().length>0&&Vc(t.project.local_path,a))return t.dal.insertSessionEvent({run_id:t.run_id,step_id:c.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(c.id,null,"policy_violation:writes_to_project_path"),{kind:"terminal",terminal:K(t.workflow)};if(e.capture_output_to!==void 0){let h=d.stdout??"";t.dal.insertStepArtifact({step_id:c.id,kind:e.capture_output_to,content:h})}let f=String(d.status),p=e.outcomes_from_exit[f]??e.outcomes_from_exit.default;return p===void 0?(t.dal.insertStepArtifact({step_id:c.id,kind:"unhandled_exit",content:f}),t.dal.finishStep(c.id,null,`shell_step_unhandled_exit:${f}`),{kind:"terminal",terminal:"shell_step_unhandled_exit"}):(t.dal.finishStep(c.id,f,`exit=${d.status}`),J(t,r,n,f),X(t.workflow,p))}var Wy,qy=E(()=>{"use strict";Ve();Wy={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=>HC(t,t.state)}});async function XC(t,e){let r=t.stateId,n=t.displayName,s=B(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let i=t.dal.getWorkflowByName(e.workflow_name);if(i===null)return t.dal.finishStep(s.id,null,`subflow_missing_workflow:${e.workflow_name}`),{kind:"terminal",terminal:K(t.workflow)};let o=pt(i.definition),a=await JC(t,e),l=await t.runChildWorkflow(i,o,a);if(l.paused===!0)return t.dal.finishStep(s.id,null,`subflow_paused:${l.run_id}`),{kind:"paused"};let d=l.terminal_state;if(d===null)return t.dal.finishStep(s.id,null,`subflow_no_terminal:${l.run_id}`),{kind:"terminal",terminal:K(t.workflow)};J(t,r,n,GC(t,l.run_id,o.outputs??[])),t.dal.finishStep(s.id,d,`child_run=${l.run_id}`);let c=e.outcomes[d]??e.outcomes.default;return c===void 0?{kind:"terminal",terminal:K(t.workflow)}:X(t.workflow,c)}async function JC(t,e){let r={};for(let[n,s]of Object.entries(e.inputs??{})){let i=await ay(s,t);r[n]=i===s?await Po(s,t):i}return r}function GC(t,e,r){let n={};for(let s of r)n[s.name]=VC(t,e,s);return n}function VC(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 i=KC(s,r.source_field);if(i.found)return i.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 KC(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 By,Hy=E(()=>{"use strict";Ns();Ve();Cs();By={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=>XC(t,t.state)}});function YC(t,e){let r=t.stateId,n=t.displayName,s=e.name??n,i=B(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(i.id,s,e.kind??"neutral"),J(t,r,n,s),{kind:"terminal",terminal:s}}var Xy,Jy=E(()=>{"use strict";Ve();Xy={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=>YC(t,t.state)}});async function zC(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 i=await s.json();if(!Array.isArray(i))throw new Error("github issue trigger returned unexpected JSON");let o=ZC(t.cursor),a=i.filter(QC).filter(d=>d.id>o);if(a.length===0)return null;let l=Math.max(...a.map(d=>d.id));return{main:a.map(d=>({trigger_id:t.trigger_id,issue_id:d.id,issue_number:d.number,issue_url:d.html_url,title:d.title,cursor:String(l)}))}}function ZC(t){if(t===void 0)return 0;let e=Number(t);return Number.isFinite(e)?e:0}function QC(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 Gy,Vy=E(()=>{"use strict";Gy={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=>zC(t)}});async function eM(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 Ky,Yy=E(()=>{"use strict";Ky={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=>eM(t)}});function zy(t){t.register(hy),t.register(Fy),t.register(wy),t.register(Iy),t.register(Ay),t.register(Oy),t.register(jy),t.register(Wy),t.register(yy),t.register(vy),t.register(By),t.register(Xy),t.register(Ky),t.register(Gy)}var Zy=E(()=>{"use strict";gy();Ey();Ty();by();Ny();xy();Cy();Py();Uy();qy();Hy();Jy();Vy();Yy()});function Qy(){return Bo===null&&(Bo=new Yc,zy(Bo)),Bo}var tM,Yc,Bo,eE=E(()=>{"use strict";Zy();tM={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"},Yc=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:tM[e];return r?this.types.get(r):void 0}list(){return Array.from(this.types.values())}},Bo=null});async function nE(t){lE(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=nM(e.definition,t.workflow),s=t.job.run_id===null?null:t.dal.getRun(t.job.run_id),i=Fs(n)?n.entry_step_id:n.start_at,o=s?.terminal_state===null?s:t.dal.insertRun({job_id:t.job.id,workflow_id:e.id,team_id:t.team.id,current_state:i}),a=n.requires,l=Kg(a);if(l!==null)return t.dal.setRunTerminalState(o.id,"aborted"),t.dal.raiseAttention({kind:"missing_workflow_dependency",severity:"error",project_id:r.id,run_id:o.id,payload:JSON.stringify({run_id:o.id,workflow_name:n.name,kind:l.kind,tool:l.tool,install_hint:l.install_hint,last_error:l.message,detail:l.detail??null})}),{run_id:o.id,terminal_state:"aborted",steps_executed:0};let d=new Map(t.members.map(f=>[f.alias,f]));if(Fs(n)){let f=zc({dal:t.dal,workflow:Xo(n),job:t.job,project:r,run:o,membersByAlias:d,outcomes:s!==null&&o===s?t.dal.listLatestStepOutcomesByState(o.id):{},inputs:wr(t.job.payload)??{},team_id:t.team.id}),p=await iE(n,f,o.current_state??n.entry_step_id);return rE(t.dal,r.id,o.id,n.name,p),p}let c=s!==null&&o===s?t.dal.listLatestStepOutcomesByState(o.id):{},u=zc({dal:t.dal,workflow:n,job:t.job,project:r,run:o,membersByAlias:d,outcomes:c,inputs:wr(t.job.payload)??{},team_id:t.team.id}),m=await sE(u,o.current_state??n.start_at);return rE(t.dal,r.id,o.id,n.name,m),m}function rE(t,e,r,n,s){if(s.paused===!0)return;let i=s.terminal_state;if(i===null)return;let o="unknown",a=!1;try{let c=t.getRun(r);if(c!==null){let u=t.getWorkflow(c.workflow_id);if(u!==null){let m=JSON.parse(u.definition),p=(m.terminals??{})[i];if(p!==void 0&&typeof p.kind=="string"&&(p.kind==="success"||p.kind==="failure"||p.kind==="neutral")&&(o=p.kind),o==="unknown"&&Array.isArray(m.steps)){for(let g of m.steps)if(g.type==="lmctl/terminal"&&g.parameters!==null&&typeof g.parameters=="object"){let _=g.parameters;if(_.name===i&&(_.kind==="success"||_.kind==="failure"||_.kind==="neutral")){o=_.kind;break}}}let h=m.errors;if(h!==null&&typeof h=="object"){let g=h;(g.on_unhandled_failure!==void 0||g.on_unhandled_failure_state!==void 0)&&(a=!0)}}}}catch{}if(o==="success"||o==="failure"&&a)return;let l=null;try{l=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 d=o==="failure"?"workflow_failed":"workflow_has_issues";t.raiseAttention({kind:d,severity:o==="failure"?"error":"warn",project_id:e,run_id:r,payload:JSON.stringify({run_id:r,workflow_name:n,terminal_state:i,terminal_kind:o,last_error:l})})}function zc(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 i=e.parent_step_id,o=e.iteration;e.parent_step_id=s?.parent_step_id??i,e.iteration=s?.iteration??o;try{return await Zc(e,r,n,s?.display_name??r)}finally{e.parent_step_id=i,e.iteration=o}},runChildWorkflow:async(r,n,s)=>{lE(n);let i=Fs(n)?n.entry_step_id:n.start_at,o=t.dal.insertRun({job_id:t.job.id,workflow_id:r.id,team_id:t.team_id,current_state:i,parent_run_id:e.run_id}),a=zc({dal:t.dal,workflow:Fs(n)?Xo(n):n,job:t.job,project:t.project,run:o,membersByAlias:t.membersByAlias,outcomes:{},inputs:s,team_id:t.team_id});return Fs(n)?iE(n,a,o.current_state??n.entry_step_id):sE(a,o.current_state??n.start_at)}};return e}async function sE(t,e){let r=e;if(r.startsWith(Ms))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 Zt(t,r.slice(10));t.dal.setRunCurrentState(t.run_id,r),t.last_state_id=r;let i=t.workflow.states[r];if(i===void 0){let l=Ho(t,K(t.workflow));if(l.kind==="paused")return Ue(t);if(l.kind==="escalate")return at(t,{id:r,name:r,type:"unknown"},l.token,l.reason),Ue(t);if(l.kind==="terminal")return Zt(t,l.terminal);r=l.state;continue}let o,a=aE(t,r);if(a!==null){let l=B(t,{run_id:t.run_id,state_name:r});if(t.steps_executed+=1,t.dal.finishStep(l.id,a,"escalation_resume"),J(t,r,r,a),a===ds)return Zt(t,Dl);let d=i.outcomes?.[a];o=d!==void 0?X(t.workflow,d):at(t,{id:r,name:r,type:i.type},a,`no declared edge for resumed outcome '${a}' from state '${r}'`)}else o=await Zc(t,r,i);if(o.kind==="paused")return Ue(t);if(o.kind==="escalate")return at(t,{id:r,name:r,type:i.type},o.token,o.reason),Ue(t);if(o.kind==="terminal"){let l=Ho(t,o.terminal);if(l.kind==="paused")return Ue(t);if(l.kind==="escalate")return at(t,{id:r,name:r,type:i.type},l.token,l.reason),Ue(t);if(l.kind==="terminal")return Zt(t,l.terminal);r=l.state;continue}r=o.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=Ho(t,K(t.workflow));return n.kind==="terminal"?Zt(t,n.terminal):Zt(t,K(t.workflow))}async function iE(t,e,r){let n=new Map(t.steps.map(o=>[o.id,o])),s=new Map(t.steps.map(o=>[o.name,o])),i=r;for(let o=0;o<1e3;o+=1){e.dal.setRunCurrentState(e.run_id,i);let a=n.get(i);if(a===void 0)return at(e,{id:i,name:i,type:"unknown"},"",`internal:unknown v3 step '${i}'`),Ue(e);let l=aE(e,a.id);if(l!==null){let f=B(e,{run_id:e.run_id,state_name:a.name});if(e.steps_executed+=1,e.dal.finishStep(f.id,l,"escalation_resume"),J(e,a.id,a.name,l),l===ds)return Zt(e,Dl);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 at(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}),Ue(e);i=h;continue}let d=await rM(e,t,a);if(d.kind==="paused")return Ue(e);let c=Object.keys(t.connections[a.id]??{});if(d.kind==="escalate")return at(e,{id:a.id,name:a.name,type:a.type},d.token,d.reason,{declared_outcomes:c}),Ue(e);let u=d.kind==="terminal"?d.terminal:d.state;if(a.type==="lmctl/terminal"){let f=e.workflow;e.workflow=Xo(t,a);try{let p=Ho(e,u);if(p.kind==="paused")return Ue(e);if(p.kind==="escalate")return at(e,{id:a.id,name:a.name,type:a.type},p.token,p.reason),Ue(e);if(p.kind==="terminal")return Zt(e,p.terminal);let h=s.get(p.state);if(h===void 0)return at(e,{id:a.id,name:a.name,type:a.type},"",`internal:unknown v3 error handler step '${p.state}'`),Ue(e);i=h.id;continue}finally{e.workflow=f}}if(ln(u))return at(e,{id:a.id,name:a.name,type:a.type},u,`generic escalation '${u}' from step '${a.id}'`,{declared_outcomes:c}),Ue(e);let m=t.connections[a.id]?.[u]?.[0]?.[0]?.step_id??t.connections[a.id]?.main?.[0]?.[0]?.step_id;if(m===void 0)return at(e,{id:a.id,name:a.name,type:a.type},u,`no declared edge for outcome '${u}' from step '${a.id}'`,{declared_outcomes:c}),Ue(e);i=m}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})}),Zt(e,"aborted")}async function rM(t,e,r){let n=oE(e,r),s=t.workflow;t.workflow=Xo(e,r);try{return await Zc(t,r.id,n,r.name)}finally{t.workflow=s}}function oE(t,e){let r=e.parameters,n=e.members??{},s=Object.keys(t.connections[e.id]??{}),i=Object.fromEntries(s.map(a=>[a,`@terminal:${a}`])),o={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{...o,type:"Review",...r,coder:n.coder,reviewers:n.reviewers,outcomes:{approve:i.approve??"@terminal:approve",...i.request_changes!==void 0?{request_changes:i.request_changes}:{},...i.fail_pre_check!==void 0?{fail_pre_check:i.fail_pre_check}:{},...i.max_loops_exceeded!==void 0?{max_loops_exceeded:i.max_loops_exceeded}:{}},...a.length>0?{outcomes_from_stance:Object.fromEntries(a.map(l=>[l,`@terminal:${l}`]))}:{}}}case"lmctl/consolidate":return{...o,type:"Consolidate",...r,researchers:n.researchers,consolidator:n.consolidator,outcomes:{ok:i.ok??"@terminal:ok",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/interactive":return{...o,type:"Interactive",...r,agent:n.agent,outcomes:{done:i.done??"@terminal:done",...i.timeout!==void 0?{timeout:i.timeout}:{}}};case"lmctl/loop":return{...o,type:"Loop",...r,outcomes:{ok:i.ok??"@terminal:ok",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/render-docx":return{...o,type:"lmctl/render-docx",...r,outcomes:{done:i.done??"@terminal:done",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/render-xlsx":return{...o,type:"lmctl/render-xlsx",...r,outcomes:{done:i.done??"@terminal:done",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/shell-step":return{...o,type:"ShellStep",...r,outcomes_from_exit:r.outcomes_from_exit??Object.fromEntries(s.map(a=>[a.slice(5),`@terminal:${a}`]))};case"lmctl/assert-repo-clean":return{...o,type:"AssertRepoClean",...r,next:i.main??"@terminal:main"};case"lmctl/choice":return{...o,type:"Choice",...r};case"lmctl/foreach":return{...o,type:"ForEach",...r,outcomes:{all_ok:i.all_ok??"@terminal:all_ok",...i.any_failed!==void 0?{any_failed:i.any_failed}:{}}};case"lmctl/subflow":return{...o,type:"Subflow",...r,outcomes:i};case"lmctl/terminal":return{...o,type:"Terminal",name:r.name,kind:r.kind};default:return{...o,type:e.type,...r}}}async function Zc(t,e,r,n){let s=Qy().get(r.type);if(s===void 0)throw new Error(`unknown archetype: ${r.type}`);if(s.execute===void 0)throw new Error(`archetype ${r.type} has no execute() - is it a trigger-only archetype used as a step?`);let i=t.emit_progress,o=t.progress_step_id;t.emit_progress=s.description.emits_progress===!0?oM(t,s):void 0,t.progress_step_id=null;try{return await s.execute(my(t,e,r,n??e))}finally{t.emit_progress=i,t.progress_step_id=o}}function nM(t,e){try{let r=JSON.parse(t);if(iM(r)&&r.definition_schema_version===3)return $t.parse(r)}catch{return e}return e}function Fs(t){return t.definition_schema_version===3}function Xo(t,e){let r=e===void 0?[]:Object.keys(t.connections[e.id]??{}),n=Object.fromEntries(r.map(i=>[i,{kind:i==="aborted"?"failure":"neutral"}])),s={};if(e?.type==="lmctl/loop"&&typeof e.parameters.body=="string"){let i=t.steps.find(o=>o.name===e.parameters.body);i!==void 0&&(s[e.parameters.body]=oE(t,i))}return e?.type==="lmctl/terminal"&&typeof e.parameters.name=="string"&&(n[e.parameters.name]={kind:sM(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 sM(t){return t==="success"||t==="failure"||t==="neutral"?t:"neutral"}function iM(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function oM(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 i=s instanceof Error?s.message:String(s);console.warn(`[progress] dropped ${r} event: ${i}`)}}}function Zt(t,e){t.dal.setRunTerminalState(t.run_id,e);try{Xg(t.run_id,t.dal)}catch{}return{run_id:t.run_id,terminal_state:e,steps_executed:t.steps_executed}}function Ue(t){return{run_id:t.run_id,terminal_state:null,steps_executed:t.steps_executed,paused:!0}}function aE(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 i=s[e];if(typeof i!="string")return null;delete s[e];let o=Object.keys(s).length>0?JSON.stringify(s):null;return t.dal.setRunPendingEscalationDecision(t.run_id,o),i}function Ho(t,e){if(!aM(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&&lM(t,e,r.on_unhandled_failure),{kind:"terminal",terminal:e}))}function aM(t,e){return t.definition_schema_version===2&&t.terminals[e]?.kind==="failure"}function lM(t,e,r){let n=dM(t),s=r.capture_evidence&&n!==null?cM(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 dM(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 cM(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 lE(t){if(!tE.includes(t.definition_schema_version))throw new Error(`unsupported definition_schema_version ${t.definition_schema_version}; supported versions: ${tE.join(", ")}`)}var tE,dE=E(()=>{"use strict";Sn();Jg();Yg();Ve();eE();cs();tE=[1,2,3]});import{readFileSync as uM,readdirSync as mM}from"node:fs";import{basename as fM,join as pM,resolve as _M}from"node:path";function mE(t={}){let e=_M(t.workflowsDir??"workflows"),r=mM(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=>hM(pM(e,n)))}}function hM(t){let e=fM(t);try{let r=uM(t,"utf8"),n=pt(r);return _E(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:hE(r)}}}function fE(t,e){try{let r=pt(e);return _E(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:hE(r)}}}function pE(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 i of t.rows){let o=(i.workflow_name??i.file).slice(0,36).padEnd(36),a=`${i.first_step_id??"-"}${i.first_step_type===null?"":` (${i.first_step_type})`}`;e.push(`${i.status.padEnd(17)} ${o} ${a.slice(0,52).padEnd(52)} ${i.note}`)}let r=t.rows.filter(i=>i.status==="PASS").length,n=t.rows.filter(i=>i.status==="PASS_NEEDS_INPUTS").length,s=t.rows.filter(i=>i.status==="FAIL").length;return e.push(""),e.push(`summary: ${r} pass, ${n} pass_needs_inputs, ${s} fail`),`${e.join(`
2142
2142
  `)}
2143
- `}function _E(t,e){let r=yM(e),n=EM(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=gM(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 gM(t){return(t??[]).filter(e=>e.required===!0&&e.default===void 0).map(e=>e.name)}function yM(t){return eu(t)?t.entry_step_id:t.start_at}function EM(t){return eu(t)?t.steps.find(e=>e.id===t.entry_step_id)?.type??null:t.states[t.start_at]?.type??null}function eu(t){return t.definition_schema_version===3}function hE(t){return t instanceof Yt?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 gE(t){let e=new Set;if(eu(t))for(let r of t.steps){let n=r.members??{};cE(n,e)}else for(let r of Object.values(t.states))cE(r,e);return[...e].sort()}function cE(t,e){let r=["coder","agent","consolidator"],n=["reviewers","researchers"];for(let s of r){let i=t[s],o=uE(i);o!==null&&e.add(o)}for(let s of n){let i=t[s];if(Array.isArray(i))for(let o of i){let a=uE(o);a!==null&&e.add(a)}}}function uE(t){if(t===null||typeof t!="object")return null;let e=t.alias;return typeof e=="string"&&e.length>0?e:null}var Jo=E(()=>{"use strict";Ns()});function wM({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,Go)[0]??null;if(s!==null&&(s.status==="queued"||s.status==="running"))continue;let o=(s?.payload?JSON.parse(s.payload):null)?.max_run_id??null,{count:a,maxRunId:l}=TM(t,r,o);if(a<20)continue;let d=o??"initial",c=`${Us}:${r.id}:${d}`;t.enqueueJob({project_id:r.id,source:Go,source_ref:Us,payload:JSON.stringify({kind:Us,project_id:r.id,completed_sessions:a,max_run_id:l,since_run_id:o}),dedupe_key:c})}}function TM(t,e,r){let n=t.query(`SELECT COUNT(*) AS cnt, MAX(r.id) AS max_id
2143
+ `}function _E(t,e){let r=yM(e),n=EM(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=gM(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 gM(t){return(t??[]).filter(e=>e.required===!0&&e.default===void 0).map(e=>e.name)}function yM(t){return Qc(t)?t.entry_step_id:t.start_at}function EM(t){return Qc(t)?t.steps.find(e=>e.id===t.entry_step_id)?.type??null:t.states[t.start_at]?.type??null}function Qc(t){return t.definition_schema_version===3}function hE(t){return t instanceof Yt?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 gE(t){let e=new Set;if(Qc(t))for(let r of t.steps){let n=r.members??{};cE(n,e)}else for(let r of Object.values(t.states))cE(r,e);return[...e].sort()}function cE(t,e){let r=["coder","agent","consolidator"],n=["reviewers","researchers"];for(let s of r){let i=t[s],o=uE(i);o!==null&&e.add(o)}for(let s of n){let i=t[s];if(Array.isArray(i))for(let o of i){let a=uE(o);a!==null&&e.add(a)}}}function uE(t){if(t===null||typeof t!="object")return null;let e=t.alias;return typeof e=="string"&&e.length>0?e:null}var Jo=E(()=>{"use strict";Ns()});function wM({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,Go)[0]??null;if(s!==null&&(s.status==="queued"||s.status==="running"))continue;let o=(s?.payload?JSON.parse(s.payload):null)?.max_run_id??null,{count:a,maxRunId:l}=TM(t,r,o);if(a<20)continue;let d=o??"initial",c=`${Us}:${r.id}:${d}`;t.enqueueJob({project_id:r.id,source:Go,source_ref:Us,payload:JSON.stringify({kind:Us,project_id:r.id,completed_sessions:a,max_run_id:l,since_run_id:o}),dedupe_key:c})}}function TM(t,e,r){let n=t.query(`SELECT COUNT(*) AS cnt, MAX(r.id) AS max_id
2144
2144
  FROM run r
2145
2145
  JOIN job j ON j.id = r.job_id
2146
2146
  WHERE j.project_id = ?
2147
2147
  AND r.terminal_state IS NOT NULL
2148
- ${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 yE(t){for(let e of vM)try{e(t)}catch{}}var Go,Us,vM,tu=E(()=>{"use strict";Go="memory_policy",Us="memory_consolidation_request";vM=[wM]});var bE={};he(bE,{getOrInsertConsolidationWorkflow:()=>wE,runJobById:()=>NM,runOnce:()=>Br,startWorker:()=>AM});import{createHash as SM}from"node:crypto";import{readFileSync as bM}from"node:fs";import{pathToFileURL as kM}from"node:url";function wE(t,e="durable-memory-consolidation-v2"){let r=t.getWorkflowByName(e);if(r!==null)return r;try{Hg({swallow:!0});let n=Do(e);if(n===null)return null;let s=bM(n,"utf8"),i=pt(s);return t.insertWorkflow({name:e,version:i.version,definition_schema_version:i.definition_schema_version,definition:s,source_uri:kM(n).href,source_sha256:SM("sha256").update(s).digest("hex")})}catch{return null}}async function Br(t){let e=Date.now(),r=null;try{return r=t.dal.claimNextJobWithConcurrency({worker_id:t.worker_id,lease_ms:t.lease_ms??EE,evaluator:n=>vE(t.dal,n)}),r===null?null:await TE(t.dal,r,e)}catch(n){if(r!==null)return Sr(t.dal,r,"worker_run_failed",qr(n),e);try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:Vo(qr(n))})})}catch{}return null}finally{t.max_concurrent}}async function NM(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??EE,evaluator:s=>vE(t.dal,s)});return n.claimed?(r=n.job,{claimed:!0,...await TE(t.dal,r,e)}):n}catch(n){if(r!==null)return{claimed:!0,...Sr(t.dal,r,"worker_run_failed",qr(n),e)};try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:Vo(qr(n)),job_id:t.job_id})})}catch{}return{claimed:!1,reason:"not_claimable",job_id:t.job_id}}finally{t.max_concurrent}}async function TE(t,e,r){let n=t.getProjectByJob(e.id);if(n===null)return Sr(t,e,"worker_project_missing","project_not_found",r);let s=e.source===Go&&e.source_ref===Us,i=e.run_id===null?null:t.getRun(e.run_id),o;if(i!==null?o=t.getWorkflow(i.workflow_id):s?o=wE(t):o=SE(t,e,n),o===null)return Sr(t,e,"worker_workflow_missing","workflow_not_found",r,n);let a=t.getTeam(i?.team_id??n.team_id),l=a===null?[]:t.listTeamMembers(a.id);if(a===null||l.length===0)return Sr(t,e,"worker_team_missing","team_not_found",r,n);let d;try{d=pt(o.definition)}catch(u){return Sr(t,e,"worker_workflow_invalid",qr(u),r,n)}let c=xM(d,l);if(c.length>0)return Sr(t,e,"worker_team_missing_aliases",`missing_aliases:${c.join(",")}`,r,n,a);try{let u=await nE({dal:t,job:e,workflow:d,team:a,members:l,workflowRow:o});return t.setJobRun(e.id,u.run_id),u.paused===!0?{job_id:e.id,run_id:u.run_id,status:"paused",terminal_state:null,ms:Date.now()-r}:(t.releaseJob(e.id,"done",null),{job_id:e.id,run_id:u.run_id,status:"done",terminal_state:u.terminal_state,ms:Date.now()-r})}catch(u){return Sr(t,e,"worker_run_failed",qr(u),r,n,a)}}function vE(t,e){let r=t.getProjectByJob(e.id);if(r===null)return{concurrency_key:e.concurrency_key_resolved,concurrent_limit:1};let n=SE(t,e,r);if(n===null)return{concurrency_key:e.concurrency_key_resolved,concurrent_limit:1};let s=null;try{s=pt(n.definition)}catch{s=null}return bo({workflow:s,job:e,project:r})}function SE(t,e,r){return e.workflow_id_override!==null?t.getWorkflow(e.workflow_id_override):t.getWorkflowByName(r.workflow_name)}async function AM(t){let e=!1,r=null,n=Promise.resolve(),s=async()=>{if(!e){try{let i;do i=await Br(t);while(!e&&i!==null)}catch(i){try{t.dal.raiseAttention({kind:"worker_loop_error",severity:"error",payload:JSON.stringify({error:Vo(qr(i))})})}catch{}}e||(r=setTimeout(()=>{n=s()},t.poll_interval_ms??IM))}};return n=s(),{stop:async()=>{e=!0,r!==null&&clearTimeout(r),await n.catch(()=>{})}}}function Sr(t,e,r,n,s,i,o){let a=Vo(n);return t.releaseJob(e.id,"failed",a),t.raiseAttention({kind:r,severity:"error",project_id:i?.id??e.project_id,payload:JSON.stringify({job_id:e.id,team_id:o?.id??null,error:a})}),{job_id:e.id,run_id:null,status:"failed",terminal_state:null,ms:Date.now()-s}}function qr(t){return t instanceof Error?t.message:String(t)}function Vo(t){return t.length>4096?t.slice(0,4096):t}function xM(t,e){let r=gE(t);if(r.length===0)return[];let n=new Set(e.map(s=>s.alias));return r.filter(s=>!n.has(s))}var EE,IM,Ko=E(()=>{"use strict";Fc();dE();Ns();Jo();wc();tu();EE=6e5,IM=5e3});import{existsSync as RM,readFileSync as LM}from"node:fs";import{marked as OM}from"marked";function AE(t,e){t.get("/layman",r=>r.html($e("Layman Home",$M(e.dal)))),t.get("/api/layman",r=>r.json(OE(e.dal))),t.get("/layman/start/:workflow",r=>{let n=NE(r);return n===null?r.notFound():r.html($e(`Start ${Rn(n)}`,DM(e.dal,n)))}),t.post("/layman/start/:workflow",async r=>{let n=NE(r);return n===null?r.notFound():n==="newspaper"?kE(r,e.dal):jM(r,e.dal,n)}),t.get("/layman/run/:id",r=>{let n=jr(e.dal,Yo(r,"id"));return n===null?r.notFound():r.html($e(`Run ${n.id}`,UM(e.dal,n)))}),t.get("/api/layman/run/:id",r=>{let n=jr(e.dal,Yo(r,"id"));return n===null?r.notFound():r.json(zM(e.dal,n))}),t.post("/layman/run/:id/respond",async r=>qM(r,e.dal)),t.get("/layman/newspaper",r=>r.html($e("Newspaper Subscriptions",KM(e.dal)))),t.post("/layman/newspaper",r=>kE(r,e.dal)),t.delete("/layman/newspaper/:id",r=>IE(r,e.dal)),t.post("/layman/newspaper/:id/delete",r=>IE(r,e.dal))}function $M(t){let e=OE(t);return`<section class="layman-home">
2148
+ ${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 yE(t){for(let e of vM)try{e(t)}catch{}}var Go,Us,vM,eu=E(()=>{"use strict";Go="memory_policy",Us="memory_consolidation_request";vM=[wM]});var bE={};he(bE,{getOrInsertConsolidationWorkflow:()=>wE,runJobById:()=>NM,runOnce:()=>Br,startWorker:()=>AM});import{createHash as SM}from"node:crypto";import{readFileSync as bM}from"node:fs";import{pathToFileURL as kM}from"node:url";function wE(t,e="durable-memory-consolidation-v2"){let r=t.getWorkflowByName(e);if(r!==null)return r;try{Hg({swallow:!0});let n=Do(e);if(n===null)return null;let s=bM(n,"utf8"),i=pt(s);return t.insertWorkflow({name:e,version:i.version,definition_schema_version:i.definition_schema_version,definition:s,source_uri:kM(n).href,source_sha256:SM("sha256").update(s).digest("hex")})}catch{return null}}async function Br(t){let e=Date.now(),r=null;try{return r=t.dal.claimNextJobWithConcurrency({worker_id:t.worker_id,lease_ms:t.lease_ms??EE,evaluator:n=>vE(t.dal,n)}),r===null?null:await TE(t.dal,r,e)}catch(n){if(r!==null)return Sr(t.dal,r,"worker_run_failed",qr(n),e);try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:Vo(qr(n))})})}catch{}return null}finally{t.max_concurrent}}async function NM(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??EE,evaluator:s=>vE(t.dal,s)});return n.claimed?(r=n.job,{claimed:!0,...await TE(t.dal,r,e)}):n}catch(n){if(r!==null)return{claimed:!0,...Sr(t.dal,r,"worker_run_failed",qr(n),e)};try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:Vo(qr(n)),job_id:t.job_id})})}catch{}return{claimed:!1,reason:"not_claimable",job_id:t.job_id}}finally{t.max_concurrent}}async function TE(t,e,r){let n=t.getProjectByJob(e.id);if(n===null)return Sr(t,e,"worker_project_missing","project_not_found",r);let s=e.source===Go&&e.source_ref===Us,i=e.run_id===null?null:t.getRun(e.run_id),o;if(i!==null?o=t.getWorkflow(i.workflow_id):s?o=wE(t):o=SE(t,e,n),o===null)return Sr(t,e,"worker_workflow_missing","workflow_not_found",r,n);let a=t.getTeam(i?.team_id??n.team_id),l=a===null?[]:t.listTeamMembers(a.id);if(a===null||l.length===0)return Sr(t,e,"worker_team_missing","team_not_found",r,n);let d;try{d=pt(o.definition)}catch(u){return Sr(t,e,"worker_workflow_invalid",qr(u),r,n)}let c=xM(d,l);if(c.length>0)return Sr(t,e,"worker_team_missing_aliases",`missing_aliases:${c.join(",")}`,r,n,a);try{let u=await nE({dal:t,job:e,workflow:d,team:a,members:l,workflowRow:o});return t.setJobRun(e.id,u.run_id),u.paused===!0?{job_id:e.id,run_id:u.run_id,status:"paused",terminal_state:null,ms:Date.now()-r}:(t.releaseJob(e.id,"done",null),{job_id:e.id,run_id:u.run_id,status:"done",terminal_state:u.terminal_state,ms:Date.now()-r})}catch(u){return Sr(t,e,"worker_run_failed",qr(u),r,n,a)}}function vE(t,e){let r=t.getProjectByJob(e.id);if(r===null)return{concurrency_key:e.concurrency_key_resolved,concurrent_limit:1};let n=SE(t,e,r);if(n===null)return{concurrency_key:e.concurrency_key_resolved,concurrent_limit:1};let s=null;try{s=pt(n.definition)}catch{s=null}return bo({workflow:s,job:e,project:r})}function SE(t,e,r){return e.workflow_id_override!==null?t.getWorkflow(e.workflow_id_override):t.getWorkflowByName(r.workflow_name)}async function AM(t){let e=!1,r=null,n=Promise.resolve(),s=async()=>{if(!e){try{let i;do i=await Br(t);while(!e&&i!==null)}catch(i){try{t.dal.raiseAttention({kind:"worker_loop_error",severity:"error",payload:JSON.stringify({error:Vo(qr(i))})})}catch{}}e||(r=setTimeout(()=>{n=s()},t.poll_interval_ms??IM))}};return n=s(),{stop:async()=>{e=!0,r!==null&&clearTimeout(r),await n.catch(()=>{})}}}function Sr(t,e,r,n,s,i,o){let a=Vo(n);return t.releaseJob(e.id,"failed",a),t.raiseAttention({kind:r,severity:"error",project_id:i?.id??e.project_id,payload:JSON.stringify({job_id:e.id,team_id:o?.id??null,error:a})}),{job_id:e.id,run_id:null,status:"failed",terminal_state:null,ms:Date.now()-s}}function qr(t){return t instanceof Error?t.message:String(t)}function Vo(t){return t.length>4096?t.slice(0,4096):t}function xM(t,e){let r=gE(t);if(r.length===0)return[];let n=new Set(e.map(s=>s.alias));return r.filter(s=>!n.has(s))}var EE,IM,Ko=E(()=>{"use strict";Pc();dE();Ns();Jo();Ec();eu();EE=6e5,IM=5e3});import{existsSync as RM,readFileSync as LM}from"node:fs";import{marked as OM}from"marked";function AE(t,e){t.get("/layman",r=>r.html($e("Layman Home",$M(e.dal)))),t.get("/api/layman",r=>r.json(OE(e.dal))),t.get("/layman/start/:workflow",r=>{let n=NE(r);return n===null?r.notFound():r.html($e(`Start ${Rn(n)}`,DM(e.dal,n)))}),t.post("/layman/start/:workflow",async r=>{let n=NE(r);return n===null?r.notFound():n==="newspaper"?kE(r,e.dal):jM(r,e.dal,n)}),t.get("/layman/run/:id",r=>{let n=jr(e.dal,Yo(r,"id"));return n===null?r.notFound():r.html($e(`Run ${n.id}`,UM(e.dal,n)))}),t.get("/api/layman/run/:id",r=>{let n=jr(e.dal,Yo(r,"id"));return n===null?r.notFound():r.json(zM(e.dal,n))}),t.post("/layman/run/:id/respond",async r=>qM(r,e.dal)),t.get("/layman/newspaper",r=>r.html($e("Newspaper Subscriptions",KM(e.dal)))),t.post("/layman/newspaper",r=>kE(r,e.dal)),t.delete("/layman/newspaper/:id",r=>IE(r,e.dal)),t.post("/layman/newspaper/:id/delete",r=>IE(r,e.dal))}function $M(t){let e=OE(t);return`<section class="layman-home">
2149
2149
  <h1>Welcome</h1>
2150
2150
  <p class="muted">Choose a workflow and answer a few plain-language prompts.</p>
2151
2151
  <div class="grid">${zo.map(CM).join("")}</div>
@@ -2182,23 +2182,23 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
2182
2182
  <h2>${S(eD(e.state_name))}</h2>
2183
2183
  <p class="muted">The agent is waiting for your response.</p>
2184
2184
  <h3>Agent output</h3>
2185
- <div class="metric">${ou(e.last_agent_output??"")}</div>
2185
+ <div class="metric">${iu(e.last_agent_output??"")}</div>
2186
2186
  <form method="post" action="/layman/run/${S(t.id)}/respond">
2187
2187
  <input type="hidden" name="step_id" value="${S(e.step_id)}">
2188
2188
  <label>Your response<textarea name="input" rows="7"></textarea></label>
2189
2189
  <button type="submit" name="done" value="false">Send response</button>
2190
2190
  <button type="submit" name="done" value="true">Done with this stage</button>
2191
2191
  </form>
2192
- </section>`}async function qM(t,e){let r=Yo(t,"id"),n=await t.req.parseBody(),s=Number(tt(n.step_id)),i=tt(n.input),o=tt(n.done)==="true";if(!Number.isInteger(s))return t.html($e("Interactive response",'<p class="error">Missing interactive step.</p>'),400);let a=e.resumeInteractive(s,i,o);return a.resumed?(BM(e,a.run.id),await Br({dal:e,worker_id:`layman-respond-${Date.now()}`}),t.redirect(`/layman/run/${r}`,302)):t.html($e("Interactive response",`<p class="error">Could not submit response: ${S(a.reason)}</p>`),400)}function BM(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(!nu(s)||s.definition_schema_version!==3||!Array.isArray(s.steps))return;let i=s.steps.find(o=>nu(o)&&o.name===r.current_state&&typeof o.id=="string");nu(i)&&typeof i.id=="string"&&t.setRunCurrentState(r.id,i.id)}catch{return}}function HM(t,e,r){let n=tD(e.terminal_state);return`<section class="metric terminal-run">
2192
+ </section>`}async function qM(t,e){let r=Yo(t,"id"),n=await t.req.parseBody(),s=Number(tt(n.step_id)),i=tt(n.input),o=tt(n.done)==="true";if(!Number.isInteger(s))return t.html($e("Interactive response",'<p class="error">Missing interactive step.</p>'),400);let a=e.resumeInteractive(s,i,o);return a.resumed?(BM(e,a.run.id),await Br({dal:e,worker_id:`layman-respond-${Date.now()}`}),t.redirect(`/layman/run/${r}`,302)):t.html($e("Interactive response",`<p class="error">Could not submit response: ${S(a.reason)}</p>`),400)}function BM(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(!ru(s)||s.definition_schema_version!==3||!Array.isArray(s.steps))return;let i=s.steps.find(o=>ru(o)&&o.name===r.current_state&&typeof o.id=="string");ru(i)&&typeof i.id=="string"&&t.setRunCurrentState(r.id,i.id)}catch{return}}function HM(t,e,r){let n=tD(e.terminal_state);return`<section class="metric terminal-run">
2193
2193
  <h2>${n?"Complete":"Stopped"}</h2>
2194
2194
  <p>Status: <strong>${S(e.terminal_state)}</strong></p>
2195
2195
  ${n?XM(t,e,r):GM(e)}
2196
2196
  <h2>Stage Log</h2>
2197
2197
  ${RE(e)}
2198
- </section>`}function XM(t,e,r){if(r==="info-qa"){let n=iu(e,["info_qa_consolidated"]);return`<h3>Answer</h3><div class="metric">${ou(n??"No answer artifact was recorded yet.")}</div>`}if(r==="document-creation")return JM(t,e);if(r==="newspaper"){let n=iu(e,["newspaper_consolidated"]);return`<h3>Digest</h3><div class="metric">${ou(n??"No digest artifact was recorded yet.")}</div>`}return'<p class="muted">No layman output renderer for this workflow.</p>'}function JM(t,e){let r=Pr(t,e.id),n=ru(r,["render_docx"]),s=ru(r,["render_xlsx"]),i=iu(e,["review:coder[0]_transcript","chat_output_md"])??VM(ru(r,["document_md","markdown"])),o=[n,s].filter(a=>a!==null).map(a=>`<li><a href="file://${S(a)}">${S(a)}</a></li>`).join("");return`<h3>Document Preview</h3>
2198
+ </section>`}function XM(t,e,r){if(r==="info-qa"){let n=su(e,["info_qa_consolidated"]);return`<h3>Answer</h3><div class="metric">${iu(n??"No answer artifact was recorded yet.")}</div>`}if(r==="document-creation")return JM(t,e);if(r==="newspaper"){let n=su(e,["newspaper_consolidated"]);return`<h3>Digest</h3><div class="metric">${iu(n??"No digest artifact was recorded yet.")}</div>`}return'<p class="muted">No layman output renderer for this workflow.</p>'}function JM(t,e){let r=Pr(t,e.id),n=tu(r,["render_docx"]),s=tu(r,["render_xlsx"]),i=su(e,["review:coder[0]_transcript","chat_output_md"])??VM(tu(r,["document_md","markdown"])),o=[n,s].filter(a=>a!==null).map(a=>`<li><a href="file://${S(a)}">${S(a)}</a></li>`).join("");return`<h3>Document Preview</h3>
2199
2199
  <pre>${S(nD(rD(i??"No preview available."),30))}</pre>
2200
2200
  <h3>Downloads</h3>
2201
- ${o.length>0?`<ul>${o}</ul>`:'<p class="muted">No rendered files found yet.</p>'}`}function GM(t){let e=[...t.steps].reverse().find(r=>r.status_detail!==null);return`<p class="error">${S(e?.status_detail??"The workflow did not complete successfully.")}</p>`}function iu(t,e){for(let r of[...t.steps].reverse())for(let n of e){let s=[...r.artifacts].reverse().find(i=>i.kind===n&&i.content!==null);if(s?.content!==null&&s?.content!==void 0)return s.content}return null}function ru(t,e){for(let r of[...t].reverse())if(e.includes(r.kind)&&r.path!==null)return r.path;return null}function VM(t){if(t===null||!RM(t)||!t.endsWith(".md"))return null;try{return LM(t,"utf8")}catch{return null}}function KM(t){let e=t.listProjects();return`<h1>Newspaper Subscriptions</h1>
2201
+ ${o.length>0?`<ul>${o}</ul>`:'<p class="muted">No rendered files found yet.</p>'}`}function GM(t){let e=[...t.steps].reverse().find(r=>r.status_detail!==null);return`<p class="error">${S(e?.status_detail??"The workflow did not complete successfully.")}</p>`}function su(t,e){for(let r of[...t.steps].reverse())for(let n of e){let s=[...r.artifacts].reverse().find(i=>i.kind===n&&i.content!==null);if(s?.content!==null&&s?.content!==void 0)return s.content}return null}function tu(t,e){for(let r of[...t].reverse())if(e.includes(r.kind)&&r.path!==null)return r.path;return null}function VM(t){if(t===null||!RM(t)||!t.endsWith(".md"))return null;try{return LM(t,"utf8")}catch{return null}}function KM(t){let e=t.listProjects();return`<h1>Newspaper Subscriptions</h1>
2202
2202
  ${YM($E(t))}
2203
2203
  <h2>Add Subscription</h2>
2204
2204
  ${e.length===0?'<p class="error">Create a project before subscribing.</p>':LE(e,"/layman/newspaper")}`}function LE(t,e){return`<form method="post" action="${S(e)}">
@@ -2215,28 +2215,28 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
2215
2215
  </form>`}async function kE(t,e){let r=await t.req.parseBody(),n=ME(e,r);if(n===null)return t.html($e("Newspaper",'<p class="error">Choose a valid project.</p>'),400);let s=e.getWorkflowByName("newspaper");if(s===null)return t.html($e("Newspaper",'<p class="error">The newspaper workflow is not loaded.</p>'),400);let i=tt(r.topics).split(/[\n,]/).map(a=>a.trim()).filter(a=>a.length>0);if(i.length===0)return t.html($e("Newspaper",'<p class="error">Enter at least one topic.</p>'),400);let o={topics:i,output_dir:tt(r.output_dir).trim()||"digests",schedule:QM(r)};return e.insertProjectWorkflow({project_id:n.id,workflow_id:s.id,condition:null,parameters_override:JSON.stringify(o),priority:100,enabled:!0}),t.redirect("/layman/newspaper?created=1",302)}function IE(t,e){let r=Yo(t,"id");return e.removeProjectWorkflow(r)?t.redirect("/layman/newspaper?removed=1",302):t.notFound()}function YM(t){return _e(["id","project","topics","status","action"],t.map(e=>{let r=iD(e.parameters_override),n=Array.isArray(r.topics)?r.topics.join(", "):"";return[S(e.id),S(e.project_name),S(n),e.enabled===1?"enabled":"disabled",`<form method="post" action="/layman/newspaper/${e.id}/delete"><button type="submit">Remove</button></form>`]}))}function OE(t){let e=$E(t);return{workflows:zo,recent_runs:ZM(t),newspaper_subscriptions:e.length}}function zM(t,e){let r=CE(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 ZM(t){return t.query(`SELECT r.*, w.name AS workflow_name
2216
2216
  FROM run r
2217
2217
  JOIN workflow w ON w.id = r.workflow_id
2218
- WHERE w.name IN (${su.map(()=>"?").join(",")})
2218
+ WHERE w.name IN (${nu.map(()=>"?").join(",")})
2219
2219
  ORDER BY r.id DESC
2220
- LIMIT 10`,...su)}function $E(t){return t.query(`SELECT pw.*, p.name AS project_name
2220
+ LIMIT 10`,...nu)}function $E(t){return t.query(`SELECT pw.*, p.name AS project_name
2221
2221
  FROM project_workflow pw
2222
2222
  JOIN workflow w ON w.id = pw.workflow_id
2223
2223
  JOIN project p ON p.id = pw.project_id
2224
2224
  WHERE w.name = ?
2225
- ORDER BY pw.id DESC`,"newspaper")}function CE(t,e){for(let r of[...e.steps].reverse()){let n=t.getInteractiveSessionByStepId(r.id);if(n!==null)return n}return null}function ME(t,e){let r=Number(tt(e.project_id));return Number.isInteger(r)?t.getProject(r):null}function QM(t){let e=tt(t.schedule)||"daily";return e==="weekly"?{preset:e,cron:"0 6 * * 1"}:e==="custom"?{preset:e,cron:tt(t.cron).trim()||"0 6 * * *"}:{preset:"daily",cron:"0 6 * * *"}}function NE(t){let e=t.req.param("workflow");return su.includes(e)?e:null}function Rn(t){return zo.find(e=>e.name===t)?.title??t}function eD(t){return t.split(/[_:-]/).filter(Boolean).map(e=>`${e[0]?.toUpperCase()??""}${e.slice(1)}`).join(" ")}function ou(t){return OM.parse(t,{async:!1})}function tD(t){return t==="done"||t==="pr_ready"||t==="merged"}function rD(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}function nD(t,e){return t.split(`
2225
+ ORDER BY pw.id DESC`,"newspaper")}function CE(t,e){for(let r of[...e.steps].reverse()){let n=t.getInteractiveSessionByStepId(r.id);if(n!==null)return n}return null}function ME(t,e){let r=Number(tt(e.project_id));return Number.isInteger(r)?t.getProject(r):null}function QM(t){let e=tt(t.schedule)||"daily";return e==="weekly"?{preset:e,cron:"0 6 * * 1"}:e==="custom"?{preset:e,cron:tt(t.cron).trim()||"0 6 * * *"}:{preset:"daily",cron:"0 6 * * *"}}function NE(t){let e=t.req.param("workflow");return nu.includes(e)?e:null}function Rn(t){return zo.find(e=>e.name===t)?.title??t}function eD(t){return t.split(/[_:-]/).filter(Boolean).map(e=>`${e[0]?.toUpperCase()??""}${e.slice(1)}`).join(" ")}function iu(t){return OM.parse(t,{async:!1})}function tD(t){return t==="done"||t==="pr_ready"||t==="merged"}function rD(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}function nD(t,e){return t.split(`
2226
2226
  `).slice(0,e).join(`
2227
- `)}function sD(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function tt(t){return typeof t=="string"?t:""}function iD(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 nu(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Yo(t,e){return Number(t.req.param(e))}var zo,su,DE=E(()=>{"use strict";Ko();Vt();Cc();zo=[{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."}],su=zo.map(t=>t.name)});function aD(t){return t.replace(/^\/+/,"")}function jE(t){return typeof t=="string"&&t!==""&&!t.includes("/")&&!t.includes("\\")}function Ln(t){if(t.mailboxKey!==void 0&&t.mailboxKey!==null&&t.mailboxKey!==""){let e=aD(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 jE(t.userId)&&jE(t.deviceId)?`${t.userId}/${t.deviceId}/`:`${oD}/${t.identityId}/`}function dD(t){return String(Math.max(0,Math.floor(t))).padStart(lD,"0")}function au(t,e,r){return`${t}${e}${dD(r)}.json`}function Zo(t,e){return`${t}${e}`}function Qo(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 i=Number(s[1]);return Number.isSafeInteger(i)?i:void 0}var oD,lD,ea=E(()=>{"use strict";oD="mailbox";lD=12});function Qt(t,e){let r=Math.floor(t),n="",s=r;for(let c=0;c<12;c++)n=ta[s&15]+n,s=Math.floor(s/16);let i=Math.floor(e()*4096)&4095,o="",a=i;for(let c=0;c<3;c++)o=ta[a&15]+o,a=a>>4;let l=ta[8|Math.floor(e()*4)&3],d="";for(let c=0;c<15;c++)d+=ta[Math.floor(e()*16)&15];return n.slice(0,8)+"-"+n.slice(8,12)+"-7"+o+"-"+l+d.slice(0,3)+"-"+d.slice(3,15)}var ta,ra=E(()=>{"use strict";ta="0123456789abcdef"});function du(t,e){return!Number.isFinite(t)||t<=0?e:t}function cu(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 qE(t){return t.conversation_id===WE&&mD(t.payload)}function mD(t){return typeof t=="object"&&t!==null&&t.kind==="heartbeat"}function fD(t){let e=typeof t.hb=="string"&&t.hb!==""?t.hb:qE(t)?t.timestamp:void 0;if(e===void 0)return;let r=Date.parse(e);return Number.isFinite(r)?r:void 0}var PE,FE,UE,cD,WE,uD,lu,Hr,na=E(()=>{"use strict";ea();ra();PE=3e3,FE=1e4,UE=12e3,cD=1e3,WE="__lmctl_heartbeat__",uD={kind:"heartbeat"},lu={setTimeout:(t,e)=>setTimeout(t,e),clearTimeout:t=>clearTimeout(t)},Hr=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=Ln({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=du(e.readIntervalMs??e.pollIntervalMs??PE,PE),this.heartbeatIdleMs=du(e.heartbeatIdleMs??FE,FE),this.backoffReadIntervalMs=du(e.backoffReadIntervalMs??e.pollIntervalMs??UE,UE)}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??lu;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=Zo(this.basePrefix,e),n=0,s;do{let i=await this.opts.s3.send(new this.opts.commands.ListObjectsV2Command({Bucket:this.opts.bucket,Prefix:r,MaxKeys:cD,...s!==void 0&&{ContinuationToken:s}}));this.opts.onS3Op?.("list");for(let o of i.Contents??[]){let a=Qo(o.Key??"",this.basePrefix,e);a!==void 0&&a>n&&(n=a)}s=i.IsTruncated===!0?i.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(),i={message_id:Qt(n,this.opts.random??Math.random),from:this.opts.selfRole,timestamp:s,hb:s,conversation_id:e,payload:r},o=(this.ownSeq??0)+1,a=au(this.basePrefix,this.ownStream,o);return await this.opts.s3.send(new this.opts.commands.PutObjectCommand({Bucket:this.opts.bucket,Key:a,Body:JSON.stringify(i),ContentType:"application/json"})),this.opts.onS3Op?.("put"),this.ownSeq=o,this.recordWrite(n),a}scheduleNextTick(e){if(this.stopRequested)return;let r=this.opts.timers??lu;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=au(this.basePrefix,this.peerStream,e),n;try{let i=await this.opts.s3.send(new this.opts.commands.GetObjectCommand({Bucket:this.opts.bucket,Key:r}));if(this.opts.onS3Op?.("get"),i.Body===void 0){this.emitError(new Error(`GetObject ${r}: empty body`),"get"),this.advanceCursor(e);continue}n=await i.Body.transformToString("utf-8")}catch(i){if(cu(i)){this.opts.onS3Op?.("get");return}this.emitError(i,"get");return}let s;try{s=JSON.parse(n)}catch(i){this.emitError(i,"get"),this.advanceCursor(e);continue}if(this.recordPeerHeartbeat(s),qE(s)){this.advanceCursor(e);continue}try{await this.opts.onMessage(s)}catch(i){this.emitError(i,"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=fD(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??lu;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(WE,uD)}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 pD}from"@hono/node-server/conninfo";function BE(t,e){let r=e.bucket??_D,n=e.remoteAddressOf??(i=>gD(i)),s=i=>{let o=n(i);return yD(o)?null:i.json({error:"forbidden",message:"local-mailbox is loopback-only"},403)};t.get("/local-mailbox/object",async i=>{let o=s(i);if(o!==null)return o;let a=uu(i.req.query("key"));if(typeof a!="string")return i.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 i.json({error:"empty_body"},404);let d=await l.Body.transformToString("utf-8");return i.body(d,200,{"Content-Type":"application/octet-stream"})}catch(l){return cu(l)?i.json({error:"not_found"},404):i.json({error:"internal",message:mu(l)},500)}}),t.put("/local-mailbox/object",async i=>{let o=s(i);if(o!==null)return o;let a=uu(i.req.query("key"));if(typeof a!="string")return i.json({error:"bad_request",message:a.error},400);let l=new Uint8Array(await i.req.arrayBuffer());try{return await e.s3.send(new e.commands.PutObjectCommand({Bucket:r,Key:a,Body:l})),i.json({ok:!0})}catch(d){return i.json({error:"internal",message:mu(d)},500)}}),t.get("/local-mailbox/list",async i=>{let o=s(i);if(o!==null)return o;let a=i.req.query("prefix")??"",l=uu(a,{allowEmpty:!0});if(typeof l!="string")return i.json({error:"bad_request",message:l.error},400);let d=hD(i.req.query("maxKeys")),c=i.req.query("token");try{let u=await e.s3.send(new e.commands.ListObjectsV2Command({Bucket:r,Prefix:l,...d!==void 0?{MaxKeys:d}:{},...c!==void 0&&c!==""?{ContinuationToken:c}:{}}));return i.json({Contents:(u.Contents??[]).map(m=>({Key:m.Key,LastModified:m.LastModified instanceof Date?m.LastModified.toISOString():m.LastModified})),IsTruncated:u.IsTruncated??!1,...u.NextContinuationToken!==void 0?{NextContinuationToken:u.NextContinuationToken}:{}})}catch(u){return i.json({error:"internal",message:mu(u)},500)}})}function uu(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 hD(t){if(t===void 0||t==="")return;let e=Number(t);return Number.isInteger(e)&&e>0?e:void 0}function gD(t){try{return pD(t).remote.address}catch{return}}function yD(t){return t===void 0||t===""?!1:!!(t==="127.0.0.1"||t==="::1"||t.startsWith("::ffff:127.")||t.startsWith("127."))}function mu(t){return t instanceof Error?t.message:String(t)}var _D,HE=E(()=>{"use strict";na();_D="local"});function XE(t,e){t.get("/mailbox/workspace",r=>TD(r,e)),t.get("/mailbox/projects",r=>vD(r,e)),t.get("/mailbox/projects/:id",r=>SD(r,e)),t.post("/mailbox/projects",r=>bD(r,e)),t.patch("/mailbox/projects/:id",r=>kD(r,e)),t.delete("/mailbox/projects/:id",r=>ID(r,e)),t.post("/mailbox/projects/:project_id/prompts",r=>ND(r,e)),t.get("/mailbox/prompts/:id",r=>AD(r,e))}function TD(t,e){e.dal.ensureWorkspace({id:$n,name:fu});let r=JE(e.dal),n={id:$n,name:fu,created_at:wD,projects:r};return t.json({workspace:n})}function vD(t,e){return t.json({projects:JE(e.dal)})}function SD(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(On)){let s=pu(e.dal,r);return s===null||s.deleted_at!==null?t.json({project:null},404):t.json({project:oa(s)})}let n=VE(e.dal,r);return n===null?t.json({project:null},404):t.json({project:GE(n)})}async function bD(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:$n,name:fu});let s=e.dal.insertWebProject({workspace_id:$n,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:oa(s)},201)}async function kD(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(On)){let i=pu(e.dal,r);if(i===null||i.deleted_at!==null)return t.json({error:"project_not_found",message:`project not found: ${r}`},404);let o=e.dal.updateWebProject({id:i.id,name:s.name===void 0?void 0:s.name,config_json:s.config_json===void 0?void 0:JSON.stringify(s.config_json)});return o===null?t.json({error:"project_not_found",message:`project not found: ${r}`},404):t.json({project:oa(o)})}return t.json({error:"project_not_found",message:`project not found: ${r}`},404)}function ID(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(On)){let n=pu(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 ND(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 i=s.project_id??r;if(typeof s.text!="string"||s.text==="")return t.json({error:"bad_request",message:"input.text is required"},400);let o=VE(e.dal,i);if(o===null)return t.json({error:"project_not_found",message:`project not found: ${i}`},404);if(e.dal.getWorkflowByName(o.workflow_name)===null)return t.json({error:"workflow_not_registered",message:`project ${o.name} has no registered workflow "${o.workflow_name}"`},400);let l=`${ED}${crypto.randomUUID()}`,d={text:s.text,context_json:s.context_json??null},c;e.enqueueProjectJob!==void 0?c=e.enqueueProjectJob({dal:e.dal,project_id:o.id,source_ref:l,payload:d}):c=await xD({dal:e.dal,project_id:o.id,source_ref:l,payload:d}),e.dal.insertPromptDispatch({prompt_id:l,project_id:o.id,job_id:c.id,text:s.text,context_json:s.context_json===void 0?null:JSON.stringify(s.context_json)});let u={id:l,project_id:`${ia}${o.id}`,text:s.text,status:"pending",created_at:new Date().toISOString(),completed_at:null};return t.json({prompt:u},201)}function AD(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=RD(e.dal,r);return t.json({result:n})}function JE(t){let e=t.listProjects().map(GE),r=t.listWebProjectsActive($n).map(oa);return[...e,...r].sort(UD)}function GE(t){return{id:`${ia}${t.id}`,workspace_id:$n,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 oa(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:`${On}${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 pu(t,e){if(!e.startsWith(On))return null;let r=e.slice(On.length),n=Number.parseInt(r,10);return!Number.isFinite(n)||String(n)!==r?null:t.getWebProject(n)}function VE(t,e){if(e.startsWith(ia)){let n=e.slice(ia.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 xD(t){let{enqueueManual:e}=await Promise.resolve().then(()=>(vc(),mg));return{id:e(t.dal,{project_id:t.project_id,source_ref:t.source_ref,payload:t.payload}).id}}function RD(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),i=t.getProject(r.project_id),o=jD(t,i?.team_id??null),a=DD(s),l=PD(n,a,o.length>0),d=FD(r.created_at,s),c=i===null?{totalEstimatedMs:void 0,perStep:new Map}:LD(t,i.workflow_name),u=c.totalEstimatedMs,m=KE(r.created_at),f=i?.workflow_name,p=c.perStep.size>0?c.perStep.size:void 0,h=s===null?[]:OD(t,s.id),g=$D(s,a,h,c.perStep,o),_=CD(h,c.perStep),y=MD(g,_,u,m,f,p);return l==="error"?{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,...sa(u,m),...y},errors_json:{error:n.last_error??"job_failed",job_id:n.id,run_id:s?.id??null},duration_ms:d}: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,...sa(u,m),...y},errors_json:null,duration_ms:d}):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:o,...sa(u,m),...y},errors_json:null,duration_ms:d}:{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,...sa(u,m),...y},errors_json:null,duration_ms:d}}function LD(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 i=s,o=typeof i.estimated_duration_ms=="number"&&Number.isFinite(i.estimated_duration_ms)&&i.estimated_duration_ms>=0?i.estimated_duration_ms:void 0,a=new Map;if(Array.isArray(i.steps))for(let l of i.steps){if(l===null||typeof l!="object")continue;let d=l;if(typeof d.id!="string"||d.id.length===0)continue;let c=typeof d.name=="string"&&d.name.length>0?d.name:d.id,u=typeof d.estimated_duration_ms=="number"&&Number.isFinite(d.estimated_duration_ms)&&d.estimated_duration_ms>=0?d.estimated_duration_ms:void 0;a.set(d.id,u===void 0?{name:c}:{name:c,estimated_duration_ms:u})}if(i.steps===void 0&&i.states!==null&&typeof i.states=="object")for(let[l,d]of Object.entries(i.states)){if(d===null||typeof d!="object")continue;let c=d,u=typeof c.estimated_duration_ms=="number"&&Number.isFinite(c.estimated_duration_ms)&&c.estimated_duration_ms>=0?c.estimated_duration_ms:void 0;a.set(l,u===void 0?{name:l}:{name:l,estimated_duration_ms:u})}return{totalEstimatedMs:o,perStep:a}}function OD(t,e){try{return t.listStepsForRun(e)}catch{return[]}}function $D(t,e,r,n,s){if(t===null||t.terminal_state!==null)return;let i=e!==null?e:t.current_state;if(i===null||i.length===0)return;let a=[...r].reverse().find(m=>m.state_name===i&&m.ended_at===null)?.started_at??t.paused_at??t.started_at,l=n.get(i),d=l?.name??i,c=KE(a),u={id:i,name:d,started_at:a,elapsed_ms:c};return l?.estimated_duration_ms!==void 0&&(u.estimated_duration_ms=l.estimated_duration_ms),s.length>0&&(u.attention_needed=s),u}function CD(t,e){let r=[];for(let n of t){if(n.ended_at===null)continue;let s=Date.parse(n.started_at),i=Date.parse(n.ended_at),o=Number.isFinite(s)&&Number.isFinite(i)?Math.max(0,i-s):0,a=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:o,status:l})}return r}function MD(t,e,r,n,s,i){let o={completed_steps:e,total_elapsed_ms:n};return t!==void 0&&(o.current_step=t),r!==void 0&&(o.total_estimated_ms=r),s!==void 0&&s.length>0&&(o.workflow_name=s),i!==void 0&&(o.total_steps=i),o}function KE(t){let e=Date.parse(t);return Number.isNaN(e)?0:Math.max(0,Date.now()-e)}function sa(t,e){return t===void 0?{elapsed_ms:e}:{elapsed_ms:e,estimated_duration_ms:t}}function DD(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 jD(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 PD(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 UD(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 ia,On,ED,$n,fu,wD,YE=E(()=>{"use strict";ia="project:",On="web_project:",ED="prompt:",$n="default",fu="Default workspace",wD=new Date(0).toISOString()});import{Buffer as zE}from"node:buffer";function ZE(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 QE(t){return BD[t]}function ew(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 WD,qD,aa,BD,_u=E(()=>{"use strict";WD=1e4,qD=256*1024,aa=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=ZE(e.pushWindowMs,process.env.LMCTL_TERMINAL_PUSH_WINDOW_MS,WD),this.pushByteCap=ZE(e.pushByteCap,process.env.LMCTL_TERMINAL_PUSH_BYTE_CAP,qD),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+=zE.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=${zE.byteLength(n,"utf8")}`)}catch(i){this.opts.log?.(`[dt-2] publish failed session=${e.session_id} reason=${r}: ${i instanceof Error?i.message:String(i)}`)}}async onPtyExit(e,r){if(e.closed)return;await this.flush(e,"pty_exit");let n=`\r
2227
+ `)}function sD(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function tt(t){return typeof t=="string"?t:""}function iD(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 ru(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Yo(t,e){return Number(t.req.param(e))}var zo,nu,DE=E(()=>{"use strict";Ko();Vt();$c();zo=[{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."}],nu=zo.map(t=>t.name)});function aD(t){return t.replace(/^\/+/,"")}function jE(t){return typeof t=="string"&&t!==""&&!t.includes("/")&&!t.includes("\\")}function Ln(t){if(t.mailboxKey!==void 0&&t.mailboxKey!==null&&t.mailboxKey!==""){let e=aD(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 jE(t.userId)&&jE(t.deviceId)?`${t.userId}/${t.deviceId}/`:`${oD}/${t.identityId}/`}function dD(t){return String(Math.max(0,Math.floor(t))).padStart(lD,"0")}function ou(t,e,r){return`${t}${e}${dD(r)}.json`}function Zo(t,e){return`${t}${e}`}function Qo(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 i=Number(s[1]);return Number.isSafeInteger(i)?i:void 0}var oD,lD,ea=E(()=>{"use strict";oD="mailbox";lD=12});function Qt(t,e){let r=Math.floor(t),n="",s=r;for(let c=0;c<12;c++)n=ta[s&15]+n,s=Math.floor(s/16);let i=Math.floor(e()*4096)&4095,o="",a=i;for(let c=0;c<3;c++)o=ta[a&15]+o,a=a>>4;let l=ta[8|Math.floor(e()*4)&3],d="";for(let c=0;c<15;c++)d+=ta[Math.floor(e()*16)&15];return n.slice(0,8)+"-"+n.slice(8,12)+"-7"+o+"-"+l+d.slice(0,3)+"-"+d.slice(3,15)}var ta,ra=E(()=>{"use strict";ta="0123456789abcdef"});function lu(t,e){return!Number.isFinite(t)||t<=0?e:t}function du(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 qE(t){return t.conversation_id===WE&&mD(t.payload)}function mD(t){return typeof t=="object"&&t!==null&&t.kind==="heartbeat"}function fD(t){let e=typeof t.hb=="string"&&t.hb!==""?t.hb:qE(t)?t.timestamp:void 0;if(e===void 0)return;let r=Date.parse(e);return Number.isFinite(r)?r:void 0}var PE,FE,UE,cD,WE,uD,au,Hr,na=E(()=>{"use strict";ea();ra();PE=3e3,FE=1e4,UE=12e3,cD=1e3,WE="__lmctl_heartbeat__",uD={kind:"heartbeat"},au={setTimeout:(t,e)=>setTimeout(t,e),clearTimeout:t=>clearTimeout(t)},Hr=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=Ln({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=lu(e.readIntervalMs??e.pollIntervalMs??PE,PE),this.heartbeatIdleMs=lu(e.heartbeatIdleMs??FE,FE),this.backoffReadIntervalMs=lu(e.backoffReadIntervalMs??e.pollIntervalMs??UE,UE)}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??au;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=Zo(this.basePrefix,e),n=0,s;do{let i=await this.opts.s3.send(new this.opts.commands.ListObjectsV2Command({Bucket:this.opts.bucket,Prefix:r,MaxKeys:cD,...s!==void 0&&{ContinuationToken:s}}));this.opts.onS3Op?.("list");for(let o of i.Contents??[]){let a=Qo(o.Key??"",this.basePrefix,e);a!==void 0&&a>n&&(n=a)}s=i.IsTruncated===!0?i.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(),i={message_id:Qt(n,this.opts.random??Math.random),from:this.opts.selfRole,timestamp:s,hb:s,conversation_id:e,payload:r},o=(this.ownSeq??0)+1,a=ou(this.basePrefix,this.ownStream,o);return await this.opts.s3.send(new this.opts.commands.PutObjectCommand({Bucket:this.opts.bucket,Key:a,Body:JSON.stringify(i),ContentType:"application/json"})),this.opts.onS3Op?.("put"),this.ownSeq=o,this.recordWrite(n),a}scheduleNextTick(e){if(this.stopRequested)return;let r=this.opts.timers??au;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=ou(this.basePrefix,this.peerStream,e),n;try{let i=await this.opts.s3.send(new this.opts.commands.GetObjectCommand({Bucket:this.opts.bucket,Key:r}));if(this.opts.onS3Op?.("get"),i.Body===void 0){this.emitError(new Error(`GetObject ${r}: empty body`),"get"),this.advanceCursor(e);continue}n=await i.Body.transformToString("utf-8")}catch(i){if(du(i)){this.opts.onS3Op?.("get");return}this.emitError(i,"get");return}let s;try{s=JSON.parse(n)}catch(i){this.emitError(i,"get"),this.advanceCursor(e);continue}if(this.recordPeerHeartbeat(s),qE(s)){this.advanceCursor(e);continue}try{await this.opts.onMessage(s)}catch(i){this.emitError(i,"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=fD(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??au;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(WE,uD)}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 pD}from"@hono/node-server/conninfo";function BE(t,e){let r=e.bucket??_D,n=e.remoteAddressOf??(i=>gD(i)),s=i=>{let o=n(i);return yD(o)?null:i.json({error:"forbidden",message:"local-mailbox is loopback-only"},403)};t.get("/local-mailbox/object",async i=>{let o=s(i);if(o!==null)return o;let a=cu(i.req.query("key"));if(typeof a!="string")return i.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 i.json({error:"empty_body"},404);let d=await l.Body.transformToString("utf-8");return i.body(d,200,{"Content-Type":"application/octet-stream"})}catch(l){return du(l)?i.json({error:"not_found"},404):i.json({error:"internal",message:uu(l)},500)}}),t.put("/local-mailbox/object",async i=>{let o=s(i);if(o!==null)return o;let a=cu(i.req.query("key"));if(typeof a!="string")return i.json({error:"bad_request",message:a.error},400);let l=new Uint8Array(await i.req.arrayBuffer());try{return await e.s3.send(new e.commands.PutObjectCommand({Bucket:r,Key:a,Body:l})),i.json({ok:!0})}catch(d){return i.json({error:"internal",message:uu(d)},500)}}),t.get("/local-mailbox/list",async i=>{let o=s(i);if(o!==null)return o;let a=i.req.query("prefix")??"",l=cu(a,{allowEmpty:!0});if(typeof l!="string")return i.json({error:"bad_request",message:l.error},400);let d=hD(i.req.query("maxKeys")),c=i.req.query("token");try{let u=await e.s3.send(new e.commands.ListObjectsV2Command({Bucket:r,Prefix:l,...d!==void 0?{MaxKeys:d}:{},...c!==void 0&&c!==""?{ContinuationToken:c}:{}}));return i.json({Contents:(u.Contents??[]).map(m=>({Key:m.Key,LastModified:m.LastModified instanceof Date?m.LastModified.toISOString():m.LastModified})),IsTruncated:u.IsTruncated??!1,...u.NextContinuationToken!==void 0?{NextContinuationToken:u.NextContinuationToken}:{}})}catch(u){return i.json({error:"internal",message:uu(u)},500)}})}function cu(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 hD(t){if(t===void 0||t==="")return;let e=Number(t);return Number.isInteger(e)&&e>0?e:void 0}function gD(t){try{return pD(t).remote.address}catch{return}}function yD(t){return t===void 0||t===""?!1:!!(t==="127.0.0.1"||t==="::1"||t.startsWith("::ffff:127.")||t.startsWith("127."))}function uu(t){return t instanceof Error?t.message:String(t)}var _D,HE=E(()=>{"use strict";na();_D="local"});function XE(t,e){t.get("/mailbox/workspace",r=>TD(r,e)),t.get("/mailbox/projects",r=>vD(r,e)),t.get("/mailbox/projects/:id",r=>SD(r,e)),t.post("/mailbox/projects",r=>bD(r,e)),t.patch("/mailbox/projects/:id",r=>kD(r,e)),t.delete("/mailbox/projects/:id",r=>ID(r,e)),t.post("/mailbox/projects/:project_id/prompts",r=>ND(r,e)),t.get("/mailbox/prompts/:id",r=>AD(r,e))}function TD(t,e){e.dal.ensureWorkspace({id:$n,name:mu});let r=JE(e.dal),n={id:$n,name:mu,created_at:wD,projects:r};return t.json({workspace:n})}function vD(t,e){return t.json({projects:JE(e.dal)})}function SD(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(On)){let s=fu(e.dal,r);return s===null||s.deleted_at!==null?t.json({project:null},404):t.json({project:oa(s)})}let n=VE(e.dal,r);return n===null?t.json({project:null},404):t.json({project:GE(n)})}async function bD(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:$n,name:mu});let s=e.dal.insertWebProject({workspace_id:$n,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:oa(s)},201)}async function kD(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(On)){let i=fu(e.dal,r);if(i===null||i.deleted_at!==null)return t.json({error:"project_not_found",message:`project not found: ${r}`},404);let o=e.dal.updateWebProject({id:i.id,name:s.name===void 0?void 0:s.name,config_json:s.config_json===void 0?void 0:JSON.stringify(s.config_json)});return o===null?t.json({error:"project_not_found",message:`project not found: ${r}`},404):t.json({project:oa(o)})}return t.json({error:"project_not_found",message:`project not found: ${r}`},404)}function ID(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(On)){let n=fu(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 ND(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 i=s.project_id??r;if(typeof s.text!="string"||s.text==="")return t.json({error:"bad_request",message:"input.text is required"},400);let o=VE(e.dal,i);if(o===null)return t.json({error:"project_not_found",message:`project not found: ${i}`},404);if(e.dal.getWorkflowByName(o.workflow_name)===null)return t.json({error:"workflow_not_registered",message:`project ${o.name} has no registered workflow "${o.workflow_name}"`},400);let l=`${ED}${crypto.randomUUID()}`,d={text:s.text,context_json:s.context_json??null},c;e.enqueueProjectJob!==void 0?c=e.enqueueProjectJob({dal:e.dal,project_id:o.id,source_ref:l,payload:d}):c=await xD({dal:e.dal,project_id:o.id,source_ref:l,payload:d}),e.dal.insertPromptDispatch({prompt_id:l,project_id:o.id,job_id:c.id,text:s.text,context_json:s.context_json===void 0?null:JSON.stringify(s.context_json)});let u={id:l,project_id:`${ia}${o.id}`,text:s.text,status:"pending",created_at:new Date().toISOString(),completed_at:null};return t.json({prompt:u},201)}function AD(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=RD(e.dal,r);return t.json({result:n})}function JE(t){let e=t.listProjects().map(GE),r=t.listWebProjectsActive($n).map(oa);return[...e,...r].sort(UD)}function GE(t){return{id:`${ia}${t.id}`,workspace_id:$n,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 oa(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:`${On}${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 fu(t,e){if(!e.startsWith(On))return null;let r=e.slice(On.length),n=Number.parseInt(r,10);return!Number.isFinite(n)||String(n)!==r?null:t.getWebProject(n)}function VE(t,e){if(e.startsWith(ia)){let n=e.slice(ia.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 xD(t){let{enqueueManual:e}=await Promise.resolve().then(()=>(Tc(),mg));return{id:e(t.dal,{project_id:t.project_id,source_ref:t.source_ref,payload:t.payload}).id}}function RD(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),i=t.getProject(r.project_id),o=jD(t,i?.team_id??null),a=DD(s),l=PD(n,a,o.length>0),d=FD(r.created_at,s),c=i===null?{totalEstimatedMs:void 0,perStep:new Map}:LD(t,i.workflow_name),u=c.totalEstimatedMs,m=KE(r.created_at),f=i?.workflow_name,p=c.perStep.size>0?c.perStep.size:void 0,h=s===null?[]:OD(t,s.id),g=$D(s,a,h,c.perStep,o),_=CD(h,c.perStep),y=MD(g,_,u,m,f,p);return l==="error"?{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,...sa(u,m),...y},errors_json:{error:n.last_error??"job_failed",job_id:n.id,run_id:s?.id??null},duration_ms:d}: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,...sa(u,m),...y},errors_json:null,duration_ms:d}):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:o,...sa(u,m),...y},errors_json:null,duration_ms:d}:{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,...sa(u,m),...y},errors_json:null,duration_ms:d}}function LD(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 i=s,o=typeof i.estimated_duration_ms=="number"&&Number.isFinite(i.estimated_duration_ms)&&i.estimated_duration_ms>=0?i.estimated_duration_ms:void 0,a=new Map;if(Array.isArray(i.steps))for(let l of i.steps){if(l===null||typeof l!="object")continue;let d=l;if(typeof d.id!="string"||d.id.length===0)continue;let c=typeof d.name=="string"&&d.name.length>0?d.name:d.id,u=typeof d.estimated_duration_ms=="number"&&Number.isFinite(d.estimated_duration_ms)&&d.estimated_duration_ms>=0?d.estimated_duration_ms:void 0;a.set(d.id,u===void 0?{name:c}:{name:c,estimated_duration_ms:u})}if(i.steps===void 0&&i.states!==null&&typeof i.states=="object")for(let[l,d]of Object.entries(i.states)){if(d===null||typeof d!="object")continue;let c=d,u=typeof c.estimated_duration_ms=="number"&&Number.isFinite(c.estimated_duration_ms)&&c.estimated_duration_ms>=0?c.estimated_duration_ms:void 0;a.set(l,u===void 0?{name:l}:{name:l,estimated_duration_ms:u})}return{totalEstimatedMs:o,perStep:a}}function OD(t,e){try{return t.listStepsForRun(e)}catch{return[]}}function $D(t,e,r,n,s){if(t===null||t.terminal_state!==null)return;let i=e!==null?e:t.current_state;if(i===null||i.length===0)return;let a=[...r].reverse().find(m=>m.state_name===i&&m.ended_at===null)?.started_at??t.paused_at??t.started_at,l=n.get(i),d=l?.name??i,c=KE(a),u={id:i,name:d,started_at:a,elapsed_ms:c};return l?.estimated_duration_ms!==void 0&&(u.estimated_duration_ms=l.estimated_duration_ms),s.length>0&&(u.attention_needed=s),u}function CD(t,e){let r=[];for(let n of t){if(n.ended_at===null)continue;let s=Date.parse(n.started_at),i=Date.parse(n.ended_at),o=Number.isFinite(s)&&Number.isFinite(i)?Math.max(0,i-s):0,a=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:o,status:l})}return r}function MD(t,e,r,n,s,i){let o={completed_steps:e,total_elapsed_ms:n};return t!==void 0&&(o.current_step=t),r!==void 0&&(o.total_estimated_ms=r),s!==void 0&&s.length>0&&(o.workflow_name=s),i!==void 0&&(o.total_steps=i),o}function KE(t){let e=Date.parse(t);return Number.isNaN(e)?0:Math.max(0,Date.now()-e)}function sa(t,e){return t===void 0?{elapsed_ms:e}:{elapsed_ms:e,estimated_duration_ms:t}}function DD(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 jD(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 PD(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 UD(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 ia,On,ED,$n,mu,wD,YE=E(()=>{"use strict";ia="project:",On="web_project:",ED="prompt:",$n="default",mu="Default workspace",wD=new Date(0).toISOString()});import{Buffer as zE}from"node:buffer";function ZE(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 QE(t){return BD[t]}function ew(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 WD,qD,aa,BD,pu=E(()=>{"use strict";WD=1e4,qD=256*1024,aa=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=ZE(e.pushWindowMs,process.env.LMCTL_TERMINAL_PUSH_WINDOW_MS,WD),this.pushByteCap=ZE(e.pushByteCap,process.env.LMCTL_TERMINAL_PUSH_BYTE_CAP,qD),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+=zE.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=${zE.byteLength(n,"utf8")}`)}catch(i){this.opts.log?.(`[dt-2] publish failed session=${e.session_id} reason=${r}: ${i instanceof Error?i.message:String(i)}`)}}async onPtyExit(e,r){if(e.closed)return;await this.flush(e,"pty_exit");let n=`\r
2228
2228
  [process exited with code ${r.exitCode}${r.signal!==void 0?` signal ${r.signal}`:""}]\r
2229
- `,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(i){this.opts.log?.(`[dt-2] publish (exit) failed session=${e.session_id}: ${i instanceof Error?i.message:String(i)}`)}e.closed=!0,this.sessions.delete(e.session_id)}};BD={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 rw(t,e){t.post("/mailbox/terminal/launch",r=>HD(r,e)),t.post("/mailbox/terminal/end/:session_id",r=>XD(r,e)),t.get("/mailbox/terminal/sessions",r=>JD(r,e))}async function HD(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"||!tw.test(s))return t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400);let i=n.provider;if(typeof i!="string"||i==="")return t.json({error:"bad_request",message:"provider is required"},400);let o;if(typeof n.command_line=="string"&&n.command_line.trim()!==""){if(o=ew(n.command_line),o===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=QE(i);if(a===void 0)return t.json({error:"no_default_for_provider",message:`no TERMINAL_LAUNCH_DEFAULTS entry for provider "${i}"`},400);o={cmd:a.cmd,args:[...a.args]}}try{let{pid:a}=r.startSession({session_id:s,command:o.cmd,args:o.args,...typeof n.cwd=="string"&&n.cwd!==""?{cwd:n.cwd}:{}});return t.json({session_id:s,pid:a,command:o.cmd,args:o.args},201)}catch(a){let l=a instanceof Error?a.message:String(a);return l.startsWith("terminal_session_already_exists")?t.json({error:"session_exists",message:l},409):t.json({error:"spawn_failed",message:l},500)}}function XD(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||!tw.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 JD(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 tw,nw=E(()=>{"use strict";_u();tw=/^[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 GD}from"node:buffer";function YD(t){try{return GD.byteLength(JSON.stringify(t),"utf8")}catch{return 256}}function sw(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 iw(t){return zD[t]}function ow(t){let e=t.trim();if(e==="")return;let r=[],n=0;for(;n<e.length;){let i=e[n];if(i===" "||i===" "){n+=1;continue}if(i==='"'){let a=n+1,l="";for(;a<e.length&&e[a]!=='"';)l+=e[a],a+=1;r.push(l),n=a+1;continue}let o=n;for(;o<e.length&&e[o]!==" "&&e[o]!==" ";)o+=1;r.push(e.slice(n,o)),n=o}if(r.length===0)return;let s=r.shift();if(!(s===void 0||s===""))return{cmd:s,args:r}}var VD,KD,la,zD,hu=E(()=>{"use strict";VD=2e3,KD=64*1024,la=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=sw(e.pushWindowMs,process.env.LMCTL_PROVIDER_PUSH_WINDOW_MS,VD),this.pushByteCap=sw(e.pushByteCap,process.env.LMCTL_PROVIDER_PUSH_BYTE_CAP,KD),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 i=await r.start(e,s);return n.child=i,this.wireChildExit(n,i),this.opts.log?.(`[dt-3] persistent session ${e.session_id} started provider=${e.provider} pid=${i.pid??"?"}`),{pid:i.pid}}catch(i){throw this.sessions.delete(e.session_id),i}}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 i=s instanceof Error?s.message:String(s);this.opts.log?.(`[dt-3] adapter.sendTurn failed session=${e.session_id}: ${i}`),this.appendEvent(r,{event_type:"error",payload:{message:`sendTurn failed: ${i}`}})}}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=YD(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(i){this.opts.log?.(`[dt-3] publish failed session=${e.session_id} reason=${r}: ${i instanceof Error?i.message:String(i)}`)}}wireChildExit(e,r){let n=e.generation;r.on("exit",(s,i)=>{n===e.generation&&(e.closed||(this.appendEvent(e,{event_type:"error",payload:{message:`provider child exited code=${s??"?"} signal=${i??""}; 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")))})}};zD={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 lw(t,e){t.post("/mailbox/chat/launch",r=>ZD(r,e)),t.post("/mailbox/chat/end/:session_id",r=>QD(r,e)),t.get("/mailbox/chat/sessions",r=>ej(r,e))}async function ZD(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"||!aw.test(s))return t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400);let i=n.provider;if(typeof i!="string"||i==="")return t.json({error:"bad_request",message:"provider is required"},400);let o;if(typeof n.command_line=="string"&&n.command_line.trim()!==""){if(o=ow(n.command_line),o===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=iw(i);if(a===void 0)return t.json({error:"no_default_for_provider",message:`no PERSISTENT_LAUNCH_DEFAULTS entry for provider "${i}"`},400);o={cmd:a.cmd,args:[...a.args]}}try{let{pid:a}=await r.startSession({session_id:s,provider:i,command:o.cmd,args:o.args,...typeof n.cwd=="string"&&n.cwd!==""?{cwd:n.cwd}:{}});return t.json({session_id:s,provider:i,pid:a,command:o.cmd,args:o.args},201)}catch(a){let l=a instanceof Error?a.message:String(a);return l.startsWith("persistent_session_already_exists")?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 QD(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||!aw.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 ej(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 aw,dw=E(()=>{"use strict";hu();aw=/^[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 tj}from"node:fs";function uw(t){let e=t.artifacts.find(r=>r.kind===`${t.state_name}_transcript`);if(e?.content!==void 0&&e.content!==null)return cw(e.content);if(e?.path===void 0||e.path===null)return[];try{let r=tj(e.path,{encoding:"utf8"});return cw(r)}catch{return[]}}function cw(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 mw=E(()=>{"use strict"});function fw(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 o=t.listTeamMembers(n.team_id).filter(l=>l.state!=="retired"&&l.sessionid!==null&&l.sessionid.length>0);if(o.length===0)return{err:`run ${e}: cannot resolve an agent session (no agent_call yet, no seeded member)`};if(o.length>1){let l=o.map(d=>d.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=o[0];return{ok:{provider:a.provider,sessionid:a.sessionid,sessiondir:a.sessiondir,alias:a.alias,...a.model!==null&&a.model!==void 0?{model:a.model}:{}}}}function da(t,e){let r=t.query(`SELECT id, kind FROM attention
2229
+ `,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(i){this.opts.log?.(`[dt-2] publish (exit) failed session=${e.session_id}: ${i instanceof Error?i.message:String(i)}`)}e.closed=!0,this.sessions.delete(e.session_id)}};BD={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 rw(t,e){t.post("/mailbox/terminal/launch",r=>HD(r,e)),t.post("/mailbox/terminal/end/:session_id",r=>XD(r,e)),t.get("/mailbox/terminal/sessions",r=>JD(r,e))}async function HD(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"||!tw.test(s))return t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400);let i=n.provider;if(typeof i!="string"||i==="")return t.json({error:"bad_request",message:"provider is required"},400);let o;if(typeof n.command_line=="string"&&n.command_line.trim()!==""){if(o=ew(n.command_line),o===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=QE(i);if(a===void 0)return t.json({error:"no_default_for_provider",message:`no TERMINAL_LAUNCH_DEFAULTS entry for provider "${i}"`},400);o={cmd:a.cmd,args:[...a.args]}}try{let{pid:a}=r.startSession({session_id:s,command:o.cmd,args:o.args,...typeof n.cwd=="string"&&n.cwd!==""?{cwd:n.cwd}:{}});return t.json({session_id:s,pid:a,command:o.cmd,args:o.args},201)}catch(a){let l=a instanceof Error?a.message:String(a);return l.startsWith("terminal_session_already_exists")?t.json({error:"session_exists",message:l},409):t.json({error:"spawn_failed",message:l},500)}}function XD(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||!tw.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 JD(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 tw,nw=E(()=>{"use strict";pu();tw=/^[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 GD}from"node:buffer";function YD(t){try{return GD.byteLength(JSON.stringify(t),"utf8")}catch{return 256}}function sw(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 iw(t){return zD[t]}function ow(t){let e=t.trim();if(e==="")return;let r=[],n=0;for(;n<e.length;){let i=e[n];if(i===" "||i===" "){n+=1;continue}if(i==='"'){let a=n+1,l="";for(;a<e.length&&e[a]!=='"';)l+=e[a],a+=1;r.push(l),n=a+1;continue}let o=n;for(;o<e.length&&e[o]!==" "&&e[o]!==" ";)o+=1;r.push(e.slice(n,o)),n=o}if(r.length===0)return;let s=r.shift();if(!(s===void 0||s===""))return{cmd:s,args:r}}var VD,KD,la,zD,_u=E(()=>{"use strict";VD=2e3,KD=64*1024,la=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=sw(e.pushWindowMs,process.env.LMCTL_PROVIDER_PUSH_WINDOW_MS,VD),this.pushByteCap=sw(e.pushByteCap,process.env.LMCTL_PROVIDER_PUSH_BYTE_CAP,KD),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 i=await r.start(e,s);return n.child=i,this.wireChildExit(n,i),this.opts.log?.(`[dt-3] persistent session ${e.session_id} started provider=${e.provider} pid=${i.pid??"?"}`),{pid:i.pid}}catch(i){throw this.sessions.delete(e.session_id),i}}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 i=s instanceof Error?s.message:String(s);this.opts.log?.(`[dt-3] adapter.sendTurn failed session=${e.session_id}: ${i}`),this.appendEvent(r,{event_type:"error",payload:{message:`sendTurn failed: ${i}`}})}}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=YD(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(i){this.opts.log?.(`[dt-3] publish failed session=${e.session_id} reason=${r}: ${i instanceof Error?i.message:String(i)}`)}}wireChildExit(e,r){let n=e.generation;r.on("exit",(s,i)=>{n===e.generation&&(e.closed||(this.appendEvent(e,{event_type:"error",payload:{message:`provider child exited code=${s??"?"} signal=${i??""}; 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")))})}};zD={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 lw(t,e){t.post("/mailbox/chat/launch",r=>ZD(r,e)),t.post("/mailbox/chat/end/:session_id",r=>QD(r,e)),t.get("/mailbox/chat/sessions",r=>ej(r,e))}async function ZD(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"||!aw.test(s))return t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400);let i=n.provider;if(typeof i!="string"||i==="")return t.json({error:"bad_request",message:"provider is required"},400);let o;if(typeof n.command_line=="string"&&n.command_line.trim()!==""){if(o=ow(n.command_line),o===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=iw(i);if(a===void 0)return t.json({error:"no_default_for_provider",message:`no PERSISTENT_LAUNCH_DEFAULTS entry for provider "${i}"`},400);o={cmd:a.cmd,args:[...a.args]}}try{let{pid:a}=await r.startSession({session_id:s,provider:i,command:o.cmd,args:o.args,...typeof n.cwd=="string"&&n.cwd!==""?{cwd:n.cwd}:{}});return t.json({session_id:s,provider:i,pid:a,command:o.cmd,args:o.args},201)}catch(a){let l=a instanceof Error?a.message:String(a);return l.startsWith("persistent_session_already_exists")?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 QD(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||!aw.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 ej(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 aw,dw=E(()=>{"use strict";_u();aw=/^[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 tj}from"node:fs";function uw(t){let e=t.artifacts.find(r=>r.kind===`${t.state_name}_transcript`);if(e?.content!==void 0&&e.content!==null)return cw(e.content);if(e?.path===void 0||e.path===null)return[];try{let r=tj(e.path,{encoding:"utf8"});return cw(r)}catch{return[]}}function cw(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 mw=E(()=>{"use strict"});function fw(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 o=t.listTeamMembers(n.team_id).filter(l=>l.state!=="retired"&&l.sessionid!==null&&l.sessionid.length>0);if(o.length===0)return{err:`run ${e}: cannot resolve an agent session (no agent_call yet, no seeded member)`};if(o.length>1){let l=o.map(d=>d.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=o[0];return{ok:{provider:a.provider,sessionid:a.sessionid,sessiondir:a.sessiondir,alias:a.alias,...a.model!==null&&a.model!==void 0?{model:a.model}:{}}}}function da(t,e){let r=t.query(`SELECT id, kind FROM attention
2230
2230
  WHERE run_id = ?
2231
2231
  AND acknowledged_at IS NULL
2232
2232
  AND requires_user = 1
2233
- ORDER BY id DESC LIMIT 1`,e);return r.length===0?null:{kind:r[0].kind,attention_id:r[0].id}}var ca=E(()=>{"use strict"});function Sw(t,e){t.all("/runtime/*",r=>rj(r.req.raw,e))}async function rj(t,e){try{return Response.json(await nj(t,e))}catch(r){if(r instanceof ae)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 nj(t,e){let r=new URL(t.url),n=cj(e),s=r.pathname.split("/").filter(Boolean).map(decodeURIComponent);if(t.method==="GET"&&r.pathname==="/runtime/workspaces")return gu(t),[{id:n.id,name:n.name}];if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="workspaces")return ua(t,n.id,s[2]),sj(e.dal,n);if(t.method==="GET"&&s.length===5&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"){ua(t,n.id,s[2]);let i=_w(e.dal,s[4]);return pw(e.dal,n,i)}if(t.method==="GET"&&r.pathname==="/runtime/lead-teams")return gu(t),e.dal.listTeams().map(i=>dj(i));if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="chat"){let i=hw(e.dal,gw(s[2])),o=await t.json();if(o.teamId!==`team:${i.name}`)throw new ae(400,"runtime lead chat body does not match route team");return Ew(t,n.id,o.context),yw(i,o.context)}if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="messages"){let i=hw(e.dal,gw(s[2])),o=await t.json();if(o.teamId!==`team:${i.name}`)throw new ae(400,"runtime lead message body does not match route team");Ew(t,n.id,o.context);let a=o.draft?.body;if(typeof a!="string"||a.length===0)throw new ae(400,"runtime lead message requires draft.body");return yw(i,o.context,a)}if(t.method==="POST"&&s.length===6&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"&&s[5]==="workflow-message"){ua(t,n.id,s[2]);let i=_w(e.dal,s[4]),o=await t.json();if(o.workspaceId!==n.id||o.projectId!==i.name)throw new ae(400,"runtime request body does not match route workspace/project");let a=o.draft?.body;if(typeof a!="string"||a.length===0)throw new ae(400,"runtime workflow message requires draft.body");return aj(e.dal,i,a),pw(e.dal,n,i)}if(t.method==="GET"&&r.pathname==="/runtime/templates")return Ws(t,n.id),e.dal.listWorkflows().map(i=>uj(i));if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="templates"){Ws(t,n.id);let i=fj(e.dal,s[2]);return mj(i)}if(t.method==="GET"&&r.pathname==="/runtime/runs"){Ws(t,n.id);let i=r.searchParams.get("project"),o=r.searchParams.get("template");if(i!==null&&o!==null)throw new ae(400,"conflicting_filters: ?project= and ?template= are mutually exclusive");return pj(e.dal,i,o).map(l=>Tw(e.dal,l))}if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="runs"){Ws(t,n.id);let i=ww(e.dal,s[2]);return Tw(e.dal,i)}if(t.method==="GET"&&s.length===4&&s[0]==="runtime"&&s[1]==="runs"&&s[3]==="events"){Ws(t,n.id);let i=ww(e.dal,s[2]),o=hj(e.dal,i);return{runId:vu(i),events:o,...o.length>0?{cursor:o[o.length-1].id}:{}}}throw new ae(404,`unknown runtime request: ${t.method} ${r.pathname}`)}function sj(t,e){return{id:e.id,name:e.name,projects:t.listProjects().map(r=>bw(t,e,r))}}function pw(t,e,r){let n=bw(t,e,r);return{...n,managedWorkflow:{...n.managedWorkflow,instance:ij(t,r),composerTarget:{kind:"workflow-initial",label:`Project Workflow: ${r.workflow_name}`,templateId:`template:${r.workflow_name}`,runId:n.managedWorkflow.runId}},workflowMessages:oj(t,r)}}function bw(t,e,r){let n=kw(t,r.id),s=Eu(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 ij(t,e){let r=kw(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:Eu(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 oj(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 aj(t,e,r){let n=lj(t,e.id);if(n!==null){let s=da(t,n.id);if(s?.kind==="workflow_escalation"){let i=t.resumeEscalation(s.attention_id,r);if(!i.resumed)throw new ae(409,`workflow escalation resume failed: ${i.reason}`);return}if(s?.kind==="interactive_waiting_operator"){let i=Ot(t,s.attention_id);if(i?.step_id===null||i?.step_id===void 0)throw new ae(409,"interactive resume failed: missing step");let o=t.resumeInteractive(i.step_id,r,!0);if(!o.resumed)throw new ae(409,`interactive resume failed: ${o.reason}`);return}}t.enqueueJob({project_id:e.id,source:"runtime-workflow-message",payload:JSON.stringify({prompt:r}),priority:0})}function kw(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 lj(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 Eu(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 _w(t,e){let r=t.findProjectByName(e);if(r===null)throw new ae(404,`project not found: ${e}`);return r}function hw(t,e){let r=t.listTeams().find(n=>n.name===e);if(r===void 0)throw new ae(404,`team not found: ${e}`);return r}function gw(t){return t.startsWith("team:")?t.slice(5):t}function dj(t){return{id:`team:${t.name}`,name:t.name,teamfile:"",hasLead:!0,kind:t.name.toLowerCase().includes("manager")?"global-manager":"custom-ai-led"}}function yw(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??vw}`,teamId:`team:${t.name}`,title:`${t.name} Lead`,messages:s,...e===void 0?{}:{context:e}}}function cj(t){let e=t.workspaceName??"default";return{id:e,name:e}}function gu(t){if(t.headers.get("x-lmctl-workspace-id")!==vw)throw new ae(400,"runtime request requires global-admin workspace identity")}function ua(t,e,r){let n=t.headers.get("x-lmctl-workspace-id");if(n===null)throw new ae(400,"runtime request requires workspace identity");if(r!==e||n!==e)throw new ae(400,"runtime workspace identity does not match route")}function Ws(t,e){let r=t.headers.get("x-lmctl-workspace-id");if(r===null)throw new ae(400,"runtime request requires workspace identity");if(r!==e)throw new ae(400,"runtime workspace identity does not match server workspace")}function Ew(t,e,r){if(r?.scope==="workspace"){if(r.workspaceId===void 0)throw new ae(400,"workspace manager context requires workspace identity");ua(t,e,r.workspaceId);return}gu(t)}function wu(t){return`${Cn}${Tu(t.name)}`}function Tu(t){return t.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"item"}function vu(t){return`${yu}${t.id}`}function uj(t){let e=ma(t.definition);return{id:wu(t),name:t.name,...e.description===null?{}:{description:e.description}}}function mj(t){let e=ma(t.definition);return{id:wu(t),name:t.name,...e.description===null?{}:{description:e.description},graph:e.graph}}function ma(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=[],i=new Map;if(r.schema_version==="lmctl/v3"&&Array.isArray(r.steps)){let o=typeof r.entry_step_id=="string"?r.entry_step_id:null;for(let a of r.steps){let l=typeof a.id=="string"?a.id:null;l!==null&&(s.push(l),typeof a.name=="string"&&a.name.length>0&&i.set(a.name,l))}o!==null&&s.includes(o)&&s.sort((a,l)=>a===o?-1:l===o?1:0)}return{description:n,graph:e,stepIds:s,nameToId:i}}function fj(t,e){if(!e.startsWith(Cn))throw new ae(404,`template not found: ${e}`);let r=e.slice(Cn.length),n=t.listWorkflows().filter(s=>Tu(s.name)===r);if(n.length===0)throw new ae(404,`template not found: ${e}`);if(n.length>1){let s=n.map(i=>i.name).join(", ");throw new ae(409,`template_id_ambiguous: ${e} matches multiple workflow names [${s}]; rename to ensure unique slugs`)}return n[0]}function ww(t,e){if(!e.startsWith(yu))throw new ae(404,`run not found: ${e}`);let r=e.slice(yu.length);if(!/^[1-9]\d*$/.test(r))throw new ae(404,`run not found: ${e}`);let n=Number.parseInt(r,10);if(!Number.isFinite(n)||n<=0||String(n)!==r)throw new ae(404,`run not found: ${e}`);let s=t.getRun(n);if(s===null)throw new ae(404,`run not found: ${e}`);return s}function pj(t,e,r){if(r!==null){if(!r.startsWith(Cn))return[];let s=r.slice(Cn.length),i=t.listWorkflows().filter(a=>Tu(a.name)===s).map(a=>a.id);if(i.length===0)return[];let o=i.map(()=>"?").join(", ");return t.query(`SELECT * FROM run WHERE workflow_id IN (${o}) ORDER BY id DESC LIMIT 200`,...i)}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 Tw(t,e){let r=t.getWorkflow(e.workflow_id),n=Eu(e),s=_j(r,e);return{id:vu(e),templateId:r===null?`${Cn}unknown`:wu(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 _j(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]:[ma(t.definition).nameToId.get(r)??r]}function hj(t,e){let r=t.getWorkflow(e.workflow_id),n=r===null?{stepIds:[],nameToId:new Map}:ma(r.definition),s=d=>n.nameToId.get(d)??d,i=vu(e),o=[];o.push({timestamp:e.started_at,type:"run.started",message:"Run started"});let a=t.listStepsForRun(e.id);for(let d of a){let c=s(d.state_name);if(o.push({timestamp:d.started_at,type:"step.started",stepId:c,message:`step ${d.state_name} started`}),d.ended_at!==null){let u=gj(d);o.push({timestamp:d.ended_at,type:u,stepId:c,...d.outcome===null?{}:{message:d.outcome},...d.status_detail===null?{}:{payload:{status_detail:d.status_detail}}})}else e.paused_at!==null&&d.id===a[a.length-1]?.id&&o.push({timestamp:e.paused_at,type:"step.paused",stepId:c})}let l=t.listSessionEvents(e.id);for(let d of l){let c=d.step_id===null?void 0:(()=>{let f=a.find(p=>p.id===d.step_id);return f===void 0?void 0:s(f.state_name)})(),u=new Date(d.timestamp_ms).toISOString(),m={kind:d.kind,session_event_id:d.id};if(d.payload.length>0)try{let f=JSON.parse(d.payload);f!==null&&typeof f=="object"&&!Array.isArray(f)&&(m={...m,...f})}catch{}o.push({timestamp:u,type:"message",...c===void 0?{}:{stepId:c},payload:m})}if(e.terminal_state!==null){let d=e.terminal_state==="done"||e.terminal_state==="success"?"run.completed":e.terminal_state==="cancelled"||e.terminal_state==="aborted"?"run.cancelled":"run.failed";o.push({timestamp:e.ended_at??e.started_at,type:d,message:e.terminal_state})}return o.sort((d,c)=>d.timestamp.localeCompare(c.timestamp)),o.map((d,c)=>({id:`${i}:evt:${c+1}`,runId:i,sequence:c+1,timestamp:d.timestamp,type:d.type,...d.stepId===void 0?{}:{stepId:d.stepId},...d.message===void 0?{}:{message:d.message},...d.payload===void 0?{}:{payload:d.payload}}))}function gj(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 vw,Cn,yu,ae,Iw=E(()=>{"use strict";ca();Vt();vw="global-admin";Cn="template:",yu="run:";ae=class extends Error{status;constructor(e,r){super(r),this.status=e}}});import{mkdirSync as yj,writeFileSync as Ej}from"node:fs";import{randomUUID as Nw}from"node:crypto";import{dirname as wj,resolve as fa,sep as Aw}from"node:path";async function Rw(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(!kj(n))return t.text("missing image file",400);if(n.size>Tj)return t.text("upload too large",413);let s=Buffer.from(await n.arrayBuffer()),i=Ij(s);if(i===null||!(i in xw))return t.text("unsupported upload MIME type",415);if(n.type.length>0&&n.type!==i)return t.text("upload MIME type does not match file content",415);let o=vj(e,r.project);if(typeof o=="string")return t.text(o,404);let a=o===null?fa(bj()):fa(o.local_path),l=fa(a,"uploads",Nw()),d=fa(l,`${Nw()}${xw[i]}`);if(!Sj(d,a))return t.text("invalid upload path",400);yj(l,{recursive:!0});let c=new Uint8Array(s.buffer,s.byteOffset,s.byteLength);Ej(d,c);let u={path:d,size:s.byteLength,mime:i,project:o?.name??null};return t.json(u)}function vj(t,e){return e==null||e===""?null:typeof e!="string"?"invalid project":t.findProjectByName(e)??`project not found: ${e}`}function Sj(t,e){let r=e.endsWith(Aw)?e:`${e}${Aw}`;return t.startsWith(r)}function bj(){return wj(Q())}function kj(t){return typeof File<"u"&&t instanceof File}function Ij(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 Tj,xw,Lw=E(()=>{"use strict";Ye();Tj=10*1024*1024,xw={"image/png":".png","image/jpeg":".jpg","image/webp":".webp","image/heic":".heic","application/pdf":".pdf"}});import{existsSync as pa}from"node:fs";import{basename as Nj,dirname as Aj,extname as xj,isAbsolute as Rj,join as Lj,relative as Oj}from"node:path";import{fileURLToPath as $j}from"node:url";import{Hono as Cj}from"hono";import{serveStatic as Ct}from"@hono/node-server/serve-static";function Pw(t){let e=new Cj,r=[],n=t.localWebui!==void 0?bu(t.localWebui.webuiDir):Mj();if(t.localWebui!==void 0&&BE(e,{s3:t.localWebui.localMailbox.s3,commands:t.localWebui.localMailbox.commands}),n!==null){let s=Dj();t.localWebui!==void 0?e.get("/config.json",s,i=>i.json({workspaceFetchMode:"local-mailbox",localMailbox:{base:"/local-mailbox",userId:"local",deviceId:"local"},mailboxPolling:{readIntervalSeconds:1,heartbeatIdleSeconds:1,backoffReadIntervalSeconds:1}})):t.webuiRuntimeConfig!==void 0&&e.get("/config.json",s,i=>i.json(t.webuiRuntimeConfig)),e.use("/dist/*",s,Ct({root:n})),e.use("/vendor/*",s,Ct({root:n})),e.use("/src/*",s,Ct({root:n})),e.get("/",s,Ct({root:n,path:"index.html"})),e.get("/admin",s,Ct({root:n,path:"index.html"})),e.get("/admin/*",s,Ct({root:n,path:"index.html"})),e.get("/terminal",s,Ct({root:n,path:"index.html"})),e.get("/terminal/*",s,Ct({root:n,path:"index.html"})),e.get("/chat",s,Ct({root:n,path:"index.html"})),e.get("/chat/*",s,Ct({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("*",Eg({disabled:t.authDisabled})),e.get("/login",s=>s.html($e("Login",`
2233
+ ORDER BY id DESC LIMIT 1`,e);return r.length===0?null:{kind:r[0].kind,attention_id:r[0].id}}var ca=E(()=>{"use strict"});function Sw(t,e){t.all("/runtime/*",r=>rj(r.req.raw,e))}async function rj(t,e){try{return Response.json(await nj(t,e))}catch(r){if(r instanceof ae)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 nj(t,e){let r=new URL(t.url),n=cj(e),s=r.pathname.split("/").filter(Boolean).map(decodeURIComponent);if(t.method==="GET"&&r.pathname==="/runtime/workspaces")return hu(t),[{id:n.id,name:n.name}];if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="workspaces")return ua(t,n.id,s[2]),sj(e.dal,n);if(t.method==="GET"&&s.length===5&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"){ua(t,n.id,s[2]);let i=_w(e.dal,s[4]);return pw(e.dal,n,i)}if(t.method==="GET"&&r.pathname==="/runtime/lead-teams")return hu(t),e.dal.listTeams().map(i=>dj(i));if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="chat"){let i=hw(e.dal,gw(s[2])),o=await t.json();if(o.teamId!==`team:${i.name}`)throw new ae(400,"runtime lead chat body does not match route team");return Ew(t,n.id,o.context),yw(i,o.context)}if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="messages"){let i=hw(e.dal,gw(s[2])),o=await t.json();if(o.teamId!==`team:${i.name}`)throw new ae(400,"runtime lead message body does not match route team");Ew(t,n.id,o.context);let a=o.draft?.body;if(typeof a!="string"||a.length===0)throw new ae(400,"runtime lead message requires draft.body");return yw(i,o.context,a)}if(t.method==="POST"&&s.length===6&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"&&s[5]==="workflow-message"){ua(t,n.id,s[2]);let i=_w(e.dal,s[4]),o=await t.json();if(o.workspaceId!==n.id||o.projectId!==i.name)throw new ae(400,"runtime request body does not match route workspace/project");let a=o.draft?.body;if(typeof a!="string"||a.length===0)throw new ae(400,"runtime workflow message requires draft.body");return aj(e.dal,i,a),pw(e.dal,n,i)}if(t.method==="GET"&&r.pathname==="/runtime/templates")return Ws(t,n.id),e.dal.listWorkflows().map(i=>uj(i));if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="templates"){Ws(t,n.id);let i=fj(e.dal,s[2]);return mj(i)}if(t.method==="GET"&&r.pathname==="/runtime/runs"){Ws(t,n.id);let i=r.searchParams.get("project"),o=r.searchParams.get("template");if(i!==null&&o!==null)throw new ae(400,"conflicting_filters: ?project= and ?template= are mutually exclusive");return pj(e.dal,i,o).map(l=>Tw(e.dal,l))}if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="runs"){Ws(t,n.id);let i=ww(e.dal,s[2]);return Tw(e.dal,i)}if(t.method==="GET"&&s.length===4&&s[0]==="runtime"&&s[1]==="runs"&&s[3]==="events"){Ws(t,n.id);let i=ww(e.dal,s[2]),o=hj(e.dal,i);return{runId:Tu(i),events:o,...o.length>0?{cursor:o[o.length-1].id}:{}}}throw new ae(404,`unknown runtime request: ${t.method} ${r.pathname}`)}function sj(t,e){return{id:e.id,name:e.name,projects:t.listProjects().map(r=>bw(t,e,r))}}function pw(t,e,r){let n=bw(t,e,r);return{...n,managedWorkflow:{...n.managedWorkflow,instance:ij(t,r),composerTarget:{kind:"workflow-initial",label:`Project Workflow: ${r.workflow_name}`,templateId:`template:${r.workflow_name}`,runId:n.managedWorkflow.runId}},workflowMessages:oj(t,r)}}function bw(t,e,r){let n=kw(t,r.id),s=yu(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 ij(t,e){let r=kw(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:yu(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 oj(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 aj(t,e,r){let n=lj(t,e.id);if(n!==null){let s=da(t,n.id);if(s?.kind==="workflow_escalation"){let i=t.resumeEscalation(s.attention_id,r);if(!i.resumed)throw new ae(409,`workflow escalation resume failed: ${i.reason}`);return}if(s?.kind==="interactive_waiting_operator"){let i=Ot(t,s.attention_id);if(i?.step_id===null||i?.step_id===void 0)throw new ae(409,"interactive resume failed: missing step");let o=t.resumeInteractive(i.step_id,r,!0);if(!o.resumed)throw new ae(409,`interactive resume failed: ${o.reason}`);return}}t.enqueueJob({project_id:e.id,source:"runtime-workflow-message",payload:JSON.stringify({prompt:r}),priority:0})}function kw(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 lj(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 yu(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 _w(t,e){let r=t.findProjectByName(e);if(r===null)throw new ae(404,`project not found: ${e}`);return r}function hw(t,e){let r=t.listTeams().find(n=>n.name===e);if(r===void 0)throw new ae(404,`team not found: ${e}`);return r}function gw(t){return t.startsWith("team:")?t.slice(5):t}function dj(t){return{id:`team:${t.name}`,name:t.name,teamfile:"",hasLead:!0,kind:t.name.toLowerCase().includes("manager")?"global-manager":"custom-ai-led"}}function yw(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??vw}`,teamId:`team:${t.name}`,title:`${t.name} Lead`,messages:s,...e===void 0?{}:{context:e}}}function cj(t){let e=t.workspaceName??"default";return{id:e,name:e}}function hu(t){if(t.headers.get("x-lmctl-workspace-id")!==vw)throw new ae(400,"runtime request requires global-admin workspace identity")}function ua(t,e,r){let n=t.headers.get("x-lmctl-workspace-id");if(n===null)throw new ae(400,"runtime request requires workspace identity");if(r!==e||n!==e)throw new ae(400,"runtime workspace identity does not match route")}function Ws(t,e){let r=t.headers.get("x-lmctl-workspace-id");if(r===null)throw new ae(400,"runtime request requires workspace identity");if(r!==e)throw new ae(400,"runtime workspace identity does not match server workspace")}function Ew(t,e,r){if(r?.scope==="workspace"){if(r.workspaceId===void 0)throw new ae(400,"workspace manager context requires workspace identity");ua(t,e,r.workspaceId);return}hu(t)}function Eu(t){return`${Cn}${wu(t.name)}`}function wu(t){return t.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"item"}function Tu(t){return`${gu}${t.id}`}function uj(t){let e=ma(t.definition);return{id:Eu(t),name:t.name,...e.description===null?{}:{description:e.description}}}function mj(t){let e=ma(t.definition);return{id:Eu(t),name:t.name,...e.description===null?{}:{description:e.description},graph:e.graph}}function ma(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=[],i=new Map;if(r.schema_version==="lmctl/v3"&&Array.isArray(r.steps)){let o=typeof r.entry_step_id=="string"?r.entry_step_id:null;for(let a of r.steps){let l=typeof a.id=="string"?a.id:null;l!==null&&(s.push(l),typeof a.name=="string"&&a.name.length>0&&i.set(a.name,l))}o!==null&&s.includes(o)&&s.sort((a,l)=>a===o?-1:l===o?1:0)}return{description:n,graph:e,stepIds:s,nameToId:i}}function fj(t,e){if(!e.startsWith(Cn))throw new ae(404,`template not found: ${e}`);let r=e.slice(Cn.length),n=t.listWorkflows().filter(s=>wu(s.name)===r);if(n.length===0)throw new ae(404,`template not found: ${e}`);if(n.length>1){let s=n.map(i=>i.name).join(", ");throw new ae(409,`template_id_ambiguous: ${e} matches multiple workflow names [${s}]; rename to ensure unique slugs`)}return n[0]}function ww(t,e){if(!e.startsWith(gu))throw new ae(404,`run not found: ${e}`);let r=e.slice(gu.length);if(!/^[1-9]\d*$/.test(r))throw new ae(404,`run not found: ${e}`);let n=Number.parseInt(r,10);if(!Number.isFinite(n)||n<=0||String(n)!==r)throw new ae(404,`run not found: ${e}`);let s=t.getRun(n);if(s===null)throw new ae(404,`run not found: ${e}`);return s}function pj(t,e,r){if(r!==null){if(!r.startsWith(Cn))return[];let s=r.slice(Cn.length),i=t.listWorkflows().filter(a=>wu(a.name)===s).map(a=>a.id);if(i.length===0)return[];let o=i.map(()=>"?").join(", ");return t.query(`SELECT * FROM run WHERE workflow_id IN (${o}) ORDER BY id DESC LIMIT 200`,...i)}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 Tw(t,e){let r=t.getWorkflow(e.workflow_id),n=yu(e),s=_j(r,e);return{id:Tu(e),templateId:r===null?`${Cn}unknown`:Eu(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 _j(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]:[ma(t.definition).nameToId.get(r)??r]}function hj(t,e){let r=t.getWorkflow(e.workflow_id),n=r===null?{stepIds:[],nameToId:new Map}:ma(r.definition),s=d=>n.nameToId.get(d)??d,i=Tu(e),o=[];o.push({timestamp:e.started_at,type:"run.started",message:"Run started"});let a=t.listStepsForRun(e.id);for(let d of a){let c=s(d.state_name);if(o.push({timestamp:d.started_at,type:"step.started",stepId:c,message:`step ${d.state_name} started`}),d.ended_at!==null){let u=gj(d);o.push({timestamp:d.ended_at,type:u,stepId:c,...d.outcome===null?{}:{message:d.outcome},...d.status_detail===null?{}:{payload:{status_detail:d.status_detail}}})}else e.paused_at!==null&&d.id===a[a.length-1]?.id&&o.push({timestamp:e.paused_at,type:"step.paused",stepId:c})}let l=t.listSessionEvents(e.id);for(let d of l){let c=d.step_id===null?void 0:(()=>{let f=a.find(p=>p.id===d.step_id);return f===void 0?void 0:s(f.state_name)})(),u=new Date(d.timestamp_ms).toISOString(),m={kind:d.kind,session_event_id:d.id};if(d.payload.length>0)try{let f=JSON.parse(d.payload);f!==null&&typeof f=="object"&&!Array.isArray(f)&&(m={...m,...f})}catch{}o.push({timestamp:u,type:"message",...c===void 0?{}:{stepId:c},payload:m})}if(e.terminal_state!==null){let d=e.terminal_state==="done"||e.terminal_state==="success"?"run.completed":e.terminal_state==="cancelled"||e.terminal_state==="aborted"?"run.cancelled":"run.failed";o.push({timestamp:e.ended_at??e.started_at,type:d,message:e.terminal_state})}return o.sort((d,c)=>d.timestamp.localeCompare(c.timestamp)),o.map((d,c)=>({id:`${i}:evt:${c+1}`,runId:i,sequence:c+1,timestamp:d.timestamp,type:d.type,...d.stepId===void 0?{}:{stepId:d.stepId},...d.message===void 0?{}:{message:d.message},...d.payload===void 0?{}:{payload:d.payload}}))}function gj(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 vw,Cn,gu,ae,Iw=E(()=>{"use strict";ca();Vt();vw="global-admin";Cn="template:",gu="run:";ae=class extends Error{status;constructor(e,r){super(r),this.status=e}}});import{mkdirSync as yj,writeFileSync as Ej}from"node:fs";import{randomUUID as Nw}from"node:crypto";import{dirname as wj,resolve as fa,sep as Aw}from"node:path";async function Rw(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(!kj(n))return t.text("missing image file",400);if(n.size>Tj)return t.text("upload too large",413);let s=Buffer.from(await n.arrayBuffer()),i=Ij(s);if(i===null||!(i in xw))return t.text("unsupported upload MIME type",415);if(n.type.length>0&&n.type!==i)return t.text("upload MIME type does not match file content",415);let o=vj(e,r.project);if(typeof o=="string")return t.text(o,404);let a=o===null?fa(bj()):fa(o.local_path),l=fa(a,"uploads",Nw()),d=fa(l,`${Nw()}${xw[i]}`);if(!Sj(d,a))return t.text("invalid upload path",400);yj(l,{recursive:!0});let c=new Uint8Array(s.buffer,s.byteOffset,s.byteLength);Ej(d,c);let u={path:d,size:s.byteLength,mime:i,project:o?.name??null};return t.json(u)}function vj(t,e){return e==null||e===""?null:typeof e!="string"?"invalid project":t.findProjectByName(e)??`project not found: ${e}`}function Sj(t,e){let r=e.endsWith(Aw)?e:`${e}${Aw}`;return t.startsWith(r)}function bj(){return wj(Q())}function kj(t){return typeof File<"u"&&t instanceof File}function Ij(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 Tj,xw,Lw=E(()=>{"use strict";Ye();Tj=10*1024*1024,xw={"image/png":".png","image/jpeg":".jpg","image/webp":".webp","image/heic":".heic","application/pdf":".pdf"}});import{existsSync as pa}from"node:fs";import{basename as Nj,dirname as Aj,extname as xj,isAbsolute as Rj,join as Lj,relative as Oj}from"node:path";import{fileURLToPath as $j}from"node:url";import{Hono as Cj}from"hono";import{serveStatic as Ct}from"@hono/node-server/serve-static";function Pw(t){let e=new Cj,r=[],n=t.localWebui!==void 0?Su(t.localWebui.webuiDir):Mj();if(t.localWebui!==void 0&&BE(e,{s3:t.localWebui.localMailbox.s3,commands:t.localWebui.localMailbox.commands}),n!==null){let s=Dj();t.localWebui!==void 0?e.get("/config.json",s,i=>i.json({workspaceFetchMode:"local-mailbox",localMailbox:{base:"/local-mailbox",userId:"local",deviceId:"local"},mailboxPolling:{readIntervalSeconds:1,heartbeatIdleSeconds:1,backoffReadIntervalSeconds:1}})):t.webuiRuntimeConfig!==void 0&&e.get("/config.json",s,i=>i.json(t.webuiRuntimeConfig)),e.use("/dist/*",s,Ct({root:n})),e.use("/vendor/*",s,Ct({root:n})),e.use("/src/*",s,Ct({root:n})),e.get("/",s,Ct({root:n,path:"index.html"})),e.get("/admin",s,Ct({root:n,path:"index.html"})),e.get("/admin/*",s,Ct({root:n,path:"index.html"})),e.get("/terminal",s,Ct({root:n,path:"index.html"})),e.get("/terminal/*",s,Ct({root:n,path:"index.html"})),e.get("/chat",s,Ct({root:n,path:"index.html"})),e.get("/chat/*",s,Ct({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("*",Eg({disabled:t.authDisabled})),e.get("/login",s=>s.html($e("Login",`
2234
2234
  <h1>Login</h1>
2235
2235
  <form method="post" action="/login">
2236
2236
  <label>Token <input name="token" type="password"></label>
2237
2237
  <button type="submit">Login</button>
2238
2238
  </form>
2239
- `))),e.post("/login",async s=>{let i=await s.req.parseBody(),o=typeof i.token=="string"?i.token:"";return Tg(o)?(Ac(s,o),s.redirect("/",302)):s.html($e("Login","<p>Invalid token</p>"),401)}),e.post("/logout",s=>(vg(s),s.redirect("/login",302))),AE(e,{dal:t.dal}),Sw(e,{dal:t.dal}),XE(e,{dal:t.dal}),rw(e,{terminalSessionManager:t.terminalSessionManager}),lw(e,{persistentSessionManager:t.persistentSessionManager}),e.post("/api/teams/:team_name/refresh",async s=>{let i=vs(s.req.param("team_name")),o=t.dal.findTeamByName(i);if(o===null)return s.notFound();let a=[],d=t.dal.db.transaction(()=>{let m=t.dal.listTeamMembers(o.id),f=m.filter(p=>p.state!=="idle");if(f.length>0)return{ok:!1,nonIdle:f.map(p=>({alias:p.alias,state:p.state}))};for(let p of m)t.dal.setMemberState(p.id,"in_chat","refreshing");return a=m.map(p=>({id:p.id,alias:p.alias})),{ok:!0}})();if(!d.ok){let m=d.nonIdle.map(f=>`${f.alias}:${f.state}`).join(", ");return s.text(`refresh refused: non-idle members: ${m}`,409)}let c=[],u=[];for(let m of a)try{await Zd(t.dal,i,m.alias),t.dal.setMemberState(m.id,"idle",null),c.push(m.alias)}catch(f){let p=f instanceof Error?f.message:String(f);t.dal.setMemberState(m.id,"attention_needed",`refresh failed: ${p}`),u.push({alias:m.alias,error:p})}return P(s,{team:i,seeded:c,failed:u},m=>`<p>refreshed team ${S(m.team)}: seeded [${m.seeded.map(f=>S(f)).join(", ")}]${m.failed.length>0?` failed [${m.failed.map(f=>`${S(f.alias)}: ${S(f.error)}`).join(", ")}]`:""}</p>`)}),xg(e,{dal:t.dal}),Dg(e,{dal:t.dal}),e.get("/api/status",s=>P(s,no(t.dal),Bj)),e.get("/api/projects",s=>P(s,so(t.dal),Hj)),e.get("/api/teams",s=>P(s,Eh(t.dal),Gj)),e.get("/api/workflows",s=>P(s,io(t.dal),Vj)),e.get("/api/workflows/verify",s=>{let i=mE();return s.req.header("accept")?.includes("text/plain")?s.text(pE(i)):s.json(i)}),e.get("/api/jobs",s=>P(s,wh(t.dal,{status:s.req.query("status")}),Kj)),e.post("/api/uploads",s=>Rw(s,t.dal)),e.get("/api/jobs/:id",s=>{let i=oo(t.dal,ee(s,"id"));return i===null?s.notFound():P(s,i,fe)}),e.post("/api/jobs",async s=>{let i;try{i=await s.req.json()}catch{return s.text("invalid JSON body",400)}let o=null;if(typeof i.project_id=="number")o=i.project_id;else if(typeof i.project=="string"){let m=t.dal.findProjectByName(i.project);if(m===null)return s.text(`project not found: ${i.project}`,404);o=m.id}else{let m=t.dal.listProjects();m.length===1&&(o=m[0].id)}if(o===null)return s.text("missing project or project_id",400);let a=typeof i.workflow_id_override=="number"?i.workflow_id_override:null;if(a===null&&typeof i.workflow=="string"){let m=t.dal.getWorkflowByName(i.workflow);if(m===null)return s.text(`workflow not found: ${i.workflow}`,404);a=m.id}let l=typeof i.source=="string"?i.source:"manual",d=i.payload,c=d==null?null:typeof d=="string"?d:JSON.stringify(d),u=t.dal.enqueueJob({project_id:o,workflow_id_override:a,source:l,source_ref:typeof i.source_ref=="string"?i.source_ref:null,payload:c,priority:typeof i.priority=="number"?i.priority:0,dedupe_key:typeof i.dedupe_key=="string"?i.dedupe_key:null});return P(s,u,fe)}),e.post("/api/jobs/:id/run",async s=>{let{runJobById:i}=await Promise.resolve().then(()=>(Ko(),bE)),o=oo(t.dal,ee(s,"id"));if(o===null)return s.notFound();let a=await i({dal:t.dal,worker_id:`api-job-run-${process.pid}-${Date.now()}`,job_id:o.id});return a.claimed?s.json({job_id:a.job_id,run_id:a.run_id,status:a.status,terminal_state:a.terminal_state,ms:a.ms}):s.json(a,409)}),e.get("/api/workflows/:name",s=>{let i=t.dal.getWorkflowByName(s.req.param("name"));return i===null?s.notFound():P(s,i,fe)}),e.get("/api/projects/:name/workflows",s=>{let i=t.dal.findProjectByName(s.req.param("name"));return i===null?s.notFound():P(s,t.dal.listProjectWorkflows(i.id),Xj)}),e.post("/api/projects/:name/workflows",async s=>{let i=t.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=await Mn(s);if(typeof o=="string")return s.text(o,400);let a=typeof o.workflow=="string"?o.workflow:null,l=typeof o.workflow_id=="number"?o.workflow_id:null,d=l!==null?t.dal.getWorkflow(l):a!==null?t.dal.getWorkflowByName(a):null;if(d===null)return s.text("workflow not found",404);let c=typeof o.condition=="string"&&o.condition.length>0?o.condition:null;if(c!==null)try{Tn(c)}catch{return s.text("invalid condition",400)}let u=Fj(o.parameters_override??o.params);if(typeof u=="string"&&u.startsWith("error:"))return s.text(u.slice(6),400);let m=typeof o.priority=="number"&&Number.isInteger(o.priority)?o.priority:100,f=t.dal.insertProjectWorkflow({project_id:i.id,workflow_id:d.id,condition:c,parameters_override:u,priority:m});return P(s,f,fe)}),e.get("/api/projects/workflows/:id",s=>{let i=t.dal.getProjectWorkflow(ee(s,"id"));return i===null?s.notFound():P(s,i,fe)}),e.delete("/api/projects/workflows/:id",s=>t.dal.removeProjectWorkflow(ee(s,"id"))?P(s,{removed:!0},fe):s.notFound()),e.post("/api/projects/workflows/:id/enable",s=>{let i=t.dal.setProjectWorkflowEnabled(ee(s,"id"),!0);return i===null?s.notFound():P(s,i,fe)}),e.post("/api/projects/workflows/:id/disable",s=>{let i=t.dal.setProjectWorkflowEnabled(ee(s,"id"),!1);return i===null?s.notFound():P(s,i,fe)}),e.get("/api/projects/:name/issues",s=>{let i=t.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=$w(s.req.query("status"),Uj);if(typeof o=="string")return s.text(o,400);let a=$w(s.req.query("severity"),Uw);return typeof a=="string"?s.text(a,400):P(s,t.dal.listIssues(i.id,{...o!==void 0?{status:o}:{},...a!==void 0?{severity:a}:{},...s.req.query("ai_test_path")!==void 0?{ai_test_path:s.req.query("ai_test_path")}:{}}),Jj)}),e.post("/api/projects/:name/issues",async s=>{let i=t.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=await Mn(s);if(typeof o=="string")return s.text(o,400);let a=typeof o.title=="string"&&o.title.trim().length>0?o.title:null,l=typeof o.body=="string"?o.body:null;if(a===null||l===null)return s.text("missing title or body",400);let d=Wj(o.severity);if(typeof d=="object")return s.text(d.error,400);let c=qj(o.labels);if(typeof c=="string"&&c.startsWith("error:"))return s.text(c.slice(6),400);let u=t.dal.createIssue({project_id:i.id,title:a,body:l,...d!==void 0?{severity:d}:{},labels:c,ai_test_path:typeof o.ai_test_path=="string"?o.ai_test_path:null,source_run_id:typeof o.source_run_id=="number"?o.source_run_id:null});return P(s,u,fe)}),e.get("/api/issues/:id",s=>{let i=t.dal.getIssue(ee(s,"id"));return i===null?s.notFound():P(s,i,fe)}),e.post("/api/issues/:id/claim",async s=>{let i=ee(s,"id"),o=t.dal.getIssue(i);if(o===null)return s.notFound();let a=await Mn(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 d=t.dal.claimIssue(i,l);return d===null?s.json({error:`issue ${i} is not in a claimable state (status=${o.status})`},400):P(s,d,fe)}),e.post("/api/projects/:name/issues/claim-next",async s=>{let i=t.dal.findProjectByName(s.req.param("name"));if(i===null)return s.json({error:"project_not_found"},404);let o=await Mn(s);if(typeof o=="string")return s.json({error:o},400);let a=typeof o.assigned_run_id=="number"?o.assigned_run_id:null;if(a===null)return s.json({error:"missing assigned_run_id"},400);let l=t.dal.claimNextIssue(i.id,a);return l===null?s.json({status:"queue_empty"},404):P(s,l,fe)}),e.post("/api/issues/:id/close",async s=>{let i=t.dal.getIssue(ee(s,"id"));if(i===null)return s.notFound();let o=await Mn(s);if(typeof o=="string")return s.json({error:o},400);let a=typeof o.closed_run_id=="number"?o.closed_run_id:i.assigned_run_id;if(a===null)return s.json({error:"missing closed_run_id"},400);try{return P(s,t.dal.closeIssue(ee(s,"id"),a,typeof o.commit_hash=="string"?o.commit_hash:null),fe)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),e.post("/api/issues/:id/reopen",async s=>{let i=t.dal.getIssue(ee(s,"id"));if(i===null)return s.notFound();let o=await Mn(s);if(typeof o=="string")return s.json({error:o},400);let a=typeof o.source_run_id=="number"?o.source_run_id:i.closed_run_id??i.source_run_id;if(a===null)return s.json({error:"missing source_run_id"},400);try{return P(s,t.dal.reopenIssue(ee(s,"id"),a),fe)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),e.get("/api/projects/:name",s=>{let i=t.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=i.name.indexOf("/"),a=o>0?i.name.slice(0,o):null,l=o>0?i.name.slice(o+1):i.name;return P(s,{...i,owner:a,repo:l},fe)}),e.get("/api/runs/:run_id/artifacts",s=>{let i=ee(s,"run_id"),o=s.req.query("kind"),a=Pr(t.dal,i,o);return P(s,a,fe)}),e.get("/api/runs/:run_id/artifacts/:kind",async s=>{let i=ee(s,"run_id"),o=s.req.param("kind"),a=Pr(t.dal,i,o);if(a.length===0)return s.notFound();let l=a[a.length-1],d=s.req.query("raw")==="true";if(l.content!==null&&l.content!==void 0)return d?s.text(l.content):P(s,l,fe);if(l.path!==null&&l.path!==void 0){if(d)try{let{readFileSync:c}=await import("node:fs"),u=jj(l.path);if(Pj(u)){let h=c(l.path,"utf8");return s.body(h,200,{"Content-Type":u})}let m=c(l.path),f=m.buffer.slice(m.byteOffset,m.byteOffset+m.byteLength),p=Nj(l.path);return s.body(f,200,{"Content-Type":u,"Content-Disposition":`attachment; filename="${p}"`})}catch(c){return s.text(`failed to read artifact path: ${c.message}`,500)}return P(s,l,fe)}return P(s,l,fe)}),e.get("/api/runs",s=>P(s,En(t.dal,{limit:Su(s,"limit")??100}),Yj)),e.get("/api/runs/:id",s=>{let i=jr(t.dal,ee(s,"id"));return i===null?s.notFound():P(s,i,zj)}),e.get("/api/runs/:id/where",s=>{let i=wn(t.dal,ee(s,"id"));return i===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(lo(i)):s.json(i)}),e.get("/api/runs/:id/timeline",s=>{let i=co(t.dal,ee(s,"id"));return i===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(uo(i)):s.json(i)}),e.post("/api/runs/:id/resume",async s=>{let i=s.req.query("outcome");if(i===void 0||i.length===0){let a=s.req.header("content-type")??"";if(a.includes("application/x-www-form-urlencoded")||a.includes("multipart/form-data")){let d=(await s.req.parseBody().catch(()=>({}))).outcome;typeof d=="string"&&d.length>0&&(i=d)}}if(i===void 0||i.length===0)return s.text("missing outcome",400);let o=t.dal.resumeRun(ee(s,"id"),i);return!o.resumed&&o.reason==="run_not_found"?s.notFound():o.resumed?(_a(t.daemon),P(s,o,Cw)):P(s,o,Cw,400)}),e.post("/api/interactive/:step_id/respond",async s=>{let i=ee(s,"step_id"),o,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let c=await s.req.json();typeof c.input=="string"&&(o=c.input),c.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let c=await s.req.parseBody().catch(()=>({}));typeof c.input=="string"&&(o=c.input),(c.done==="true"||c.done===!0)&&(a=!0)}if(o===void 0)return s.text("missing input",400);let d=t.dal.resumeInteractive(i,o,a);return!d.resumed&&d.reason==="not_found"?s.notFound():d.resumed?(_a(t.daemon),s.json({resumed:!0,session_status:d.session.status})):s.json({resumed:!1,reason:d.reason},400)}),e.get("/api/runs/:id/steps/:step_id",s=>Ow(s,t.dal,i=>P(s,i,Qj))),e.get("/api/runs/:id/steps/:step_id/transcript",s=>{let i=bh(t.dal,ee(s,"id"),ee(s,"step_id"));return i===null?s.notFound():Fw(s)?s.html(`<pre>${S(i)}</pre>`):s.req.header("accept")?.includes("text/plain")?s.text(i):s.json({transcript:i})}),e.get("/api/runs/:id/steps/:step_id/messages",s=>Ow(s,t.dal,i=>{let o=uw(i);return P(s,o,a=>_e(["role","text"],a.map(l=>[S(l.role),S(l.text)])))})),e.get("/api/external-objects",s=>P(s,kh(t.dal,{type:s.req.query("type")}),eP)),e.get("/api/external-signals",s=>P(s,Ih(t.dal,{unhandled:s.req.query("unhandled")==="true"}),tP)),e.get("/api/attentions",s=>P(s,gr(t.dal,{unacked:s.req.query("unacked")==="true"}),rP)),e.post("/api/attentions/:id/ack",s=>{let i=t.dal.acknowledgeAttention(ee(s,"id"));return i===null?s.notFound():P(s,i,o=>`<p>acknowledged attention ${S(o.id)}</p>`)}),e.get("/api/escalations",s=>{let i=s.req.query("project"),o=s.req.query("all")==="true",a=s.req.query("since"),l={all:o};i!==void 0&&(l.project=i),a!==void 0&&(l.since=a);let d=ao(t.dal,l);return P(s,d,c=>`<h1>Escalations</h1>${_e(["attention_id","project","run","workflow","state","prompt"],c.map(u=>[S(u.attention_id),S(u.project),S(u.run_id),S(u.workflow_name),S(u.state_name),S((u.prompt??"").slice(0,120))]))}`)}),e.get("/api/escalations/:id",s=>{let i=Ot(t.dal,ee(s,"id"));return i===null?s.notFound():P(s,i,fe)}),e.post("/api/escalations/:id/respond",async s=>{let i=ee(s,"id"),o,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let f=await s.req.json();typeof f.input=="string"&&(o=f.input),f.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let f=await s.req.parseBody().catch(()=>({}));typeof f.input=="string"&&(o=f.input),(f.done==="true"||f.done===!0)&&(a=!0)}if(o===void 0)return s.text("missing input",400);let d=Ot(t.dal,i);if(d===null)return s.notFound();let c=gr(t.dal).find(f=>f.id===i);if(c===void 0)return s.notFound();if(c.kind==="workflow_escalation"){let f=t.dal.resumeEscalation(i,o);if(!f.resumed)return s.json({ok:!1,reason:f.reason},400);_a(t.daemon);let p=gr(t.dal).find(h=>h.id===i);return s.json({ok:!0,attention_id:i,run_id:f.run.id,decision:o,session_status:"escalation_resumed",acknowledged_at:p?.acknowledged_at??null})}if(c.kind!=="interactive_waiting_operator")return s.json({ok:!1,reason:"wrong_kind",kind:c.kind},400);if(c.acknowledged_at!==null)return s.json({ok:!1,reason:"already_acked"},400);if(d.step_id===null)return s.json({ok:!1,reason:"no_step"},400);let u=t.dal.resumeInteractive(d.step_id,o,a);if(!u.resumed)return s.json({ok:!1,reason:u.reason,step_id:d.step_id},400);let m=t.dal.acknowledgeAttention(i);return _a(t.daemon),s.json({ok:!0,attention_id:i,step_id:d.step_id,session_status:u.session.status,acknowledged_at:m?.acknowledged_at??null})}),e.get("/api/submitted-prs",s=>{let i=s.req.query("pr_url"),o=s.req.query("status"),a=Th(t.dal,{status:o,pr_url:i});return P(s,a,nP)}),e.get("/api/submitted-prs/:id",s=>{let i=ee(s,"id"),o=vh(t.dal,i);return o===null?s.notFound():P(s,o,sP)}),e.get("/api/sessions",s=>P(s,t.dal.latestSessionSizes(),Mw)),e.get("/api/sessions/:team_name/:alias/history",s=>{let i=vs(s.req.param("team_name"));return P(s,t.dal.sessionSizeHistory(i,s.req.param("alias")),Mw)}),e.post("/api/sessions/:team_name/:alias/compact",async s=>{let i=vs(s.req.param("team_name"));try{let o=await mh(t.dal,i,s.req.param("alias"));return P(s,o,a=>Dw("compacted",a.row))}catch(o){if(o instanceof Ts)return s.text(o.message,409);throw o}}),e.post("/api/sessions/:team_name/:alias/refresh",async s=>{let i=vs(s.req.param("team_name")),o=await Zd(t.dal,i,s.req.param("alias"));return P(s,o,a=>Dw(`refreshed ${a.sessionid}`,a.row))}),e.get("/api/intake/state",s=>P(s,r,jw)),e.post("/api/intake/scan",async s=>(r=await No(t.dal),P(s,r,jw))),e.get("/api/stats/run-throughput",s=>P(s,xh(t.dal),iP)),e.get("/api/daemon/state",s=>P(s,t.daemon?.state??null,oP)),e.post("/api/daemon/cycle",async s=>{if(t.daemon===void 0)return P(s,{disabled:!0},fe);let i=await t.daemon.runCycle();return P(s,{state:t.daemon.state,result:i},fe)}),e.get("/metrics/:project_id",s=>{let i=ee(s,"project_id"),o=t.dal.getProject(i);if(o===null)return s.notFound();let a=ic(t.dal,i),l=oc(t.dal,{project_id:i});return s.html($e(`Metrics \u2014 ${o.name}`,aP(o.name,a,l)))}),e.get("/api/metrics/reviewer/:project_id",s=>{let i=ee(s,"project_id");if(t.dal.getProject(i)===null)return s.notFound();let o=Su(s,"since_days");return s.json(ic(t.dal,i,o))}),e.get("/api/metrics/tools/:project_id",s=>{let i=ee(s,"project_id");if(t.dal.getProject(i)===null)return s.notFound();let o=Su(s,"since_days");return s.json(oc(t.dal,{project_id:i,since_days:o}))}),e.post("/api/drift/:id/ack",s=>{let i=t.dal.acknowledgeDriftSignal(ee(s,"id"));return i===null?s.notFound():s.json({id:i.id,acknowledged_at:i.acknowledged_at})}),e}function Ow(t,e,r){let n=sc(e,ee(t,"id"),ee(t,"step_id"));return n===null?t.notFound():r(n)}function _a(t){t!==void 0&&t.runCycle().catch(()=>{})}function P(t,e,r,n=200){return Fw(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 Fw(t){let e=t.req.header("accept")??"";return e.includes("text/html")&&!e.includes("application/json")}function Mj(){let t=process.env.LMCTL_WEBUI_DIST;if(t!==void 0)return pa(`${t}/index.html`)?bu(t):null;let e="src/serve/webui-dist";if(pa(`${e}/index.html`))return e;let r="dist/serve/webui-dist";if(pa(`${r}/index.html`))return r;let n=Lj(Aj($j(import.meta.url)),"webui-dist");return pa(`${n}/index.html`)?bu(n):null}function bu(t){if(!Rj(t))return t;let e=Oj(process.cwd(),t);return e.length===0?".":e}function Dj(){return async(t,e)=>{await e(),t.header("Cache-Control","no-store")}}function ee(t,e){return Number(t.req.param(e))}function Su(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 jj(t){switch(xj(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 Pj(t){return!!(t.startsWith("text/")||t.startsWith("application/json")||t.startsWith("application/xml"))}async function Mn(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 Fj(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 $w(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 Wj(t){if(t!=null)return typeof t=="string"&&Uw.includes(t)?t:{error:`invalid severity: ${String(t)}`}}function qj(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 Bj(t){return`<h1>Status</h1><div class="grid">
2239
+ `))),e.post("/login",async s=>{let i=await s.req.parseBody(),o=typeof i.token=="string"?i.token:"";return Tg(o)?(Nc(s,o),s.redirect("/",302)):s.html($e("Login","<p>Invalid token</p>"),401)}),e.post("/logout",s=>(vg(s),s.redirect("/login",302))),AE(e,{dal:t.dal}),Sw(e,{dal:t.dal}),XE(e,{dal:t.dal}),rw(e,{terminalSessionManager:t.terminalSessionManager}),lw(e,{persistentSessionManager:t.persistentSessionManager}),e.post("/api/teams/:team_name/refresh",async s=>{let i=vs(s.req.param("team_name")),o=t.dal.findTeamByName(i);if(o===null)return s.notFound();let a=[],d=t.dal.db.transaction(()=>{let m=t.dal.listTeamMembers(o.id),f=m.filter(p=>p.state!=="idle");if(f.length>0)return{ok:!1,nonIdle:f.map(p=>({alias:p.alias,state:p.state}))};for(let p of m)t.dal.setMemberState(p.id,"in_chat","refreshing");return a=m.map(p=>({id:p.id,alias:p.alias})),{ok:!0}})();if(!d.ok){let m=d.nonIdle.map(f=>`${f.alias}:${f.state}`).join(", ");return s.text(`refresh refused: non-idle members: ${m}`,409)}let c=[],u=[];for(let m of a)try{await zd(t.dal,i,m.alias),t.dal.setMemberState(m.id,"idle",null),c.push(m.alias)}catch(f){let p=f instanceof Error?f.message:String(f);t.dal.setMemberState(m.id,"attention_needed",`refresh failed: ${p}`),u.push({alias:m.alias,error:p})}return P(s,{team:i,seeded:c,failed:u},m=>`<p>refreshed team ${S(m.team)}: seeded [${m.seeded.map(f=>S(f)).join(", ")}]${m.failed.length>0?` failed [${m.failed.map(f=>`${S(f.alias)}: ${S(f.error)}`).join(", ")}]`:""}</p>`)}),xg(e,{dal:t.dal}),Dg(e,{dal:t.dal}),e.get("/api/status",s=>P(s,no(t.dal),Bj)),e.get("/api/projects",s=>P(s,so(t.dal),Hj)),e.get("/api/teams",s=>P(s,Eh(t.dal),Gj)),e.get("/api/workflows",s=>P(s,io(t.dal),Vj)),e.get("/api/workflows/verify",s=>{let i=mE();return s.req.header("accept")?.includes("text/plain")?s.text(pE(i)):s.json(i)}),e.get("/api/jobs",s=>P(s,wh(t.dal,{status:s.req.query("status")}),Kj)),e.post("/api/uploads",s=>Rw(s,t.dal)),e.get("/api/jobs/:id",s=>{let i=oo(t.dal,ee(s,"id"));return i===null?s.notFound():P(s,i,fe)}),e.post("/api/jobs",async s=>{let i;try{i=await s.req.json()}catch{return s.text("invalid JSON body",400)}let o=null;if(typeof i.project_id=="number")o=i.project_id;else if(typeof i.project=="string"){let m=t.dal.findProjectByName(i.project);if(m===null)return s.text(`project not found: ${i.project}`,404);o=m.id}else{let m=t.dal.listProjects();m.length===1&&(o=m[0].id)}if(o===null)return s.text("missing project or project_id",400);let a=typeof i.workflow_id_override=="number"?i.workflow_id_override:null;if(a===null&&typeof i.workflow=="string"){let m=t.dal.getWorkflowByName(i.workflow);if(m===null)return s.text(`workflow not found: ${i.workflow}`,404);a=m.id}let l=typeof i.source=="string"?i.source:"manual",d=i.payload,c=d==null?null:typeof d=="string"?d:JSON.stringify(d),u=t.dal.enqueueJob({project_id:o,workflow_id_override:a,source:l,source_ref:typeof i.source_ref=="string"?i.source_ref:null,payload:c,priority:typeof i.priority=="number"?i.priority:0,dedupe_key:typeof i.dedupe_key=="string"?i.dedupe_key:null});return P(s,u,fe)}),e.post("/api/jobs/:id/run",async s=>{let{runJobById:i}=await Promise.resolve().then(()=>(Ko(),bE)),o=oo(t.dal,ee(s,"id"));if(o===null)return s.notFound();let a=await i({dal:t.dal,worker_id:`api-job-run-${process.pid}-${Date.now()}`,job_id:o.id});return a.claimed?s.json({job_id:a.job_id,run_id:a.run_id,status:a.status,terminal_state:a.terminal_state,ms:a.ms}):s.json(a,409)}),e.get("/api/workflows/:name",s=>{let i=t.dal.getWorkflowByName(s.req.param("name"));return i===null?s.notFound():P(s,i,fe)}),e.get("/api/projects/:name/workflows",s=>{let i=t.dal.findProjectByName(s.req.param("name"));return i===null?s.notFound():P(s,t.dal.listProjectWorkflows(i.id),Xj)}),e.post("/api/projects/:name/workflows",async s=>{let i=t.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=await Mn(s);if(typeof o=="string")return s.text(o,400);let a=typeof o.workflow=="string"?o.workflow:null,l=typeof o.workflow_id=="number"?o.workflow_id:null,d=l!==null?t.dal.getWorkflow(l):a!==null?t.dal.getWorkflowByName(a):null;if(d===null)return s.text("workflow not found",404);let c=typeof o.condition=="string"&&o.condition.length>0?o.condition:null;if(c!==null)try{Tn(c)}catch{return s.text("invalid condition",400)}let u=Fj(o.parameters_override??o.params);if(typeof u=="string"&&u.startsWith("error:"))return s.text(u.slice(6),400);let m=typeof o.priority=="number"&&Number.isInteger(o.priority)?o.priority:100,f=t.dal.insertProjectWorkflow({project_id:i.id,workflow_id:d.id,condition:c,parameters_override:u,priority:m});return P(s,f,fe)}),e.get("/api/projects/workflows/:id",s=>{let i=t.dal.getProjectWorkflow(ee(s,"id"));return i===null?s.notFound():P(s,i,fe)}),e.delete("/api/projects/workflows/:id",s=>t.dal.removeProjectWorkflow(ee(s,"id"))?P(s,{removed:!0},fe):s.notFound()),e.post("/api/projects/workflows/:id/enable",s=>{let i=t.dal.setProjectWorkflowEnabled(ee(s,"id"),!0);return i===null?s.notFound():P(s,i,fe)}),e.post("/api/projects/workflows/:id/disable",s=>{let i=t.dal.setProjectWorkflowEnabled(ee(s,"id"),!1);return i===null?s.notFound():P(s,i,fe)}),e.get("/api/projects/:name/issues",s=>{let i=t.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=$w(s.req.query("status"),Uj);if(typeof o=="string")return s.text(o,400);let a=$w(s.req.query("severity"),Uw);return typeof a=="string"?s.text(a,400):P(s,t.dal.listIssues(i.id,{...o!==void 0?{status:o}:{},...a!==void 0?{severity:a}:{},...s.req.query("ai_test_path")!==void 0?{ai_test_path:s.req.query("ai_test_path")}:{}}),Jj)}),e.post("/api/projects/:name/issues",async s=>{let i=t.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=await Mn(s);if(typeof o=="string")return s.text(o,400);let a=typeof o.title=="string"&&o.title.trim().length>0?o.title:null,l=typeof o.body=="string"?o.body:null;if(a===null||l===null)return s.text("missing title or body",400);let d=Wj(o.severity);if(typeof d=="object")return s.text(d.error,400);let c=qj(o.labels);if(typeof c=="string"&&c.startsWith("error:"))return s.text(c.slice(6),400);let u=t.dal.createIssue({project_id:i.id,title:a,body:l,...d!==void 0?{severity:d}:{},labels:c,ai_test_path:typeof o.ai_test_path=="string"?o.ai_test_path:null,source_run_id:typeof o.source_run_id=="number"?o.source_run_id:null});return P(s,u,fe)}),e.get("/api/issues/:id",s=>{let i=t.dal.getIssue(ee(s,"id"));return i===null?s.notFound():P(s,i,fe)}),e.post("/api/issues/:id/claim",async s=>{let i=ee(s,"id"),o=t.dal.getIssue(i);if(o===null)return s.notFound();let a=await Mn(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 d=t.dal.claimIssue(i,l);return d===null?s.json({error:`issue ${i} is not in a claimable state (status=${o.status})`},400):P(s,d,fe)}),e.post("/api/projects/:name/issues/claim-next",async s=>{let i=t.dal.findProjectByName(s.req.param("name"));if(i===null)return s.json({error:"project_not_found"},404);let o=await Mn(s);if(typeof o=="string")return s.json({error:o},400);let a=typeof o.assigned_run_id=="number"?o.assigned_run_id:null;if(a===null)return s.json({error:"missing assigned_run_id"},400);let l=t.dal.claimNextIssue(i.id,a);return l===null?s.json({status:"queue_empty"},404):P(s,l,fe)}),e.post("/api/issues/:id/close",async s=>{let i=t.dal.getIssue(ee(s,"id"));if(i===null)return s.notFound();let o=await Mn(s);if(typeof o=="string")return s.json({error:o},400);let a=typeof o.closed_run_id=="number"?o.closed_run_id:i.assigned_run_id;if(a===null)return s.json({error:"missing closed_run_id"},400);try{return P(s,t.dal.closeIssue(ee(s,"id"),a,typeof o.commit_hash=="string"?o.commit_hash:null),fe)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),e.post("/api/issues/:id/reopen",async s=>{let i=t.dal.getIssue(ee(s,"id"));if(i===null)return s.notFound();let o=await Mn(s);if(typeof o=="string")return s.json({error:o},400);let a=typeof o.source_run_id=="number"?o.source_run_id:i.closed_run_id??i.source_run_id;if(a===null)return s.json({error:"missing source_run_id"},400);try{return P(s,t.dal.reopenIssue(ee(s,"id"),a),fe)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),e.get("/api/projects/:name",s=>{let i=t.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=i.name.indexOf("/"),a=o>0?i.name.slice(0,o):null,l=o>0?i.name.slice(o+1):i.name;return P(s,{...i,owner:a,repo:l},fe)}),e.get("/api/runs/:run_id/artifacts",s=>{let i=ee(s,"run_id"),o=s.req.query("kind"),a=Pr(t.dal,i,o);return P(s,a,fe)}),e.get("/api/runs/:run_id/artifacts/:kind",async s=>{let i=ee(s,"run_id"),o=s.req.param("kind"),a=Pr(t.dal,i,o);if(a.length===0)return s.notFound();let l=a[a.length-1],d=s.req.query("raw")==="true";if(l.content!==null&&l.content!==void 0)return d?s.text(l.content):P(s,l,fe);if(l.path!==null&&l.path!==void 0){if(d)try{let{readFileSync:c}=await import("node:fs"),u=jj(l.path);if(Pj(u)){let h=c(l.path,"utf8");return s.body(h,200,{"Content-Type":u})}let m=c(l.path),f=m.buffer.slice(m.byteOffset,m.byteOffset+m.byteLength),p=Nj(l.path);return s.body(f,200,{"Content-Type":u,"Content-Disposition":`attachment; filename="${p}"`})}catch(c){return s.text(`failed to read artifact path: ${c.message}`,500)}return P(s,l,fe)}return P(s,l,fe)}),e.get("/api/runs",s=>P(s,En(t.dal,{limit:vu(s,"limit")??100}),Yj)),e.get("/api/runs/:id",s=>{let i=jr(t.dal,ee(s,"id"));return i===null?s.notFound():P(s,i,zj)}),e.get("/api/runs/:id/where",s=>{let i=wn(t.dal,ee(s,"id"));return i===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(lo(i)):s.json(i)}),e.get("/api/runs/:id/timeline",s=>{let i=co(t.dal,ee(s,"id"));return i===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(uo(i)):s.json(i)}),e.post("/api/runs/:id/resume",async s=>{let i=s.req.query("outcome");if(i===void 0||i.length===0){let a=s.req.header("content-type")??"";if(a.includes("application/x-www-form-urlencoded")||a.includes("multipart/form-data")){let d=(await s.req.parseBody().catch(()=>({}))).outcome;typeof d=="string"&&d.length>0&&(i=d)}}if(i===void 0||i.length===0)return s.text("missing outcome",400);let o=t.dal.resumeRun(ee(s,"id"),i);return!o.resumed&&o.reason==="run_not_found"?s.notFound():o.resumed?(_a(t.daemon),P(s,o,Cw)):P(s,o,Cw,400)}),e.post("/api/interactive/:step_id/respond",async s=>{let i=ee(s,"step_id"),o,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let c=await s.req.json();typeof c.input=="string"&&(o=c.input),c.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let c=await s.req.parseBody().catch(()=>({}));typeof c.input=="string"&&(o=c.input),(c.done==="true"||c.done===!0)&&(a=!0)}if(o===void 0)return s.text("missing input",400);let d=t.dal.resumeInteractive(i,o,a);return!d.resumed&&d.reason==="not_found"?s.notFound():d.resumed?(_a(t.daemon),s.json({resumed:!0,session_status:d.session.status})):s.json({resumed:!1,reason:d.reason},400)}),e.get("/api/runs/:id/steps/:step_id",s=>Ow(s,t.dal,i=>P(s,i,Qj))),e.get("/api/runs/:id/steps/:step_id/transcript",s=>{let i=bh(t.dal,ee(s,"id"),ee(s,"step_id"));return i===null?s.notFound():Fw(s)?s.html(`<pre>${S(i)}</pre>`):s.req.header("accept")?.includes("text/plain")?s.text(i):s.json({transcript:i})}),e.get("/api/runs/:id/steps/:step_id/messages",s=>Ow(s,t.dal,i=>{let o=uw(i);return P(s,o,a=>_e(["role","text"],a.map(l=>[S(l.role),S(l.text)])))})),e.get("/api/external-objects",s=>P(s,kh(t.dal,{type:s.req.query("type")}),eP)),e.get("/api/external-signals",s=>P(s,Ih(t.dal,{unhandled:s.req.query("unhandled")==="true"}),tP)),e.get("/api/attentions",s=>P(s,gr(t.dal,{unacked:s.req.query("unacked")==="true"}),rP)),e.post("/api/attentions/:id/ack",s=>{let i=t.dal.acknowledgeAttention(ee(s,"id"));return i===null?s.notFound():P(s,i,o=>`<p>acknowledged attention ${S(o.id)}</p>`)}),e.get("/api/escalations",s=>{let i=s.req.query("project"),o=s.req.query("all")==="true",a=s.req.query("since"),l={all:o};i!==void 0&&(l.project=i),a!==void 0&&(l.since=a);let d=ao(t.dal,l);return P(s,d,c=>`<h1>Escalations</h1>${_e(["attention_id","project","run","workflow","state","prompt"],c.map(u=>[S(u.attention_id),S(u.project),S(u.run_id),S(u.workflow_name),S(u.state_name),S((u.prompt??"").slice(0,120))]))}`)}),e.get("/api/escalations/:id",s=>{let i=Ot(t.dal,ee(s,"id"));return i===null?s.notFound():P(s,i,fe)}),e.post("/api/escalations/:id/respond",async s=>{let i=ee(s,"id"),o,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let f=await s.req.json();typeof f.input=="string"&&(o=f.input),f.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let f=await s.req.parseBody().catch(()=>({}));typeof f.input=="string"&&(o=f.input),(f.done==="true"||f.done===!0)&&(a=!0)}if(o===void 0)return s.text("missing input",400);let d=Ot(t.dal,i);if(d===null)return s.notFound();let c=gr(t.dal).find(f=>f.id===i);if(c===void 0)return s.notFound();if(c.kind==="workflow_escalation"){let f=t.dal.resumeEscalation(i,o);if(!f.resumed)return s.json({ok:!1,reason:f.reason},400);_a(t.daemon);let p=gr(t.dal).find(h=>h.id===i);return s.json({ok:!0,attention_id:i,run_id:f.run.id,decision:o,session_status:"escalation_resumed",acknowledged_at:p?.acknowledged_at??null})}if(c.kind!=="interactive_waiting_operator")return s.json({ok:!1,reason:"wrong_kind",kind:c.kind},400);if(c.acknowledged_at!==null)return s.json({ok:!1,reason:"already_acked"},400);if(d.step_id===null)return s.json({ok:!1,reason:"no_step"},400);let u=t.dal.resumeInteractive(d.step_id,o,a);if(!u.resumed)return s.json({ok:!1,reason:u.reason,step_id:d.step_id},400);let m=t.dal.acknowledgeAttention(i);return _a(t.daemon),s.json({ok:!0,attention_id:i,step_id:d.step_id,session_status:u.session.status,acknowledged_at:m?.acknowledged_at??null})}),e.get("/api/submitted-prs",s=>{let i=s.req.query("pr_url"),o=s.req.query("status"),a=Th(t.dal,{status:o,pr_url:i});return P(s,a,nP)}),e.get("/api/submitted-prs/:id",s=>{let i=ee(s,"id"),o=vh(t.dal,i);return o===null?s.notFound():P(s,o,sP)}),e.get("/api/sessions",s=>P(s,t.dal.latestSessionSizes(),Mw)),e.get("/api/sessions/:team_name/:alias/history",s=>{let i=vs(s.req.param("team_name"));return P(s,t.dal.sessionSizeHistory(i,s.req.param("alias")),Mw)}),e.post("/api/sessions/:team_name/:alias/compact",async s=>{let i=vs(s.req.param("team_name"));try{let o=await mh(t.dal,i,s.req.param("alias"));return P(s,o,a=>Dw("compacted",a.row))}catch(o){if(o instanceof Ts)return s.text(o.message,409);throw o}}),e.post("/api/sessions/:team_name/:alias/refresh",async s=>{let i=vs(s.req.param("team_name")),o=await zd(t.dal,i,s.req.param("alias"));return P(s,o,a=>Dw(`refreshed ${a.sessionid}`,a.row))}),e.get("/api/intake/state",s=>P(s,r,jw)),e.post("/api/intake/scan",async s=>(r=await No(t.dal),P(s,r,jw))),e.get("/api/stats/run-throughput",s=>P(s,xh(t.dal),iP)),e.get("/api/daemon/state",s=>P(s,t.daemon?.state??null,oP)),e.post("/api/daemon/cycle",async s=>{if(t.daemon===void 0)return P(s,{disabled:!0},fe);let i=await t.daemon.runCycle();return P(s,{state:t.daemon.state,result:i},fe)}),e.get("/metrics/:project_id",s=>{let i=ee(s,"project_id"),o=t.dal.getProject(i);if(o===null)return s.notFound();let a=sc(t.dal,i),l=ic(t.dal,{project_id:i});return s.html($e(`Metrics \u2014 ${o.name}`,aP(o.name,a,l)))}),e.get("/api/metrics/reviewer/:project_id",s=>{let i=ee(s,"project_id");if(t.dal.getProject(i)===null)return s.notFound();let o=vu(s,"since_days");return s.json(sc(t.dal,i,o))}),e.get("/api/metrics/tools/:project_id",s=>{let i=ee(s,"project_id");if(t.dal.getProject(i)===null)return s.notFound();let o=vu(s,"since_days");return s.json(ic(t.dal,{project_id:i,since_days:o}))}),e.post("/api/drift/:id/ack",s=>{let i=t.dal.acknowledgeDriftSignal(ee(s,"id"));return i===null?s.notFound():s.json({id:i.id,acknowledged_at:i.acknowledged_at})}),e}function Ow(t,e,r){let n=nc(e,ee(t,"id"),ee(t,"step_id"));return n===null?t.notFound():r(n)}function _a(t){t!==void 0&&t.runCycle().catch(()=>{})}function P(t,e,r,n=200){return Fw(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 Fw(t){let e=t.req.header("accept")??"";return e.includes("text/html")&&!e.includes("application/json")}function Mj(){let t=process.env.LMCTL_WEBUI_DIST;if(t!==void 0)return pa(`${t}/index.html`)?Su(t):null;let e="src/serve/webui-dist";if(pa(`${e}/index.html`))return e;let r="dist/serve/webui-dist";if(pa(`${r}/index.html`))return r;let n=Lj(Aj($j(import.meta.url)),"webui-dist");return pa(`${n}/index.html`)?Su(n):null}function Su(t){if(!Rj(t))return t;let e=Oj(process.cwd(),t);return e.length===0?".":e}function Dj(){return async(t,e)=>{await e(),t.header("Cache-Control","no-store")}}function ee(t,e){return Number(t.req.param(e))}function vu(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 jj(t){switch(xj(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 Pj(t){return!!(t.startsWith("text/")||t.startsWith("application/json")||t.startsWith("application/xml"))}async function Mn(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 Fj(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 $w(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 Wj(t){if(t!=null)return typeof t=="string"&&Uw.includes(t)?t:{error:`invalid severity: ${String(t)}`}}function qj(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 Bj(t){return`<h1>Status</h1><div class="grid">
2240
2240
  <div class="metric"><strong>${t.jobs.queued}</strong><br>queued jobs</div>
2241
2241
  <div class="metric"><strong>${t.jobs.done}</strong><br>done jobs</div>
2242
2242
  <div class="metric"><strong>${t.runs.active}</strong><br>active runs</div>
@@ -2279,7 +2279,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
2279
2279
  <h2>Retry counts (runs with &gt;1 attempt per state)</h2>
2280
2280
  ${_e(["state","retried runs","avg attempts"],o)}
2281
2281
  <h2>Tool efficacy</h2>
2282
- ${_e(["tool","invocations","successes (status=ok)","hit rate","avg latency ms","p50 ms","p95 ms"],a)}`}var Uj,Uw,Ww=E(()=>{"use strict";bc();ks();bg();Rg();jg();Vt();Cc();DE();HE();YE();nw();dw();mw();Iw();Qi();Lw();Jo();Uj=["open","assigned","closed","reopened"],Uw=["low","medium","high","critical"]});function lP(t){return Math.floor(t/6e4)*6e4}function dP(t){t.db.transaction(()=>{let e=t.getRollupCursor(),r=t.listSessionEventsSince(e);if(r.length!==0){for(let n of r)cP(t,n);t.setRollupCursor(r[r.length-1].id)}})()}function cP(t,e){let r=Date.now(),n=lP(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 i={};try{i=JSON.parse(e.payload)}catch{}let o=typeof i.elapsedMs=="number"&&i.elapsedMs>0?i.elapsedMs:0;o>0&&t.addRollupValue({run_id:e.run_id,step_id:e.step_id,metric_kind:"time_in_tool_use_ms",value:o,bucket_start_ms:n,bucket_end_ms:s,updated_at:r});return}if(e.kind==="text"){let i=Buffer.byteLength(e.payload,"utf8");t.addRollupValue({run_id:e.run_id,step_id:e.step_id,metric_kind:"message_delta_bytes",value:i,bucket_start_ms:n,bucket_end_ms:s,updated_at:r})}}function qw(t,e=250){let r=setInterval(()=>{try{dP(t)}catch{}},e);return{stop(){clearInterval(r)}}}var Bw=E(()=>{"use strict"});function mP({dal:t}){let e=t.listProjects();for(let r of e){let n=t.query(`SELECT r.id, r.team_id
2282
+ ${_e(["tool","invocations","successes (status=ok)","hit rate","avg latency ms","p50 ms","p95 ms"],a)}`}var Uj,Uw,Ww=E(()=>{"use strict";Sc();ks();bg();Rg();jg();Vt();$c();DE();HE();YE();nw();dw();mw();Iw();Qi();Lw();Jo();Uj=["open","assigned","closed","reopened"],Uw=["low","medium","high","critical"]});function lP(t){return Math.floor(t/6e4)*6e4}function dP(t){t.db.transaction(()=>{let e=t.getRollupCursor(),r=t.listSessionEventsSince(e);if(r.length!==0){for(let n of r)cP(t,n);t.setRollupCursor(r[r.length-1].id)}})()}function cP(t,e){let r=Date.now(),n=lP(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 i={};try{i=JSON.parse(e.payload)}catch{}let o=typeof i.elapsedMs=="number"&&i.elapsedMs>0?i.elapsedMs:0;o>0&&t.addRollupValue({run_id:e.run_id,step_id:e.step_id,metric_kind:"time_in_tool_use_ms",value:o,bucket_start_ms:n,bucket_end_ms:s,updated_at:r});return}if(e.kind==="text"){let i=Buffer.byteLength(e.payload,"utf8");t.addRollupValue({run_id:e.run_id,step_id:e.step_id,metric_kind:"message_delta_bytes",value:i,bucket_start_ms:n,bucket_end_ms:s,updated_at:r})}}function qw(t,e=250){let r=setInterval(()=>{try{dP(t)}catch{}},e);return{stop(){clearInterval(r)}}}var Bw=E(()=>{"use strict"});function mP({dal:t}){let e=t.listProjects();for(let r of e){let n=t.query(`SELECT r.id, r.team_id
2283
2283
  FROM run r
2284
2284
  JOIN job j ON j.id = r.job_id
2285
2285
  WHERE j.project_id = ?
@@ -2298,42 +2298,42 @@ ${i.text}`;return er("mailbox_delivery_attempt_stalled",r,{stalled_after_ms:i.st
2298
2298
 
2299
2299
  `)}function zw(t){return t.sender_teamfile===null||t.sender_alias===null?"operator":Zw({teamfile:t.sender_teamfile,alias:t.sender_alias})}function Zw(t){return`${t.teamfile}:${t.alias}`}async function ha(t,e,r){if(e.length!==0)try{await O(t,n=>{n.markRelayRequestDelivered(e,r,new Date().toISOString())})}catch(n){let s=n instanceof Error?n.message:String(n);er("mailbox_delivery_finalize_failed",e,{error_message:s}),t.stderr.write(`warning: failed to mark queued mailbox mail delivered: ${s}
2300
2300
  `)}}async function Vw(t,e,r,n){if(e.length!==0)try{let s=await O(t,i=>e.map(o=>({row:o,cleared:i.reclaimMailboxDeliveryIfUnchanged(o)!==null})));for(let i of s)er(i.cleared?"mailbox_delivery_cleared":"mailbox_delivery_clear_skipped",[i.row],{transition:i.cleared?"delivering->pending":"delivering->delivering",reason:r,...n===void 0?{}:{error_message:n}})}catch(s){let i=s instanceof Error?s.message:String(s);er("mailbox_delivery_clear_failed",e,{reason:r,error_message:i,...n===void 0?{}:{causing_error:n}}),t.stderr.write(`warning: failed to clear queued mailbox delivery marker: ${i}
2301
- `)}}async function ya(t,e=process.env){try{await O(t,r=>{r.reclaimStaleMailboxDeliveries(new Date(Date.now()-ku(e)).toISOString())})}catch{}}function ku(t=process.env){let e=t.LMCTL_MAILBOX_DELIVERY_STALE_MS;if(e===void 0||e.trim()==="")return Gw;let r=Number(e);return!Number.isFinite(r)||r<=0?Gw:r}function er(t,e,r={}){let n=new Date().toISOString();for(let s of e)C({event:t,event_at:n,message_id:s.id,message_type:s.message_type,lane_key:JSON.stringify([s.sender_teamfile,s.sender_alias,s.receiver_teamfile,s.receiver_alias]),sender_teamfile:s.sender_teamfile,sender_alias:s.sender_alias,receiver_teamfile:s.receiver_teamfile,receiver_alias:s.receiver_alias,message_created_at:s.created_at,delivering_at:s.delivering_at,delivered_at:s.delivered_at,delivery_holder_pid:s.delivery_holder_pid,delivery_holder_host:s.delivery_holder_host,...r})}var Gw,Iu=E(()=>{"use strict";Lt();me();Ce();Gw=60*60*1e3});import{basename as hP}from"node:path";function tT(t,e){let r=new Date(e.now.getTime()-br()).toISOString(),n=sT(t,r).filter(f=>!f.sender.teamfile.startsWith("prompt:")),s=wP(e.sender,n),i=TP(e.sender,n);i!==null&&i.teamfile===e.root&&!eT(s[0],i)&&s.unshift({...i,at:null});let o={teamfile:e.receiverTeamfile,alias:e.receiverAlias,at:e.now.getTime()},a=[...s,o],l=s.filter(f=>eT(f,o)),d=l.map(f=>f.at).filter(f=>f!==null).sort((f,p)=>p-f)[0]??null,c=d!==null&&e.now.getTime()-d<gP,u=Nu(e.sender,n).length;return{stop:l.length>=1&&c&&u>=yP,chain:vP(a)}}function rT(t,e){let r=new Date(e.now.getTime()-br()).toISOString(),n=sT(t,r),s=Nu(e.sender,n);if(s.length===0)return null;let i=s[0];return i.sender.teamfile.startsWith("prompt:")?i.receiver.teamfile:i.sender.teamfile}function br(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return Qw;let r=Number(e);return!Number.isFinite(r)||r<=0?Qw:r}function nT(t){return`cross-team cycle detected (${t}); stopping to prevent a runaway loop.`}function EP(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 sT(t,e){return t.clearAgentInflightOlderThan(e),t.listAgentInflight().map(EP).filter(r=>Number.isFinite(r.at)&&new Date(r.at).toISOString()>=e).sort((r,n)=>r.at-n.at)}function wP(t,e,r={}){let n=new Map;for(let a of e)n.set(Xr(a.receiver),a);let s=[{...t,at:null}],i=t,o=new Set([Xr(t)]);for(let a=0;a<64;a+=1){let l=n.get(Xr(i));if(l===void 0)break;s[0]={...s[0],at:s[0].at??l.at};let d={...l.sender,at:l.at};if(l.sender.teamfile.startsWith("prompt:")&&r.includePromptSender!==!0)break;let c=Xr(l.sender);if(o.has(c))break;s.unshift(d),o.add(c),i=l.sender}return s}function Nu(t,e){let r=Xr(t),n=new Set([r]),s=[r],i=[];for(let o=0;s.length>0&&o<128;o+=1){let a=s.shift();for(let l of e){let d=Xr(l.sender),c=Xr(l.receiver);d!==a&&c!==a||(i.includes(l)||i.push(l),n.has(d)||(n.add(d),s.push(d)),n.has(c)||(n.add(c),s.push(c)))}}return i.sort((o,a)=>o.at-a.at)}function TP(t,e){let r=Nu(t,e);if(r.length===0)return null;let n=r[0];return n.sender.teamfile.startsWith("prompt:")?n.receiver:n.sender}function eT(t,e){return t.teamfile===e.teamfile&&t.alias===e.alias}function Xr(t){return`${t.teamfile}\0${t.alias}`}function vP(t){return t.map(e=>`${hP(e.teamfile)}:${e.alias}`).join(" \u2192 ")}var gP,yP,Qw,Ea=E(()=>{"use strict";gP=6e4,yP=2,Qw=8*60*60*1e3});function iT(t){if(t.length===0||!t.startsWith("---"))throw new Mt("frontmatter must start at line 1 with `---` on its own line");let e=t.split(`
2302
- `);if(e[0]!=="---")throw new Mt("frontmatter must start at line 1 with `---` on its own line");let r={},n=-1;for(let o=1;o<e.length;o++){let a=e[o];if(a==="---"){n=o;break}if(a.trim()==="")continue;let l=a.match(/^([a-zA-Z][a-zA-Z0-9_-]*)\s*:\s*(.*)$/);if(!l)throw new Mt(`malformed frontmatter line ${o+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let d=l[1],c=l[2].trim();if(!SP.has(d))throw new Mt(`unknown frontmatter key "${d}" \u2014 allowed keys: ${wa.join(", ")}`);r[d]=c}if(n===-1)throw new Mt("frontmatter not closed (missing trailing `---` on its own line)");for(let o of wa)if(r[o]===void 0)throw new Mt(`missing required frontmatter key "${o}" \u2014 required: ${wa.join(", ")}`);let s=0;for(let o=0;o<=n;o++)s+=e[o].length+1;s>t.length&&(s=t.length);let i=r.members.split(",").map(o=>o.trim()).filter(Boolean);return{title:r.title,description:r.description,members:i,bodyOffset:s}}var wa,SP,Mt,oT=E(()=>{"use strict";wa=["title","description","members"],SP=new Set(wa),Mt=class extends Error{constructor(e){super(e),this.name="FrontmatterError"}}});import{readFileSync as bP,writeFileSync as a6,renameSync as l6,existsSync as lT}from"node:fs";import{basename as kP,resolve as Dn,dirname as Au}from"node:path";function NP(t){let e={},r=/(\w+)=(?:"([^"]*)"|([\S]*))/g,n;for(;(n=r.exec(t))!==null;){let s=n[1],i=n[2]!==void 0?n[2]:n[3];e[s]=i}return e}function AP(t){return/^\s*_MEMBER_\s+\S/.test(t)}function xP(t){return/^\s*_SESSION_\s+\S/.test(t)}function RP(t){return/^\s*_SKILL_(?:\s|$)/.test(t)}function Ta(t){let e=kP(t);return e.endsWith(".lmctl")?e.slice(0,-6):e}function rt(t){let e=bP(t,"utf-8"),r=Au(Dn(t)),n=Ru(e,Ta(t),{baseDir:r,sourcePath:Dn(t)});for(let s of n.members)s.sessiondir&&!s.sessiondir.startsWith("/")&&(s.sessiondir=Dn(r,s.sessiondir));return n}function Ru(t,e,r={}){let n=[],s=[];r.sourcePath,r.baseDir;let i=t;if(i.startsWith("#teamfile:")){let l=i.indexOf(`
2301
+ `)}}async function ya(t,e=process.env){try{await O(t,r=>{r.reclaimStaleMailboxDeliveries(new Date(Date.now()-bu(e)).toISOString())})}catch{}}function bu(t=process.env){let e=t.LMCTL_MAILBOX_DELIVERY_STALE_MS;if(e===void 0||e.trim()==="")return Gw;let r=Number(e);return!Number.isFinite(r)||r<=0?Gw:r}function er(t,e,r={}){let n=new Date().toISOString();for(let s of e)C({event:t,event_at:n,message_id:s.id,message_type:s.message_type,lane_key:JSON.stringify([s.sender_teamfile,s.sender_alias,s.receiver_teamfile,s.receiver_alias]),sender_teamfile:s.sender_teamfile,sender_alias:s.sender_alias,receiver_teamfile:s.receiver_teamfile,receiver_alias:s.receiver_alias,message_created_at:s.created_at,delivering_at:s.delivering_at,delivered_at:s.delivered_at,delivery_holder_pid:s.delivery_holder_pid,delivery_holder_host:s.delivery_holder_host,...r})}var Gw,ku=E(()=>{"use strict";Lt();me();Ce();Gw=60*60*1e3});import{basename as hP}from"node:path";function tT(t,e){let r=new Date(e.now.getTime()-br()).toISOString(),n=sT(t,r).filter(f=>!f.sender.teamfile.startsWith("prompt:")),s=wP(e.sender,n),i=TP(e.sender,n);i!==null&&i.teamfile===e.root&&!eT(s[0],i)&&s.unshift({...i,at:null});let o={teamfile:e.receiverTeamfile,alias:e.receiverAlias,at:e.now.getTime()},a=[...s,o],l=s.filter(f=>eT(f,o)),d=l.map(f=>f.at).filter(f=>f!==null).sort((f,p)=>p-f)[0]??null,c=d!==null&&e.now.getTime()-d<gP,u=Iu(e.sender,n).length;return{stop:l.length>=1&&c&&u>=yP,chain:vP(a)}}function rT(t,e){let r=new Date(e.now.getTime()-br()).toISOString(),n=sT(t,r),s=Iu(e.sender,n);if(s.length===0)return null;let i=s[0];return i.sender.teamfile.startsWith("prompt:")?i.receiver.teamfile:i.sender.teamfile}function br(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return Qw;let r=Number(e);return!Number.isFinite(r)||r<=0?Qw:r}function nT(t){return`cross-team cycle detected (${t}); stopping to prevent a runaway loop.`}function EP(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 sT(t,e){return t.clearAgentInflightOlderThan(e),t.listAgentInflight().map(EP).filter(r=>Number.isFinite(r.at)&&new Date(r.at).toISOString()>=e).sort((r,n)=>r.at-n.at)}function wP(t,e,r={}){let n=new Map;for(let a of e)n.set(Xr(a.receiver),a);let s=[{...t,at:null}],i=t,o=new Set([Xr(t)]);for(let a=0;a<64;a+=1){let l=n.get(Xr(i));if(l===void 0)break;s[0]={...s[0],at:s[0].at??l.at};let d={...l.sender,at:l.at};if(l.sender.teamfile.startsWith("prompt:")&&r.includePromptSender!==!0)break;let c=Xr(l.sender);if(o.has(c))break;s.unshift(d),o.add(c),i=l.sender}return s}function Iu(t,e){let r=Xr(t),n=new Set([r]),s=[r],i=[];for(let o=0;s.length>0&&o<128;o+=1){let a=s.shift();for(let l of e){let d=Xr(l.sender),c=Xr(l.receiver);d!==a&&c!==a||(i.includes(l)||i.push(l),n.has(d)||(n.add(d),s.push(d)),n.has(c)||(n.add(c),s.push(c)))}}return i.sort((o,a)=>o.at-a.at)}function TP(t,e){let r=Iu(t,e);if(r.length===0)return null;let n=r[0];return n.sender.teamfile.startsWith("prompt:")?n.receiver:n.sender}function eT(t,e){return t.teamfile===e.teamfile&&t.alias===e.alias}function Xr(t){return`${t.teamfile}\0${t.alias}`}function vP(t){return t.map(e=>`${hP(e.teamfile)}:${e.alias}`).join(" \u2192 ")}var gP,yP,Qw,Ea=E(()=>{"use strict";gP=6e4,yP=2,Qw=8*60*60*1e3});function iT(t){if(t.length===0||!t.startsWith("---"))throw new Mt("frontmatter must start at line 1 with `---` on its own line");let e=t.split(`
2302
+ `);if(e[0]!=="---")throw new Mt("frontmatter must start at line 1 with `---` on its own line");let r={},n=-1;for(let o=1;o<e.length;o++){let a=e[o];if(a==="---"){n=o;break}if(a.trim()==="")continue;let l=a.match(/^([a-zA-Z][a-zA-Z0-9_-]*)\s*:\s*(.*)$/);if(!l)throw new Mt(`malformed frontmatter line ${o+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let d=l[1],c=l[2].trim();if(!SP.has(d))throw new Mt(`unknown frontmatter key "${d}" \u2014 allowed keys: ${wa.join(", ")}`);r[d]=c}if(n===-1)throw new Mt("frontmatter not closed (missing trailing `---` on its own line)");for(let o of wa)if(r[o]===void 0)throw new Mt(`missing required frontmatter key "${o}" \u2014 required: ${wa.join(", ")}`);let s=0;for(let o=0;o<=n;o++)s+=e[o].length+1;s>t.length&&(s=t.length);let i=r.members.split(",").map(o=>o.trim()).filter(Boolean);return{title:r.title,description:r.description,members:i,bodyOffset:s}}var wa,SP,Mt,oT=E(()=>{"use strict";wa=["title","description","members"],SP=new Set(wa),Mt=class extends Error{constructor(e){super(e),this.name="FrontmatterError"}}});import{readFileSync as bP,writeFileSync as l6,renameSync as d6,existsSync as lT}from"node:fs";import{basename as kP,resolve as Dn,dirname as Nu}from"node:path";function NP(t){let e={},r=/(\w+)=(?:"([^"]*)"|([\S]*))/g,n;for(;(n=r.exec(t))!==null;){let s=n[1],i=n[2]!==void 0?n[2]:n[3];e[s]=i}return e}function AP(t){return/^\s*_MEMBER_\s+\S/.test(t)}function xP(t){return/^\s*_SESSION_\s+\S/.test(t)}function RP(t){return/^\s*_SKILL_(?:\s|$)/.test(t)}function Ta(t){let e=kP(t);return e.endsWith(".lmctl")?e.slice(0,-6):e}function rt(t){let e=bP(t,"utf-8"),r=Nu(Dn(t)),n=xu(e,Ta(t),{baseDir:r,sourcePath:Dn(t)});for(let s of n.members)s.sessiondir&&!s.sessiondir.startsWith("/")&&(s.sessiondir=Dn(r,s.sessiondir));return n}function xu(t,e,r={}){let n=[],s=[];r.sourcePath,r.baseDir;let i=t;if(i.startsWith("#teamfile:")){let l=i.indexOf(`
2303
2303
  `);i=l>=0?i.slice(l+1):""}let o=null;if(i.startsWith("---"))try{o=iT(i)}catch(l){if(l instanceof Mt)s.push(`frontmatter: ${l.message}`);else throw l}let a=t.split(`
2304
2304
  `);for(let l=0;l<a.length;l++){let d=a[l],c=l+1;if(xP(d))throw new Error(`line ${c}: _SESSION_ is the legacy prefix. Rename to _MEMBER_. (line: ${d.trim()})`);if(RP(d)||!AP(d))continue;let u=NP(d);for(let p of Object.keys(u))if(!aT.includes(p))throw new Error(`line ${c}: unknown key "${p}" on _MEMBER_ line: ${d.trim()}
2305
- allowed keys: ${aT.join(", ")}`);if(!u.provider&&!u.teamfile){s.push(`line ${c}: member line missing provider (or teamfile): ${d.trim()}`);continue}let f={alias:u.alias||`member${n.length+1}`,provider:u.provider||"",extra:{}};u.sessionid&&(f.session=u.sessionid),Object.prototype.hasOwnProperty.call(u,"sessiondir")&&(f.sessiondir=u.sessiondir),u.teamfile&&(f.teamfile=u.teamfile),u.model&&(f.model=u.model),u.effort&&(f.effort=u.effort),n.push(f)}return{name:e,members:n,rawText:t,parseErrors:s,frontmatter:o}}function Lu(t,e){let r=[];for(let i of t.parseErrors)r.push({field:"session",message:i});let n=t.members.filter(i=>i.alias.toLowerCase()===xu.toLowerCase());n.length>1&&r.push({field:xu,message:`${n.length} alias=Lead found (max 1)`});let s=new Set;for(let i of t.members){let o=i.alias.toLowerCase();if(s.has(o)&&r.push({field:i.alias,message:`Duplicate alias "${i.alias}" (case-insensitive)`}),s.add(o),i.teamfile){let a=e?Dn(e,i.teamfile):Dn(i.teamfile);if(!lT(a))r.push({field:i.alias,message:`Teamfile not found: ${a}`});else{let l=rt(a),d=Dt(l);d?d.session||r.push({field:i.alias,message:`Team at ${i.teamfile} lead has no session ID. Run: lmctl seed`}):r.push({field:i.alias,message:`Team at ${i.teamfile} has no lead session`})}}else IP.has(i.provider)||r.push({field:i.alias,message:`Invalid provider "${i.provider}"`});i.sessiondir!==void 0&&i.sessiondir===""&&r.push({field:i.alias,message:"sessiondir is empty"})}return r}function Dt(t){return t.members.find(e=>e.alias.toLowerCase()===xu.toLowerCase())}function Ou(t,e,r,n={}){let s=n.requireSession??!0;if(!t.teamfile)throw new Error(`Member "${t.alias}" is not a team reference`);let i=Dn(e,t.teamfile),o=r??new Set;if(o.has(i))throw new Error(`Circular team reference: ${t.alias} \u2192 ${i} (already visited: ${[...o].join(" \u2192 ")})`);if(o.add(i),!lT(i))throw new Error(`Teamfile not found: ${i} (referenced by alias "${t.alias}")`);let a=rt(i),l=Dt(a);if(!l)throw new Error(`Team at ${i} has no lead session`);if(l.teamfile)return Ou(l,Au(i),o,n);if(s&&!l.session)throw new Error(`Team at ${i} lead has no session ID. Run: lmctl seed`);return{provider:l.provider,session:l.session??"",sessiondir:l.sessiondir||Au(i),alias:t.alias,resolvedFrom:i,model:l.model,effort:l.effort}}function va(t,e){return t.members.find(r=>r.alias===e)??t.members.find(r=>r.alias.toLowerCase()===e.toLowerCase())}var xu,IP,aT,tr=E(()=>{"use strict";oT();xu="Lead",IP=new Set(["claude","codex","opencode","lmplayer","gemini","copilot","qwen","agy","ClaudeMock"]);aT=["alias","provider","sessionid","sessiondir","teamfile","model","effort"]});import{createHash as LP}from"node:crypto";import{existsSync as ba,readFileSync as cT,realpathSync as OP}from"node:fs";import{basename as dT,dirname as $P,resolve as uT}from"node:path";function Te(t,e){let r=uT(t);if(ba(r))return OP(r);if(e!==void 0){let n=MP(t,r,e);if(n!==null)return n}return r}function ka(t,e){let r=$P(e),n=Ru(t,Ta(e),{baseDir:r});for(let s of n.members)s.sessiondir!==void 0&&!s.sessiondir.startsWith("/")&&(s.sessiondir=uT(r,s.sessiondir));return n}function qe(t,e,r=n=>{process.stderr.write(`warning: ${n}
2306
- `)}){let n=Te(t,CP(e)?e:void 0);if(ba(n)){let i=cT(n,"utf8"),o=ka(i,n);return e!==void 0&&"upsertRootTeam"in e&&e.getRootTeam(n)===null&&DP(o)&&jP(e,n,o,i,r),o}let s=e?.getRootTeam(n)??null;throw s!==null?new Error(`teamfile missing on disk: ${n} (registered ${s.registered_at}; the file was renamed or deleted \u2014 seed the team at its new path)`):new Error(`teamfile not found: ${t}`)}function CP(t){return typeof t=="object"&&t!==null&&"getRootTeam"in t&&"listRootTeams"in t}function MP(t,e,r){let n=r.getRootTeam(t)??r.getRootTeam(e);if(n!==null)return n.teamfile_path;let s=dT(t),i=Ta(t),o=r.listRootTeams().filter(l=>(dT(l.teamfile_path)===s||l.name===i)&&ba(l.teamfile_path));if(o.length===0)return null;if(o.length===1)return o[0].teamfile_path;let a=o.map(l=>l.teamfile_path).join(", ");throw new Error(`ambiguous teamfile "${t}" in root-team registry: ${a}; pass an absolute path`)}function DP(t){return t.parseErrors.length>0?!1:t.members.every(e=>e.teamfile!==void 0?!0:e.session!==void 0&&e.session.length>=$u)}function Cu(t,e,r){let n=Te(e),s=r.members.filter(i=>i.teamfile===void 0&&i.session!==void 0&&i.session.length>=$u);if(s.length!==0)for(let i of t.listRootTeams()){if(!ba(i.teamfile_path))continue;let o=Te(i.teamfile_path);if(o===n)continue;let a=cT(o,"utf8"),l=ka(a,o);for(let d of s){let c=l.members.find(u=>u.teamfile===void 0&&u.session===d.session&&(u.session?.length??0)>=$u);if(c!==void 0)throw new Sa(`sessionid ownership conflict: ${n}:${d.alias} and ${o}:${c.alias} both use sessionid "${d.session}"`)}}}function jP(t,e,r,n,s){try{Cu(t,e,r)}catch(o){if(!(o instanceof Sa))throw o;s(`${o.message}; skipping automatic registration`);return}let i={teamfile_path:e,name:r.name,raw_text:n,raw_sha256:LP("sha256").update(n).digest("hex"),registered_at:new Date().toISOString(),last_seeded_at:null};t.upsertRootTeam(i)}var $u,Sa,rr=E(()=>{"use strict";tr();$u=5,Sa=class extends Error{constructor(e){super(e),this.name="ForeignSessionidOwnershipError"}}});import{existsSync as PP}from"node:fs";import{dirname as mT}from"node:path";function WP(t){return FP.test(t)||UP.test(t)}function fT(t){return Ia.test(t)}function Jr(t){if(!t.includes(":"))return null;let e=t.lastIndexOf(":"),r=t.slice(0,e),n=t.slice(e+1);return!r.endsWith(".lmctl")||!Ia.test(n)?null:{teamfile:r,alias:n}}function Me(t,e,r){if(!t.endsWith(".lmctl"))throw new ve(`lmctl: "${t}" doesn't look like a teamfile (expected .lmctl extension).`);if(!fT(e))throw new ve(`lmctl: "${e}" is not a valid alias (must match ${Ia.source}).`);let n=Te(t,r);if(r===void 0&&!PP(n))throw new ve(`lmctl: teamfile not found: ${t}`);let s;try{s=qe(n,r)}catch(o){throw new ve(`lmctl: ${t}: ${o instanceof Error?o.message:String(o)}`)}if(s.parseErrors.length>0)throw new ve(`lmctl: ${t}: ${s.parseErrors.join("; ")}`);let i=va(s,e);if(i===void 0){let o=s.members.map(a=>a.alias).join(", ")||"(none)";throw new ve(`lmctl: alias "${e}" not found in ${t}.
2307
- Known aliases: ${o}`)}if(i.teamfile!==void 0){let o=Ou(i,mT(n));return{teamfile:n,alias:i.alias,provider:o.provider,sessionid:o.session,sessiondir:o.sessiondir,isLead:!0,...o.model??i.model?{model:o.model??i.model}:{},...o.effort??i.effort?{effort:o.effort??i.effort}:{}}}if(i.session===void 0)throw new ve(`lmctl: alias "${i.alias}" in ${t} has no session ID yet.
2308
- Run: lmctl seed ${t}`);return{teamfile:n,alias:i.alias,provider:i.provider,sessionid:i.session,sessiondir:i.sessiondir??mT(n),isLead:Dt(s)?.alias===i.alias,...i.model!==void 0?{model:i.model}:{},...i.effort!==void 0?{effort:i.effort}:{}}}function kr(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 o={mode:"managed"};return s.run!==void 0&&(o.run=s.run),s.project!==void 0&&(o.project=s.project),s.workflow!==void 0&&(o.workflow=s.workflow),o}if(r!==void 0){let o=Jr(r);if(o!==null)return n!==void 0&&n!==o.alias?{mode:"error",message:`lmctl ${t.name}: got "${r}" AND second positional "${n}" \u2014 pick one form.`}:{mode:"ai-team",teamfile:o.teamfile,alias:o.alias};if(r.endsWith(".lmctl"))return n!==void 0?fT(n)?{mode:"ai-team",teamfile:r,alias:n}:{mode:"error",message:`lmctl ${t.name}: "${n}" is not a valid alias (must match ${Ia.source}).`}:t.allowsBareTeamfile?{mode:"ai-team",teamfile:r}:{mode:"error",message:`lmctl ${t.name}: alias required.
2309
- Use: lmctl ${t.name} ${r}:<alias> or lmctl ${t.name} ${r} <alias>`};if(WP(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.
2305
+ allowed keys: ${aT.join(", ")}`);if(!u.provider&&!u.teamfile){s.push(`line ${c}: member line missing provider (or teamfile): ${d.trim()}`);continue}let f={alias:u.alias||`member${n.length+1}`,provider:u.provider||"",extra:{}};u.sessionid&&(f.session=u.sessionid),Object.prototype.hasOwnProperty.call(u,"sessiondir")&&(f.sessiondir=u.sessiondir),u.teamfile&&(f.teamfile=u.teamfile),u.model&&(f.model=u.model),u.effort&&(f.effort=u.effort),n.push(f)}return{name:e,members:n,rawText:t,parseErrors:s,frontmatter:o}}function Ru(t,e){let r=[];for(let i of t.parseErrors)r.push({field:"session",message:i});let n=t.members.filter(i=>i.alias.toLowerCase()===Au.toLowerCase());n.length>1&&r.push({field:Au,message:`${n.length} alias=Lead found (max 1)`});let s=new Set;for(let i of t.members){let o=i.alias.toLowerCase();if(s.has(o)&&r.push({field:i.alias,message:`Duplicate alias "${i.alias}" (case-insensitive)`}),s.add(o),i.teamfile){let a=e?Dn(e,i.teamfile):Dn(i.teamfile);if(!lT(a))r.push({field:i.alias,message:`Teamfile not found: ${a}`});else{let l=rt(a),d=Dt(l);d?d.session||r.push({field:i.alias,message:`Team at ${i.teamfile} lead has no session ID. Run: lmctl seed`}):r.push({field:i.alias,message:`Team at ${i.teamfile} has no lead session`})}}else IP.has(i.provider)||r.push({field:i.alias,message:`Invalid provider "${i.provider}"`});i.sessiondir!==void 0&&i.sessiondir===""&&r.push({field:i.alias,message:"sessiondir is empty"})}return r}function Dt(t){return t.members.find(e=>e.alias.toLowerCase()===Au.toLowerCase())}function Lu(t,e,r,n={}){let s=n.requireSession??!0;if(!t.teamfile)throw new Error(`Member "${t.alias}" is not a team reference`);let i=Dn(e,t.teamfile),o=r??new Set;if(o.has(i))throw new Error(`Circular team reference: ${t.alias} \u2192 ${i} (already visited: ${[...o].join(" \u2192 ")})`);if(o.add(i),!lT(i))throw new Error(`Teamfile not found: ${i} (referenced by alias "${t.alias}")`);let a=rt(i),l=Dt(a);if(!l)throw new Error(`Team at ${i} has no lead session`);if(l.teamfile)return Lu(l,Nu(i),o,n);if(s&&!l.session)throw new Error(`Team at ${i} lead has no session ID. Run: lmctl seed`);return{provider:l.provider,session:l.session??"",sessiondir:l.sessiondir||Nu(i),alias:t.alias,resolvedFrom:i,model:l.model,effort:l.effort}}function va(t,e){return t.members.find(r=>r.alias===e)??t.members.find(r=>r.alias.toLowerCase()===e.toLowerCase())}var Au,IP,aT,tr=E(()=>{"use strict";oT();Au="Lead",IP=new Set(["claude","codex","opencode","lmplayer","gemini","copilot","qwen","agy","ClaudeMock"]);aT=["alias","provider","sessionid","sessiondir","teamfile","model","effort"]});import{createHash as LP}from"node:crypto";import{existsSync as $u,readFileSync as cT,realpathSync as OP}from"node:fs";import{basename as dT,dirname as $P,resolve as uT}from"node:path";function Te(t,e){let r=uT(t);if($u(r))return OP(r);if(e!==void 0){let n=MP(t,r,e);if(n!==null)return n}return r}function ba(t,e){let r=$P(e),n=xu(t,Ta(e),{baseDir:r});for(let s of n.members)s.sessiondir!==void 0&&!s.sessiondir.startsWith("/")&&(s.sessiondir=uT(r,s.sessiondir));return n}function qe(t,e,r=n=>{process.stderr.write(`warning: ${n}
2306
+ `)}){let n=Te(t,CP(e)?e:void 0);if($u(n)){let i=cT(n,"utf8"),o=ba(i,n);return e!==void 0&&"upsertRootTeam"in e&&e.getRootTeam(n)===null&&DP(o)&&PP(e,n,o,i,r),o}let s=e?.getRootTeam(n)??null;throw s!==null?new Error(`teamfile missing on disk: ${n} (registered ${s.registered_at}; the file was renamed or deleted \u2014 seed the team at its new path)`):new Error(`teamfile not found: ${t}`)}function CP(t){return typeof t=="object"&&t!==null&&"getRootTeam"in t&&"listRootTeams"in t}function MP(t,e,r){let n=r.getRootTeam(t)??r.getRootTeam(e);if(n!==null)return n.teamfile_path;let s=dT(t),i=Ta(t),o=r.listRootTeams().filter(l=>(dT(l.teamfile_path)===s||l.name===i)&&$u(l.teamfile_path));if(o.length===0)return null;if(o.length===1)return o[0].teamfile_path;let a=o.map(l=>l.teamfile_path).join(", ");throw new Error(`ambiguous teamfile "${t}" in root-team registry: ${a}; pass an absolute path`)}function DP(t){return t.parseErrors.length>0?!1:t.members.every(e=>e.teamfile!==void 0?!0:e.session!==void 0&&e.session.length>=Ou)}function Cu(t,e,r){let n=Te(e),s=r.members.filter(i=>i.teamfile===void 0&&i.session!==void 0&&i.session.length>=Ou);if(s.length!==0)for(let i of t.listRootTeams()){let o,a;try{if(o=Te(i.teamfile_path),o===n)continue;a=cT(o,"utf8")}catch(d){if(jP(d))continue;throw d}let l=ba(a,o);for(let d of s){let c=l.members.find(u=>u.teamfile===void 0&&u.session===d.session&&(u.session?.length??0)>=Ou);if(c!==void 0)throw new Sa(`sessionid ownership conflict: ${n}:${d.alias} and ${o}:${c.alias} both use sessionid "${d.session}"`)}}}function jP(t){let e=t?.code;return e==="ENOENT"||e==="ENOTDIR"}function PP(t,e,r,n,s){try{Cu(t,e,r)}catch(o){if(!(o instanceof Sa))throw o;s(`${o.message}; skipping automatic registration`);return}let i={teamfile_path:e,name:r.name,raw_text:n,raw_sha256:LP("sha256").update(n).digest("hex"),registered_at:new Date().toISOString(),last_seeded_at:null};t.upsertRootTeam(i)}var Ou,Sa,rr=E(()=>{"use strict";tr();Ou=5,Sa=class extends Error{constructor(e){super(e),this.name="ForeignSessionidOwnershipError"}}});import{existsSync as FP}from"node:fs";import{dirname as mT}from"node:path";function qP(t){return UP.test(t)||WP.test(t)}function fT(t){return ka.test(t)}function Jr(t){if(!t.includes(":"))return null;let e=t.lastIndexOf(":"),r=t.slice(0,e),n=t.slice(e+1);return!r.endsWith(".lmctl")||!ka.test(n)?null:{teamfile:r,alias:n}}function Me(t,e,r){if(!t.endsWith(".lmctl"))throw new ve(`lmctl: "${t}" doesn't look like a teamfile (expected .lmctl extension).`);if(!fT(e))throw new ve(`lmctl: "${e}" is not a valid alias (must match ${ka.source}).`);let n=Te(t,r);if(r===void 0&&!FP(n))throw new ve(`lmctl: teamfile not found: ${t}`);let s;try{s=qe(n,r)}catch(o){throw new ve(`lmctl: ${t}: ${o instanceof Error?o.message:String(o)}`)}if(s.parseErrors.length>0)throw new ve(`lmctl: ${t}: ${s.parseErrors.join("; ")}`);let i=va(s,e);if(i===void 0){let o=s.members.map(a=>a.alias).join(", ")||"(none)";throw new ve(`lmctl: alias "${e}" not found in ${t}.
2307
+ Known aliases: ${o}`)}if(i.teamfile!==void 0){let o=Lu(i,mT(n));return{teamfile:n,alias:i.alias,provider:o.provider,sessionid:o.session,sessiondir:o.sessiondir,isLead:!0,...o.model??i.model?{model:o.model??i.model}:{},...o.effort??i.effort?{effort:o.effort??i.effort}:{}}}if(i.session===void 0)throw new ve(`lmctl: alias "${i.alias}" in ${t} has no session ID yet.
2308
+ Run: lmctl seed ${t}`);return{teamfile:n,alias:i.alias,provider:i.provider,sessionid:i.session,sessiondir:i.sessiondir??mT(n),isLead:Dt(s)?.alias===i.alias,...i.model!==void 0?{model:i.model}:{},...i.effort!==void 0?{effort:i.effort}:{}}}function kr(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 o={mode:"managed"};return s.run!==void 0&&(o.run=s.run),s.project!==void 0&&(o.project=s.project),s.workflow!==void 0&&(o.workflow=s.workflow),o}if(r!==void 0){let o=Jr(r);if(o!==null)return n!==void 0&&n!==o.alias?{mode:"error",message:`lmctl ${t.name}: got "${r}" AND second positional "${n}" \u2014 pick one form.`}:{mode:"ai-team",teamfile:o.teamfile,alias:o.alias};if(r.endsWith(".lmctl"))return n!==void 0?fT(n)?{mode:"ai-team",teamfile:r,alias:n}:{mode:"error",message:`lmctl ${t.name}: "${n}" is not a valid alias (must match ${ka.source}).`}:t.allowsBareTeamfile?{mode:"ai-team",teamfile:r}:{mode:"error",message:`lmctl ${t.name}: alias required.
2309
+ Use: lmctl ${t.name} ${r}:<alias> or lmctl ${t.name} ${r} <alias>`};if(qP(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.
2310
2310
  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}".
2311
2311
  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 o={mode:"ai-team-raw",sessionid:s.session};return s.provider!==void 0&&(o.provider=s.provider),o}return{mode:"error",message:`lmctl ${t.name}: a target is required.
2312
- Use: <path>.lmctl[:<alias>] | <path>.lmctl <alias> | <sessionid> | --run <id>`}}var ve,FP,UP,Ia,wt=E(()=>{"use strict";tr();rr();ve=class extends Error{constructor(e){super(e),this.name="ChatTargetError"}},FP=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,UP=/^ses_[A-Za-z0-9_-]+$/,Ia=/^[A-Za-z][A-Za-z0-9_-]*$/});function Na(t){return BP.has(t)}function Du(){return Mu===null&&(Mu=Nt(xt())),Mu}function ju(t,e,r={}){if(!Na(t))return null;try{let n=Du().getAdapter?.(t);if(n===void 0)return null;let s=n.resumeCommand(e).trim();if(s.length===0)return null;let i=s.split(/\s+/),o=t==="codex"&&r.isLead===!0?Ai({warn:()=>{}}):[],a=r.model!==void 0&&r.model.trim().length>0?qP[t]?.(r.model):void 0;return r.model!==void 0&&r.model.trim().length>0&&a===void 0&&r.onModelIgnored?.({provider:t,model:r.model,reason:`${t} terminal resume does not implement per-session model selection`}),[...i,...a??[],...o,...pT[t]??[]]}catch{return null}}function Aa(t,e,r={}){let n=ju(t,e,r);return n===null?null:n.join(" ")}function Be(t,e){return Du().getSession(t,e)}async function jn(t){return(await Du().resolveSessions(t)).map(r=>r.provider.name)}var pT,qP,BP,_T,Mu,nr=E(()=>{"use strict";Lt();Gl();pT={claude:["--dangerously-skip-permissions"],codex:["--dangerously-bypass-approvals-and-sandbox"],gemini:["-y"],copilot:["--yolo"],opencode:[],qwen:["--approval-mode","yolo"],agy:[],lmplayer:[]},qP={claude:t=>["--model",t],codex:t=>["--model",t],gemini:t=>["--model",t],opencode:t=>["--model",t],qwen:t=>["--model",t],agy:t=>["--model",t],lmplayer:t=>["--model",t]},BP=new Set(Object.keys(pT)),_T=/^[\w.:-]+$/;Mu=null});function HP(t=process.env){let e=t.LMCTL_SESSION_IDLE_TIMEOUT_MS;if(e===void 0||e.trim()==="")return hT;let r=Number(e);return!Number.isFinite(r)||r<=0?hT:r}async function XP(t,e,r){try{let n=Me(e,r,t),s=n.sessionid;if(typeof s!="string"||s.trim()===""||s===".")return null;let i;if(typeof n.provider=="string"&&n.provider.trim()!=="")i=n.provider;else{let d=await jn(s);if(d.length!==1)return null;i=d[0]}let o=await Be(s,i);if(o===null)return null;let a=o.modifiedAt;if(!(a instanceof Date))return null;let l=a.getTime();return Number.isFinite(l)?Date.now()-l:null}catch{return null}}async function xa(t,e,r,n,s){if(!e.busy||e.reason!=="in-flight")return!1;let i=s??HP(),o=await XP(t,r,n),a=o!==null&&o>=i;return a&&C({event:"session_idle_reclaim",receiver_teamfile:r,receiver_alias:n,idle_ms:o,idle_minutes:o===null?null:Math.round(o/6e4),threshold_ms:i,reason:"in-flight holder idle past session-idle threshold; lease will be force-reclaimed"}),a}var hT,Pu=E(()=>{"use strict";me();nr();wt();hT=36e5});function JP(t=process.env){let e=t.LMCTL_DAEMON_MAILBOX_RELAY_MAX_BATCHES;if(e===void 0||e.trim()==="")return gT;let r=Number(e);return!Number.isFinite(r)||r<=0?gT:Math.max(1,Math.trunc(r))}async function ET(t){let e=t.env??process.env,r=t.maxBatches??JP(e),n=QP(t.dal),s={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0};ZP(t.dal,e);let i=new Set;for(;s.scanned<r;){let o=t.dal.listRelayMailboxLanes(r).find(l=>!i.has(yT(l)));if(o===void 0)break;i.add(yT(o)),s.scanned+=1;let a=await GP(t.dal,n,e,o);s.delivered+=a.delivered,s.skipped_busy+=a.skipped_busy,s.skipped_terminal+=a.skipped_terminal,s.errors+=a.errors}return s}function yT(t){return JSON.stringify([t.sender_teamfile,t.sender_alias,t.receiver_teamfile,t.receiver_alias])}async function GP(t,e,r,n){let s={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0},i=Wt(t,n.receiver_teamfile,n.receiver_alias),o=!1;if(i.busy){if(!await xa(t,i,n.receiver_teamfile,n.receiver_alias))return i.reason==="terminal-held"?{...s,skipped_terminal:1}:{...s,skipped_busy:1};o=!0}let a=null;try{let l=Me(n.receiver_teamfile,n.receiver_alias,t),d=ar(t,{receiver_teamfile:n.receiver_teamfile,receiver_alias:n.receiver_alias,sender_teamfile:n.sender_teamfile,sender_alias:n.sender_alias,ttlMs:br(),...o?{force:!0}:{}});if(!d.acquired)return{...s,skipped_busy:1};if(a=d.lease,n.message_type==="response"){let u=await Yw({sender:{teamfile:n.sender_teamfile,alias:n.sender_alias},receiver:{teamfile:n.receiver_teamfile,alias:n.receiver_alias,provider:l.provider,sessionId:l.sessionid,cwd:l.sessiondir,...l.model!==void 0?{model:l.model}:{},...l.effort!==void 0?{effort:l.effort}:{},...l.isLead!==void 0?{isLead:l.isLead}:{}},io:e,permissionMode:"yolo",env:r});return YP(u)}let c=await ga({sender:{teamfile:n.sender_teamfile,alias:n.sender_alias},receiver:{teamfile:n.receiver_teamfile,alias:n.receiver_alias,provider:l.provider,sessionId:l.sessionid,cwd:l.sessiondir,...l.model!==void 0?{model:l.model}:{},...l.effort!==void 0?{effort:l.effort}:{},...l.isLead!==void 0?{isLead:l.isLead}:{}},io:e,permissionMode:"yolo",env:r,finalize:"caller"});return KP(t,c)}catch(l){return VP(t,n,`relay delivery error: ${l instanceof Error?l.message:String(l)}`)}finally{if(a!==null)try{t.releaseAgentInflight(a)}catch{}}}function VP(t,e,r){let n={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0};try{let s=e.message_type==="response"?t.listEnqueuedResponseMailFromSender(e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias):t.listEnqueuedRequestMailFromSender(e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias),i=e.message_type==="response"?t.markMailDelivered(s.map(o=>o.id),r,new Date().toISOString()):t.markRelayRequestDeliveredAndEnqueueResponses(s,r,new Date().toISOString()).marked;return{...n,delivered:i,errors:1}}catch{return{...n,errors:1}}}function KP(t,e){let r={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0},n=zP(e),s=new Date().toISOString(),{marked:i}=t.markRelayRequestDeliveredAndEnqueueResponses(e.queued,n,s);return{...r,delivered:i,errors:e.status==="ok"?0:1}}function YP(t){return{...{scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0},delivered:t.deliveredIds.length,errors:t.status==="ok"?0:1}}function zP(t){return t.status==="ok"?t.receipt:t.status==="stalled"?`relay delivery error: provider stalled${t.stalledAfterMs!==void 0?` after ${t.stalledAfterMs}ms`:""}
2313
- ${t.receipt}`:`relay delivery error: ${t.error}`}function ZP(t,e){t.reclaimStaleMailboxDeliveries(new Date(Date.now()-ku(e)).toISOString())}function QP(t){return{stdout:{write:()=>{}},stderr:{write:()=>{}},dal:t}}var gT,wT=E(()=>{"use strict";lr();Iu();Ea();wt();Pu();gT=10});function qs(){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 tF(t=process.env){let e=t.LMCTL_DAEMON_FEATURES;if(e===void 0)return new Set(["mailbox-relay"]);if(e.trim()==="")return new Set;let r=new Set;for(let n of e.split(",")){let s=n.trim();if(s!==""){if(s==="all")return new Set(TT);eF.has(s)&&r.add(s)}}return r}function vT(t){let e=t.intervalMs??qs(),r=t.runOnceFn??Br,n=new Set(t.features??tF()),s={running:t.autoStart!==!1,in_flight:!1,interval_ms:e,enabled_features:[...n].sort(),cycles:0,jobs_processed:0,last_jobs_processed:0,last_started_at:null,last_finished_at:null,last_error:null,last_session_sizes_recorded:0,last_session_size_failures:0,last_intake_scanned:0,last_intake_new_jobs:0,last_intake_failures:0,last_session_hung_detected:0,last_session_monitor_checked_at:null,last_session_monitor_error:null,last_mailbox_relay_scanned:0,last_mailbox_relay_delivered:0,last_mailbox_relay_errors:0},i=null,o=null,a=null,l=null,d=null;n.has("rollup-updater")&&t.startRollupUpdaterFn!==!1&&(d=(t.startRollupUpdaterFn??qw)(t.dal));let c=f=>{s.running&&(i=setTimeout(()=>{m.runCycle().finally(()=>c(e))},f))},u=f=>{s.running&&(o=setTimeout(()=>{l===null&&(l=ST(t.dal,n,t.monitorSessionActivityFn??Qd,e,s).finally(()=>{l=null})),l.finally(()=>u(ec(t.dal,e)))},f))},m={state:s,runCycle:async()=>(a!==null||(a=rF(t.dal,r,t.collectSessionSizesFn??uh,t.scanIntakeFn??No,t.monitorSessionActivityFn??Qd,t.mailboxRelayFn??ET,t.worker_id??"daemon",e,n,s).finally(()=>{a=null})),a),stop:async()=>{s.running=!1,i!==null&&clearTimeout(i),o!==null&&clearTimeout(o),d?.stop(),a!==null&&await a.catch(()=>{}),l!==null&&await l.catch(()=>{})}};if(s.running){let f=t.firstDelayMs??5e3;c(f),n.has("session-monitor")&&u(f)}return m}async function rF(t,e,r,n,s,i,o,a,l,d){d.in_flight=!0,d.last_started_at=new Date().toISOString(),d.last_error=null;let c=[],u=0,m=0,f=[],p=null,h=nF();try{if(l.has("durable-memory-policies")&&yE({dal:t}),l.has("drift-detectors")&&Xw({dal:t}),l.has("intake")&&(f=await n(t)),l.has("job-worker"))for(;;){let g=await e({dal:t,worker_id:o,lease_ms:6e5});if(g===null)break;c.push(g)}if(l.has("mailbox-relay")&&(h=await i({dal:t})),l.has("session-size")){let g=await r(t);u=g.recorded,m=g.failed}l.has("session-monitor")&&(p=await ST(t,l,s,a,d))}catch(g){d.last_error=g instanceof Error?g.message:String(g);try{t.raiseAttention({kind:"daemon_worker_failed",severity:"error",payload:JSON.stringify({error:d.last_error})})}catch{}}finally{d.in_flight=!1,d.cycles+=1,d.last_jobs_processed=c.length,d.last_session_sizes_recorded=u,d.last_session_size_failures=m,d.last_intake_scanned=f.reduce((g,_)=>g+_.scanned,0),d.last_intake_new_jobs=f.reduce((g,_)=>g+_.new_jobs,0),d.last_intake_failures=f.filter(g=>g.error!==void 0).length,d.last_session_hung_detected=p?.hung_detected??0,d.last_mailbox_relay_scanned=h.scanned,d.last_mailbox_relay_delivered=h.delivered,d.last_mailbox_relay_errors=h.errors,d.jobs_processed+=c.length,d.last_finished_at=new Date().toISOString()}return{jobs_processed:c.length,outcomes:c,session_sizes_recorded:u,session_size_failures:m,intake:f,session_monitor:p,mailbox_relay:h}}function nF(){return{scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0}}async function ST(t,e,r,n,s){if(!e.has("session-monitor"))return null;let i=ec(t,n),o=Date.now();if(s.last_session_monitor_checked_at!==null){let a=Date.parse(s.last_session_monitor_checked_at);if(Number.isFinite(a)&&o-a<i)return null}s.last_session_monitor_checked_at=new Date(o).toISOString(),s.last_session_monitor_error=null;try{return await r({dal:t,nowMs:o})}catch(a){s.last_session_monitor_error=a instanceof Error?a.message:String(a);try{t.raiseAttention({kind:"daemon_session_monitor_failed",severity:"error",payload:JSON.stringify({error:s.last_session_monitor_error})})}catch{}return null}}var TT,eF,Fu=E(()=>{"use strict";bc();Ko();tu();Qi();Bw();Jw();tc();wT();TT=["durable-memory-policies","drift-detectors","intake","job-worker","mailbox-relay","session-size","session-monitor","rollup-updater"],eF=new Set(TT)});function bT(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 kT=E(()=>{"use strict"});import{mkdirSync as sF,readFileSync as iF,readdirSync as oF,statSync as aF,writeFileSync as lF}from"node:fs";import{dirname as dF,join as NT,sep as IT}from"node:path";function Ra(t){return{s3:{async send(n){let s=n;switch(s._localfsTag){case AT:return cF(t,s.input);case xT:return uF(t,s.input);case RT:return mF(t,s.input);default:throw new Error("createLocalFsS3Client: unknown command")}}},commands:{ListObjectsV2Command:qu,GetObjectCommand:Wu,PutObjectCommand:Uu}}}function cF(t,e){let r=LT(t,e.Key);return sF(dF(r),{recursive:!0}),lF(r,e.Body),{}}function uF(t,e){let r=LT(t,e.Key),n;try{n=iF(r)}catch(i){throw i.code==="ENOENT"?Object.assign(new Error("NoSuchKey"),{name:"NoSuchKey"}):i}let s=n.toString("utf-8");return{Body:{transformToString:async()=>s}}}function mF(t,e){let r=e.Prefix??"";OT(r);let s=fF(t).sort((c,u)=>c.key<u.key?-1:c.key>u.key?1:0).filter(c=>c.key.startsWith(r)),i=e.ContinuationToken;i!==void 0&&i!==""&&(s=s.filter(c=>c.key>i));let o=typeof e.MaxKeys=="number"&&Number.isFinite(e.MaxKeys)&&e.MaxKeys>0?Math.floor(e.MaxKeys):void 0,a=s,l=!1;o!==void 0&&s.length>o&&(a=s.slice(0,o),l=!0);let d={Contents:a.map(c=>({Key:c.key,LastModified:c.lastModified})),IsTruncated:l};return l&&(d.NextContinuationToken=a[a.length-1].key),d}function LT(t,e){return OT(e),NT(t,e)}function OT(t){if(t.split("/").includes(".."))throw new Error(`localfs-s3-client: refusing key/prefix with '..': ${t}`)}function fF(t){let e=[],r=(n,s)=>{let i;try{i=oF(n,{withFileTypes:!0})}catch(o){if(o.code==="ENOENT")return;throw o}for(let o of i){let a=s===""?o.name:`${s}/${o.name}`,l=NT(n,o.name);if(o.isDirectory())r(l,a);else if(o.isFile()){let d=IT==="/"?a:a.split(IT).join("/");e.push({key:d,lastModified:aF(l).mtime})}}};return r(t,""),e}var AT,xT,RT,Uu,Wu,qu,Bu=E(()=>{"use strict";AT="localfs-put",xT="localfs-get",RT="localfs-list",Uu=class{input;_localfsTag=AT;constructor(e){this.input=e}},Wu=class{input;_localfsTag=xT;constructor(e){this.input=e}},qu=class{input;_localfsTag=RT;constructor(e){this.input=e}}});function $T(){return{put:0,get:0,list:0}}function Hu(t,e=pF){return t.put*e.putUsd+t.get*e.getUsd+t.list*e.listUsd}function Xu(t){let e=new Date(t),r=e.getUTCFullYear(),n=String(e.getUTCMonth()+1).padStart(2,"0");return`${r}-${n}`}var pF,La,Ju=E(()=>{"use strict";pF={putUsd:5e-6,getUsd:40000000000000003e-23,listUsd:5e-6};La=class{counts=$T();record(e,r=1){this.counts[e]+=r}peek(){return{...this.counts}}drain(){let e={...this.counts};return this.counts=$T(),e}estimateCostUsd(e){return Hu(this.counts,e)}}});function CT(t){let e=t.now??Date.now,r=t.timers??_F,n=null,s=null;async function i(){let l=e(),d=Xu(l),c=t.meter.drain();(c.put>0||c.get>0||c.list>0)&&t.store.addUsage({user_id:t.userId,device_id:t.deviceId,period:d,put:c.put,get:c.get,list:c.list,updated_at:new Date(l).toISOString()});let u=t.store.loadUsage(t.userId,t.deviceId,d),m=u?{put:u.put_count,get:u.get_count,list:u.list_count}:{put:0,get:0,list:0};if(t.publishOwnRollup!==void 0)try{await t.publishOwnRollup(d,m)}catch(h){t.log?.(`[usage] publish rollup failed: ${h instanceof Error?h.message:String(h)}`)}let f=m;if(t.readUserTotal!==void 0)try{f=await t.readUserTotal(d)}catch(h){t.log?.(`[usage] read user total failed: ${h instanceof Error?h.message:String(h)}`),f=m}let p=Hu(f);if(n!==d&&p>=t.ceilingUsd){n=d,t.log?.(`[usage] quota exceeded period=${d} cost=$${p.toFixed(4)} >= ceiling $${t.ceilingUsd}`);try{t.onQuotaExceeded({period:d,costUsd:p,ceilingUsd:t.ceilingUsd})}catch(h){t.log?.(`[usage] onQuotaExceeded threw: ${h instanceof Error?h.message:String(h)}`)}}}function o(){return s=(s??Promise.resolve()).then(()=>i()).catch(()=>{}),s}let a=r.setInterval(()=>{o()},t.intervalMs);return{stop(){r.clearInterval(a)},flushNow(){return o()},isOverQuota(){return n!==null&&n===Xu(e())}}}var _F,MT=E(()=>{"use strict";Ju();_F={setInterval:(t,e)=>setInterval(t,e),clearInterval:t=>clearInterval(t)}});var Gu=E(()=>{"use strict";ea();ra();ra()});function hF(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 i=s;return typeof i.status!="number"?null:{message_id:e.message_id,reply_to:e.reply_to,response:i}}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 gF(t){return t.reply_to!==void 0&&t.response!==void 0}function yF(t){if(typeof t!="object"||t===null)return;let e=t.conversation_id;return typeof e=="string"?e:void 0}function DT(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 Oa,Bs,jT=E(()=>{"use strict";Gu();Oa=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 Oa("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=Qt(this.now(),this.random);if(this.pending.has(s))throw new Error(`MailboxFetchClient.fetch: duplicate message_id=${s}`);let i=r?.conversationId??s,o={message_id:s,request:e};return new Promise((a,l)=>{let d=r?.abortSignal,c;if(d!==void 0){if(d.aborted){l(DT(d));return}c=()=>{this.pending.has(s)&&(this.pending.delete(s),l(DT(d)))},d.addEventListener("abort",c,{once:!0})}this.pending.set(s,{resolve:a,reject:l,...c!==void 0?{abortListener:c}:{},...d!==void 0?{abortSignal:d}:{}}),this.client.putMessage({conversation_id:i,payload:o}).catch(u=>{let m=this.pending.get(s);m!==void 0&&(this.pending.delete(s),m.abortListener!==void 0&&m.abortSignal!==void 0&&m.abortSignal.removeEventListener("abort",m.abortListener),m.reject(u))})})}async stop(){if(this.stopped)return;this.stopped=!0;let e=Array.from(this.pending.values());this.pending.clear();let r=new Oa;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=hF(e);if(n===null){this.log("MailboxFetchClient: dropping non-envelope inbound payload");return}if(gF(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??yF(e)??n.message_id,i;try{i=await this.requestHandler(n.request)}catch(l){let d=l instanceof Error?l.message:String(l),c=typeof l.code=="string"?l.code:"INTERNAL_ERROR";i={status:500,headers:{"content-type":"application/json"},body:{error:c,message:d}}}let a={message_id:Qt(this.now(),this.random),reply_to:n.message_id,response:i};try{await this.client.putMessage({conversation_id:s,payload:a})}catch(l){this.log(`MailboxFetchClient: response PUT failed for reply_to=${n.message_id}: ${l instanceof Error?l.message:String(l)}`)}}}});function Vu(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 PT=E(()=>{"use strict"});function Ku(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 FT=E(()=>{"use strict"});function zu(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 Yu,UT=E(()=>{"use strict";Yu="daemon:events"});function qT(t){return{kind:"prompt",prompt_id:t.prompt_id??Qt(t.now?.()??Date.now(),t.random??Math.random),root_teamfile:t.root_teamfile,text:t.text}}function Zu(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 WT,Qu=E(()=>{"use strict";Gu();WT="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 EF(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 BT(t,e=60){if(typeof t!="string"||t==="")return!0;let r=EF(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 em=E(()=>{"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":wF},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 d=JSON.parse(s);l=d.message??d.__type??s}catch{}throw new Error(`cognito_refresh_failed: ${n.status} ${l}`)}let o=JSON.parse(s).AuthenticationResult,a=o?.IdToken;if(typeof a!="string"||a==="")throw new Error("cognito_refresh_no_id_token: InitiateAuth returned no IdToken");return{idToken:a,...typeof o?.AccessToken=="string"&&o.AccessToken!==""?{accessToken:o.AccessToken}:{},...typeof o?.ExpiresIn=="number"&&Number.isFinite(o.ExpiresIn)?{expiresAt:Date.now()+o.ExpiresIn*1e3}:{}}}var wF,tm=E(()=>{"use strict";wF="AWSCognitoIdentityProviderService.InitiateAuth"});import{chmodSync as XT,mkdirSync as JT,readFileSync as GT,writeFileSync as VT}from"node:fs";import{homedir as KT}from"node:os";import{dirname as YT,join as zT}from"node:path";function Xs(){return process.env.LMCTL_DEVICE_AUTH_PATH??zT(KT(),".lmctl","device-auth.json")}function ZT(){return process.env.LMCTL_TOKEN_PATH??zT(KT(),".lmctl","cli-tokens.json")}function rm(t=Xs()){try{let e=JSON.parse(GT(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 QT(t,e=Xs()){JT(YT(e),{recursive:!0,mode:448}),VT(e,JSON.stringify(t,null,2));try{XT(e,384)}catch{}}function nm(t,e=ZT()){let r={};try{r=JSON.parse(GT(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};JT(YT(e),{recursive:!0,mode:448}),VT(e,JSON.stringify(s,null,2));try{XT(e,384)}catch{}}async function ev(t){let e=t.deviceAuthPath??Xs(),r=rm(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 nm({idToken:n.idToken,...n.accessToken!==void 0?{accessToken:n.accessToken}:{},refreshToken:r.refreshToken,...n.expiresAt!==void 0?{expiresAt:n.expiresAt}:{}},t.cliTokensPath??ZT()),{idToken:n.idToken,userId:r.userId}}var sm=E(()=>{"use strict";tm()});import{existsSync as TF,realpathSync as vF}from"node:fs";import{dirname as SF}from"node:path";function im(t){bF(t).catch(e=>{t.log?.(`[mailbox] prompt trigger failed: ${e instanceof Error?e.message:String(e)}`)})}async function bF(t){let e=t.payload.root_teamfile;try{e=vF(t.payload.root_teamfile)}catch(s){let i=`prompt root missing/unreadable: ${t.payload.root_teamfile}: ${s instanceof Error?s.message:String(s)}`;return Pn({rootTeamfile:t.payload.root_teamfile,receiverTeamfile:t.payload.root_teamfile,receiverAlias:"Lead",message:t.payload.text,promptId:t.payload.prompt_id,detail:i,reason:"root_unavailable"}),t.log?.(`[mailbox] ${i}`),{status:"error",response:null,error_detail:i}}if(t.store.getRootTeam(e)===null){let s=`prompt root is not registered: ${e}`;return Pn({rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,promptId:t.payload.prompt_id,detail:s,reason:"root_unregistered"}),t.log?.(`[mailbox] ${s}`),{status:"error",response:null,error_detail:s}}let r=IF(e);if("error"in r)return Pn({rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,promptId:t.payload.prompt_id,detail:r.error,reason:"root_invalid"}),t.log?.(`[mailbox] ${r.error}`),{status:"error",response:null,error_detail:r.error};let n=ar(t.store,{receiver_teamfile:e,receiver_alias:r.alias,sender_teamfile:`prompt:${t.payload.prompt_id}`,sender_alias:"operator",ttlMs:RF(t.env??process.env)});if(!n.acquired){let s=xF(r.alias,n.current);return Pn({rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,promptId:t.payload.prompt_id,detail:s,reason:"unavailable"}),t.log?.(`[mailbox] prompt rejected: ${s}`),{status:"error",response:null,error_detail:s}}try{let i=await(t.chat??Rt)({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}:{}}),o=i.status==="stalled",a=!o&&i.text.trim()==="",l=o?`provider stalled${i.stalledAfterMs!==void 0?` after ${i.stalledAfterMs}ms`:""}`:a?"provider returned empty response":null,d=o||a?"error":"ok";return d==="ok"?await NF(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:i.text,status:d,error_detail:null,log:t.log}):Pn({rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,promptId:t.payload.prompt_id,detail:l??"provider failed",reason:o?"stalled":"empty_response"}),{status:d,response:d==="error"?null:i.text,error_detail:l}}catch(s){let i=s instanceof Error?s.message:String(s);return Pn({rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,promptId:t.payload.prompt_id,detail:i,reason:"provider_error"}),t.log?.(`[mailbox] prompt provider error: ${i}`),{status:"error",response:null,error_detail:i}}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 Pn(t){C({event:"prompt_trigger_error",reason:t.reason,prompt_id:t.promptId,root_teamfile:t.rootTeamfile,sender_teamfile:t.rootTeamfile,sender_alias:"operator",receiver_teamfile:t.receiverTeamfile,receiver_alias:t.receiverAlias,error_detail:t.detail,message_preview:kF(t.message)})}function kF(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=500?e:`${e.slice(0,497)}...`}function IF(t){if(!TF(t))return{error:`prompt root missing/unreadable: ${t}`};let e=rt(t);if(e.parseErrors.length>0)return{error:`prompt root parse error: ${e.parseErrors.join("; ")}`};let r=Dt(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??SF(t)}}async function NF(t,e){let r=nv(e.message),n=e.response===null?null:nv(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 nv(t){return t.length<=tv?{text:t,truncated:!1}:{text:t.slice(0,tv),truncated:!0}}function AF(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}function xF(t,e){return e.sender_teamfile.startsWith("prompt:")?`${t} is busy servicing another prompt since ${e.started_at}`:AF(t,e)}function RF(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return rv;let r=Number(e);return!Number.isFinite(r)||r<=0?rv:r}var tv,rv,sv=E(()=>{"use strict";Lt();tr();me();lr();tv=256*1024,rv=30*60*1e3});import{chmodSync as cv,existsSync as LF,mkdirSync as uv,readFileSync as ja,writeFileSync as mv}from"node:fs";import{dirname as om,resolve as Ca,join as fv}from"node:path";import{fileURLToPath as OF}from"node:url";import{homedir as pv}from"node:os";import{CognitoIdentityClient as $F,GetIdCommand as CF}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as iv}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as MF,ListObjectsV2Command as DF,PutObjectCommand as jF,S3Client as ov}from"@aws-sdk/client-s3";function Gs(t={}){let e=t.env??process.env,r=t.tfstatePath!==void 0?[t.tfstatePath]:qF(t.selfUrl),n={},s;for(let k of r)if(LF(k)){n=WF(k),s=k;break}let i=(...k)=>{for(let A of k)if(typeof A=="string"&&A!=="")return A},o=i(e.LMCTL_NEXT_IDENTITY_POOL_ID,n.LMCTL_NEXT_IDENTITY_POOL_ID)??PF,a=i(e.LMCTL_NEXT_COGNITO_USER_POOL_ID,n.LMCTL_NEXT_COGNITO_USER_POOL_ID)??FF,l=i(e.LMCTL_NEXT_MAILBOX_BUCKET,e.LMCTL_NEXT_POLICY_BUCKET,n.LMCTL_NEXT_MAILBOX_BUCKET,n.LMCTL_NEXT_POLICY_BUCKET)??UF,d=i(e.AWS_REGION,e.AWS_DEFAULT_REGION)??"us-east-1",c=i(e.LMCTL_NEXT_COGNITO_CLIENT_ID,n.LMCTL_NEXT_COGNITO_CLIENT_ID)??Pa,u=[];o===void 0&&u.push("LMCTL_NEXT_IDENTITY_POOL_ID"),a===void 0&&u.push("LMCTL_NEXT_COGNITO_USER_POOL_ID"),l===void 0&&u.push("LMCTL_NEXT_MAILBOX_BUCKET");let m={missing:u,tfstateCandidatesChecked:r,...s!==void 0?{tfstatePathUsed:s}:{}};if(u.length>0)return m;let f=e.LMCTL_MAILBOX_POLL_MS,p=f!==void 0&&f.length>0?Number(f):void 0,h=Da(e.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),g=Da(e.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),_=Da(e.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),y=Da(e.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),T=i(e.LMCTL_MAILBOX_KEY),v=i(e.LMCTL_TOKEN_PATH);return m.config={identityPoolId:o,cognitoUserPoolId:a,cognitoClientId:c,region:d,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:_}:{},...y!==void 0?{chatLogPollIntervalMs:y}:{},...T!==void 0?{mailboxKey:T}:{},...v!==void 0?{tokenPath:v}:{}},m}function WF(t){try{let e=ja(t,"utf8"),n=JSON.parse(e).outputs??{},s={};for(let[i,o]of Object.entries(n))o!==null&&typeof o=="object"&&typeof o.value=="string"&&(s[i]=o.value);return s}catch{return{}}}function qF(t){let e=om(OF(t??import.meta.url));return[Ca(e,"..","..","..","..","infra","terraform","terraform.tfstate"),Ca(e,"..","..","..","..","..","infra","terraform","terraform.tfstate"),Ca(e,"..","..","..","infra","terraform","terraform.tfstate"),Ca(e,"..","..","infra","terraform","terraform.tfstate")]}function Da(t){if(t===void 0||t==="")return;let e=Number(t);if(!(!Number.isFinite(e)||e<=0))return e*1e3}function BF(t){let e=HF(t.intervalMs)??_v,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,i,o=!1,a=!1,l=()=>{try{if(s!==null){let u=s.load(s.key);if(u!==null)return i=u.last_pushed_id,!0}return i=t.store.getMaxTeamChatLogId(),s!==null&&s.save({cursor_key:s.key,last_pushed_id:i,updated_at:new Date(n()).toISOString()}),!0}catch(u){return t.log?.(`[mailbox] daemon_event chat_log seed failed: ${u instanceof Error?u.message:String(u)}`),!1}};l();let d=async()=>{if(!(a||o)){o=!0;try{if(i===void 0&&!l())return;let u=t.store.listTeamChatLogSinceId(i,r);for(let m of u){let f={kind:"daemon_event",event:"chat_log",ts:n(),entry:{id:m.id,root_teamfile:m.root_teamfile,sender_teamfile:m.sender_teamfile,sender_alias:m.sender_alias,receiver_teamfile:m.receiver_teamfile,receiver_alias:m.receiver_alias,message:m.message,response:m.response,status:m.status,created_at:m.created_at}};await t.publishDaemonEvent(f),s!==null&&s.save({cursor_key:s.key,last_pushed_id:m.id,updated_at:new Date(n()).toISOString()}),i=Math.max(i,m.id)}}catch(u){t.log?.(`[mailbox] daemon_event chat_log tail failed: ${u instanceof Error?u.message:String(u)}`)}finally{o=!1}}},c=setInterval(()=>{d()},e);return typeof c.unref=="function"&&c.unref(),{pollNow:d,stop(){a=!0,clearInterval(c)}}}function HF(t){return typeof t=="number"&&Number.isFinite(t)&&t>0?t:void 0}async function hv(t){let e=t.tokenPath??fv(pv(),".lmctl","cli-tokens.json"),r=lv(t.tokenPath);if(BT(r.cognito?.idToken)&&rm()!==null)try{await ev({region:t.region,clientId:t.cognitoClientId??Pa,cliTokensPath:e}),r=lv(t.tokenPath),t.log?.("[mx-mailbox] refreshed IdToken from device-auth refresh token")}catch(R){let Z=R instanceof Error?R.message:String(R);t.log?.(`[mx-mailbox] device-auth refresh failed: ${Z}`)}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}`,i=r.cognito.identityId,o=!1;i===void 0||i===""?i=await dv({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}):(o=!0,t.log?.(`[mx-mailbox] using cached identityId from cli-tokens (skipping GetId) for ${i}`));let a=iv({identityId:i,logins:{[s]:n},clientConfig:{region:t.region}}),l=new ov({region:t.region,credentials:a}),d={ListObjectsV2Command:DF,GetObjectCommand:MF,PutObjectCommand:jF},c=Hs(n),u=c??i,m=t.deviceId,f=Ln({identityId:i,userId:c,deviceId:m,mailboxKey:t.mailboxKey}),p=t.cursorStore,h;if(p!==void 0){let R=p.loadMailboxCursor(u,f);if(R!==null)h=R.last_processed_seq??void 0,t.log?.(`[mx-mailbox] resumed seq cursor=${h??"(sentinel)"} for user_id=${u}`);else{let Z=!1,q=0;for(;!Z&&q<2;){q+=1;try{let b=Zo(f,"web"),I=0,L;do{let U=await l.send(new d.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:b,MaxKeys:1e3,...L!==void 0?{ContinuationToken:L}:{}}));for(let j of U.Contents??[]){let D=Qo(j.Key??"",f,"web");D!==void 0&&D>I&&(I=D)}L=U.IsTruncated===!0?U.NextContinuationToken:void 0}while(L!==void 0);h=I,t.log?.(`[mx-mailbox] cold start: seeded seq cursor=${I} for user_id=${u}`),Z=!0}catch(b){let I=b instanceof Error?b.message:String(b);if(o&&q===1&&GF(b)){t.log?.(`[mx-mailbox] cached identityId rejected by cognito (${I}); clearing + refreshing`),JF(e),o=!1,i=await dv({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}),a=iv({identityId:i,logins:{[s]:n},clientConfig:{region:t.region}}),l=new ov({region:t.region,credentials:a}),f=Ln({identityId:i,userId:c,deviceId:m,mailboxKey:t.mailboxKey});continue}t.log?.(`[mx-mailbox] cold start seq probe failed: ${I}`);break}}p.saveMailboxCursor({user_id:u,mailbox_key:f,last_processed_version_id:null,last_processed_seq:h??null,last_processed_at:new Date().toISOString()})}}let g=null,_=t.terminalSessionManager,y=t.persistentSessionManager,T=t.promptTriggerStore,v=new La,k=new Hr({bucket:t.mailboxBucket,identityId:i,...c!==null?{userId:c}:{},...m!==void 0?{deviceId:m}:{},...t.mailboxKey!==void 0?{mailboxKey:t.mailboxKey}:{},s3:l,commands:d,selfRole:"agent",onS3Op:R=>v.record(R),onMessage:async R=>{if(_!==void 0&&Vu(R.payload)){_.onInbound(R.payload);return}if(y!==void 0&&Ku(R.payload)){await y.onInbound(R.payload);return}if(!zu(R.payload)){if(T!==void 0&&Zu(R.payload)){im({store:T,payload:R.payload,log:t.log});return}g!==null&&await g.handleIncoming(R.payload,R)}},...p!==void 0?{onCursorAdvance:R=>{p.saveMailboxCursor({user_id:u,mailbox_key:f,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:k,...t.log!==void 0?{log:t.log}:{}}),_!==void 0&&_.setPublish(async R=>k.putMessage({conversation_id:`terminal:${R.session_id}`,payload:R})),y!==void 0&&y.setPublish(async R=>k.putMessage({conversation_id:`provider:${R.session_id}`,payload:R}));let A=R=>k.putMessage({conversation_id:Yu,payload:R});k.start();let z=t.chatLogTailStore===void 0?void 0:BF({store:t.chatLogTailStore,publishDaemonEvent:A,cursorKey:f,intervalMs:t.chatLogPollIntervalMs??t.readIntervalMs??t.pollIntervalMs??_v,log:t.log});t.log?.(`[mx-mailbox] agent polling ${f} (bucket=${t.mailboxBucket})`);let Se=t.deviceId??i,W=`${u}/usage/`,F;return F=t.usageStore===void 0?void 0:CT({meter:v,store:t.usageStore,userId:u,deviceId:Se,ceilingUsd:t.usageQuotaUsd??1/0,onQuotaExceeded:({period:R,costUsd:Z,ceilingUsd:q})=>{t.log?.(`[usage] month ${R} cost $${Z.toFixed(4)} >= ceiling $${q} \u2014 blocking mailbox`),k.stop().catch(()=>{}),F?.stop()},publishOwnRollup:async(R,Z)=>{await l.send(new d.PutObjectCommand({Bucket:t.mailboxBucket,Key:`${W}${Se}-${R}.json`,Body:JSON.stringify({...Z,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async R=>{let Z={put:0,get:0,list:0},q;do{let b=await l.send(new d.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:W,MaxKeys:1e3,...q!==void 0?{ContinuationToken:q}:{}}));for(let I of b.Contents??[]){let L=I.Key??"";if(L.endsWith(`-${R}.json`))try{let U=await l.send(new d.GetObjectCommand({Bucket:t.mailboxBucket,Key:L}));if(U.Body===void 0)continue;let j=JSON.parse(await U.Body.transformToString("utf-8"));Z.put+=j.put??0,Z.get+=j.get??0,Z.list+=j.list??0}catch{}}q=b.IsTruncated===!0?b.NextContinuationToken:void 0}while(q!==void 0);return Z},intervalMs:t.usageFlushIntervalMs??36e5,...t.log!==void 0?{log:t.log}:{}}),{identityId:i,mailbox:k,fetchClient:g,publishDaemonEvent:A,async stop(){z?.stop(),F!==void 0&&(await F.flushNow().catch(()=>{}),F.stop()),await g.stop().catch(()=>{}),await k.stop().catch(()=>{})}}}async function gv(t){let e=t.s3!==void 0&&t.commands!==void 0?{s3:t.s3,commands:t.commands}:Ra(t.rootDir),r=Ln({identityId:Js,userId:Js,deviceId:av}),n=null,s=t.terminalSessionManager,i=t.persistentSessionManager,o=t.promptTriggerStore,a=new Hr({bucket:"local",identityId:Js,userId:Js,deviceId:av,s3:e.s3,commands:e.commands,selfRole:"agent",onMessage:async d=>{if(s!==void 0&&Vu(d.payload)){s.onInbound(d.payload);return}if(i!==void 0&&Ku(d.payload)){await i.onInbound(d.payload);return}if(!zu(d.payload)){if(o!==void 0&&Zu(d.payload)){im({store:o,payload:d.payload,log:t.log});return}n!==null&&await n.handleIncoming(d.payload,d)}},pollIntervalMs:t.pollIntervalMs??Ma,readIntervalMs:t.readIntervalMs??Ma,heartbeatIdleMs:t.heartbeatIdleMs??Ma,backoffReadIntervalMs:t.backoffReadIntervalMs??Ma});n=new Bs({client:a,...t.log!==void 0?{log:t.log}:{}}),s!==void 0&&s.setPublish(async d=>a.putMessage({conversation_id:`terminal:${d.session_id}`,payload:d})),i!==void 0&&i.setPublish(async d=>a.putMessage({conversation_id:`provider:${d.session_id}`,payload:d}));let l=d=>a.putMessage({conversation_id:Yu,payload:d});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 lv(t){let e=t??fv(pv(),".lmctl","cli-tokens.json");try{let r=ja(e,"utf8");return JSON.parse(r)}catch{return{}}}function XF(t,e){if(e===void 0||e==="")return;let r={};try{let s=ja(t,"utf8");r=JSON.parse(s)}catch{}if(r.cognito===void 0)return;let n={...r,cognito:{...r.cognito,identityId:e}};uv(om(t),{recursive:!0,mode:448}),mv(t,JSON.stringify(n,null,2));try{cv(t,384)}catch{}}function JF(t){let e={};try{let n=ja(t,"utf8");e=JSON.parse(n)}catch{return}if(e.cognito===void 0)return;let r={...e,cognito:{...e.cognito}};delete r.cognito.identityId,uv(om(t),{recursive:!0,mode:448}),mv(t,JSON.stringify(r,null,2));try{cv(t,384)}catch{}}async function dv(t){t.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let r=await new $F({region:t.region}).send(new CF({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(r.IdentityId===void 0||r.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{XF(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 GF(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 _v,Ma,Pa,PF,FF,UF,Js,av,am=E(()=>{"use strict";na();Bu();Ju();MT();jT();PT();FT();UT();Qu();ea();em();sm();sv();_v=3e3,Ma=1e3,Pa="79u5jhkk46qofog661c9i0bdcs",PF="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",FF="us-east-1_4iUdFggDn",UF="lmctl-next-preview-mailbox-254332045686";Js="local",av="local"});import{spawn as um}from"node:child_process";import{createInterface as yv}from"node:readline";var lm,dm,cm,Ev,wv=E(()=>{"use strict";Li();me();lm=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=um(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=n,this.rl=yv({input:n.stdout}),this.rl.on("line",s=>{r.generation===r.currentGeneration()&&this.handleLine(s)}),n.stderr?.on("data",s=>{if(r.generation!==r.currentGeneration())return;let i=s instanceof Buffer?s.toString("utf8"):String(s);r.emit({event_type:"notification",payload:{source:"stderr",text:i}})}),await this.rpc("initialize",{clientInfo:{name:"lmctl-dt3",title:"lmctl DT-3",version:"0.1.0"},capabilities:{experimentalApi:!1}}),this.notify("initialized",{}),this.threadId!==void 0&&this.threadId!=="")try{await this.rpc("thread/resume",{threadId:this.threadId,approvalPolicy:"never",sandbox:"danger-full-access"}),r.emit({event_type:"thread_started",payload:{thread_id:this.threadId,resumed:!0}})}catch{let i=(await this.rpc("thread/start",{cwd:e.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,o=typeof i?.id=="string"?i.id:void 0;this.threadId=o,r.emit({event_type:"thread_started",payload:{thread_id:o,resumed:!1}})}else{let i=(await this.rpc("thread/start",{cwd:e.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,o=typeof i?.id=="string"?i.id:void 0;this.threadId=o,r.emit({event_type:"thread_started",payload:{thread_id:o,resumed:!1}})}return n}async sendTurn(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,i=typeof s?.id=="string"?s.id:void 0;if(i!==void 0){let o=this.ctx?.turnMap.get(r);this.ctx?.turnMap.delete(r),o!==void 0&&this.ctx?.turnMap.set(i,o)}}catch(n){throw this.ctx?.turnMap.delete(r),n}}async stop(){if(this.closed=!0,this.rl!==void 0&&(this.rl.close(),this.rl=void 0),this.child?.stdin!==null&&this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}for(let 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 i=this.nextRpcId++;this.pending.set(i,{resolve:n,reject:s});let o=JSON.stringify({jsonrpc:"2.0",id:i,method:e,params:r});try{this.child.stdin.write(o+`
2312
+ Use: <path>.lmctl[:<alias>] | <path>.lmctl <alias> | <sessionid> | --run <id>`}}var ve,UP,WP,ka,wt=E(()=>{"use strict";tr();rr();ve=class extends Error{constructor(e){super(e),this.name="ChatTargetError"}},UP=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,WP=/^ses_[A-Za-z0-9_-]+$/,ka=/^[A-Za-z][A-Za-z0-9_-]*$/});function Ia(t){return HP.has(t)}function Du(){return Mu===null&&(Mu=Nt(xt())),Mu}function ju(t,e,r={}){if(!Ia(t))return null;try{let n=Du().getAdapter?.(t);if(n===void 0)return null;let s=n.resumeCommand(e).trim();if(s.length===0)return null;let i=s.split(/\s+/),o=t==="codex"&&r.isLead===!0?Ai({warn:()=>{}}):[],a=r.model!==void 0&&r.model.trim().length>0?BP[t]?.(r.model):void 0;return r.model!==void 0&&r.model.trim().length>0&&a===void 0&&r.onModelIgnored?.({provider:t,model:r.model,reason:`${t} terminal resume does not implement per-session model selection`}),[...i,...a??[],...o,...pT[t]??[]]}catch{return null}}function Na(t,e,r={}){let n=ju(t,e,r);return n===null?null:n.join(" ")}function Be(t,e){return Du().getSession(t,e)}async function jn(t){return(await Du().resolveSessions(t)).map(r=>r.provider.name)}var pT,BP,HP,_T,Mu,nr=E(()=>{"use strict";Lt();Jl();pT={claude:["--dangerously-skip-permissions"],codex:["--dangerously-bypass-approvals-and-sandbox"],gemini:["-y"],copilot:["--yolo"],opencode:[],qwen:["--approval-mode","yolo"],agy:[],lmplayer:[]},BP={claude:t=>["--model",t],codex:t=>["--model",t],gemini:t=>["--model",t],opencode:t=>["--model",t],qwen:t=>["--model",t],agy:t=>["--model",t],lmplayer:t=>["--model",t]},HP=new Set(Object.keys(pT)),_T=/^[\w.:-]+$/;Mu=null});function XP(t=process.env){let e=t.LMCTL_SESSION_IDLE_TIMEOUT_MS;if(e===void 0||e.trim()==="")return hT;let r=Number(e);return!Number.isFinite(r)||r<=0?hT:r}async function JP(t,e,r){try{let n=Me(e,r,t),s=n.sessionid;if(typeof s!="string"||s.trim()===""||s===".")return null;let i;if(typeof n.provider=="string"&&n.provider.trim()!=="")i=n.provider;else{let d=await jn(s);if(d.length!==1)return null;i=d[0]}let o=await Be(s,i);if(o===null)return null;let a=o.modifiedAt;if(!(a instanceof Date))return null;let l=a.getTime();return Number.isFinite(l)?Date.now()-l:null}catch{return null}}async function Aa(t,e,r,n,s){if(!e.busy||e.reason!=="in-flight")return!1;let i=s??XP(),o=await JP(t,r,n),a=o!==null&&o>=i;return a&&C({event:"session_idle_reclaim",receiver_teamfile:r,receiver_alias:n,idle_ms:o,idle_minutes:o===null?null:Math.round(o/6e4),threshold_ms:i,reason:"in-flight holder idle past session-idle threshold; lease will be force-reclaimed"}),a}var hT,Pu=E(()=>{"use strict";me();nr();wt();hT=36e5});function GP(t=process.env){let e=t.LMCTL_DAEMON_MAILBOX_RELAY_MAX_BATCHES;if(e===void 0||e.trim()==="")return gT;let r=Number(e);return!Number.isFinite(r)||r<=0?gT:Math.max(1,Math.trunc(r))}async function ET(t){let e=t.env??process.env,r=t.maxBatches??GP(e),n=eF(t.dal),s={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0};QP(t.dal,e);let i=new Set;for(;s.scanned<r;){let o=t.dal.listRelayMailboxLanes(r).find(l=>!i.has(yT(l)));if(o===void 0)break;i.add(yT(o)),s.scanned+=1;let a=await VP(t.dal,n,e,o);s.delivered+=a.delivered,s.skipped_busy+=a.skipped_busy,s.skipped_terminal+=a.skipped_terminal,s.errors+=a.errors}return s}function yT(t){return JSON.stringify([t.sender_teamfile,t.sender_alias,t.receiver_teamfile,t.receiver_alias])}async function VP(t,e,r,n){let s={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0},i=Wt(t,n.receiver_teamfile,n.receiver_alias),o=!1;if(i.busy){if(!await Aa(t,i,n.receiver_teamfile,n.receiver_alias))return i.reason==="terminal-held"?{...s,skipped_terminal:1}:{...s,skipped_busy:1};o=!0}let a=null;try{let l=Me(n.receiver_teamfile,n.receiver_alias,t),d=ar(t,{receiver_teamfile:n.receiver_teamfile,receiver_alias:n.receiver_alias,sender_teamfile:n.sender_teamfile,sender_alias:n.sender_alias,ttlMs:br(),...o?{force:!0}:{}});if(!d.acquired)return{...s,skipped_busy:1};if(a=d.lease,n.message_type==="response"){let u=await Yw({sender:{teamfile:n.sender_teamfile,alias:n.sender_alias},receiver:{teamfile:n.receiver_teamfile,alias:n.receiver_alias,provider:l.provider,sessionId:l.sessionid,cwd:l.sessiondir,...l.model!==void 0?{model:l.model}:{},...l.effort!==void 0?{effort:l.effort}:{},...l.isLead!==void 0?{isLead:l.isLead}:{}},io:e,permissionMode:"yolo",env:r});return zP(u)}let c=await ga({sender:{teamfile:n.sender_teamfile,alias:n.sender_alias},receiver:{teamfile:n.receiver_teamfile,alias:n.receiver_alias,provider:l.provider,sessionId:l.sessionid,cwd:l.sessiondir,...l.model!==void 0?{model:l.model}:{},...l.effort!==void 0?{effort:l.effort}:{},...l.isLead!==void 0?{isLead:l.isLead}:{}},io:e,permissionMode:"yolo",env:r,finalize:"caller"});return YP(t,c)}catch(l){return KP(t,n,`relay delivery error: ${l instanceof Error?l.message:String(l)}`)}finally{if(a!==null)try{t.releaseAgentInflight(a)}catch{}}}function KP(t,e,r){let n={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0};try{let s=e.message_type==="response"?t.listEnqueuedResponseMailFromSender(e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias):t.listEnqueuedRequestMailFromSender(e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias),i=e.message_type==="response"?t.markMailDelivered(s.map(o=>o.id),r,new Date().toISOString()):t.markRelayRequestDeliveredAndEnqueueResponses(s,r,new Date().toISOString()).marked;return{...n,delivered:i,errors:1}}catch{return{...n,errors:1}}}function YP(t,e){let r={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0},n=ZP(e),s=new Date().toISOString(),{marked:i}=t.markRelayRequestDeliveredAndEnqueueResponses(e.queued,n,s);return{...r,delivered:i,errors:e.status==="ok"?0:1}}function zP(t){return{...{scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0},delivered:t.deliveredIds.length,errors:t.status==="ok"?0:1}}function ZP(t){return t.status==="ok"?t.receipt:t.status==="stalled"?`relay delivery error: provider stalled${t.stalledAfterMs!==void 0?` after ${t.stalledAfterMs}ms`:""}
2313
+ ${t.receipt}`:`relay delivery error: ${t.error}`}function QP(t,e){t.reclaimStaleMailboxDeliveries(new Date(Date.now()-bu(e)).toISOString())}function eF(t){return{stdout:{write:()=>{}},stderr:{write:()=>{}},dal:t}}var gT,wT=E(()=>{"use strict";lr();ku();Ea();wt();Pu();gT=10});function qs(){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 rF(t=process.env){let e=t.LMCTL_DAEMON_FEATURES;if(e===void 0)return new Set(["mailbox-relay"]);if(e.trim()==="")return new Set;let r=new Set;for(let n of e.split(",")){let s=n.trim();if(s!==""){if(s==="all")return new Set(TT);tF.has(s)&&r.add(s)}}return r}function vT(t){let e=t.intervalMs??qs(),r=t.runOnceFn??Br,n=new Set(t.features??rF()),s={running:t.autoStart!==!1,in_flight:!1,interval_ms:e,enabled_features:[...n].sort(),cycles:0,jobs_processed:0,last_jobs_processed:0,last_started_at:null,last_finished_at:null,last_error:null,last_session_sizes_recorded:0,last_session_size_failures:0,last_intake_scanned:0,last_intake_new_jobs:0,last_intake_failures:0,last_session_hung_detected:0,last_session_monitor_checked_at:null,last_session_monitor_error:null,last_mailbox_relay_scanned:0,last_mailbox_relay_delivered:0,last_mailbox_relay_errors:0},i=null,o=null,a=null,l=null,d=null;n.has("rollup-updater")&&t.startRollupUpdaterFn!==!1&&(d=(t.startRollupUpdaterFn??qw)(t.dal));let c=f=>{s.running&&(i=setTimeout(()=>{m.runCycle().finally(()=>c(e))},f))},u=f=>{s.running&&(o=setTimeout(()=>{l===null&&(l=ST(t.dal,n,t.monitorSessionActivityFn??Zd,e,s).finally(()=>{l=null})),l.finally(()=>u(Qd(t.dal,e)))},f))},m={state:s,runCycle:async()=>(a!==null||(a=nF(t.dal,r,t.collectSessionSizesFn??uh,t.scanIntakeFn??No,t.monitorSessionActivityFn??Zd,t.mailboxRelayFn??ET,t.worker_id??"daemon",e,n,s).finally(()=>{a=null})),a),stop:async()=>{s.running=!1,i!==null&&clearTimeout(i),o!==null&&clearTimeout(o),d?.stop(),a!==null&&await a.catch(()=>{}),l!==null&&await l.catch(()=>{})}};if(s.running){let f=t.firstDelayMs??5e3;c(f),n.has("session-monitor")&&u(f)}return m}async function nF(t,e,r,n,s,i,o,a,l,d){d.in_flight=!0,d.last_started_at=new Date().toISOString(),d.last_error=null;let c=[],u=0,m=0,f=[],p=null,h=sF();try{if(l.has("durable-memory-policies")&&yE({dal:t}),l.has("drift-detectors")&&Xw({dal:t}),l.has("intake")&&(f=await n(t)),l.has("job-worker"))for(;;){let g=await e({dal:t,worker_id:o,lease_ms:6e5});if(g===null)break;c.push(g)}if(l.has("mailbox-relay")&&(h=await i({dal:t})),l.has("session-size")){let g=await r(t);u=g.recorded,m=g.failed}l.has("session-monitor")&&(p=await ST(t,l,s,a,d))}catch(g){d.last_error=g instanceof Error?g.message:String(g);try{t.raiseAttention({kind:"daemon_worker_failed",severity:"error",payload:JSON.stringify({error:d.last_error})})}catch{}}finally{d.in_flight=!1,d.cycles+=1,d.last_jobs_processed=c.length,d.last_session_sizes_recorded=u,d.last_session_size_failures=m,d.last_intake_scanned=f.reduce((g,_)=>g+_.scanned,0),d.last_intake_new_jobs=f.reduce((g,_)=>g+_.new_jobs,0),d.last_intake_failures=f.filter(g=>g.error!==void 0).length,d.last_session_hung_detected=p?.hung_detected??0,d.last_mailbox_relay_scanned=h.scanned,d.last_mailbox_relay_delivered=h.delivered,d.last_mailbox_relay_errors=h.errors,d.jobs_processed+=c.length,d.last_finished_at=new Date().toISOString()}return{jobs_processed:c.length,outcomes:c,session_sizes_recorded:u,session_size_failures:m,intake:f,session_monitor:p,mailbox_relay:h}}function sF(){return{scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0}}async function ST(t,e,r,n,s){if(!e.has("session-monitor"))return null;let i=Qd(t,n),o=Date.now();if(s.last_session_monitor_checked_at!==null){let a=Date.parse(s.last_session_monitor_checked_at);if(Number.isFinite(a)&&o-a<i)return null}s.last_session_monitor_checked_at=new Date(o).toISOString(),s.last_session_monitor_error=null;try{return await r({dal:t,nowMs:o})}catch(a){s.last_session_monitor_error=a instanceof Error?a.message:String(a);try{t.raiseAttention({kind:"daemon_session_monitor_failed",severity:"error",payload:JSON.stringify({error:s.last_session_monitor_error})})}catch{}return null}}var TT,tF,Fu=E(()=>{"use strict";Sc();Ko();eu();Qi();Bw();Jw();ec();wT();TT=["durable-memory-policies","drift-detectors","intake","job-worker","mailbox-relay","session-size","session-monitor","rollup-updater"],tF=new Set(TT)});function bT(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 kT=E(()=>{"use strict"});import{mkdirSync as iF,readFileSync as oF,readdirSync as aF,statSync as lF,writeFileSync as dF}from"node:fs";import{dirname as cF,join as NT,sep as IT}from"node:path";function xa(t){return{s3:{async send(n){let s=n;switch(s._localfsTag){case AT:return uF(t,s.input);case xT:return mF(t,s.input);case RT:return fF(t,s.input);default:throw new Error("createLocalFsS3Client: unknown command")}}},commands:{ListObjectsV2Command:qu,GetObjectCommand:Wu,PutObjectCommand:Uu}}}function uF(t,e){let r=LT(t,e.Key);return iF(cF(r),{recursive:!0}),dF(r,e.Body),{}}function mF(t,e){let r=LT(t,e.Key),n;try{n=oF(r)}catch(i){throw i.code==="ENOENT"?Object.assign(new Error("NoSuchKey"),{name:"NoSuchKey"}):i}let s=n.toString("utf-8");return{Body:{transformToString:async()=>s}}}function fF(t,e){let r=e.Prefix??"";OT(r);let s=pF(t).sort((c,u)=>c.key<u.key?-1:c.key>u.key?1:0).filter(c=>c.key.startsWith(r)),i=e.ContinuationToken;i!==void 0&&i!==""&&(s=s.filter(c=>c.key>i));let o=typeof e.MaxKeys=="number"&&Number.isFinite(e.MaxKeys)&&e.MaxKeys>0?Math.floor(e.MaxKeys):void 0,a=s,l=!1;o!==void 0&&s.length>o&&(a=s.slice(0,o),l=!0);let d={Contents:a.map(c=>({Key:c.key,LastModified:c.lastModified})),IsTruncated:l};return l&&(d.NextContinuationToken=a[a.length-1].key),d}function LT(t,e){return OT(e),NT(t,e)}function OT(t){if(t.split("/").includes(".."))throw new Error(`localfs-s3-client: refusing key/prefix with '..': ${t}`)}function pF(t){let e=[],r=(n,s)=>{let i;try{i=aF(n,{withFileTypes:!0})}catch(o){if(o.code==="ENOENT")return;throw o}for(let o of i){let a=s===""?o.name:`${s}/${o.name}`,l=NT(n,o.name);if(o.isDirectory())r(l,a);else if(o.isFile()){let d=IT==="/"?a:a.split(IT).join("/");e.push({key:d,lastModified:lF(l).mtime})}}};return r(t,""),e}var AT,xT,RT,Uu,Wu,qu,Bu=E(()=>{"use strict";AT="localfs-put",xT="localfs-get",RT="localfs-list",Uu=class{input;_localfsTag=AT;constructor(e){this.input=e}},Wu=class{input;_localfsTag=xT;constructor(e){this.input=e}},qu=class{input;_localfsTag=RT;constructor(e){this.input=e}}});function $T(){return{put:0,get:0,list:0}}function Hu(t,e=_F){return t.put*e.putUsd+t.get*e.getUsd+t.list*e.listUsd}function Xu(t){let e=new Date(t),r=e.getUTCFullYear(),n=String(e.getUTCMonth()+1).padStart(2,"0");return`${r}-${n}`}var _F,Ra,Ju=E(()=>{"use strict";_F={putUsd:5e-6,getUsd:40000000000000003e-23,listUsd:5e-6};Ra=class{counts=$T();record(e,r=1){this.counts[e]+=r}peek(){return{...this.counts}}drain(){let e={...this.counts};return this.counts=$T(),e}estimateCostUsd(e){return Hu(this.counts,e)}}});function CT(t){let e=t.now??Date.now,r=t.timers??hF,n=null,s=null;async function i(){let l=e(),d=Xu(l),c=t.meter.drain();(c.put>0||c.get>0||c.list>0)&&t.store.addUsage({user_id:t.userId,device_id:t.deviceId,period:d,put:c.put,get:c.get,list:c.list,updated_at:new Date(l).toISOString()});let u=t.store.loadUsage(t.userId,t.deviceId,d),m=u?{put:u.put_count,get:u.get_count,list:u.list_count}:{put:0,get:0,list:0};if(t.publishOwnRollup!==void 0)try{await t.publishOwnRollup(d,m)}catch(h){t.log?.(`[usage] publish rollup failed: ${h instanceof Error?h.message:String(h)}`)}let f=m;if(t.readUserTotal!==void 0)try{f=await t.readUserTotal(d)}catch(h){t.log?.(`[usage] read user total failed: ${h instanceof Error?h.message:String(h)}`),f=m}let p=Hu(f);if(n!==d&&p>=t.ceilingUsd){n=d,t.log?.(`[usage] quota exceeded period=${d} cost=$${p.toFixed(4)} >= ceiling $${t.ceilingUsd}`);try{t.onQuotaExceeded({period:d,costUsd:p,ceilingUsd:t.ceilingUsd})}catch(h){t.log?.(`[usage] onQuotaExceeded threw: ${h instanceof Error?h.message:String(h)}`)}}}function o(){return s=(s??Promise.resolve()).then(()=>i()).catch(()=>{}),s}let a=r.setInterval(()=>{o()},t.intervalMs);return{stop(){r.clearInterval(a)},flushNow(){return o()},isOverQuota(){return n!==null&&n===Xu(e())}}}var hF,MT=E(()=>{"use strict";Ju();hF={setInterval:(t,e)=>setInterval(t,e),clearInterval:t=>clearInterval(t)}});var Gu=E(()=>{"use strict";ea();ra();ra()});function gF(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 i=s;return typeof i.status!="number"?null:{message_id:e.message_id,reply_to:e.reply_to,response:i}}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 yF(t){return t.reply_to!==void 0&&t.response!==void 0}function EF(t){if(typeof t!="object"||t===null)return;let e=t.conversation_id;return typeof e=="string"?e:void 0}function DT(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 La,Bs,jT=E(()=>{"use strict";Gu();La=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 La("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=Qt(this.now(),this.random);if(this.pending.has(s))throw new Error(`MailboxFetchClient.fetch: duplicate message_id=${s}`);let i=r?.conversationId??s,o={message_id:s,request:e};return new Promise((a,l)=>{let d=r?.abortSignal,c;if(d!==void 0){if(d.aborted){l(DT(d));return}c=()=>{this.pending.has(s)&&(this.pending.delete(s),l(DT(d)))},d.addEventListener("abort",c,{once:!0})}this.pending.set(s,{resolve:a,reject:l,...c!==void 0?{abortListener:c}:{},...d!==void 0?{abortSignal:d}:{}}),this.client.putMessage({conversation_id:i,payload:o}).catch(u=>{let m=this.pending.get(s);m!==void 0&&(this.pending.delete(s),m.abortListener!==void 0&&m.abortSignal!==void 0&&m.abortSignal.removeEventListener("abort",m.abortListener),m.reject(u))})})}async stop(){if(this.stopped)return;this.stopped=!0;let e=Array.from(this.pending.values());this.pending.clear();let r=new La;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=gF(e);if(n===null){this.log("MailboxFetchClient: dropping non-envelope inbound payload");return}if(yF(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??EF(e)??n.message_id,i;try{i=await this.requestHandler(n.request)}catch(l){let d=l instanceof Error?l.message:String(l),c=typeof l.code=="string"?l.code:"INTERNAL_ERROR";i={status:500,headers:{"content-type":"application/json"},body:{error:c,message:d}}}let a={message_id:Qt(this.now(),this.random),reply_to:n.message_id,response:i};try{await this.client.putMessage({conversation_id:s,payload:a})}catch(l){this.log(`MailboxFetchClient: response PUT failed for reply_to=${n.message_id}: ${l instanceof Error?l.message:String(l)}`)}}}});function Vu(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 PT=E(()=>{"use strict"});function Ku(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 FT=E(()=>{"use strict"});function zu(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 Yu,UT=E(()=>{"use strict";Yu="daemon:events"});function qT(t){return{kind:"prompt",prompt_id:t.prompt_id??Qt(t.now?.()??Date.now(),t.random??Math.random),root_teamfile:t.root_teamfile,text:t.text}}function Zu(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 WT,Qu=E(()=>{"use strict";Gu();WT="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 wF(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 BT(t,e=60){if(typeof t!="string"||t==="")return!0;let r=wF(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 em=E(()=>{"use strict"});async function Oa(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":TF},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 d=JSON.parse(s);l=d.message??d.__type??s}catch{}throw new Error(`cognito_refresh_failed: ${n.status} ${l}`)}let o=JSON.parse(s).AuthenticationResult,a=o?.IdToken;if(typeof a!="string"||a==="")throw new Error("cognito_refresh_no_id_token: InitiateAuth returned no IdToken");return{idToken:a,...typeof o?.AccessToken=="string"&&o.AccessToken!==""?{accessToken:o.AccessToken}:{},...typeof o?.ExpiresIn=="number"&&Number.isFinite(o.ExpiresIn)?{expiresAt:Date.now()+o.ExpiresIn*1e3}:{}}}var TF,tm=E(()=>{"use strict";TF="AWSCognitoIdentityProviderService.InitiateAuth"});import{chmodSync as XT,mkdirSync as JT,readFileSync as GT,writeFileSync as VT}from"node:fs";import{homedir as KT}from"node:os";import{dirname as YT,join as zT}from"node:path";function Xs(){return process.env.LMCTL_DEVICE_AUTH_PATH??zT(KT(),".lmctl","device-auth.json")}function ZT(){return process.env.LMCTL_TOKEN_PATH??zT(KT(),".lmctl","cli-tokens.json")}function rm(t=Xs()){try{let e=JSON.parse(GT(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 QT(t,e=Xs()){JT(YT(e),{recursive:!0,mode:448}),VT(e,JSON.stringify(t,null,2));try{XT(e,384)}catch{}}function nm(t,e=ZT()){let r={};try{r=JSON.parse(GT(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};JT(YT(e),{recursive:!0,mode:448}),VT(e,JSON.stringify(s,null,2));try{XT(e,384)}catch{}}async function ev(t){let e=t.deviceAuthPath??Xs(),r=rm(e);if(r===null)throw new Error("device_auth_not_found: no ~/.lmctl/device-auth.json; run `lmctl device login` first");let n=await Oa({region:t.region,clientId:t.clientId,refreshToken:r.refreshToken,...t.fetchImpl!==void 0?{fetchImpl:t.fetchImpl}:{}});return nm({idToken:n.idToken,...n.accessToken!==void 0?{accessToken:n.accessToken}:{},refreshToken:r.refreshToken,...n.expiresAt!==void 0?{expiresAt:n.expiresAt}:{}},t.cliTokensPath??ZT()),{idToken:n.idToken,userId:r.userId}}var sm=E(()=>{"use strict";tm()});import{existsSync as vF,realpathSync as SF}from"node:fs";import{dirname as bF}from"node:path";function im(t){kF(t).catch(e=>{t.log?.(`[mailbox] prompt trigger failed: ${e instanceof Error?e.message:String(e)}`)})}async function kF(t){let e=t.payload.root_teamfile;try{e=SF(t.payload.root_teamfile)}catch(s){let i=`prompt root missing/unreadable: ${t.payload.root_teamfile}: ${s instanceof Error?s.message:String(s)}`;return Pn({rootTeamfile:t.payload.root_teamfile,receiverTeamfile:t.payload.root_teamfile,receiverAlias:"Lead",message:t.payload.text,promptId:t.payload.prompt_id,detail:i,reason:"root_unavailable"}),t.log?.(`[mailbox] ${i}`),{status:"error",response:null,error_detail:i}}if(t.store.getRootTeam(e)===null){let s=`prompt root is not registered: ${e}`;return Pn({rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,promptId:t.payload.prompt_id,detail:s,reason:"root_unregistered"}),t.log?.(`[mailbox] ${s}`),{status:"error",response:null,error_detail:s}}let r=NF(e);if("error"in r)return Pn({rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,promptId:t.payload.prompt_id,detail:r.error,reason:"root_invalid"}),t.log?.(`[mailbox] ${r.error}`),{status:"error",response:null,error_detail:r.error};let n=ar(t.store,{receiver_teamfile:e,receiver_alias:r.alias,sender_teamfile:`prompt:${t.payload.prompt_id}`,sender_alias:"operator",ttlMs:LF(t.env??process.env)});if(!n.acquired){let s=RF(r.alias,n.current);return Pn({rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,promptId:t.payload.prompt_id,detail:s,reason:"unavailable"}),t.log?.(`[mailbox] prompt rejected: ${s}`),{status:"error",response:null,error_detail:s}}try{let i=await(t.chat??Rt)({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}:{}}),o=i.status==="stalled",a=!o&&i.text.trim()==="",l=o?`provider stalled${i.stalledAfterMs!==void 0?` after ${i.stalledAfterMs}ms`:""}`:a?"provider returned empty response":null,d=o||a?"error":"ok";return d==="ok"?await AF(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:i.text,status:d,error_detail:null,log:t.log}):Pn({rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,promptId:t.payload.prompt_id,detail:l??"provider failed",reason:o?"stalled":"empty_response"}),{status:d,response:d==="error"?null:i.text,error_detail:l}}catch(s){let i=s instanceof Error?s.message:String(s);return Pn({rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,promptId:t.payload.prompt_id,detail:i,reason:"provider_error"}),t.log?.(`[mailbox] prompt provider error: ${i}`),{status:"error",response:null,error_detail:i}}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 Pn(t){C({event:"prompt_trigger_error",reason:t.reason,prompt_id:t.promptId,root_teamfile:t.rootTeamfile,sender_teamfile:t.rootTeamfile,sender_alias:"operator",receiver_teamfile:t.receiverTeamfile,receiver_alias:t.receiverAlias,error_detail:t.detail,message_preview:IF(t.message)})}function IF(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=500?e:`${e.slice(0,497)}...`}function NF(t){if(!vF(t))return{error:`prompt root missing/unreadable: ${t}`};let e=rt(t);if(e.parseErrors.length>0)return{error:`prompt root parse error: ${e.parseErrors.join("; ")}`};let r=Dt(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??bF(t)}}async function AF(t,e){let r=nv(e.message),n=e.response===null?null:nv(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 nv(t){return t.length<=tv?{text:t,truncated:!1}:{text:t.slice(0,tv),truncated:!0}}function xF(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}function RF(t,e){return e.sender_teamfile.startsWith("prompt:")?`${t} is busy servicing another prompt since ${e.started_at}`:xF(t,e)}function LF(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return rv;let r=Number(e);return!Number.isFinite(r)||r<=0?rv:r}var tv,rv,sv=E(()=>{"use strict";Lt();tr();me();lr();tv=256*1024,rv=30*60*1e3});import{chmodSync as cv,existsSync as OF,mkdirSync as uv,readFileSync as Da,writeFileSync as mv}from"node:fs";import{dirname as om,resolve as $a,join as fv}from"node:path";import{fileURLToPath as $F}from"node:url";import{homedir as pv}from"node:os";import{CognitoIdentityClient as CF,GetIdCommand as MF}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as iv}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as DF,ListObjectsV2Command as jF,PutObjectCommand as PF,S3Client as ov}from"@aws-sdk/client-s3";function Gs(t={}){let e=t.env??process.env,r=t.tfstatePath!==void 0?[t.tfstatePath]:BF(t.selfUrl),n={},s;for(let k of r)if(OF(k)){n=qF(k),s=k;break}let i=(...k)=>{for(let A of k)if(typeof A=="string"&&A!=="")return A},o=i(e.LMCTL_NEXT_IDENTITY_POOL_ID,n.LMCTL_NEXT_IDENTITY_POOL_ID)??FF,a=i(e.LMCTL_NEXT_COGNITO_USER_POOL_ID,n.LMCTL_NEXT_COGNITO_USER_POOL_ID)??UF,l=i(e.LMCTL_NEXT_MAILBOX_BUCKET,e.LMCTL_NEXT_POLICY_BUCKET,n.LMCTL_NEXT_MAILBOX_BUCKET,n.LMCTL_NEXT_POLICY_BUCKET)??WF,d=i(e.AWS_REGION,e.AWS_DEFAULT_REGION)??"us-east-1",c=i(e.LMCTL_NEXT_COGNITO_CLIENT_ID,n.LMCTL_NEXT_COGNITO_CLIENT_ID)??ja,u=[];o===void 0&&u.push("LMCTL_NEXT_IDENTITY_POOL_ID"),a===void 0&&u.push("LMCTL_NEXT_COGNITO_USER_POOL_ID"),l===void 0&&u.push("LMCTL_NEXT_MAILBOX_BUCKET");let m={missing:u,tfstateCandidatesChecked:r,...s!==void 0?{tfstatePathUsed:s}:{}};if(u.length>0)return m;let f=e.LMCTL_MAILBOX_POLL_MS,p=f!==void 0&&f.length>0?Number(f):void 0,h=Ma(e.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),g=Ma(e.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),_=Ma(e.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),y=Ma(e.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),T=i(e.LMCTL_MAILBOX_KEY),v=i(e.LMCTL_TOKEN_PATH);return m.config={identityPoolId:o,cognitoUserPoolId:a,cognitoClientId:c,region:d,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:_}:{},...y!==void 0?{chatLogPollIntervalMs:y}:{},...T!==void 0?{mailboxKey:T}:{},...v!==void 0?{tokenPath:v}:{}},m}function qF(t){try{let e=Da(t,"utf8"),n=JSON.parse(e).outputs??{},s={};for(let[i,o]of Object.entries(n))o!==null&&typeof o=="object"&&typeof o.value=="string"&&(s[i]=o.value);return s}catch{return{}}}function BF(t){let e=om($F(t??import.meta.url));return[$a(e,"..","..","..","..","infra","terraform","terraform.tfstate"),$a(e,"..","..","..","..","..","infra","terraform","terraform.tfstate"),$a(e,"..","..","..","infra","terraform","terraform.tfstate"),$a(e,"..","..","infra","terraform","terraform.tfstate")]}function Ma(t){if(t===void 0||t==="")return;let e=Number(t);if(!(!Number.isFinite(e)||e<=0))return e*1e3}function HF(t){let e=XF(t.intervalMs)??_v,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,i,o=!1,a=!1,l=()=>{try{if(s!==null){let u=s.load(s.key);if(u!==null)return i=u.last_pushed_id,!0}return i=t.store.getMaxTeamChatLogId(),s!==null&&s.save({cursor_key:s.key,last_pushed_id:i,updated_at:new Date(n()).toISOString()}),!0}catch(u){return t.log?.(`[mailbox] daemon_event chat_log seed failed: ${u instanceof Error?u.message:String(u)}`),!1}};l();let d=async()=>{if(!(a||o)){o=!0;try{if(i===void 0&&!l())return;let u=t.store.listTeamChatLogSinceId(i,r);for(let m of u){let f={kind:"daemon_event",event:"chat_log",ts:n(),entry:{id:m.id,root_teamfile:m.root_teamfile,sender_teamfile:m.sender_teamfile,sender_alias:m.sender_alias,receiver_teamfile:m.receiver_teamfile,receiver_alias:m.receiver_alias,message:m.message,response:m.response,status:m.status,created_at:m.created_at}};await t.publishDaemonEvent(f),s!==null&&s.save({cursor_key:s.key,last_pushed_id:m.id,updated_at:new Date(n()).toISOString()}),i=Math.max(i,m.id)}}catch(u){t.log?.(`[mailbox] daemon_event chat_log tail failed: ${u instanceof Error?u.message:String(u)}`)}finally{o=!1}}},c=setInterval(()=>{d()},e);return typeof c.unref=="function"&&c.unref(),{pollNow:d,stop(){a=!0,clearInterval(c)}}}function XF(t){return typeof t=="number"&&Number.isFinite(t)&&t>0?t:void 0}async function hv(t){let e=t.tokenPath??fv(pv(),".lmctl","cli-tokens.json"),r=lv(t.tokenPath);if(BT(r.cognito?.idToken)&&rm()!==null)try{await ev({region:t.region,clientId:t.cognitoClientId??ja,cliTokensPath:e}),r=lv(t.tokenPath),t.log?.("[mx-mailbox] refreshed IdToken from device-auth refresh token")}catch(R){let Z=R instanceof Error?R.message:String(R);t.log?.(`[mx-mailbox] device-auth refresh failed: ${Z}`)}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}`,i=r.cognito.identityId,o=!1;i===void 0||i===""?i=await dv({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}):(o=!0,t.log?.(`[mx-mailbox] using cached identityId from cli-tokens (skipping GetId) for ${i}`));let a=iv({identityId:i,logins:{[s]:n},clientConfig:{region:t.region}}),l=new ov({region:t.region,credentials:a}),d={ListObjectsV2Command:jF,GetObjectCommand:DF,PutObjectCommand:PF},c=Hs(n),u=c??i,m=t.deviceId,f=Ln({identityId:i,userId:c,deviceId:m,mailboxKey:t.mailboxKey}),p=t.cursorStore,h;if(p!==void 0){let R=p.loadMailboxCursor(u,f);if(R!==null)h=R.last_processed_seq??void 0,t.log?.(`[mx-mailbox] resumed seq cursor=${h??"(sentinel)"} for user_id=${u}`);else{let Z=!1,q=0;for(;!Z&&q<2;){q+=1;try{let b=Zo(f,"web"),I=0,L;do{let U=await l.send(new d.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:b,MaxKeys:1e3,...L!==void 0?{ContinuationToken:L}:{}}));for(let j of U.Contents??[]){let D=Qo(j.Key??"",f,"web");D!==void 0&&D>I&&(I=D)}L=U.IsTruncated===!0?U.NextContinuationToken:void 0}while(L!==void 0);h=I,t.log?.(`[mx-mailbox] cold start: seeded seq cursor=${I} for user_id=${u}`),Z=!0}catch(b){let I=b instanceof Error?b.message:String(b);if(o&&q===1&&VF(b)){t.log?.(`[mx-mailbox] cached identityId rejected by cognito (${I}); clearing + refreshing`),GF(e),o=!1,i=await dv({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}),a=iv({identityId:i,logins:{[s]:n},clientConfig:{region:t.region}}),l=new ov({region:t.region,credentials:a}),f=Ln({identityId:i,userId:c,deviceId:m,mailboxKey:t.mailboxKey});continue}t.log?.(`[mx-mailbox] cold start seq probe failed: ${I}`);break}}p.saveMailboxCursor({user_id:u,mailbox_key:f,last_processed_version_id:null,last_processed_seq:h??null,last_processed_at:new Date().toISOString()})}}let g=null,_=t.terminalSessionManager,y=t.persistentSessionManager,T=t.promptTriggerStore,v=new Ra,k=new Hr({bucket:t.mailboxBucket,identityId:i,...c!==null?{userId:c}:{},...m!==void 0?{deviceId:m}:{},...t.mailboxKey!==void 0?{mailboxKey:t.mailboxKey}:{},s3:l,commands:d,selfRole:"agent",onS3Op:R=>v.record(R),onMessage:async R=>{if(_!==void 0&&Vu(R.payload)){_.onInbound(R.payload);return}if(y!==void 0&&Ku(R.payload)){await y.onInbound(R.payload);return}if(!zu(R.payload)){if(T!==void 0&&Zu(R.payload)){im({store:T,payload:R.payload,log:t.log});return}g!==null&&await g.handleIncoming(R.payload,R)}},...p!==void 0?{onCursorAdvance:R=>{p.saveMailboxCursor({user_id:u,mailbox_key:f,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:k,...t.log!==void 0?{log:t.log}:{}}),_!==void 0&&_.setPublish(async R=>k.putMessage({conversation_id:`terminal:${R.session_id}`,payload:R})),y!==void 0&&y.setPublish(async R=>k.putMessage({conversation_id:`provider:${R.session_id}`,payload:R}));let A=R=>k.putMessage({conversation_id:Yu,payload:R});k.start();let z=t.chatLogTailStore===void 0?void 0:HF({store:t.chatLogTailStore,publishDaemonEvent:A,cursorKey:f,intervalMs:t.chatLogPollIntervalMs??t.readIntervalMs??t.pollIntervalMs??_v,log:t.log});t.log?.(`[mx-mailbox] agent polling ${f} (bucket=${t.mailboxBucket})`);let Se=t.deviceId??i,W=`${u}/usage/`,F;return F=t.usageStore===void 0?void 0:CT({meter:v,store:t.usageStore,userId:u,deviceId:Se,ceilingUsd:t.usageQuotaUsd??1/0,onQuotaExceeded:({period:R,costUsd:Z,ceilingUsd:q})=>{t.log?.(`[usage] month ${R} cost $${Z.toFixed(4)} >= ceiling $${q} \u2014 blocking mailbox`),k.stop().catch(()=>{}),F?.stop()},publishOwnRollup:async(R,Z)=>{await l.send(new d.PutObjectCommand({Bucket:t.mailboxBucket,Key:`${W}${Se}-${R}.json`,Body:JSON.stringify({...Z,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async R=>{let Z={put:0,get:0,list:0},q;do{let b=await l.send(new d.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:W,MaxKeys:1e3,...q!==void 0?{ContinuationToken:q}:{}}));for(let I of b.Contents??[]){let L=I.Key??"";if(L.endsWith(`-${R}.json`))try{let U=await l.send(new d.GetObjectCommand({Bucket:t.mailboxBucket,Key:L}));if(U.Body===void 0)continue;let j=JSON.parse(await U.Body.transformToString("utf-8"));Z.put+=j.put??0,Z.get+=j.get??0,Z.list+=j.list??0}catch{}}q=b.IsTruncated===!0?b.NextContinuationToken:void 0}while(q!==void 0);return Z},intervalMs:t.usageFlushIntervalMs??36e5,...t.log!==void 0?{log:t.log}:{}}),{identityId:i,mailbox:k,fetchClient:g,publishDaemonEvent:A,async stop(){z?.stop(),F!==void 0&&(await F.flushNow().catch(()=>{}),F.stop()),await g.stop().catch(()=>{}),await k.stop().catch(()=>{})}}}async function gv(t){let e=t.s3!==void 0&&t.commands!==void 0?{s3:t.s3,commands:t.commands}:xa(t.rootDir),r=Ln({identityId:Js,userId:Js,deviceId:av}),n=null,s=t.terminalSessionManager,i=t.persistentSessionManager,o=t.promptTriggerStore,a=new Hr({bucket:"local",identityId:Js,userId:Js,deviceId:av,s3:e.s3,commands:e.commands,selfRole:"agent",onMessage:async d=>{if(s!==void 0&&Vu(d.payload)){s.onInbound(d.payload);return}if(i!==void 0&&Ku(d.payload)){await i.onInbound(d.payload);return}if(!zu(d.payload)){if(o!==void 0&&Zu(d.payload)){im({store:o,payload:d.payload,log:t.log});return}n!==null&&await n.handleIncoming(d.payload,d)}},pollIntervalMs:t.pollIntervalMs??Ca,readIntervalMs:t.readIntervalMs??Ca,heartbeatIdleMs:t.heartbeatIdleMs??Ca,backoffReadIntervalMs:t.backoffReadIntervalMs??Ca});n=new Bs({client:a,...t.log!==void 0?{log:t.log}:{}}),s!==void 0&&s.setPublish(async d=>a.putMessage({conversation_id:`terminal:${d.session_id}`,payload:d})),i!==void 0&&i.setPublish(async d=>a.putMessage({conversation_id:`provider:${d.session_id}`,payload:d}));let l=d=>a.putMessage({conversation_id:Yu,payload:d});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 lv(t){let e=t??fv(pv(),".lmctl","cli-tokens.json");try{let r=Da(e,"utf8");return JSON.parse(r)}catch{return{}}}function JF(t,e){if(e===void 0||e==="")return;let r={};try{let s=Da(t,"utf8");r=JSON.parse(s)}catch{}if(r.cognito===void 0)return;let n={...r,cognito:{...r.cognito,identityId:e}};uv(om(t),{recursive:!0,mode:448}),mv(t,JSON.stringify(n,null,2));try{cv(t,384)}catch{}}function GF(t){let e={};try{let n=Da(t,"utf8");e=JSON.parse(n)}catch{return}if(e.cognito===void 0)return;let r={...e,cognito:{...e.cognito}};delete r.cognito.identityId,uv(om(t),{recursive:!0,mode:448}),mv(t,JSON.stringify(r,null,2));try{cv(t,384)}catch{}}async function dv(t){t.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let r=await new CF({region:t.region}).send(new MF({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(r.IdentityId===void 0||r.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{JF(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 VF(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 _v,Ca,ja,FF,UF,WF,Js,av,am=E(()=>{"use strict";na();Bu();Ju();MT();jT();PT();FT();UT();Qu();ea();em();sm();sv();_v=3e3,Ca=1e3,ja="79u5jhkk46qofog661c9i0bdcs",FF="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",UF="us-east-1_4iUdFggDn",WF="lmctl-next-preview-mailbox-254332045686";Js="local",av="local"});import{spawn as um}from"node:child_process";import{createInterface as yv}from"node:readline";var lm,dm,cm,Ev,wv=E(()=>{"use strict";Li();me();lm=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=um(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=n,this.rl=yv({input:n.stdout}),this.rl.on("line",s=>{r.generation===r.currentGeneration()&&this.handleLine(s)}),n.stderr?.on("data",s=>{if(r.generation!==r.currentGeneration())return;let i=s instanceof Buffer?s.toString("utf8"):String(s);r.emit({event_type:"notification",payload:{source:"stderr",text:i}})}),await this.rpc("initialize",{clientInfo:{name:"lmctl-dt3",title:"lmctl DT-3",version:"0.1.0"},capabilities:{experimentalApi:!1}}),this.notify("initialized",{}),this.threadId!==void 0&&this.threadId!=="")try{await this.rpc("thread/resume",{threadId:this.threadId,approvalPolicy:"never",sandbox:"danger-full-access"}),r.emit({event_type:"thread_started",payload:{thread_id:this.threadId,resumed:!0}})}catch{let i=(await this.rpc("thread/start",{cwd:e.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,o=typeof i?.id=="string"?i.id:void 0;this.threadId=o,r.emit({event_type:"thread_started",payload:{thread_id:o,resumed:!1}})}else{let i=(await this.rpc("thread/start",{cwd:e.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,o=typeof i?.id=="string"?i.id:void 0;this.threadId=o,r.emit({event_type:"thread_started",payload:{thread_id:o,resumed:!1}})}return n}async sendTurn(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,i=typeof s?.id=="string"?s.id:void 0;if(i!==void 0){let o=this.ctx?.turnMap.get(r);this.ctx?.turnMap.delete(r),o!==void 0&&this.ctx?.turnMap.set(i,o)}}catch(n){throw this.ctx?.turnMap.delete(r),n}}async stop(){if(this.closed=!0,this.rl!==void 0&&(this.rl.close(),this.rl=void 0),this.child?.stdin!==null&&this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}for(let 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 i=this.nextRpcId++;this.pending.set(i,{resolve:n,reject:s});let o=JSON.stringify({jsonrpc:"2.0",id:i,method:e,params:r});try{this.child.stdin.write(o+`
2314
2314
  `)}catch(a){this.pending.delete(i),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+`
2315
2315
  `)}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 o=this.pending.get(r.id);if(this.pending.delete(r.id),r.error!==void 0){let a=r.error,l=typeof a?.message=="string"&&a.message!==""?a.message:JSON.stringify(r.error);o.reject(new Error(`codex_rpc_error: ${l}`))}else o.resolve(r);return}let n=typeof r.method=="string"?r.method:void 0;if(n===void 0)return;let s=r.params??{},i=this.normalizeNotification(n,s);i!==void 0&&this.ctx?.emit(i)}normalizeNotification(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}}}},dm=class{child;ctx;buffer="";sessionIdSeen;closed=!1;async start(e,r){this.ctx=r;let n=um(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 i=s instanceof Buffer?s.toString("utf8"):String(s);this.buffer+=i;let o=this.buffer.split(`
2316
2316
  `);this.buffer=o.pop()??"";for(let a of o)this.handleLine(a)}),n.stderr?.on("data",s=>{if(r.generation!==r.currentGeneration())return;let i=s instanceof Buffer?s.toString("utf8"):String(s);r.emit({event_type:"notification",payload:{source:"stderr",text:i}})}),n}async sendTurn(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+`
2317
2317
  `)}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 i=r.message?.content;if(Array.isArray(i))for(let o of i)o.type==="text"&&typeof o.text=="string"&&o.text!==""&&this.ctx?.emit({event_type:"assistant_message_delta",payload:{text:o.text}});return}if(n==="result"){let s=typeof r.session_id=="string"?r.session_id:void 0;for(let i of Array.from(this.ctx?.turnMap.keys()??[]))this.ctx?.turnMap.delete(i);this.ctx?.emit({event_type:"turn_complete",payload:{result:r.result,session_id:s,raw:r}});return}this.ctx?.emit({event_type:"notification",payload:{method:n,params:r}})}},cm=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{Ri(n)}catch(a){C({event:"opencode_config_install_failed",cwd:n,error_message:a instanceof Error?a.message:String(a)})}let s=um(e.command,e.args,{cwd:n,env:e.env??process.env,stdio:["pipe","pipe","pipe"]});this.child=s,this.rl=yv({input:s.stdout}),this.rl.on("line",a=>{r.generation===r.currentGeneration()&&this.handleLine(a)}),s.stderr?.on("data",a=>{if(r.generation!==r.currentGeneration())return;let l=a instanceof Buffer?a.toString("utf8"):String(a);r.emit({event_type:"notification",payload:{source:"stderr",text:l}})}),await this.rpc("initialize",{protocolVersion:1,clientInfo:{name:"lmctl-dt3",version:"0.1.0"},clientCapabilities:{}}),this.notify("notifications/initialized",{});let o=(await this.rpc("session/new",{cwd:e.cwd??process.cwd(),mcpServers:[]})).result;return this.sessionId=typeof o?.sessionId=="string"?o.sessionId:void 0,r.emit({event_type:"thread_started",payload:{thread_id:this.sessionId,raw:o}}),s}async sendTurn(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 i=this.nextRpcId++;this.pending.set(i,{resolve:n,reject:s});let o=JSON.stringify({jsonrpc:"2.0",id:i,method:e,params:r});try{this.child.stdin.write(o+`
2318
2318
  `)}catch(a){this.pending.delete(i),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+`
2319
2319
  `)}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 i=r.error,o=typeof i?.message=="string"&&i.message!==""?i.message:JSON.stringify(r.error);s.reject(new Error(`acp_rpc_error: ${o}`))}else s.resolve(r);return}let n=typeof r.method=="string"?r.method:void 0;if(n!==void 0){if(typeof r.id=="number"){let s=JSON.stringify({jsonrpc:"2.0",id:r.id,error:{code:-32601,message:`Method not found: ${n} (lmctl dt-3 does not implement server-side ACP methods)`}});try{this.child?.stdin?.write(s+`
2320
- `)}catch{}this.ctx?.emit({event_type:"notification",payload:{kind:"unhandled_request",method:n,id:r.id,params:r.params}});return}if(n==="session/update"){let s=r.params,i=s?.update;if((typeof i?.sessionUpdate=="string"?i.sessionUpdate:"")==="agent_message_chunk"){let a=i?.content,l=typeof a?.text=="string"?a.text:"";if(l!==""){this.ctx?.emit({event_type:"assistant_message_delta",payload:{text:l}});return}}this.ctx?.emit({event_type:"notification",payload:{method:n,params:s}});return}this.ctx?.emit({event_type:"notification",payload:{method:n,params:r.params}})}}},Ev=t=>{switch(t){case"codex":return new lm;case"claude":case"qwen":return new dm;case"gemini":case"copilot":case"opencode":return new cm;default:throw new Error(`no_persistent_adapter_for_provider: ${t}`)}}});import{randomUUID as VF}from"node:crypto";import{existsSync as z5,mkdirSync as KF,readFileSync as YF,writeFileSync as zF}from"node:fs";import{homedir as ZF}from"node:os";import{dirname as QF,join as e1}from"node:path";function Fa(){return process.env.LMCTL_DEVICE_FILE??e1(ZF(),".lmctl","device.json")}function Gr(t=Fa()){let e=process.env.LMCTL_DEVICE_ID;if(e!==void 0&&e!=="")return{device_id:e,created_at:"env"};try{let r=JSON.parse(YF(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 mm(t=Fa()){let e=Gr(t);if(e!==null&&e.created_at!=="env")return e;let r={device_id:VF(),created_at:new Date().toISOString()};return KF(QF(t),{recursive:!0}),zF(t,`${JSON.stringify(r,null,2)}
2321
- `,{encoding:"utf8",mode:384}),r}var fm=E(()=>{"use strict"});import{mkdirSync as t1,readFileSync as Tv,rmSync as r1,writeFileSync as n1}from"node:fs";import{dirname as vv,join as s1}from"node:path";function jt(t=Q()){return s1(vv(t),"serve.pid")}function Sv(t,e){let r=jt(e);return t1(vv(r),{recursive:!0}),n1(r,`${JSON.stringify(t,null,2)}
2322
- `,"utf-8"),r}function pm(t){let e=jt(t),r;try{r=Tv(e,"utf-8")}catch{return null}try{let n=JSON.parse(r);return!Number.isInteger(n.pid)||(n.pid??0)<=0?null:{pid:n.pid,startedAt:typeof n.startedAt=="string"?n.startedAt:"unknown",port:Number.isInteger(n.port)?n.port:0,bind:typeof n.bind=="string"?n.bind:"unknown",dbPath:typeof n.dbPath=="string"?n.dbPath:"unknown",startToken:typeof n.startToken=="string"?n.startToken:null}}catch{return null}}function Fn(t){r1(jt(t),{force:!0})}function Ua(t){let e=i1(t),r=pm(t);if(r===null)return{entry:null,running:!1,stale:!1,corrupt:e};switch(ap(r.pid,r.startToken??null)){case"same":return{entry:r,running:!0,stale:!1,corrupt:!1};case"different":return{entry:r,running:!1,stale:!0,corrupt:!1,staleReason:"pid-reused"};case"gone":return{entry:r,running:!1,stale:!0,corrupt:!1,staleReason:"process-gone"};case"unverified":default:return{entry:r,running:!0,stale:!1,corrupt:!1,unverified:!0}}}function i1(t){let e=jt(t),r;try{r=Tv(e,"utf-8")}catch{return!1}try{let n=JSON.parse(r);return!Number.isInteger(n.pid)||(n.pid??0)<=0}catch{return!0}}function bv(){return Nl(process.pid)}var kv=E(()=>{"use strict";nn();Ye()});var Fv={};he(Fv,{_resetStdoutEpipeGuardForTests:()=>u1,bootstrapAgentRestMailbox:()=>Cv,installStdoutEpipeGuard:()=>Rv,publishRegisteredWorkflowsOnStart:()=>$v,resolveLocalMailboxDir:()=>jv,resolveLocalWebuiDir:()=>Dv,resolveServeConfig:()=>Mv,runServe:()=>d1,runServeStatus:()=>Lv,runServeStop:()=>Ov,validateServeArgs:()=>Pv});import{randomBytes as o1}from"node:crypto";import{existsSync as Av}from"node:fs";import{isIP as Iv}from"node:net";import{homedir as a1}from"node:os";import{isAbsolute as xv,resolve as _m}from"node:path";async function d1(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(l1),0;let r=t[0];return r==="status"?Lv(t.slice(1),e):r==="stop"?Ov(t.slice(1),e):r!=="start"?(e.stderr.write(r===void 0?Nv:`error: unknown serve subcommand: ${r}
2320
+ `)}catch{}this.ctx?.emit({event_type:"notification",payload:{kind:"unhandled_request",method:n,id:r.id,params:r.params}});return}if(n==="session/update"){let s=r.params,i=s?.update;if((typeof i?.sessionUpdate=="string"?i.sessionUpdate:"")==="agent_message_chunk"){let a=i?.content,l=typeof a?.text=="string"?a.text:"";if(l!==""){this.ctx?.emit({event_type:"assistant_message_delta",payload:{text:l}});return}}this.ctx?.emit({event_type:"notification",payload:{method:n,params:s}});return}this.ctx?.emit({event_type:"notification",payload:{method:n,params:r.params}})}}},Ev=t=>{switch(t){case"codex":return new lm;case"claude":case"qwen":return new dm;case"gemini":case"copilot":case"opencode":return new cm;default:throw new Error(`no_persistent_adapter_for_provider: ${t}`)}}});import{randomUUID as KF}from"node:crypto";import{existsSync as Z5,mkdirSync as YF,readFileSync as zF,writeFileSync as ZF}from"node:fs";import{homedir as QF}from"node:os";import{dirname as e1,join as t1}from"node:path";function Pa(){return process.env.LMCTL_DEVICE_FILE??t1(QF(),".lmctl","device.json")}function Gr(t=Pa()){let e=process.env.LMCTL_DEVICE_ID;if(e!==void 0&&e!=="")return{device_id:e,created_at:"env"};try{let r=JSON.parse(zF(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 mm(t=Pa()){let e=Gr(t);if(e!==null&&e.created_at!=="env")return e;let r={device_id:KF(),created_at:new Date().toISOString()};return YF(e1(t),{recursive:!0}),ZF(t,`${JSON.stringify(r,null,2)}
2321
+ `,{encoding:"utf8",mode:384}),r}var fm=E(()=>{"use strict"});import{mkdirSync as r1,readFileSync as Tv,rmSync as n1,writeFileSync as s1}from"node:fs";import{dirname as vv,join as i1}from"node:path";function jt(t=Q()){return i1(vv(t),"serve.pid")}function Sv(t,e){let r=jt(e);return r1(vv(r),{recursive:!0}),s1(r,`${JSON.stringify(t,null,2)}
2322
+ `,"utf-8"),r}function pm(t){let e=jt(t),r;try{r=Tv(e,"utf-8")}catch{return null}try{let n=JSON.parse(r);return!Number.isInteger(n.pid)||(n.pid??0)<=0?null:{pid:n.pid,startedAt:typeof n.startedAt=="string"?n.startedAt:"unknown",port:Number.isInteger(n.port)?n.port:0,bind:typeof n.bind=="string"?n.bind:"unknown",dbPath:typeof n.dbPath=="string"?n.dbPath:"unknown",startToken:typeof n.startToken=="string"?n.startToken:null}}catch{return null}}function Fn(t){n1(jt(t),{force:!0})}function Fa(t){let e=o1(t),r=pm(t);if(r===null)return{entry:null,running:!1,stale:!1,corrupt:e};switch(ap(r.pid,r.startToken??null)){case"same":return{entry:r,running:!0,stale:!1,corrupt:!1};case"different":return{entry:r,running:!1,stale:!0,corrupt:!1,staleReason:"pid-reused"};case"gone":return{entry:r,running:!1,stale:!0,corrupt:!1,staleReason:"process-gone"};case"unverified":default:return{entry:r,running:!0,stale:!1,corrupt:!1,unverified:!0}}}function o1(t){let e=jt(t),r;try{r=Tv(e,"utf-8")}catch{return!1}try{let n=JSON.parse(r);return!Number.isInteger(n.pid)||(n.pid??0)<=0}catch{return!0}}function bv(){return Il(process.pid)}var kv=E(()=>{"use strict";nn();Ye()});var Fv={};he(Fv,{_resetStdoutEpipeGuardForTests:()=>m1,bootstrapAgentRestMailbox:()=>Cv,installStdoutEpipeGuard:()=>Rv,publishRegisteredWorkflowsOnStart:()=>$v,resolveLocalMailboxDir:()=>jv,resolveLocalWebuiDir:()=>Dv,resolveServeConfig:()=>Mv,runServe:()=>c1,runServeStatus:()=>Lv,runServeStop:()=>Ov,validateServeArgs:()=>Pv});import{randomBytes as a1}from"node:crypto";import{existsSync as Av}from"node:fs";import{isIP as Iv}from"node:net";import{homedir as l1}from"node:os";import{isAbsolute as xv,resolve as _m}from"node:path";async function c1(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(d1),0;let r=t[0];return r==="status"?Lv(t.slice(1),e):r==="stop"?Ov(t.slice(1),e):r!=="start"?(e.stderr.write(r===void 0?Nv:`error: unknown serve subcommand: ${r}
2323
2323
 
2324
- ${Nv.replace(/^error: [^\n]*\n\n/,"")}`),2):c1(t.slice(1),e)}async function c1(t,e){let r=Pv(t,process.env);if(typeof r=="string")return e.stderr.write(`error: ${r}
2325
- `),2;let n=Je({path:Q()}),s={portCli:w1(t)},i;try{i=Mv({dal:n,cli:s,env:process.env,parsed:r,io:e})}catch(v){return n.close(),e.stderr.write(`error: ${v instanceof Error?v.message:String(v)}
2326
- `),2}process.env.LMCTL_API_URL=i.apiUrl,process.env.LMCTL_API_TOKEN=i.apiToken,process.env.LMCTL_API_PORT=String(i.port),bT(n);let o;if(r.localWebui!==void 0){let v=Dv(r.localWebui.dir,process.env);if(v===null)return e.stderr.write("error: --webui requires a local SPA build directory: pass `lmctl serve start --webui <dir>` or set LMCTL_LOCAL_WEBUI_DIR to a directory containing index.html\n"),n.close(),2;let k=jv(process.env),{s3:A,commands:z}=Ra(k);o={webuiDir:v,rootDir:k,s3:A,commands:z},e.stdout.write(`local webui: serving SPA from ${v}; mailbox store ${k}
2324
+ ${Nv.replace(/^error: [^\n]*\n\n/,"")}`),2):u1(t.slice(1),e)}async function u1(t,e){let r=Pv(t,process.env);if(typeof r=="string")return e.stderr.write(`error: ${r}
2325
+ `),2;let n=Je({path:Q()}),s={portCli:T1(t)},i;try{i=Mv({dal:n,cli:s,env:process.env,parsed:r,io:e})}catch(v){return n.close(),e.stderr.write(`error: ${v instanceof Error?v.message:String(v)}
2326
+ `),2}process.env.LMCTL_API_URL=i.apiUrl,process.env.LMCTL_API_TOKEN=i.apiToken,process.env.LMCTL_API_PORT=String(i.port),bT(n);let o;if(r.localWebui!==void 0){let v=Dv(r.localWebui.dir,process.env);if(v===null)return e.stderr.write("error: --webui requires a local SPA build directory: pass `lmctl serve start --webui <dir>` or set LMCTL_LOCAL_WEBUI_DIR to a directory containing index.html\n"),n.close(),2;let k=jv(process.env),{s3:A,commands:z}=xa(k);o={webuiDir:v,rootDir:k,s3:A,commands:z},e.stdout.write(`local webui: serving SPA from ${v}; mailbox store ${k}
2327
2327
  `)}let a=r.noDaemon?void 0:vT({dal:n,intervalMs:qs()}),l=o!==void 0?{missing:[],tfstateCandidatesChecked:[]}:Gs({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)`)+`
2328
- `);let d=await E1({log:v=>e.stderr.write(`${v}
2328
+ `);let d=await w1({log:v=>e.stderr.write(`${v}
2329
2329
  `)}),c=new la({adapterFactory:Ev,publish:async()=>{throw new Error("persistent_publish_not_wired: mailbox runtime has not bound the publish hook yet")},log:v=>e.stderr.write(`${v}
2330
- `)}),u=Gr()?.device_id,m=Pw({dal:n,daemon:a,...l.config!==void 0?{webuiRuntimeConfig:g1(l.config,u)}:{},...d!==void 0?{terminalSessionManager:d}:{},persistentSessionManager:c,...o!==void 0?{localWebui:{webuiDir:o.webuiDir,localMailbox:{s3:o.s3,commands:o.commands}}}:{},authDisabled:r.insecureNoAuth}),f=process.env.LMCTL_USAGE_QUOTA_USD,p=f!==void 0&&f!==""?Number(f):NaN,h=Number.isFinite(p)&&p>0?p:void 0,g=await Cv({dal:n,app:m,io:e,mailbox:l.config===void 0?void 0:{...l.config,cursorStore:n,chatLogTailStore:n,promptTriggerStore:n,usageStore:n,...h!==void 0?{usageQuotaUsd:h}:{},...u!==void 0?{deviceId:u}:{}},...o!==void 0?{localMailbox:{rootDir:o.rootDir,s3:o.s3,commands:o.commands,promptTriggerStore:n}}:{},...d!==void 0?{terminalSessionManager:d}:{},persistentSessionManager:c});await $v({dal:n,mailbox:g.mailbox,io:e});let{serve:_}=await import("@hono/node-server"),y=await new Promise((v,k)=>{let A,z=Se=>k(Se);A=_({fetch:m.fetch,port:i.port,hostname:r.bind},()=>{A.removeListener?.("error",z),v(A)}),A.once("error",z)}).catch(async v=>(a!==void 0&&await a.stop().catch(()=>{}),await g.stop().catch(()=>{}),d!==void 0&&await d.stop().catch(()=>{}),await c.stop().catch(()=>{}),n.close(),e.stderr.write(`error: could not bind ${r.bind}:${i.port}: ${v instanceof Error?v.message:String(v)}
2330
+ `)}),u=Gr()?.device_id,m=Pw({dal:n,daemon:a,...l.config!==void 0?{webuiRuntimeConfig:y1(l.config,u)}:{},...d!==void 0?{terminalSessionManager:d}:{},persistentSessionManager:c,...o!==void 0?{localWebui:{webuiDir:o.webuiDir,localMailbox:{s3:o.s3,commands:o.commands}}}:{},authDisabled:r.insecureNoAuth}),f=process.env.LMCTL_USAGE_QUOTA_USD,p=f!==void 0&&f!==""?Number(f):NaN,h=Number.isFinite(p)&&p>0?p:void 0,g=await Cv({dal:n,app:m,io:e,mailbox:l.config===void 0?void 0:{...l.config,cursorStore:n,chatLogTailStore:n,promptTriggerStore:n,usageStore:n,...h!==void 0?{usageQuotaUsd:h}:{},...u!==void 0?{deviceId:u}:{}},...o!==void 0?{localMailbox:{rootDir:o.rootDir,s3:o.s3,commands:o.commands,promptTriggerStore:n}}:{},...d!==void 0?{terminalSessionManager:d}:{},persistentSessionManager:c});await $v({dal:n,mailbox:g.mailbox,io:e});let{serve:_}=await import("@hono/node-server"),y=await new Promise((v,k)=>{let A,z=Se=>k(Se);A=_({fetch:m.fetch,port:i.port,hostname:r.bind},()=>{A.removeListener?.("error",z),v(A)}),A.once("error",z)}).catch(async v=>(a!==void 0&&await a.stop().catch(()=>{}),await g.stop().catch(()=>{}),d!==void 0&&await d.stop().catch(()=>{}),await c.stop().catch(()=>{}),n.close(),e.stderr.write(`error: could not bind ${r.bind}:${i.port}: ${v instanceof Error?v.message:String(v)}
2331
2331
  `),null));if(y===null)return 2;e.stdout.write(`listening on ${r.bind}:${i.port}
2332
- `);let T=Q();try{let v=Ua(T);v.running&&v.entry!==null&&v.entry.pid!==process.pid&&e.stderr.write(`note: replacing pidfile for a still-running daemon (pid ${v.entry.pid}, port ${v.entry.port}); \`lmctl serve stop\` will now target pid ${process.pid}
2332
+ `);let T=Q();try{let v=Fa(T);v.running&&v.entry!==null&&v.entry.pid!==process.pid&&e.stderr.write(`note: replacing pidfile for a still-running daemon (pid ${v.entry.pid}, port ${v.entry.port}); \`lmctl serve stop\` will now target pid ${process.pid}
2333
2333
  `);let k=Sv({pid:process.pid,startedAt:new Date().toISOString(),port:i.port,bind:r.bind,dbPath:T,startToken:bv()},T);e.stdout.write(`pidfile ${k} (pid ${process.pid})
2334
2334
  `)}catch(v){e.stderr.write(`warning: could not write serve pidfile: ${v instanceof Error?v.message:String(v)}; \`lmctl serve status\`/\`stop\` will not find this daemon
2335
- `)}return await new Promise(v=>{let k=()=>{(async()=>{a!==void 0&&await a.stop(),y.close(),await g.stop(),d!==void 0&&await d.stop(),await c.stop(),n.close();try{let A=pm(T);A!==null&&A.pid===process.pid&&Fn(T)}catch{}v()})()};process.once("SIGTERM",k),process.once("SIGINT",k)}),0}function Rv(t){if(t.stdout!==process.stdout||hm)return;hm=!0;let e=r=>{throw r.code==="EPIPE"&&process.exit(0),process.stdout.off("error",e),r};process.stdout.on("error",e)}function u1(){hm=!1}async function Lv(t,e){return Rv(e),m1(t,e)}async function m1(t,e){if(t.length>0)return e.stderr.write(`error: lmctl serve status takes no arguments; got: ${t.join(" ")}
2336
- `),2;let r=Q(),n=Ua(r);if(n.entry===null)return e.stdout.write(`serve: not running
2335
+ `)}return await new Promise(v=>{let k=()=>{(async()=>{a!==void 0&&await a.stop(),y.close(),await g.stop(),d!==void 0&&await d.stop(),await c.stop(),n.close();try{let A=pm(T);A!==null&&A.pid===process.pid&&Fn(T)}catch{}v()})()};process.once("SIGTERM",k),process.once("SIGINT",k)}),0}function Rv(t){if(t.stdout!==process.stdout||hm)return;hm=!0;let e=r=>{throw r.code==="EPIPE"&&process.exit(0),process.stdout.off("error",e),r};process.stdout.on("error",e)}function m1(){hm=!1}async function Lv(t,e){return Rv(e),f1(t,e)}async function f1(t,e){if(t.length>0)return e.stderr.write(`error: lmctl serve status takes no arguments; got: ${t.join(" ")}
2336
+ `),2;let r=Q(),n=Fa(r);if(n.entry===null)return e.stdout.write(`serve: not running
2337
2337
  `),e.stdout.write(n.corrupt?` unreadable pidfile at ${jt(r)} (could not parse)
2338
2338
  run \`lmctl serve stop\` to clear it
2339
2339
  `:` no pidfile at ${jt(r)}
@@ -2347,12 +2347,12 @@ ${Nv.replace(/^error: [^\n]*\n\n/,"")}`),2):c1(t.slice(1),e)}async function c1(t
2347
2347
  `),e.stdout.write(` started ${s.startedAt}
2348
2348
  `),e.stdout.write(` listening ${s.bind}:${s.port}
2349
2349
  `),e.stdout.write(` db ${s.dbPath}
2350
- `);let i=await p1(e,s);if(i===null)return e.stdout.write(` health unknown (could not read /api/daemon/state)
2350
+ `);let i=await _1(e,s);if(i===null)return e.stdout.write(` health unknown (could not read /api/daemon/state)
2351
2351
  `),0;let o=i,a=o.cycles??o.cycle_count;if(a!==void 0&&e.stdout.write(` cycles ${String(a)}
2352
2352
  `),o.enabled_features!==void 0){let l=Array.isArray(o.enabled_features)?o.enabled_features.join(", "):String(o.enabled_features);e.stdout.write(` features ${l}
2353
2353
  `)}return o.last_error!==void 0&&o.last_error!==null&&e.stdout.write(` last_error ${String(o.last_error)}
2354
- `),0}async function p1(t,e){try{let r=t.dal??Je({path:Q()}),n=t.dal===void 0,s=null;try{s=bs(r,process.env,{stdout:{write:()=>{}},stderr:{write:()=>{}}}).token}finally{n&&r.close()}let i={Accept:"application/json"};s!==null&&s.length>0&&(i.Authorization=`Bearer ${s}`);let o=e.bind==="0.0.0.0"||e.bind==="::"||e.bind===""?"127.0.0.1":e.bind,a=new URL(`http://${o.includes(":")?`[${o}]`:o}:${e.port}/api/daemon/state`),l=await fetch(a,{headers:i,signal:AbortSignal.timeout(f1)});return l.ok?await l.json():null}catch{return null}}async function Ov(t,e,r={}){let n=r.timeoutMs??h1;if(t.length>0)return e.stderr.write(`error: lmctl serve stop takes no arguments; got: ${t.join(" ")}
2355
- `),2;let s=Q(),i=Ua(s);if(i.entry===null)return i.corrupt?(Fn(s),e.stdout.write(`serve: not running (pidfile was unreadable); cleared it
2354
+ `),0}async function _1(t,e){try{let r=t.dal??Je({path:Q()}),n=t.dal===void 0,s=null;try{s=bs(r,process.env,{stdout:{write:()=>{}},stderr:{write:()=>{}}}).token}finally{n&&r.close()}let i={Accept:"application/json"};s!==null&&s.length>0&&(i.Authorization=`Bearer ${s}`);let o=e.bind==="0.0.0.0"||e.bind==="::"||e.bind===""?"127.0.0.1":e.bind,a=new URL(`http://${o.includes(":")?`[${o}]`:o}:${e.port}/api/daemon/state`),l=await fetch(a,{headers:i,signal:AbortSignal.timeout(p1)});return l.ok?await l.json():null}catch{return null}}async function Ov(t,e,r={}){let n=r.timeoutMs??g1;if(t.length>0)return e.stderr.write(`error: lmctl serve stop takes no arguments; got: ${t.join(" ")}
2355
+ `),2;let s=Q(),i=Fa(s);if(i.entry===null)return i.corrupt?(Fn(s),e.stdout.write(`serve: not running (pidfile was unreadable); cleared it
2356
2356
  `),0):(e.stdout.write(`serve: not running (no pidfile); nothing to stop
2357
2357
  `),0);if(i.stale)return Fn(s),e.stdout.write(i.staleReason==="pid-reused"?`serve: not running (pid ${i.entry.pid} belongs to a different process \u2014 pid reused); cleared stale pidfile without signalling it
2358
2358
  `:`serve: not running (pid ${i.entry.pid} already gone); cleared stale pidfile
@@ -2363,16 +2363,16 @@ ${Nv.replace(/^error: [^\n]*\n\n/,"")}`),2):c1(t.slice(1),e)}async function c1(t
2363
2363
  `),1;try{process.kill(o,"SIGTERM")}catch(d){return(d!==null&&typeof d=="object"&&"code"in d?d.code:void 0)==="ESRCH"?(Fn(s),e.stdout.write(`serve: not running (pid ${o} already gone); cleared stale pidfile
2364
2364
  `),0):(e.stderr.write(`error: could not signal pid ${o}: ${d instanceof Error?d.message:String(d)}
2365
2365
  `),1)}let l=Date.now()+n;for(;Date.now()<l;){if(!ze(o))return Fn(s),e.stdout.write(`serve: stopped (pid ${o}, port ${a})
2366
- `),0;await new Promise(d=>setTimeout(d,_1))}return e.stderr.write(`error: pid ${o} did not exit within ${n/1e3}s of SIGTERM; it may be shutting down slowly. Re-run \`lmctl serve stop\`, or \`kill -9 ${o}\` if it is wedged
2367
- `),1}function g1(t,e){return{identityPoolId:t.identityPoolId,cognitoUserPoolId:t.cognitoUserPoolId,cognitoRegion:t.region,mailboxBucket:t.mailboxBucket,workspaceFetchMode:"mailbox",...e!==void 0?{deviceId:e}:{},...t.mailboxKey!==void 0?{mailboxKey:t.mailboxKey}:{},mailboxPolling:{...t.readIntervalMs!==void 0?{readIntervalSeconds:t.readIntervalMs/1e3}:{},...t.heartbeatIdleMs!==void 0?{heartbeatIdleSeconds:t.heartbeatIdleMs/1e3}:{},...t.backoffReadIntervalMs!==void 0?{backoffReadIntervalSeconds:t.backoffReadIntervalMs/1e3}:{}}}}async function $v(t){if(t.mailbox===void 0)return;let e={kind:"daemon_event",event:"workflows",ts:Date.now(),workflows:t.dal.listRootTeams().filter(r=>Av(r.teamfile_path)).map(r=>({teamfile_path:r.teamfile_path,name:r.name,registered_at:r.registered_at,last_seeded_at:r.last_seeded_at}))};try{await t.mailbox.publishDaemonEvent(e)}catch(r){t.io?.stderr.write(`[mailbox] daemon_event workflows push failed: ${r instanceof Error?r.message:String(r)}
2366
+ `),0;await new Promise(d=>setTimeout(d,h1))}return e.stderr.write(`error: pid ${o} did not exit within ${n/1e3}s of SIGTERM; it may be shutting down slowly. Re-run \`lmctl serve stop\`, or \`kill -9 ${o}\` if it is wedged
2367
+ `),1}function y1(t,e){return{identityPoolId:t.identityPoolId,cognitoUserPoolId:t.cognitoUserPoolId,cognitoRegion:t.region,mailboxBucket:t.mailboxBucket,workspaceFetchMode:"mailbox",...e!==void 0?{deviceId:e}:{},...t.mailboxKey!==void 0?{mailboxKey:t.mailboxKey}:{},mailboxPolling:{...t.readIntervalMs!==void 0?{readIntervalSeconds:t.readIntervalMs/1e3}:{},...t.heartbeatIdleMs!==void 0?{heartbeatIdleSeconds:t.heartbeatIdleMs/1e3}:{},...t.backoffReadIntervalMs!==void 0?{backoffReadIntervalSeconds:t.backoffReadIntervalMs/1e3}:{}}}}async function $v(t){if(t.mailbox===void 0)return;let e={kind:"daemon_event",event:"workflows",ts:Date.now(),workflows:t.dal.listRootTeams().filter(r=>Av(r.teamfile_path)).map(r=>({teamfile_path:r.teamfile_path,name:r.name,registered_at:r.registered_at,last_seeded_at:r.last_seeded_at}))};try{await t.mailbox.publishDaemonEvent(e)}catch(r){t.io?.stderr.write(`[mailbox] daemon_event workflows push failed: ${r instanceof Error?r.message:String(r)}
2368
2368
  `)}}async function Cv(t){let e;if(t.mailbox!==void 0||t.localMailbox!==void 0)try{e=t.localMailbox!==void 0?await gv({...t.localMailbox,log:r=>t.io?.stderr.write(`${r}
2369
2369
  `),...t.terminalSessionManager!==void 0?{terminalSessionManager:t.terminalSessionManager}:{},...t.persistentSessionManager!==void 0?{persistentSessionManager:t.persistentSessionManager}:{}}):await hv({...t.mailbox,log:r=>t.io?.stderr.write(`${r}
2370
2370
  `),...t.terminalSessionManager!==void 0?{terminalSessionManager:t.terminalSessionManager}:{},...t.persistentSessionManager!==void 0?{persistentSessionManager:t.persistentSessionManager}:{}}),e.fetchClient.onRequest(gg({app:t.app,log:r=>t.io?.stderr.write(`${r}
2371
2371
  `)})),t.io?.stderr.write(`[mailbox] dg-2 agent runtime started (identity=${e.identityId})
2372
2372
  `)}catch(r){let n=r instanceof Error?r.message:String(r);t.io?.stderr.write(`[mailbox] WARNING: cloud mailbox auto-delivery is DISABLED; daemon continues without remote inbox relay: ${n}
2373
2373
  `)}return{...e!==void 0?{mailbox:e}:{},async stop(){e!==void 0&&await e.stop()}}}function Mv(t){let{dal:e,cli:r,env:n,parsed:s,io:i}=t,o=[],a,l=e.getConfig("api.port");if(r.portCli!==void 0)a=r.portCli;else if(l!==null){let f=Number(l);if(!Number.isInteger(f)||f<=0||f>65535)throw new Error(`invalid api.port in lmctl_config: ${l}`);a=f}else if(n.LMCTL_API_PORT!==void 0&&n.LMCTL_API_PORT.length>0){let f=Number(n.LMCTL_API_PORT);if(!Number.isInteger(f)||f<=0||f>65535)throw new Error(`invalid LMCTL_API_PORT: ${n.LMCTL_API_PORT}`);a=f,o.push("api.port")}else a=s.port;let d,c=e.getConfig("api.token");n.LMCTL_API_TOKEN!==void 0&&n.LMCTL_API_TOKEN.length>0?(d=n.LMCTL_API_TOKEN,c===null?o.push("api.token"):c!==d&&i.stderr.write(`note: LMCTL_API_TOKEN env var overrides lmctl_config api.token for this serve process.
2374
- `)):c!==null?d=c:(d=o1(32).toString("hex"),e.setConfig("api.token",d),i.stdout.write("Generated initial api.token; view via `lmctl api config get api.token`\n"));let u,m=e.getConfig("api.url");m!==null?u=m:n.LMCTL_API_URL!==void 0&&n.LMCTL_API_URL.length>0?(u=n.LMCTL_API_URL,o.push("api.url")):(u=`http://127.0.0.1:${a}`,e.setConfig("api.url",u));for(let f of o)i.stderr.write(`note: ${y1(f)} env var used as fallback for ${f}; consider \`lmctl api config set ${f} ...\` to make this DB-canonical.
2375
- `);return{port:a,apiUrl:u,apiToken:d}}function y1(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 E1(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 aa({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 Dv(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=xv(r)?r:_m(process.cwd(),r);return Av(`${n}/index.html`)?n:null}function jv(t){let e=t.LMCTL_LOCAL_MAILBOX_DIR;return e!==void 0&&e!==""?xv(e)?e:_m(process.cwd(),e):_m(a1(),".lmctl","local-mailbox")}function w1(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 Pv(t,e=process.env){let r=v1(t);return typeof r=="string"?r:!T1(r.bind)&&!r.insecureNoAuth&&!e.LMCTL_API_TOKEN?`auth required for non-loopback --bind ${r.bind}; set LMCTL_API_TOKEN or pass --insecure-no-auth`:r}function T1(t){let e=t.trim().toLowerCase();if(e==="localhost"||e==="::1")return!0;if(e.startsWith("::ffff:")){let r=e.slice(7);return Iv(r)===4&&r.split(".")[0]==="127"}return Iv(e)===4&&e.split(".")[0]==="127"}function v1(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 i=Number(s);if(!Number.isInteger(i)||i<=0||i>65535)return`invalid --port: ${s}`;e.port=i;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 l1,Nv,hm,f1,_1,h1,Uv=E(()=>{"use strict";ct();Ww();Fu();kT();Ic();am();Bu();_u();hu();wv();fm();Ye();nn();lc();kv();l1=`usage: lmctl serve <start|status|stop> [options]
2374
+ `)):c!==null?d=c:(d=a1(32).toString("hex"),e.setConfig("api.token",d),i.stdout.write("Generated initial api.token; view via `lmctl api config get api.token`\n"));let u,m=e.getConfig("api.url");m!==null?u=m:n.LMCTL_API_URL!==void 0&&n.LMCTL_API_URL.length>0?(u=n.LMCTL_API_URL,o.push("api.url")):(u=`http://127.0.0.1:${a}`,e.setConfig("api.url",u));for(let f of o)i.stderr.write(`note: ${E1(f)} env var used as fallback for ${f}; consider \`lmctl api config set ${f} ...\` to make this DB-canonical.
2375
+ `);return{port:a,apiUrl:u,apiToken:d}}function E1(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 w1(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 aa({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 Dv(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=xv(r)?r:_m(process.cwd(),r);return Av(`${n}/index.html`)?n:null}function jv(t){let e=t.LMCTL_LOCAL_MAILBOX_DIR;return e!==void 0&&e!==""?xv(e)?e:_m(process.cwd(),e):_m(l1(),".lmctl","local-mailbox")}function T1(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 Pv(t,e=process.env){let r=S1(t);return typeof r=="string"?r:!v1(r.bind)&&!r.insecureNoAuth&&!e.LMCTL_API_TOKEN?`auth required for non-loopback --bind ${r.bind}; set LMCTL_API_TOKEN or pass --insecure-no-auth`:r}function v1(t){let e=t.trim().toLowerCase();if(e==="localhost"||e==="::1")return!0;if(e.startsWith("::ffff:")){let r=e.slice(7);return Iv(r)===4&&r.split(".")[0]==="127"}return Iv(e)===4&&e.split(".")[0]==="127"}function S1(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 i=Number(s);if(!Number.isInteger(i)||i<=0||i>65535)return`invalid --port: ${s}`;e.port=i;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 d1,Nv,hm,p1,h1,g1,Uv=E(()=>{"use strict";ct();Ww();Fu();kT();kc();am();Bu();pu();_u();wv();fm();Ye();nn();ac();kv();d1=`usage: lmctl serve <start|status|stop> [options]
2376
2376
 
2377
2377
  Manage the local lmctl daemon: HTTP API, web UI, queue daemon, terminal
2378
2378
  manager, and agent services. A subcommand is REQUIRED \u2014 bare \`lmctl serve\`
@@ -2428,20 +2428,20 @@ unauthenticated daemon.
2428
2428
  lmctl serve stop
2429
2429
 
2430
2430
  Run 'lmctl serve --help' for details.
2431
- `;hm=!1;f1=2e3;_1=100,h1=1e4});import{existsSync as S1,mkdirSync as b1,readFileSync as k1,renameSync as I1,unlinkSync as N1,writeFileSync as A1}from"node:fs";import{homedir as qv}from"node:os";import{dirname as Vs,join as Tt,resolve as x1}from"node:path";function Bn(t,e,r){let n=Vs(x1(r)),s=new Set,i=new Map;for(let o of e.members){if(s.add(o.provider),o.teamfile!==void 0)continue;let a=o.sessiondir??n,l=i.get(a)??new Set;l.add(o.provider),i.set(a,l)}for(let[o,a]of i.entries())Ir(Tt(o,".mcp.json"),"mcpServers",[Un(),Wn()]),a.has("opencode")&&Ir(Tt(o,".opencode","opencode.json"),"mcp",[Xv(),Jv()]);for(let o of s)$1(o)}function Hv(t=Bv??qv()){return Tt(t,".copilot","mcp-config.json")}function L1(t,e){lt.mkdirSync(Vs(t),{recursive:!0});let r=Tt(Vs(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{lt.writeFileSync(r,`${JSON.stringify(e,null,2)}
2432
- `,"utf8"),lt.renameSync(r,t)}catch(n){try{lt.unlinkSync(r)}catch{}throw n}}function O1(t,e){lt.mkdirSync(Vs(t),{recursive:!0});let r=Tt(Vs(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{lt.writeFileSync(r,e,"utf8"),lt.renameSync(r,t)}catch(n){try{lt.unlinkSync(r)}catch{}throw n}}function Ir(t,e,r){try{if(!lt.existsSync(t))return;let n=JSON.parse(lt.readFileSync(t,"utf8"));if(!qn(n)||!qn(n[e]))return;let s={...n[e]},i=[];for(let{name:o,shouldRemove:a}of r)Object.prototype.hasOwnProperty.call(s,o)&&a(s[o])&&(delete s[o],i.push(o));if(i.length===0)return;n[e]=s,L1(t,n),C({event:"mcp_cleanup",path:t,removed:i})}catch{}}function Un(){return{name:qa,shouldRemove:W1}}function Xv(){return{name:qa,shouldRemove:q1}}function Wn(){return{name:Wa,shouldRemove:F1}}function Jv(){return{name:Wa,shouldRemove:U1}}function $1(t){let e=Bv??qv();switch(t){case"copilot":Ir(Hv(e),"mcpServers",[Un(),Wn()]);return;case"claude":Ir(Tt(e,".claude.json"),"mcpServers",[Un(),Wn()]);return;case"gemini":Ir(Tt(e,".gemini","settings.json"),"mcpServers",[Un(),Wn()]);return;case"qwen":Ir(Tt(e,".qwen","settings.json"),"mcpServers",[Un(),Wn()]);return;case"agy":Ir(Tt(e,".gemini","antigravity-cli","settings.json"),"mcpServers",[Un(),Wn()]);return;case"opencode":Ir(Tt(e,".config","opencode","opencode.json"),"mcp",[Xv(),Jv()]);return;case"codex":C1(Tt(e,".codex","config.toml"));return;default:return}}function C1(t){try{if(!lt.existsSync(t))return;let e=lt.readFileSync(t,"utf8"),r=M1(e);if(r===null)return;let n=e.split(/\n/),s=[],i=new Set,o=!1,a;for(let l of n){let d=Gv(l);if(d===null)return;if(d!==void 0){if(Wv(d,r)){o=!0,a=d[1],i.add(a);continue}o=!1,a=void 0,s.push(l);continue}if(o){if(/^\s*(?:#.*)?$/.test(l)){s.push(l);continue}a!==void 0&&i.add(a);continue}let c=j1(l);if(c===null)return;if(c!==void 0&&Wv(c,r)){i.add(c[1]);continue}s.push(l)}if(i.size===0)return;O1(t,s.join(`
2433
- `)),C({event:"mcp_cleanup",path:t,removed:[...i]})}catch{}}function Wv(t,e){return t.length<2||t[0]!=="mcp_servers"?!1:e.has(t[1])}function M1(t){let e=new Map,r;for(let s of t.split(/\n/)){let i=Gv(s);if(i===null)return null;if(i!==void 0){r=i;continue}let o=s.indexOf("=");if(o<0)continue;let a=s.slice(0,o).trim(),l=s.slice(o+1).trim(),d=D1(a,r);if(d===null)return null;if(d===void 0||d.length!==3||d[0]!=="mcp_servers"||d[1]!==Wa&&d[1]!==qa)continue;let c=e.get(d[1])??{};if(d[2]==="command"){let u=Vv(l);if(u===null)return null;c.command=u}else if(d[2]==="args"){let u=P1(l);if(u===null)return null;c.args=u}e.set(d[1],c)}let n=new Set;for(let[s,i]of e.entries())s===Wa&&Yv(i.command,i.args)&&n.add(s),s===qa&&zv(i.command,i.args)&&n.add(s);return n}function D1(t,e){if(t.startsWith("mcp_servers"))return Ba(t);if(e===void 0||e.length<2||e[0]!=="mcp_servers")return;let r=Ba(t);return r===null?null:[...e,...r]}function Gv(t){if(!/^\s*\[/.test(t))return;let e=/^\s*\[([^\]\r\n]+)\]\s*(?:#.*)?$/.exec(t);return e===null?null:Ba(e[1])}function j1(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 Ba(r)}function Ba(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="",i=!1;for(;r<t.length;){let o=t[r];if(o==="\\"){if(r+1>=t.length)return null;s+=t[r+1],r+=2;continue}if(o==='"'){r+=1,i=!0;break}s+=o,r+=1}if(!i)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 Vv(t){let e=Kv(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 P1(t){let e=Kv(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=>Vv(s.trim()));return n.some(s=>s===null)?null:n}function Kv(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 F1(t){return qn(t)?t.type==="stdio"&&typeof t.command=="string"&&Yv(t.command,t.args):!1}function U1(t){return!qn(t)||!Array.isArray(t.command)?!1:t.command.length===2&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&Qv(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"&&Zv(t.command[0],[t.command[1],t.command[2]])}function W1(t){return qn(t)?t.type==="stdio"&&zv(t.command,t.args):!1}function q1(t){return!qn(t)||!Array.isArray(t.command)?!1:t.command.length===2&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&eS(t.command[0])&&t.command[1]==="mcp"}function Yv(t,e){return Qv(t)&&tS(e)||Zv(t,e)}function zv(t,e){return eS(t)&&tS(e)}function Zv(t,e){return B1(t)&&Array.isArray(e)&&e.length===2&&H1(e[0])&&e[1]==="mcp"}function Qv(t){return typeof t=="string"&&gm(t)==="lmctl"}function eS(t){return typeof t=="string"&&gm(t)==="lmctl0"}function B1(t){if(typeof t!="string")return!1;let e=gm(t).toLowerCase();return e==="node"||e==="node.exe"}function H1(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 gm(t){let e=t.replace(/\\/g,"/");return e.split("/").filter(n=>n.length>0).at(-1)??e}function tS(t){return Array.isArray(t)&&t.length===1&&t[0]==="mcp"}function qn(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Wa,qa,R1,lt,Bv,Ks=E(()=>{"use strict";me();Wa="lmctl",qa="lmctl0",R1={existsSync:S1,mkdirSync:b1,readFileSync:k1,writeFileSync:A1,renameSync:I1,unlinkSync:N1},lt=R1});function sS(t){let e=rS(t.registry,t.fromTeamfile);if(e===void 0)return Hn(`sender team is not registered in policy graph: ${t.fromTeamfile}`);if(!nS(e,t.fromAlias))return Hn(`sender alias "${t.fromAlias}" not found in ${t.fromTeamfile}`);let r=rS(t.registry,t.toTeamfile);return r===void 0?Hn(`target team is not registered in policy graph: ${t.toTeamfile}`):nS(r,t.toAlias)?t.toTeamfile===t.fromTeamfile?{allowed:!0,outOfPolicy:!1,reason:"same team"}:e.leadAlias===null?Hn(`sender team has no Lead: ${t.fromTeamfile}`):t.fromAlias!==e.leadAlias?Hn(`cross-team sends may only originate from Lead; got "${t.fromAlias}" in ${t.fromTeamfile}`):{allowed:!0,outOfPolicy:!1,reason:"cross-team send from Lead"}:Hn(`target alias "${t.toAlias}" not found in ${t.toTeamfile}`)}function rS(t,e){return t.teams.find(r=>r.teamfile===e)}function nS(t,e){return t.aliases.some(r=>r===e)}function Hn(t){return{allowed:!1,outOfPolicy:!0,reason:t}}var iS=E(()=>{"use strict"});import{randomUUID as X1}from"node:crypto";import{hostname as oS,networkInterfaces as J1}from"node:os";function aS(t){let e=(t.now??new Date).toISOString();return{lock_id:X1(),teamfile:t.teamfile,alias:t.alias,holder_pid:t.pid??process.pid,holder_host:t.host??oS(),holder_ips:t.ips??z1(),started_at:e,last_heartbeat:e}}function lS(t=process.env){return dS(t.LMCTL_TERMINAL_LOCK_HEARTBEAT_MS,G1)}function K1(t=process.env){return dS(t.LMCTL_TERMINAL_LOCK_STALE_MS,V1)}function ym(t,e={}){let r=e.now??new Date,n=e.localHost??oS(),s=e.staleMs??K1();if(t.holder_host===n)return(e.isProcessAlive??Y1)(t.holder_pid)?{live:!0,reason:"local-pid-alive"}:{live:!1,reason:"dead-pid"};let i=Date.parse(t.last_heartbeat);return Number.isFinite(i)?r.getTime()-i<=s?{live:!0,reason:"remote-heartbeat-fresh"}:{live:!1,reason:"stale-heartbeat"}:{live:!1,reason:"stale-heartbeat"}}function Em(t){return`${t.alias} is held by a terminal on ${t.holder_host} since ${t.started_at}; retry later`}function dS(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 Y1(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 z1(){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 G1,V1,wm=E(()=>{"use strict";G1=15e3,V1=12e4});function Tm(t){return`lmctl ${t}: LMCTL_SELF_SESSIONID is not set \u2014 it looks like you are running lmctl
2431
+ `;hm=!1;p1=2e3;h1=100,g1=1e4});import{existsSync as b1,mkdirSync as k1,readFileSync as I1,renameSync as N1,unlinkSync as A1,writeFileSync as x1}from"node:fs";import{homedir as qv}from"node:os";import{dirname as Vs,join as Tt,resolve as R1}from"node:path";function Bn(t,e,r){let n=Vs(R1(r)),s=new Set,i=new Map;for(let o of e.members){if(s.add(o.provider),o.teamfile!==void 0)continue;let a=o.sessiondir??n,l=i.get(a)??new Set;l.add(o.provider),i.set(a,l)}for(let[o,a]of i.entries())Ir(Tt(o,".mcp.json"),"mcpServers",[Un(),Wn()]),a.has("opencode")&&Ir(Tt(o,".opencode","opencode.json"),"mcp",[Xv(),Jv()]);for(let o of s)C1(o)}function Hv(t=Bv??qv()){return Tt(t,".copilot","mcp-config.json")}function O1(t,e){lt.mkdirSync(Vs(t),{recursive:!0});let r=Tt(Vs(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{lt.writeFileSync(r,`${JSON.stringify(e,null,2)}
2432
+ `,"utf8"),lt.renameSync(r,t)}catch(n){try{lt.unlinkSync(r)}catch{}throw n}}function $1(t,e){lt.mkdirSync(Vs(t),{recursive:!0});let r=Tt(Vs(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{lt.writeFileSync(r,e,"utf8"),lt.renameSync(r,t)}catch(n){try{lt.unlinkSync(r)}catch{}throw n}}function Ir(t,e,r){try{if(!lt.existsSync(t))return;let n=JSON.parse(lt.readFileSync(t,"utf8"));if(!qn(n)||!qn(n[e]))return;let s={...n[e]},i=[];for(let{name:o,shouldRemove:a}of r)Object.prototype.hasOwnProperty.call(s,o)&&a(s[o])&&(delete s[o],i.push(o));if(i.length===0)return;n[e]=s,O1(t,n),C({event:"mcp_cleanup",path:t,removed:i})}catch{}}function Un(){return{name:Wa,shouldRemove:q1}}function Xv(){return{name:Wa,shouldRemove:B1}}function Wn(){return{name:Ua,shouldRemove:U1}}function Jv(){return{name:Ua,shouldRemove:W1}}function C1(t){let e=Bv??qv();switch(t){case"copilot":Ir(Hv(e),"mcpServers",[Un(),Wn()]);return;case"claude":Ir(Tt(e,".claude.json"),"mcpServers",[Un(),Wn()]);return;case"gemini":Ir(Tt(e,".gemini","settings.json"),"mcpServers",[Un(),Wn()]);return;case"qwen":Ir(Tt(e,".qwen","settings.json"),"mcpServers",[Un(),Wn()]);return;case"agy":Ir(Tt(e,".gemini","antigravity-cli","settings.json"),"mcpServers",[Un(),Wn()]);return;case"opencode":Ir(Tt(e,".config","opencode","opencode.json"),"mcp",[Xv(),Jv()]);return;case"codex":M1(Tt(e,".codex","config.toml"));return;default:return}}function M1(t){try{if(!lt.existsSync(t))return;let e=lt.readFileSync(t,"utf8"),r=D1(e);if(r===null)return;let n=e.split(/\n/),s=[],i=new Set,o=!1,a;for(let l of n){let d=Gv(l);if(d===null)return;if(d!==void 0){if(Wv(d,r)){o=!0,a=d[1],i.add(a);continue}o=!1,a=void 0,s.push(l);continue}if(o){if(/^\s*(?:#.*)?$/.test(l)){s.push(l);continue}a!==void 0&&i.add(a);continue}let c=P1(l);if(c===null)return;if(c!==void 0&&Wv(c,r)){i.add(c[1]);continue}s.push(l)}if(i.size===0)return;$1(t,s.join(`
2433
+ `)),C({event:"mcp_cleanup",path:t,removed:[...i]})}catch{}}function Wv(t,e){return t.length<2||t[0]!=="mcp_servers"?!1:e.has(t[1])}function D1(t){let e=new Map,r;for(let s of t.split(/\n/)){let i=Gv(s);if(i===null)return null;if(i!==void 0){r=i;continue}let o=s.indexOf("=");if(o<0)continue;let a=s.slice(0,o).trim(),l=s.slice(o+1).trim(),d=j1(a,r);if(d===null)return null;if(d===void 0||d.length!==3||d[0]!=="mcp_servers"||d[1]!==Ua&&d[1]!==Wa)continue;let c=e.get(d[1])??{};if(d[2]==="command"){let u=Vv(l);if(u===null)return null;c.command=u}else if(d[2]==="args"){let u=F1(l);if(u===null)return null;c.args=u}e.set(d[1],c)}let n=new Set;for(let[s,i]of e.entries())s===Ua&&Yv(i.command,i.args)&&n.add(s),s===Wa&&zv(i.command,i.args)&&n.add(s);return n}function j1(t,e){if(t.startsWith("mcp_servers"))return qa(t);if(e===void 0||e.length<2||e[0]!=="mcp_servers")return;let r=qa(t);return r===null?null:[...e,...r]}function Gv(t){if(!/^\s*\[/.test(t))return;let e=/^\s*\[([^\]\r\n]+)\]\s*(?:#.*)?$/.exec(t);return e===null?null:qa(e[1])}function P1(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 qa(r)}function qa(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="",i=!1;for(;r<t.length;){let o=t[r];if(o==="\\"){if(r+1>=t.length)return null;s+=t[r+1],r+=2;continue}if(o==='"'){r+=1,i=!0;break}s+=o,r+=1}if(!i)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 Vv(t){let e=Kv(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 F1(t){let e=Kv(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=>Vv(s.trim()));return n.some(s=>s===null)?null:n}function Kv(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 U1(t){return qn(t)?t.type==="stdio"&&typeof t.command=="string"&&Yv(t.command,t.args):!1}function W1(t){return!qn(t)||!Array.isArray(t.command)?!1:t.command.length===2&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&Qv(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"&&Zv(t.command[0],[t.command[1],t.command[2]])}function q1(t){return qn(t)?t.type==="stdio"&&zv(t.command,t.args):!1}function B1(t){return!qn(t)||!Array.isArray(t.command)?!1:t.command.length===2&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&eS(t.command[0])&&t.command[1]==="mcp"}function Yv(t,e){return Qv(t)&&tS(e)||Zv(t,e)}function zv(t,e){return eS(t)&&tS(e)}function Zv(t,e){return H1(t)&&Array.isArray(e)&&e.length===2&&X1(e[0])&&e[1]==="mcp"}function Qv(t){return typeof t=="string"&&gm(t)==="lmctl"}function eS(t){return typeof t=="string"&&gm(t)==="lmctl0"}function H1(t){if(typeof t!="string")return!1;let e=gm(t).toLowerCase();return e==="node"||e==="node.exe"}function X1(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 gm(t){let e=t.replace(/\\/g,"/");return e.split("/").filter(n=>n.length>0).at(-1)??e}function tS(t){return Array.isArray(t)&&t.length===1&&t[0]==="mcp"}function qn(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Ua,Wa,L1,lt,Bv,Ks=E(()=>{"use strict";me();Ua="lmctl",Wa="lmctl0",L1={existsSync:b1,mkdirSync:k1,readFileSync:I1,writeFileSync:x1,renameSync:N1,unlinkSync:A1},lt=L1});function sS(t){let e=rS(t.registry,t.fromTeamfile);if(e===void 0)return Hn(`sender team is not registered in policy graph: ${t.fromTeamfile}`);if(!nS(e,t.fromAlias))return Hn(`sender alias "${t.fromAlias}" not found in ${t.fromTeamfile}`);let r=rS(t.registry,t.toTeamfile);return r===void 0?Hn(`target team is not registered in policy graph: ${t.toTeamfile}`):nS(r,t.toAlias)?t.toTeamfile===t.fromTeamfile?{allowed:!0,outOfPolicy:!1,reason:"same team"}:e.leadAlias===null?Hn(`sender team has no Lead: ${t.fromTeamfile}`):t.fromAlias!==e.leadAlias?Hn(`cross-team sends may only originate from Lead; got "${t.fromAlias}" in ${t.fromTeamfile}`):{allowed:!0,outOfPolicy:!1,reason:"cross-team send from Lead"}:Hn(`target alias "${t.toAlias}" not found in ${t.toTeamfile}`)}function rS(t,e){return t.teams.find(r=>r.teamfile===e)}function nS(t,e){return t.aliases.some(r=>r===e)}function Hn(t){return{allowed:!1,outOfPolicy:!0,reason:t}}var iS=E(()=>{"use strict"});import{randomUUID as J1}from"node:crypto";import{hostname as oS,networkInterfaces as G1}from"node:os";function aS(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??oS(),holder_ips:t.ips??Z1(),started_at:e,last_heartbeat:e}}function lS(t=process.env){return dS(t.LMCTL_TERMINAL_LOCK_HEARTBEAT_MS,V1)}function Y1(t=process.env){return dS(t.LMCTL_TERMINAL_LOCK_STALE_MS,K1)}function ym(t,e={}){let r=e.now??new Date,n=e.localHost??oS(),s=e.staleMs??Y1();if(t.holder_host===n)return(e.isProcessAlive??z1)(t.holder_pid)?{live:!0,reason:"local-pid-alive"}:{live:!1,reason:"dead-pid"};let i=Date.parse(t.last_heartbeat);return Number.isFinite(i)?r.getTime()-i<=s?{live:!0,reason:"remote-heartbeat-fresh"}:{live:!1,reason:"stale-heartbeat"}:{live:!1,reason:"stale-heartbeat"}}function Em(t){return`${t.alias} is held by a terminal on ${t.holder_host} since ${t.started_at}; retry later`}function dS(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 z1(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 Z1(){let t=new Set;for(let e of Object.values(G1()))for(let r of e??[])r.internal||t.add(r.address);return[...t].sort()}var V1,K1,wm=E(()=>{"use strict";V1=15e3,K1=12e4});function Tm(t){return`lmctl ${t}: LMCTL_SELF_SESSIONID is not set \u2014 it looks like you are running lmctl
2434
2434
  manually, outside a member session that lmctl started. Running lmctl this way is
2435
2435
  not officially supported.
2436
2436
  To experiment with it manually: https://lmctl.com/lmctl/docs/manual-invocation`}function Nr(t){return`lmctl ${t}: LMCTL_SELF_SESSIONID is set but does not match any member of a registered team.
2437
2437
  The session marker may be stale or the team may not be registered in this lmctl database.
2438
2438
  Consulted ${Zn(Q())}
2439
2439
  To experiment with it manually: https://lmctl.com/lmctl/docs/manual-invocation`}function cS(t){return`unknown option --from
2440
- ${Tm(t)}`}function uS(t,e){let r=Xn(t,e);return r.ok?{ok:!0,identity:r.identity,source:"session"}:r}function Xn(t,e){let r=t[fs];if(r===void 0||r.length===0)return{ok:!1,reason:"unset"};let n=[];for(let i of e.listRootTeams()){let o;try{o=qe(i.teamfile_path,e)}catch{continue}for(let a of o.members)a.teamfile===void 0&&a.session===r&&n.push(`${i.teamfile_path}:${a.alias}`)}let s=[...new Set(n)];if(s.length===0)return{ok:!1,reason:"not-found"};if(s.length>1)throw new Error("LMCTL_SELF_SESSIONID matches multiple team members; the team registry is ambiguous");return{ok:!0,identity:s[0]}}var Ys=E(()=>{"use strict";ut();Ye();rr()});function He(t){let e=Jr(t);if(e===null)throw new Error(`invalid agent identity: ${t}`);return{teamfile:e.teamfile,alias:e.alias,value:t}}var Ha=E(()=>{"use strict";wt()});async function Ga(t){let e=t.onEvent??(()=>{}),r=Q1(t.io,e),n=null,s=null,i=null,o,a=null,l=t.prompt;try{let d=await O(r,k=>Me(t.teamfile,t.alias,k)),c=d.teamfile,u=await O(r,k=>aU(k,t.env??process.env)),m=u.sender,f=await lU(r,{explicitRoot:t.rootFlag,sender:m,receiverTeamfile:c,operatorOrigin:u.origin==="operator"}),p=m===null?null:await dU(r,{rootTeamfile:f,sender:m,receiverTeamfile:c,receiverAlias:d.alias});p!==null&&!p.allowed&&e({kind:"warning",message:`warning: out-of-policy chat send: ${p.reason}
2441
- `}),i=await rU(r,{receiverTeamfile:c,receiverAlias:d.alias,sender:m,rootTeamfile:f,provider:d.provider,model:d.model,sessionId:d.sessionid,cwd:d.sessiondir,prompt:t.prompt,origin:u.origin}),o=iU(r,i);try{Bn(r,rt(c),c)}catch{}n={root_teamfile:f,sender_teamfile:m?.teamfile??null,sender_alias:m?.alias??null,receiver_teamfile:c,receiver_alias:d.alias,receiver_provider:d.provider,receiver_session_id:d.sessionid,origin:u.origin,policy:p};let h=await _S(r,c,d.alias);if(h!==null){let k=Em(h);if(m!==null){let A=await vm(r,{sender:m,receiverTeamfile:c,receiverAlias:d.alias,receiverProvider:d.provider,receiverSessionId:d.sessionid,rootTeamfile:f,payload:t.prompt});return a=Xa(`enqueued mailbox message ${A.id}`,null),Sm(A.id,m,c,d.alias)}return Jn(i,n,t.prompt,k,"unavailable"),a=bm(k,null),{status:"busy",message:k,teamChatLogId:null}}let g=await eU(r,c,d.alias);if(g.busy){if(m!==null){let A=await vm(r,{sender:m,receiverTeamfile:c,receiverAlias:d.alias,receiverProvider:d.provider,receiverSessionId:d.sessionid,rootTeamfile:f,payload:t.prompt});return a=Xa(`enqueued mailbox message ${A.id}`,null),Sm(A.id,m,c,d.alias)}let k=await tU(r,c,d.alias);return Jn(i,n,t.prompt,k,"unavailable"),a=bm(k,null),{status:"busy",message:k,teamChatLogId:null}}if(m!==null&&m.teamfile!==c){let k=await O(r,A=>tT(A,{root:f,sender:m,receiverTeamfile:c,receiverAlias:d.alias,now:new Date}));if(k.stop){let A=nT(k.chain);return Jn(i,n,t.prompt,A,"cycle"),a=Ja(A,null),{status:"error",errorKind:"cycle",message:A,teamChatLogId:null}}}let _=await mU(r,{receiver_teamfile:c,receiver_alias:d.alias,sender_teamfile:m?.teamfile??c,sender_alias:m?.alias??"operator",...g.idleReclaim?{force:!0,reclaimReason:"session-idle"}:{}});if(!_.acquired){let k=hS(c,d.alias,_.current);if(m!==null){let A=await vm(r,{sender:m,receiverTeamfile:c,receiverAlias:d.alias,receiverProvider:d.provider,receiverSessionId:d.sessionid,rootTeamfile:f,payload:t.prompt});return a=Xa(`enqueued mailbox message ${A.id}`,null),Sm(A.id,m,c,d.alias)}return Jn(i,n,t.prompt,k,"unavailable"),a=bm(k,null),{status:"busy",message:k,teamChatLogId:null}}s=_.lease;let y=await ga({sender:m??{teamfile:c,alias:"operator"},receiver:{teamfile:c,alias:d.alias,provider:d.provider,sessionId:d.sessionid,cwd:d.sessiondir,...d.model!==void 0?{model:d.model}:{},...d.effort!==void 0?{effort:d.effort}:{},...d.isLead!==void 0?{isLead:d.isLead}:{}},newMessage:t.prompt,newMessageFrom:m===null?"operator":`${m.teamfile}:${m.alias}`,io:r,permissionMode:t.permissionMode,env:t.env??process.env,...t.idleTimeoutMs!==void 0?{idleTimeoutMs:t.idleTimeoutMs}:{},onDelta:k=>e({kind:"delta",chunk:k}),onProgress:k=>e({kind:"progress",alias:d.alias,event:k}),onPromptBuilt:k=>{if(l=k,i!==null)return sU(r,i,k)}});l=y.prompt;let T=y.status==="stalled",v=null;if(T){let k=`provider stalled${y.stalledAfterMs!==void 0?` after ${y.stalledAfterMs}ms`:""}`;Jn(i,n,l,k,"error"),a=Ja(k,null,y.receipt)}else v=await pU(r,{...n,message:l,response:y.receipt,status:n.policy?.outOfPolicy===!0?"out_of_policy":"ok",error_detail:n.policy?.outOfPolicy===!0?n.policy.reason:null}),a=Xa(y.receipt,v);return{status:T?"stalled":"ok",replyText:y.receipt,wroteDelta:y.wroteDelta,teamChatLogId:v,durationMs:y.durationMs}}catch(d){let c=d instanceof Error?d.message:String(d);return Jn(i,n,l,c,"error"),a=Ja(c,null),{status:"error",errorKind:d instanceof ve?"target":"provider",message:c,teamChatLogId:null}}finally{o!==void 0&&clearInterval(o),s!==null&&await fU(r,s),i!==null&&await nU(r,i,a??Ja("chat turn exited without a terminal outcome",null))}}function Q1(t,e){return{...t,stdout:{write:()=>{}},stderr:{write:r=>{e({kind:"warning",message:r})}}}}async function eU(t,e,r){let n=await O(t,i=>Wt(i,e,r));if(!n.busy)return{busy:!1,idleReclaim:!1};let s=await O(t,i=>xa(i,n,e,r));return{busy:!s,idleReclaim:s}}async function tU(t,e,r){let n=await _S(t,e,r);if(n!==null)return Em(n);let s=await O(t,i=>i.getAgentInflight(e,r));return s!==null?hS(e,r,s):`${r} is busy; wait and retry`}async function vm(t,e){return await ya(t,t.env??process.env),await O(t,r=>{let n=Me(e.sender.teamfile,e.sender.alias,r);return r.enqueueMail({sender_teamfile:e.sender.teamfile,sender_alias:e.sender.alias,sender_provider:n.provider,sender_session_id:n.sessionid,receiver_teamfile:e.receiverTeamfile,receiver_alias:e.receiverAlias,receiver_provider:e.receiverProvider,receiver_session_id:e.receiverSessionId,root_teamfile:e.rootTeamfile,payload:e.payload})})}function Sm(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 rU(t,e){try{return(await O(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:oU(e.receiverTeamfile,e.receiverAlias,e.prompt),holder_pid:process.pid,request_payload:e.prompt,meta:JSON.stringify({provider:e.provider,model:e.model??null,sessionid:e.sessionId??null})}))).id}catch(r){return ue()&&je(JSON.stringify({event:"tracked_invocation_start_error",error:r instanceof Error?r.message:String(r)})),null}}async function nU(t,e,r){try{await O(t,n=>{n.finishTrackedInvocation(e,r)})}catch(n){ue()&&je(JSON.stringify({event:"tracked_invocation_finish_error",id:e,error:n instanceof Error?n.message:String(n)}))}}async function sU(t,e,r){try{await O(t,n=>{n.updateTrackedInvocationRequestPayload(e,r)})}catch(n){ue()&&je(JSON.stringify({event:"tracked_invocation_request_payload_error",id:e,error:n instanceof Error?n.message:String(n)}))}}function iU(t,e){if(e===null)return;let r=setInterval(()=>{O(t,n=>n.heartbeatTrackedInvocation(e)).catch(n=>{ue()&&je(JSON.stringify({event:"tracked_invocation_heartbeat_error",id:e,error:n instanceof Error?n.message:String(n)}))})},Z1);return r.unref?.(),r}function Xa(t,e){return{status:"done",result_summary:zs(t),error:null,team_chat_log_id:e}}function bm(t,e){return{status:"busy",result_summary:zs(t),error:t,team_chat_log_id:e}}function Ja(t,e,r){return{status:"error",result_summary:zs(r===void 0?t:r),error:t,team_chat_log_id:e}}function zs(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=500?e:`${e.slice(0,497)}...`}function oU(t,e,r){return`lmctl chat ${JSON.stringify(t)} ${e} ${JSON.stringify(r)}`}function aU(t,e){let r=uS(e,t);if(r.ok)return{sender:He(r.identity),origin:"agent"};if(r.reason==="unset")return{sender:null,origin:"operator"};throw new Error(Nr("chat"))}async function lU(t,e){if(e.explicitRoot!==void 0)return await O(t,n=>Te(e.explicitRoot,n));if(e.operatorOrigin||e.sender===null)return e.receiverTeamfile;let r=e.sender;return await O(t,n=>rT(n,{sender:r,now:new Date})??e.receiverTeamfile)}async function dU(t,e){return await O(t,r=>sS({rootTeamfile:e.rootTeamfile,fromTeamfile:e.sender.teamfile,fromAlias:e.sender.alias,toTeamfile:e.receiverTeamfile,toAlias:e.receiverAlias,registry:cU(r,e.sender.teamfile,e.receiverTeamfile)}))}function cU(t,e,r){return{teams:[e,r].map(s=>uU(s,t))}}function uU(t,e){let r=qe(t,e),n=Dt(r);return{teamfile:t,aliases:r.members.map(s=>s.alias),leadAlias:n?.alias??null}}async function mU(t,e){return await O(t,r=>{let n=ue(),s=ar(r,{receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,ttlMs:br(),...e.force===!0?{force:!0}:{},...e.reclaimReason===void 0?{}:{reclaimReason:e.reclaimReason}});return s.acquired?(n&&je(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:fS(s.previous)}})),{acquired:!0,lease:s.lease}):(n&&je(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:fS(s.current)})),{acquired:!1,current:s.current})})}async function _S(t,e,r){return await O(t,n=>{for(let i=0;i<2;i+=1){let o=n.getTerminalLock(e,r);if(o===null)return null;if(ym(o).live)return o;let l=n.getAgentInflight(e,r);if(n.clearTerminalLock(e,r,o.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:ym(s).live?s:null})}function fS(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 fU(t,e){try{await O(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)}
2442
- `)}}function hS(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 pU(t,e){let r=pS(e.message),n=e.response===null?null:pS(e.response);try{return await O(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,receiver_provider:e.receiver_provider,receiver_session_id:e.receiver_session_id,provider_prompt:e.message,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)}
2443
- `),null}}function Jn(t,e,r,n,s){t!==null||e===null||C({event:"chat_attempt_error",reason:s,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,origin:e.origin,error_detail:n,message_preview:zs(r)})}function pS(t){return t.length<=mS?{text:t,truncated:!1}:{text:t.slice(0,mS),truncated:!0}}var mS,Z1,km=E(()=>{"use strict";wt();tr();Ks();iS();rr();Ea();me();Ce();lr();Pu();wm();Ys();Ha();Iu();mS=256*1024,Z1=3e4});var vS={};he(vS,{parseIdleTimeoutMs:()=>wS,resolvePromptInput:()=>ES,runChat:()=>gU});import{readFileSync as _U}from"node:fs";async function gU(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(`${yS}
2444
- `),t.length===0?2:0;let n=yU(t);if(typeof n=="string")return e.stderr.write(`error: ${n}
2440
+ ${Tm(t)}`}function uS(t,e){let r=Xn(t,e);return r.ok?{ok:!0,identity:r.identity,source:"session"}:r}function Xn(t,e){let r=t[fs];if(r===void 0||r.length===0)return{ok:!1,reason:"unset"};let n=[];for(let i of e.listRootTeams()){let o;try{o=qe(i.teamfile_path,e)}catch{continue}for(let a of o.members)a.teamfile===void 0&&a.session===r&&n.push(`${i.teamfile_path}:${a.alias}`)}let s=[...new Set(n)];if(s.length===0)return{ok:!1,reason:"not-found"};if(s.length>1)throw new Error("LMCTL_SELF_SESSIONID matches multiple team members; the team registry is ambiguous");return{ok:!0,identity:s[0]}}var Ys=E(()=>{"use strict";ut();Ye();rr()});function He(t){let e=Jr(t);if(e===null)throw new Error(`invalid agent identity: ${t}`);return{teamfile:e.teamfile,alias:e.alias,value:t}}var Ba=E(()=>{"use strict";wt()});async function Ja(t){let e=t.onEvent??(()=>{}),r=eU(t.io,e),n=null,s=null,i=null,o,a=null,l=t.prompt;try{let d=await O(r,k=>Me(t.teamfile,t.alias,k)),c=d.teamfile,u=await O(r,k=>lU(k,t.env??process.env)),m=u.sender,f=await dU(r,{explicitRoot:t.rootFlag,sender:m,receiverTeamfile:c,operatorOrigin:u.origin==="operator"}),p=m===null?null:await cU(r,{rootTeamfile:f,sender:m,receiverTeamfile:c,receiverAlias:d.alias});p!==null&&!p.allowed&&e({kind:"warning",message:`warning: out-of-policy chat send: ${p.reason}
2441
+ `}),i=await nU(r,{receiverTeamfile:c,receiverAlias:d.alias,sender:m,rootTeamfile:f,provider:d.provider,model:d.model,sessionId:d.sessionid,cwd:d.sessiondir,prompt:t.prompt,origin:u.origin}),o=oU(r,i);try{Bn(r,rt(c),c)}catch{}n={root_teamfile:f,sender_teamfile:m?.teamfile??null,sender_alias:m?.alias??null,receiver_teamfile:c,receiver_alias:d.alias,receiver_provider:d.provider,receiver_session_id:d.sessionid,origin:u.origin,policy:p};let h=await _S(r,c,d.alias);if(h!==null){let k=Em(h);if(m!==null){let A=await vm(r,{sender:m,receiverTeamfile:c,receiverAlias:d.alias,receiverProvider:d.provider,receiverSessionId:d.sessionid,rootTeamfile:f,payload:t.prompt});return a=Ha(`enqueued mailbox message ${A.id}`,null),Sm(A.id,m,c,d.alias)}return Jn(i,n,t.prompt,k,"unavailable"),a=bm(k,null),{status:"busy",message:k,teamChatLogId:null}}let g=await tU(r,c,d.alias);if(g.busy){if(m!==null){let A=await vm(r,{sender:m,receiverTeamfile:c,receiverAlias:d.alias,receiverProvider:d.provider,receiverSessionId:d.sessionid,rootTeamfile:f,payload:t.prompt});return a=Ha(`enqueued mailbox message ${A.id}`,null),Sm(A.id,m,c,d.alias)}let k=await rU(r,c,d.alias);return Jn(i,n,t.prompt,k,"unavailable"),a=bm(k,null),{status:"busy",message:k,teamChatLogId:null}}if(m!==null&&m.teamfile!==c){let k=await O(r,A=>tT(A,{root:f,sender:m,receiverTeamfile:c,receiverAlias:d.alias,now:new Date}));if(k.stop){let A=nT(k.chain);return Jn(i,n,t.prompt,A,"cycle"),a=Xa(A,null),{status:"error",errorKind:"cycle",message:A,teamChatLogId:null}}}let _=await fU(r,{receiver_teamfile:c,receiver_alias:d.alias,sender_teamfile:m?.teamfile??c,sender_alias:m?.alias??"operator",...g.idleReclaim?{force:!0,reclaimReason:"session-idle"}:{}});if(!_.acquired){let k=hS(c,d.alias,_.current);if(m!==null){let A=await vm(r,{sender:m,receiverTeamfile:c,receiverAlias:d.alias,receiverProvider:d.provider,receiverSessionId:d.sessionid,rootTeamfile:f,payload:t.prompt});return a=Ha(`enqueued mailbox message ${A.id}`,null),Sm(A.id,m,c,d.alias)}return Jn(i,n,t.prompt,k,"unavailable"),a=bm(k,null),{status:"busy",message:k,teamChatLogId:null}}s=_.lease;let y=await ga({sender:m??{teamfile:c,alias:"operator"},receiver:{teamfile:c,alias:d.alias,provider:d.provider,sessionId:d.sessionid,cwd:d.sessiondir,...d.model!==void 0?{model:d.model}:{},...d.effort!==void 0?{effort:d.effort}:{},...d.isLead!==void 0?{isLead:d.isLead}:{}},newMessage:t.prompt,newMessageFrom:m===null?"operator":`${m.teamfile}:${m.alias}`,io:r,permissionMode:t.permissionMode,env:t.env??process.env,...t.idleTimeoutMs!==void 0?{idleTimeoutMs:t.idleTimeoutMs}:{},onDelta:k=>e({kind:"delta",chunk:k}),onProgress:k=>e({kind:"progress",alias:d.alias,event:k}),onPromptBuilt:k=>{if(l=k,i!==null)return iU(r,i,k)}});l=y.prompt;let T=y.status==="stalled",v=null;if(T){let k=`provider stalled${y.stalledAfterMs!==void 0?` after ${y.stalledAfterMs}ms`:""}`;Jn(i,n,l,k,"error"),a=Xa(k,null,y.receipt)}else v=await _U(r,{...n,message:l,response:y.receipt,status:n.policy?.outOfPolicy===!0?"out_of_policy":"ok",error_detail:n.policy?.outOfPolicy===!0?n.policy.reason:null}),a=Ha(y.receipt,v);return{status:T?"stalled":"ok",replyText:y.receipt,wroteDelta:y.wroteDelta,teamChatLogId:v,durationMs:y.durationMs}}catch(d){let c=d instanceof Error?d.message:String(d);return Jn(i,n,l,c,"error"),a=Xa(c,null),{status:"error",errorKind:d instanceof ve?"target":"provider",message:c,teamChatLogId:null}}finally{o!==void 0&&clearInterval(o),s!==null&&await pU(r,s),i!==null&&await sU(r,i,a??Xa("chat turn exited without a terminal outcome",null))}}function eU(t,e){return{...t,stdout:{write:()=>{}},stderr:{write:r=>{e({kind:"warning",message:r})}}}}async function tU(t,e,r){let n=await O(t,i=>Wt(i,e,r));if(!n.busy)return{busy:!1,idleReclaim:!1};let s=await O(t,i=>Aa(i,n,e,r));return{busy:!s,idleReclaim:s}}async function rU(t,e,r){let n=await _S(t,e,r);if(n!==null)return Em(n);let s=await O(t,i=>i.getAgentInflight(e,r));return s!==null?hS(e,r,s):`${r} is busy; wait and retry`}async function vm(t,e){return await ya(t,t.env??process.env),await O(t,r=>{let n=Me(e.sender.teamfile,e.sender.alias,r);return r.enqueueMail({sender_teamfile:e.sender.teamfile,sender_alias:e.sender.alias,sender_provider:n.provider,sender_session_id:n.sessionid,receiver_teamfile:e.receiverTeamfile,receiver_alias:e.receiverAlias,receiver_provider:e.receiverProvider,receiver_session_id:e.receiverSessionId,root_teamfile:e.rootTeamfile,payload:e.payload})})}function Sm(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 nU(t,e){try{return(await O(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:aU(e.receiverTeamfile,e.receiverAlias,e.prompt),holder_pid:process.pid,request_payload:e.prompt,meta:JSON.stringify({provider:e.provider,model:e.model??null,sessionid:e.sessionId??null})}))).id}catch(r){return ue()&&je(JSON.stringify({event:"tracked_invocation_start_error",error:r instanceof Error?r.message:String(r)})),null}}async function sU(t,e,r){try{await O(t,n=>{n.finishTrackedInvocation(e,r)})}catch(n){ue()&&je(JSON.stringify({event:"tracked_invocation_finish_error",id:e,error:n instanceof Error?n.message:String(n)}))}}async function iU(t,e,r){try{await O(t,n=>{n.updateTrackedInvocationRequestPayload(e,r)})}catch(n){ue()&&je(JSON.stringify({event:"tracked_invocation_request_payload_error",id:e,error:n instanceof Error?n.message:String(n)}))}}function oU(t,e){if(e===null)return;let r=setInterval(()=>{O(t,n=>n.heartbeatTrackedInvocation(e)).catch(n=>{ue()&&je(JSON.stringify({event:"tracked_invocation_heartbeat_error",id:e,error:n instanceof Error?n.message:String(n)}))})},Q1);return r.unref?.(),r}function Ha(t,e){return{status:"done",result_summary:zs(t),error:null,team_chat_log_id:e}}function bm(t,e){return{status:"busy",result_summary:zs(t),error:t,team_chat_log_id:e}}function Xa(t,e,r){return{status:"error",result_summary:zs(r===void 0?t:r),error:t,team_chat_log_id:e}}function zs(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=500?e:`${e.slice(0,497)}...`}function aU(t,e,r){return`lmctl chat ${JSON.stringify(t)} ${e} ${JSON.stringify(r)}`}function lU(t,e){let r=uS(e,t);if(r.ok)return{sender:He(r.identity),origin:"agent"};if(r.reason==="unset")return{sender:null,origin:"operator"};throw new Error(Nr("chat"))}async function dU(t,e){if(e.explicitRoot!==void 0)return await O(t,n=>Te(e.explicitRoot,n));if(e.operatorOrigin||e.sender===null)return e.receiverTeamfile;let r=e.sender;return await O(t,n=>rT(n,{sender:r,now:new Date})??e.receiverTeamfile)}async function cU(t,e){return await O(t,r=>sS({rootTeamfile:e.rootTeamfile,fromTeamfile:e.sender.teamfile,fromAlias:e.sender.alias,toTeamfile:e.receiverTeamfile,toAlias:e.receiverAlias,registry:uU(r,e.sender.teamfile,e.receiverTeamfile)}))}function uU(t,e,r){return{teams:[e,r].map(s=>mU(s,t))}}function mU(t,e){let r=qe(t,e),n=Dt(r);return{teamfile:t,aliases:r.members.map(s=>s.alias),leadAlias:n?.alias??null}}async function fU(t,e){return await O(t,r=>{let n=ue(),s=ar(r,{receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,ttlMs:br(),...e.force===!0?{force:!0}:{},...e.reclaimReason===void 0?{}:{reclaimReason:e.reclaimReason}});return s.acquired?(n&&je(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:fS(s.previous)}})),{acquired:!0,lease:s.lease}):(n&&je(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:fS(s.current)})),{acquired:!1,current:s.current})})}async function _S(t,e,r){return await O(t,n=>{for(let i=0;i<2;i+=1){let o=n.getTerminalLock(e,r);if(o===null)return null;if(ym(o).live)return o;let l=n.getAgentInflight(e,r);if(n.clearTerminalLock(e,r,o.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:ym(s).live?s:null})}function fS(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 pU(t,e){try{await O(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)}
2442
+ `)}}function hS(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 _U(t,e){let r=pS(e.message),n=e.response===null?null:pS(e.response);try{return await O(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,receiver_provider:e.receiver_provider,receiver_session_id:e.receiver_session_id,provider_prompt:e.message,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)}
2443
+ `),null}}function Jn(t,e,r,n,s){t!==null||e===null||C({event:"chat_attempt_error",reason:s,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,origin:e.origin,error_detail:n,message_preview:zs(r)})}function pS(t){return t.length<=mS?{text:t,truncated:!1}:{text:t.slice(0,mS),truncated:!0}}var mS,Q1,km=E(()=>{"use strict";wt();tr();Ks();iS();rr();Ea();me();Ce();lr();Pu();wm();Ys();Ba();ku();mS=256*1024,Q1=3e4});var vS={};he(vS,{parseIdleTimeoutMs:()=>wS,resolvePromptInput:()=>ES,runChat:()=>yU});import{readFileSync as hU}from"node:fs";async function yU(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(`${yS}
2444
+ `),t.length===0?2:0;let n=EU(t);if(typeof n=="string")return e.stderr.write(`error: ${n}
2445
2445
  ${yS}
2446
2446
  `),2;if(n.promptFile!==void 0){let u=await ES(n.promptFile,e);if(typeof u!="string")return e.stderr.write(`error: ${u.error}
2447
2447
  `),2;n.prompt=u}if(n.runFlag!==void 0){let u=Number.parseInt(n.runFlag,10);return!Number.isFinite(u)||u<=0||String(u)!==n.runFlag?(e.stderr.write(`error: invalid --run "${n.runFlag}" (expected a positive integer run id)
@@ -2454,10 +2454,10 @@ ${yS}
2454
2454
  `),1;let g=m.resumeInteractive(h.step_id,n.prompt,n.done===!0);return g.resumed===!0?(e.stdout.write(`run ${u}: interactive resumed (step ${h.step_id}${n.done===!0?", done":""})
2455
2455
  `),0):(e.stderr.write(`error: run ${u}: resumeInteractive failed (${g.reason})
2456
2456
  `),1)}return e.stderr.write(`error: run ${u}: pending attention kind "${p.kind}" is not operator-answerable
2457
- `),1})}let s=kr(hU,{target:n.target,alias:n.alias,flags:{session:n.sessionFlag,provider:n.providerFlag}});if(s.mode==="error")return e.stderr.write(`error: ${s.message}
2457
+ `),1})}let s=kr(gU,{target:n.target,alias:n.alias,flags:{session:n.sessionFlag,provider:n.providerFlag}});if(s.mode==="error")return e.stderr.write(`error: ${s.message}
2458
2458
  `),2;if(s.mode==="managed")return e.stderr.write(`error: chat managed mode requires --run <id>
2459
2459
  `),2;let i;if(s.mode==="ai-team"){if(s.alias===void 0)return e.stderr.write(`error: chat: alias required (internal)
2460
- `),2;let u=await Ga({teamfile:s.teamfile,alias:s.alias,prompt:n.prompt,permissionMode:n.permissionMode,...n.idleTimeoutMs!==void 0?{idleTimeoutMs:n.idleTimeoutMs}:{},...n.rootFlag!==void 0?{rootFlag:n.rootFlag}:{},env:r,io:e,onEvent:m=>TU(e,m)});return n.json===!0?u.status==="enqueued"?(e.stdout.write(`${JSON.stringify({status:"enqueued",path:"enqueued",id:u.id,sender:u.sender,receiver:u.receiver})}
2460
+ `),2;let u=await Ja({teamfile:s.teamfile,alias:s.alias,prompt:n.prompt,permissionMode:n.permissionMode,...n.idleTimeoutMs!==void 0?{idleTimeoutMs:n.idleTimeoutMs}:{},...n.rootFlag!==void 0?{rootFlag:n.rootFlag}:{},env:r,io:e,onEvent:m=>vU(e,m)});return n.json===!0?u.status==="enqueued"?(e.stdout.write(`${JSON.stringify({status:"enqueued",path:"enqueued",id:u.id,sender:u.sender,receiver:u.receiver})}
2461
2461
  `),0):u.status==="busy"?(e.stdout.write(`${JSON.stringify({status:"busy",message:u.message,teamChatLogId:u.teamChatLogId})}
2462
2462
  `),1):u.status==="error"?(e.stdout.write(`${JSON.stringify({status:"error",errorKind:u.errorKind,message:u.message,teamChatLogId:u.teamChatLogId})}
2463
2463
  `),1):(e.stdout.write(`${JSON.stringify({status:u.status,replyText:u.replyText,teamChatLogId:u.teamChatLogId})}
@@ -2470,20 +2470,20 @@ ${yS}
2470
2470
  `):e.stdout.write(`${u.replyText}${u.replyText.endsWith(`
2471
2471
  `)?"":`
2472
2472
  `}`),u.status==="stalled"?1:0)}else{if(s.provider===void 0)return e.stderr.write(`error: chat raw mode (bare sessionid / --session) requires --provider <name>
2473
- `),2;i={provider:s.provider,sessionId:s.sessionid,cwd:process.cwd()}}let o=!1,a=ue(),l=0,d=0,c=0;try{let u={provider:i.provider,sessionId:i.sessionId,cwd:i.cwd,prompt:n.prompt,permissionMode:n.permissionMode,env:r,onDelta:p=>{o=!0,a&&(l+=1,c=Buffer.byteLength(p,"utf8"),d+=c),e.stdout.write(p)},onProgress:p=>TS(e,i.alias??"(raw)",p)};i.model!==void 0&&(u.model=i.model),i.effort!==void 0&&(u.effort=i.effort),i.alias!==void 0&&(u.alias=i.alias),i.isLead!==void 0&&(u.isLead=i.isLead),n.idleTimeoutMs!==void 0&&(u.timeoutMs=n.idleTimeoutMs);let m=await Rt(u);a&&je(JSON.stringify({event:"chat_return",alias:i.alias??"(raw)",provider:i.provider,streamed:o,blockCount:l,streamedBytes:d,resultTextBytes:Buffer.byteLength(m.text,"utf8"),lastChunkBytes:c,tailPreview:wU(m.text,200)}));let f=m.status==="stalled";return o?m.text.endsWith(`
2473
+ `),2;i={provider:s.provider,sessionId:s.sessionid,cwd:process.cwd()}}let o=!1,a=ue(),l=0,d=0,c=0;try{let u={provider:i.provider,sessionId:i.sessionId,cwd:i.cwd,prompt:n.prompt,permissionMode:n.permissionMode,env:r,onDelta:p=>{o=!0,a&&(l+=1,c=Buffer.byteLength(p,"utf8"),d+=c),e.stdout.write(p)},onProgress:p=>TS(e,i.alias??"(raw)",p)};i.model!==void 0&&(u.model=i.model),i.effort!==void 0&&(u.effort=i.effort),i.alias!==void 0&&(u.alias=i.alias),i.isLead!==void 0&&(u.isLead=i.isLead),n.idleTimeoutMs!==void 0&&(u.timeoutMs=n.idleTimeoutMs);let m=await Rt(u);a&&je(JSON.stringify({event:"chat_return",alias:i.alias??"(raw)",provider:i.provider,streamed:o,blockCount:l,streamedBytes:d,resultTextBytes:Buffer.byteLength(m.text,"utf8"),lastChunkBytes:c,tailPreview:TU(m.text,200)}));let f=m.status==="stalled";return o?m.text.endsWith(`
2474
2474
  `)||e.stdout.write(`
2475
2475
  `):e.stdout.write(`${m.text}${m.text.endsWith(`
2476
2476
  `)?"":`
2477
2477
  `}`),m.status==="stalled"?1:0}catch(u){let m=u instanceof Error?u.message:String(u);return e.stderr.write(`error: ${m}
2478
- `),1}}function yU(t){let e=[],r="yolo",n,s,i,o,a,l,d=!1,c=!1;for(let h=0;h<t.length;h+=1){let g=t[h];if(g==="--permission-mode"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --permission-mode";if(_!=="plan"&&_!=="yolo")return`--permission-mode must be one of plan|yolo (got "${_}")`;r=_;continue}if(g==="--idle-timeout"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --idle-timeout";let y=wS(_);if(typeof y=="string")return y;n=y;continue}if(g==="--session"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --session";s=_;continue}if(g==="--provider"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --provider";i=_;continue}if(g==="--from"||g.startsWith("--from="))return cS("chat");if(g.startsWith("I_am="))return`unknown argument: ${g}`;if(g==="--root"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --root";o=_;continue}if(g==="--prompt-file"){let _=t[++h];if(_===void 0||_!=="-"&&_.startsWith("--"))return"missing value for --prompt-file";a=_;continue}if(g==="--force"||g.startsWith("--force="))return"unknown option --force (a dead holder auto-reclaims; for a live holder use lmctl chat)";if(g==="--json"){c=!0;continue}if(g==="--run"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --run";l=_;continue}if(g==="--done"){d=!0;continue}if(g.startsWith("--"))return`unknown flag: ${g}`;e.push(g)}if(l!==void 0){if(s!==void 0)return"--run is mutually exclusive with --session";if(i!==void 0)return"--run is mutually exclusive with --provider";if(o!==void 0)return"--run is mutually exclusive with --root";if(a!==void 0&&e.length>0)return"--prompt-file is mutually exclusive with a positional answer; pass one or the other";if(a===void 0&&e.length===0)return"a prompt (answer) is required with --run";if(e.length>1)return`--run takes exactly one positional (the answer); got ${e.length}`;let h={prompt:a!==void 0?"":e[0],permissionMode:r,runFlag:l,done:d,json:c};return a!==void 0&&(h.promptFile=a),h}let u,m,f;if(a!==void 0){if(e.length===0){if(s===void 0)return"expected <teamfile>:<alias> --prompt-file <path> | <teamfile> <alias> --prompt-file <path> | --session <id> --prompt-file <path>"}else if(e.length===1)u=e[0];else if(e.length===2)u=e[0],m=e[1];else return"--prompt-file is mutually exclusive with a positional prompt; pass one or the other";f=""}else{if(e.length===0)return"a prompt is required";if(e.length===1){if(s===void 0)return'expected <teamfile>:<alias> "<prompt>" | <teamfile> <alias> "<prompt>" | <sessionid> "<prompt>" | --session <id> "<prompt>"';f=e[0]}else if(e.length===2)u=e[0],f=e[1];else if(e.length===3)u=e[0],m=e[1],f=e[2];else return`too many positionals (${e.length}); expected at most <teamfile> <alias> <prompt>`}if(d)return"--done requires --run";let p={prompt:f,permissionMode:r};return u!==void 0&&(p.target=u),m!==void 0&&(p.alias=m),n!==void 0&&(p.idleTimeoutMs=n),s!==void 0&&(p.sessionFlag=s),i!==void 0&&(p.providerFlag=i),o!==void 0&&(p.rootFlag=o),a!==void 0&&(p.promptFile=a),c&&(p.json=c),p}async function ES(t,e,r=process.stdin){let n;try{n=t==="-"?await EU(r):_U(t,"utf8")}catch(o){let a=o instanceof Error?o.message:String(o);return{error:`--prompt-file ${t}: ${a}`}}let s=n.endsWith(`\r
2478
+ `),1}}function EU(t){let e=[],r="yolo",n,s,i,o,a,l,d=!1,c=!1;for(let h=0;h<t.length;h+=1){let g=t[h];if(g==="--permission-mode"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --permission-mode";if(_!=="plan"&&_!=="yolo")return`--permission-mode must be one of plan|yolo (got "${_}")`;r=_;continue}if(g==="--idle-timeout"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --idle-timeout";let y=wS(_);if(typeof y=="string")return y;n=y;continue}if(g==="--session"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --session";s=_;continue}if(g==="--provider"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --provider";i=_;continue}if(g==="--from"||g.startsWith("--from="))return cS("chat");if(g.startsWith("I_am="))return`unknown argument: ${g}`;if(g==="--root"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --root";o=_;continue}if(g==="--prompt-file"){let _=t[++h];if(_===void 0||_!=="-"&&_.startsWith("--"))return"missing value for --prompt-file";a=_;continue}if(g==="--force"||g.startsWith("--force="))return"unknown option --force (a dead holder auto-reclaims; for a live holder use lmctl chat)";if(g==="--json"){c=!0;continue}if(g==="--run"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --run";l=_;continue}if(g==="--done"){d=!0;continue}if(g.startsWith("--"))return`unknown flag: ${g}`;e.push(g)}if(l!==void 0){if(s!==void 0)return"--run is mutually exclusive with --session";if(i!==void 0)return"--run is mutually exclusive with --provider";if(o!==void 0)return"--run is mutually exclusive with --root";if(a!==void 0&&e.length>0)return"--prompt-file is mutually exclusive with a positional answer; pass one or the other";if(a===void 0&&e.length===0)return"a prompt (answer) is required with --run";if(e.length>1)return`--run takes exactly one positional (the answer); got ${e.length}`;let h={prompt:a!==void 0?"":e[0],permissionMode:r,runFlag:l,done:d,json:c};return a!==void 0&&(h.promptFile=a),h}let u,m,f;if(a!==void 0){if(e.length===0){if(s===void 0)return"expected <teamfile>:<alias> --prompt-file <path> | <teamfile> <alias> --prompt-file <path> | --session <id> --prompt-file <path>"}else if(e.length===1)u=e[0];else if(e.length===2)u=e[0],m=e[1];else return"--prompt-file is mutually exclusive with a positional prompt; pass one or the other";f=""}else{if(e.length===0)return"a prompt is required";if(e.length===1){if(s===void 0)return'expected <teamfile>:<alias> "<prompt>" | <teamfile> <alias> "<prompt>" | <sessionid> "<prompt>" | --session <id> "<prompt>"';f=e[0]}else if(e.length===2)u=e[0],f=e[1];else if(e.length===3)u=e[0],m=e[1],f=e[2];else return`too many positionals (${e.length}); expected at most <teamfile> <alias> <prompt>`}if(d)return"--done requires --run";let p={prompt:f,permissionMode:r};return u!==void 0&&(p.target=u),m!==void 0&&(p.alias=m),n!==void 0&&(p.idleTimeoutMs=n),s!==void 0&&(p.sessionFlag=s),i!==void 0&&(p.providerFlag=i),o!==void 0&&(p.rootFlag=o),a!==void 0&&(p.promptFile=a),c&&(p.json=c),p}async function ES(t,e,r=process.stdin){let n;try{n=t==="-"?await wU(r):hU(t,"utf8")}catch(o){let a=o instanceof Error?o.message:String(o);return{error:`--prompt-file ${t}: ${a}`}}let s=n.endsWith(`\r
2479
2479
  `)?n.slice(0,-2):n.endsWith(`
2480
2480
  `)?n.slice(0,-1):n;if(s.length===0)return{error:`--prompt-file ${t}: file is empty; a prompt is required`};let i=Buffer.byteLength(s,"utf8");return i>65536&&e.stderr.write(`warning: prompt is ${i} bytes, over the ${65536}-byte mailbox payload cap.
2481
2481
  It sends intact to an idle receiver, but if the receiver is BUSY the message is queued and
2482
2482
  the stored copy is truncated to the cap. Split it or wait for the receiver to be idle.
2483
- `),s}async function EU(t){let e=[];for await(let r of t)e.push(typeof r=="string"?Buffer.from(r,"utf8"):r);return Buffer.concat(e).toString("utf8")}function wS(t){if(t==="0")return 0;if(/^\d+$/.test(t))return Number(t);let e=/^(\d+)([smhd])$/.exec(t);if(e===null)return`invalid --idle-timeout "${t}" (expected <n>(s|m|h|d), integer ms, or 0)`;let r=Number(e[1]),n=e[2];return r*(n==="s"?1e3:n==="m"?6e4:n==="h"?36e5:864e5)}function TS(t,e,r){r.kind==="tool_use"?t.stderr.write(`[${e}] tool_use ${r.tool??"tool"}${r.summary?`: ${r.summary}`:""}
2483
+ `),s}async function wU(t){let e=[];for await(let r of t)e.push(typeof r=="string"?Buffer.from(r,"utf8"):r);return Buffer.concat(e).toString("utf8")}function wS(t){if(t==="0")return 0;if(/^\d+$/.test(t))return Number(t);let e=/^(\d+)([smhd])$/.exec(t);if(e===null)return`invalid --idle-timeout "${t}" (expected <n>(s|m|h|d), integer ms, or 0)`;let r=Number(e[1]),n=e[2];return r*(n==="s"?1e3:n==="m"?6e4:n==="h"?36e5:864e5)}function TS(t,e,r){r.kind==="tool_use"?t.stderr.write(`[${e}] tool_use ${r.tool??"tool"}${r.summary?`: ${r.summary}`:""}
2484
2484
  `):r.kind==="tool_result"?t.stderr.write(`[${e}] tool_result${r.status?` ${r.status}`:""}${r.summary?`: ${r.summary}`:""}
2485
2485
  `):r.kind==="api_retry"&&t.stderr.write(`[${e}] api_retry${r.summary?`: ${r.summary}`:""}
2486
- `)}function wU(t,e){return t.slice(-e)}function TU(t,e){e.kind==="delta"?t.stdout.write(e.chunk):e.kind==="progress"?TS(t,e.alias,e.event):t.stderr.write(e.message)}var hU,yS,SS=E(()=>{"use strict";Lt();Il();Ce();wt();km();Ys();me();ca();Vt();hU={name:"chat",allowsBareTeamfile:!1,supportsRaw:!0},yS=`usage: lmctl chat <teamfile>:<alias> "<prompt>"
2486
+ `)}function TU(t,e){return t.slice(-e)}function vU(t,e){e.kind==="delta"?t.stdout.write(e.chunk):e.kind==="progress"?TS(t,e.alias,e.event):t.stderr.write(e.message)}var gU,yS,SS=E(()=>{"use strict";Lt();kl();Ce();wt();km();Ys();me();ca();Vt();gU={name:"chat",allowsBareTeamfile:!1,supportsRaw:!0},yS=`usage: lmctl chat <teamfile>:<alias> "<prompt>"
2487
2487
  lmctl chat <teamfile> <alias> "<prompt>"
2488
2488
  lmctl chat <sessionid> "<prompt>" --provider <name>
2489
2489
  lmctl chat --provider <name> --session <id> "<prompt>"
@@ -2501,40 +2501,40 @@ Safe input (no shell involved) \u2014 use for anything non-trivial:
2501
2501
  your file-writing tool (not echo/heredoc), then pass --prompt-file.
2502
2502
  --permission-mode defaults to yolo.
2503
2503
 
2504
- Send a prompt to a team member or raw provider session, or answer a paused run.`});function Zs(t){for(let e=t.length-1;e>=0;e-=1){let r=t[e],n=vU.exec(r.content);if(n===null){if(r.role==="assistant"&&r.content.trim().length>0)return null;continue}let s=Number.parseInt(n[1],10),i=n[2]===void 0?0:Number.parseInt(n[2],10),o=n[3].toLowerCase(),a=n[4]?.trim()??null,l=`${n[1]}${n[2]!==void 0?`:${n[2]}`:""}${o}`;return{state:"LIMITED",resets_at:a===null?null:SU(r.timestamp,s,i,o,a),reset_time:l,timezone:a,detected_at:r.timestamp.toISOString()}}return null}function SU(t,e,r,n,s){if(!Number.isFinite(t.getTime())||e<1||e>12||r<0||r>59)return null;let i=bU(e,n);try{let o=kU(t,s),a=bS(o.year,o.month,o.day,i,r,s);if(a.getTime()<=t.getTime()){let l=xU(o,1);a=bS(l.year,l.month,l.day,i,r,s)}return a.toISOString()}catch{return null}}function bU(t,e){return e==="am"?t===12?0:t:t===12?12:t+12}function kU(t,e){let r=kS(e,!1).formatToParts(t);return{year:sr(r,"year"),month:sr(r,"month"),day:sr(r,"day")}}function bS(t,e,r,n,s,i){let o=Date.UTC(t,e-1,r,n,s,0,0);for(let a=0;a<3;a+=1){let l=IU(new Date(o),i);o=Date.UTC(t,e-1,r,n,s,0,0)-l}return new Date(o)}function IU(t,e){let r=kS(e,!0).formatToParts(t);return Date.UTC(sr(r,"year"),sr(r,"month")-1,sr(r,"day"),sr(r,"hour"),sr(r,"minute"),sr(r,"second"),0)-t.getTime()}function kS(t,e){let r=e?AU:NU,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 sr(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 xU(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 vU,NU,AU,Im=E(()=>{"use strict";vU=/you['\u2019]ve hit your session limit\s*(?:\u00b7|-|:)?\s*resets\s+([0-9]{1,2})(?::([0-9]{2}))?\s*(am|pm)\s*(?:\(([^)]+)\))?/i;NU=new Map,AU=new Map});var AS={};he(AS,{runRecover:()=>LU});import{dirname as IS,resolve as NS}from"node:path";async function LU(t,e,r={}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${Nm}
2504
+ Send a prompt to a team member or raw provider session, or answer a paused run.`});function Zs(t){for(let e=t.length-1;e>=0;e-=1){let r=t[e],n=SU.exec(r.content);if(n===null){if(r.role==="assistant"&&r.content.trim().length>0)return null;continue}let s=Number.parseInt(n[1],10),i=n[2]===void 0?0:Number.parseInt(n[2],10),o=n[3].toLowerCase(),a=n[4]?.trim()??null,l=`${n[1]}${n[2]!==void 0?`:${n[2]}`:""}${o}`;return{state:"LIMITED",resets_at:a===null?null:bU(r.timestamp,s,i,o,a),reset_time:l,timezone:a,detected_at:r.timestamp.toISOString()}}return null}function bU(t,e,r,n,s){if(!Number.isFinite(t.getTime())||e<1||e>12||r<0||r>59)return null;let i=kU(e,n);try{let o=IU(t,s),a=bS(o.year,o.month,o.day,i,r,s);if(a.getTime()<=t.getTime()){let l=RU(o,1);a=bS(l.year,l.month,l.day,i,r,s)}return a.toISOString()}catch{return null}}function kU(t,e){return e==="am"?t===12?0:t:t===12?12:t+12}function IU(t,e){let r=kS(e,!1).formatToParts(t);return{year:sr(r,"year"),month:sr(r,"month"),day:sr(r,"day")}}function bS(t,e,r,n,s,i){let o=Date.UTC(t,e-1,r,n,s,0,0);for(let a=0;a<3;a+=1){let l=NU(new Date(o),i);o=Date.UTC(t,e-1,r,n,s,0,0)-l}return new Date(o)}function NU(t,e){let r=kS(e,!0).formatToParts(t);return Date.UTC(sr(r,"year"),sr(r,"month")-1,sr(r,"day"),sr(r,"hour"),sr(r,"minute"),sr(r,"second"),0)-t.getTime()}function kS(t,e){let r=e?xU:AU,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 sr(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 RU(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 SU,AU,xU,Im=E(()=>{"use strict";SU=/you['\u2019]ve hit your session limit\s*(?:\u00b7|-|:)?\s*resets\s+([0-9]{1,2})(?::([0-9]{2}))?\s*(am|pm)\s*(?:\(([^)]+)\))?/i;AU=new Map,xU=new Map});var AS={};he(AS,{runRecover:()=>OU});import{dirname as IS,resolve as NS}from"node:path";async function OU(t,e,r={}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${Nm}
2505
2505
  `),0;let n=te(t.filter(p=>p!=="--"),[],["--all","--dry-run","--json"]);if(n.error!==void 0)return N(e,`${n.error}
2506
2506
 
2507
2507
  ${Nm}`);if(n.positionals.length===0)return N(e,`recover requires a <teamfile>
2508
2508
 
2509
- ${Nm}`);if(n.positionals.length>2)return N(e,`unexpected argument: ${n.positionals[2]}`);let s=n.positionals[0],i=Jr(s),o=i?.teamfile??s,a=n.positionals[1],l=i?.alias??a;if(i!==null&&a!==void 0)return N(e,"recover alias was provided twice; use either <teamfile>:<alias> or <teamfile> <alias>");if(G(n,"--all")&&l!==void 0)return N(e,"recover --all is mutually exclusive with <alias>");let d;try{d=await OU(e,o,l)}catch(p){if(p instanceof ve)return N(e,p.message);throw p}let c=r.now??new Date,u=G(n,"--dry-run"),m=[];for(let p of d)m.push(await $U(e,p,{now:c,dryRun:u}));let f={checked:m.length,recovered:m.filter(p=>p.action==="recovered").length,wouldRecover:m.filter(p=>p.action==="would_recover").length,skipped:m.filter(p=>p.action!=="recovered"&&p.action!=="would_recover").length,errors:m.filter(p=>p.action==="load_error"||p.action==="send_error").length};if(G(n,"--json"))le(e,{dryRun:u,now:c.toISOString(),summary:f,members:m});else{for(let p of m)e.stdout.write(CU(p));e.stdout.write(`Recover checked ${f.checked}: ${u?`${f.wouldRecover} would recover`:`${f.recovered} recovered`}, ${f.skipped} skipped, ${f.errors} error(s).
2510
- `)}return f.errors>0?1:0}async function OU(t,e,r){return await O(t,n=>{let s=Te(e,n);if(r!==void 0){let i=qe(s,n);if(i.parseErrors.length>0)throw new ve(`lmctl: ${e}: ${i.parseErrors.join("; ")}`);let o=va(i,r);return o?.teamfile!==void 0?Am(NS(IS(s),o.teamfile),n,new Set):[Me(e,r,n)]}return Am(s,n,new Set)})}function Am(t,e,r){let n=Te(t,e);if(r.has(n))return[];r.add(n);let s=qe(n,e);if(s.parseErrors.length>0)throw new ve(`lmctl: ${n}: ${s.parseErrors.join("; ")}`);let i=[];for(let o of s.members){if(o.teamfile!==void 0){i.push(...Am(NS(IS(n),o.teamfile),e,r));continue}o.session!==void 0&&i.push(Me(n,o.alias,e))}return i}async function $U(t,e,r){let n;try{let a=await Be(e.sessionid,e.provider);if(a===null)return Pt(e,"session_not_found",null,"session detail not found");n=Zs(a.messages)}catch(a){return Pt(e,"load_error",null,a instanceof Error?a.message:String(a))}if(n===null)return Pt(e,"not_limited",null,"no current session-limit marker");if(n.resets_at===null)return Pt(e,"unknown_reset",n,"reset time could not be parsed");let s=Date.parse(n.resets_at);if(!Number.isFinite(s))return Pt(e,"unknown_reset",n,"reset time could not be parsed");if(s>r.now.getTime())return Pt(e,"not_due",n,`resets_at ${n.resets_at} is in the future`);let i=await O(t,a=>a.getAgentInflight(e.teamfile,e.alias));if(i!==null)return Pt(e,"busy",n,`in-flight since ${i.started_at}`);if(r.dryRun)return Pt(e,"would_recover",n,null);let o=await Ga({teamfile:e.teamfile,alias:e.alias,prompt:RU,permissionMode:"yolo",io:t,env:process.env});return o.status==="ok"||o.status==="stalled"?Pt(e,"recovered",n,null):Pt(e,o.status==="busy"?"busy":"send_error",n,o.message)}function Pt(t,e,r,n){return{alias:t.alias,teamfile:t.teamfile,provider:t.provider,sessionid:t.sessionid,action:e,sessionLimit:r,reason:n}}function CU(t){let e=t.sessionLimit?.resets_at??"unknown",r=t.reason===null?"":` (${t.reason})`;return`${t.alias}: ${t.action} resets_at=${e}${r}
2511
- `}var RU,Nm,xS=E(()=>{"use strict";Im();nr();tr();rr();wt();km();Ce();RU="Your session limit reset time has passed. Continue your work from the last actionable point.",Nm=["usage: lmctl recover <teamfile> [--all|<alias>] [--dry-run] [--json]"," lmctl recover <teamfile>:<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(`
2512
- `)});var Qs,T7,xm=E(()=>{"use strict";Qs=[{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}],T7=Qs.length});import{spawn as MU}from"node:child_process";async function LS(t,e,r){let n=jU.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 i of n.inputSchema.required??[])if(s[i]===void 0)return{status:"error",code:400,message:`missing required parameter: ${i}`};return PU(n.name,s)}function PU(t,e){return t==="lmctl_chat"?FU(e):{status:"error",code:404,message:`unknown local tool: ${t}`}}function FU(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 ue()&&je(JSON.stringify({event:"mcp_chat_spawn",team:r,alias:n})),UU(s,process.cwd())}function UU(t,e){return new Promise(r=>{let n=!1,s,i=c=>{n||(n=!0,s!==void 0&&clearTimeout(s),r(c))},o=MU("lmctl",t,{cwd:e,env:process.env,stdio:["ignore","pipe","pipe"]}),a=WU(process.env);s=setTimeout(()=>{try{o.kill("SIGTERM")}catch{}i({status:"error",code:124,message:`lmctl chat timed out after ${a}ms`})},a),s.unref?.();let l="",d="";o.stdout?.on("data",c=>{l+=c.toString("utf8")}),o.stderr?.on("data",c=>{d+=c.toString("utf8")}),o.on("error",c=>{i({status:"error",code:1,message:`failed to spawn lmctl chat: ${c.message}`})}),o.on("exit",c=>{if(c===0){ue()&&je(JSON.stringify({event:"mcp_chat_payload",bytes:Buffer.byteLength(l,"utf8"),lines:l.split(`
2513
- `).length})),i({status:"ok",data:{text:l.trim()||"(empty response)"}});return}i({status:"error",code:c??1,message:d.trim()||`lmctl chat exited with code ${c}`})})})}function WU(t){let e=t.LMCTL_MCP_CHAT_TIMEOUT_MS;if(e===void 0||e.trim().length===0)return RS;let r=Number(e);return!Number.isFinite(r)||r<=0?RS:r}function Rm(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:DU),s=t.getConfig("api.token"),i=e.LMCTL_API_TOKEN!==void 0&&e.LMCTL_API_TOKEN.length>0?e.LMCTL_API_TOKEN:s;return{baseUrl:n,token:i}}var DU,RS,jU,Lm=E(()=>{"use strict";xm();me();DU="http://127.0.0.1:8787",RS=30*60*1e3,jU=new Map(Qs.map(t=>[t.name,t]))});async function XU(t,e){let r=t.id===void 0,n=t.id??null;if(t.method==="exit")return r||e.io.write(Om({jsonrpc:"2.0",id:n,result:null})),{kind:"exit"};if(t.method==="initialize")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{protocolVersion:qU,capabilities:{tools:{listChanged:!1}},serverInfo:{name:BU,version:HU}}}};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:Qs.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:{},i=typeof s.name=="string"?s.name:"",o=s.arguments,a=await LS(i,o,e.dispatch),l=i==="lmctl_chat"&&a.status==="ok"&&a.data!==null&&typeof a.data=="object"&&typeof a.data.text=="string"?a.data.text:JSON.stringify(a);return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{isError:a.status==="error",content:[{type:"text",text:l}]}}}}return r?{kind:"notification"}:{kind:"response",message:{jsonrpc:"2.0",id:n,error:{code:-32601,message:`method not found: ${t.method}`}}}}function Om(t){return`${JSON.stringify(t)}
2514
- `}async function OS(t,e){let r=!1,n="",s=!1,i=async o=>{let a=o.trim();if(a.length===0)return;let l;try{l=JSON.parse(a)}catch(c){t.io.write(Om({jsonrpc:"2.0",id:null,error:{code:-32700,message:`parse error: ${c instanceof Error?c.message:String(c)}`}}));return}l.method==="shutdown"&&(r=!0);let d=await XU(l,t);d.kind==="response"?t.io.write(Om(d.message)):d.kind==="exit"&&(s=!0)};return new Promise(o=>{let a=Promise.resolve(),l=!1,d=u=>{l||(l=!0,o(u))},c=()=>{let u=n.indexOf(`
2509
+ ${Nm}`);if(n.positionals.length>2)return N(e,`unexpected argument: ${n.positionals[2]}`);let s=n.positionals[0],i=Jr(s),o=i?.teamfile??s,a=n.positionals[1],l=i?.alias??a;if(i!==null&&a!==void 0)return N(e,"recover alias was provided twice; use either <teamfile>:<alias> or <teamfile> <alias>");if(G(n,"--all")&&l!==void 0)return N(e,"recover --all is mutually exclusive with <alias>");let d;try{d=await $U(e,o,l)}catch(p){if(p instanceof ve)return N(e,p.message);throw p}let c=r.now??new Date,u=G(n,"--dry-run"),m=[];for(let p of d)m.push(await CU(e,p,{now:c,dryRun:u}));let f={checked:m.length,recovered:m.filter(p=>p.action==="recovered").length,wouldRecover:m.filter(p=>p.action==="would_recover").length,skipped:m.filter(p=>p.action!=="recovered"&&p.action!=="would_recover").length,errors:m.filter(p=>p.action==="load_error"||p.action==="send_error").length};if(G(n,"--json"))le(e,{dryRun:u,now:c.toISOString(),summary:f,members:m});else{for(let p of m)e.stdout.write(MU(p));e.stdout.write(`Recover checked ${f.checked}: ${u?`${f.wouldRecover} would recover`:`${f.recovered} recovered`}, ${f.skipped} skipped, ${f.errors} error(s).
2510
+ `)}return f.errors>0?1:0}async function $U(t,e,r){return await O(t,n=>{let s=Te(e,n);if(r!==void 0){let i=qe(s,n);if(i.parseErrors.length>0)throw new ve(`lmctl: ${e}: ${i.parseErrors.join("; ")}`);let o=va(i,r);return o?.teamfile!==void 0?Am(NS(IS(s),o.teamfile),n,new Set):[Me(e,r,n)]}return Am(s,n,new Set)})}function Am(t,e,r){let n=Te(t,e);if(r.has(n))return[];r.add(n);let s=qe(n,e);if(s.parseErrors.length>0)throw new ve(`lmctl: ${n}: ${s.parseErrors.join("; ")}`);let i=[];for(let o of s.members){if(o.teamfile!==void 0){i.push(...Am(NS(IS(n),o.teamfile),e,r));continue}o.session!==void 0&&i.push(Me(n,o.alias,e))}return i}async function CU(t,e,r){let n;try{let a=await Be(e.sessionid,e.provider);if(a===null)return Pt(e,"session_not_found",null,"session detail not found");n=Zs(a.messages)}catch(a){return Pt(e,"load_error",null,a instanceof Error?a.message:String(a))}if(n===null)return Pt(e,"not_limited",null,"no current session-limit marker");if(n.resets_at===null)return Pt(e,"unknown_reset",n,"reset time could not be parsed");let s=Date.parse(n.resets_at);if(!Number.isFinite(s))return Pt(e,"unknown_reset",n,"reset time could not be parsed");if(s>r.now.getTime())return Pt(e,"not_due",n,`resets_at ${n.resets_at} is in the future`);let i=await O(t,a=>a.getAgentInflight(e.teamfile,e.alias));if(i!==null)return Pt(e,"busy",n,`in-flight since ${i.started_at}`);if(r.dryRun)return Pt(e,"would_recover",n,null);let o=await Ja({teamfile:e.teamfile,alias:e.alias,prompt:LU,permissionMode:"yolo",io:t,env:process.env});return o.status==="ok"||o.status==="stalled"?Pt(e,"recovered",n,null):Pt(e,o.status==="busy"?"busy":"send_error",n,o.message)}function Pt(t,e,r,n){return{alias:t.alias,teamfile:t.teamfile,provider:t.provider,sessionid:t.sessionid,action:e,sessionLimit:r,reason:n}}function MU(t){let e=t.sessionLimit?.resets_at??"unknown",r=t.reason===null?"":` (${t.reason})`;return`${t.alias}: ${t.action} resets_at=${e}${r}
2511
+ `}var LU,Nm,xS=E(()=>{"use strict";Im();nr();tr();rr();wt();km();Ce();LU="Your session limit reset time has passed. Continue your work from the last actionable point.",Nm=["usage: lmctl recover <teamfile> [--all|<alias>] [--dry-run] [--json]"," lmctl recover <teamfile>:<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(`
2512
+ `)});var Qs,v7,xm=E(()=>{"use strict";Qs=[{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}],v7=Qs.length});import{spawn as DU}from"node:child_process";async function LS(t,e,r){let n=PU.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 i of n.inputSchema.required??[])if(s[i]===void 0)return{status:"error",code:400,message:`missing required parameter: ${i}`};return FU(n.name,s)}function FU(t,e){return t==="lmctl_chat"?UU(e):{status:"error",code:404,message:`unknown local tool: ${t}`}}function UU(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 ue()&&je(JSON.stringify({event:"mcp_chat_spawn",team:r,alias:n})),WU(s,process.cwd())}function WU(t,e){return new Promise(r=>{let n=!1,s,i=c=>{n||(n=!0,s!==void 0&&clearTimeout(s),r(c))},o=DU("lmctl",t,{cwd:e,env:process.env,stdio:["ignore","pipe","pipe"]}),a=qU(process.env);s=setTimeout(()=>{try{o.kill("SIGTERM")}catch{}i({status:"error",code:124,message:`lmctl chat timed out after ${a}ms`})},a),s.unref?.();let l="",d="";o.stdout?.on("data",c=>{l+=c.toString("utf8")}),o.stderr?.on("data",c=>{d+=c.toString("utf8")}),o.on("error",c=>{i({status:"error",code:1,message:`failed to spawn lmctl chat: ${c.message}`})}),o.on("exit",c=>{if(c===0){ue()&&je(JSON.stringify({event:"mcp_chat_payload",bytes:Buffer.byteLength(l,"utf8"),lines:l.split(`
2513
+ `).length})),i({status:"ok",data:{text:l.trim()||"(empty response)"}});return}i({status:"error",code:c??1,message:d.trim()||`lmctl chat exited with code ${c}`})})})}function qU(t){let e=t.LMCTL_MCP_CHAT_TIMEOUT_MS;if(e===void 0||e.trim().length===0)return RS;let r=Number(e);return!Number.isFinite(r)||r<=0?RS:r}function Rm(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:jU),s=t.getConfig("api.token"),i=e.LMCTL_API_TOKEN!==void 0&&e.LMCTL_API_TOKEN.length>0?e.LMCTL_API_TOKEN:s;return{baseUrl:n,token:i}}var jU,RS,PU,Lm=E(()=>{"use strict";xm();me();jU="http://127.0.0.1:8787",RS=30*60*1e3,PU=new Map(Qs.map(t=>[t.name,t]))});async function JU(t,e){let r=t.id===void 0,n=t.id??null;if(t.method==="exit")return r||e.io.write(Om({jsonrpc:"2.0",id:n,result:null})),{kind:"exit"};if(t.method==="initialize")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{protocolVersion:BU,capabilities:{tools:{listChanged:!1}},serverInfo:{name:HU,version:XU}}}};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:Qs.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:{},i=typeof s.name=="string"?s.name:"",o=s.arguments,a=await LS(i,o,e.dispatch),l=i==="lmctl_chat"&&a.status==="ok"&&a.data!==null&&typeof a.data=="object"&&typeof a.data.text=="string"?a.data.text:JSON.stringify(a);return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{isError:a.status==="error",content:[{type:"text",text:l}]}}}}return r?{kind:"notification"}:{kind:"response",message:{jsonrpc:"2.0",id:n,error:{code:-32601,message:`method not found: ${t.method}`}}}}function Om(t){return`${JSON.stringify(t)}
2514
+ `}async function OS(t,e){let r=!1,n="",s=!1,i=async o=>{let a=o.trim();if(a.length===0)return;let l;try{l=JSON.parse(a)}catch(c){t.io.write(Om({jsonrpc:"2.0",id:null,error:{code:-32700,message:`parse error: ${c instanceof Error?c.message:String(c)}`}}));return}l.method==="shutdown"&&(r=!0);let d=await JU(l,t);d.kind==="response"?t.io.write(Om(d.message)):d.kind==="exit"&&(s=!0)};return new Promise(o=>{let a=Promise.resolve(),l=!1,d=u=>{l||(l=!0,o(u))},c=()=>{let u=n.indexOf(`
2515
2515
  `);for(;u!==-1;){let m=n.slice(0,u);n=n.slice(u+1),a=a.then(()=>i(m)).then(()=>{s&&d(0)}),u=n.indexOf(`
2516
2516
  `)}};e.setEncoding("utf8"),e.on("data",u=>{n+=u,c()}),e.on("end",()=>{n.trim().length>0&&(a=a.then(()=>i(n))),a.finally(()=>d(0))}),e.on("error",u=>{t.io.log?.(`mcp: stdin error: ${u.message}
2517
- `),a.finally(()=>d(1))})})}var qU,BU,HU,$S=E(()=>{"use strict";xm();Lm();qU="2025-06-18",BU="lmctl",HU="0.0.1"});var MS={};he(MS,{runMcp:()=>GU});async function GU(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(JU),0;if(t.length>0)return e.stderr.write(`usage: lmctl mcp
2518
- `),2;C({event:"mcp_bridge_start",pid:process.pid});let n=e.dal===void 0,s=e.dal??VU(),i=1;try{let o=s===void 0?Rm({getConfig:()=>null},process.env):Rm(s,process.env);return i=await OS({io:{write:l=>e.stdout.write(l),log:l=>e.stderr.write(l)},dispatch:{config:o,...s!==void 0?{dal:s}:{}}},r),i}finally{C({event:"mcp_bridge_exit",pid:process.pid,exit_code:i}),n&&s!==void 0&&s.close()}}function VU(){let t=Q(),e=3;for(let r=1;r<=e;r+=1)try{return Je({path:t})}catch(n){let s=n instanceof Error?n.message:String(n);if(C({event:"mcp_bridge_db_open_failed",pid:process.pid,attempt:r,db_path:t,error_message:s}),r<e&&CS(s))KU(50*r);else if(!CS(s))break}}function CS(t){return/SQLITE_BUSY|database is locked|database is busy/i.test(t)}function KU(t){let e=new Int32Array(new SharedArrayBuffer(4));Atomics.wait(e,0,0,t)}var JU,DS=E(()=>{"use strict";ct();Lm();$S();me();Ye();JU=`usage: lmctl mcp
2517
+ `),a.finally(()=>d(1))})})}var BU,HU,XU,$S=E(()=>{"use strict";xm();Lm();BU="2025-06-18",HU="lmctl",XU="0.0.1"});var MS={};he(MS,{runMcp:()=>VU});async function VU(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(GU),0;if(t.length>0)return e.stderr.write(`usage: lmctl mcp
2518
+ `),2;C({event:"mcp_bridge_start",pid:process.pid});let n=e.dal===void 0,s=e.dal??KU(),i=1;try{let o=s===void 0?Rm({getConfig:()=>null},process.env):Rm(s,process.env);return i=await OS({io:{write:l=>e.stdout.write(l),log:l=>e.stderr.write(l)},dispatch:{config:o,...s!==void 0?{dal:s}:{}}},r),i}finally{C({event:"mcp_bridge_exit",pid:process.pid,exit_code:i}),n&&s!==void 0&&s.close()}}function KU(){let t=Q(),e=3;for(let r=1;r<=e;r+=1)try{return Je({path:t})}catch(n){let s=n instanceof Error?n.message:String(n);if(C({event:"mcp_bridge_db_open_failed",pid:process.pid,attempt:r,db_path:t,error_message:s}),r<e&&CS(s))YU(50*r);else if(!CS(s))break}}function CS(t){return/SQLITE_BUSY|database is locked|database is busy/i.test(t)}function YU(t){let e=new Int32Array(new SharedArrayBuffer(4));Atomics.wait(e,0,0,t)}var GU,DS=E(()=>{"use strict";ct();Lm();$S();me();Ye();GU=`usage: lmctl mcp
2519
2519
 
2520
2520
  Start the stdio MCP bridge. The bridge resolves api.url and api.token from
2521
2521
  local config, then uses stdin/stdout for JSON-RPC frames.
2522
- `});var jS={};he(jS,{runDevice:()=>oW});import{readFileSync as YU}from"node:fs";import{homedir as zU}from"node:os";import{join as ZU}from"node:path";import{CognitoIdentityClient as QU,GetIdCommand as eW}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as tW}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as rW,ListObjectsV2Command as nW,PutObjectCommand as sW,S3Client as iW}from"@aws-sdk/client-s3";async function oW(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($m),0;if(r==="init"){let n=mm();return e.stdout.write(`${n.device_id}
2523
- `),0}if(r==="id"){let n=Gr();return n===null?(e.stderr.write(`error: no device id initialized at ${Fa()}; run 'lmctl device init'
2522
+ `});var jS={};he(jS,{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 iW,S3Client as oW}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($m),0;if(r==="init"){let n=mm();return e.stdout.write(`${n.device_id}
2523
+ `),0}if(r==="id"){let n=Gr();return n===null?(e.stderr.write(`error: no device id initialized at ${Pa()}; run 'lmctl device init'
2524
2524
  `),1):(e.stdout.write(`${n.device_id}
2525
- `),0)}return r==="login"?await aW(t.slice(1),e):r==="prompt"?await dW(t.slice(1),e):(e.stderr.write(`usage: lmctl device <id|init|login|prompt>
2526
- `),1)}async function aW(t,e){let r=lW(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
2525
+ `),0)}return r==="login"?await lW(t.slice(1),e):r==="prompt"?await cW(t.slice(1),e):(e.stderr.write(`usage: lmctl device <id|init|login|prompt>
2526
+ `),1)}async function lW(t,e){let r=dW(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
2527
2527
  ${$m}`),2;let n=Gs();if(n.config===void 0)return e.stderr.write(`error: mailbox is not configured; missing ${n.missing.join(", ")}
2528
- `),1;QT({userId:r.userId,refreshToken:r.accessKey});let s,i,o;try{let d=await $a({region:n.config.region,clientId:n.config.cognitoClientId??Pa,refreshToken:r.accessKey});s=d.idToken,i=d.accessToken,o=d.expiresAt}catch(d){let c=d instanceof Error?d.message:String(d);return e.stderr.write(`error: could not authenticate access key: ${c}
2528
+ `),1;QT({userId:r.userId,refreshToken:r.accessKey});let s,i,o;try{let d=await Oa({region:n.config.region,clientId:n.config.cognitoClientId??ja,refreshToken:r.accessKey});s=d.idToken,i=d.accessToken,o=d.expiresAt}catch(d){let c=d instanceof Error?d.message:String(d);return e.stderr.write(`error: could not authenticate access key: ${c}
2529
2529
  `),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}
2530
2530
  `),1;nm({idToken:s,...i!==void 0?{accessToken:i}:{},refreshToken:r.accessKey,...o!==void 0?{expiresAt:o}:{}});let l=Gr()??mm();return e.stdout.write(`logged in as ${r.userId}
2531
2531
  device id: ${l.device_id}
2532
2532
  mailbox prefix: ${r.userId}/${l.device_id}/
2533
2533
  access key stored at ${Xs()}
2534
- `),0}function lW(t){let e,r;for(let n=0;n<t.length;n+=1){let s=t[n];if(s==="--user-id"){let i=t[++n];if(i===void 0||i.startsWith("--"))return"missing value for --user-id";e=i;continue}if(s==="--access-key"){let i=t[++n];if(i===void 0||i.startsWith("--"))return"missing value for --access-key";r=i;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 dW(t,e){let r=cW(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
2534
+ `),0}function dW(t){let e,r;for(let n=0;n<t.length;n+=1){let s=t[n];if(s==="--user-id"){let i=t[++n];if(i===void 0||i.startsWith("--"))return"missing value for --user-id";e=i;continue}if(s==="--access-key"){let i=t[++n];if(i===void 0||i.startsWith("--"))return"missing value for --access-key";r=i;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 cW(t,e){let r=uW(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
2535
2535
  ${$m}`),2;let n=Gs();if(n.config===void 0)return e.stderr.write(`error: mailbox is not configured; missing ${n.missing.join(", ")}
2536
- `),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 i=s.cognito?.idToken;if(typeof i!="string"||i.length===0)return e.stderr.write("error: no Cognito id token found; run `webcli login` or `lmctl device login` first\n"),1;let o=`cognito-idp.${n.config.region}.amazonaws.com/${n.config.cognitoUserPoolId}`,a=typeof s.cognito?.identityId=="string"&&s.cognito.identityId.length>0?s.cognito.identityId:await uW({region:n.config.region,identityPoolId:n.config.identityPoolId,idpProvider:o,idToken:i}),l=tW({identityId:a,logins:{[o]:i},clientConfig:{region:n.config.region}}),d=n.config.deviceId??Gr()?.device_id,c=Hs(i)??void 0,u=new Hr({bucket:n.config.mailboxBucket,identityId:a,...c!==void 0?{userId:c}:{},...d!==void 0?{deviceId:d}:{},...n.config.mailboxKey!==void 0?{mailboxKey:n.config.mailboxKey}:{},s3:new iW({region:n.config.region,credentials:l}),commands:{ListObjectsV2Command:nW,GetObjectCommand:rW,PutObjectCommand:sW},selfRole:"browser",onMessage:async()=>{}}),m=qT({root_teamfile:r.root,text:r.text,...r.promptId!==void 0?{prompt_id:r.promptId}:{}}),f=await u.putMessage({conversation_id:WT,payload:m});return e.stdout.write(JSON.stringify({prompt_id:m.prompt_id,mailbox_key:u.getMailboxBasePrefix(),object_key:f},null,2)+`
2537
- `),0}function cW(t){let e,r,n;for(let s=0;s<t.length;s+=1){let i=t[s];if(i==="--root"){let o=t[++s];if(o===void 0||o.startsWith("--"))return"missing value for --root";e=o;continue}if(i==="--text"){let o=t[++s];if(o===void 0||o.startsWith("--"))return"missing value for --text";r=o;continue}if(i==="--prompt-id"){let o=t[++s];if(o===void 0||o.startsWith("--"))return"missing value for --prompt-id";n=o;continue}return`unknown argument: ${i}`}return e===void 0?"missing --root <teamfile>":r===void 0?"missing --text <prompt>":{root:e,text:r,...n!==void 0?{promptId:n}:{}}}async function uW(t){let r=await new QU({region:t.region}).send(new eW({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??ZU(zU(),".lmctl","cli-tokens.json")){try{return JSON.parse(YU(t,"utf8"))}catch{return null}}var $m,PS=E(()=>{"use strict";fm();am();na();Qu();em();sm();tm();$m=`usage: lmctl device <id|init|login|prompt>
2536
+ `),1;let s=fW();if(s===null)return e.stderr.write("error: no Cognito id token found; run `webcli login` or `lmctl device login` first\n"),1;let i=s.cognito?.idToken;if(typeof i!="string"||i.length===0)return e.stderr.write("error: no Cognito id token found; run `webcli login` or `lmctl device login` first\n"),1;let o=`cognito-idp.${n.config.region}.amazonaws.com/${n.config.cognitoUserPoolId}`,a=typeof s.cognito?.identityId=="string"&&s.cognito.identityId.length>0?s.cognito.identityId:await mW({region:n.config.region,identityPoolId:n.config.identityPoolId,idpProvider:o,idToken:i}),l=rW({identityId:a,logins:{[o]:i},clientConfig:{region:n.config.region}}),d=n.config.deviceId??Gr()?.device_id,c=Hs(i)??void 0,u=new Hr({bucket:n.config.mailboxBucket,identityId:a,...c!==void 0?{userId:c}:{},...d!==void 0?{deviceId:d}:{},...n.config.mailboxKey!==void 0?{mailboxKey:n.config.mailboxKey}:{},s3:new oW({region:n.config.region,credentials:l}),commands:{ListObjectsV2Command:sW,GetObjectCommand:nW,PutObjectCommand:iW},selfRole:"browser",onMessage:async()=>{}}),m=qT({root_teamfile:r.root,text:r.text,...r.promptId!==void 0?{prompt_id:r.promptId}:{}}),f=await u.putMessage({conversation_id:WT,payload:m});return e.stdout.write(JSON.stringify({prompt_id:m.prompt_id,mailbox_key:u.getMailboxBasePrefix(),object_key:f},null,2)+`
2537
+ `),0}function uW(t){let e,r,n;for(let s=0;s<t.length;s+=1){let i=t[s];if(i==="--root"){let o=t[++s];if(o===void 0||o.startsWith("--"))return"missing value for --root";e=o;continue}if(i==="--text"){let o=t[++s];if(o===void 0||o.startsWith("--"))return"missing value for --text";r=o;continue}if(i==="--prompt-id"){let o=t[++s];if(o===void 0||o.startsWith("--"))return"missing value for --prompt-id";n=o;continue}return`unknown argument: ${i}`}return e===void 0?"missing --root <teamfile>":r===void 0?"missing --text <prompt>":{root:e,text:r,...n!==void 0?{promptId:n}:{}}}async function mW(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 fW(t=process.env.LMCTL_TOKEN_PATH??QU(ZU(),".lmctl","cli-tokens.json")){try{return JSON.parse(zU(t,"utf8"))}catch{return null}}var $m,PS=E(()=>{"use strict";fm();am();na();Qu();em();sm();tm();$m=`usage: lmctl device <id|init|login|prompt>
2538
2538
  lmctl device login --user-id <sub> --access-key <refreshToken>
2539
2539
  lmctl device prompt --root <teamfile> --text <prompt> [--prompt-id <id>]
2540
2540
 
@@ -2544,35 +2544,35 @@ addressing. The id is stored in ~/.lmctl/device.json by default.
2544
2544
  'lmctl device login' authenticates this machine's 'lmctl serve' daemon to the
2545
2545
  cloud mailbox using your user-id (Cognito sub) and an access key (refresh
2546
2546
  token). The access key is stored in ~/.lmctl/device-auth.json (chmod 600).
2547
- `});var VS={};he(VS,{runMail:()=>NW});import{hostname as fW}from"node:os";async function NW(t,e){if(t.length===0||t[0]==="--help"||t[0]==="-h")return e.stdout.write(EW),0;let[r,...n]=t,s=Ar(n);try{switch(r){case"sent":return await AW(n,e);case"history":return await xW(n,e);case"seen":return await RW(n,e);case"pending":return await LW(n,e);case"read":return await $W(n,e);case"ack":return await CW(n,e);case"tree":return await MW(n,e);default:return re(e,s,"invalid_command",`unknown mail command: ${r}`)}}catch(i){return i instanceof Ke?re(e,s,i.errorKind,i.message):re(e,s,"internal",i instanceof Error?i.message:String(i))}}async function AW(t,e){if(Zr(t))return e.stdout.write(wW),0;let r=Ar(t),n=te(Ya(t,["--to","--since","--status","--limit","--cursor"]),["--to","--since","--status","--limit","--cursor"],["--json"]);if(n.error!==void 0)return re(e,r,"invalid_arguments",n.error);if(n.positionals.length>0)return re(e,r,"invalid_arguments",`unknown argument: ${n.positionals[0]}`);let s=Mm(M(n,"--to"));if("error"in s)return re(e,r,"invalid_arguments",s.error);let i=KW(M(n,"--since"));if("error"in i)return re(e,r,"invalid_arguments",i.error);let o=M(n,"--status");if(o!==void 0&&o!=="queued"&&o!=="delivered")return re(e,r,"invalid_arguments","--status must be queued or delivered");let a=Dm(M(n,"--limit"));if("error"in a)return re(e,r,"invalid_arguments",a.error);let l=GS(M(n,"--cursor"),"sent");if("error"in l)return re(e,r,"invalid_arguments",l.error);if(l.value!==null&&(M(n,"--to")!==void 0||M(n,"--since")!==void 0||o!==void 0))return re(e,r,"invalid_arguments","--cursor cannot be combined with --to, --since, or --status; the cursor retains the original filters");let d=await O(e,c=>{let u=l.value===null?He(XS(c,e,"mail sent")):He(l.value.self),m=l.value===null?s.value:l.value.to===null?null:He(l.value.to),f=l.value?.since??i.iso,p=l.value?.status??o??null,h=DW(c,u,m,f,p??void 0,a.value,l.value?.seq??null),g=h.next_seq===null?null:JS({v:1,kind:"sent",seq:h.next_seq,self:u.value,to:m?.value??null,since:f,status:p});return{schema_version:Yr,schema:"event-log-v1",identity:u.value,filters:{to:m?.value??null,since:f,status:p},messages:h.messages,next_cursor:g}});if(G(n,"--json"))le(e,d);else{e.stdout.write(`Messages sent from ${d.identity}
2547
+ `});var VS={};he(VS,{runMail:()=>AW});import{hostname as pW}from"node:os";async function AW(t,e){if(t.length===0||t[0]==="--help"||t[0]==="-h")return e.stdout.write(wW),0;let[r,...n]=t,s=Ar(n);try{switch(r){case"sent":return await xW(n,e);case"history":return await RW(n,e);case"seen":return await LW(n,e);case"pending":return await OW(n,e);case"read":return await CW(n,e);case"ack":return await MW(n,e);case"tree":return await DW(n,e);default:return re(e,s,"invalid_command",`unknown mail command: ${r}`)}}catch(i){return i instanceof Ke?re(e,s,i.errorKind,i.message):re(e,s,"internal",i instanceof Error?i.message:String(i))}}async function xW(t,e){if(Zr(t))return e.stdout.write(TW),0;let r=Ar(t),n=te(Ka(t,["--to","--since","--status","--limit","--cursor"]),["--to","--since","--status","--limit","--cursor"],["--json"]);if(n.error!==void 0)return re(e,r,"invalid_arguments",n.error);if(n.positionals.length>0)return re(e,r,"invalid_arguments",`unknown argument: ${n.positionals[0]}`);let s=Mm(M(n,"--to"));if("error"in s)return re(e,r,"invalid_arguments",s.error);let i=YW(M(n,"--since"));if("error"in i)return re(e,r,"invalid_arguments",i.error);let o=M(n,"--status");if(o!==void 0&&o!=="queued"&&o!=="delivered")return re(e,r,"invalid_arguments","--status must be queued or delivered");let a=Dm(M(n,"--limit"));if("error"in a)return re(e,r,"invalid_arguments",a.error);let l=GS(M(n,"--cursor"),"sent");if("error"in l)return re(e,r,"invalid_arguments",l.error);if(l.value!==null&&(M(n,"--to")!==void 0||M(n,"--since")!==void 0||o!==void 0))return re(e,r,"invalid_arguments","--cursor cannot be combined with --to, --since, or --status; the cursor retains the original filters");let d=await O(e,c=>{let u=l.value===null?He(XS(c,e,"mail sent")):He(l.value.self),m=l.value===null?s.value:l.value.to===null?null:He(l.value.to),f=l.value?.since??i.iso,p=l.value?.status??o??null,h=jW(c,u,m,f,p??void 0,a.value,l.value?.seq??null),g=h.next_seq===null?null:JS({v:1,kind:"sent",seq:h.next_seq,self:u.value,to:m?.value??null,since:f,status:p});return{schema_version:Yr,schema:"event-log-v1",identity:u.value,filters:{to:m?.value??null,since:f,status:p},messages:h.messages,next_cursor:g}});if(G(n,"--json"))le(e,d);else{e.stdout.write(`Messages sent from ${d.identity}
2548
2548
  `);for(let c of d.messages)e.stdout.write(`${c.created_at} ${c.message_id} ${c.message_type} ${c.lifecycle_state} -> ${c.receiver.teamfile}:${c.receiver.alias}
2549
2549
  `);d.messages.length===0&&e.stdout.write(`(none)
2550
- `)}return 0}async function xW(t,e){if(Zr(t))return e.stdout.write(bW),0;let r=Ar(t),n=te(t,[],["--json"]);if(n.error!==void 0)return re(e,r,"invalid_arguments",n.error);let s=Ka(n.positionals,"history");if("error"in s)return re(e,r,"invalid_id",s.error);let i=await O(e,a=>WS(a,s.value)),o={schema_version:Yr,schema:"event-log-v1",message_id:s.value,events:i};if(G(n,"--json"))le(e,o);else{e.stdout.write(`History for ${s.value}
2550
+ `)}return 0}async function RW(t,e){if(Zr(t))return e.stdout.write(kW),0;let r=Ar(t),n=te(t,[],["--json"]);if(n.error!==void 0)return re(e,r,"invalid_arguments",n.error);let s=Va(n.positionals,"history");if("error"in s)return re(e,r,"invalid_id",s.error);let i=await O(e,a=>WS(a,s.value)),o={schema_version:Yr,schema:"event-log-v1",message_id:s.value,events:i};if(G(n,"--json"))le(e,o);else{e.stdout.write(`History for ${s.value}
2551
2551
  `);for(let a of i)e.stdout.write(`${a.seq} ${a.ts} ${a.event_type} ${JSON.stringify(a.payload)}
2552
- `)}return 0}async function RW(t,e){if(Zr(t))return e.stdout.write(kW),0;let r=Ar(t),n=te(t,[],["--json"]);if(n.error!==void 0)return re(e,r,"invalid_arguments",n.error);let s=Ka(n.positionals,"seen");if("error"in s)return re(e,r,"invalid_id",s.error);let i=await O(e,o=>PW(o,s.value));return G(n,"--json")?le(e,i):(e.stdout.write(`${s.value}
2552
+ `)}return 0}async function LW(t,e){if(Zr(t))return e.stdout.write(IW),0;let r=Ar(t),n=te(t,[],["--json"]);if(n.error!==void 0)return re(e,r,"invalid_arguments",n.error);let s=Va(n.positionals,"seen");if("error"in s)return re(e,r,"invalid_id",s.error);let i=await O(e,o=>FW(o,s.value));return G(n,"--json")?le(e,i):(e.stdout.write(`${s.value}
2553
2553
  `),e.stdout.write(` db: ${i.db.delivered?"delivered":i.db.handled?"handled":"not delivered"}
2554
2554
  `),e.stdout.write(` transcript: ${i.transcript.checked?i.transcript.found?`seen at ${i.transcript.seen_at}`:"not found":`not checked (${i.transcript.reason})`}
2555
2555
  `),e.stdout.write(` answered: ${i.answered?.via??"no evidence"}
2556
- `)),0}async function LW(t,e){if(Zr(t))return e.stdout.write(TW),0;let r=Ar(t),n=te(Ya(t,["--receiver","--limit"]),["--receiver","--limit"],["--json"]);if(n.error!==void 0)return re(e,r,"invalid_arguments",n.error);if(n.positionals.length>0)return re(e,r,"invalid_arguments",`unknown argument: ${n.positionals[0]}`);let s=Mm(M(n,"--receiver"));if("error"in s)return re(e,r,"invalid_arguments",s.error);let i=Dm(M(n,"--limit"));if("error"in i)return re(e,r,"invalid_arguments",i.error);let o=await O(e,l=>{let d=s.value===null?"":"WHERE receiver_teamfile = ? AND receiver_alias = ?",c=s.value===null?[]:[s.value.teamfile,s.value.alias];return l.db.prepare(`SELECT message_id, message_type, in_reply_to, sender_teamfile, sender_alias,
2556
+ `)),0}async function OW(t,e){if(Zr(t))return e.stdout.write(vW),0;let r=Ar(t),n=te(Ka(t,["--receiver","--limit"]),["--receiver","--limit"],["--json"]);if(n.error!==void 0)return re(e,r,"invalid_arguments",n.error);if(n.positionals.length>0)return re(e,r,"invalid_arguments",`unknown argument: ${n.positionals[0]}`);let s=Mm(M(n,"--receiver"));if("error"in s)return re(e,r,"invalid_arguments",s.error);let i=Dm(M(n,"--limit"));if("error"in i)return re(e,r,"invalid_arguments",i.error);let o=await O(e,l=>{let d=s.value===null?"":"WHERE receiver_teamfile = ? AND receiver_alias = ?",c=s.value===null?[]:[s.value.teamfile,s.value.alias];return l.db.prepare(`SELECT message_id, message_type, in_reply_to, sender_teamfile, sender_alias,
2557
2557
  receiver_teamfile, receiver_alias, lifecycle_state, created_seq
2558
2558
  FROM message_pending ${d}
2559
2559
  ORDER BY created_seq ASC LIMIT ?`).all(...c,i.value)}),a={schema_version:Yr,schema:"event-log-v1",filters:{receiver:s.value===null?null:`${s.value.teamfile}:${s.value.alias}`,limit:i.value},messages:o.map(l=>({message_id:l.message_id,message_type:l.message_type,in_reply_to:l.in_reply_to,sender:l.sender_teamfile===null?null:{teamfile:l.sender_teamfile,alias:l.sender_alias??""},receiver:{teamfile:l.receiver_teamfile,alias:l.receiver_alias},lifecycle_state:l.lifecycle_state,created_seq:l.created_seq}))};if(G(n,"--json"))le(e,a);else if(a.messages.length===0)e.stdout.write(`no pending messages
2560
2560
  `);else for(let l of a.messages){let d=l.sender===null?"operator":`${l.sender.teamfile}:${l.sender.alias}`;e.stdout.write(`${l.message_id} ${l.lifecycle_state} ${d} -> ${l.receiver.teamfile}:${l.receiver.alias}
2561
- `)}return 0}function OW(t,e){let r=t.db.prepare(`SELECT event_type, payload FROM message_event
2561
+ `)}return 0}function $W(t,e){let r=t.db.prepare(`SELECT event_type, payload FROM message_event
2562
2562
  WHERE stream_id = ? AND event_type IN ('CREATE', 'RESPONSE_CREATE')
2563
- ORDER BY seq ASC LIMIT 1`).get(e);if(r===void 0)throw new Ke("not_found",`no such message: ${e}`);let n=JSON.parse(r.payload),s=t.db.prepare("SELECT lifecycle_state FROM message_pending WHERE message_id = ?").get(e);return{schema_version:Yr,schema:"event-log-v1",message_id:e,message_type:r.event_type==="RESPONSE_CREATE"?"response":"request",in_reply_to:n.in_reply_to_message_id??null,sender:n.sender,receiver:n.receiver,content:n.content??"",pending_state:s?.lifecycle_state??null}}async function $W(t,e){if(Zr(t))return e.stdout.write(vW),0;let r=Ar(t),n=te(t,[],["--json"]);if(n.error!==void 0)return re(e,r,"invalid_arguments",n.error);let s=Ka(n.positionals,"read");if("error"in s)return re(e,r,"invalid_id",s.error);let i=await O(e,o=>OW(o,s.value));if(G(n,"--json"))le(e,i);else{let o=i.sender===null?"operator":`${i.sender.teamfile}:${i.sender.alias}`;e.stdout.write(`${i.message_id} (${i.message_type}${i.in_reply_to===null?"":`, replies to ${i.in_reply_to}`})
2563
+ ORDER BY seq ASC LIMIT 1`).get(e);if(r===void 0)throw new Ke("not_found",`no such message: ${e}`);let n=JSON.parse(r.payload),s=t.db.prepare("SELECT lifecycle_state FROM message_pending WHERE message_id = ?").get(e);return{schema_version:Yr,schema:"event-log-v1",message_id:e,message_type:r.event_type==="RESPONSE_CREATE"?"response":"request",in_reply_to:n.in_reply_to_message_id??null,sender:n.sender,receiver:n.receiver,content:n.content??"",pending_state:s?.lifecycle_state??null}}async function CW(t,e){if(Zr(t))return e.stdout.write(SW),0;let r=Ar(t),n=te(t,[],["--json"]);if(n.error!==void 0)return re(e,r,"invalid_arguments",n.error);let s=Va(n.positionals,"read");if("error"in s)return re(e,r,"invalid_id",s.error);let i=await O(e,o=>$W(o,s.value));if(G(n,"--json"))le(e,i);else{let o=i.sender===null?"operator":`${i.sender.teamfile}:${i.sender.alias}`;e.stdout.write(`${i.message_id} (${i.message_type}${i.in_reply_to===null?"":`, replies to ${i.in_reply_to}`})
2564
2564
  `),e.stdout.write(`from: ${o}
2565
2565
  `),e.stdout.write(`to: ${i.receiver.teamfile}:${i.receiver.alias}
2566
2566
  `),e.stdout.write(`state: ${i.pending_state??"terminal"}
2567
2567
  `),e.stdout.write(`---
2568
2568
  ${i.content}
2569
- `)}return 0}async function CW(t,e){if(Zr(t))return e.stdout.write(SW),0;let r=Ar(t),n=te(Ya(t,["--note"]),["--note"],["--terminalize-pending","--json"]);if(n.error!==void 0)return re(e,r,"invalid_arguments",n.error);let s=Ka(n.positionals,"ack");if("error"in s)return re(e,r,"invalid_id",s.error);let i=M(n,"--note"),o=await O(e,l=>{if(l.db.prepare(`SELECT 1 FROM message_event
2570
- WHERE stream_id = ? AND event_type IN ('CREATE', 'RESPONSE_CREATE') LIMIT 1`).get(s.value)===void 0)throw new Ke("not_found",`no such message: ${s.value}`);let c=Xn(e.env??process.env,l);if(!c.ok&&c.reason==="not-found")throw new Ke("self_identity",Nr("mail ack"));let u=c.ok?c.identity:"operator",m=Tp(l.db,{messageId:s.value,ackedBy:u,...i!==void 0?{note:i}:{},holderPid:process.pid,holderHost:fW(),terminalizePending:G(n,"--terminalize-pending")});return{ackedBy:u,ack:m}}),a={schema_version:Yr,schema:"event-log-v1",message_id:s.value,acked_by:o.ackedBy,appended:o.ack.appended,pending_outcome:o.ack.pending_outcome};return G(n,"--json")?le(e,a):e.stdout.write(`${a.appended?"acknowledged":"already acknowledged"} ${a.message_id} as ${a.acked_by} (${a.pending_outcome})
2571
- `),0}async function MW(t,e){if(Zr(t))return e.stdout.write(IW),0;let r=Ar(t),n=te(Ya(t,["--root","--since","--limit","--cursor"]),["--root","--since","--limit","--cursor"],["--json"]);if(n.error!==void 0)return re(e,r,"invalid_arguments",n.error);if(n.positionals.length>0)return re(e,r,"invalid_arguments",`unknown argument: ${n.positionals[0]}`);let s=HS(M(n,"--since"),pW);if("error"in s)return re(e,r,"invalid_arguments",s.error);let i=Mm(M(n,"--root"));if("error"in i)return re(e,r,"invalid_arguments",i.error);let o=Dm(M(n,"--limit"));if("error"in o)return re(e,r,"invalid_arguments",o.error);let a=GS(M(n,"--cursor"),"tree");if("error"in a)return re(e,r,"invalid_arguments",a.error);if(a.value!==null&&(M(n,"--root")!==void 0||M(n,"--since")!==void 0))return re(e,r,"invalid_arguments","--cursor cannot be combined with --root or --since; the cursor retains the original filters");let l=await O(e,d=>{let c=a.value===null?i.value??He(XS(d,e,"mail tree")):He(a.value.root),u=a.value?.since??s.iso,m=a.value?.since_label??M(n,"--since")??"24h",f=JW(d,c,u,o.value,a.value?.seq??null),p=f.next_seq===null?null:JS({v:1,kind:"tree",seq:f.next_seq,root:c.value,since:u,since_label:m});return{schema_version:Yr,schema:"event-log-v1",root:{teamfile:c.teamfile,alias:c.alias},since:m,since_timestamp:u,sent:f.sent,next_cursor:p,orphan_policy:"Missing causal linkage is surfaced as a root; no temporal fallback is used.",incomplete_capture_note:"A killed invocation that never wrote request_message_id may produce an orphan root."}});if(G(n,"--json"))le(e,l);else{e.stdout.write(`Causal mail tree for ${l.root.teamfile}:${l.root.alias} since ${l.since_timestamp}
2569
+ `)}return 0}async function MW(t,e){if(Zr(t))return e.stdout.write(bW),0;let r=Ar(t),n=te(Ka(t,["--note"]),["--note"],["--terminalize-pending","--json"]);if(n.error!==void 0)return re(e,r,"invalid_arguments",n.error);let s=Va(n.positionals,"ack");if("error"in s)return re(e,r,"invalid_id",s.error);let i=M(n,"--note"),o=await O(e,l=>{if(l.db.prepare(`SELECT 1 FROM message_event
2570
+ WHERE stream_id = ? AND event_type IN ('CREATE', 'RESPONSE_CREATE') LIMIT 1`).get(s.value)===void 0)throw new Ke("not_found",`no such message: ${s.value}`);let c=Xn(e.env??process.env,l);if(!c.ok&&c.reason==="not-found")throw new Ke("self_identity",Nr("mail ack"));let u=c.ok?c.identity:"operator",m=Tp(l.db,{messageId:s.value,ackedBy:u,...i!==void 0?{note:i}:{},holderPid:process.pid,holderHost:pW(),terminalizePending:G(n,"--terminalize-pending")});return{ackedBy:u,ack:m}}),a={schema_version:Yr,schema:"event-log-v1",message_id:s.value,acked_by:o.ackedBy,appended:o.ack.appended,pending_outcome:o.ack.pending_outcome};return G(n,"--json")?le(e,a):e.stdout.write(`${a.appended?"acknowledged":"already acknowledged"} ${a.message_id} as ${a.acked_by} (${a.pending_outcome})
2571
+ `),0}async function DW(t,e){if(Zr(t))return e.stdout.write(NW),0;let r=Ar(t),n=te(Ka(t,["--root","--since","--limit","--cursor"]),["--root","--since","--limit","--cursor"],["--json"]);if(n.error!==void 0)return re(e,r,"invalid_arguments",n.error);if(n.positionals.length>0)return re(e,r,"invalid_arguments",`unknown argument: ${n.positionals[0]}`);let s=HS(M(n,"--since"),_W);if("error"in s)return re(e,r,"invalid_arguments",s.error);let i=Mm(M(n,"--root"));if("error"in i)return re(e,r,"invalid_arguments",i.error);let o=Dm(M(n,"--limit"));if("error"in o)return re(e,r,"invalid_arguments",o.error);let a=GS(M(n,"--cursor"),"tree");if("error"in a)return re(e,r,"invalid_arguments",a.error);if(a.value!==null&&(M(n,"--root")!==void 0||M(n,"--since")!==void 0))return re(e,r,"invalid_arguments","--cursor cannot be combined with --root or --since; the cursor retains the original filters");let l=await O(e,d=>{let c=a.value===null?i.value??He(XS(d,e,"mail tree")):He(a.value.root),u=a.value?.since??s.iso,m=a.value?.since_label??M(n,"--since")??"24h",f=GW(d,c,u,o.value,a.value?.seq??null),p=f.next_seq===null?null:JS({v:1,kind:"tree",seq:f.next_seq,root:c.value,since:u,since_label:m});return{schema_version:Yr,schema:"event-log-v1",root:{teamfile:c.teamfile,alias:c.alias},since:m,since_timestamp:u,sent:f.sent,next_cursor:p,orphan_policy:"Missing causal linkage is surfaced as a root; no temporal fallback is used.",incomplete_capture_note:"A killed invocation that never wrote request_message_id may produce an orphan root."}});if(G(n,"--json"))le(e,l);else{e.stdout.write(`Causal mail tree for ${l.root.teamfile}:${l.root.alias} since ${l.since_timestamp}
2572
2572
  `);for(let d of l.sent)BS(e,d,0);l.sent.length===0&&e.stdout.write(`(none)
2573
2573
  `),e.stdout.write(`
2574
2574
  Note: ${l.orphan_policy}
2575
- `)}return 0}function DW(t,e,r,n,s,i,o){let a=["e.event_type IN ('CREATE', 'RESPONSE_CREATE')","e.sender_teamfile = ?","e.sender_alias = ?"],l=[e.teamfile,e.alias];r!==null&&(a.push("e.receiver_teamfile = ?","e.receiver_alias = ?"),l.push(r.teamfile,r.alias)),n!==null&&(a.push("e.ts >= ?"),l.push(n)),s==="queued"&&a.push("p.message_id IS NOT NULL"),s==="delivered"&&a.push("p.message_id IS NULL"),o!==null&&(a.push("e.seq < ?"),l.push(o)),l.push(i+1);let d=t.db.prepare(`
2575
+ `)}return 0}function jW(t,e,r,n,s,i,o){let a=["e.event_type IN ('CREATE', 'RESPONSE_CREATE')","e.sender_teamfile = ?","e.sender_alias = ?"],l=[e.teamfile,e.alias];r!==null&&(a.push("e.receiver_teamfile = ?","e.receiver_alias = ?"),l.push(r.teamfile,r.alias)),n!==null&&(a.push("e.ts >= ?"),l.push(n)),s==="queued"&&a.push("p.message_id IS NOT NULL"),s==="delivered"&&a.push("p.message_id IS NULL"),o!==null&&(a.push("e.seq < ?"),l.push(o)),l.push(i+1);let d=t.db.prepare(`
2576
2576
  SELECT e.*, p.message_id AS pending_message_id,
2577
2577
  p.lifecycle_state AS pending_state,
2578
2578
  p.delivery_lease_id,
@@ -2582,7 +2582,7 @@ Note: ${l.orphan_policy}
2582
2582
  WHERE ${a.join(" AND ")}
2583
2583
  ORDER BY e.seq DESC
2584
2584
  LIMIT ?
2585
- `).all(...l),c=d.length>i,u=d.slice(0,i);return{messages:u.map(f=>{if(f.receiver_teamfile===null||f.receiver_alias===null)throw new Ke("data_error",`${f.stream_id} ${f.event_type} is missing receiver identity`);return{message_id:f.stream_id,receiver:{teamfile:f.receiver_teamfile,alias:f.receiver_alias},message_type:f.event_type==="RESPONSE_CREATE"?"response":"request",created_at:f.ts,lifecycle_state:jW(t,f)}}),next_seq:c?u.at(-1).seq:null}}function jW(t,e){return e.pending_message_id!==null?e.delivery_lease_id!==null||e.pending_state==="claimed"?"delivering":"queued":t.db.prepare("SELECT 1 FROM message_event WHERE stream_id = ? AND event_type = 'HANDLED' LIMIT 1").get(e.stream_id)===void 0?"delivered":"handled"}async function PW(t,e){let r=WS(t,e),n=r.find(m=>YW(m.event_type))??r[0],s=[...r].reverse().find(m=>yW.includes(m.event_type))??null,i=[...r].reverse().find(m=>m.event_type==="HANDLED")??null,o=FW(t,e,r),a=HW(t,e),l=Kr(n.payload.provider_prompt),d=qW(n.payload),c=await UW(o,{messageId:e,providerPrompt:l,legacyMailboxId:d,evidenceAt:s?.ts??i?.ts??null}),u=a===null&&c.matched_index!==null&&c.messages!==null?BW(c.messages,c.matched_index):null;return{schema_version:Yr,schema:"event-log-v1",message_id:e,receiver:n.receiver_teamfile===null||n.receiver_alias===null?null:{teamfile:n.receiver_teamfile,alias:n.receiver_alias},db:{delivered:s!==null,handled:i!==null,delivered_at:s?.ts??i?.ts??null,delivered_by:s===null?null:XW(s.payload)},transcript:{checked:c.checked,found:c.matched_index!==null,seen_at:c.seen_at,session_id:o?.session_id??null,provider:o?.provider??null,reason:c.reason},answered:a!==null?{via:"db_response_event",response_message_id:a.stream_id,at:a.ts}:u===null?null:{via:"transcript_heuristic",response_message_id:null,at:u.timestamp.toISOString()}}}function WS(t,e){let r=t.db.prepare("SELECT * FROM message_event WHERE stream_id = ? ORDER BY seq ASC").all(e);if(r.length===0)throw new Ke("not_found",`message stream not found: ${e}`);return r.map(Va)}function Va(t){try{let e=JSON.parse(t.payload);if(!Vr(e))throw new Ke("data_error",`message_event seq ${t.seq} payload is not an object`);return{...t,payload:e}}catch(e){throw e instanceof Ke?e:new Ke("data_error",`message_event seq ${t.seq} payload is invalid JSON`)}}function FW(t,e,r){for(let s of[...r].reverse()){let i=US(s.payload,null);if(i!==null)return i}let n=t.db.prepare(`
2585
+ `).all(...l),c=d.length>i,u=d.slice(0,i);return{messages:u.map(f=>{if(f.receiver_teamfile===null||f.receiver_alias===null)throw new Ke("data_error",`${f.stream_id} ${f.event_type} is missing receiver identity`);return{message_id:f.stream_id,receiver:{teamfile:f.receiver_teamfile,alias:f.receiver_alias},message_type:f.event_type==="RESPONSE_CREATE"?"response":"request",created_at:f.ts,lifecycle_state:PW(t,f)}}),next_seq:c?u.at(-1).seq:null}}function PW(t,e){return e.pending_message_id!==null?e.delivery_lease_id!==null||e.pending_state==="claimed"?"delivering":"queued":t.db.prepare("SELECT 1 FROM message_event WHERE stream_id = ? AND event_type = 'HANDLED' LIMIT 1").get(e.stream_id)===void 0?"delivered":"handled"}async function FW(t,e){let r=WS(t,e),n=r.find(m=>zW(m.event_type))??r[0],s=[...r].reverse().find(m=>EW.includes(m.event_type))??null,i=[...r].reverse().find(m=>m.event_type==="HANDLED")??null,o=UW(t,e,r),a=XW(t,e),l=Kr(n.payload.provider_prompt),d=BW(n.payload),c=await WW(o,{messageId:e,providerPrompt:l,legacyMailboxId:d,evidenceAt:s?.ts??i?.ts??null}),u=a===null&&c.matched_index!==null&&c.messages!==null?HW(c.messages,c.matched_index):null;return{schema_version:Yr,schema:"event-log-v1",message_id:e,receiver:n.receiver_teamfile===null||n.receiver_alias===null?null:{teamfile:n.receiver_teamfile,alias:n.receiver_alias},db:{delivered:s!==null,handled:i!==null,delivered_at:s?.ts??i?.ts??null,delivered_by:s===null?null:JW(s.payload)},transcript:{checked:c.checked,found:c.matched_index!==null,seen_at:c.seen_at,session_id:o?.session_id??null,provider:o?.provider??null,reason:c.reason},answered:a!==null?{via:"db_response_event",response_message_id:a.stream_id,at:a.ts}:u===null?null:{via:"transcript_heuristic",response_message_id:null,at:u.timestamp.toISOString()}}}function WS(t,e){let r=t.db.prepare("SELECT * FROM message_event WHERE stream_id = ? ORDER BY seq ASC").all(e);if(r.length===0)throw new Ke("not_found",`message stream not found: ${e}`);return r.map(Ga)}function Ga(t){try{let e=JSON.parse(t.payload);if(!Vr(e))throw new Ke("data_error",`message_event seq ${t.seq} payload is not an object`);return{...t,payload:e}}catch(e){throw e instanceof Ke?e:new Ke("data_error",`message_event seq ${t.seq} payload is invalid JSON`)}}function UW(t,e,r){for(let s of[...r].reverse()){let i=US(s.payload,null);if(i!==null)return i}let n=t.db.prepare(`
2586
2586
  SELECT invocation_id FROM invocation_state
2587
2587
  WHERE request_message_id = ?
2588
2588
  ORDER BY started_at ASC, invocation_id ASC
@@ -2590,7 +2590,7 @@ Note: ${l.orphan_policy}
2590
2590
  SELECT * FROM message_event
2591
2591
  WHERE stream_id = ? AND event_type = 'INVOCATION_START'
2592
2592
  ORDER BY seq ASC
2593
- `).all(s.invocation_id);for(let o of i){let a=US(Va(o).payload,s.invocation_id);if(a!==null)return a}}return null}function US(t,e){let r=Vr(t.receiver)?t.receiver:null,n=Vr(t.session)?t.session:null,s=Kr(r?.provider,n?.provider,t.provider),i=Kr(r?.session_id,n?.session_id,t.session_id);return s===null||!zW(s)||i===null?null:{provider:s,session_id:i,invocation_id:e}}async function UW(t,e){if(t===null)return{checked:!1,matched_index:null,seen_at:null,reason:"historical-session-not-recorded",messages:null};try{let r=await Be(t.session_id,t.provider);if(r===null)return{checked:!0,matched_index:null,seen_at:null,reason:"session-not-found",messages:null};let n=WW(r.messages,e);return{checked:!0,matched_index:n<0?null:n,seen_at:n<0?null:r.messages[n].timestamp.toISOString(),reason:n<0?"message-id-not-found":null,messages:r.messages}}catch(r){return{checked:!0,matched_index:null,seen_at:null,reason:`read-error: ${r instanceof Error?r.message:String(r)}`,messages:null}}}function WW(t,e){let r=e.evidenceAt===null?Number.NaN:Date.parse(e.evidenceAt),s=t.map((a,l)=>({message:a,index:l})).filter(({message:a})=>a.role==="user").filter(({message:a})=>!Number.isFinite(r)||a.timestamp.getTime()<=r),i=s.find(({message:a})=>ZW(a.content,e.messageId));if(i!==void 0)return i.index;if(e.legacyMailboxId!==null){let a=e.legacyMailboxId,l=[...s].reverse().find(({message:d})=>QW(d.content,a));if(l!==void 0)return l.index}return e.providerPrompt===null?-1:[...s].reverse().find(({message:a})=>a.content.includes(e.providerPrompt))?.index??-1}function qW(t){let e=Vr(t.legacy)?t.legacy:null;return e?.table==="agent_mailbox"&&typeof e.id=="number"&&Number.isSafeInteger(e.id)&&e.id>0?e.id:null}function BW(t,e){for(let r of t.slice(e+1)){if(r.role==="user")return null;if(r.role==="assistant"&&r.content.trim().length>0)return r}return null}function HW(t,e){let r=t.db.prepare(`
2593
+ `).all(s.invocation_id);for(let o of i){let a=US(Ga(o).payload,s.invocation_id);if(a!==null)return a}}return null}function US(t,e){let r=Vr(t.receiver)?t.receiver:null,n=Vr(t.session)?t.session:null,s=Kr(r?.provider,n?.provider,t.provider),i=Kr(r?.session_id,n?.session_id,t.session_id);return s===null||!ZW(s)||i===null?null:{provider:s,session_id:i,invocation_id:e}}async function WW(t,e){if(t===null)return{checked:!1,matched_index:null,seen_at:null,reason:"historical-session-not-recorded",messages:null};try{let r=await Be(t.session_id,t.provider);if(r===null)return{checked:!0,matched_index:null,seen_at:null,reason:"session-not-found",messages:null};let n=qW(r.messages,e);return{checked:!0,matched_index:n<0?null:n,seen_at:n<0?null:r.messages[n].timestamp.toISOString(),reason:n<0?"message-id-not-found":null,messages:r.messages}}catch(r){return{checked:!0,matched_index:null,seen_at:null,reason:`read-error: ${r instanceof Error?r.message:String(r)}`,messages:null}}}function qW(t,e){let r=e.evidenceAt===null?Number.NaN:Date.parse(e.evidenceAt),s=t.map((a,l)=>({message:a,index:l})).filter(({message:a})=>a.role==="user").filter(({message:a})=>!Number.isFinite(r)||a.timestamp.getTime()<=r),i=s.find(({message:a})=>QW(a.content,e.messageId));if(i!==void 0)return i.index;if(e.legacyMailboxId!==null){let a=e.legacyMailboxId,l=[...s].reverse().find(({message:d})=>eq(d.content,a));if(l!==void 0)return l.index}return e.providerPrompt===null?-1:[...s].reverse().find(({message:a})=>a.content.includes(e.providerPrompt))?.index??-1}function BW(t){let e=Vr(t.legacy)?t.legacy:null;return e?.table==="agent_mailbox"&&typeof e.id=="number"&&Number.isSafeInteger(e.id)&&e.id>0?e.id:null}function HW(t,e){for(let r of t.slice(e+1)){if(r.role==="user")return null;if(r.role==="assistant"&&r.content.trim().length>0)return r}return null}function XW(t,e){let r=t.db.prepare(`
2594
2594
  SELECT response.* FROM message_event AS response
2595
2595
  WHERE response.event_type = 'RESPONSE_CREATE'
2596
2596
  AND (
@@ -2606,17 +2606,17 @@ Note: ${l.orphan_policy}
2606
2606
  )
2607
2607
  ORDER BY response.seq ASC
2608
2608
  LIMIT 1
2609
- `).get(e,e);return r===void 0?null:Va(r)}function XW(t){let e=Vr(t.delivered_by)?t.delivered_by:null;return{lease_id:Kr(e?.lease_id,t.lease_id),pid:eq(e?.pid,t.pid,t.holder_pid),host:Kr(e?.host,t.host,t.holder_host)}}function JW(t,e,r,n,s){let o=t.db.prepare(`
2609
+ `).get(e,e);return r===void 0?null:Ga(r)}function JW(t){let e=Vr(t.delivered_by)?t.delivered_by:null;return{lease_id:Kr(e?.lease_id,t.lease_id),pid:tq(e?.pid,t.pid,t.holder_pid),host:Kr(e?.host,t.host,t.holder_host)}}function GW(t,e,r,n,s){let o=t.db.prepare(`
2610
2610
  SELECT * FROM message_event
2611
2611
  WHERE event_type IN ('CREATE', 'RESPONSE_CREATE')
2612
2612
  AND ts >= ?
2613
2613
  ORDER BY seq ASC
2614
- `).all(r).map(Va),a=new Map(t.db.prepare(`
2614
+ `).all(r).map(Ga),a=new Map(t.db.prepare(`
2615
2615
  SELECT invocation_id, request_message_id FROM invocation_state
2616
2616
  WHERE request_message_id IS NOT NULL
2617
- `).all().map(u=>[u.invocation_id,u.request_message_id])),l=new Map;for(let u of o){if(u.receiver_teamfile===null||u.receiver_alias===null)throw new Ke("data_error",`${u.stream_id} ${u.event_type} is missing receiver identity`);let m=u.sender_teamfile===null||u.sender_alias===null?null:{teamfile:u.sender_teamfile,alias:u.sender_alias},f=GW(u,a);l.set(u.stream_id,{seq:u.seq,message_id:u.stream_id,from:m,to:{teamfile:u.receiver_teamfile,alias:u.receiver_alias},message_type:u.event_type==="RESPONSE_CREATE"?"response":"request",at:u.ts,parent_message_id:f.message_id,parent_link:f.link,orphaned_to_root:f.message_id===null,children:[]})}for(let u of l.values()){if(u.parent_message_id===null)continue;let m=l.get(u.parent_message_id);if(m===void 0){u.orphaned_to_root=!0;continue}m.children.push(u)}let d=[...l.values()].filter(u=>u.from?.teamfile===e.teamfile&&u.from.alias===e.alias&&!VW(u,l,e)&&(s===null||u.seq>s)),c=d.slice(0,n);return{sent:c.map(u=>qS(u,new Set)),next_seq:d.length>n?c.at(-1).seq:null}}function GW(t,e){if(t.event_type==="RESPONSE_CREATE"){let i=Kr(t.payload.in_reply_to_message_id);return{message_id:i,link:i===null?null:"in_reply_to_message_id"}}let r=Vr(t.payload.causation)?t.payload.causation:null,n=Kr(t.payload.invocation_id,r?.invocation_id),s=n===null?null:e.get(n)??null;return{message_id:s,link:s===null?null:"invocation_state.request_message_id"}}function VW(t,e,r){let n=new Set([t.message_id]),s=t.parent_message_id;for(;s!==null;){if(n.has(s))return!1;n.add(s);let i=e.get(s);if(i===void 0)return!1;if(i.from?.teamfile===r.teamfile&&i.from.alias===r.alias)return!0;s=i.parent_message_id}return!1}function qS(t,e){let{seq:r,children:n,...s}=t;if(e.has(t.message_id))return{...s,children:[]};let i=new Set(e).add(t.message_id);return{...s,children:n.map(o=>qS(o,i))}}function BS(t,e,r){let n=" ".repeat(r),s=e.from===null?"operator":`${e.from.teamfile}:${e.from.alias}`;t.stdout.write(`${n}${e.message_id} ${s} -> ${e.to.teamfile}:${e.to.alias}${e.orphaned_to_root?" [root: no causal link]":""}
2618
- `);for(let i of e.children)BS(t,i,r+1)}function Ka(t,e){if(t.length!==1)return{error:`usage: lmctl mail ${e} <message_id> [--json]`};let r=t[0];return hW.test(r)?{value:r}:{error:`invalid message_id: ${r}; expected msg_<id>`}}function Mm(t){if(t===void 0)return{value:null};try{return{value:He(t)}}catch{return{error:`invalid agent identity: ${t}; expected <teamfile>:<alias>`}}}function Ya(t,e){let r=new Set(e),n=[];for(let s of t){let i=s.indexOf("="),o=i<0?s:s.slice(0,i);i>0&&r.has(o)?n.push(o,s.slice(i+1)):n.push(s)}return n}function KW(t){return t===void 0?{iso:null}:HS(t,null)}function HS(t,e){if(t===void 0)return e===null?{error:"missing --since value"}:{iso:new Date(Date.now()-e).toISOString()};let r=/^(\d+(?:\.\d+)?)(m|h|d)$/.exec(t);if(r!==null){let s=Number(r[1]),i=r[2]==="m"?6e4:r[2]==="h"?36e5:864e5,o=Date.now()-s*i;return!Number.isFinite(o)||s<=0?{error:`invalid --since value: ${t}`}:{iso:new Date(o).toISOString()}}let n=Date.parse(t);return Number.isFinite(n)?{iso:new Date(n).toISOString()}:{error:`invalid --since value: ${t}; use an ISO timestamp or duration such as 24h`}}function XS(t,e,r){let n=Xn(e.env??process.env,t);if(n.ok)return n.identity;throw n.reason==="not-found"?new Ke("self_identity",Nr(r)):new Ke("self_identity",Tm(r))}function Zr(t){return t.length===1&&(t[0]==="--help"||t[0]==="-h")}function Ar(t){return t.includes("--json")}function re(t,e,r,n){return e?(le(t,{status:"error",errorKind:r,message:n}),1):N(t,n)}function Dm(t){if(t===void 0)return{value:_W};if(!/^\d+$/.test(t))return{error:`invalid --limit value: ${t}; expected an integer`};let e=Number(t);return!Number.isSafeInteger(e)||e<1||e>FS?{error:`invalid --limit value: ${t}; expected 1..${FS}`}:{value:e}}function JS(t){return Buffer.from(JSON.stringify(t),"utf8").toString("base64url")}function GS(t,e){if(t===void 0)return{value:null};try{let r=JSON.parse(Buffer.from(t,"base64url").toString("utf8"));return!Vr(r)||r.v!==1||r.kind!==e||typeof r.seq!="number"||!Number.isSafeInteger(r.seq)||r.seq<1?{error:"invalid --cursor value"}:r.kind==="sent"?typeof r.self!="string"||!Cm(r.self)||!(r.to===null||typeof r.to=="string"&&Cm(r.to))||!(r.since===null||typeof r.since=="string"&&Number.isFinite(Date.parse(r.since)))||!(r.status===null||r.status==="queued"||r.status==="delivered")?{error:"invalid --cursor value"}:{value:r}:typeof r.root!="string"||!Cm(r.root)||typeof r.since!="string"||!Number.isFinite(Date.parse(r.since))||typeof r.since_label!="string"||r.since_label.length===0?{error:"invalid --cursor value"}:{value:r}}catch{return{error:"invalid --cursor value"}}}function Cm(t){try{return He(t),!0}catch{return!1}}function YW(t){return gW.includes(t)}function zW(t){return["claude","codex","gemini","copilot","opencode","lmplayer","qwen","agy","ClaudeMock"].includes(t)}function Vr(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function ZW(t,e){let r=e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return new RegExp(`(?:^|[^A-Za-z0-9_-])${r}(?:$|[^A-Za-z0-9_-])`).test(t)}function QW(t,e){return new RegExp(`(?:^|\\n)--- queued (?:message|response) [0-9]+ \\(mail #${e}(?:,|\\))`,"i").test(t)}function Kr(...t){for(let e of t)if(typeof e=="string"&&e.length>0)return e;return null}function eq(...t){for(let e of t)if(typeof e=="number"&&Number.isFinite(e))return e;return null}var pW,_W,FS,Yr,hW,gW,yW,zr,EW,wW,TW,vW,SW,bW,kW,IW,Ke,KS=E(()=>{"use strict";gi();nr();Ce();Ha();Ys();pW=24*60*60*1e3,_W=100,FS=1e3,Yr=1,hW=/^msg_[A-Za-z0-9][A-Za-z0-9_-]*$/,gW=["CREATE","RESPONSE_CREATE"],yW=["DELIVERED","RESPONSE_DELIVERED"],zr=`schema_version is the output-contract version consumers must switch on.
2619
- schema identifies the backing event-log substrate; it is not a second output version.`,EW=`usage:
2617
+ `).all().map(u=>[u.invocation_id,u.request_message_id])),l=new Map;for(let u of o){if(u.receiver_teamfile===null||u.receiver_alias===null)throw new Ke("data_error",`${u.stream_id} ${u.event_type} is missing receiver identity`);let m=u.sender_teamfile===null||u.sender_alias===null?null:{teamfile:u.sender_teamfile,alias:u.sender_alias},f=VW(u,a);l.set(u.stream_id,{seq:u.seq,message_id:u.stream_id,from:m,to:{teamfile:u.receiver_teamfile,alias:u.receiver_alias},message_type:u.event_type==="RESPONSE_CREATE"?"response":"request",at:u.ts,parent_message_id:f.message_id,parent_link:f.link,orphaned_to_root:f.message_id===null,children:[]})}for(let u of l.values()){if(u.parent_message_id===null)continue;let m=l.get(u.parent_message_id);if(m===void 0){u.orphaned_to_root=!0;continue}m.children.push(u)}let d=[...l.values()].filter(u=>u.from?.teamfile===e.teamfile&&u.from.alias===e.alias&&!KW(u,l,e)&&(s===null||u.seq>s)),c=d.slice(0,n);return{sent:c.map(u=>qS(u,new Set)),next_seq:d.length>n?c.at(-1).seq:null}}function VW(t,e){if(t.event_type==="RESPONSE_CREATE"){let i=Kr(t.payload.in_reply_to_message_id);return{message_id:i,link:i===null?null:"in_reply_to_message_id"}}let r=Vr(t.payload.causation)?t.payload.causation:null,n=Kr(t.payload.invocation_id,r?.invocation_id),s=n===null?null:e.get(n)??null;return{message_id:s,link:s===null?null:"invocation_state.request_message_id"}}function KW(t,e,r){let n=new Set([t.message_id]),s=t.parent_message_id;for(;s!==null;){if(n.has(s))return!1;n.add(s);let i=e.get(s);if(i===void 0)return!1;if(i.from?.teamfile===r.teamfile&&i.from.alias===r.alias)return!0;s=i.parent_message_id}return!1}function qS(t,e){let{seq:r,children:n,...s}=t;if(e.has(t.message_id))return{...s,children:[]};let i=new Set(e).add(t.message_id);return{...s,children:n.map(o=>qS(o,i))}}function BS(t,e,r){let n=" ".repeat(r),s=e.from===null?"operator":`${e.from.teamfile}:${e.from.alias}`;t.stdout.write(`${n}${e.message_id} ${s} -> ${e.to.teamfile}:${e.to.alias}${e.orphaned_to_root?" [root: no causal link]":""}
2618
+ `);for(let i of e.children)BS(t,i,r+1)}function Va(t,e){if(t.length!==1)return{error:`usage: lmctl mail ${e} <message_id> [--json]`};let r=t[0];return gW.test(r)?{value:r}:{error:`invalid message_id: ${r}; expected msg_<id>`}}function Mm(t){if(t===void 0)return{value:null};try{return{value:He(t)}}catch{return{error:`invalid agent identity: ${t}; expected <teamfile>:<alias>`}}}function Ka(t,e){let r=new Set(e),n=[];for(let s of t){let i=s.indexOf("="),o=i<0?s:s.slice(0,i);i>0&&r.has(o)?n.push(o,s.slice(i+1)):n.push(s)}return n}function YW(t){return t===void 0?{iso:null}:HS(t,null)}function HS(t,e){if(t===void 0)return e===null?{error:"missing --since value"}:{iso:new Date(Date.now()-e).toISOString()};let r=/^(\d+(?:\.\d+)?)(m|h|d)$/.exec(t);if(r!==null){let s=Number(r[1]),i=r[2]==="m"?6e4:r[2]==="h"?36e5:864e5,o=Date.now()-s*i;return!Number.isFinite(o)||s<=0?{error:`invalid --since value: ${t}`}:{iso:new Date(o).toISOString()}}let n=Date.parse(t);return Number.isFinite(n)?{iso:new Date(n).toISOString()}:{error:`invalid --since value: ${t}; use an ISO timestamp or duration such as 24h`}}function XS(t,e,r){let n=Xn(e.env??process.env,t);if(n.ok)return n.identity;throw n.reason==="not-found"?new Ke("self_identity",Nr(r)):new Ke("self_identity",Tm(r))}function Zr(t){return t.length===1&&(t[0]==="--help"||t[0]==="-h")}function Ar(t){return t.includes("--json")}function re(t,e,r,n){return e?(le(t,{status:"error",errorKind:r,message:n}),1):N(t,n)}function Dm(t){if(t===void 0)return{value:hW};if(!/^\d+$/.test(t))return{error:`invalid --limit value: ${t}; expected an integer`};let e=Number(t);return!Number.isSafeInteger(e)||e<1||e>FS?{error:`invalid --limit value: ${t}; expected 1..${FS}`}:{value:e}}function JS(t){return Buffer.from(JSON.stringify(t),"utf8").toString("base64url")}function GS(t,e){if(t===void 0)return{value:null};try{let r=JSON.parse(Buffer.from(t,"base64url").toString("utf8"));return!Vr(r)||r.v!==1||r.kind!==e||typeof r.seq!="number"||!Number.isSafeInteger(r.seq)||r.seq<1?{error:"invalid --cursor value"}:r.kind==="sent"?typeof r.self!="string"||!Cm(r.self)||!(r.to===null||typeof r.to=="string"&&Cm(r.to))||!(r.since===null||typeof r.since=="string"&&Number.isFinite(Date.parse(r.since)))||!(r.status===null||r.status==="queued"||r.status==="delivered")?{error:"invalid --cursor value"}:{value:r}:typeof r.root!="string"||!Cm(r.root)||typeof r.since!="string"||!Number.isFinite(Date.parse(r.since))||typeof r.since_label!="string"||r.since_label.length===0?{error:"invalid --cursor value"}:{value:r}}catch{return{error:"invalid --cursor value"}}}function Cm(t){try{return He(t),!0}catch{return!1}}function zW(t){return yW.includes(t)}function ZW(t){return["claude","codex","gemini","copilot","opencode","lmplayer","qwen","agy","ClaudeMock"].includes(t)}function Vr(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function QW(t,e){let r=e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return new RegExp(`(?:^|[^A-Za-z0-9_-])${r}(?:$|[^A-Za-z0-9_-])`).test(t)}function eq(t,e){return new RegExp(`(?:^|\\n)--- queued (?:message|response) [0-9]+ \\(mail #${e}(?:,|\\))`,"i").test(t)}function Kr(...t){for(let e of t)if(typeof e=="string"&&e.length>0)return e;return null}function tq(...t){for(let e of t)if(typeof e=="number"&&Number.isFinite(e))return e;return null}var _W,hW,FS,Yr,gW,yW,EW,zr,wW,TW,vW,SW,bW,kW,IW,NW,Ke,KS=E(()=>{"use strict";gi();nr();Ce();Ba();Ys();_W=24*60*60*1e3,hW=100,FS=1e3,Yr=1,gW=/^msg_[A-Za-z0-9][A-Za-z0-9_-]*$/,yW=["CREATE","RESPONSE_CREATE"],EW=["DELIVERED","RESPONSE_DELIVERED"],zr=`schema_version is the output-contract version consumers must switch on.
2619
+ schema identifies the backing event-log substrate; it is not a second output version.`,wW=`usage:
2620
2620
  lmctl mail sent [--to <teamfile:alias>] [--since <duration|ISO>] [--status queued|delivered] [--limit N] [--cursor <token>] [--json]
2621
2621
  lmctl mail history <message_id> [--json]
2622
2622
  lmctl mail seen <message_id> [--json]
@@ -2658,7 +2658,7 @@ sent and tree return at most 100 roots by default (maximum --limit 1000).
2658
2658
  For every subcommand, --json is the stable, versioned external contract.
2659
2659
  Default human-readable output is intentionally not a stable machine interface.
2660
2660
  Run "lmctl mail <subcommand> --help" for its exact JSON contract.
2661
- `,wW=`usage:
2661
+ `,TW=`usage:
2662
2662
  lmctl mail sent [--to <teamfile:alias>] [--since <duration|ISO>]
2663
2663
  [--status queued|delivered] [--limit N] [--cursor <token>] [--json]
2664
2664
 
@@ -2672,7 +2672,7 @@ With --json, the stable external contract is:
2672
2672
  "messages":[...],"next_cursor":"<opaque token>"|null}
2673
2673
  ${zr}
2674
2674
  Default text output is human-readable and may change without notice.
2675
- `,TW=`usage:
2675
+ `,vW=`usage:
2676
2676
  lmctl mail pending [--receiver <teamfile:alias>] [--limit N] [--json]
2677
2677
 
2678
2678
  Lists undelivered messages (lifecycle queued or claimed) straight from the
@@ -2695,7 +2695,7 @@ With --json, the stable external contract is:
2695
2695
  "lifecycle_state":"queued"|"claimed","created_seq":N}]}
2696
2696
  ${zr}
2697
2697
  Default text output is human-readable and may change without notice.
2698
- `,vW=`usage:
2698
+ `,SW=`usage:
2699
2699
  lmctl mail read <message_id> [--json]
2700
2700
 
2701
2701
  Returns the message's content and current pending state. A plain read query
@@ -2714,7 +2714,7 @@ pending_state null means the message is terminal (delivered or acknowledged);
2714
2714
  read never changes it.
2715
2715
  ${zr}
2716
2716
  Default text output is human-readable and may change without notice.
2717
- `,SW=`usage:
2717
+ `,bW=`usage:
2718
2718
  lmctl mail ack <message_id> [--terminalize-pending] [--note <text>] [--json]
2719
2719
 
2720
2720
  Active read receipt: appends a MESSAGE_ACKNOWLEDGED event recording that THIS
@@ -2748,7 +2748,7 @@ repeat). pending_outcome "record-only" = terminalize not requested;
2748
2748
  in flight won instead; "not-pending" = the message was already terminal.
2749
2749
  ${zr}
2750
2750
  Default text output is human-readable and may change without notice.
2751
- `,bW=`usage:
2751
+ `,kW=`usage:
2752
2752
  lmctl mail history <message_id> [--json]
2753
2753
 
2754
2754
  Returns one message stream in message_event.seq order.
@@ -2758,7 +2758,7 @@ With --json, the stable external contract is:
2758
2758
  "message_id":"msg_...","events":[...]}
2759
2759
  ${zr}
2760
2760
  Default text output is human-readable and may change without notice.
2761
- `,kW=`usage:
2761
+ `,IW=`usage:
2762
2762
  lmctl mail seen <message_id> [--json]
2763
2763
 
2764
2764
  Combines event-log delivery evidence with the historical provider session
@@ -2774,7 +2774,7 @@ With --json, the stable external contract is:
2774
2774
  "receiver":{...}|null,"db":{...},"transcript":{...},"answered":...}
2775
2775
  ${zr}
2776
2776
  Default text output is human-readable and may change without notice.
2777
- `,IW=`usage:
2777
+ `,NW=`usage:
2778
2778
  lmctl mail tree [--root <teamfile:alias>] [--since <duration|ISO>]
2779
2779
  [--limit N] [--cursor <token>] [--json]
2780
2780
 
@@ -2789,8 +2789,8 @@ With --json, the stable external contract is:
2789
2789
  "incomplete_capture_note":"..."}
2790
2790
  ${zr}
2791
2791
  Default text output is human-readable and may change without notice.
2792
- `,Ke=class extends Error{errorKind;constructor(e,r){super(r),this.errorKind=e}}});import{existsSync as YS,mkdirSync as tq,readdirSync as rq,readFileSync as zS,writeFileSync as nq}from"node:fs";import{join as Gn}from"node:path";import{fileURLToPath as sq}from"node:url";function oq(t){try{return iq.some(e=>YS(Gn(t,e)))}catch{return!1}}function aq(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),i=r.match(/^type:\s*(.+)$/m),o=r.match(/^description:\s*(.+)$/m),a=s?.[1]?.trim(),l=i?.[1]?.trim();return!a||!l?null:{name:a,type:l,description:o?.[1]?.trim()??null,body:n}}function ZS(t,e){t.durable_memory_mode!=="db"?lq(t):dq(t,e)}function QS(t){let e=oq(t),r;try{r=rq(za).filter(n=>n.endsWith(".template")).sort()}catch(n){return C({event:"bootstrap_templates_unreadable",path:za,error_message:n instanceof Error?n.message:String(n)}),[]}return r.filter(n=>n==="skills_lmprobe.md.template"||n==="skills_lmdebug.md.template"?e:!0)}function lq(t){let e=t.local_path;if(!e){console.warn("[bootstrap] skipping: project has no local_path"),C({event:"bootstrap_skipped_no_local_path",project_id:t.id,project_name:t.name});return}let r=Gn(e,"durable-memory");try{tq(r,{recursive:!0})}catch(i){console.error("[bootstrap] failed to create durable-memory directory:",i),C({event:"bootstrap_memory_dir_create_failed",project_id:t.id,path:r,error_message:i instanceof Error?i.message:String(i)});return}let n=QS(e),s=[];for(let i of n){let o=i.replace(/\.template$/,""),a=Gn(r,o);if(!YS(a))try{let l=zS(Gn(za,i),"utf8");nq(a,l,"utf8"),s.push(o)}catch(l){console.error(`[bootstrap] failed to copy ${i}:`,l),C({event:"bootstrap_template_copy_failed",project_id:t.id,template:i,path:a,error_message:l instanceof Error?l.message:String(l)})}}s.length>0&&console.log(`[bootstrap] filled durable-memory stubs at ${r}: ${s.join(", ")}`)}function dq(t,e){let r=t.local_path??"",n=QS(r),s=[];for(let i of n){let o=Gn(za,i),a;try{a=zS(o,"utf8")}catch(d){console.error(`[bootstrap] failed to read ${i}:`,d),C({event:"bootstrap_template_read_failed",project_id:t.id,template:i,path:o,error_message:d instanceof Error?d.message:String(d)});continue}let l=aq(a);if(l===null){console.error(`[bootstrap] failed to parse frontmatter in ${i}`),C({event:"bootstrap_template_frontmatter_invalid",project_id:t.id,template:i,path: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(d){console.error(`[bootstrap] failed to upsert ${l.name}:`,d),C({event:"bootstrap_memory_upsert_failed",project_id:t.id,memory_name:l.name,template:i,error_message:d instanceof Error?d.message:String(d)})}}s.length>0&&console.log(`[bootstrap] filled durable-memory DB stubs for project ${t.name}: ${s.join(", ")}`)}var za,iq,eb=E(()=>{"use strict";me();za=Gn(sq(import.meta.url),"../../config/durable_memory_templates"),iq=[".git","package.json","Cargo.toml","pyproject.toml","go.mod","Gemfile","pom.xml","build.gradle","composer.json","Pipfile"]});import{createHash as cq}from"node:crypto";import{existsSync as uq,mkdirSync as mq,writeFileSync as fq}from"node:fs";import{dirname as pq,join as Vn}from"node:path";function jm(t){return typeof t=="string"&&t.startsWith(tb)}function wq(t){if(!jm(t))throw new vt(`not an lmctl:// URI: ${t}`,"malformed");let e=t.slice(tb.length),r=e.indexOf("/");if(r<=0)throw new vt(`malformed lmctl:// URI (expected lmctl://<workflow|mcp|skill>/<name>): ${t}`,"malformed");let n=e.slice(0,r);if(!yq.has(n))throw new vt(`unknown lmctl:// kind '${n}' (expected workflow|mcp|skill): ${t}`,"malformed");let s=e.slice(r+1),i,o=s.indexOf("@");o>=0&&(i=s.slice(o+1).trim(),s=s.slice(0,o));let a=s.trim();if(a.length===0)throw new vt(`empty name in lmctl:// URI: ${t}`,"malformed");if(/[\\/]|\.\./.test(a))throw new vt(`invalid name in lmctl:// URI (no path separators): ${t}`,"malformed");return{kind:n,name:a,...i!==void 0&&i.length>0?{ref:i}:{}}}function Tq(t,e,r){if(t==="workflow")return Do(e,r);let n=t==="mcp"?Vn("templates","mcp",`${e}.json`):Vn("templates","skills",e,"SKILL.md");for(let s of Pc(r)){let i=Vn(s,n);if(uq(i))return i}return null}function vq(t,e,r){let n=Vn(jc(r),hq,t);return t==="skill"?Vn(n,e,"SKILL.md"):Vn(n,`${e}${t==="workflow"?".compound.json":".json"}`)}function Sq(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 rb(t,e){let{kind:r,name:n,ref:s}=wq(t),i=Tq(r,n,e);if(i!==null)return i;let o=`${_q}${r}/${n}`,a;try{a=await fetch(o,{signal:AbortSignal.timeout(gq)})}catch(c){throw new vt(`lmctl:// '${t}' not found locally or at the remote catalog ${o} (${c instanceof Error?c.message:String(c)}). Failing closed.`,"missing")}if(!a.ok)throw new vt(`lmctl:// '${t}' not found locally or at the remote catalog ${o} (HTTP ${a.status}). Failing closed.`,"missing");let l=await a.text();if(s!==void 0){let c=Eq.exec(s);if(c!==null){let u=cq("sha256").update(l).digest("hex");if(u.toLowerCase()!==c[1].toLowerCase())throw new vt(`lmctl:// '${t}' remote artifact FAILED integrity pin (expected sha256 ${c[1]}, got ${u}) \u2014 discarded, NOT cached.`,"validation-failure")}}if(!Sq(r,l))throw new vt(`lmctl:// '${t}' remote artifact failed shape validation for ${r} \u2014 discarded, NOT cached.`,"validation-failure");let d=vq(r,n,e);return mq(pq(d),{recursive:!0}),fq(d,l,"utf8"),d}var tb,_q,hq,gq,yq,vt,Eq,nb=E(()=>{"use strict";Fc();tb="lmctl://",_q="https://lmctl.com/templates/",hq=".cache",gq=8e3,yq=new Set(["workflow","mcp","skill"]),vt=class extends Error{reason;constructor(e,r="malformed"){super(e),this.reason=r,this.name="LmctlUriError"}},Eq=/^(?:sha256[:-])?([0-9a-f]{64})$/i});import{spawnSync as bq}from"node:child_process";import{cpSync as sb,existsSync as kq,mkdirSync as Iq,mkdtempSync as Nq,readFileSync as fZ,statSync as Aq,writeFileSync as ib}from"node:fs";import{homedir as xq,tmpdir as Rq}from"node:os";import{basename as ob,join as ir}from"node:path";function Pm(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function Fm(t,e,r){if(Array.isArray(t)){for(let n of t)Fm(n,e,r);return}if(Pm(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))Fm(n,e,r)}}function Cq(t,e){let r={mcp:[],skills:[]},n=new Set;for(let i of t.listProjects()){if(i.team_id!==e.team_id)continue;let o=t.getWorkflowByName(i.workflow_name);if(o===null||n.has(o.id))continue;n.add(o.id);let a;try{a=JSON.parse(o.definition)}catch{continue}if(!(!Pm(a)||!Array.isArray(a.steps)))for(let l of a.steps)Pm(l)&&l.members!==void 0&&Fm(l.members,e.alias,r)}let s=i=>{let o=new Map;for(let a of i)o.set($q(a),a);return[...o.values()]};return{mcp:s(r.mcp),skills:s(r.skills)}}function Mq(t,e){return t.listProjects().find(r=>r.team_id===e.team_id)?.local_path}async function Dq(t,e){let r;try{r=await fetch(t,{signal:AbortSignal.timeout(Lq)})}catch(s){throw new xr(e,`fetch ${t} failed: ${s.message}`)}if(!r.ok)throw new xr(e,`fetch ${t} \u2192 HTTP ${r.status}`);let n=await r.text();if(n.length>ab)throw new xr(e,`fetched ${t} exceeds ${ab} bytes`);return n}function jq(t,e,r,n){let s=bq(t,e,{cwd:r,env:ur(void 0,r),encoding:"utf8",timeout:6e4});if(s.error)throw new xr(n,`spawn ${t} failed: ${s.error.message}`);if(s.status!==0)throw new xr(n,`${t} ${e.slice(0,3).join(" ")} exited ${s.status}: ${(s.stderr??"").trim().slice(0,200)}`)}function Pq(t){if(typeof t!="string")return t.name;let e=ob(t.replace(/\/+$/,""));return e.toLowerCase()==="skill.md"?ob(t.replace(/\/skill\.md$/i,"")):e}async function lb(t,e,r){let n=Pq(t),s=ir(e,n);if(Iq(s,{recursive:!0}),typeof t!="string")return ib(ir(s,"SKILL.md"),t.content,"utf8"),{name:n,dir:s};if(jm(t)&&(t=await rb(t)),cb.test(t))return ib(ir(s,"SKILL.md"),await Dq(t,r),"utf8"),{name:n,dir:s};if(!kq(t))throw new xr(r,`skill path not found: ${t}`);return Aq(t).isDirectory()?(sb(t,s,{recursive:!0}),{name:n,dir:s}):(sb(t,ir(s,"SKILL.md")),{name:n,dir:s})}async function ub(t){let{dal:e,member:r,stderr:n}=t,s=Cq(e,r);if(s.mcp.length===0&&s.skills.length===0)return;let i=Xe(r),o=r.sessiondir||t.baseDir||Mq(e,r)||process.cwd(),a=l=>{n.write(`[seed:${r.alias}] ${l}
2793
- `)};if(s.mcp.length>0&&a(`MCP capability install is disabled in lmctl; ${s.mcp.length} declared server(s) NOT installed. Use nomcp for MCP server access.`),s.skills.length>0)if(Oq.has(i))a(`skills for ${i} are honest-BLOCKED \u2014 opencode has NO SKILL.md filesystem ingestion (no \`skill\` subcommand, no skills dir, no SKILL.md in the opencode package; \`opencode agent\` is a distinct artifact); ${s.skills.length} declared skill(s) NOT installed (operator follow-up).`);else if(i==="gemini"||i==="agy"){let l=Nq(ir(Rq(),`lmctl-skill-${r.alias}-`));for(let d of s.skills){let c=typeof d=="string"&&!cb.test(d)?d:(await lb(d,l,r.alias)).dir;jq(i,["skills","install",c,"--scope","user","--consent"],o,r.alias)}a(`installed ${s.skills.length} skill(s) via \`${i} skills install --scope user\` (idempotent).`)}else if(db[i]!==void 0){let l=db[i]();for(let d of s.skills)await lb(d,l,r.alias);a(`installed ${s.skills.length} skill(s) \u2192 ${l}/<name>/SKILL.md (idempotent overwrite).`)}else a(`provider ${i} has no verified skills mechanism \u2014 ${s.skills.length} declared skill(s) NOT installed.`)}var xr,cb,Lq,ab,Oq,$q,Za,db,mb=E(()=>{"use strict";ct();nb();ut();Ks();xr=class extends Error{alias;constructor(e,r){super(`capability install failed for ${e}: ${r}`),this.alias=e,this.name="CapabilityInstallError"}},cb=/^https?:\/\//i,Lq=8e3,ab=1e6,Oq=new Set(["opencode"]),$q=t=>JSON.stringify(t),Za=()=>process.env.HOME??xq();db={claude:()=>ir(Za(),".claude","skills"),qwen:()=>ir(Za(),".qwen","skills"),codex:()=>ir(Za(),".codex","skills"),copilot:()=>ir(Za(),".copilot","skills")}});var Um,fb=E(()=>{"use strict";Um=`---
2792
+ `,Ke=class extends Error{errorKind;constructor(e,r){super(r),this.errorKind=e}}});import{existsSync as YS,mkdirSync as rq,readdirSync as nq,readFileSync as zS,writeFileSync as sq}from"node:fs";import{join as Gn}from"node:path";import{fileURLToPath as iq}from"node:url";function aq(t){try{return oq.some(e=>YS(Gn(t,e)))}catch{return!1}}function lq(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),i=r.match(/^type:\s*(.+)$/m),o=r.match(/^description:\s*(.+)$/m),a=s?.[1]?.trim(),l=i?.[1]?.trim();return!a||!l?null:{name:a,type:l,description:o?.[1]?.trim()??null,body:n}}function ZS(t,e){t.durable_memory_mode!=="db"?dq(t):cq(t,e)}function QS(t){let e=aq(t),r;try{r=nq(Ya).filter(n=>n.endsWith(".template")).sort()}catch(n){return C({event:"bootstrap_templates_unreadable",path:Ya,error_message:n instanceof Error?n.message:String(n)}),[]}return r.filter(n=>n==="skills_lmprobe.md.template"||n==="skills_lmdebug.md.template"?e:!0)}function dq(t){let e=t.local_path;if(!e){console.warn("[bootstrap] skipping: project has no local_path"),C({event:"bootstrap_skipped_no_local_path",project_id:t.id,project_name:t.name});return}let r=Gn(e,"durable-memory");try{rq(r,{recursive:!0})}catch(i){console.error("[bootstrap] failed to create durable-memory directory:",i),C({event:"bootstrap_memory_dir_create_failed",project_id:t.id,path:r,error_message:i instanceof Error?i.message:String(i)});return}let n=QS(e),s=[];for(let i of n){let o=i.replace(/\.template$/,""),a=Gn(r,o);if(!YS(a))try{let l=zS(Gn(Ya,i),"utf8");sq(a,l,"utf8"),s.push(o)}catch(l){console.error(`[bootstrap] failed to copy ${i}:`,l),C({event:"bootstrap_template_copy_failed",project_id:t.id,template:i,path:a,error_message:l instanceof Error?l.message:String(l)})}}s.length>0&&console.log(`[bootstrap] filled durable-memory stubs at ${r}: ${s.join(", ")}`)}function cq(t,e){let r=t.local_path??"",n=QS(r),s=[];for(let i of n){let o=Gn(Ya,i),a;try{a=zS(o,"utf8")}catch(d){console.error(`[bootstrap] failed to read ${i}:`,d),C({event:"bootstrap_template_read_failed",project_id:t.id,template:i,path:o,error_message:d instanceof Error?d.message:String(d)});continue}let l=lq(a);if(l===null){console.error(`[bootstrap] failed to parse frontmatter in ${i}`),C({event:"bootstrap_template_frontmatter_invalid",project_id:t.id,template:i,path: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(d){console.error(`[bootstrap] failed to upsert ${l.name}:`,d),C({event:"bootstrap_memory_upsert_failed",project_id:t.id,memory_name:l.name,template:i,error_message:d instanceof Error?d.message:String(d)})}}s.length>0&&console.log(`[bootstrap] filled durable-memory DB stubs for project ${t.name}: ${s.join(", ")}`)}var Ya,oq,eb=E(()=>{"use strict";me();Ya=Gn(iq(import.meta.url),"../../config/durable_memory_templates"),oq=[".git","package.json","Cargo.toml","pyproject.toml","go.mod","Gemfile","pom.xml","build.gradle","composer.json","Pipfile"]});import{createHash as uq}from"node:crypto";import{existsSync as mq,mkdirSync as fq,writeFileSync as pq}from"node:fs";import{dirname as _q,join as Vn}from"node:path";function jm(t){return typeof t=="string"&&t.startsWith(tb)}function Tq(t){if(!jm(t))throw new vt(`not an lmctl:// URI: ${t}`,"malformed");let e=t.slice(tb.length),r=e.indexOf("/");if(r<=0)throw new vt(`malformed lmctl:// URI (expected lmctl://<workflow|mcp|skill>/<name>): ${t}`,"malformed");let n=e.slice(0,r);if(!Eq.has(n))throw new vt(`unknown lmctl:// kind '${n}' (expected workflow|mcp|skill): ${t}`,"malformed");let s=e.slice(r+1),i,o=s.indexOf("@");o>=0&&(i=s.slice(o+1).trim(),s=s.slice(0,o));let a=s.trim();if(a.length===0)throw new vt(`empty name in lmctl:// URI: ${t}`,"malformed");if(/[\\/]|\.\./.test(a))throw new vt(`invalid name in lmctl:// URI (no path separators): ${t}`,"malformed");return{kind:n,name:a,...i!==void 0&&i.length>0?{ref:i}:{}}}function vq(t,e,r){if(t==="workflow")return Do(e,r);let n=t==="mcp"?Vn("templates","mcp",`${e}.json`):Vn("templates","skills",e,"SKILL.md");for(let s of jc(r)){let i=Vn(s,n);if(mq(i))return i}return null}function Sq(t,e,r){let n=Vn(Dc(r),gq,t);return t==="skill"?Vn(n,e,"SKILL.md"):Vn(n,`${e}${t==="workflow"?".compound.json":".json"}`)}function bq(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 rb(t,e){let{kind:r,name:n,ref:s}=Tq(t),i=vq(r,n,e);if(i!==null)return i;let o=`${hq}${r}/${n}`,a;try{a=await fetch(o,{signal:AbortSignal.timeout(yq)})}catch(c){throw new vt(`lmctl:// '${t}' not found locally or at the remote catalog ${o} (${c instanceof Error?c.message:String(c)}). Failing closed.`,"missing")}if(!a.ok)throw new vt(`lmctl:// '${t}' not found locally or at the remote catalog ${o} (HTTP ${a.status}). Failing closed.`,"missing");let l=await a.text();if(s!==void 0){let c=wq.exec(s);if(c!==null){let u=uq("sha256").update(l).digest("hex");if(u.toLowerCase()!==c[1].toLowerCase())throw new vt(`lmctl:// '${t}' remote artifact FAILED integrity pin (expected sha256 ${c[1]}, got ${u}) \u2014 discarded, NOT cached.`,"validation-failure")}}if(!bq(r,l))throw new vt(`lmctl:// '${t}' remote artifact failed shape validation for ${r} \u2014 discarded, NOT cached.`,"validation-failure");let d=Sq(r,n,e);return fq(_q(d),{recursive:!0}),pq(d,l,"utf8"),d}var tb,hq,gq,yq,Eq,vt,wq,nb=E(()=>{"use strict";Pc();tb="lmctl://",hq="https://lmctl.com/templates/",gq=".cache",yq=8e3,Eq=new Set(["workflow","mcp","skill"]),vt=class extends Error{reason;constructor(e,r="malformed"){super(e),this.reason=r,this.name="LmctlUriError"}},wq=/^(?:sha256[:-])?([0-9a-f]{64})$/i});import{spawnSync as kq}from"node:child_process";import{cpSync as sb,existsSync as Iq,mkdirSync as Nq,mkdtempSync as Aq,readFileSync as pZ,statSync as xq,writeFileSync as ib}from"node:fs";import{homedir as Rq,tmpdir as Lq}from"node:os";import{basename as ob,join as ir}from"node:path";function Pm(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function Fm(t,e,r){if(Array.isArray(t)){for(let n of t)Fm(n,e,r);return}if(Pm(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))Fm(n,e,r)}}function Mq(t,e){let r={mcp:[],skills:[]},n=new Set;for(let i of t.listProjects()){if(i.team_id!==e.team_id)continue;let o=t.getWorkflowByName(i.workflow_name);if(o===null||n.has(o.id))continue;n.add(o.id);let a;try{a=JSON.parse(o.definition)}catch{continue}if(!(!Pm(a)||!Array.isArray(a.steps)))for(let l of a.steps)Pm(l)&&l.members!==void 0&&Fm(l.members,e.alias,r)}let s=i=>{let o=new Map;for(let a of i)o.set(Cq(a),a);return[...o.values()]};return{mcp:s(r.mcp),skills:s(r.skills)}}function Dq(t,e){return t.listProjects().find(r=>r.team_id===e.team_id)?.local_path}async function jq(t,e){let r;try{r=await fetch(t,{signal:AbortSignal.timeout(Oq)})}catch(s){throw new xr(e,`fetch ${t} failed: ${s.message}`)}if(!r.ok)throw new xr(e,`fetch ${t} \u2192 HTTP ${r.status}`);let n=await r.text();if(n.length>ab)throw new xr(e,`fetched ${t} exceeds ${ab} bytes`);return n}function Pq(t,e,r,n){let s=kq(t,e,{cwd:r,env:ur(void 0,r),encoding:"utf8",timeout:6e4});if(s.error)throw new xr(n,`spawn ${t} failed: ${s.error.message}`);if(s.status!==0)throw new xr(n,`${t} ${e.slice(0,3).join(" ")} exited ${s.status}: ${(s.stderr??"").trim().slice(0,200)}`)}function Fq(t){if(typeof t!="string")return t.name;let e=ob(t.replace(/\/+$/,""));return e.toLowerCase()==="skill.md"?ob(t.replace(/\/skill\.md$/i,"")):e}async function lb(t,e,r){let n=Fq(t),s=ir(e,n);if(Nq(s,{recursive:!0}),typeof t!="string")return ib(ir(s,"SKILL.md"),t.content,"utf8"),{name:n,dir:s};if(jm(t)&&(t=await rb(t)),cb.test(t))return ib(ir(s,"SKILL.md"),await jq(t,r),"utf8"),{name:n,dir:s};if(!Iq(t))throw new xr(r,`skill path not found: ${t}`);return xq(t).isDirectory()?(sb(t,s,{recursive:!0}),{name:n,dir:s}):(sb(t,ir(s,"SKILL.md")),{name:n,dir:s})}async function ub(t){let{dal:e,member:r,stderr:n}=t,s=Mq(e,r);if(s.mcp.length===0&&s.skills.length===0)return;let i=Xe(r),o=r.sessiondir||t.baseDir||Dq(e,r)||process.cwd(),a=l=>{n.write(`[seed:${r.alias}] ${l}
2793
+ `)};if(s.mcp.length>0&&a(`MCP capability install is disabled in lmctl; ${s.mcp.length} declared server(s) NOT installed. Use nomcp for MCP server access.`),s.skills.length>0)if($q.has(i))a(`skills for ${i} are honest-BLOCKED \u2014 opencode has NO SKILL.md filesystem ingestion (no \`skill\` subcommand, no skills dir, no SKILL.md in the opencode package; \`opencode agent\` is a distinct artifact); ${s.skills.length} declared skill(s) NOT installed (operator follow-up).`);else if(i==="gemini"||i==="agy"){let l=Aq(ir(Lq(),`lmctl-skill-${r.alias}-`));for(let d of s.skills){let c=typeof d=="string"&&!cb.test(d)?d:(await lb(d,l,r.alias)).dir;Pq(i,["skills","install",c,"--scope","user","--consent"],o,r.alias)}a(`installed ${s.skills.length} skill(s) via \`${i} skills install --scope user\` (idempotent).`)}else if(db[i]!==void 0){let l=db[i]();for(let d of s.skills)await lb(d,l,r.alias);a(`installed ${s.skills.length} skill(s) \u2192 ${l}/<name>/SKILL.md (idempotent overwrite).`)}else a(`provider ${i} has no verified skills mechanism \u2014 ${s.skills.length} declared skill(s) NOT installed.`)}var xr,cb,Oq,ab,$q,Cq,za,db,mb=E(()=>{"use strict";ct();nb();ut();Ks();xr=class extends Error{alias;constructor(e,r){super(`capability install failed for ${e}: ${r}`),this.alias=e,this.name="CapabilityInstallError"}},cb=/^https?:\/\//i,Oq=8e3,ab=1e6,$q=new Set(["opencode"]),Cq=t=>JSON.stringify(t),za=()=>process.env.HOME??Rq();db={claude:()=>ir(za(),".claude","skills"),qwen:()=>ir(za(),".qwen","skills"),codex:()=>ir(za(),".codex","skills"),copilot:()=>ir(za(),".copilot","skills")}});var Um,fb=E(()=>{"use strict";Um=`---
2794
2794
 
2795
2795
  # Durable memory \u2014 how to use it
2796
2796
 
@@ -2801,22 +2801,22 @@ ON EVERY NEW TASK:
2801
2801
  2. Pull only the chapters relevant to your current task. Don't load everything.
2802
2802
  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.
2803
2803
 
2804
- Don't dump all of durable-memory into your context. The pattern is index-first, chapter-on-demand.`});var _b={};he(_b,{runTeam:()=>qq});import{existsSync as Fq}from"node:fs";import{join as Uq}from"node:path";async function qq(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(Wq),0;try{return await O(e,async s=>{switch(r){case"create":return Hq(n,e,s);case"list":return Xq(n,e,s);case"show":return Jq(n,e,s);case"add-member":return Gq(n,e,s);case"seed":return pb(n,e,s,!1);case"refresh":return pb(n,e,s,!0);case"companion":return Kq(n,e,s);case"list-roots":return Bq(n,e,s);default:return N(e,"usage: lmctl team <create|list|show|add-member|seed|refresh|companion|list-roots>")}})}catch(s){return We(e,s)}}function Bq(t,e,r){let n=te(t,[]);if(n.error!==void 0)return N(e,n.error);if(n.positionals.length>0)return N(e,"usage: team list-roots [--json]");let s=r.listRootTeams().map(i=>({...i,missing_on_disk:!Fq(i.teamfile_path)||void 0}));return G(n,"--json")?le(e,s):e.stdout.write(s.map(i=>`${i.name??"(unnamed)"} ${i.teamfile_path} ${i.last_seeded_at??""}${i.missing_on_disk?" MISSING (file deleted or renamed)":""}`).join(`
2804
+ Don't dump all of durable-memory into your context. The pattern is index-first, chapter-on-demand.`});var _b={};he(_b,{runTeam:()=>Bq});import{existsSync as Uq}from"node:fs";import{join as Wq}from"node:path";async function Bq(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(qq),0;try{return await O(e,async s=>{switch(r){case"create":return Xq(n,e,s);case"list":return Jq(n,e,s);case"show":return Gq(n,e,s);case"add-member":return Vq(n,e,s);case"seed":return pb(n,e,s,!1);case"refresh":return pb(n,e,s,!0);case"companion":return Yq(n,e,s);case"list-roots":return Hq(n,e,s);default:return N(e,"usage: lmctl team <create|list|show|add-member|seed|refresh|companion|list-roots>")}})}catch(s){return We(e,s)}}function Hq(t,e,r){let n=te(t,[]);if(n.error!==void 0)return N(e,n.error);if(n.positionals.length>0)return N(e,"usage: team list-roots [--json]");let s=r.listRootTeams().map(i=>({...i,missing_on_disk:!Uq(i.teamfile_path)||void 0}));return G(n,"--json")?le(e,s):e.stdout.write(s.map(i=>`${i.name??"(unnamed)"} ${i.teamfile_path} ${i.last_seeded_at??""}${i.missing_on_disk?" MISSING (file deleted or renamed)":""}`).join(`
2805
2805
  `)+(s.length>0?`
2806
- `:"")),0}function Hq(t,e,r){let[n]=t;if(n===void 0)return N(e,"usage: team create <name>");let s=r.insertTeam({name:n});return e.stdout.write(`created team ${s.name}
2807
- `),0}function Xq(t,e,r){let n=te(t,[]);if(n.error!==void 0)return N(e,n.error);let s=r.listTeams();return G(n,"--json")?le(e,s):e.stdout.write(`${s.map(i=>`${i.id} ${i.name}`).join(`
2806
+ `:"")),0}function Xq(t,e,r){let[n]=t;if(n===void 0)return N(e,"usage: team create <name>");let s=r.insertTeam({name:n});return e.stdout.write(`created team ${s.name}
2807
+ `),0}function Jq(t,e,r){let n=te(t,[]);if(n.error!==void 0)return N(e,n.error);let s=r.listTeams();return G(n,"--json")?le(e,s):e.stdout.write(`${s.map(i=>`${i.id} ${i.name}`).join(`
2808
2808
  `)}${s.length>0?`
2809
- `:""}`),0}function Jq(t,e,r){let n=te(t,[]);if(n.error!==void 0)return N(e,n.error);let[s]=n.positionals;if(s===void 0)return N(e,"usage: team show <name> [--json]");let i=r.findTeamByName(s);if(i===null)return N(e,`team not found: ${s}`);let o=r.listTeamMembers(i.id);if(G(n,"--json"))le(e,{team:i,members:o});else{e.stdout.write(`team ${i.name}
2809
+ `:""}`),0}function Gq(t,e,r){let n=te(t,[]);if(n.error!==void 0)return N(e,n.error);let[s]=n.positionals;if(s===void 0)return N(e,"usage: team show <name> [--json]");let i=r.findTeamByName(s);if(i===null)return N(e,`team not found: ${s}`);let o=r.listTeamMembers(i.id);if(G(n,"--json"))le(e,{team:i,members:o});else{e.stdout.write(`team ${i.name}
2810
2810
  `);for(let a of o)e.stdout.write(`- ${a.alias} ${Xe(a)} ${a.sessionid??"(unseeded)"}
2811
- `)}return 0}function Gq(t,e,r){let n=te(t,["--alias","--provider","--model","--role","--sessiondir"]);if(n.error!==void 0)return N(e,n.error);let[s]=n.positionals;if(s===void 0)return N(e,"usage: team add-member <team-name> --alias A --provider P [--model M] [--role R] [--sessiondir D]");let i=r.findTeamByName(s);if(i===null)return N(e,`team not found: ${s}`);let o=M(n,"--alias"),a=M(n,"--provider");if(o===void 0||a===void 0)return N(e,"team add-member requires --alias and --provider");let l=r.insertTeamMember({team_id:i.id,alias:o,provider:a,model:M(n,"--model")??null,role:M(n,"--role")??"agent",sessiondir:M(n,"--sessiondir")??Uq(ai(),"sessions",i.name,o)});return G(n,"--json")?le(e,l):e.stdout.write(`added member ${l.alias} to ${i.name}
2812
- `),0}async function pb(t,e,r,n){let s=te(t,["--alias"]);if(s.error!==void 0)return N(e,s.error);let[i]=s.positionals;if(i===void 0)return N(e,n?"usage: team refresh <team-name> --alias A":"usage: team seed <team-name> [--alias A]");let o=r.findTeamByName(i);if(o===null)return N(e,`team not found: ${i}`);let a=M(s,"--alias");if(n&&a===void 0)return N(e,"team refresh requires --alias");if(n&&a!==void 0&&a.trim().toLowerCase()==="lead")return N(e,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let l=Vq(r.listTeamMembers(o.id),a,n);if(a!==void 0&&l.length===0)return N(e,`member not found or already seeded: ${a}`);if(n&&l.some(f=>f.alias.toLowerCase()==="lead"||f.role==="lead"))return N(e,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let d=r.listProjects().filter(f=>f.team_id===o.id),c=new Set;for(let f of d){if(c.has(f.workflow_name))continue;c.add(f.workflow_name);let p=r.getWorkflowByName(f.workflow_name);if(p===null)continue;let h=fE(f.workflow_name,p.definition);if(h.status==="FAIL")return N(e,`cannot seed team \`${o.name}\`: workflow \`${f.workflow_name}\` failed verify-at-seed \u2014 ${h.note}. Fix the workflow and retry; NO members were seeded (no side-effects).`)}for(let f of d)ZS(f,r);let u=[],m=!1;for(let f of l){let p=await zi({member:f,dal:r}),h=r.updateTeamMemberSession(f.id,p.sessionid);if(h!==null){let g=h.role_prompt??"",_=g.length>0?`${g}
2811
+ `)}return 0}function Vq(t,e,r){let n=te(t,["--alias","--provider","--model","--role","--sessiondir"]);if(n.error!==void 0)return N(e,n.error);let[s]=n.positionals;if(s===void 0)return N(e,"usage: team add-member <team-name> --alias A --provider P [--model M] [--role R] [--sessiondir D]");let i=r.findTeamByName(s);if(i===null)return N(e,`team not found: ${s}`);let o=M(n,"--alias"),a=M(n,"--provider");if(o===void 0||a===void 0)return N(e,"team add-member requires --alias and --provider");let l=r.insertTeamMember({team_id:i.id,alias:o,provider:a,model:M(n,"--model")??null,role:M(n,"--role")??"agent",sessiondir:M(n,"--sessiondir")??Wq(ai(),"sessions",i.name,o)});return G(n,"--json")?le(e,l):e.stdout.write(`added member ${l.alias} to ${i.name}
2812
+ `),0}async function pb(t,e,r,n){let s=te(t,["--alias"]);if(s.error!==void 0)return N(e,s.error);let[i]=s.positionals;if(i===void 0)return N(e,n?"usage: team refresh <team-name> --alias A":"usage: team seed <team-name> [--alias A]");let o=r.findTeamByName(i);if(o===null)return N(e,`team not found: ${i}`);let a=M(s,"--alias");if(n&&a===void 0)return N(e,"team refresh requires --alias");if(n&&a!==void 0&&a.trim().toLowerCase()==="lead")return N(e,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let l=Kq(r.listTeamMembers(o.id),a,n);if(a!==void 0&&l.length===0)return N(e,`member not found or already seeded: ${a}`);if(n&&l.some(f=>f.alias.toLowerCase()==="lead"||f.role==="lead"))return N(e,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let d=r.listProjects().filter(f=>f.team_id===o.id),c=new Set;for(let f of d){if(c.has(f.workflow_name))continue;c.add(f.workflow_name);let p=r.getWorkflowByName(f.workflow_name);if(p===null)continue;let h=fE(f.workflow_name,p.definition);if(h.status==="FAIL")return N(e,`cannot seed team \`${o.name}\`: workflow \`${f.workflow_name}\` failed verify-at-seed \u2014 ${h.note}. Fix the workflow and retry; NO members were seeded (no side-effects).`)}for(let f of d)ZS(f,r);let u=[],m=!1;for(let f of l){let p=await zi({member:f,dal:r}),h=r.updateTeamMemberSession(f.id,p.sessionid);if(h!==null){let g=h.role_prompt??"",_=g.length>0?`${g}
2813
2813
 
2814
- ${Um}`:Um;r.setMemberPromptSnapshot(f.id,_),u.push(h);let y=Aa(Xe(h),p.sessionid);y!==null&&e.stderr.write(`[seeded ${h.alias}] customize/compact in its native TUI:
2814
+ ${Um}`:Um;r.setMemberPromptSnapshot(f.id,_),u.push(h);let y=Na(Xe(h),p.sessionid);y!==null&&e.stderr.write(`[seeded ${h.alias}] customize/compact in its native TUI:
2815
2815
  ${y}
2816
2816
  `);try{await ub({dal:r,member:h,stderr:e.stderr})}catch(T){m=!0,e.stderr.write(`error: ${T instanceof Error?T.message:String(T)}
2817
2817
  `)}}}return G(s,"--json")?le(e,u):e.stdout.write(`seeded ${u.length} member(s)
2818
- `),m?1:0}function Vq(t,e,r){return t.filter(n=>e!==void 0&&n.alias!==e?!1:r||n.sessionid===null)}function Kq(t,e,r){let n=te(t,["--interpreter","--of"]);if(n.error!==void 0)return N(e,n.error);let[s]=n.positionals;if(s===void 0)return N(e,"usage: team companion <team-name> --interpreter A --of B[,C]");let i=r.findTeamByName(s);if(i===null)return N(e,`team not found: ${s}`);let o=M(n,"--interpreter"),a=M(n,"--of")?.split(",").map(d=>d.trim()).filter(Boolean);if(o===void 0||a===void 0||a.length===0)return N(e,"team companion requires --interpreter and --of");let l=r.findTeamMemberByAlias(i.id,o);if(l===null)return N(e,`member not found: ${o}`);for(let d of a){let c=r.findTeamMemberByAlias(i.id,d);if(c===null)return N(e,`member not found: ${d}`);r.insertTeamMemberCompanion({interpreter_id:l.id,companion_id:c.id})}return e.stdout.write(`recorded ${a.length} companion link(s)
2819
- `),0}var Wq,hb=E(()=>{"use strict";Ye();zd();eb();ct();nr();mb();Jo();Ce();fb();Wq=`usage: lmctl team create <name>
2818
+ `),m?1:0}function Kq(t,e,r){return t.filter(n=>e!==void 0&&n.alias!==e?!1:r||n.sessionid===null)}function Yq(t,e,r){let n=te(t,["--interpreter","--of"]);if(n.error!==void 0)return N(e,n.error);let[s]=n.positionals;if(s===void 0)return N(e,"usage: team companion <team-name> --interpreter A --of B[,C]");let i=r.findTeamByName(s);if(i===null)return N(e,`team not found: ${s}`);let o=M(n,"--interpreter"),a=M(n,"--of")?.split(",").map(d=>d.trim()).filter(Boolean);if(o===void 0||a===void 0||a.length===0)return N(e,"team companion requires --interpreter and --of");let l=r.findTeamMemberByAlias(i.id,o);if(l===null)return N(e,`member not found: ${o}`);for(let d of a){let c=r.findTeamMemberByAlias(i.id,d);if(c===null)return N(e,`member not found: ${d}`);r.insertTeamMemberCompanion({interpreter_id:l.id,companion_id:c.id})}return e.stdout.write(`recorded ${a.length} companion link(s)
2819
+ `),0}var qq,hb=E(()=>{"use strict";Ye();Yd();eb();ct();nr();mb();Jo();Ce();fb();qq=`usage: lmctl team create <name>
2820
2820
  lmctl team list [--json]
2821
2821
  lmctl team show <name> [--json]
2822
2822
  lmctl team add-member <team-name> --alias A --provider P [--model M] [--role R] [--sessiondir D] [--json]
@@ -2828,20 +2828,20 @@ ${Um}`:Um;r.setMemberPromptSnapshot(f.id,_),u.push(h);let y=Aa(Xe(h),p.sessionid
2828
2828
  Manage DB-backed teams, members, and provider session lifecycle. Use seed or
2829
2829
  refresh to create/update native provider sessions for team members.
2830
2830
  team refresh rejects Lead members (alias matching is case-insensitive).
2831
- `});var Sb={};he(Sb,{applyMaxBytes:()=>Qa,renderMessage:()=>Tb,runTail:()=>eB});async function eB(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${Qq}
2832
- `),0;let r=te(t,["--lines","--max-bytes","--watch-interval","--provider","--session","--run"],["--watch","--help"]);if(r.error!==void 0)return N(e,r.error);let n=M(r,"--lines"),s=M(r,"--max-bytes");if(n!==void 0&&s!==void 0)return N(e,"--lines and --max-bytes are mutually exclusive (choose one)");let i;if(n!==void 0){let f=Number.parseInt(n,10);if(!Number.isFinite(f)||f<1||String(f)!==n)return N(e,`invalid --lines "${n}" (expected a positive integer)`);i={kind:"lines",lines:f}}else{let f=s===void 0?zq:Number.parseInt(s,10);if(!Number.isFinite(f)||f<0||s!==void 0&&String(f)!==s)return N(e,`invalid --max-bytes "${s}" (expected a non-negative integer)`);i={kind:"bytes",maxBytes:f}}let o=G(r,"--watch"),a=M(r,"--watch-interval"),l=a===void 0?Zq:Number.parseInt(a.replace(/s$/,""),10);if(!Number.isFinite(l)||l<1)return N(e,`invalid --watch-interval "${a}" (expected <N>s, N\u22651)`);if(r.positionals.length>2)return N(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let d=M(r,"--run");if(d!==void 0){if(r.positionals.length>0)return N(e,"--run is mutually exclusive with positional [target] [alias]");if(M(r,"--session")!==void 0)return N(e,"--run is mutually exclusive with --session");if(M(r,"--provider")!==void 0)return N(e,"--run is mutually exclusive with --provider");let f=Number.parseInt(d,10);if(!Number.isFinite(f)||f<=0||String(f)!==d)return N(e,`invalid --run "${d}" (expected a positive integer run id)`);try{return await O(e,async p=>tB(e,p,f,i,o,l))}catch(p){return We(e,p)}}let c=kr(Yq,{target:r.positionals[0],alias:r.positionals[1],flags:{session:M(r,"--session"),provider:M(r,"--provider")}});if(c.mode==="error")return N(e,c.message);if(c.mode==="managed")return N(e,"tail managed mode requires --run <id>");let u;if(c.mode==="ai-team")if(c.alias===void 0){let f;try{f=await O(e,g=>Te(c.teamfile,g))}catch(g){return N(e,`tail: ${g instanceof Error?g.message:String(g)}`)}let p;try{p=rt(f)}catch(g){return N(e,`tail: ${g instanceof Error?g.message:String(g)}`)}let h=Dt(p);if(h===void 0)return N(e,`tail: ${c.teamfile} has no Lead member; pass <tf>:<alias>`);try{let g=await O(e,_=>Me(c.teamfile,h.alias,_));u={provider:g.provider,sessionId:g.sessionid,cwd:g.sessiondir}}catch(g){return g instanceof ve?N(e,g.message):We(e,g)}}else try{let f=await O(e,p=>Me(c.teamfile,c.alias,p));u={provider:f.provider,sessionId:f.sessionid,cwd:f.sessiondir}}catch(f){return f instanceof ve?N(e,f.message):We(e,f)}else{let f=c.sessionid,p=c.provider;if(p===void 0){let h=await jn(f);if(h.length===0)return N(e,`tail: session "${f}" not found in any provider store`);if(h.length>1)return N(e,`tail: session "${f}" matches multiple providers (${h.join(", ")}); pass --provider`);p=h[0]}u={provider:p,sessionId:f}}let m=await gb(e,u.provider,u.sessionId,i,-1);return m<0?1:o?await new Promise(f=>{let p=async()=>{try{let _=await gb(e,u.provider,u.sessionId,i,m);_>=0&&(m=_)}catch(_){e.stderr.write(`tail: ${_ instanceof Error?_.message:String(_)}
2831
+ `});var Sb={};he(Sb,{applyMaxBytes:()=>Za,renderMessage:()=>Tb,runTail:()=>tB});async function tB(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${eB}
2832
+ `),0;let r=te(t,["--lines","--max-bytes","--watch-interval","--provider","--session","--run"],["--watch","--help"]);if(r.error!==void 0)return N(e,r.error);let n=M(r,"--lines"),s=M(r,"--max-bytes");if(n!==void 0&&s!==void 0)return N(e,"--lines and --max-bytes are mutually exclusive (choose one)");let i;if(n!==void 0){let f=Number.parseInt(n,10);if(!Number.isFinite(f)||f<1||String(f)!==n)return N(e,`invalid --lines "${n}" (expected a positive integer)`);i={kind:"lines",lines:f}}else{let f=s===void 0?Zq:Number.parseInt(s,10);if(!Number.isFinite(f)||f<0||s!==void 0&&String(f)!==s)return N(e,`invalid --max-bytes "${s}" (expected a non-negative integer)`);i={kind:"bytes",maxBytes:f}}let o=G(r,"--watch"),a=M(r,"--watch-interval"),l=a===void 0?Qq:Number.parseInt(a.replace(/s$/,""),10);if(!Number.isFinite(l)||l<1)return N(e,`invalid --watch-interval "${a}" (expected <N>s, N\u22651)`);if(r.positionals.length>2)return N(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let d=M(r,"--run");if(d!==void 0){if(r.positionals.length>0)return N(e,"--run is mutually exclusive with positional [target] [alias]");if(M(r,"--session")!==void 0)return N(e,"--run is mutually exclusive with --session");if(M(r,"--provider")!==void 0)return N(e,"--run is mutually exclusive with --provider");let f=Number.parseInt(d,10);if(!Number.isFinite(f)||f<=0||String(f)!==d)return N(e,`invalid --run "${d}" (expected a positive integer run id)`);try{return await O(e,async p=>rB(e,p,f,i,o,l))}catch(p){return We(e,p)}}let c=kr(zq,{target:r.positionals[0],alias:r.positionals[1],flags:{session:M(r,"--session"),provider:M(r,"--provider")}});if(c.mode==="error")return N(e,c.message);if(c.mode==="managed")return N(e,"tail managed mode requires --run <id>");let u;if(c.mode==="ai-team")if(c.alias===void 0){let f;try{f=await O(e,g=>Te(c.teamfile,g))}catch(g){return N(e,`tail: ${g instanceof Error?g.message:String(g)}`)}let p;try{p=rt(f)}catch(g){return N(e,`tail: ${g instanceof Error?g.message:String(g)}`)}let h=Dt(p);if(h===void 0)return N(e,`tail: ${c.teamfile} has no Lead member; pass <tf>:<alias>`);try{let g=await O(e,_=>Me(c.teamfile,h.alias,_));u={provider:g.provider,sessionId:g.sessionid,cwd:g.sessiondir}}catch(g){return g instanceof ve?N(e,g.message):We(e,g)}}else try{let f=await O(e,p=>Me(c.teamfile,c.alias,p));u={provider:f.provider,sessionId:f.sessionid,cwd:f.sessiondir}}catch(f){return f instanceof ve?N(e,f.message):We(e,f)}else{let f=c.sessionid,p=c.provider;if(p===void 0){let h=await jn(f);if(h.length===0)return N(e,`tail: session "${f}" not found in any provider store`);if(h.length>1)return N(e,`tail: session "${f}" matches multiple providers (${h.join(", ")}); pass --provider`);p=h[0]}u={provider:p,sessionId:f}}let m=await gb(e,u.provider,u.sessionId,i,-1);return m<0?1:o?await new Promise(f=>{let p=async()=>{try{let _=await gb(e,u.provider,u.sessionId,i,m);_>=0&&(m=_)}catch(_){e.stderr.write(`tail: ${_ instanceof Error?_.message:String(_)}
2833
2833
  `)}},h=setInterval(()=>{p()},l*1e3),g=()=>{clearInterval(h),f(0)};process.once("SIGINT",g),process.once("SIGTERM",g)}):0}async function gb(t,e,r,n,s){let i;try{i=await Be(r,e)}catch(d){return t.stderr.write(`tail: failed to load session: ${d instanceof Error?d.message:String(d)}
2834
2834
  `),-1}if(i===null)return t.stderr.write(`tail: session not found: ${r} (provider=${e})
2835
2835
  `),-1;let o=i.messages??[],a=s<0&&n.kind==="lines"?Math.max(0,o.length-n.lines):s+1;if(a>=o.length)return o.length-1;let l="";for(let d=a;d<o.length;d+=1)l+=`${Tb(o[d])}
2836
- `;return t.stdout.write(n.kind==="bytes"?Qa(l,n.maxBytes):l),o.length-1}function Tb(t){let e=vb(t.timestamp),r=e?`${e} ${t.role}`:t.role,s=(t.content??"").replace(/\r\n/g,`
2836
+ `;return t.stdout.write(n.kind==="bytes"?Za(l,n.maxBytes):l),o.length-1}function Tb(t){let e=vb(t.timestamp),r=e?`${e} ${t.role}`:t.role,s=(t.content??"").replace(/\r\n/g,`
2837
2837
  `).replace(/\r/g,`
2838
2838
  `).split(`
2839
2839
  `),i=s[0]??"",o=s.slice(1);return o.length===0?`${r}: ${i}`:`${r}: ${i}
2840
2840
  ${o.map(a=>` ${a}`).join(`
2841
- `)}`}async function tB(t,e,r,n,s,i){if(e.getRun(r)===null)return N(t,`tail: run ${r}: not found`);let a=e.listSessionEvents(r),d=(n.kind==="lines"?a.slice(Math.max(0,a.length-n.lines)):a).map(u=>`${wb(u)}
2842
- `).join("");t.stdout.write(n.kind==="bytes"?Qa(d,n.maxBytes):d);let c=a.length>0?a[a.length-1].id:0;return s?await new Promise(u=>{let f=setInterval(()=>{try{let h=e.listSessionEvents(r,c),g="";for(let _ of h)g+=`${wb(_)}
2843
- `,c=_.id;g.length>0&&t.stdout.write(n.kind==="bytes"?Qa(g,n.maxBytes):g)}catch(h){t.stderr.write(`tail: ${h instanceof Error?h.message:String(h)}
2844
- `)}},i*1e3),p=()=>{clearInterval(f),u(0)};process.once("SIGINT",p),process.once("SIGTERM",p)}):0}function Qa(t,e){if(e===0||Buffer.byteLength(t,"utf8")<=e)return t;let n=Buffer.byteLength(yb,"utf8");if(n>=e)return Eb(t,e);let s=e-n,i=Eb(t,s);return`${yb}${i}`}function Eb(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 wb(t){let e=vb(new Date(t.timestamp_ms))??"",r="";try{let i=JSON.parse(t.payload);typeof i.alias=="string"&&(r=`alias=${i.alias}`),typeof i.provider=="string"&&(r+=`${r?" ":""}provider=${i.provider}`),typeof i.tool=="string"&&(r+=`${r?" ":""}tool=${i.tool}`),typeof i.status=="string"&&(r+=`${r?" ":""}status=${i.status}`),(typeof i.tokens_in=="number"||typeof i.tokens_out=="number")&&(r+=`${r?" ":""}tokens=${i.tokens_in??0}/${i.tokens_out??0}`)}catch{}let n=r!==""?r:t.payload.slice(0,200),s=t.step_id===null?"":` step=${t.step_id}`;return`${e} ${t.kind}${s}: ${n}`}function vb(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 Yq,zq,Zq,Qq,yb,bb=E(()=>{"use strict";nr();Ce();wt();tr();rr();Yq={name:"tail",allowsBareTeamfile:!0,supportsRaw:!0},zq=4096,Zq=2,Qq=`usage: lmctl tail [target] [alias]
2841
+ `)}`}async function rB(t,e,r,n,s,i){if(e.getRun(r)===null)return N(t,`tail: run ${r}: not found`);let a=e.listSessionEvents(r),d=(n.kind==="lines"?a.slice(Math.max(0,a.length-n.lines)):a).map(u=>`${wb(u)}
2842
+ `).join("");t.stdout.write(n.kind==="bytes"?Za(d,n.maxBytes):d);let c=a.length>0?a[a.length-1].id:0;return s?await new Promise(u=>{let f=setInterval(()=>{try{let h=e.listSessionEvents(r,c),g="";for(let _ of h)g+=`${wb(_)}
2843
+ `,c=_.id;g.length>0&&t.stdout.write(n.kind==="bytes"?Za(g,n.maxBytes):g)}catch(h){t.stderr.write(`tail: ${h instanceof Error?h.message:String(h)}
2844
+ `)}},i*1e3),p=()=>{clearInterval(f),u(0)};process.once("SIGINT",p),process.once("SIGTERM",p)}):0}function Za(t,e){if(e===0||Buffer.byteLength(t,"utf8")<=e)return t;let n=Buffer.byteLength(yb,"utf8");if(n>=e)return Eb(t,e);let s=e-n,i=Eb(t,s);return`${yb}${i}`}function Eb(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 wb(t){let e=vb(new Date(t.timestamp_ms))??"",r="";try{let i=JSON.parse(t.payload);typeof i.alias=="string"&&(r=`alias=${i.alias}`),typeof i.provider=="string"&&(r+=`${r?" ":""}provider=${i.provider}`),typeof i.tool=="string"&&(r+=`${r?" ":""}tool=${i.tool}`),typeof i.status=="string"&&(r+=`${r?" ":""}status=${i.status}`),(typeof i.tokens_in=="number"||typeof i.tokens_out=="number")&&(r+=`${r?" ":""}tokens=${i.tokens_in??0}/${i.tokens_out??0}`)}catch{}let n=r!==""?r:t.payload.slice(0,200),s=t.step_id===null?"":` step=${t.step_id}`;return`${e} ${t.kind}${s}: ${n}`}function vb(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 zq,Zq,Qq,eB,yb,bb=E(()=>{"use strict";nr();Ce();wt();tr();rr();zq={name:"tail",allowsBareTeamfile:!0,supportsRaw:!0},Zq=4096,Qq=2,eB=`usage: lmctl tail [target] [alias]
2845
2845
  lmctl tail --session <id> [--provider <name>]
2846
2846
  lmctl tail --run <id>
2847
2847
  [--lines N | --max-bytes N] [--watch] [--watch-interval Ns] [--provider <name>]
@@ -2849,8 +2849,8 @@ ${o.map(a=>` ${a}`).join(`
2849
2849
  Print or watch provider session messages, or follow a managed run timeline.
2850
2850
  A bare <teamfile> with no alias tails that team's Lead member.
2851
2851
  --lines and --max-bytes are mutually exclusive. Default: --max-bytes 4096.`;yb=`\u2026 [truncated older output \u2014 raise with --max-bytes]
2852
- `});var Ob={};he(Ob,{runInfo:()=>oB});import{execFileSync as Wm}from"node:child_process";import{dirname as kb,resolve as rB}from"node:path";function iB(t){return t>=1e6?`${(t/1e6).toFixed(1)}M`:t>=1e3?`${Math.round(t/1e3)}K`:String(t)}async function oB(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${sB}
2853
- `),0;let r=te(t,["--provider","--run"],["--json","--help"]);if(r.error!==void 0)return N(e,r.error);if(r.positionals.length>2)return N(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let n=G(r,"--json"),s=M(r,"--run");if(s!==void 0){if(r.positionals.length>0)return N(e,"--run is mutually exclusive with positional [target] [alias]");if(M(r,"--provider")!==void 0)return N(e,"--run is mutually exclusive with --provider");let c=Number.parseInt(s,10);if(!Number.isFinite(c)||c<=0||String(c)!==s)return N(e,`invalid --run "${s}" (expected a positive integer run id)`);try{return await O(e,async u=>lB(e,u,c,n))}catch(u){return We(e,u)}}let i=kr(nB,{target:r.positionals[0],alias:r.positionals[1],flags:{provider:M(r,"--provider")}});if(i.mode==="error")return N(e,i.message);if(i.mode==="managed")return N(e,"health managed mode requires --run <id>");if(i.mode==="ai-team"&&i.alias===void 0){let c;try{c=await O(e,u=>Te(i.teamfile,u))}catch(u){return N(e,`health: ${u instanceof Error?u.message:String(u)}`)}return dB(e,c,n)}let o,a,l,d;if(i.mode==="ai-team")try{let c=await O(e,u=>Me(i.teamfile,i.alias,u));o=c.provider,a=c.sessionid,l=c.alias,d={teamfile:c.teamfile,alias:c.alias}}catch(c){return c instanceof ve?N(e,c.message):We(e,c)}else if(a=i.sessionid,i.provider!==void 0)o=i.provider;else{let c=await jn(a);if(c.length===0)return N(e,`health: session "${a}" not found in any provider store`);if(c.length>1)return N(e,`health: session "${a}" matches multiple providers (${c.join(", ")}); pass --provider`);o=c[0]}return aB(e,o,a,l,n,d)}async function aB(t,e,r,n,s,i){let o;try{o=await Be(r,e)}catch(c){return N(t,`health: failed to load session: ${c instanceof Error?c.message:String(c)}`)}if(o===null)return N(t,`health: session not found: ${r} (provider=${e})`);let a=Zs(o.messages),l=i===void 0?null:await cB(t,i,o),d={provider:o.provider,sessionId:o.sessionId,sessionid:o.sessionId,cwd:o.cwd,messageCount:o.messageCount??null,...o.model!==void 0?{model:o.model}:{},...n!==void 0?{alias:n}:{},...l??{},totalInputTokens:o.totalInputTokens??null,totalOutputTokens:o.totalOutputTokens??null,...o.totalCachedInputTokens!==void 0?{totalCachedInputTokens:o.totalCachedInputTokens}:{},sessionLimit:a,createdAt:o.createdAt.toISOString(),modifiedAt:o.modifiedAt.toISOString()};return s?(le(t,d),0):(t.stdout.write(`Session: ${o.sessionId}
2852
+ `});var Ob={};he(Ob,{runInfo:()=>aB});import{execFileSync as Wm}from"node:child_process";import{dirname as kb,resolve as nB}from"node:path";function oB(t){return t>=1e6?`${(t/1e6).toFixed(1)}M`:t>=1e3?`${Math.round(t/1e3)}K`:String(t)}async function aB(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${iB}
2853
+ `),0;let r=te(t,["--provider","--run"],["--json","--help"]);if(r.error!==void 0)return N(e,r.error);if(r.positionals.length>2)return N(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let n=G(r,"--json"),s=M(r,"--run");if(s!==void 0){if(r.positionals.length>0)return N(e,"--run is mutually exclusive with positional [target] [alias]");if(M(r,"--provider")!==void 0)return N(e,"--run is mutually exclusive with --provider");let c=Number.parseInt(s,10);if(!Number.isFinite(c)||c<=0||String(c)!==s)return N(e,`invalid --run "${s}" (expected a positive integer run id)`);try{return await O(e,async u=>dB(e,u,c,n))}catch(u){return We(e,u)}}let i=kr(sB,{target:r.positionals[0],alias:r.positionals[1],flags:{provider:M(r,"--provider")}});if(i.mode==="error")return N(e,i.message);if(i.mode==="managed")return N(e,"health managed mode requires --run <id>");if(i.mode==="ai-team"&&i.alias===void 0){let c;try{c=await O(e,u=>Te(i.teamfile,u))}catch(u){return N(e,`health: ${u instanceof Error?u.message:String(u)}`)}return cB(e,c,n)}let o,a,l,d;if(i.mode==="ai-team")try{let c=await O(e,u=>Me(i.teamfile,i.alias,u));o=c.provider,a=c.sessionid,l=c.alias,d={teamfile:c.teamfile,alias:c.alias}}catch(c){return c instanceof ve?N(e,c.message):We(e,c)}else if(a=i.sessionid,i.provider!==void 0)o=i.provider;else{let c=await jn(a);if(c.length===0)return N(e,`health: session "${a}" not found in any provider store`);if(c.length>1)return N(e,`health: session "${a}" matches multiple providers (${c.join(", ")}); pass --provider`);o=c[0]}return lB(e,o,a,l,n,d)}async function lB(t,e,r,n,s,i){let o;try{o=await Be(r,e)}catch(c){return N(t,`health: failed to load session: ${c instanceof Error?c.message:String(c)}`)}if(o===null)return N(t,`health: session not found: ${r} (provider=${e})`);let a=Zs(o.messages),l=i===void 0?null:await uB(t,i,o),d={provider:o.provider,sessionId:o.sessionId,sessionid:o.sessionId,cwd:o.cwd,messageCount:o.messageCount??null,...o.model!==void 0?{model:o.model}:{},...n!==void 0?{alias:n}:{},...l??{},totalInputTokens:o.totalInputTokens??null,totalOutputTokens:o.totalOutputTokens??null,...o.totalCachedInputTokens!==void 0?{totalCachedInputTokens:o.totalCachedInputTokens}:{},sessionLimit:a,createdAt:o.createdAt.toISOString(),modifiedAt:o.modifiedAt.toISOString()};return s?(le(t,d),0):(t.stdout.write(`Session: ${o.sessionId}
2854
2854
  `),t.stdout.write(` Provider: ${o.provider}
2855
2855
  `),n!==void 0&&t.stdout.write(` Alias: ${n}
2856
2856
  `),l!==null&&t.stdout.write(` Liveness: ${qm(l.liveness)}
@@ -2864,7 +2864,7 @@ A bare <teamfile> with no alias tails that team's Lead member.
2864
2864
  `),a!==null&&t.stdout.write(` SessionLimit: LIMITED resets_at=${Ab(a)}
2865
2865
  `),t.stdout.write(` Created: ${d.createdAt}
2866
2866
  `),t.stdout.write(` Modified: ${d.modifiedAt}
2867
- `),0)}async function lB(t,e,r,n){let s=jr(e,r);if(s===null)return N(t,`health: run ${r}: not found`);let i=wn(e,r),o=e.agentCallTokenTotals(r),a=new Map;for(let l of s.steps){let d=l.outcome===null?`${l.state_name}:pending`:`${l.state_name}:${l.outcome}`;a.set(d,(a.get(d)??0)+1)}return n?(le(t,{run_id:s.id,workflow:s.workflow?.name??null,team:s.team?.name??null,current_state:s.current_state,terminal_state:s.terminal_state,paused:i?.paused??!1,started_at:s.started_at,ended_at:s.ended_at,step_count:s.steps.length,totalInputTokens:o.totalInputTokens,totalOutputTokens:o.totalOutputTokens,agent_call_count:o.agentCallCount}),0):(t.stdout.write(`RUN: ${s.id}
2867
+ `),0)}async function dB(t,e,r,n){let s=jr(e,r);if(s===null)return N(t,`health: run ${r}: not found`);let i=wn(e,r),o=e.agentCallTokenTotals(r),a=new Map;for(let l of s.steps){let d=l.outcome===null?`${l.state_name}:pending`:`${l.state_name}:${l.outcome}`;a.set(d,(a.get(d)??0)+1)}return n?(le(t,{run_id:s.id,workflow:s.workflow?.name??null,team:s.team?.name??null,current_state:s.current_state,terminal_state:s.terminal_state,paused:i?.paused??!1,started_at:s.started_at,ended_at:s.ended_at,step_count:s.steps.length,totalInputTokens:o.totalInputTokens,totalOutputTokens:o.totalOutputTokens,agent_call_count:o.agentCallCount}),0):(t.stdout.write(`RUN: ${s.id}
2868
2868
  `),t.stdout.write(` Workflow: ${s.workflow?.name??"(unknown)"}
2869
2869
  `),t.stdout.write(` Team: ${s.team?.name??"(unknown)"}
2870
2870
  `),t.stdout.write(` State: ${s.current_state??"(none)"}${s.terminal_state!==null?` (terminal: ${s.terminal_state})`:""}
@@ -2874,7 +2874,7 @@ A bare <teamfile> with no alias tails that team's Lead member.
2874
2874
  `),t.stdout.write(` Steps: ${s.steps.length}
2875
2875
  `),t.stdout.write(` AgentCalls: ${o.agentCallCount}
2876
2876
  `),t.stdout.write(` Tokens: ${o.totalInputTokens} in / ${o.totalOutputTokens} out
2877
- `),0)}async function dB(t,e,r){let n,s;try{let T=await O(t,v=>{let k=qe(e,v);if(k.parseErrors.length>0)throw new Error(k.parseErrors.join("; "));return{teamName:k.name,targets:Ib(e,v,new Set,[])}});s=T.teamName,n=T.targets}catch(T){return N(t,`health: ${T instanceof Error?T.message:String(T)}`)}let i=xb(e),o=i.kind==="repo"?i:null,a=await Nb(t,n),l=[],d=0,c=o===null?void 0:0,u=o===null?void 0:0;for(let T of n){let v=null;try{v=await Be(T.sessionid,T.provider)}catch(W){t.stderr.write(`warning: failed to load session "${T.sessionid}" for ${T.reportPath} (${T.provider}): ${W instanceof Error?W.message:String(W)}
2877
+ `),0)}async function cB(t,e,r){let n,s;try{let T=await O(t,v=>{let k=qe(e,v);if(k.parseErrors.length>0)throw new Error(k.parseErrors.join("; "));return{teamName:k.name,targets:Ib(e,v,new Set,[])}});s=T.teamName,n=T.targets}catch(T){return N(t,`health: ${T instanceof Error?T.message:String(T)}`)}let i=xb(e),o=i.kind==="repo"?i:null,a=await Nb(t,n),l=[],d=0,c=o===null?void 0:0,u=o===null?void 0:0;for(let T of n){let v=null;try{v=await Be(T.sessionid,T.provider)}catch(W){t.stderr.write(`warning: failed to load session "${T.sessionid}" for ${T.reportPath} (${T.provider}): ${W instanceof Error?W.message:String(W)}
2878
2878
  `)}let k=v?.messageCount,A=o===null?void 0:v===null?null:Rb(v,o.since),z=o===null?void 0:v===null?null:Lb(v)??"n/a",Se=o===null?void 0:{messageCount:A??null,tokens:null};l.push({alias:T.alias,reportPath:T.reportPath,teamfile:T.teamfile,provider:T.provider,sessionid:T.sessionid,messageCount:k??null,model:v?.model??"(unknown)",lastContext:v?.lastInputTokens,detailLoaded:v!==null,liveness:a.get(Bm(T.teamfile,T.alias))??Hm(),sessionLimit:v===null?null:Zs(v.messages),...o!==null?{activitySinceLastCommit:Se,cumulativeTokens:z}:{}}),k===void 0?d=void 0:d!==void 0&&(d+=k),o!==null&&(A==null?c=void 0:c!==void 0&&(c+=A),z==null||z==="n/a"?u=void 0:u!==void 0&&(u+=z))}if(r)return le(t,{team:s,git:o===null?null:{teamDir:o.teamDir,commits:o.commits.map(T=>({ref:T.ref,timestamp:T.timestamp.toISOString()})),since:o.since.toISOString(),working:o.working},members:l.map(({detailLoaded:T,cumulativeTokens:v,...k})=>({...k,lastContext:k.lastContext??null,...v!==void 0?{cumulativeTokens:v==="n/a"?null:v}:{}})),total:{messageCount:d??null}}),0;let m=Math.max(7,...l.map(T=>T.sessionid.length)),f=Math.max(5,...l.map(T=>T.reportPath.length))+1,p=Math.max(8,...l.map(T=>T.provider.length))+1,h=Math.max(5,...l.map(T=>T.model.length))+1,g=Math.max(4,...l.map(T=>qm(T.liveness).length))+1;if(t.stdout.write(`TEAM: ${s}
2879
2879
  `),i.kind==="repo"){t.stdout.write(`Git progress:
2880
2880
  `);for(let T of i.commits)t.stdout.write(` ${T.ref}: ${T.timestamp.toISOString()}
@@ -2882,7 +2882,7 @@ A bare <teamfile> with no alias tails that team's Lead member.
2882
2882
  `)}else i.reason==="no-commits"?t.stdout.write(`Git progress: git repository in ${i.teamDir} has no commits (no commit-based progress to report)
2883
2883
  `):t.stdout.write(`Git progress: no git repository in ${i.teamDir} (no commit-based progress to report)
2884
2884
  `);t.stdout.write(` ${"SESSION".padEnd(m)} ${"ALIAS".padEnd(f)}${"PROVIDER".padEnd(p)}${"MODEL".padEnd(h)}${"LIVE".padEnd(g)}${"MSGS".padStart(6)} ${"LAST CONTEXT".padStart(12)}`+(o!==null?` ${"MSGS SINCE COMMIT".padStart(17)} ${"TOKENS SINCE COMMIT".padStart(19)} ${"TOKENS (cumulative)".padStart(19)}`:"")+`
2885
- `);let _=!1,y=l.filter(T=>T.sessionLimit!==null);for(let T of l){let v=fB(T.lastContext,T.detailLoaded,iB);(v==="n/a"||T.cumulativeTokens==="n/a")&&(_=!0),t.stdout.write(` ${T.sessionid.padEnd(m)} ${T.reportPath.padEnd(f)}${T.provider.padEnd(p)}${T.model.padEnd(h)}${qm(T.liveness).padEnd(g)}${St(T.messageCount).padStart(6)} ${v.padStart(12)}`+(o!==null?` ${St(T.activitySinceLastCommit?.messageCount).padStart(17)} ${St(T.activitySinceLastCommit?.tokens).padStart(19)} ${mB(T.cumulativeTokens).padStart(19)}`:"")+`
2885
+ `);let _=!1,y=l.filter(T=>T.sessionLimit!==null);for(let T of l){let v=pB(T.lastContext,T.detailLoaded,oB);(v==="n/a"||T.cumulativeTokens==="n/a")&&(_=!0),t.stdout.write(` ${T.sessionid.padEnd(m)} ${T.reportPath.padEnd(f)}${T.provider.padEnd(p)}${T.model.padEnd(h)}${qm(T.liveness).padEnd(g)}${St(T.messageCount).padStart(6)} ${v.padStart(12)}`+(o!==null?` ${St(T.activitySinceLastCommit?.messageCount).padStart(17)} ${St(T.activitySinceLastCommit?.tokens).padStart(19)} ${fB(T.cumulativeTokens).padStart(19)}`:"")+`
2886
2886
  `)}if(t.stdout.write(` ${"TOTAL".padEnd(m)} ${"".padEnd(f)}${"".padEnd(p)}${"".padEnd(h)}${"".padEnd(g)}${St(d).padStart(6)}`+(o!==null?` ${"".padStart(12)} ${St(c).padStart(17)} ${St(null).padStart(19)} ${St(u).padStart(19)}`:"")+`
2887
2887
  `),_&&t.stdout.write(`n/a = this provider does not expose a context/token total; absence is not a health signal.
2888
2888
  `),t.stdout.write(`LAST CONTEXT = prompt size of the LAST COMPLETED turn, so it LAGS BY ONE TURN.
@@ -2891,51 +2891,51 @@ A bare <teamfile> with no alias tails that team's Lead member.
2891
2891
  small. Re-read after the next turn before concluding a compaction failed or gating on the value.
2892
2892
  `),y.length>0){t.stdout.write(`Session limits:
2893
2893
  `);for(let T of y)t.stdout.write(` ${T.reportPath}: LIMITED resets_at=${Ab(T.sessionLimit)}
2894
- `)}return 0}function Ib(t,e,r,n){let s=Te(t,e);if(r.has(s))return[];r.add(s);let i=qe(s,e);if(i.parseErrors.length>0)throw new Error(`${s}: ${i.parseErrors.join("; ")}`);let o=[];for(let a of i.members){if(a.teamfile!==void 0){o.push(...Ib(rB(kb(s),a.teamfile),e,r,[...n,a.alias]));continue}a.session===void 0||a.session.length===0||o.push({teamfile:s,alias:a.alias,reportPath:[...n,a.alias].join("/"),provider:a.provider,sessionid:a.session})}return o}async function cB(t,e,r){let n=await Nb(t,[{teamfile:e.teamfile,alias:e.alias}]),s=xb(e.teamfile),i=s.kind==="repo"?s:null;return{teamfile:e.teamfile,reportPath:e.alias,lastContext:r.lastInputTokens??null,liveness:n.get(Bm(e.teamfile,e.alias))??Hm(),...i!==null?{activitySinceLastCommit:{messageCount:Rb(r,i.since),tokens:null},cumulativeTokens:Lb(r)??"n/a"}:{}}}async function Nb(t,e){try{let r=await O(t,n=>e.map(s=>{let i=Wt(n,s.teamfile,s.alias);return[Bm(s.teamfile,s.alias),uB(i)]}));return new Map(r)}catch{return new Map}}function Bm(t,e){return`${t}\0${e.toLowerCase()}`}function uB(t){return t.busy?t.reason==="terminal-held"?t.source==="terminal-invocation"?{state:"busy",reason:"terminal-held",inFlight:null,terminalLock:null,terminalInvocation:{id:t.terminalInvocation.id,startedAt:t.terminalInvocation.started_at,lastHeartbeat:t.terminalInvocation.last_heartbeat_at,holderPid:t.terminalInvocation.holder_pid,holderHost:t.terminalInvocation.holder_host}}:{state:"busy",reason:"terminal-held",inFlight:null,terminalLock:{startedAt:t.terminalLock.started_at,lastHeartbeat:t.terminalLock.last_heartbeat,holderPid:t.terminalLock.holder_pid,holderHost:t.terminalLock.holder_host},terminalInvocation:null}:{state:"busy",reason:"in-flight",inFlight:{senderTeamfile:t.inFlight.sender_teamfile,senderAlias:t.inFlight.sender_alias,startedAt:t.inFlight.started_at,activeCount:t.inFlight.active_count,holderPid:t.inFlight.holder_pid},terminalLock:null,terminalInvocation:null}:Hm()}function Hm(){return{state:"idle",reason:null,inFlight:null,terminalLock:null,terminalInvocation:null}}function qm(t){return t.state==="idle"?"idle":`busy (${t.reason})`}function Ab(t){return t.resets_at!==null?t.resets_at:t.timezone!==null?`${t.reset_time} (${t.timezone})`:t.reset_time}function St(t){return t==null?"unknown":String(t)}function mB(t){return t==="n/a"?t:St(t)}function fB(t,e,r=String){return t!==void 0?r(t):e?"n/a":"unknown"}function xb(t){let e=kb(t),r;try{Wm("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=Wm("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(i=>Number.parseInt(i.trim(),10)).filter(i=>Number.isFinite(i)&&i>0);if(n.length===0)return{kind:"unavailable",reason:"no-commits",teamDir:e};let s=n.slice(0,2).map((i,o)=>({ref:o===0?"HEAD":`HEAD~${o}`,timestamp:new Date(i*1e3)}));return{kind:"repo",teamDir:e,since:s[0].timestamp,commits:s,working:pB(e)}}function pB(t){let e;try{e=Wm("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 Rb(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 Lb(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 nB,sB,$b=E(()=>{"use strict";nr();Ce();wt();rr();lr();Vt();Im();nB={name:"health",allowsBareTeamfile:!0,supportsRaw:!0},sB=`usage: lmctl health [target] [alias]
2894
+ `)}return 0}function Ib(t,e,r,n){let s=Te(t,e);if(r.has(s))return[];r.add(s);let i=qe(s,e);if(i.parseErrors.length>0)throw new Error(`${s}: ${i.parseErrors.join("; ")}`);let o=[];for(let a of i.members){if(a.teamfile!==void 0){o.push(...Ib(nB(kb(s),a.teamfile),e,r,[...n,a.alias]));continue}a.session===void 0||a.session.length===0||o.push({teamfile:s,alias:a.alias,reportPath:[...n,a.alias].join("/"),provider:a.provider,sessionid:a.session})}return o}async function uB(t,e,r){let n=await Nb(t,[{teamfile:e.teamfile,alias:e.alias}]),s=xb(e.teamfile),i=s.kind==="repo"?s:null;return{teamfile:e.teamfile,reportPath:e.alias,lastContext:r.lastInputTokens??null,liveness:n.get(Bm(e.teamfile,e.alias))??Hm(),...i!==null?{activitySinceLastCommit:{messageCount:Rb(r,i.since),tokens:null},cumulativeTokens:Lb(r)??"n/a"}:{}}}async function Nb(t,e){try{let r=await O(t,n=>e.map(s=>{let i=Wt(n,s.teamfile,s.alias);return[Bm(s.teamfile,s.alias),mB(i)]}));return new Map(r)}catch{return new Map}}function Bm(t,e){return`${t}\0${e.toLowerCase()}`}function mB(t){return t.busy?t.reason==="terminal-held"?t.source==="terminal-invocation"?{state:"busy",reason:"terminal-held",inFlight:null,terminalLock:null,terminalInvocation:{id:t.terminalInvocation.id,startedAt:t.terminalInvocation.started_at,lastHeartbeat:t.terminalInvocation.last_heartbeat_at,holderPid:t.terminalInvocation.holder_pid,holderHost:t.terminalInvocation.holder_host}}:{state:"busy",reason:"terminal-held",inFlight:null,terminalLock:{startedAt:t.terminalLock.started_at,lastHeartbeat:t.terminalLock.last_heartbeat,holderPid:t.terminalLock.holder_pid,holderHost:t.terminalLock.holder_host},terminalInvocation:null}:{state:"busy",reason:"in-flight",inFlight:{senderTeamfile:t.inFlight.sender_teamfile,senderAlias:t.inFlight.sender_alias,startedAt:t.inFlight.started_at,activeCount:t.inFlight.active_count,holderPid:t.inFlight.holder_pid},terminalLock:null,terminalInvocation:null}:Hm()}function Hm(){return{state:"idle",reason:null,inFlight:null,terminalLock:null,terminalInvocation:null}}function qm(t){return t.state==="idle"?"idle":`busy (${t.reason})`}function Ab(t){return t.resets_at!==null?t.resets_at:t.timezone!==null?`${t.reset_time} (${t.timezone})`:t.reset_time}function St(t){return t==null?"unknown":String(t)}function fB(t){return t==="n/a"?t:St(t)}function pB(t,e,r=String){return t!==void 0?r(t):e?"n/a":"unknown"}function xb(t){let e=kb(t),r;try{Wm("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=Wm("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(i=>Number.parseInt(i.trim(),10)).filter(i=>Number.isFinite(i)&&i>0);if(n.length===0)return{kind:"unavailable",reason:"no-commits",teamDir:e};let s=n.slice(0,2).map((i,o)=>({ref:o===0?"HEAD":`HEAD~${o}`,timestamp:new Date(i*1e3)}));return{kind:"repo",teamDir:e,since:s[0].timestamp,commits:s,working:_B(e)}}function _B(t){let e;try{e=Wm("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 Rb(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 Lb(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 sB,iB,$b=E(()=>{"use strict";nr();Ce();wt();rr();lr();Vt();Im();sB={name:"health",allowsBareTeamfile:!0,supportsRaw:!0},iB=`usage: lmctl health [target] [alias]
2895
2895
  lmctl health <teamfile> # team rollup
2896
2896
  lmctl health <sessionid> [--provider <name>]
2897
2897
  lmctl health --run <id> # run state, step rollup, and token totals
2898
2898
  [--json]
2899
2899
 
2900
- Show provider session details, team rollups, or managed run state/token totals.`});var Mb={};he(Mb,{runLs:()=>yB});import{resolve as Xm}from"node:path";function gB(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 yB(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${_B}
2901
- `),0;let r=te(t,["--provider","--sessiondir","--format","--limit"],["--recursive","--all","--json","--runs","--help"]);if(r.error!==void 0)return N(e,r.error);if(r.positionals.length>0)return N(e,"ls does not accept positional targets (use --provider/--sessiondir/--all to filter)");let n=M(r,"--format"),s=G(r,"--json");if(G(r,"--runs")){for(let _ of["--provider","--sessiondir"])if(M(r,_)!==void 0)return N(e,`--runs is mutually exclusive with ${_}`);for(let _ of["--recursive","--all"])if(G(r,_))return N(e,`--runs is mutually exclusive with ${_}`);if(n==="teamfile")return N(e,"--runs is mutually exclusive with --format teamfile (runs are not teamfile members)");let p=M(r,"--limit"),h=hB;if(p!==void 0){let _=Number.parseInt(p,10);if(!Number.isFinite(_)||_<1||String(_)!==p)return N(e,`invalid --limit "${p}" (expected a positive integer)`);if(_>Cb)return N(e,`--limit ${_} exceeds maximum (${Cb})`);h=_}let g=n==="json"||s===!0?"json":"table";try{return await O(e,async _=>EB(e,_,h,g))}catch(_){return We(e,_)}}let o=wB(n,s);if("error"in o)return N(e,o.error);let a=o.format,l=M(r,"--provider"),d=M(r,"--sessiondir"),c=G(r,"--recursive"),u=G(r,"--all"),m;try{m=await Bd(l?{provider:l}:{})}catch(p){return N(e,`ls: discovery failed: ${p instanceof Error?p.message:String(p)}`)}if(!u){let p=d!==void 0?Xm(d):Xm(process.cwd());m=m.filter(h=>{let g=Xm(h.cwd);return c?g===p||g.startsWith(`${p}/`):g===p})}if(m=gB(m),a==="json")return le(e,m.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(m.length===0){if(a==="table"){let p=u?"(all)":d??process.cwd(),h=c?"under":"in";e.stdout.write(`No native sessions found ${h} ${p}.
2900
+ Show provider session details, team rollups, or managed run state/token totals.`});var Mb={};he(Mb,{runLs:()=>EB});import{resolve as Xm}from"node:path";function yB(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 EB(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${hB}
2901
+ `),0;let r=te(t,["--provider","--sessiondir","--format","--limit"],["--recursive","--all","--json","--runs","--help"]);if(r.error!==void 0)return N(e,r.error);if(r.positionals.length>0)return N(e,"ls does not accept positional targets (use --provider/--sessiondir/--all to filter)");let n=M(r,"--format"),s=G(r,"--json");if(G(r,"--runs")){for(let _ of["--provider","--sessiondir"])if(M(r,_)!==void 0)return N(e,`--runs is mutually exclusive with ${_}`);for(let _ of["--recursive","--all"])if(G(r,_))return N(e,`--runs is mutually exclusive with ${_}`);if(n==="teamfile")return N(e,"--runs is mutually exclusive with --format teamfile (runs are not teamfile members)");let p=M(r,"--limit"),h=gB;if(p!==void 0){let _=Number.parseInt(p,10);if(!Number.isFinite(_)||_<1||String(_)!==p)return N(e,`invalid --limit "${p}" (expected a positive integer)`);if(_>Cb)return N(e,`--limit ${_} exceeds maximum (${Cb})`);h=_}let g=n==="json"||s===!0?"json":"table";try{return await O(e,async _=>wB(e,_,h,g))}catch(_){return We(e,_)}}let o=TB(n,s);if("error"in o)return N(e,o.error);let a=o.format,l=M(r,"--provider"),d=M(r,"--sessiondir"),c=G(r,"--recursive"),u=G(r,"--all"),m;try{m=await qd(l?{provider:l}:{})}catch(p){return N(e,`ls: discovery failed: ${p instanceof Error?p.message:String(p)}`)}if(!u){let p=d!==void 0?Xm(d):Xm(process.cwd());m=m.filter(h=>{let g=Xm(h.cwd);return c?g===p||g.startsWith(`${p}/`):g===p})}if(m=yB(m),a==="json")return le(e,m.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(m.length===0){if(a==="table"){let p=u?"(all)":d??process.cwd(),h=c?"under":"in";e.stdout.write(`No native sessions found ${h} ${p}.
2902
2902
  `)}return 0}if(a==="teamfile"){for(let p of m)e.stdout.write(`_MEMBER_ alias=- provider=${p.provider} sessionid=${p.sessionId} sessiondir=${p.cwd}
2903
2903
  `);return 0}let f=Math.max(14,...m.map(p=>p.sessionId.length));e.stdout.write(`${"SESSION".padEnd(f)} ${"PROVIDER".padEnd(10)} ${"SESSIONDIR".padEnd(36)} MODIFIED
2904
2904
  `);for(let p of m){let h=p.cwd.length>36?`\u2026${p.cwd.slice(-35)}`:p.cwd;e.stdout.write(`${p.sessionId.padEnd(f)} ${p.provider.padEnd(10)} ${h.padEnd(36)} ${p.modifiedAt.toISOString()}
2905
- `)}return 0}async function EB(t,e,r,n){let s=En(e,{limit:r});if(n==="json")return le(t,s.map(i=>({id:i.id,job_id:i.job_id,workflow_id:i.workflow_id,team_id:i.team_id,current_state:i.current_state,terminal_state:i.terminal_state,started_at:i.started_at,ended_at:i.ended_at,paused_at:i.paused_at}))),0;if(s.length===0)return t.stdout.write(`No runs found.
2905
+ `)}return 0}async function wB(t,e,r,n){let s=En(e,{limit:r});if(n==="json")return le(t,s.map(i=>({id:i.id,job_id:i.job_id,workflow_id:i.workflow_id,team_id:i.team_id,current_state:i.current_state,terminal_state:i.terminal_state,started_at:i.started_at,ended_at:i.ended_at,paused_at:i.paused_at}))),0;if(s.length===0)return t.stdout.write(`No runs found.
2906
2906
  `),0;t.stdout.write(`${"RUN_ID".padEnd(8)} ${"WORKFLOW".padEnd(8)} ${"TEAM".padEnd(8)} ${"STATE".padEnd(20)} ${"TERMINAL".padEnd(20)} STARTED
2907
2907
  `);for(let i of s){let o=(i.current_state??"").padEnd(20),a=(i.terminal_state??"").padEnd(20);t.stdout.write(`${String(i.id).padEnd(8)} ${String(i.workflow_id).padEnd(8)} ${String(i.team_id).padEnd(8)} ${o} ${a} ${i.started_at}
2908
- `)}return 0}function wB(t,e){return t===void 0?{format:e?"json":"teamfile"}:t==="table"||t==="teamfile"||t==="json"?{format:t}:{error:`invalid --format "${t}" (expected: table | teamfile | json)`}}var _B,hB,Cb,Db=E(()=>{"use strict";Lt();Ce();Vt();_B=`usage: lmctl ls [--provider <name>] [--sessiondir <path>]
2908
+ `)}return 0}function TB(t,e){return t===void 0?{format:e?"json":"teamfile"}:t==="table"||t==="teamfile"||t==="json"?{format:t}:{error:`invalid --format "${t}" (expected: table | teamfile | json)`}}var hB,gB,Cb,Db=E(()=>{"use strict";Lt();Ce();Vt();hB=`usage: lmctl ls [--provider <name>] [--sessiondir <path>]
2909
2909
  [--recursive] [--all] [--format table|teamfile|json] [--json]
2910
2910
  lmctl ls --runs [--limit N] [--format table|json] [--json]
2911
2911
 
2912
- List native provider sessions in scope, or list recent managed runs with --runs.`,hB=50,Cb=500});import{existsSync as ti,readFileSync as jb}from"node:fs";import{homedir as TB}from"node:os";import{dirname as Pb,resolve as Kn}from"node:path";import{fileURLToPath as vB}from"node:url";function Vm(t,e={}){let r=[],n=kB(e.modelSelectionDocPath);for(let s of t){let i=s.provider.trim().toLowerCase();if(s.effort&&i!=="opencode"&&i!=="lmplayer"&&i!=="qwen"&&r.push(`[${s.alias}] effort="${s.effort}" is ignored: effort selection is only supported for opencode and lmplayer.`),i==="qwen"&&s.effort&&r.push(`[${s.alias}] effort="${s.effort}" is not a qwen CLI flag: Qwen Code does not expose reasoning-effort selection. Use a thinking/effort model id in model= instead.`),i==="copilot"){if(!s.model)continue;r.push(`[${s.alias}] model="${s.model}" is ignored: copilot does not support lmctl model selection.`);continue}if(i==="lmplayer"&&!s.model){r.push(`[${s.alias}] provider=lmplayer has no model= \u2014 lmplayer will choose its own default model, which may not be visible in the teamfile. Set model= explicitly (e.g. github-copilot/gpt-5.4).`);continue}if(i==="lmplayer")continue;if(i==="opencode"){if(s.effort&&!s.model&&r.push(`[${s.alias}] effort="${s.effort}" has no effect without model= on an opencode member.`),!s.model){r.push(`[${s.alias}] provider=opencode has no model= \u2014 opencode will choose its own default model, which may not be servable and isn't visible in the teamfile. Set model= explicitly (e.g. github-copilot/gpt-5.4).`);continue}let a=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(d=>d.endsWith(`/${s.model}`));r.push(l.length>0?`[${s.alias}] model="${s.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model>. Your opencode.json declares it as ${l.join(" / ")}; set model=${l[0]}.`:`[${s.alias}] model="${s.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model> (e.g. github-copilot/${s.model}). Declare it in ~/.config/opencode/opencode.json (see https://lmctl.com/examples/opencode.json).`);continue}r.push(`[${s.alias}] model="${s.model}" is not declared in your opencode.json. opencode resolves github-copilot GPT/Gemini config-free, but copilot Claude and custom providers must be declared \u2014 copy https://lmctl.com/examples/opencode.json to ~/.config/opencode/opencode.json and adjust for your account.`);continue}if(!s.model)continue;let o=n.get(i);if(!o){r.push(`[${s.alias}] model="${s.model}" cannot be verified for provider "${i}": `+(tl??"no tested models found in durable-memory/model_selection.md"));continue}o.includes(s.model)||r.push(`[${s.alias}] model="${s.model}" is not in the tested model list for provider "${i}". Valid tested models: ${$B(o)}`)}return r}function kB(t){if(!t&&ei)return ei;let e=new Map,r,n=t??IB();if(!ti(n))return r=`${n} not found`,t||Jm(e),t||(ei=e),t||(tl=r),e;let s;try{s=jb(n,"utf-8")}catch(i){return r=`${n} could not be read: ${i instanceof Error?i.message:String(i)}`,t||Jm(e),t||(ei=e),t||(tl=r),e}for(let[i,o]of Object.entries(SB)){let a=xB(s,o),l=RB(a);l.length>0&&e.set(i,l)}return e.size===0&&(r=`${n} has no tested model rows`),!t&&e.size===0&&Jm(e),t||(ei=e),t||(tl=r),e}function IB(){return NB(Pb(vB(import.meta.url)))}function NB(t){let e=AB(t);if(e){let n=Kn(e,"durable-memory","model_selection.md");if(ti(n))return n}let r=[Kn(t,"..","..","durable-memory","model_selection.md"),Kn(t,"..","..","..","durable-memory","model_selection.md")];for(let n of r)if(ti(n))return n;return r[r.length-1]}function AB(t){let e=Kn(t);for(;;){if(ti(Kn(e,"package.json")))return e;let r=Pb(e);if(r===e)return null;e=r}}function Jm(t){for(let[e,r]of Object.entries(bB))t.set(e,r)}function xB(t,e){let n=new RegExp(`^## ${CB(e)}\\s*$`,"m").exec(t);if(!n)return"";let s=n.index+n[0].length,i=t.slice(s),o=/^##\s+/m.exec(i);return o?i.slice(0,o.index):i}function RB(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 i=s[1].trim();i&&i!=="Configured `model="&&e.add(i)}return[...e]}function LB(t){let e=t??Kn(TB(),".config","opencode","opencode.json");if(!ti(e))return{available:!0,models:[]};let r;try{r=JSON.parse(jb(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:OB(r)}}function OB(t){if(!Gm(t))return[];let e=el(t.provider)??el(t.providers);if(!e)return[];let r=new Set;for(let[n,s]of Object.entries(e)){if(!Gm(s))continue;let i=el(s.models)??el(s.model);if(i)for(let o of Object.keys(i))r.add(o.startsWith(`${n}/`)?o:`${n}/${o}`)}return[...r].sort()}function el(t){return Gm(t)?t:null}function Gm(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function $B(t){return t.length>0?t.join(", "):"(none)"}function CB(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var SB,bB,ei,tl,Fb=E(()=>{"use strict";SB={claude:"Claude",codex:"Codex",gemini:"Gemini",qwen:"Qwen",agy:"Antigravity"},bB={claude:["claude-opus-4-6","claude-opus-4-7","claude-opus-4-8","claude-opus-5","claude-sonnet-4-6","claude-sonnet-5","claude-haiku-4-5","claude-fable-5"],codex:["gpt-5.2","gpt-5.4","gpt-5.5","gpt-5.6-sol","gpt-5.4-mini","gpt-5.3-codex","gpt-5.3-codex-spark"],gemini:["gemini-3.1-pro-preview","gemini-3-flash-preview","gemini-3.1-flash-lite-preview","gemini-2.5-flash","gemini-2.5-flash-lite"],qwen:["qwen3.5-plus","qwen3.6-plus"],agy:["Gemini 3.5 Flash (Medium)","Gemini 3.5 Flash (High)","Gemini 3.5 Flash (Low)","Gemini 3.1 Pro (Low)","Gemini 3.1 Pro (High)","Claude Sonnet 4.6 (Thinking)","Claude Opus 4.6 (Thinking)","GPT-OSS 120B (Medium)"]},ei=null});import{homedir as MB}from"node:os";import{basename as DB}from"node:path";function rl(t,e){let r=new Set;return{text:t.replace(PB,(s,i)=>{let o=i.trim(),a=jB[o];return a===void 0?(r.add(o),s):a(e)}),unknownNames:[...r].sort()}}function nl(t){return{workdir:t.workdir,teamfile:t.teamfile,date:FB(t.date)}}function FB(t){return t.toISOString().slice(0,10)}var jB,PB,Km=E(()=>{"use strict";jB={workdir:t=>t.workdir,teamfile:t=>t.teamfile,teamname:t=>{let e=DB(t.teamfile);return e.endsWith(".lmctl")?e.slice(0,-6):e},home:()=>MB(),date:t=>t.date},PB=/{{\s*([A-Za-z0-9_-]+)\s*}}/g});var si={};he(si,{GEMINI_PROVIDER_NOTICE:()=>Bb,_setLintOpenCodeConfigProbeForTests:()=>VB,_setLintSessiondirFsOpsForTests:()=>GB,_setTeamfileSeedForTests:()=>JB,buildRootTeamRegistrationRow:()=>Kb,registerRootTeam:()=>Yb,runHire:()=>nH,runLint:()=>rH,runRefresh:()=>sH,runSeed:()=>Gb,sha256Text:()=>Vb});import{createHash as UB}from"node:crypto";import{accessSync as WB,constants as Ub,existsSync as qB,readFileSync as ol,realpathSync as Zm,statSync as BB,writeFileSync as il}from"node:fs";import{dirname as Rr,resolve as qb}from"node:path";function JB(t){Hb=t??(async e=>{let{seed:r}=await Promise.resolve().then(()=>(Lt(),Xd)),n=await r(e);return n.success?{sessionId:n.sessionId,warnings:n.warnings}:{error:n.error??"provider seed failed"}})}function GB(t){Qr=t===null?Qm:{...Qm,...t}}function VB(t){Xb=t??id}async function KB(t,e,r){let n=t.filter(i=>i.teamfile===void 0&&i.provider.trim().toLowerCase()==="opencode"&&i.model!==void 0&&i.model.length>0);return(await Promise.all(n.map(async i=>({member:i,result:await Xb({cwd:i.sessiondir??e,model:i.model,...i.effort!==void 0?{effort:i.effort}:{},...r!==void 0?{env:r}:{}})})))).flatMap(({member:i,result:o})=>o.status==="rejected"?[`[${i.alias}] ${o.option}="${o.value}" rejected by opencode: ${o.error}`]:[])}function YB(t,e){let r=Rr(e),n=new Set,s=[];for(let i of t){if(i.teamfile!==void 0)continue;let o=i.sessiondir??r,a=qb(o);if(n.has(a))continue;let l=zB(a);l!==void 0&&(n.add(a),s.push(`${i.alias}: sessiondir ${a} is not writable (seed would fail: ${l}) \u2014 fix permissions or set a writable sessiondir`))}return s}function zB(t){try{if(Qr.existsSync(t)){if(!Qr.statSync(t).isDirectory())return"ENOTDIR";Qr.accessSync(t,Ub.W_OK);return}let e=eH(t);if(e===void 0)return;if(!Qr.statSync(e).isDirectory())return"ENOTDIR";Qr.accessSync(e,Ub.W_OK);return}catch(e){return tH(e)??"permission check failed"}}function ZB(t,e){let r=[];for(let n of t)n.teamfile!==void 0||n.sessiondir===void 0||Jb(n.sessiondir,e)&&r.push(`${n.alias}: sessiondir equals the teamfile directory and is redundant; lmctl seed will remove it`);return r}function QB(t,e,r,n){let s=!1;for(let i of t){if(i.teamfile!==void 0||i.sessiondir===void 0||!Jb(i.sessiondir,n))continue;let o=r.get(i.alias.toLowerCase());if(o===void 0)continue;let a=zb(e[o],"sessiondir");a!==e[o]&&(e[o]=a,s=!0),i.sessiondir=void 0}return s}function Jb(t,e){return Wb(t)===Wb(e)}function Wb(t){let e=qb(t);try{return Zm(e)}catch{return e}}function eH(t){let e=t;for(;;){try{if(Qr.existsSync(e))return e}catch{return}let r=Rr(e);if(r===e)return;e=r}}function tH(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 rH(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(HB),0;if(t.length!==1)return e.stderr.write(`usage: lmctl lint <teamfile.lmctl>
2913
- `),2;let r=t[0],n;try{n=await O(e,d=>Te(r,d))}catch(d){return De(e,`${r}: ${d instanceof Error?d.message:String(d)}`)}let s;try{s=rt(n)}catch(d){return De(e,`${r}: ${d instanceof Error?d.message:String(d)}`)}let i=Lu(s,Rr(n)),o=Vm(s.members),a=ol(n,"utf8"),l=rl(a,nl({workdir:Rr(n),teamfile:n,date:new Date})).unknownNames;l.length>0&&o.push(`unknown template placeholder${l.length===1?"":"s"}: ${l.map(d=>`{{${d}}}`).join(", ")}`),o.push(...td(s.members,Rr(n))),o.push(...YB(s.members,n)),o.push(...ZB(s.members,Rr(n))),o.push(...await KB(s.members,Rr(n),e.env));for(let d of i)e.stderr.write(`error: ${d.field}: ${d.message}
2912
+ List native provider sessions in scope, or list recent managed runs with --runs.`,gB=50,Cb=500});import{existsSync as ti,readFileSync as jb}from"node:fs";import{homedir as vB}from"node:os";import{dirname as Pb,resolve as Kn}from"node:path";import{fileURLToPath as SB}from"node:url";function Vm(t,e={}){let r=[],n=IB(e.modelSelectionDocPath);for(let s of t){let i=s.provider.trim().toLowerCase();if(s.effort&&i!=="opencode"&&i!=="lmplayer"&&i!=="qwen"&&r.push(`[${s.alias}] effort="${s.effort}" is ignored: effort selection is only supported for opencode and lmplayer.`),i==="qwen"&&s.effort&&r.push(`[${s.alias}] effort="${s.effort}" is not a qwen CLI flag: Qwen Code does not expose reasoning-effort selection. Use a thinking/effort model id in model= instead.`),i==="copilot"){if(!s.model)continue;r.push(`[${s.alias}] model="${s.model}" is ignored: copilot does not support lmctl model selection.`);continue}if(i==="lmplayer"&&!s.model){r.push(`[${s.alias}] provider=lmplayer has no model= \u2014 lmplayer will choose its own default model, which may not be visible in the teamfile. Set model= explicitly (e.g. github-copilot/gpt-5.4).`);continue}if(i==="lmplayer")continue;if(i==="opencode"){if(s.effort&&!s.model&&r.push(`[${s.alias}] effort="${s.effort}" has no effect without model= on an opencode member.`),!s.model){r.push(`[${s.alias}] provider=opencode has no model= \u2014 opencode will choose its own default model, which may not be servable and isn't visible in the teamfile. Set model= explicitly (e.g. github-copilot/gpt-5.4).`);continue}let a=OB(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(d=>d.endsWith(`/${s.model}`));r.push(l.length>0?`[${s.alias}] model="${s.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model>. Your opencode.json declares it as ${l.join(" / ")}; set model=${l[0]}.`:`[${s.alias}] model="${s.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model> (e.g. github-copilot/${s.model}). Declare it in ~/.config/opencode/opencode.json (see https://lmctl.com/examples/opencode.json).`);continue}r.push(`[${s.alias}] model="${s.model}" is not declared in your opencode.json. opencode resolves github-copilot GPT/Gemini config-free, but copilot Claude and custom providers must be declared \u2014 copy https://lmctl.com/examples/opencode.json to ~/.config/opencode/opencode.json and adjust for your account.`);continue}if(!s.model)continue;let o=n.get(i);if(!o){r.push(`[${s.alias}] model="${s.model}" cannot be verified for provider "${i}": `+(el??"no tested models found in durable-memory/model_selection.md"));continue}o.includes(s.model)||r.push(`[${s.alias}] model="${s.model}" is not in the tested model list for provider "${i}". Valid tested models: ${CB(o)}`)}return r}function IB(t){if(!t&&ei)return ei;let e=new Map,r,n=t??NB();if(!ti(n))return r=`${n} not found`,t||Jm(e),t||(ei=e),t||(el=r),e;let s;try{s=jb(n,"utf-8")}catch(i){return r=`${n} could not be read: ${i instanceof Error?i.message:String(i)}`,t||Jm(e),t||(ei=e),t||(el=r),e}for(let[i,o]of Object.entries(bB)){let a=RB(s,o),l=LB(a);l.length>0&&e.set(i,l)}return e.size===0&&(r=`${n} has no tested model rows`),!t&&e.size===0&&Jm(e),t||(ei=e),t||(el=r),e}function NB(){return AB(Pb(SB(import.meta.url)))}function AB(t){let e=xB(t);if(e){let n=Kn(e,"durable-memory","model_selection.md");if(ti(n))return n}let r=[Kn(t,"..","..","durable-memory","model_selection.md"),Kn(t,"..","..","..","durable-memory","model_selection.md")];for(let n of r)if(ti(n))return n;return r[r.length-1]}function xB(t){let e=Kn(t);for(;;){if(ti(Kn(e,"package.json")))return e;let r=Pb(e);if(r===e)return null;e=r}}function Jm(t){for(let[e,r]of Object.entries(kB))t.set(e,r)}function RB(t,e){let n=new RegExp(`^## ${MB(e)}\\s*$`,"m").exec(t);if(!n)return"";let s=n.index+n[0].length,i=t.slice(s),o=/^##\s+/m.exec(i);return o?i.slice(0,o.index):i}function LB(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 i=s[1].trim();i&&i!=="Configured `model="&&e.add(i)}return[...e]}function OB(t){let e=t??Kn(vB(),".config","opencode","opencode.json");if(!ti(e))return{available:!0,models:[]};let r;try{r=JSON.parse(jb(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:$B(r)}}function $B(t){if(!Gm(t))return[];let e=Qa(t.provider)??Qa(t.providers);if(!e)return[];let r=new Set;for(let[n,s]of Object.entries(e)){if(!Gm(s))continue;let i=Qa(s.models)??Qa(s.model);if(i)for(let o of Object.keys(i))r.add(o.startsWith(`${n}/`)?o:`${n}/${o}`)}return[...r].sort()}function Qa(t){return Gm(t)?t:null}function Gm(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function CB(t){return t.length>0?t.join(", "):"(none)"}function MB(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var bB,kB,ei,el,Fb=E(()=>{"use strict";bB={claude:"Claude",codex:"Codex",gemini:"Gemini",qwen:"Qwen",agy:"Antigravity"},kB={claude:["claude-opus-4-6","claude-opus-4-7","claude-opus-4-8","claude-opus-5","claude-sonnet-4-6","claude-sonnet-5","claude-haiku-4-5","claude-fable-5"],codex:["gpt-5.2","gpt-5.4","gpt-5.5","gpt-5.6-sol","gpt-5.4-mini","gpt-5.3-codex","gpt-5.3-codex-spark"],gemini:["gemini-3.1-pro-preview","gemini-3-flash-preview","gemini-3.1-flash-lite-preview","gemini-2.5-flash","gemini-2.5-flash-lite"],qwen:["qwen3.5-plus","qwen3.6-plus"],agy:["Gemini 3.5 Flash (Medium)","Gemini 3.5 Flash (High)","Gemini 3.5 Flash (Low)","Gemini 3.1 Pro (Low)","Gemini 3.1 Pro (High)","Claude Sonnet 4.6 (Thinking)","Claude Opus 4.6 (Thinking)","GPT-OSS 120B (Medium)"]},ei=null});import{homedir as DB}from"node:os";import{basename as jB}from"node:path";function tl(t,e){let r=new Set;return{text:t.replace(FB,(s,i)=>{let o=i.trim(),a=PB[o];return a===void 0?(r.add(o),s):a(e)}),unknownNames:[...r].sort()}}function rl(t){return{workdir:t.workdir,teamfile:t.teamfile,date:UB(t.date)}}function UB(t){return t.toISOString().slice(0,10)}var PB,FB,Km=E(()=>{"use strict";PB={workdir:t=>t.workdir,teamfile:t=>t.teamfile,teamname:t=>{let e=jB(t.teamfile);return e.endsWith(".lmctl")?e.slice(0,-6):e},home:()=>DB(),date:t=>t.date},FB=/{{\s*([A-Za-z0-9_-]+)\s*}}/g});var si={};he(si,{GEMINI_PROVIDER_NOTICE:()=>Bb,_setLintOpenCodeConfigProbeForTests:()=>KB,_setLintSessiondirFsOpsForTests:()=>VB,_setTeamfileSeedForTests:()=>GB,buildRootTeamRegistrationRow:()=>Kb,registerRootTeam:()=>Yb,runHire:()=>sH,runLint:()=>nH,runRefresh:()=>iH,runSeed:()=>Gb,sha256Text:()=>Vb});import{createHash as WB}from"node:crypto";import{accessSync as qB,constants as Ub,existsSync as BB,readFileSync as il,realpathSync as Zm,statSync as HB,writeFileSync as sl}from"node:fs";import{dirname as Rr,resolve as qb}from"node:path";function GB(t){Hb=t??(async e=>{let{seed:r}=await Promise.resolve().then(()=>(Lt(),Hd)),n=await r(e);return n.success?{sessionId:n.sessionId,warnings:n.warnings}:{error:n.error??"provider seed failed"}})}function VB(t){Qr=t===null?Qm:{...Qm,...t}}function KB(t){Xb=t??sd}async function YB(t,e,r){let n=t.filter(i=>i.teamfile===void 0&&i.provider.trim().toLowerCase()==="opencode"&&i.model!==void 0&&i.model.length>0);return(await Promise.all(n.map(async i=>({member:i,result:await Xb({cwd:i.sessiondir??e,model:i.model,...i.effort!==void 0?{effort:i.effort}:{},...r!==void 0?{env:r}:{}})})))).flatMap(({member:i,result:o})=>o.status==="rejected"?[`[${i.alias}] ${o.option}="${o.value}" rejected by opencode: ${o.error}`]:[])}function zB(t,e){let r=Rr(e),n=new Set,s=[];for(let i of t){if(i.teamfile!==void 0)continue;let o=i.sessiondir??r,a=qb(o);if(n.has(a))continue;let l=ZB(a);l!==void 0&&(n.add(a),s.push(`${i.alias}: sessiondir ${a} is not writable (seed would fail: ${l}) \u2014 fix permissions or set a writable sessiondir`))}return s}function ZB(t){try{if(Qr.existsSync(t)){if(!Qr.statSync(t).isDirectory())return"ENOTDIR";Qr.accessSync(t,Ub.W_OK);return}let e=tH(t);if(e===void 0)return;if(!Qr.statSync(e).isDirectory())return"ENOTDIR";Qr.accessSync(e,Ub.W_OK);return}catch(e){return rH(e)??"permission check failed"}}function QB(t,e){let r=[];for(let n of t)n.teamfile!==void 0||n.sessiondir===void 0||Jb(n.sessiondir,e)&&r.push(`${n.alias}: sessiondir equals the teamfile directory and is redundant; lmctl seed will remove it`);return r}function eH(t,e,r,n){let s=!1;for(let i of t){if(i.teamfile!==void 0||i.sessiondir===void 0||!Jb(i.sessiondir,n))continue;let o=r.get(i.alias.toLowerCase());if(o===void 0)continue;let a=zb(e[o],"sessiondir");a!==e[o]&&(e[o]=a,s=!0),i.sessiondir=void 0}return s}function Jb(t,e){return Wb(t)===Wb(e)}function Wb(t){let e=qb(t);try{return Zm(e)}catch{return e}}function tH(t){let e=t;for(;;){try{if(Qr.existsSync(e))return e}catch{return}let r=Rr(e);if(r===e)return;e=r}}function rH(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 nH(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(XB),0;if(t.length!==1)return e.stderr.write(`usage: lmctl lint <teamfile.lmctl>
2913
+ `),2;let r=t[0],n;try{n=await O(e,d=>Te(r,d))}catch(d){return De(e,`${r}: ${d instanceof Error?d.message:String(d)}`)}let s;try{s=rt(n)}catch(d){return De(e,`${r}: ${d instanceof Error?d.message:String(d)}`)}let i=Ru(s,Rr(n)),o=Vm(s.members),a=il(n,"utf8"),l=tl(a,rl({workdir:Rr(n),teamfile:n,date:new Date})).unknownNames;l.length>0&&o.push(`unknown template placeholder${l.length===1?"":"s"}: ${l.map(d=>`{{${d}}}`).join(", ")}`),o.push(...ed(s.members,Rr(n))),o.push(...zB(s.members,n)),o.push(...QB(s.members,Rr(n))),o.push(...await YB(s.members,Rr(n),e.env));for(let d of i)e.stderr.write(`error: ${d.field}: ${d.message}
2914
2914
  `);for(let d of s.members)tf([d],e),d.session!==void 0&&d.session.length<ri&&o.push(`${d.alias}: sessionid is shorter than ${ri} chars; run lmctl seed to refresh it`);for(let d of o)e.stderr.write(`warning: ${d}
2915
2915
  `);return i.length>0?1:(e.stdout.write(`ok
2916
- `),0)}async function Gb(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(XB),0;if(t.length!==1)return e.stderr.write(`usage: lmctl seed <teamfile.lmctl>
2917
- `),2;let r=t[0],n;try{n=await O(e,_=>Te(r,_))}catch(_){return De(e,`${r}: ${_ instanceof Error?_.message:String(_)}`)}let s;try{s=Zm(n)}catch(_){return De(e,`${r}: ${_ instanceof Error?_.message:String(_)}`)}let i=Rr(n),o;try{o=rt(n)}catch(_){return De(e,`${r}: ${_ instanceof Error?_.message:String(_)}`)}let l=ol(n,"utf8").split(`
2918
- `),d=aH(l),c=QB(o.members,l,d,i),u=Lu(o,i);if(u.length>0){tf(o.members,e);for(let _ of u)e.stderr.write(`error: ${_.field}: ${_.message}
2916
+ `),0)}async function Gb(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(JB),0;if(t.length!==1)return e.stderr.write(`usage: lmctl seed <teamfile.lmctl>
2917
+ `),2;let r=t[0],n;try{n=await O(e,_=>Te(r,_))}catch(_){return De(e,`${r}: ${_ instanceof Error?_.message:String(_)}`)}let s;try{s=Zm(n)}catch(_){return De(e,`${r}: ${_ instanceof Error?_.message:String(_)}`)}let i=Rr(n),o;try{o=rt(n)}catch(_){return De(e,`${r}: ${_ instanceof Error?_.message:String(_)}`)}let l=il(n,"utf8").split(`
2918
+ `),d=lH(l),c=eH(o.members,l,d,i),u=Ru(o,i);if(u.length>0){tf(o.members,e);for(let _ of u)e.stderr.write(`error: ${_.field}: ${_.message}
2919
2919
  `);return 1}try{Bn(e,o,n)}catch{}tf(o.members,e);for(let _ of Vm(o.members))e.stderr.write(`warning: ${_}
2920
- `);for(let _ of td(o.members,i))e.stderr.write(`warning: ${_}
2920
+ `);for(let _ of ed(o.members,i))e.stderr.write(`warning: ${_}
2921
2921
  `);let m=0,f=o.members.filter(_=>_.teamfile!==void 0?!1:_.session===void 0||_.session.length<ri);for(let _ of f)if(!Zb(_.provider))return e.stderr.write(`error: ${_.alias}: invalid provider "${_.provider}"
2922
2922
  `),1;for(let _ of o.members){if(_.teamfile!==void 0)continue;if(_.session!==void 0&&_.session.length>=ri){e.stderr.write(`warning: ${_.alias}: existing sessionid preserved; skipping
2923
- `);continue}let y=_.sessiondir??i,T=await Hb({provider:_.provider,cwd:y,..._.model!==void 0?{model:_.model}:{},..._.effort!==void 0?{effort:_.effort}:{},..._.alias.toLowerCase()==="lead"?{prompt:iH(n,l.join(`
2923
+ `);continue}let y=_.sessiondir??i,T=await Hb({provider:_.provider,cwd:y,..._.model!==void 0?{model:_.model}:{},..._.effort!==void 0?{effort:_.effort}:{},..._.alias.toLowerCase()==="lead"?{prompt:oH(n,l.join(`
2924
2924
  `),o.members)}:{}});for(let A of T.warnings??[])e.stderr.write(`warning: ${_.alias}: ${A}
2925
2925
  `);if(T.error!==void 0||T.sessionId===void 0||T.sessionId.length<ri){let A=`provider did not report a sessionid; no new session was found for ${y} (possible provider workspace/cwd mismatch)`;return e.stderr.write(`error: ${_.alias}: seed failed${T.error!==void 0?`: ${T.error}`:`; ${A}`}
2926
2926
  `),1}let v=d.get(_.alias.toLowerCase());if(v===void 0)return e.stderr.write(`error: ${_.alias}: could not find matching _MEMBER_ line to update
2927
- `),1;let k=uH(l[v],"sessionid",T.sessionId);l[v]=k,m+=1,il(n,l.join(`
2927
+ `),1;let k=mH(l[v],"sessionid",T.sessionId);l[v]=k,m+=1,sl(n,l.join(`
2928
2928
  `),"utf8"),e.stdout.write(`${_.alias}: seeded ${T.sessionId} provider=${_.provider} sessiondir=${y}
2929
2929
  `)}let p=l.join(`
2930
- `),h=fH(p,Zm(n));(h!==p||c)&&il(n,h,"utf8"),m===0&&e.stdout.write(`no members needed seeding
2931
- `);let g=new Date().toISOString();try{await O(e,_=>{Yb(_,{teamfilePath:s,name:o.name,rawText:h,now:g})})}catch(_){return De(e,_ instanceof Error?_.message:String(_))}return 0}async function nH(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(sl),0;let r=te(t,["--provider","--sessiondir"],[]);if(r.error!==void 0)return zm(e,r.error,sl);if(r.positionals.length!==2)return zm(e,"expected <teamfile.lmctl> and <alias>",sl);let[n,s]=r.positionals;if(!cH(s))return De(e,`invalid alias "${s}"`);if(s.toLowerCase()==="lead")return De(e,"hire only applies to non-Lead members");let i=M(r,"--provider");if(i===void 0)return zm(e,"missing value for --provider",sl);if(!Zb(i))return De(e,`invalid provider "${i}"`);let o;try{o=await O(e,u=>Te(n,u))}catch(u){return De(e,`${n}: ${u instanceof Error?u.message:String(u)}`)}let a;try{a=ol(o,"utf8")}catch(u){return De(e,`${n}: ${u instanceof Error?u.message:String(u)}`)}if(dH(a,s))return De(e,`${s}: alias already exists in ${o}`);let l=M(r,"--sessiondir"),d=[`_MEMBER_ alias=${ef(s)} provider=${i}`,...l===void 0?[]:[`sessiondir=${ef(l)}`]].join(" "),c=mH(a,d);return il(o,c,"utf8"),e.stdout.write(`Hired ${s} (${i}) -> ${o}
2930
+ `),h=pH(p,Zm(n));(h!==p||c)&&sl(n,h,"utf8"),m===0&&e.stdout.write(`no members needed seeding
2931
+ `);let g=new Date().toISOString();try{await O(e,_=>{Yb(_,{teamfilePath:s,name:o.name,rawText:h,now:g})})}catch(_){return De(e,_ instanceof Error?_.message:String(_))}return 0}async function sH(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(nl),0;let r=te(t,["--provider","--sessiondir"],[]);if(r.error!==void 0)return zm(e,r.error,nl);if(r.positionals.length!==2)return zm(e,"expected <teamfile.lmctl> and <alias>",nl);let[n,s]=r.positionals;if(!uH(s))return De(e,`invalid alias "${s}"`);if(s.toLowerCase()==="lead")return De(e,"hire only applies to non-Lead members");let i=M(r,"--provider");if(i===void 0)return zm(e,"missing value for --provider",nl);if(!Zb(i))return De(e,`invalid provider "${i}"`);let o;try{o=await O(e,u=>Te(n,u))}catch(u){return De(e,`${n}: ${u instanceof Error?u.message:String(u)}`)}let a;try{a=il(o,"utf8")}catch(u){return De(e,`${n}: ${u instanceof Error?u.message:String(u)}`)}if(cH(a,s))return De(e,`${s}: alias already exists in ${o}`);let l=M(r,"--sessiondir"),d=[`_MEMBER_ alias=${ef(s)} provider=${i}`,...l===void 0?[]:[`sessiondir=${ef(l)}`]].join(" "),c=fH(a,d);return sl(o,c,"utf8"),e.stdout.write(`Hired ${s} (${i}) -> ${o}
2932
2932
  `),e.stdout.write(`Run: lmctl seed ${o}
2933
- `),0}async function sH(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(Ym),0;let r,n;if(t.length===1){let u=Jr(t[0]);if(u===null)return e.stderr.write(Ym),2;r=u.teamfile,n=u.alias}else if(t.length===2)[r,n]=t;else return e.stderr.write(Ym),2;let s;try{s=await O(e,u=>Te(r,u))}catch(u){return De(e,`${r}: ${u instanceof Error?u.message:String(u)}`)}let i;try{i=ol(s,"utf8")}catch(u){return De(e,`${r}: ${u instanceof Error?u.message:String(u)}`)}let o=i.split(`
2934
- `),a=lH(o,n);if(a===void 0)return De(e,`${n}: no active _MEMBER_ entry found`);let l=o[a];if(ni(l,"teamfile")!==void 0)return De(e,`${n}: refresh only applies to provider-backed members, not teamfile= members`);let d=(e.env??process.env)[fs],c=ni(l,"sessionid");return d!==void 0&&d.length>0&&c===d?De(e,`${n}: cannot refresh its own running session \u2014 run this refresh from a different member session or a plain operator shell.`):(o[a]=zb(l,"sessionid"),a>0&&/^\s*#CreationTime:/u.test(o[a-1])&&o.splice(a-1,1),il(s,o.join(`
2935
- `),"utf8"),Gb([s],e))}function Vb(t){return UB("sha256").update(t).digest("hex")}function Kb(t,e){return{teamfile_path:e.teamfilePath,name:e.name,raw_text:e.rawText,raw_sha256:Vb(e.rawText),registered_at:t?.registered_at??e.now,last_seeded_at:e.now}}function Yb(t,e){let r=ka(e.rawText,e.teamfilePath);Cu(t,e.teamfilePath,r);let n=Kb(t.getRootTeam(e.teamfilePath),e);return t.upsertRootTeam(n),n}function iH(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(`
2936
- `):"- (no non-Lead members)",i=r.find(a=>a.alias.toLowerCase()==="lead")?.provider??"",o=oH(i,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"`,"- SAFE INPUT \u2014 use for ANYTHING non-trivial. A prompt typed into the command line is expanded by YOUR shell first,"," so backticks, $(...), $VAR and quotes are executed or stripped out of the message before lmctl sees it."," If the text contains backticks, quotes, $, newlines, or ANY relayed/pasted/quoted content, do NOT put it in the command.",` Write it to a file with your file-writing tool (NOT echo/heredoc \u2014 those are shell too), then: lmctl chat "${t}" <alias> --prompt-file <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, but check the result with --json or lmctl status.","- Busy receiver ENQUEUES. lmctl chat exits 0 for BOTH delivered and enqueued, so exit code alone CANNOT tell you a reply arrived.",'- lmctl chat ... --json is machine-readable: status="ok" is a delivered reply (with replyText); status="enqueued" (plus path="enqueued") means it was queued, and carries id/sender/receiver.',"- lmctl status shows your identity, members with busy/idle, mail queued TO and FROM you, and why a receiver is busy. Run it when you are unsure whether a delegation landed.","- For arbitrary shell work, use your provider/runtime shell tools directly; lmctl does not execute shell commands.",o,"","Delegation is an ACTION, not a plan: to hand a member a task, run the lmctl chat command above. lmctl exposes no delegation tool you should use \u2014 delegate with lmctl chat.","","Team members:",s,"","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 session \u2014 run it from a different member session or a plain operator shell.`,` Optional: lmctl tail "${t}" <alias> to inspect its recent messages while troubleshooting.`,"(These health/recovery commands are shell commands. For delegation, use lmctl chat.)","","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(`
2937
- `)}function oH(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 aH(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=ni(n,"alias");s!==void 0&&e.set(s.toLowerCase(),r)}return e}function lH(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)&&ni(s,"alias")?.toLowerCase()===r)return n}}function dH(t,e){for(let r of t.split(`
2938
- `))if(/^\s*#?\s*_MEMBER_\s+\S/u.test(r)&&ni(r,"alias")===e)return!0;return!1}function cH(t){return/^[A-Za-z][A-Za-z0-9_-]*$/u.test(t)}function ni(t,e){let n=new RegExp(`(?:^|\\s)${e}=(?:"([^"]*)"|(\\S*))`).exec(t);return n===null?void 0:n[1]??n[2]??""}function uH(t,e,r){let n=`${e}=${ef(r)}`,s=new RegExp(`(^|\\s)${e}=(?:"[^"]*"|\\S*)`);return s.test(t)?t.replace(s,(i,o)=>`${o}${n}`):`${t.trimEnd()} ${n}`}function zb(t,e){let r=new RegExp(`(^|\\s)${e}=(?:"[^"]*"|\\S*)`);return t.replace(r,"").replace(/\s+/gu," ").trimEnd()}function ef(t){return/[\s"]/u.test(t)?`"${t.replace(/"/g,'\\"')}"`:t}function mH(t,e){let r=t.split(`
2933
+ `),0}async function iH(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(Ym),0;let r,n;if(t.length===1){let u=Jr(t[0]);if(u===null)return e.stderr.write(Ym),2;r=u.teamfile,n=u.alias}else if(t.length===2)[r,n]=t;else return e.stderr.write(Ym),2;let s;try{s=await O(e,u=>Te(r,u))}catch(u){return De(e,`${r}: ${u instanceof Error?u.message:String(u)}`)}let i;try{i=il(s,"utf8")}catch(u){return De(e,`${r}: ${u instanceof Error?u.message:String(u)}`)}let o=i.split(`
2934
+ `),a=dH(o,n);if(a===void 0)return De(e,`${n}: no active _MEMBER_ entry found`);let l=o[a];if(ni(l,"teamfile")!==void 0)return De(e,`${n}: refresh only applies to provider-backed members, not teamfile= members`);let d=(e.env??process.env)[fs],c=ni(l,"sessionid");return d!==void 0&&d.length>0&&c===d?De(e,`${n}: cannot refresh its own running session \u2014 run this refresh from a different member session or a plain operator shell.`):(o[a]=zb(l,"sessionid"),a>0&&/^\s*#CreationTime:/u.test(o[a-1])&&o.splice(a-1,1),sl(s,o.join(`
2935
+ `),"utf8"),Gb([s],e))}function Vb(t){return WB("sha256").update(t).digest("hex")}function Kb(t,e){return{teamfile_path:e.teamfilePath,name:e.name,raw_text:e.rawText,raw_sha256:Vb(e.rawText),registered_at:t?.registered_at??e.now,last_seeded_at:e.now}}function Yb(t,e){let r=ba(e.rawText,e.teamfilePath);Cu(t,e.teamfilePath,r);let n=Kb(t.getRootTeam(e.teamfilePath),e);return t.upsertRootTeam(n),n}function oH(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(`
2936
+ `):"- (no non-Lead members)",i=r.find(a=>a.alias.toLowerCase()==="lead")?.provider??"",o=aH(i,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"`,"- SAFE INPUT \u2014 use for ANYTHING non-trivial. A prompt typed into the command line is expanded by YOUR shell first,"," so backticks, $(...), $VAR and quotes are executed or stripped out of the message before lmctl sees it."," If the text contains backticks, quotes, $, newlines, or ANY relayed/pasted/quoted content, do NOT put it in the command.",` Write it to a file with your file-writing tool (NOT echo/heredoc \u2014 those are shell too), then: lmctl chat "${t}" <alias> --prompt-file <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, but check the result with --json or lmctl status.","- Busy receiver ENQUEUES. lmctl chat exits 0 for BOTH delivered and enqueued, so exit code alone CANNOT tell you a reply arrived.",'- lmctl chat ... --json is machine-readable: status="ok" is a delivered reply (with replyText); status="enqueued" (plus path="enqueued") means it was queued, and carries id/sender/receiver.',"- lmctl status shows your identity, members with busy/idle, mail queued TO and FROM you, and why a receiver is busy. Run it when you are unsure whether a delegation landed.","- For arbitrary shell work, use your provider/runtime shell tools directly; lmctl does not execute shell commands.",o,"","Delegation is an ACTION, not a plan: to hand a member a task, run the lmctl chat command above. lmctl exposes no delegation tool you should use \u2014 delegate with lmctl chat.","","Team members:",s,"","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 session \u2014 run it from a different member session or a plain operator shell.`,` Optional: lmctl tail "${t}" <alias> to inspect its recent messages while troubleshooting.`,"(These health/recovery commands are shell commands. For delegation, use lmctl chat.)","","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(`
2937
+ `)}function aH(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 lH(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=ni(n,"alias");s!==void 0&&e.set(s.toLowerCase(),r)}return e}function dH(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)&&ni(s,"alias")?.toLowerCase()===r)return n}}function cH(t,e){for(let r of t.split(`
2938
+ `))if(/^\s*#?\s*_MEMBER_\s+\S/u.test(r)&&ni(r,"alias")===e)return!0;return!1}function uH(t){return/^[A-Za-z][A-Za-z0-9_-]*$/u.test(t)}function ni(t,e){let n=new RegExp(`(?:^|\\s)${e}=(?:"([^"]*)"|(\\S*))`).exec(t);return n===null?void 0:n[1]??n[2]??""}function mH(t,e,r){let n=`${e}=${ef(r)}`,s=new RegExp(`(^|\\s)${e}=(?:"[^"]*"|\\S*)`);return s.test(t)?t.replace(s,(i,o)=>`${o}${n}`):`${t.trimEnd()} ${n}`}function zb(t,e){let r=new RegExp(`(^|\\s)${e}=(?:"[^"]*"|\\S*)`);return t.replace(r,"").replace(/\s+/gu," ").trimEnd()}function ef(t){return/[\s"]/u.test(t)?`"${t.replace(/"/g,'\\"')}"`:t}function fH(t,e){let r=t.split(`
2939
2939
  `),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(`
2940
2940
  `);let s=r.length;for(;s>0&&r[s-1]==="";)s-=1;let i=r.slice(0,s).join(`
2941
2941
  `),o=r.slice(s).join(`
@@ -2943,7 +2943,7 @@ List native provider sessions in scope, or list recent managed runs with --runs.
2943
2943
 
2944
2944
  `:""}${e}${o.length>0?`
2945
2945
  ${o}`:`
2946
- `}`}function fH(t,e){let r=`#teamfile: ${e}`,n=t.indexOf(`
2946
+ `}`}function pH(t,e){let r=`#teamfile: ${e}`,n=t.indexOf(`
2947
2947
  `),s=n>=0?t.slice(0,n):t,i=n>=0?t.slice(n+1):"";return s===r?t:s.startsWith("#teamfile:")?i.length>0?`${r}
2948
2948
  ${i}`:`${r}
2949
2949
  `:t.length>0?`${r}
@@ -2952,16 +2952,16 @@ ${t}`:`${r}
2952
2952
  `),1}function zm(t,e,r){return t.stderr.write(`error: ${e}
2953
2953
  ${r}`),2}function tf(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_
2954
2954
  `),r.provider==="gemini"&&e.stderr.write(`${Bb.replace("%s",r.alias)}
2955
- `)}var ri,HB,XB,sl,Ym,Bb,Qm,Hb,Qr,Xb,ii=E(()=>{"use strict";tr();Fb();Li();ut();od();Ce();wt();rr();Km();Ks();ri=5,HB=`usage: lmctl lint <teamfile.lmctl>
2955
+ `)}var ri,XB,JB,nl,Ym,Bb,Qm,Hb,Qr,Xb,ii=E(()=>{"use strict";tr();Fb();Li();ut();id();Ce();wt();rr();Km();Ks();ri=5,XB=`usage: lmctl lint <teamfile.lmctl>
2956
2956
 
2957
2957
  Validate an lmctl teamfile and warn about stale or placeholder session ids.
2958
2958
  For opencode members with model=, lint also asks the local ACP provider to
2959
2959
  validate model= and effort= without sending a prompt.
2960
- `,XB=`usage: lmctl seed <teamfile.lmctl>
2960
+ `,JB=`usage: lmctl seed <teamfile.lmctl>
2961
2961
 
2962
2962
  Seed missing or placeholder session ids in an lmctl teamfile by calling each
2963
2963
  member's configured native provider.
2964
- `,sl=`usage: lmctl hire <teamfile.lmctl> <alias> --provider <name> [--sessiondir <dir>]
2964
+ `,nl=`usage: lmctl hire <teamfile.lmctl> <alias> --provider <name> [--sessiondir <dir>]
2965
2965
 
2966
2966
  Append an unseeded non-Lead _MEMBER_ line to an lmctl teamfile. Run lmctl seed
2967
2967
  after editing to create the provider session.
@@ -2974,18 +2974,18 @@ Refreshing the Lead drops its chat history; it re-reads durable-memory/ on
2974
2974
  re-seed.
2975
2975
  A member cannot refresh its own running session; run the refresh from a
2976
2976
  different member session or a plain operator shell.
2977
- `,Bb='notice: member "%s" uses provider=gemini \u2014 the Gemini CLI requires an API/enterprise Google account; personal Google subscriptions should use provider=agy (Antigravity).',Qm={existsSync:qB,statSync:BB,accessSync:WB},Hb=async t=>{let{seed:e}=await Promise.resolve().then(()=>(Lt(),Xd)),r=await e(t);return r.success?{sessionId:r.sessionId,warnings:r.warnings}:{error:r.error??"provider seed failed"}},Qr=Qm,Xb=id});var sk={};he(sk,{runClone:()=>TH});import{existsSync as rf,mkdirSync as pH,readFileSync as _H,readdirSync as hH,statSync as rk,writeFileSync as gH}from"node:fs";import{basename as Qb,dirname as yH,extname as EH,join as nk,resolve as ek}from"node:path";async function TH(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(wH),0;if(t.length!==2)return e.stderr.write(`usage: lmctl clone <source> <dest>
2978
- `),2;let[r,n]=t,s,i=r;try{if(/^http:\/\//i.test(r))throw new Error("plaintext http:// sources are not allowed; use https://");if(/^https:\/\//i.test(r))s=await SH(r);else{let d=ek(r);if(!rf(d))throw new Error(`source not found: ${r}`);let u=rk(d).isDirectory()?bH(d):d;s=_H(u,"utf8"),i=u}}catch(d){return e.stderr.write(`error: ${d instanceof Error?d.message:String(d)}
2979
- `),1}let o=ek(n),a=kH(o,i,n);if(rf(a))return e.stderr.write(`error: ${a} already exists.
2980
- `),1;let l=NH(IH(s));return pH(yH(a),{recursive:!0}),gH(a,l,"utf8"),e.stdout.write(`Cloned ${r} -> ${a}
2977
+ `,Bb='notice: member "%s" uses provider=gemini \u2014 the Gemini CLI requires an API/enterprise Google account; personal Google subscriptions should use provider=agy (Antigravity).',Qm={existsSync:BB,statSync:HB,accessSync:qB},Hb=async t=>{let{seed:e}=await Promise.resolve().then(()=>(Lt(),Hd)),r=await e(t);return r.success?{sessionId:r.sessionId,warnings:r.warnings}:{error:r.error??"provider seed failed"}},Qr=Qm,Xb=sd});var sk={};he(sk,{runClone:()=>vH});import{existsSync as rf,mkdirSync as _H,readFileSync as hH,readdirSync as gH,statSync as rk,writeFileSync as yH}from"node:fs";import{basename as Qb,dirname as EH,extname as wH,join as nk,resolve as ek}from"node:path";async function vH(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(TH),0;if(t.length!==2)return e.stderr.write(`usage: lmctl clone <source> <dest>
2978
+ `),2;let[r,n]=t,s,i=r;try{if(/^http:\/\//i.test(r))throw new Error("plaintext http:// sources are not allowed; use https://");if(/^https:\/\//i.test(r))s=await bH(r);else{let d=ek(r);if(!rf(d))throw new Error(`source not found: ${r}`);let u=rk(d).isDirectory()?kH(d):d;s=hH(u,"utf8"),i=u}}catch(d){return e.stderr.write(`error: ${d instanceof Error?d.message:String(d)}
2979
+ `),1}let o=ek(n),a=IH(o,i,n);if(rf(a))return e.stderr.write(`error: ${a} already exists.
2980
+ `),1;let l=AH(NH(s));return _H(EH(a),{recursive:!0}),yH(a,l,"utf8"),e.stdout.write(`Cloned ${r} -> ${a}
2981
2981
  `),e.stdout.write(`Edit ${a}; only _MEMBER_ lines are parsed, everything else is free-form.
2982
2982
  `),e.stdout.write(`After editing, run: lmctl lint ${a}
2983
2983
  `),e.stdout.write(`Then run: lmctl seed ${a}
2984
- `),0}async function SH(t){let e=new URL(t);for(let r=0;;r+=1){if(e.protocol!=="https:")throw new Error("HTTPS clone redirects must remain https://");let n=await fetch(e.href,{redirect:"manual"});if(n.url!==""&&new URL(n.url).protocol!=="https:")throw new Error("HTTPS clone redirects must remain https://");if(!vH.has(n.status)){if(!n.ok)throw new Error(`HTTP ${n.status}`);return await n.text()}if(r>=tk)throw new Error(`too many HTTPS redirects (maximum ${tk})`);let s=n.headers.get("location");if(s===null)throw new Error(`HTTP ${n.status} redirect missing Location header`);e=new URL(s,e)}}function bH(t){let e=hH(t).filter(r=>r.endsWith(".lmctl"));if(e.length===0)throw new Error(`no .lmctl files in source directory: ${t}`);if(e.length>1)throw new Error(`multiple .lmctl files in source directory: ${t}; specify the source file explicitly`);return nk(t,e[0])}function kH(t,e,r){if(r.endsWith("/")||rf(t)&&rk(t).isDirectory()){let n=Qb(e).endsWith(".lmctl")?Qb(e):"team.lmctl";return nk(t,n)}return EH(t)?t:`${t}.lmctl`}function IH(t){return t.split(`
2984
+ `),0}async function bH(t){let e=new URL(t);for(let r=0;;r+=1){if(e.protocol!=="https:")throw new Error("HTTPS clone redirects must remain https://");let n=await fetch(e.href,{redirect:"manual"});if(n.url!==""&&new URL(n.url).protocol!=="https:")throw new Error("HTTPS clone redirects must remain https://");if(!SH.has(n.status)){if(!n.ok)throw new Error(`HTTP ${n.status}`);return await n.text()}if(r>=tk)throw new Error(`too many HTTPS redirects (maximum ${tk})`);let s=n.headers.get("location");if(s===null)throw new Error(`HTTP ${n.status} redirect missing Location header`);e=new URL(s,e)}}function kH(t){let e=gH(t).filter(r=>r.endsWith(".lmctl"));if(e.length===0)throw new Error(`no .lmctl files in source directory: ${t}`);if(e.length>1)throw new Error(`multiple .lmctl files in source directory: ${t}; specify the source file explicitly`);return nk(t,e[0])}function IH(t,e,r){if(r.endsWith("/")||rf(t)&&rk(t).isDirectory()){let n=Qb(e).endsWith(".lmctl")?Qb(e):"team.lmctl";return nk(t,n)}return wH(t)?t:`${t}.lmctl`}function NH(t){return t.split(`
2985
2985
  `).map(e=>/^\s*_MEMBER_\s+\S/.test(e)?e.replace(/\s+sessionid=(?:"[^"]*"|\S+)/g,"").replace(/^(\s*_MEMBER_)\s+sessionid=(?:"[^"]*"|\S+)\s+/g,"$1 "):e).join(`
2986
- `)}function NH(t){return t.split(`
2986
+ `)}function AH(t){return t.split(`
2987
2987
  `).map(e=>/^\s*_MEMBER_\s+\S/.test(e)?e.replace(/\s+sessiondir=(?:"[^"]*"|\S+)/g,"").replace(/^(\s*_MEMBER_)\s+sessiondir=(?:"[^"]*"|\S+)\s+/g,"$1 "):e).join(`
2988
- `)}var wH,vH,tk,ik=E(()=>{"use strict";wH=`usage: lmctl clone <source> <dest>
2988
+ `)}var TH,SH,tk,ik=E(()=>{"use strict";TH=`usage: lmctl clone <source> <dest>
2989
2989
 
2990
2990
  Copy a teamfile and strip its session ids, producing a static editable template.
2991
2991
  <source> may be a .lmctl file, an https:// URL, or a directory containing
@@ -2995,15 +2995,15 @@ Examples:
2995
2995
  lmctl clone ./backend/backend.lmctl ./backend-v2/backend-v2.lmctl
2996
2996
  lmctl clone ./backend/ ./backend-v2/backend-v2.lmctl
2997
2997
  lmctl clone https://example.com/backend.lmctl ./backend-v2/backend-v2.lmctl
2998
- `;vH=new Set([301,302,303,307,308]),tk=10});var lk={};he(lk,{runPlan:()=>CH});import{existsSync as AH,mkdirSync as xH,writeFileSync as RH}from"node:fs";import{basename as ok,extname as ak,join as LH,resolve as OH}from"node:path";async function CH(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write($H),0;let r=te(t,["--team","--provider"],[]);if(r.error!==void 0)return e.stderr.write(`error: ${r.error}
2998
+ `;SH=new Set([301,302,303,307,308]),tk=10});var lk={};he(lk,{runPlan:()=>MH});import{existsSync as xH,mkdirSync as RH,writeFileSync as LH}from"node:fs";import{basename as ok,extname as ak,join as OH,resolve as $H}from"node:path";async function MH(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(CH),0;let r=te(t,["--team","--provider"],[]);if(r.error!==void 0)return e.stderr.write(`error: ${r.error}
2999
2999
  `),e.stderr.write(`usage: lmctl plan [options] <directory>
3000
3000
  `),2;if(r.positionals.length!==1)return e.stderr.write(`usage: lmctl plan [options] <directory>
3001
- `),2;let n=OH(r.positionals[0]);xH(n,{recursive:!0});let s=M(r,"--team")??ok(n),i=M(r,"--provider")??"claude",o=LH(n,MH(s));if(AH(o))return e.stderr.write(`error: ${o} already exists.
3002
- `),1;let a=jH({teamName:DH(s),leadProvider:i}),l=rl(a,nl({workdir:n,teamfile:o,date:new Date}));return RH(o,l.text,"utf8"),e.stdout.write(`Created ${o}
3001
+ `),2;let n=$H(r.positionals[0]);RH(n,{recursive:!0});let s=M(r,"--team")??ok(n),i=M(r,"--provider")??"claude",o=OH(n,DH(s));if(xH(o))return e.stderr.write(`error: ${o} already exists.
3002
+ `),1;let a=PH({teamName:jH(s),leadProvider:i}),l=tl(a,rl({workdir:n,teamfile:o,date:new Date}));return LH(o,l.text,"utf8"),e.stdout.write(`Created ${o}
3003
3003
  `),e.stdout.write(`Edit ${o}; only _MEMBER_ lines are parsed, everything else is free-form.
3004
3004
  `),e.stdout.write(`After editing, run: lmctl lint ${o}
3005
3005
  `),e.stdout.write(`Then run: lmctl seed ${o}
3006
- `),0}function MH(t){return ak(t)?t:`${t}.lmctl`}function DH(t){let e=ak(t);return e?ok(t,e):t}function jH(t){let{teamName:e,leadProvider:r}=t;return`# ${e}
3006
+ `),0}function DH(t){return ak(t)?t:`${t}.lmctl`}function jH(t){let e=ak(t);return e?ok(t,e):t}function PH(t){let{teamName:e,leadProvider:r}=t;return`# ${e}
3007
3007
 
3008
3008
  # Lead operating guide: https://lmctl.com/skills/lmctl-lead.md
3009
3009
 
@@ -3015,7 +3015,7 @@ _MEMBER_ alias=Coder provider=codex
3015
3015
  _MEMBER_ alias=Reviewer1 provider=codex
3016
3016
  _MEMBER_ alias=Reviewer2 provider=${r}
3017
3017
  _MEMBER_ alias=Reviewer3 provider=agy
3018
- `}var $H,dk=E(()=>{"use strict";Ce();Km();$H=`usage: lmctl plan [options] <directory>
3018
+ `}var CH,dk=E(()=>{"use strict";Ce();Km();CH=`usage: lmctl plan [options] <directory>
3019
3019
 
3020
3020
  Generate a starter lmctl team document template for a directory.
3021
3021
 
@@ -3030,8 +3030,8 @@ Examples:
3030
3030
 
3031
3031
  # Same shape, codex for the Lead and Reviewer2
3032
3032
  lmctl plan ./backend --provider codex
3033
- `});import{execFileSync as PH}from"node:child_process";import{resolve as ck}from"node:path";function FH(t){return t.filter(e=>e.state!=="retired")}function uk(t,e,r){if(r!==void 0){let a=e.findProjectByName(r);return a===null?N(t,`project not found: ${r}`):a}let n=t.cwd??process.cwd(),s;try{s=PH("git",["rev-parse","--show-toplevel"],{cwd:n,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return N(t,"terminal cannot infer a member from cwd because this directory is not in a git repo; use `lmctl terminal <teamfile> <alias>`")}let i=ck(s),o=e.listProjects().find(a=>ck(a.local_path)===i);return o===void 0?N(t,`terminal cannot infer a member from cwd ${i}; use \`lmctl terminal <teamfile> <alias>\``):o}function mk(t,e,r,n){if(n!==void 0){let i=e.findTeamByName(n);return i===null?N(t,`team not found: ${n}`):i}let s=e.getTeam(r.team_id);return s===null?N(t,`project ${r.name} has no assigned team; use --team <name>`):s}function fk(t,e,r,n){if(n!==void 0){let i=e.findTeamMemberByAlias(r.id,n);return i===null||i.state==="retired"?N(t,`member not found: ${n}`):i}let s=FH(e.listTeamMembers(r.id)).find(i=>i.role==="agent");return s===void 0?N(t,`team ${r.name} has no active agent member`):s}var pk=E(()=>{"use strict";Ce()});var gk={};he(gk,{SIZE_WARN_EST_TOKENS:()=>oi,estimateTokens:()=>hk,runTerminal:()=>BH});import{spawn as UH}from"node:child_process";import{statSync as WH}from"node:fs";async function BH(t,e){if(t.includes("--help")||t.includes("-h"))return YH(e);let r=te(t,["--project","--team","--alias","--run"],["--size","--json","--help"]);if(r.error!==void 0)return N(e,r.error);let n=M(r,"--run");if(n!==void 0){let s=Number.parseInt(n,10);if(!Number.isFinite(s)||s<=0||String(s)!==n)return N(e,`invalid --run "${n}" (expected a positive integer run id)`);if(r.positionals.length>0)return N(e,"--run is mutually exclusive with positional <teamfile>[:alias]");let i=["--team","--project","--size","--json"];for(let o of i)if(o==="--size"||o==="--json"?G(r,o):M(r,o)!==void 0)return N(e,`--run is mutually exclusive with ${o}`);try{return await O(e,async o=>{let a=M(r,"--alias"),l=fw(o,s,a);return"err"in l?N(e,l.err):nf(e,{provider:l.ok.provider,sessionid:l.ok.sessionid,sessiondir:l.ok.sessiondir,...l.ok.model!==void 0?{model:l.ok.model}:{}})})}catch(o){return We(e,o)}}if(r.positionals.length>0){let s=["--team","--project","--size","--alias","--json"];for(let l of s)if(l==="--size"||l==="--json"?G(r,l):M(r,l)!==void 0)return N(e,`positional <teamfile>[:alias] is mutually exclusive with ${l} (alias is the SECOND POSITIONAL: \`terminal <teamfile> <alias>\`).`);if(r.positionals.length>2)return N(e,`too many positionals (${r.positionals.length}); expected <teamfile>[:alias] [alias]`);let i=r.positionals[0],o=r.positionals[1],a=kr(qH,{target:i,alias:o,flags:{}});return a.mode==="error"?N(e,a.message):a.mode!=="ai-team"?N(e,`internal: terminal positional yielded unexpected mode "${a.mode}"`):a.alias===void 0?N(e,"terminal: alias required for the teamfile target"):await O(e,l=>HH(e,a.teamfile,a.alias,l))}try{return await O(e,async s=>{let i=GH(e,s,r);if(typeof i=="number")return i;let o=M(r,"--alias");return G(r,"--size")?KH(e,s,i,o,G(r,"--json")):VH(e,s,i,o)})}catch(s){return We(e,s)}}async function HH(t,e,r,n){let s;try{s=Me(e,r,n)}catch(c){return c instanceof ve?N(t,c.message):We(t,c)}let i=ar(n,{receiver_teamfile:s.teamfile,receiver_alias:s.alias,sender_teamfile:s.teamfile,sender_alias:"terminal",ttlMs:br()});if(!i.acquired)return N(t,`${s.alias} is busy/held by ${i.current.sender_alias} (${i.current.sender_teamfile}) since ${i.current.started_at}`);let o=aS({teamfile:s.teamfile,alias:s.alias}),a=null,l=null,d=null;try{n.setTerminalLock(o),l=XH(n,s),a=setInterval(()=>{try{!n.heartbeatTerminalLock(o.teamfile,o.alias,o.lock_id,new Date().toISOString())&&a!==null&&(clearInterval(a),a=null)}catch{}},lS()),a.unref?.();try{Bn(t,rt(s.teamfile),s.teamfile)}catch{}return d=await nf(t,{provider:s.provider,sessionid:s.sessionid,sessiondir:s.sessiondir,...s.model!==void 0?{model:s.model}:{},isLead:s.isLead}),d}finally{a!==null&&clearInterval(a),n.clearTerminalLock(o.teamfile,o.alias,o.lock_id),n.releaseAgentInflight(i.lease),JH(n,l,d)}}function XH(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,...e.model!==void 0?{model:e.model}:{}})}).id}catch{return null}}function JH(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 nf(t,e){let{provider:r,sessionid:n,sessiondir:s,model:i}=e;if(!Na(r))return N(t,`no resume incantation for provider "${r}"`);if(!_T.test(n))return N(t,"refusing to resume: malformed sessionid");let o=ju(r,n,{isLead:e.isLead,model:i,onModelIgnored:d=>{let c=`warning: ${d.provider} terminal ignored model=${d.model}: ${d.reason}`;t.stderr.write(`${c}
3034
- `),Oe({event:"model_ignored",provider:d.provider,model:d.model,reason:d.reason})}});if(o===null||o.length===0)return N(t,`no resume incantation for provider "${r}"`);let[a,...l]=o;return await new Promise(d=>{let c=UH(a,l,{stdio:"inherit",cwd:s,env:Fe(process.env,s,n,"terminal")});c.on("error",u=>{d(N(t,`failed to launch ${a}: ${u.message}`))}),c.on("exit",u=>d(u??0))})}function GH(t,e,r){let n=M(r,"--team");if(n!==void 0){let o=e.findTeamByName(n);return o===null?N(t,`team not found: ${n}`):o}let s=uk(t,e,M(r,"--project"));return typeof s=="number"?s:mk(t,e,s,void 0)}async function VH(t,e,r,n){let s=fk(t,e,r,n);if(typeof s=="number")return s;let i=s.sessionid;return i===null||i.trim().length===0?N(t,`member ${s.alias} has no session yet \u2014 run \`lmctl team seed ${r.name}\` first`):nf(t,{provider:Xe(s),sessionid:i,sessiondir:s.sessiondir,...s.model!==null&&s.model!==void 0?{model:s.model}:{}})}function hk(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=WH(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 KH(t,e,r,n,s){let i;if(n!==void 0){let a=e.findTeamMemberByAlias(r.id,n);if(a===null||a.state==="retired")return N(t,`member not found: ${n}`);i=[a]}else i=e.listTeamMembers(r.id).filter(a=>a.state!=="retired"&&a.sessionid!==null);let o=[];for(let a of i){let l=a.sessionid;if(l===null)continue;let d=Xe(a),c=a.model??null,u=null;Na(d)&&(u=await Be(l,d));let m=hk(u),f=m.est>oi;o.push({alias:a.alias,provider:d,sessionid:l,messages:m.messages,bytes:m.bytes,est_tokens:m.est,estimate:!0,over_guide:f,model:c,resume_incantation:f?Aa(d,l,c!==null?{model:c}:{}):null})}if(s)return le(t,{estimate:!0,legend:_k,guide_tokens:oi,members:o}),0;t.stdout.write(`session size \u2014 ESTIMATE only (nothing is changed automatically)
3033
+ `});import{execFileSync as FH}from"node:child_process";import{resolve as ck}from"node:path";function UH(t){return t.filter(e=>e.state!=="retired")}function uk(t,e,r){if(r!==void 0){let a=e.findProjectByName(r);return a===null?N(t,`project not found: ${r}`):a}let n=t.cwd??process.cwd(),s;try{s=FH("git",["rev-parse","--show-toplevel"],{cwd:n,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return N(t,"terminal cannot infer a member from cwd because this directory is not in a git repo; use `lmctl terminal <teamfile> <alias>`")}let i=ck(s),o=e.listProjects().find(a=>ck(a.local_path)===i);return o===void 0?N(t,`terminal cannot infer a member from cwd ${i}; use \`lmctl terminal <teamfile> <alias>\``):o}function mk(t,e,r,n){if(n!==void 0){let i=e.findTeamByName(n);return i===null?N(t,`team not found: ${n}`):i}let s=e.getTeam(r.team_id);return s===null?N(t,`project ${r.name} has no assigned team; use --team <name>`):s}function fk(t,e,r,n){if(n!==void 0){let i=e.findTeamMemberByAlias(r.id,n);return i===null||i.state==="retired"?N(t,`member not found: ${n}`):i}let s=UH(e.listTeamMembers(r.id)).find(i=>i.role==="agent");return s===void 0?N(t,`team ${r.name} has no active agent member`):s}var pk=E(()=>{"use strict";Ce()});var gk={};he(gk,{SIZE_WARN_EST_TOKENS:()=>oi,estimateTokens:()=>hk,runTerminal:()=>HH});import{spawn as WH}from"node:child_process";import{statSync as qH}from"node:fs";async function HH(t,e){if(t.includes("--help")||t.includes("-h"))return zH(e);let r=te(t,["--project","--team","--alias","--run"],["--size","--json","--help"]);if(r.error!==void 0)return N(e,r.error);let n=M(r,"--run");if(n!==void 0){let s=Number.parseInt(n,10);if(!Number.isFinite(s)||s<=0||String(s)!==n)return N(e,`invalid --run "${n}" (expected a positive integer run id)`);if(r.positionals.length>0)return N(e,"--run is mutually exclusive with positional <teamfile>[:alias]");let i=["--team","--project","--size","--json"];for(let o of i)if(o==="--size"||o==="--json"?G(r,o):M(r,o)!==void 0)return N(e,`--run is mutually exclusive with ${o}`);try{return await O(e,async o=>{let a=M(r,"--alias"),l=fw(o,s,a);return"err"in l?N(e,l.err):nf(e,{provider:l.ok.provider,sessionid:l.ok.sessionid,sessiondir:l.ok.sessiondir,...l.ok.model!==void 0?{model:l.ok.model}:{}})})}catch(o){return We(e,o)}}if(r.positionals.length>0){let s=["--team","--project","--size","--alias","--json"];for(let l of s)if(l==="--size"||l==="--json"?G(r,l):M(r,l)!==void 0)return N(e,`positional <teamfile>[:alias] is mutually exclusive with ${l} (alias is the SECOND POSITIONAL: \`terminal <teamfile> <alias>\`).`);if(r.positionals.length>2)return N(e,`too many positionals (${r.positionals.length}); expected <teamfile>[:alias] [alias]`);let i=r.positionals[0],o=r.positionals[1],a=kr(BH,{target:i,alias:o,flags:{}});return a.mode==="error"?N(e,a.message):a.mode!=="ai-team"?N(e,`internal: terminal positional yielded unexpected mode "${a.mode}"`):a.alias===void 0?N(e,"terminal: alias required for the teamfile target"):await O(e,l=>XH(e,a.teamfile,a.alias,l))}try{return await O(e,async s=>{let i=VH(e,s,r);if(typeof i=="number")return i;let o=M(r,"--alias");return G(r,"--size")?YH(e,s,i,o,G(r,"--json")):KH(e,s,i,o)})}catch(s){return We(e,s)}}async function XH(t,e,r,n){let s;try{s=Me(e,r,n)}catch(c){return c instanceof ve?N(t,c.message):We(t,c)}let i=ar(n,{receiver_teamfile:s.teamfile,receiver_alias:s.alias,sender_teamfile:s.teamfile,sender_alias:"terminal",ttlMs:br()});if(!i.acquired)return N(t,`${s.alias} is busy/held by ${i.current.sender_alias} (${i.current.sender_teamfile}) since ${i.current.started_at}`);let o=aS({teamfile:s.teamfile,alias:s.alias}),a=null,l=null,d=null;try{n.setTerminalLock(o),l=JH(n,s),a=setInterval(()=>{try{!n.heartbeatTerminalLock(o.teamfile,o.alias,o.lock_id,new Date().toISOString())&&a!==null&&(clearInterval(a),a=null)}catch{}},lS()),a.unref?.();try{Bn(t,rt(s.teamfile),s.teamfile)}catch{}return d=await nf(t,{provider:s.provider,sessionid:s.sessionid,sessiondir:s.sessiondir,...s.model!==void 0?{model:s.model}:{},isLead:s.isLead}),d}finally{a!==null&&clearInterval(a),n.clearTerminalLock(o.teamfile,o.alias,o.lock_id),n.releaseAgentInflight(i.lease),GH(n,l,d)}}function JH(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,...e.model!==void 0?{model:e.model}:{}})}).id}catch{return null}}function GH(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 nf(t,e){let{provider:r,sessionid:n,sessiondir:s,model:i}=e;if(!Ia(r))return N(t,`no resume incantation for provider "${r}"`);if(!_T.test(n))return N(t,"refusing to resume: malformed sessionid");let o=ju(r,n,{isLead:e.isLead,model:i,onModelIgnored:d=>{let c=`warning: ${d.provider} terminal ignored model=${d.model}: ${d.reason}`;t.stderr.write(`${c}
3034
+ `),Oe({event:"model_ignored",provider:d.provider,model:d.model,reason:d.reason})}});if(o===null||o.length===0)return N(t,`no resume incantation for provider "${r}"`);let[a,...l]=o;return await new Promise(d=>{let c=WH(a,l,{stdio:"inherit",cwd:s,env:Fe(process.env,s,n,"terminal")});c.on("error",u=>{d(N(t,`failed to launch ${a}: ${u.message}`))}),c.on("exit",u=>d(u??0))})}function VH(t,e,r){let n=M(r,"--team");if(n!==void 0){let o=e.findTeamByName(n);return o===null?N(t,`team not found: ${n}`):o}let s=uk(t,e,M(r,"--project"));return typeof s=="number"?s:mk(t,e,s,void 0)}async function KH(t,e,r,n){let s=fk(t,e,r,n);if(typeof s=="number")return s;let i=s.sessionid;return i===null||i.trim().length===0?N(t,`member ${s.alias} has no session yet \u2014 run \`lmctl team seed ${r.name}\` first`):nf(t,{provider:Xe(s),sessionid:i,sessiondir:s.sessiondir,...s.model!==null&&s.model!==void 0?{model:s.model}:{}})}function hk(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=qH(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 YH(t,e,r,n,s){let i;if(n!==void 0){let a=e.findTeamMemberByAlias(r.id,n);if(a===null||a.state==="retired")return N(t,`member not found: ${n}`);i=[a]}else i=e.listTeamMembers(r.id).filter(a=>a.state!=="retired"&&a.sessionid!==null);let o=[];for(let a of i){let l=a.sessionid;if(l===null)continue;let d=Xe(a),c=a.model??null,u=null;Ia(d)&&(u=await Be(l,d));let m=hk(u),f=m.est>oi;o.push({alias:a.alias,provider:d,sessionid:l,messages:m.messages,bytes:m.bytes,est_tokens:m.est,estimate:!0,over_guide:f,model:c,resume_incantation:f?Na(d,l,c!==null?{model:c}:{}):null})}if(s)return le(t,{estimate:!0,legend:_k,guide_tokens:oi,members:o}),0;t.stdout.write(`session size \u2014 ESTIMATE only (nothing is changed automatically)
3035
3035
  `),t.stdout.write(`${_k}
3036
3036
  `);for(let a of o){let l=a.messages===null?"?":String(a.messages),d=a.bytes===null?"?":String(a.bytes);t.stdout.write(`${a.alias} ${a.provider} msgs=${l} bytes=${d} ~${a.est_tokens} tok (rough estimate)
3037
3037
  `),a.over_guide&&t.stdout.write(` \u26A0 ${a.alias}: estimated ~${a.est_tokens} tokens \u2014 ESTIMATE only, exceeds the 200K guide.
@@ -3039,7 +3039,7 @@ Examples:
3039
3039
  session yourself:
3040
3040
  ${a.resume_incantation??"(no resume incantation for provider "+a.provider+")"}
3041
3041
  (or: lmctl terminal --team ${r.name} --alias ${a.alias})
3042
- `)}return 0}function YH(t){return t.stdout.write(`usage: lmctl terminal <teamfile>:<alias>
3042
+ `)}return 0}function zH(t){return t.stdout.write(`usage: lmctl terminal <teamfile>:<alias>
3043
3043
  lmctl terminal <teamfile> <alias>
3044
3044
  lmctl terminal --run <id> [--alias A]
3045
3045
  lmctl terminal [--project P] [--team T] [--alias A] [--size] [--json]
@@ -3070,7 +3070,7 @@ Examples:
3070
3070
  tokens it surfaces the resume incantation so YOU can
3071
3071
  open & self-compact. Nothing is ever changed
3072
3072
  automatically; ${oi} is a guide, not a gate.
3073
- `),0}var qH,oi,_k,yk=E(()=>{"use strict";ct();nr();Ce();pk();wt();tr();ut();Ks();lr();Ea();wm();ca();me();qH={name:"terminal",allowsBareTeamfile:!1,supportsRaw:!1},oi=2e5,_k="est = rough local heuristic (~4 chars/token), NOT an exact provider token count \u2014 open the session to verify before acting."});import{createHash as zH,randomBytes as ZH}from"node:crypto";import{readFile as QH}from"node:fs/promises";function Ek(t=new Date,e=ZH(4)){let r=t.getUTCFullYear().toString().padStart(4,"0"),n=(t.getUTCMonth()+1).toString().padStart(2,"0"),s=t.getUTCDate().toString().padStart(2,"0"),i=t.getUTCHours().toString().padStart(2,"0"),o=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}-${i}${o}${a}-${l}`}function e2(t){return zH("sha256").update(t).digest("hex")}async function wk(t){return(await Promise.all(t.map(async({bundlePath:r,absPath:n})=>{let s=await QH(n);return{path:r,sha256:e2(s),size:s.byteLength}}))).sort((r,n)=>r.path<n.path?-1:r.path>n.path?1:0)}function Tk(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 sf=E(()=>{"use strict"});import{spawnSync as vk}from"node:child_process";import{mkdir as of,writeFile as Sk,readFile as t2,rm as bk}from"node:fs/promises";import{tmpdir as r2}from"node:os";import{dirname as kk,join as af}from"node:path";async function Ik(t){let e=t.stagingDir??af(r2(),`lmctl-diag-${t.ticketId}`),r=af(e,`diagnostic-${t.ticketId}`);await of(r,{recursive:!0});let n=[],s=async(u,m)=>{let f=af(r,u);if(await of(kk(f),{recursive:!0}),typeof m=="string")await Sk(f,m);else{let p=m.buffer.slice(m.byteOffset,m.byteOffset+m.byteLength);await Sk(f,new Uint8Array(p))}n.push({bundlePath:u,absPath:f})},i=u=>`${JSON.stringify(u,null,2)}
3073
+ `),0}var BH,oi,_k,yk=E(()=>{"use strict";ct();nr();Ce();pk();wt();tr();ut();Ks();lr();Ea();wm();ca();me();BH={name:"terminal",allowsBareTeamfile:!1,supportsRaw:!1},oi=2e5,_k="est = rough local heuristic (~4 chars/token), NOT an exact provider token count \u2014 open the session to verify before acting."});import{createHash as ZH,randomBytes as QH}from"node:crypto";import{readFile as e2}from"node:fs/promises";function Ek(t=new Date,e=QH(4)){let r=t.getUTCFullYear().toString().padStart(4,"0"),n=(t.getUTCMonth()+1).toString().padStart(2,"0"),s=t.getUTCDate().toString().padStart(2,"0"),i=t.getUTCHours().toString().padStart(2,"0"),o=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}-${i}${o}${a}-${l}`}function t2(t){return ZH("sha256").update(t).digest("hex")}async function wk(t){return(await Promise.all(t.map(async({bundlePath:r,absPath:n})=>{let s=await e2(n);return{path:r,sha256:t2(s),size:s.byteLength}}))).sort((r,n)=>r.path<n.path?-1:r.path>n.path?1:0)}function Tk(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 sf=E(()=>{"use strict"});import{spawnSync as vk}from"node:child_process";import{mkdir as of,writeFile as Sk,readFile as r2,rm as bk}from"node:fs/promises";import{tmpdir as n2}from"node:os";import{dirname as kk,join as af}from"node:path";async function Ik(t){let e=t.stagingDir??af(n2(),`lmctl-diag-${t.ticketId}`),r=af(e,`diagnostic-${t.ticketId}`);await of(r,{recursive:!0});let n=[],s=async(u,m)=>{let f=af(r,u);if(await of(kk(f),{recursive:!0}),typeof m=="string")await Sk(f,m);else{let p=m.buffer.slice(m.byteOffset,m.byteOffset+m.byteLength);await Sk(f,new Uint8Array(p))}n.push({bundlePath:u,absPath:f})},i=u=>`${JSON.stringify(u,null,2)}
3074
3074
  `;if(t.data.serve!==void 0){let u=t.data.serve,m=u.pid===null?`no daemon (source=${u.pid_source})
3075
3075
  `:`${u.pid}
3076
3076
  # source=${u.pid_source} alive=${String(u.pid_alive)}
@@ -3088,29 +3088,29 @@ Examples:
3088
3088
  `:`# source=${m}
3089
3089
  # tail_lines=${u.tail_lines}
3090
3090
  `;await s("intents/recent.log",`${f}${u.tail}${u.tail.length>0?`
3091
- `:""}`)}if(await s("README.md",n2(t)),t.sanitized)for(let u of n){let m=await t2(u.absPath);try{If(u.bundlePath,m.toString("utf8"))}catch(f){throw await bk(e,{recursive:!0,force:!0}),f instanceof Lr,f}}let o=await wk(n),a=Tk({ticketId:t.ticketId,lmctlNextVersion:t.lmctlNextVersion,nodeVersion:process.version,platform:process.platform,generatedAt:t.generatedAt??new Date,sanitized:t.sanitized,files:o});await s("manifest.json",i(a)),await of(kk(t.outputPath),{recursive:!0});let l=vk("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 d=vk("stat",["-c","%s",t.outputPath],{encoding:"utf8"}),c=Number.parseInt((d.stdout??"0").trim(),10)||0;return await bk(e,{recursive:!0,force:!0}),{outputPath:t.outputPath,manifest:a,bundleSizeBytes:c}}function n2(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(`
3092
- `)}var Nk=E(()=>{"use strict";sf();li()});import{spawnSync as s2}from"node:child_process";import{stat as i2}from"node:fs/promises";async function Ak(t){try{if(!(await i2(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 o2(t);case"hq":return a2(t)}}function o2(t){let r=s2("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 a2(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 xk=E(()=>{"use strict"});var Lk={};he(Lk,{parseDiagnoseArgs:()=>Rk,runDiagnose:()=>c2});import{tmpdir as l2}from"node:os";import{join as d2}from"node:path";async function c2(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${f2()}
3091
+ `:""}`)}if(await s("README.md",s2(t)),t.sanitized)for(let u of n){let m=await r2(u.absPath);try{If(u.bundlePath,m.toString("utf8"))}catch(f){throw await bk(e,{recursive:!0,force:!0}),f instanceof Lr,f}}let o=await wk(n),a=Tk({ticketId:t.ticketId,lmctlNextVersion:t.lmctlNextVersion,nodeVersion:process.version,platform:process.platform,generatedAt:t.generatedAt??new Date,sanitized:t.sanitized,files:o});await s("manifest.json",i(a)),await of(kk(t.outputPath),{recursive:!0});let l=vk("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 d=vk("stat",["-c","%s",t.outputPath],{encoding:"utf8"}),c=Number.parseInt((d.stdout??"0").trim(),10)||0;return await bk(e,{recursive:!0,force:!0}),{outputPath:t.outputPath,manifest:a,bundleSizeBytes:c}}function s2(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(`
3092
+ `)}var Nk=E(()=>{"use strict";sf();li()});import{spawnSync as i2}from"node:child_process";import{stat as o2}from"node:fs/promises";async function Ak(t){try{if(!(await o2(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 a2(t);case"hq":return l2(t)}}function a2(t){let r=i2("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 l2(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 xk=E(()=>{"use strict"});var Lk={};he(Lk,{parseDiagnoseArgs:()=>Rk,runDiagnose:()=>u2});import{tmpdir as d2}from"node:os";import{join as c2}from"node:path";async function u2(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${p2()}
3093
3093
  `),0;let r=Rk(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
3094
3094
  `),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)
3095
3095
  `),2;if(r.upload&&r.internalS3)return e.stderr.write(`error: pick one of --upload (HQ) or --internal-s3, not both
3096
- `),2;let n=Ek(),s=r.outputPath??m2(n),i=r.internalS3?"internal-s3":r.upload?"hq":"local";try{return await O(e,async o=>{let a=await Af({dal:o,include:r.include,dbPath:Q(),intentLog:process.env.LMCTL_INTENT_LOG}),l;try{l=await Ik({ticketId:n,data:a,outputPath:s,lmctlNextVersion:bt(),sanitized:!r.noSanitize})}catch(u){if(u instanceof Lr)return e.stderr.write(`sanitization failed: ${u.message}
3096
+ `),2;let n=Ek(),s=r.outputPath??f2(n),i=r.internalS3?"internal-s3":r.upload?"hq":"local";try{return await O(e,async o=>{let a=await Af({dal:o,include:r.include,dbPath:Q(),intentLog:process.env.LMCTL_INTENT_LOG}),l;try{l=await Ik({ticketId:n,data:a,outputPath:s,lmctlNextVersion:bt(),sanitized:!r.noSanitize})}catch(u){if(u instanceof Lr)return e.stderr.write(`sanitization failed: ${u.message}
3097
3097
  `),2;throw u}let d=await Ak({mode:i,bundlePath:l.outputPath,ticketId:n,hqUrl:r.hqUrl}),c={ticket_id:n,bundle:l.outputPath,bundle_size_bytes:l.bundleSizeBytes,sections:Object.keys(a).sort(),sanitized:!r.noSanitize,upload:d,manifest_files:l.manifest.files.length};return r.json?e.stdout.write(`${JSON.stringify(c,null,2)}
3098
3098
  `):(e.stdout.write(`ticket: ${n}
3099
3099
  `),e.stdout.write(`bundle: ${l.outputPath} (${l.bundleSizeBytes} bytes, ${l.manifest.files.length} files)
3100
3100
  `),e.stdout.write(`upload[${d.mode}]: ${d.ok?"ok":"noop"} \u2014 ${d.message}
3101
3101
  `)),d.ok||i==="local"?0:1})}catch(o){return e.stderr.write(`diagnose failed: ${o instanceof Error?o.message:String(o)}
3102
- `),1}}function Rk(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 i=t[++n];if(i===void 0||i.startsWith("--"))return"missing value for --output";e.outputPath=i;continue}if(s==="--upload"){e.upload=!0;continue}if(s==="--internal-s3"){e.internalS3=!0;continue}if(s==="--hq"){let i=t[++n];if(i===void 0||i.startsWith("--"))return"missing value for --hq";e.hqUrl=i,e.upload=!0;continue}if(s==="--include"){let i=t[++n];if(i===void 0||i.startsWith("--"))return"missing value for --include";if(!u2(i))return`unknown section: ${i} (expected one of ${di.join(", ")})`;r.push(i);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 u2(t){return di.includes(t)}function m2(t){return d2(l2(),`lmctl-diag-${t}.tar.gz`)}function f2(){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(`
3103
- `)}var Ok=E(()=>{"use strict";ts();Nk();sf();li();xk();Ye();Ce()});var Pk={};he(Pk,{ATTENTION_STATES:()=>cf,DAEMON_INTERVAL_FAST_MS:()=>df,REQUIRED_TEAM_ALIASES:()=>$k,chooseDiagnoses:()=>Dk,collectEvidence:()=>Mk,diagnose:()=>Ck,renderReport:()=>jk,runDiagnosePrompt:()=>h2});function Ck(t,e){let r=Mk(t,e),n=Dk(r);return jk(r,n)}function Mk(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:qs(),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=_2(s.text),n.prompt.created_at=s.created_at,n.prompt.completed_at=s.completed_at,n.prompt.job_id=s.job_id),n.prompt.job_id!==void 0)try{let i=t.getJob(n.prompt.job_id);if(i!==null&&(n.job.exists=!0,n.job.status=i.status,n.job.attempt_count=i.attempt_count,n.job.last_error=i.last_error,n.job.available_at=i.available_at,n.job.locked_by=i.locked_by,n.job.run_id=i.run_id,i.run_id!==null))try{let o=t.getRun(i.run_id);if(o!==null){n.run.exists=!0,n.run.id=o.id,n.run.current_state=o.current_state,n.run.terminal_state=o.terminal_state,n.run.started_at=o.started_at,n.run.ended_at=o.ended_at;let a="__paused__:";n.run.paused_step=o.current_state!==null&&o.current_state.startsWith(a)?o.current_state.slice(a.length):null,n.run.paused_at=o.paused_at}}catch{n.run.sectionAvailable=!1}}catch{n.job.sectionAvailable=!1}if(n.prompt.project_id!==void 0)try{let i=t.getProject(n.prompt.project_id);if(i!==null){n.project.exists=!0,n.project.id=i.id,n.project.name=i.name,n.project.local_path=i.local_path,n.project.test_command=i.test_command,n.project.workflow_name=i.workflow_name,n.project.team_id=i.team_id;try{n.project.workflow_name_resolves=t.getWorkflowByName(i.workflow_name)!==null}catch{n.project.workflow_name_resolves=!1}}}catch{n.project.sectionAvailable=!1}if(n.project.id!==void 0)try{let i=t.listProjectWorkflows(n.project.id);n.workflows.count=i.length;for(let o of i){let a=`workflow_id=${o.workflow_id}`,l=0,d=null;try{let u=t.listWorkflows().find(m=>m.id===o.workflow_id);u!==void 0&&(a=u.name,l=u.version,d=u.source_uri)}catch{}n.workflows.rows.push({workflow_name:a,version:l,enabled:o.enabled,source_uri:d})}}catch{n.workflows.sectionAvailable=!1}if(n.project.team_id!==void 0)try{n.team.teamId=n.project.team_id;let i=t.listTeamMembers(n.project.team_id);for(let a of i)n.team.members.push({alias:a.alias,provider:a.provider,sessionid:a.sessionid,sessiondir:a.sessiondir,state:a.state,state_reason:a.state_reason,state_updated_at:a.state_updated_at});let o=new Set(i.map(a=>a.alias));n.team.missingAliases=$k.filter(a=>!o.has(a))}catch{n.team.sectionAvailable=!1}return n.daemon.workerPid=null,n.daemon.lastTickAt=null,n}function Dk(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>df&&e.push({cause:`Daemon poll interval is ${t.daemon.intervalMs}ms (${Math.round(t.daemon.intervalMs/1e3)}s); WT/dev expected <=${df}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:"The workflow/project CLI surface is retired; inspect the dormant DB rows or migrate this project to a .lmctl teamfile 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=>cf.has(s.state)):[];if(t.run.exists&&(t.run.paused_step??null)!==null||r.length>0){let s=t.run.paused_step??null,i=r.map(a=>a.alias).join(", "),o=s!==null&&i.length>0?`Run paused at ${s} awaiting operator escalation decision (member ${i} attention_needed)`:s!==null?`Run paused at ${s} awaiting operator escalation decision`:`Team member(s) ${i} awaiting operator attention`;e.push({cause:o,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 jk(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: ${p2(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 i of t.workflows.rows)r.push(` - ${i.workflow_name} v${i.version} enabled=${i.enabled===1?"true":"false"} source=${i.source_uri??"null"}`)}if(r.push(""),r.push("[TEAM MEMBERS FOR PROJECT'S DEFAULT TEAM]"),!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 i of t.team.members)r.push(` - alias=${i.alias} provider=${i.provider} state=${i.state} sessionid=${i.sessionid??"null"} sessiondir=${i.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(i=>cf.has(i.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 i=t.run.paused_at??t.run.started_at??"?";r.push(` paused_step: ${s} (started: ${i})`)}if(n.length>0){let i=n.map(o=>`${o.alias} (state=${o.state}${o.state_updated_at?` since ${o.state_updated_at}`:""}${o.state_reason?`, reason="${o.state_reason}"`:""})`).join(", ");r.push(` members awaiting operator: ${i}`)}else r.push(" members awaiting operator: (none flagged on team)");r.push(" next action expected: operator response via /admin or webcli escalations verb"),r.push("")}if(r.push("[DAEMON STATE]"),r.push(` worker pid: ${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 i of e)r.push(` - ${i.cause}`),r.push(` -> ${i.action}`);return r.join(`
3102
+ `),1}}function Rk(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 i=t[++n];if(i===void 0||i.startsWith("--"))return"missing value for --output";e.outputPath=i;continue}if(s==="--upload"){e.upload=!0;continue}if(s==="--internal-s3"){e.internalS3=!0;continue}if(s==="--hq"){let i=t[++n];if(i===void 0||i.startsWith("--"))return"missing value for --hq";e.hqUrl=i,e.upload=!0;continue}if(s==="--include"){let i=t[++n];if(i===void 0||i.startsWith("--"))return"missing value for --include";if(!m2(i))return`unknown section: ${i} (expected one of ${di.join(", ")})`;r.push(i);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 m2(t){return di.includes(t)}function f2(t){return c2(d2(),`lmctl-diag-${t}.tar.gz`)}function p2(){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(`
3103
+ `)}var Ok=E(()=>{"use strict";ts();Nk();sf();li();xk();Ye();Ce()});var Pk={};he(Pk,{ATTENTION_STATES:()=>cf,DAEMON_INTERVAL_FAST_MS:()=>df,REQUIRED_TEAM_ALIASES:()=>$k,chooseDiagnoses:()=>Dk,collectEvidence:()=>Mk,diagnose:()=>Ck,renderReport:()=>jk,runDiagnosePrompt:()=>g2});function Ck(t,e){let r=Mk(t,e),n=Dk(r);return jk(r,n)}function Mk(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:qs(),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=h2(s.text),n.prompt.created_at=s.created_at,n.prompt.completed_at=s.completed_at,n.prompt.job_id=s.job_id),n.prompt.job_id!==void 0)try{let i=t.getJob(n.prompt.job_id);if(i!==null&&(n.job.exists=!0,n.job.status=i.status,n.job.attempt_count=i.attempt_count,n.job.last_error=i.last_error,n.job.available_at=i.available_at,n.job.locked_by=i.locked_by,n.job.run_id=i.run_id,i.run_id!==null))try{let o=t.getRun(i.run_id);if(o!==null){n.run.exists=!0,n.run.id=o.id,n.run.current_state=o.current_state,n.run.terminal_state=o.terminal_state,n.run.started_at=o.started_at,n.run.ended_at=o.ended_at;let a="__paused__:";n.run.paused_step=o.current_state!==null&&o.current_state.startsWith(a)?o.current_state.slice(a.length):null,n.run.paused_at=o.paused_at}}catch{n.run.sectionAvailable=!1}}catch{n.job.sectionAvailable=!1}if(n.prompt.project_id!==void 0)try{let i=t.getProject(n.prompt.project_id);if(i!==null){n.project.exists=!0,n.project.id=i.id,n.project.name=i.name,n.project.local_path=i.local_path,n.project.test_command=i.test_command,n.project.workflow_name=i.workflow_name,n.project.team_id=i.team_id;try{n.project.workflow_name_resolves=t.getWorkflowByName(i.workflow_name)!==null}catch{n.project.workflow_name_resolves=!1}}}catch{n.project.sectionAvailable=!1}if(n.project.id!==void 0)try{let i=t.listProjectWorkflows(n.project.id);n.workflows.count=i.length;for(let o of i){let a=`workflow_id=${o.workflow_id}`,l=0,d=null;try{let u=t.listWorkflows().find(m=>m.id===o.workflow_id);u!==void 0&&(a=u.name,l=u.version,d=u.source_uri)}catch{}n.workflows.rows.push({workflow_name:a,version:l,enabled:o.enabled,source_uri:d})}}catch{n.workflows.sectionAvailable=!1}if(n.project.team_id!==void 0)try{n.team.teamId=n.project.team_id;let i=t.listTeamMembers(n.project.team_id);for(let a of i)n.team.members.push({alias:a.alias,provider:a.provider,sessionid:a.sessionid,sessiondir:a.sessiondir,state:a.state,state_reason:a.state_reason,state_updated_at:a.state_updated_at});let o=new Set(i.map(a=>a.alias));n.team.missingAliases=$k.filter(a=>!o.has(a))}catch{n.team.sectionAvailable=!1}return n.daemon.workerPid=null,n.daemon.lastTickAt=null,n}function Dk(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>df&&e.push({cause:`Daemon poll interval is ${t.daemon.intervalMs}ms (${Math.round(t.daemon.intervalMs/1e3)}s); WT/dev expected <=${df}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:"The workflow/project CLI surface is retired; inspect the dormant DB rows or migrate this project to a .lmctl teamfile 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=>cf.has(s.state)):[];if(t.run.exists&&(t.run.paused_step??null)!==null||r.length>0){let s=t.run.paused_step??null,i=r.map(a=>a.alias).join(", "),o=s!==null&&i.length>0?`Run paused at ${s} awaiting operator escalation decision (member ${i} attention_needed)`:s!==null?`Run paused at ${s} awaiting operator escalation decision`:`Team member(s) ${i} awaiting operator attention`;e.push({cause:o,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 jk(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: ${_2(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 i of t.workflows.rows)r.push(` - ${i.workflow_name} v${i.version} enabled=${i.enabled===1?"true":"false"} source=${i.source_uri??"null"}`)}if(r.push(""),r.push("[TEAM MEMBERS FOR PROJECT'S DEFAULT TEAM]"),!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 i of t.team.members)r.push(` - alias=${i.alias} provider=${i.provider} state=${i.state} sessionid=${i.sessionid??"null"} sessiondir=${i.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(i=>cf.has(i.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 i=t.run.paused_at??t.run.started_at??"?";r.push(` paused_step: ${s} (started: ${i})`)}if(n.length>0){let i=n.map(o=>`${o.alias} (state=${o.state}${o.state_updated_at?` since ${o.state_updated_at}`:""}${o.state_reason?`, reason="${o.state_reason}"`:""})`).join(", ");r.push(` members awaiting operator: ${i}`)}else r.push(" members awaiting operator: (none flagged on team)");r.push(" next action expected: operator response via /admin or webcli escalations verb"),r.push("")}if(r.push("[DAEMON STATE]"),r.push(` worker pid: ${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 i of e)r.push(` - ${i.cause}`),r.push(` -> ${i.action}`);return r.join(`
3104
3104
  `)+`
3105
- `}function p2(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 _2(t){let e=t.replace(/\s+/g," ").trim();return e.length<=80?e:`${e.slice(0,80)}...`}async function h2(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${lf()}
3105
+ `}function _2(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 h2(t){let e=t.replace(/\s+/g," ").trim();return e.length<=80?e:`${e.slice(0,80)}...`}async function g2(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${lf()}
3106
3106
  `),0;let r=[];for(let s of t){if(s.startsWith("--"))return e.stderr.write(`error: unknown flag: ${s}
3107
3107
  `),e.stderr.write(`${lf()}
3108
3108
  `),2;r.push(s)}if(r.length!==1)return e.stderr.write(`error: expected exactly one positional arg: <prompt_id>
3109
3109
  `),e.stderr.write(`${lf()}
3110
3110
  `),2;let n=r[0];try{return await O(e,s=>(e.stdout.write(Ck(s,n)),0))}catch(s){return e.stderr.write(`diagnose-prompt failed: ${s instanceof Error?s.message:String(s)}
3111
3111
  `),1}}function lf(){return["usage: lmctl diagnose-prompt <prompt_id>","",'Narrow read-only diagnostic for the WT-6 "prompt-pending-forever"',"symptom. Renders prompt + dispatch + run + project + workflows + team","state, then picks the top 1-3 likely root causes (daemon interval,","missing workflows, missing team aliases, etc).","","options:"," -h, --help show this help and exit"].join(`
3112
- `)}var $k,df,cf,Fk=E(()=>{"use strict";Fu();Ce();$k=["Coder","Reviewer1","Polisher"],df=3e4,cf=new Set(["attention_needed","paused","escalation"])});var lI={};he(lI,{appendIntent:()=>Qk,resolveIntentLogPath:()=>Zk,runStatus:()=>A2});import{appendFileSync as g2,existsSync as y2,mkdirSync as E2}from"node:fs";import{homedir as w2,hostname as Uk}from"node:os";import{basename as T2,dirname as zk,isAbsolute as v2,join as S2,resolve as b2}from"node:path";function Zk(){return process.env.LMCTL_INTENT_LOG??S2(w2(),".lmctl","recent-intents.log")}function Qk(t){try{let e=Zk();E2(zk(e),{recursive:!0});let r=JSON.stringify({ts:t.ts??new Date().toISOString(),cwd:t.cwd??process.cwd(),verb:t.verb,args:[...t.args]});g2(e,`${r}
3113
- `)}catch{}}async function A2(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(k2),0;let r=t.find(o=>o==="--project"||o.startsWith("--project=")||o==="--web");if(r!==void 0)return N(e,`unknown option ${r}; lmctl status is team/SELF scoped now`);let n=te(t,["--since"],["--json"]);if(n.error!==void 0)return N(e,n.error);if(n.positionals.length>0)return N(e,`unknown argument: ${n.positionals[0]}`);let s=G(n,"--json"),i=iX(M(n,"--since"));if("error"in i)return N(e,i.error);try{let o=e.env??process.env;if(s){let a=await O(e,l=>Xk(l,o));le(e,a)}else{let a=await O(e,async l=>X2(await Xk(l,o),{sinceIso:i.iso}));e.stdout.write(a)}return Qk({verb:"status",args:t}),0}catch(o){return N(e,o instanceof Error?o.message:String(o))}}async function Xk(t,e){let r=Xn(e,t);if(!r.ok){if(r.reason==="not-found")throw new Error(Nr("status"));return await R2(t)}return await x2(t,r.identity)}async function x2(t,e){let r=He(e),n=t.getRootTeam(r.teamfile);if(n===null)throw new Error(Nr("status"));let s=qe(n.teamfile_path,t),i=mf(ll(t,{from:r.value})),o=mf(ll(t,{target_teamfile:r.teamfile,target_alias:r.alias})),a=C2([...uf(t,{from:r.value}),...uf(t,{target_teamfile:r.teamfile,target_alias:r.alias})]);return{scope:"self",identity:r.value,...eI(),team:{name:s.name,teamfile:n.teamfile_path},members:s.members.map(l=>O2(t,n.teamfile_path,l)),activity:{from_me:i.map(l=>ff(l,t)),to_me:o.map(l=>ff(l,t))},transcript_harvest:await rI(a),mailbox:{outbound:dl(M2(t,r.teamfile,r.alias),"outbound"),inbound_pending:dl(D2(t,r.teamfile,r.alias),"inbound")},waiting_on:j2(t,r.teamfile,r.alias).map(l=>tI(l,t))}}function eI(){return{db_path:Q()}}async function R2(t){let e=t.listRootTeams();return{scope:"db",identity:null,...eI(),teams:e.map(r=>L2(t,r)),activity:mf(ll(t)).map(r=>ff(r,t)),transcript_harvest:await rI(uf(t)),mailbox:{pending_outbound:dl(Jk(t,"sender"),"outbound"),pending_inbound:dl(Jk(t,"receiver"),"inbound")},waiting_on:P2(t).map(r=>tI(r,t))}}function L2(t,e){if(!y2(e.teamfile_path))return{name:e.name,teamfile:e.teamfile_path,member_count:0,registered_at:e.registered_at,last_seeded_at:e.last_seeded_at,missing_on_disk:!0};let r=0;try{r=qe(e.teamfile_path,t).members.length}catch{r=0}return{name:e.name,teamfile:e.teamfile_path,member_count:r,registered_at:e.registered_at,last_seeded_at:e.last_seeded_at}}function O2(t,e,r){let n=r.teamfile===void 0?null:Te(v2(r.teamfile)?r.teamfile:b2(zk(e),r.teamfile),t),s=Wt(t,e,r.alias),i=s.busy&&s.reason==="in-flight"?$2(t,e,r.alias,s.inFlight):null;return{alias:r.alias,provider:r.provider,model:r.model??null,teamfile:e,referenced_teamfile:n,sessionid:r.session??null,sessiondir:r.sessiondir??null,state:s.busy?"busy":"idle",reason:s.busy?s.reason:null,handling:i}}function $2(t,e,r,n){let s=n.sender_alias==="operator"?"operator":`${n.sender_teamfile}:${n.sender_alias}`,o=t.db.prepare(`
3112
+ `)}var $k,df,cf,Fk=E(()=>{"use strict";Fu();Ce();$k=["Coder","Reviewer1","Polisher"],df=3e4,cf=new Set(["attention_needed","paused","escalation"])});var lI={};he(lI,{appendIntent:()=>Qk,resolveIntentLogPath:()=>Zk,runStatus:()=>x2});import{appendFileSync as y2,existsSync as E2,mkdirSync as w2}from"node:fs";import{homedir as T2,hostname as Uk}from"node:os";import{basename as v2,dirname as zk,isAbsolute as S2,join as b2,resolve as k2}from"node:path";function Zk(){return process.env.LMCTL_INTENT_LOG??b2(T2(),".lmctl","recent-intents.log")}function Qk(t){try{let e=Zk();w2(zk(e),{recursive:!0});let r=JSON.stringify({ts:t.ts??new Date().toISOString(),cwd:t.cwd??process.cwd(),verb:t.verb,args:[...t.args]});y2(e,`${r}
3113
+ `)}catch{}}async function x2(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(I2),0;let r=t.find(o=>o==="--project"||o.startsWith("--project=")||o==="--web");if(r!==void 0)return N(e,`unknown option ${r}; lmctl status is team/SELF scoped now`);let n=te(t,["--since"],["--json"]);if(n.error!==void 0)return N(e,n.error);if(n.positionals.length>0)return N(e,`unknown argument: ${n.positionals[0]}`);let s=G(n,"--json"),i=oX(M(n,"--since"));if("error"in i)return N(e,i.error);try{let o=e.env??process.env;if(s){let a=await O(e,l=>Xk(l,o));le(e,a)}else{let a=await O(e,async l=>J2(await Xk(l,o),{sinceIso:i.iso}));e.stdout.write(a)}return Qk({verb:"status",args:t}),0}catch(o){return N(e,o instanceof Error?o.message:String(o))}}async function Xk(t,e){let r=Xn(e,t);if(!r.ok){if(r.reason==="not-found")throw new Error(Nr("status"));return await L2(t)}return await R2(t,r.identity)}async function R2(t,e){let r=He(e),n=t.getRootTeam(r.teamfile);if(n===null)throw new Error(Nr("status"));let s=qe(n.teamfile_path,t),i=mf(al(t,{from:r.value})),o=mf(al(t,{target_teamfile:r.teamfile,target_alias:r.alias})),a=M2([...uf(t,{from:r.value}),...uf(t,{target_teamfile:r.teamfile,target_alias:r.alias})]);return{scope:"self",identity:r.value,...eI(),team:{name:s.name,teamfile:n.teamfile_path},members:s.members.map(l=>$2(t,n.teamfile_path,l)),activity:{from_me:i.map(l=>ff(l,t)),to_me:o.map(l=>ff(l,t))},transcript_harvest:await rI(a),mailbox:{outbound:ll(D2(t,r.teamfile,r.alias),"outbound"),inbound_pending:ll(j2(t,r.teamfile,r.alias),"inbound")},waiting_on:P2(t,r.teamfile,r.alias).map(l=>tI(l,t))}}function eI(){return{db_path:Q()}}async function L2(t){let e=t.listRootTeams();return{scope:"db",identity:null,...eI(),teams:e.map(r=>O2(t,r)),activity:mf(al(t)).map(r=>ff(r,t)),transcript_harvest:await rI(uf(t)),mailbox:{pending_outbound:ll(Jk(t,"sender"),"outbound"),pending_inbound:ll(Jk(t,"receiver"),"inbound")},waiting_on:F2(t).map(r=>tI(r,t))}}function O2(t,e){if(!E2(e.teamfile_path))return{name:e.name,teamfile:e.teamfile_path,member_count:0,registered_at:e.registered_at,last_seeded_at:e.last_seeded_at,missing_on_disk:!0};let r=0;try{r=qe(e.teamfile_path,t).members.length}catch{r=0}return{name:e.name,teamfile:e.teamfile_path,member_count:r,registered_at:e.registered_at,last_seeded_at:e.last_seeded_at}}function $2(t,e,r){let n=r.teamfile===void 0?null:Te(S2(r.teamfile)?r.teamfile:k2(zk(e),r.teamfile),t),s=Wt(t,e,r.alias),i=s.busy&&s.reason==="in-flight"?C2(t,e,r.alias,s.inFlight):null;return{alias:r.alias,provider:r.provider,model:r.model??null,teamfile:e,referenced_teamfile:n,sessionid:r.session??null,sessiondir:r.sessiondir??null,state:s.busy?"busy":"idle",reason:s.busy?s.reason:null,handling:i}}function C2(t,e,r,n){let s=n.sender_alias==="operator"?"operator":`${n.sender_teamfile}:${n.sender_alias}`,o=t.db.prepare(`
3114
3114
  SELECT * FROM tracked_invocation
3115
3115
  WHERE kind = 'chat'
3116
3116
  AND status = 'running'
@@ -3120,18 +3120,18 @@ Examples:
3120
3120
  AND holder_pid IS ?
3121
3121
  ORDER BY started_at DESC, id DESC
3122
3122
  LIMIT 5
3123
- `).all(e,r,s,n.holder_pid).find(a=>a.request_payload!==null);return o?.request_payload===void 0||o.request_payload===null?null:{tracked_invocation_id:o.id,from_identity:o.from_identity,started_at:o.started_at,request_payload:o.request_payload,request_preview:aI(o.request_payload)}}function ll(t,e={}){let r=[],n=[];e.from!==void 0&&(r.push("from_identity = ?"),n.push(e.from)),e.target_teamfile!==void 0&&(r.push("target_teamfile = ?"),n.push(e.target_teamfile)),e.target_alias!==void 0&&(r.push("target_alias = ?"),n.push(e.target_alias));let s=r.length===0?"":` WHERE ${r.join(" AND ")}`;return t.db.prepare(`
3123
+ `).all(e,r,s,n.holder_pid).find(a=>a.request_payload!==null);return o?.request_payload===void 0||o.request_payload===null?null:{tracked_invocation_id:o.id,from_identity:o.from_identity,started_at:o.started_at,request_payload:o.request_payload,request_preview:aI(o.request_payload)}}function al(t,e={}){let r=[],n=[];e.from!==void 0&&(r.push("from_identity = ?"),n.push(e.from)),e.target_teamfile!==void 0&&(r.push("target_teamfile = ?"),n.push(e.target_teamfile)),e.target_alias!==void 0&&(r.push("target_alias = ?"),n.push(e.target_alias));let s=r.length===0?"":` WHERE ${r.join(" AND ")}`;return t.db.prepare(`
3124
3124
  SELECT * FROM tracked_invocation
3125
3125
  ${s}
3126
3126
  ORDER BY started_at DESC, id DESC
3127
- `).all(...n)}function uf(t,e={}){return ll(t,e).filter(n=>n.kind==="chat"&&n.status==="running"&&pi(n)==="dead")}function C2(t){let e=new Set,r=[];for(let n of t)e.has(n.id)||(e.add(n.id),r.push(n));return r.sort((n,s)=>{let i=Date.parse(s.started_at)-Date.parse(n.started_at);return Number.isFinite(i)&&i!==0?i:s.id-n.id})}function M2(t,e,r){return t.db.prepare(`
3127
+ `).all(...n)}function uf(t,e={}){return al(t,e).filter(n=>n.kind==="chat"&&n.status==="running"&&pi(n)==="dead")}function M2(t){let e=new Set,r=[];for(let n of t)e.has(n.id)||(e.add(n.id),r.push(n));return r.sort((n,s)=>{let i=Date.parse(s.started_at)-Date.parse(n.started_at);return Number.isFinite(i)&&i!==0?i:s.id-n.id})}function D2(t,e,r){return t.db.prepare(`
3128
3128
  SELECT * FROM agent_mailbox
3129
3129
  WHERE sender_teamfile = ?
3130
3130
  AND sender_alias = ?
3131
3131
  AND delivered_at IS NULL
3132
3132
  AND delivering_at IS NULL
3133
3133
  ORDER BY receiver_teamfile ASC, receiver_alias ASC, id ASC
3134
- `).all(e,r)}function D2(t,e,r){return t.db.prepare(`
3134
+ `).all(e,r)}function j2(t,e,r){return t.db.prepare(`
3135
3135
  SELECT * FROM agent_mailbox
3136
3136
  WHERE receiver_teamfile = ?
3137
3137
  AND receiver_alias = ?
@@ -3143,7 +3143,7 @@ Examples:
3143
3143
  WHERE delivered_at IS NULL
3144
3144
  AND delivering_at IS NULL
3145
3145
  ORDER BY ${r}
3146
- `).all()}function j2(t,e,r){return t.db.prepare(`
3146
+ `).all()}function P2(t,e,r){return t.db.prepare(`
3147
3147
  SELECT * FROM agent_mailbox
3148
3148
  WHERE sender_teamfile = ?
3149
3149
  AND sender_alias = ?
@@ -3167,7 +3167,7 @@ Examples:
3167
3167
  ELSE delivered_at
3168
3168
  END ASC,
3169
3169
  id ASC
3170
- `).all(e,r)}function P2(t){return t.db.prepare(`
3170
+ `).all(e,r)}function F2(t){return t.db.prepare(`
3171
3171
  SELECT * FROM agent_mailbox
3172
3172
  WHERE delivered_at IS NULL
3173
3173
  OR (
@@ -3187,11 +3187,11 @@ Examples:
3187
3187
  ELSE delivered_at
3188
3188
  END ASC,
3189
3189
  id ASC
3190
- `).all()}function mf(t){return t.filter(e=>pi(e)!=="dead")}function tI(t,e){let r=t.delivered_at!==null&&(t.receipt===null||t.receipt==="");return{id:t.id,state:r?"no reply":"queued",sender:t.sender_teamfile===null||t.sender_alias===null?null:`${t.sender_teamfile}:${t.sender_alias}`,receiver:`${t.receiver_teamfile}:${t.receiver_alias}`,message_type:t.message_type,payload:t.payload,payload_preview:aI(t.payload),receiver_availability:F2(Wt(e,t.receiver_teamfile,t.receiver_alias)),age_basis_at:r?t.delivered_at:t.created_at,created_at:t.created_at,delivered_at:t.delivered_at}}function F2(t){if(!t.busy)return{state:"idle",reason:null,detail:"receiver idle now"};if(t.reason==="in-flight"){let s=t.inFlight.sender_alias==="operator"?"operator":`${t.inFlight.sender_teamfile}:${t.inFlight.sender_alias}`,i=t.inFlight.holder_pid===null?"":`, holder pid ${t.inFlight.holder_pid}`;return{state:"busy",reason:"in-flight",detail:`receiver busy now (in-flight: ${nt(s)} since ${t.inFlight.started_at}${i})`}}if(t.source==="terminal-lock"){let s=t.terminalLock,i=s.holder_host===Uk()?"this host":s.holder_host;return{state:"busy",reason:"terminal-held",detail:`receiver busy now (terminal: holder pid ${s.holder_pid} alive on ${i})`}}let e=t.terminalInvocation,r=e.holder_host===null?"unknown host":e.holder_host===Uk()?"this host":e.holder_host,n=e.holder_pid===null?"":` holder pid ${e.holder_pid}`;return{state:"busy",reason:"terminal-held",detail:`receiver busy now (terminal: invocation #${e.id}${n} alive on ${r})`}}async function rI(t){let e=[];for(let r of t)e.push(await U2(r));return e}async function U2(t){let e=t.target_teamfile===null||t.target_alias===null?null:`${t.target_teamfile}:${t.target_alias}`,r={tracked_invocation_id:t.id,from_identity:t.from_identity,target:e??"(unknown)",started_at:t.started_at,tail_hint:e===null?"":`lmctl tail "${t.target_teamfile}" ${t.target_alias}`};if(e===null)return en(r,"missing-target",null,null);if(t.request_payload===null||t.request_payload.length===0)return en(r,"missing-request-payload",null,null);let n=W2(t.meta);if(n.provider===null||n.sessionid===null)return en(r,"missing-session-metadata",n.provider,n.sessionid);if(!q2(n.provider))return en(r,"unsupported-provider",n.provider,n.sessionid);let s;try{s=await Be(n.sessionid,n.provider)}catch{return en(r,"read-error",n.provider,n.sessionid)}if(s===null)return en(r,"session-not-found",n.provider,n.sessionid);let i=B2(t.request_payload,s.messages);return i.state!=="completed"?en(r,i.reason,n.provider,n.sessionid):{...r,state:"completed",reason:null,provider:n.provider,session_id:n.sessionid,result_payload:i.result,result_preview:oI(i.result),assistant_timestamp:i.assistantTimestamp,matched_user_index:i.userIndex}}function en(t,e,r,n){return{...t,state:"unreconciled",reason:e,provider:r,session_id:n,result_payload:null,result_preview:null,assistant_timestamp:null,matched_user_index:null}}function W2(t){if(t===null||t.trim()==="")return{provider:null,sessionid:null};try{let e=JSON.parse(t);return{provider:typeof e.provider=="string"&&e.provider.length>0?e.provider:null,sessionid:typeof e.sessionid=="string"&&e.sessionid.length>0?e.sessionid:null}}catch{return{provider:null,sessionid:null}}}function q2(t){return["claude","codex","gemini","copilot","opencode","lmplayer","qwen","agy","ClaudeMock"].includes(t)}function B2(t,e){let r=e.map((i,o)=>({message:i,index:o})).filter(({message:i})=>i.role==="user"&&i.content===t);if(r.length===0)return{state:"unreconciled",reason:"request-not-found"};if(r.length>1)return{state:"unreconciled",reason:"duplicate-request"};let n=r[0].index,s=[];for(let i of e.slice(n+1)){if(i.role==="user")break;i.role==="assistant"&&i.content.trim().length>0&&s.push(i)}return s.length===0?{state:"unreconciled",reason:"no-assistant-response"}:{state:"completed",userIndex:n,result:s.map(i=>i.content).join(`
3190
+ `).all()}function mf(t){return t.filter(e=>pi(e)!=="dead")}function tI(t,e){let r=t.delivered_at!==null&&(t.receipt===null||t.receipt==="");return{id:t.id,state:r?"no reply":"queued",sender:t.sender_teamfile===null||t.sender_alias===null?null:`${t.sender_teamfile}:${t.sender_alias}`,receiver:`${t.receiver_teamfile}:${t.receiver_alias}`,message_type:t.message_type,payload:t.payload,payload_preview:aI(t.payload),receiver_availability:U2(Wt(e,t.receiver_teamfile,t.receiver_alias)),age_basis_at:r?t.delivered_at:t.created_at,created_at:t.created_at,delivered_at:t.delivered_at}}function U2(t){if(!t.busy)return{state:"idle",reason:null,detail:"receiver idle now"};if(t.reason==="in-flight"){let s=t.inFlight.sender_alias==="operator"?"operator":`${t.inFlight.sender_teamfile}:${t.inFlight.sender_alias}`,i=t.inFlight.holder_pid===null?"":`, holder pid ${t.inFlight.holder_pid}`;return{state:"busy",reason:"in-flight",detail:`receiver busy now (in-flight: ${nt(s)} since ${t.inFlight.started_at}${i})`}}if(t.source==="terminal-lock"){let s=t.terminalLock,i=s.holder_host===Uk()?"this host":s.holder_host;return{state:"busy",reason:"terminal-held",detail:`receiver busy now (terminal: holder pid ${s.holder_pid} alive on ${i})`}}let e=t.terminalInvocation,r=e.holder_host===null?"unknown host":e.holder_host===Uk()?"this host":e.holder_host,n=e.holder_pid===null?"":` holder pid ${e.holder_pid}`;return{state:"busy",reason:"terminal-held",detail:`receiver busy now (terminal: invocation #${e.id}${n} alive on ${r})`}}async function rI(t){let e=[];for(let r of t)e.push(await W2(r));return e}async function W2(t){let e=t.target_teamfile===null||t.target_alias===null?null:`${t.target_teamfile}:${t.target_alias}`,r={tracked_invocation_id:t.id,from_identity:t.from_identity,target:e??"(unknown)",started_at:t.started_at,tail_hint:e===null?"":`lmctl tail "${t.target_teamfile}" ${t.target_alias}`};if(e===null)return en(r,"missing-target",null,null);if(t.request_payload===null||t.request_payload.length===0)return en(r,"missing-request-payload",null,null);let n=q2(t.meta);if(n.provider===null||n.sessionid===null)return en(r,"missing-session-metadata",n.provider,n.sessionid);if(!B2(n.provider))return en(r,"unsupported-provider",n.provider,n.sessionid);let s;try{s=await Be(n.sessionid,n.provider)}catch{return en(r,"read-error",n.provider,n.sessionid)}if(s===null)return en(r,"session-not-found",n.provider,n.sessionid);let i=H2(t.request_payload,s.messages);return i.state!=="completed"?en(r,i.reason,n.provider,n.sessionid):{...r,state:"completed",reason:null,provider:n.provider,session_id:n.sessionid,result_payload:i.result,result_preview:oI(i.result),assistant_timestamp:i.assistantTimestamp,matched_user_index:i.userIndex}}function en(t,e,r,n){return{...t,state:"unreconciled",reason:e,provider:r,session_id:n,result_payload:null,result_preview:null,assistant_timestamp:null,matched_user_index:null}}function q2(t){if(t===null||t.trim()==="")return{provider:null,sessionid:null};try{let e=JSON.parse(t);return{provider:typeof e.provider=="string"&&e.provider.length>0?e.provider:null,sessionid:typeof e.sessionid=="string"&&e.sessionid.length>0?e.sessionid:null}}catch{return{provider:null,sessionid:null}}}function B2(t){return["claude","codex","gemini","copilot","opencode","lmplayer","qwen","agy","ClaudeMock"].includes(t)}function H2(t,e){let r=e.map((i,o)=>({message:i,index:o})).filter(({message:i})=>i.role==="user"&&i.content===t);if(r.length===0)return{state:"unreconciled",reason:"request-not-found"};if(r.length>1)return{state:"unreconciled",reason:"duplicate-request"};let n=r[0].index,s=[];for(let i of e.slice(n+1)){if(i.role==="user")break;i.role==="assistant"&&i.content.trim().length>0&&s.push(i)}return s.length===0?{state:"unreconciled",reason:"no-assistant-response"}:{state:"completed",userIndex:n,result:s.map(i=>i.content).join(`
3191
3191
 
3192
- `),assistantTimestamp:H2(s[s.length-1]?.timestamp)}}function H2(t){if(t===void 0)return null;let e=t.getTime();return Number.isFinite(e)?t.toISOString():null}function ff(t,e){let r={id:t.id,kind:t.kind,origin:t.origin,status:t.status,holder_liveness:pi(t),mailbox_delivery:null,from_identity:t.from_identity,target:t.target_teamfile===null||t.target_alias===null?null:`${t.target_teamfile}:${t.target_alias}`,started_at:t.started_at,ended_at:t.ended_at,result:Yk(t.result_summary),error:Yk(t.error)};return r.mailbox_delivery=Q2(r,e),r}function dl(t,e){let r=new Map;for(let n of t){let s=n.sender_teamfile===null||n.sender_alias===null?"operator":`${n.sender_teamfile}:${n.sender_alias}`,i=`${n.receiver_teamfile}:${n.receiver_alias}`,o=e==="outbound"?`${s}\0${i}`:`${i}\0${s}`,a=r.get(o);a===void 0?r.set(o,[n]):a.push(n)}return[...r.values()].map(n=>{let s=n[0],i=n.map(o=>o.created_at).sort();return{sender:s.sender_teamfile===null||s.sender_alias===null?null:`${s.sender_teamfile}:${s.sender_alias}`,receiver:`${s.receiver_teamfile}:${s.receiver_alias}`,message_types:[...new Set(n.map(o=>o.message_type))].sort(),pending_count:n.length,oldest_created_at:i[0],newest_created_at:i[i.length-1],ids:n.map(o=>o.id)}})}function X2(t,e){return t.scope==="self"?J2(t,e):G2(t,e)}function J2(t,e){let r=[];r.push(`identity: ${t.identity}`),r.push(`team: ${t.team.name}`),r.push(`teamfile: ${t.team.teamfile}`),r.push(""),r.push("members:"),t.members.length===0&&r.push(" none");for(let n of t.members){let s=n.model===null?"":` model=${n.model}`,i=n.sessionid===null?"":` session=${n.sessionid}`,o=n.state==="idle"?"idle":`busy (${n.reason})`,a=n.handling===null?"":` handling="${n.handling.request_preview}"`;r.push(` ${n.alias}: ${o} provider=${n.provider}${s}${i}${a}`)}return r.push(""),r.push("Waiting on:"),sI(r,t.waiting_on,"self"),r.push(""),r.push("transcript harvest:"),iI(r,t.transcript_harvest,"self"),r.push(""),r.push("activity from me:"),pf(r,_f(t.activity.from_me,e.sinceIso),"from-me"),r.push(""),r.push("activity to me:"),pf(r,_f(t.activity.to_me,e.sinceIso),"to-me"),r.push(""),r.push("mailbox outbound:"),ul(r,t.mailbox.outbound),r.push(""),r.push("mailbox inbound pending:"),ul(r,t.mailbox.inbound_pending),r.push(""),r.push(nI(t)),r.join(`
3193
- `)}function G2(t,e){let r=[];r.push("scope: db"),r.push("identity: none"),r.push(""),r.push("teams:"),t.teams.length===0&&r.push(" none");for(let n of t.teams){let s=n.name===null?"(unnamed)":n.name;r.push(` ${s}: ${n.teamfile} (${n.member_count} members)`)}return r.push(""),r.push("Waiting on:"),sI(r,t.waiting_on,"db"),r.push(""),r.push("transcript harvest:"),iI(r,t.transcript_harvest,"db"),r.push(""),r.push("recent activity:"),pf(r,_f(t.activity,e.sinceIso),"db"),r.push(""),r.push("mailbox pending outbound:"),ul(r,t.mailbox.pending_outbound),r.push(""),r.push("mailbox pending inbound:"),ul(r,t.mailbox.pending_inbound),r.push(""),r.push(nI(t)),r.join(`
3194
- `)}function nI(t){return Zn(t.db_path)}function pf(t,e,r){if(e.length===0){t.push(" none");return}let n=e.filter(Kk).sort(z2),s=n.length===0?e:e.filter(i=>!Kk(i));for(let i of n.slice(0,Wk))Vk(t,i,r);cl(t,n.length,Wk,"more open delegations");for(let i of s.slice(0,al))Vk(t,i,r);cl(t,s.length,al,"older")}function sI(t,e,r){if(e.length===0){t.push(" none");return}let n=V2(e,I2);for(let s of n){let i=r==="db"&&s.sender!==null?`${nt(s.sender)} -> ${nt(s.receiver)}`:nt(s.receiver);t.push(` ${i} - ${s.state} ${sX(s.age_basis_at)} (#${s.id}, ${s.message_type})`),t.push(` "${s.payload_preview}"`),t.push(` ${s.receiver_availability.detail}; lane key: sender+receiver, another sender's chat will not flush this queued mail`)}Y2(t,e,n)}function iI(t,e,r){if(e.length===0){t.push(" none");return}for(let n of e.slice(0,al)){let s=r==="db"?` from ${nt(n.from_identity)} -> ${nt(n.target)}`:` -> ${nt(n.target)}`;if(n.state==="completed"){let i=n.result_preview===null?"":` "${n.result_preview}"`;t.push(` #${n.tracked_invocation_id} completed in transcript; lmctl DB not finalized${s} since ${n.started_at}${i}`)}else t.push(` #${n.tracked_invocation_id} unreconciled${s} since ${n.started_at} (${n.reason??"unknown"})`);n.tail_hint.length>0&&t.push(` inspect: ${n.tail_hint}`)}cl(t,e.length,al,"more transcript harvest rows")}function V2(t,e){let r=[...t].sort(Gk);if(r.length<=e)return r;let n=r.slice(0,e),s=new Set(r.map(i=>i.state));for(let i of s){if(n.some(l=>l.state===i))continue;let o=r.find(l=>l.state===i);if(o===void 0)continue;let a=K2(n);a>=0&&(n[a]=o)}return n.sort(Gk)}function K2(t){let e=new Map;for(let r of t)e.set(r.state,(e.get(r.state)??0)+1);for(let r=t.length-1;r>=0;r-=1)if((e.get(t[r].state)??0)>1)return r;return-1}function Y2(t,e,r){let n=new Set(r.map(l=>l.id)),s=e.filter(l=>!n.has(l.id));if(s.length===0)return;let i=s.filter(l=>l.state==="queued").length,o=s.filter(l=>l.state==="no reply").length,a=[i>0?`${i} queued`:null,o>0?`${o} no reply`:null].filter(l=>l!==null);t.push(` (+${s.length} older: ${a.join(", ")} -- use --json)`)}function Gk(t,e){let r=Date.parse(t.age_basis_at),n=Date.parse(e.age_basis_at);return Number.isFinite(r)&&Number.isFinite(n)&&r!==n?r-n:Number.isFinite(r)!==Number.isFinite(n)?Number.isFinite(r)?-1:1:t.id-e.id}function _f(t,e){let r=Date.parse(e);return Number.isFinite(r)?t.filter(n=>{let s=Date.parse(n.ended_at??n.started_at);return Number.isFinite(s)&&s>=r}):t}function Vk(t,e,r){let n=nX(e,r),s=e.status==="running"?`since ${e.started_at}`:`ended ${e.ended_at??e.started_at}`,i=e.error??e.result,o=i===null?"":` "${oI(i)}"`;t.push(` #${e.id} ${Z2(e)} ${e.kind}${n} ${s}${o}`)}function Kk(t){return t.mailbox_delivery?.state==="queued"||t.mailbox_delivery?.state==="delivering"}function z2(t,e){let r=Date.parse(t.started_at)-Date.parse(e.started_at);return Number.isFinite(r)&&r!==0?r:t.id-e.id}function Z2(t){return t.status==="running"&&t.holder_liveness==="unknown"?"RUNNING_UNKNOWN":t.mailbox_delivery===null?t.status.toUpperCase():t.mailbox_delivery.state.toUpperCase()}function Q2(t,e){let r=eX(t,e);return r===null?null:{mailbox_id:r.id,state:r.delivered_at!==null?"delivered":r.delivering_at!==null?"delivering":"queued",delivered_at:r.delivered_at,delivering_at:r.delivering_at}}function eX(t,e){if(t.kind!=="chat"||t.status!=="done"||t.target===null||t.result===null)return null;let r,n;try{r=He(t.from_identity),n=He(t.target)}catch{return null}for(let s of tX(t.result)){let i=e.getMailboxMessage(s);if(i!==null&&!(i.sender_teamfile!==r.teamfile||i.sender_alias!==r.alias)&&!(i.receiver_teamfile!==n.teamfile||i.receiver_alias!==n.alias)&&rX(i,t))return i}return null}function tX(t){let e=new Set,r=[];for(let n of t.matchAll(/\d+/g)){let s=Number(n[0]);!Number.isSafeInteger(s)||s<=0||e.has(s)||(e.add(s),r.push(s))}return r}function rX(t,e){let r=Date.parse(e.started_at),n=Date.parse(e.ended_at??e.started_at),s=Date.parse(t.created_at);return!Number.isFinite(r)||!Number.isFinite(n)||!Number.isFinite(s)?!1:s>=r&&s<=n}function nX(t,e){if(e==="from-me")return t.target===null?"":` -> ${nt(t.target)}`;if(e==="to-me")return` from ${nt(t.from_identity)}`;let r=t.target===null?"":` -> ${nt(t.target)}`;return` from ${nt(t.from_identity)}${r}`}function cl(t,e,r,n){let s=e-r;s>0&&t.push(` (+${s} ${n} -- use --json)`)}function ul(t,e){if(e.length===0){t.push(" none");return}for(let r of e.slice(0,qk)){let n=r.sender??"operator";t.push(` ${nt(n)} -> ${nt(r.receiver)}: ${r.pending_count} pending ${r.message_types.join("+")} (oldest ${r.oldest_created_at})`)}cl(t,e.length,qk,"more lanes")}function Yk(t){return t===null||t.length===0?null:t.replace(/\s+/g," ").trim()}function oI(t){let e=t.replace(/\s+/g," ").trim();return e.length<=Bk?e:`${e.slice(0,Bk-3)}...`}function aI(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=Hk?e:`${e.slice(0,Hk-3)}...`}function sX(t){let e=Date.parse(t);if(!Number.isFinite(e))return"unknown age";let r=Math.max(0,Math.floor((Date.now()-e)/1e3));if(r<60)return`${r}s`;let n=Math.floor(r/60);if(n<60)return`${n}m`;let s=Math.floor(n/60);return s<48?`${s}h`:`${Math.floor(s/24)}d`}function nt(t){if(t==="operator")return t;try{let e=He(t);return`${T2(e.teamfile)}:${e.alias}`}catch{return t}}function iX(t){if(t===void 0)return{iso:new Date(Date.now()-N2).toISOString()};let e=/^(\d+)([smhd])$/.exec(t);if(e!==null){let n=Number(e[1]),s=e[2],i=s==="s"?n:s==="m"?n*60:s==="h"?n*3600:n*86400;return{iso:new Date(Date.now()-i*1e3).toISOString()}}let r=Date.parse(t);return Number.isFinite(r)?{iso:new Date(r).toISOString()}:{error:`invalid --since value: ${t} (expected ISO8601 or duration like 24h)`}}var k2,al,Wk,qk,I2,N2,Bk,Hk,dI=E(()=>{"use strict";lr();Ce();Ha();Ye();Ys();rr();nr();k2=`usage: lmctl status [--json] [--since <duration|ISO8601>]
3192
+ `),assistantTimestamp:X2(s[s.length-1]?.timestamp)}}function X2(t){if(t===void 0)return null;let e=t.getTime();return Number.isFinite(e)?t.toISOString():null}function ff(t,e){let r={id:t.id,kind:t.kind,origin:t.origin,status:t.status,holder_liveness:pi(t),mailbox_delivery:null,from_identity:t.from_identity,target:t.target_teamfile===null||t.target_alias===null?null:`${t.target_teamfile}:${t.target_alias}`,started_at:t.started_at,ended_at:t.ended_at,result:Yk(t.result_summary),error:Yk(t.error)};return r.mailbox_delivery=eX(r,e),r}function ll(t,e){let r=new Map;for(let n of t){let s=n.sender_teamfile===null||n.sender_alias===null?"operator":`${n.sender_teamfile}:${n.sender_alias}`,i=`${n.receiver_teamfile}:${n.receiver_alias}`,o=e==="outbound"?`${s}\0${i}`:`${i}\0${s}`,a=r.get(o);a===void 0?r.set(o,[n]):a.push(n)}return[...r.values()].map(n=>{let s=n[0],i=n.map(o=>o.created_at).sort();return{sender:s.sender_teamfile===null||s.sender_alias===null?null:`${s.sender_teamfile}:${s.sender_alias}`,receiver:`${s.receiver_teamfile}:${s.receiver_alias}`,message_types:[...new Set(n.map(o=>o.message_type))].sort(),pending_count:n.length,oldest_created_at:i[0],newest_created_at:i[i.length-1],ids:n.map(o=>o.id)}})}function J2(t,e){return t.scope==="self"?G2(t,e):V2(t,e)}function G2(t,e){let r=[];r.push(`identity: ${t.identity}`),r.push(`team: ${t.team.name}`),r.push(`teamfile: ${t.team.teamfile}`),r.push(""),r.push("members:"),t.members.length===0&&r.push(" none");for(let n of t.members){let s=n.model===null?"":` model=${n.model}`,i=n.sessionid===null?"":` session=${n.sessionid}`,o=n.state==="idle"?"idle":`busy (${n.reason})`,a=n.handling===null?"":` handling="${n.handling.request_preview}"`;r.push(` ${n.alias}: ${o} provider=${n.provider}${s}${i}${a}`)}return r.push(""),r.push("Waiting on:"),sI(r,t.waiting_on,"self"),r.push(""),r.push("transcript harvest:"),iI(r,t.transcript_harvest,"self"),r.push(""),r.push("activity from me:"),pf(r,_f(t.activity.from_me,e.sinceIso),"from-me"),r.push(""),r.push("activity to me:"),pf(r,_f(t.activity.to_me,e.sinceIso),"to-me"),r.push(""),r.push("mailbox outbound:"),cl(r,t.mailbox.outbound),r.push(""),r.push("mailbox inbound pending:"),cl(r,t.mailbox.inbound_pending),r.push(""),r.push(nI(t)),r.join(`
3193
+ `)}function V2(t,e){let r=[];r.push("scope: db"),r.push("identity: none"),r.push(""),r.push("teams:"),t.teams.length===0&&r.push(" none");for(let n of t.teams){let s=n.name===null?"(unnamed)":n.name;r.push(` ${s}: ${n.teamfile} (${n.member_count} members)`)}return r.push(""),r.push("Waiting on:"),sI(r,t.waiting_on,"db"),r.push(""),r.push("transcript harvest:"),iI(r,t.transcript_harvest,"db"),r.push(""),r.push("recent activity:"),pf(r,_f(t.activity,e.sinceIso),"db"),r.push(""),r.push("mailbox pending outbound:"),cl(r,t.mailbox.pending_outbound),r.push(""),r.push("mailbox pending inbound:"),cl(r,t.mailbox.pending_inbound),r.push(""),r.push(nI(t)),r.join(`
3194
+ `)}function nI(t){return Zn(t.db_path)}function pf(t,e,r){if(e.length===0){t.push(" none");return}let n=e.filter(Kk).sort(Z2),s=n.length===0?e:e.filter(i=>!Kk(i));for(let i of n.slice(0,Wk))Vk(t,i,r);dl(t,n.length,Wk,"more open delegations");for(let i of s.slice(0,ol))Vk(t,i,r);dl(t,s.length,ol,"older")}function sI(t,e,r){if(e.length===0){t.push(" none");return}let n=K2(e,N2);for(let s of n){let i=r==="db"&&s.sender!==null?`${nt(s.sender)} -> ${nt(s.receiver)}`:nt(s.receiver);t.push(` ${i} - ${s.state} ${iX(s.age_basis_at)} (#${s.id}, ${s.message_type})`),t.push(` "${s.payload_preview}"`),t.push(` ${s.receiver_availability.detail}; lane key: sender+receiver, another sender's chat will not flush this queued mail`)}z2(t,e,n)}function iI(t,e,r){if(e.length===0){t.push(" none");return}for(let n of e.slice(0,ol)){let s=r==="db"?` from ${nt(n.from_identity)} -> ${nt(n.target)}`:` -> ${nt(n.target)}`;if(n.state==="completed"){let i=n.result_preview===null?"":` "${n.result_preview}"`;t.push(` #${n.tracked_invocation_id} completed in transcript; lmctl DB not finalized${s} since ${n.started_at}${i}`)}else t.push(` #${n.tracked_invocation_id} unreconciled${s} since ${n.started_at} (${n.reason??"unknown"})`);n.tail_hint.length>0&&t.push(` inspect: ${n.tail_hint}`)}dl(t,e.length,ol,"more transcript harvest rows")}function K2(t,e){let r=[...t].sort(Gk);if(r.length<=e)return r;let n=r.slice(0,e),s=new Set(r.map(i=>i.state));for(let i of s){if(n.some(l=>l.state===i))continue;let o=r.find(l=>l.state===i);if(o===void 0)continue;let a=Y2(n);a>=0&&(n[a]=o)}return n.sort(Gk)}function Y2(t){let e=new Map;for(let r of t)e.set(r.state,(e.get(r.state)??0)+1);for(let r=t.length-1;r>=0;r-=1)if((e.get(t[r].state)??0)>1)return r;return-1}function z2(t,e,r){let n=new Set(r.map(l=>l.id)),s=e.filter(l=>!n.has(l.id));if(s.length===0)return;let i=s.filter(l=>l.state==="queued").length,o=s.filter(l=>l.state==="no reply").length,a=[i>0?`${i} queued`:null,o>0?`${o} no reply`:null].filter(l=>l!==null);t.push(` (+${s.length} older: ${a.join(", ")} -- use --json)`)}function Gk(t,e){let r=Date.parse(t.age_basis_at),n=Date.parse(e.age_basis_at);return Number.isFinite(r)&&Number.isFinite(n)&&r!==n?r-n:Number.isFinite(r)!==Number.isFinite(n)?Number.isFinite(r)?-1:1:t.id-e.id}function _f(t,e){let r=Date.parse(e);return Number.isFinite(r)?t.filter(n=>{let s=Date.parse(n.ended_at??n.started_at);return Number.isFinite(s)&&s>=r}):t}function Vk(t,e,r){let n=sX(e,r),s=e.status==="running"?`since ${e.started_at}`:`ended ${e.ended_at??e.started_at}`,i=e.error??e.result,o=i===null?"":` "${oI(i)}"`;t.push(` #${e.id} ${Q2(e)} ${e.kind}${n} ${s}${o}`)}function Kk(t){return t.mailbox_delivery?.state==="queued"||t.mailbox_delivery?.state==="delivering"}function Z2(t,e){let r=Date.parse(t.started_at)-Date.parse(e.started_at);return Number.isFinite(r)&&r!==0?r:t.id-e.id}function Q2(t){return t.status==="running"&&t.holder_liveness==="unknown"?"RUNNING_UNKNOWN":t.mailbox_delivery===null?t.status.toUpperCase():t.mailbox_delivery.state.toUpperCase()}function eX(t,e){let r=tX(t,e);return r===null?null:{mailbox_id:r.id,state:r.delivered_at!==null?"delivered":r.delivering_at!==null?"delivering":"queued",delivered_at:r.delivered_at,delivering_at:r.delivering_at}}function tX(t,e){if(t.kind!=="chat"||t.status!=="done"||t.target===null||t.result===null)return null;let r,n;try{r=He(t.from_identity),n=He(t.target)}catch{return null}for(let s of rX(t.result)){let i=e.getMailboxMessage(s);if(i!==null&&!(i.sender_teamfile!==r.teamfile||i.sender_alias!==r.alias)&&!(i.receiver_teamfile!==n.teamfile||i.receiver_alias!==n.alias)&&nX(i,t))return i}return null}function rX(t){let e=new Set,r=[];for(let n of t.matchAll(/\d+/g)){let s=Number(n[0]);!Number.isSafeInteger(s)||s<=0||e.has(s)||(e.add(s),r.push(s))}return r}function nX(t,e){let r=Date.parse(e.started_at),n=Date.parse(e.ended_at??e.started_at),s=Date.parse(t.created_at);return!Number.isFinite(r)||!Number.isFinite(n)||!Number.isFinite(s)?!1:s>=r&&s<=n}function sX(t,e){if(e==="from-me")return t.target===null?"":` -> ${nt(t.target)}`;if(e==="to-me")return` from ${nt(t.from_identity)}`;let r=t.target===null?"":` -> ${nt(t.target)}`;return` from ${nt(t.from_identity)}${r}`}function dl(t,e,r,n){let s=e-r;s>0&&t.push(` (+${s} ${n} -- use --json)`)}function cl(t,e){if(e.length===0){t.push(" none");return}for(let r of e.slice(0,qk)){let n=r.sender??"operator";t.push(` ${nt(n)} -> ${nt(r.receiver)}: ${r.pending_count} pending ${r.message_types.join("+")} (oldest ${r.oldest_created_at})`)}dl(t,e.length,qk,"more lanes")}function Yk(t){return t===null||t.length===0?null:t.replace(/\s+/g," ").trim()}function oI(t){let e=t.replace(/\s+/g," ").trim();return e.length<=Bk?e:`${e.slice(0,Bk-3)}...`}function aI(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=Hk?e:`${e.slice(0,Hk-3)}...`}function iX(t){let e=Date.parse(t);if(!Number.isFinite(e))return"unknown age";let r=Math.max(0,Math.floor((Date.now()-e)/1e3));if(r<60)return`${r}s`;let n=Math.floor(r/60);if(n<60)return`${n}m`;let s=Math.floor(n/60);return s<48?`${s}h`:`${Math.floor(s/24)}d`}function nt(t){if(t==="operator")return t;try{let e=He(t);return`${v2(e.teamfile)}:${e.alias}`}catch{return t}}function oX(t){if(t===void 0)return{iso:new Date(Date.now()-A2).toISOString()};let e=/^(\d+)([smhd])$/.exec(t);if(e!==null){let n=Number(e[1]),s=e[2],i=s==="s"?n:s==="m"?n*60:s==="h"?n*3600:n*86400;return{iso:new Date(Date.now()-i*1e3).toISOString()}}let r=Date.parse(t);return Number.isFinite(r)?{iso:new Date(r).toISOString()}:{error:`invalid --since value: ${t} (expected ISO8601 or duration like 24h)`}}var I2,ol,Wk,qk,N2,A2,Bk,Hk,dI=E(()=>{"use strict";lr();Ce();Ba();Ye();Ys();rr();nr();I2=`usage: lmctl status [--json] [--since <duration|ISO8601>]
3195
3195
 
3196
3196
  Show this member's team, busy/idle roster, recent tracked activity, and mailbox
3197
3197
  state. From a plain operator shell, show a DB-wide team/activity summary.
@@ -3199,7 +3199,7 @@ state. From a plain operator shell, show a DB-wide team/activity summary.
3199
3199
  Text output shows recent activity from the last 24h by default. Use --since 7d
3200
3200
  or an ISO timestamp to widen the investigation window. --json returns complete,
3201
3201
  uncapped data.
3202
- `,al=5,Wk=5,qk=5,I2=5,N2=24*60*60*1e3,Bk=72,Hk=80});var uI={};he(uI,{backfillEventLog:()=>mX,rebuildProjections:()=>cI});import{createHash as oX}from"node:crypto";function tn(t,e){return t==null?null:{teamfile:t,alias:e??""}}function aX(t,e,r){return`lease_${oX("sha256").update(`${t}\0${e}\0${r}`).digest("hex").slice(0,16)}`}function ml(t,e,r,n){r.forEach((s,i)=>{ke(t,{stream_id:e,event_type:s.event_type,payload:s.payload,observedLastSeq:i,ts:s.ts},()=>{}).appended?n.appended+=1:n.skipped+=1})}function lX(t){let e=`msg_tcl_${t.id}`,r=tn(t.sender_teamfile,t.sender_alias),n=tn(t.receiver_teamfile,t.receiver_alias),s={table:"team_chat_log",id:t.id},i={message_id:e,sender:r,receiver:n,root_teamfile:t.root_teamfile,legacy:s};return{streamId:e,events:[{event_type:ne.CREATE,ts:t.created_at,payload:{...i,message_type:"request",content:t.message,origin:t.origin,correlation_status:"legacy-unavailable"}},{event_type:ne.HANDLED,ts:t.created_at,payload:{...i,outcome:t.status,receipt:t.response,error:t.error_detail,truncated:t.truncated===1}}]}}function dX(t){let e=`msg_mbx_${t.id}`,r=tn(t.sender_teamfile,t.sender_alias),n=tn(t.receiver_teamfile,t.receiver_alias),s={table:"agent_mailbox",id:t.id},i={message_id:e,sender:r,receiver:n,root_teamfile:t.root_teamfile,legacy:s},o=[];if(t.message_type==="response"){let a=t.request_mailbox_id!==null?`msg_mbx_${t.request_mailbox_id}`:null;return o.push({event_type:ne.RESPONSE_CREATE,ts:t.created_at,payload:{...i,message_type:"response",content:t.payload,in_reply_to_message_id:a,correlation_status:"legacy-unavailable"}}),o.push({event_type:ne.RESPONSE_ENQUEUE,ts:t.created_at,payload:{...i,message_type:"response",in_reply_to_message_id:a}}),t.delivered_at!==null&&o.push({event_type:ne.RESPONSE_DELIVERED,ts:t.delivered_at,payload:{...i,message_type:"response",receipt:t.receipt}}),{streamId:e,events:o}}return o.push({event_type:ne.CREATE,ts:t.created_at,payload:{...i,message_type:"request",content:t.payload,correlation_status:"legacy-unavailable"}}),o.push({event_type:ne.ENQUEUE,ts:t.created_at,payload:{...i,message_type:"request"}}),t.waited_at!==null&&o.push({event_type:ne.WAIT_REGISTER,ts:t.waited_at,payload:{...i,waited_by:t.waited_by}}),(t.delivering_at!==null||t.delivery_holder_pid!==null)&&o.push({event_type:ne.DELIVER_CLAIM,ts:t.delivering_at??t.created_at,payload:{...i,pid:t.delivery_holder_pid,host:t.delivery_holder_host}}),t.delivered_at!==null&&o.push({event_type:ne.DELIVERED,ts:t.delivered_at,payload:{...i,receipt:t.receipt}}),{streamId:e,events:o}}function cX(t){let e=`inv_${t.id}`,r=tn(t.target_teamfile,t.target_alias),n={table:"tracked_invocation",id:t.id},s=[{event_type:ne.INVOCATION_START,ts:t.started_at,payload:{invocation_id:e,kind:t.kind,origin:t.origin,launch_source:t.launch_source,from_identity:t.from_identity,target:r,root_teamfile:t.root_teamfile,scope_teamfile:t.scope_teamfile,cwd:t.cwd,command:t.command,request_payload:t.request_payload,started_at:t.started_at,request_message_id:t.team_chat_log_id!==null?`msg_tcl_${t.team_chat_log_id}`:null,holder_pid:t.holder_pid,holder_host:t.holder_host,legacy:n}}];return t.notified_by!==null&&s.push({event_type:ne.INVOCATION_NOTIFY_CLAIM,ts:t.notified_at??t.started_at,payload:{invocation_id:e,notified_by:t.notified_by,notified_at:t.notified_at,legacy:n}}),t.status!=="running"&&s.push({event_type:ne.INVOCATION_FINISH,ts:t.ended_at??t.started_at,payload:{invocation_id:e,status:t.status,ended_at:t.ended_at,exit_code:t.exit_code,signal:t.signal,result_summary:t.result_summary,error:t.error,legacy:n}}),{streamId:e,events:s}}function uX(t){let e=aX(t.receiver_teamfile,t.receiver_alias,t.started_at),r=tn(t.receiver_teamfile,t.receiver_alias),n=tn(t.sender_teamfile,t.sender_alias);return{streamId:e,events:[{event_type:ne.INFLIGHT_TAKE,ts:t.started_at,payload:{lease_id:e,receiver:r,sender:n,holder_pid:t.holder_pid,holder_host:null,started_at:t.started_at,legacy:{table:"agent_inflight",receiver_teamfile:t.receiver_teamfile,receiver_alias:t.receiver_alias}}}]}}function mX(t){let e={appended:0,skipped:0},r={team_chat_log:0,agent_mailbox:0,tracked_invocation:0,agent_inflight:0};t.transaction(()=>{for(let i of t.prepare("SELECT * FROM team_chat_log ORDER BY id").all()){let o=e.appended+e.skipped,{streamId:a,events:l}=lX(i);ml(t,a,l,e),r.team_chat_log+=e.appended+e.skipped-o}for(let i of t.prepare("SELECT * FROM agent_mailbox ORDER BY id").all()){let o=e.appended+e.skipped,{streamId:a,events:l}=dX(i);ml(t,a,l,e),r.agent_mailbox+=e.appended+e.skipped-o}for(let i of t.prepare("SELECT * FROM tracked_invocation ORDER BY id").all()){let o=e.appended+e.skipped,{streamId:a,events:l}=cX(i);ml(t,a,l,e),r.tracked_invocation+=e.appended+e.skipped-o}for(let i of t.prepare("SELECT * FROM agent_inflight ORDER BY receiver_teamfile, receiver_alias").all()){let o=e.appended+e.skipped,{streamId:a,events:l}=uX(i);ml(t,a,l,e),r.agent_inflight+=e.appended+e.skipped-o}cI(t)})();let s=i=>t.prepare(`SELECT count(*) AS n FROM ${i}`).get().n;return{appended:e.appended,skipped:e.skipped,bySource:r,projections:{agent_state:s("agent_state"),message_pending:s("message_pending"),invocation_state:s("invocation_state")}}}function cI(t){t.exec("DELETE FROM agent_state"),t.exec("DELETE FROM message_pending"),t.exec("DELETE FROM invocation_state");let e=t.prepare("SELECT seq, stream_id, event_type, payload FROM message_event ORDER BY seq").all();for(let r of e){let n=JSON.parse(r.payload);fX(t,r.seq,r.stream_id,r.event_type,n)}}function Ae(t,e,r){let n=t[e];return n!=null?n[r]??null:null}function fX(t,e,r,n,s){switch(n){case ne.ENQUEUE:case ne.RESPONSE_ENQUEUE:{let i=n===ne.RESPONSE_ENQUEUE;t.prepare(`INSERT INTO message_pending
3202
+ `,ol=5,Wk=5,qk=5,N2=5,A2=24*60*60*1e3,Bk=72,Hk=80});var uI={};he(uI,{backfillEventLog:()=>fX,rebuildProjections:()=>cI});import{createHash as aX}from"node:crypto";function tn(t,e){return t==null?null:{teamfile:t,alias:e??""}}function lX(t,e,r){return`lease_${aX("sha256").update(`${t}\0${e}\0${r}`).digest("hex").slice(0,16)}`}function ul(t,e,r,n){r.forEach((s,i)=>{ke(t,{stream_id:e,event_type:s.event_type,payload:s.payload,observedLastSeq:i,ts:s.ts},()=>{}).appended?n.appended+=1:n.skipped+=1})}function dX(t){let e=`msg_tcl_${t.id}`,r=tn(t.sender_teamfile,t.sender_alias),n=tn(t.receiver_teamfile,t.receiver_alias),s={table:"team_chat_log",id:t.id},i={message_id:e,sender:r,receiver:n,root_teamfile:t.root_teamfile,legacy:s};return{streamId:e,events:[{event_type:ne.CREATE,ts:t.created_at,payload:{...i,message_type:"request",content:t.message,origin:t.origin,correlation_status:"legacy-unavailable"}},{event_type:ne.HANDLED,ts:t.created_at,payload:{...i,outcome:t.status,receipt:t.response,error:t.error_detail,truncated:t.truncated===1}}]}}function cX(t){let e=`msg_mbx_${t.id}`,r=tn(t.sender_teamfile,t.sender_alias),n=tn(t.receiver_teamfile,t.receiver_alias),s={table:"agent_mailbox",id:t.id},i={message_id:e,sender:r,receiver:n,root_teamfile:t.root_teamfile,legacy:s},o=[];if(t.message_type==="response"){let a=t.request_mailbox_id!==null?`msg_mbx_${t.request_mailbox_id}`:null;return o.push({event_type:ne.RESPONSE_CREATE,ts:t.created_at,payload:{...i,message_type:"response",content:t.payload,in_reply_to_message_id:a,correlation_status:"legacy-unavailable"}}),o.push({event_type:ne.RESPONSE_ENQUEUE,ts:t.created_at,payload:{...i,message_type:"response",in_reply_to_message_id:a}}),t.delivered_at!==null&&o.push({event_type:ne.RESPONSE_DELIVERED,ts:t.delivered_at,payload:{...i,message_type:"response",receipt:t.receipt}}),{streamId:e,events:o}}return o.push({event_type:ne.CREATE,ts:t.created_at,payload:{...i,message_type:"request",content:t.payload,correlation_status:"legacy-unavailable"}}),o.push({event_type:ne.ENQUEUE,ts:t.created_at,payload:{...i,message_type:"request"}}),t.waited_at!==null&&o.push({event_type:ne.WAIT_REGISTER,ts:t.waited_at,payload:{...i,waited_by:t.waited_by}}),(t.delivering_at!==null||t.delivery_holder_pid!==null)&&o.push({event_type:ne.DELIVER_CLAIM,ts:t.delivering_at??t.created_at,payload:{...i,pid:t.delivery_holder_pid,host:t.delivery_holder_host}}),t.delivered_at!==null&&o.push({event_type:ne.DELIVERED,ts:t.delivered_at,payload:{...i,receipt:t.receipt}}),{streamId:e,events:o}}function uX(t){let e=`inv_${t.id}`,r=tn(t.target_teamfile,t.target_alias),n={table:"tracked_invocation",id:t.id},s=[{event_type:ne.INVOCATION_START,ts:t.started_at,payload:{invocation_id:e,kind:t.kind,origin:t.origin,launch_source:t.launch_source,from_identity:t.from_identity,target:r,root_teamfile:t.root_teamfile,scope_teamfile:t.scope_teamfile,cwd:t.cwd,command:t.command,request_payload:t.request_payload,started_at:t.started_at,request_message_id:t.team_chat_log_id!==null?`msg_tcl_${t.team_chat_log_id}`:null,holder_pid:t.holder_pid,holder_host:t.holder_host,legacy:n}}];return t.notified_by!==null&&s.push({event_type:ne.INVOCATION_NOTIFY_CLAIM,ts:t.notified_at??t.started_at,payload:{invocation_id:e,notified_by:t.notified_by,notified_at:t.notified_at,legacy:n}}),t.status!=="running"&&s.push({event_type:ne.INVOCATION_FINISH,ts:t.ended_at??t.started_at,payload:{invocation_id:e,status:t.status,ended_at:t.ended_at,exit_code:t.exit_code,signal:t.signal,result_summary:t.result_summary,error:t.error,legacy:n}}),{streamId:e,events:s}}function mX(t){let e=lX(t.receiver_teamfile,t.receiver_alias,t.started_at),r=tn(t.receiver_teamfile,t.receiver_alias),n=tn(t.sender_teamfile,t.sender_alias);return{streamId:e,events:[{event_type:ne.INFLIGHT_TAKE,ts:t.started_at,payload:{lease_id:e,receiver:r,sender:n,holder_pid:t.holder_pid,holder_host:null,started_at:t.started_at,legacy:{table:"agent_inflight",receiver_teamfile:t.receiver_teamfile,receiver_alias:t.receiver_alias}}}]}}function fX(t){let e={appended:0,skipped:0},r={team_chat_log:0,agent_mailbox:0,tracked_invocation:0,agent_inflight:0};t.transaction(()=>{for(let i of t.prepare("SELECT * FROM team_chat_log ORDER BY id").all()){let o=e.appended+e.skipped,{streamId:a,events:l}=dX(i);ul(t,a,l,e),r.team_chat_log+=e.appended+e.skipped-o}for(let i of t.prepare("SELECT * FROM agent_mailbox ORDER BY id").all()){let o=e.appended+e.skipped,{streamId:a,events:l}=cX(i);ul(t,a,l,e),r.agent_mailbox+=e.appended+e.skipped-o}for(let i of t.prepare("SELECT * FROM tracked_invocation ORDER BY id").all()){let o=e.appended+e.skipped,{streamId:a,events:l}=uX(i);ul(t,a,l,e),r.tracked_invocation+=e.appended+e.skipped-o}for(let i of t.prepare("SELECT * FROM agent_inflight ORDER BY receiver_teamfile, receiver_alias").all()){let o=e.appended+e.skipped,{streamId:a,events:l}=mX(i);ul(t,a,l,e),r.agent_inflight+=e.appended+e.skipped-o}cI(t)})();let s=i=>t.prepare(`SELECT count(*) AS n FROM ${i}`).get().n;return{appended:e.appended,skipped:e.skipped,bySource:r,projections:{agent_state:s("agent_state"),message_pending:s("message_pending"),invocation_state:s("invocation_state")}}}function cI(t){t.exec("DELETE FROM agent_state"),t.exec("DELETE FROM message_pending"),t.exec("DELETE FROM invocation_state");let e=t.prepare("SELECT seq, stream_id, event_type, payload FROM message_event ORDER BY seq").all();for(let r of e){let n=JSON.parse(r.payload);pX(t,r.seq,r.stream_id,r.event_type,n)}}function Ae(t,e,r){let n=t[e];return n!=null?n[r]??null:null}function pX(t,e,r,n,s){switch(n){case ne.ENQUEUE:case ne.RESPONSE_ENQUEUE:{let i=n===ne.RESPONSE_ENQUEUE;t.prepare(`INSERT INTO message_pending
3203
3203
  (message_id, message_type, in_reply_to, sender_teamfile, sender_alias,
3204
3204
  receiver_teamfile, receiver_alias, lifecycle_state, created_seq, last_seq)
3205
3205
  VALUES (?, ?, ?, ?, ?, ?, ?, 'queued', ?, ?)
@@ -3223,8 +3223,8 @@ uncapped data.
3223
3223
  cwd, command, request_message_id, request_payload, holder_pid, holder_host, status, started_at, last_seq)
3224
3224
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'running', ?, ?)
3225
3225
  ON CONFLICT(invocation_id) DO NOTHING`).run(r,s.kind??"chat",s.origin??"unknown",s.launch_source??"",s.from_identity??"",Ae(s,"target","teamfile"),Ae(s,"target","alias"),s.root_teamfile??null,s.cwd??null,s.command??null,s.request_message_id??null,s.request_payload??null,s.holder_pid??null,s.holder_host??null,s.started_at??"",e);break;case ne.INVOCATION_FINISH:t.prepare(`UPDATE invocation_state SET status=?, ended_at=?, result_summary=?, error=?, last_seq=?
3226
- WHERE invocation_id=?`).run(s.status??"done",s.ended_at??null,s.result_summary??null,s.error??null,e,r);break;case ne.INVOCATION_NOTIFY_CLAIM:t.prepare("UPDATE invocation_state SET notified_by=?, notified_at=?, last_seq=? WHERE invocation_id=?").run(s.notified_by??null,s.notified_at??null,e,r);break;default:break}}var ne,mI=E(()=>{"use strict";fi();ne={CREATE:"CREATE",ENQUEUE:"ENQUEUE",DELIVER_CLAIM:"DELIVER_CLAIM",DELIVER_CLAIM_RELEASE:"DELIVER_CLAIM_RELEASE",DELIVERED:"DELIVERED",HANDLED:"HANDLED",WAIT_REGISTER:"WAIT_REGISTER",RESPONSE_CREATE:"RESPONSE_CREATE",RESPONSE_ENQUEUE:"RESPONSE_ENQUEUE",RESPONSE_DELIVERED:"RESPONSE_DELIVERED",INFLIGHT_TAKE:"INFLIGHT_TAKE",INFLIGHT_RELEASE:"INFLIGHT_RELEASE",INFLIGHT_RECLAIM:"INFLIGHT_RECLAIM",TERMINAL_LOCK_TAKE:"TERMINAL_LOCK_TAKE",TERMINAL_LOCK_RELEASE:"TERMINAL_LOCK_RELEASE",TERMINAL_LOCK_EXPIRE:"TERMINAL_LOCK_EXPIRE",INVOCATION_START:"INVOCATION_START",INVOCATION_FINISH:"INVOCATION_FINISH",INVOCATION_NOTIFY_CLAIM:"INVOCATION_NOTIFY_CLAIM"}});Ye();ts();me();import{pathToFileURL as pX}from"node:url";import{mkdirSync as eN,readFileSync as tN,renameSync as rN,writeFileSync as nN}from"node:fs";import{homedir as sN}from"node:os";import{dirname as iN,join as oN}from"node:path";function jf(t){try{return new URL(t).protocol==="https:"}catch{return!1}}function ZI(t){return/^[A-Za-z]:[\\/]/.test(t)?!1:/^[A-Za-z][A-Za-z0-9+.-]*:/.test(t)}function QI(t,e){return!ZI(t)||jf(t)?null:`${e} must use https://: ${t}`}async function Pf(t,e){let r=QI(t,e.description);if(r!==null||!jf(t))throw new Error(r??`${e.description} must use https://: ${t}`);let n=e.timeoutMs??15e3,s=new AbortController,i=setTimeout(()=>s.abort(),n);try{let o;try{o=await fetch(t,{signal:s.signal,redirect:"manual"})}catch(a){throw Df(t,e.description,n,a)}if(o.type==="opaqueredirect"||o.status>=300&&o.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(!o.ok)throw new Error(`failed to fetch ${e.description} ${t}: HTTP ${o.status}${o.statusText?` ${o.statusText}`:""}`);try{return Buffer.from(await o.arrayBuffer())}catch(a){throw Df(t,e.description,n,a)}}finally{clearTimeout(i)}}function Df(t,e,r,n){let i=n instanceof Error&&n.name==="AbortError"?`timed out after ${r}ms`:n instanceof Error?n.message:String(n);return new Error(`failed to fetch ${e} ${t}: ${i}`)}ts();var aN="https://registry.npmjs.org/@lmctl-ai/lmctl/latest",lN=60*60*1e3,dN=1500;function cN(){let t=process.env.HOME??sN();return oN(t,".lmctl",".update-check.json")}function uN(t){return t.isTTY===!0}function mN(t,e){let r=i=>{let o=/^(\d+)\.(\d+)\.(\d+)(?:$|[-+])/.exec(i.trim());if(o===null)return null;let a=o.slice(1).map(l=>Number(l));return a.some(l=>!Number.isSafeInteger(l)||l<0)?null:a},n=r(t),s=r(e);if(n===null||s===null)return 0;for(let i=0;i<3;i+=1){if(n[i]>s[i])return 1;if(n[i]<s[i])return-1}return 0}function El(t,e){return!!(process.env.LMCTL_NO_UPDATE_NOTIFIER==="1"||!uN(e.stderr)||t.includes("--json")||t.includes("--help")||t.includes("-h")||t[0]==="help"||t[0]==="mcp")}function fN(t,e){try{let r=JSON.parse(tN(t,"utf8"));if(typeof r.checkedAt=="number"&&Number.isFinite(r.checkedAt)&&typeof r.latest=="string"&&e-r.checkedAt<lN)return r.latest}catch{}return null}function pN(t,e){eN(iN(t),{recursive:!0});let r=`${t}.tmp-${process.pid}-${Math.random().toString(16).slice(2)}`;nN(r,`${JSON.stringify(e)}
3227
- `,"utf8"),rN(r,t)}async function _N(){let t=await Pf(aN,{description:"lmctl npm metadata",timeoutMs:dN}),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 Ff(t,e=[],r={}){try{if(El(e,t))return;let n=r.now?.()??Date.now(),s=r.cachePath??cN();if(fN(s,n)!==null)return;let o=await(r.fetchLatest??_N)();try{pN(s,{checkedAt:n,latest:o})}catch{return}let a=r.currentVersion?.()??bt();mN(o,a)>0&&t.stderr.write(`update available: ${a} \u2192 ${o} run: npm i -g @lmctl-ai/lmctl@latest
3226
+ WHERE invocation_id=?`).run(s.status??"done",s.ended_at??null,s.result_summary??null,s.error??null,e,r);break;case ne.INVOCATION_NOTIFY_CLAIM:t.prepare("UPDATE invocation_state SET notified_by=?, notified_at=?, last_seq=? WHERE invocation_id=?").run(s.notified_by??null,s.notified_at??null,e,r);break;default:break}}var ne,mI=E(()=>{"use strict";fi();ne={CREATE:"CREATE",ENQUEUE:"ENQUEUE",DELIVER_CLAIM:"DELIVER_CLAIM",DELIVER_CLAIM_RELEASE:"DELIVER_CLAIM_RELEASE",DELIVERED:"DELIVERED",HANDLED:"HANDLED",WAIT_REGISTER:"WAIT_REGISTER",RESPONSE_CREATE:"RESPONSE_CREATE",RESPONSE_ENQUEUE:"RESPONSE_ENQUEUE",RESPONSE_DELIVERED:"RESPONSE_DELIVERED",INFLIGHT_TAKE:"INFLIGHT_TAKE",INFLIGHT_RELEASE:"INFLIGHT_RELEASE",INFLIGHT_RECLAIM:"INFLIGHT_RECLAIM",TERMINAL_LOCK_TAKE:"TERMINAL_LOCK_TAKE",TERMINAL_LOCK_RELEASE:"TERMINAL_LOCK_RELEASE",TERMINAL_LOCK_EXPIRE:"TERMINAL_LOCK_EXPIRE",INVOCATION_START:"INVOCATION_START",INVOCATION_FINISH:"INVOCATION_FINISH",INVOCATION_NOTIFY_CLAIM:"INVOCATION_NOTIFY_CLAIM"}});Ye();ts();me();import{pathToFileURL as _X}from"node:url";import{mkdirSync as eN,readFileSync as tN,renameSync as rN,writeFileSync as nN}from"node:fs";import{homedir as sN}from"node:os";import{dirname as iN,join as oN}from"node:path";function jf(t){try{return new URL(t).protocol==="https:"}catch{return!1}}function ZI(t){return/^[A-Za-z]:[\\/]/.test(t)?!1:/^[A-Za-z][A-Za-z0-9+.-]*:/.test(t)}function QI(t,e){return!ZI(t)||jf(t)?null:`${e} must use https://: ${t}`}async function Pf(t,e){let r=QI(t,e.description);if(r!==null||!jf(t))throw new Error(r??`${e.description} must use https://: ${t}`);let n=e.timeoutMs??15e3,s=new AbortController,i=setTimeout(()=>s.abort(),n);try{let o;try{o=await fetch(t,{signal:s.signal,redirect:"manual"})}catch(a){throw Df(t,e.description,n,a)}if(o.type==="opaqueredirect"||o.status>=300&&o.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(!o.ok)throw new Error(`failed to fetch ${e.description} ${t}: HTTP ${o.status}${o.statusText?` ${o.statusText}`:""}`);try{return Buffer.from(await o.arrayBuffer())}catch(a){throw Df(t,e.description,n,a)}}finally{clearTimeout(i)}}function Df(t,e,r,n){let i=n instanceof Error&&n.name==="AbortError"?`timed out after ${r}ms`:n instanceof Error?n.message:String(n);return new Error(`failed to fetch ${e} ${t}: ${i}`)}ts();var aN="https://registry.npmjs.org/@lmctl-ai/lmctl/latest",lN=60*60*1e3,dN=1500;function cN(){let t=process.env.HOME??sN();return oN(t,".lmctl",".update-check.json")}function uN(t){return t.isTTY===!0}function mN(t,e){let r=i=>{let o=/^(\d+)\.(\d+)\.(\d+)(?:$|[-+])/.exec(i.trim());if(o===null)return null;let a=o.slice(1).map(l=>Number(l));return a.some(l=>!Number.isSafeInteger(l)||l<0)?null:a},n=r(t),s=r(e);if(n===null||s===null)return 0;for(let i=0;i<3;i+=1){if(n[i]>s[i])return 1;if(n[i]<s[i])return-1}return 0}function yl(t,e){return!!(process.env.LMCTL_NO_UPDATE_NOTIFIER==="1"||!uN(e.stderr)||t.includes("--json")||t.includes("--help")||t.includes("-h")||t[0]==="help"||t[0]==="mcp")}function fN(t,e){try{let r=JSON.parse(tN(t,"utf8"));if(typeof r.checkedAt=="number"&&Number.isFinite(r.checkedAt)&&typeof r.latest=="string"&&e-r.checkedAt<lN)return r.latest}catch{}return null}function pN(t,e){eN(iN(t),{recursive:!0});let r=`${t}.tmp-${process.pid}-${Math.random().toString(16).slice(2)}`;nN(r,`${JSON.stringify(e)}
3227
+ `,"utf8"),rN(r,t)}async function _N(){let t=await Pf(aN,{description:"lmctl npm metadata",timeoutMs:dN}),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 Ff(t,e=[],r={}){try{if(yl(e,t))return;let n=r.now?.()??Date.now(),s=r.cachePath??cN();if(fN(s,n)!==null)return;let o=await(r.fetchLatest??_N)();try{pN(s,{checkedAt:n,latest:o})}catch{return}let a=r.currentVersion?.()??bt();mN(o,a)>0&&t.stderr.write(`update available: ${a} \u2192 ${o} run: npm i -g @lmctl-ai/lmctl@latest
3228
3228
  `)}catch{}}var Yn=`usage: lmctl [--db PATH] [--debug] <command> [args]
3229
3229
  `,hf=`${Yn}
3230
3230
  Setup & status:
@@ -3264,7 +3264,7 @@ Global flags:
3264
3264
  write full stack + cause chain and context to that file.
3265
3265
 
3266
3266
  Run 'lmctl help <command>' for command-specific help.
3267
- `,fI=new Set(["api","chat","serve","mcp","device","mail","team","terminal","tail","health","recover","ls","lint","seed","hire","refresh","clone","plan","diagnose","diagnose-prompt","status","db"]);function _X(t,e){return t.stderr.write(`error: ${e}
3267
+ `,fI=new Set(["api","chat","serve","mcp","device","mail","team","terminal","tail","health","recover","ls","lint","seed","hire","refresh","clone","plan","diagnose","diagnose-prompt","status","db"]);function hX(t,e){return t.stderr.write(`error: ${e}
3268
3268
  ${Yn}Run 'lmctl help' for usage.
3269
3269
  `),2}function _I(t,e){return e==="send"?(t.stderr.write(`error: unknown command: send (use lmctl chat)
3270
3270
  ${Yn}Run 'lmctl help' for usage.
@@ -3274,21 +3274,21 @@ ${Yn}Run 'lmctl help' for usage.
3274
3274
  ${Yn}Run 'lmctl help' for usage.
3275
3275
  `),1):(t.stderr.write(`error: unknown command: ${e}
3276
3276
  ${Yn}Run 'lmctl help' for usage.
3277
- `),1)}async function hX(t,e={stdout:process.stdout,stderr:process.stderr}){let r=$f();try{return await gX(t,e)}finally{Cf(r)}}async function gX(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 d=t[++a];if(d===void 0||d.startsWith("--"))return _X(e,"missing value for --db");process.env.LMCTL_DB=d;continue}if(l==="--debug"){Of();continue}r.push(l)}let n=r[0];if(n==="--version"||n==="-v"||n==="-V")return e.stdout.write(`lmctl ${bt()}
3278
- `),0;if(n==="--help"||n==="-h"||n===void 0)return e.stdout.write(hf),0;if(n==="help"){let[a,...l]=r.slice(1);return a===void 0||a==="--help"||a==="-h"?(e.stdout.write(hf),0):fI.has(a)?pI(a,[...l,"--help"],e):_I(e,a)}pl(Q(),e.stderr);let[s,...i]=r;if(s===void 0)return e.stdout.write(hf),0;let o=Date.now();gf(s,i,{phase:"start",started_at:new Date(o).toISOString()});try{let a=await pI(s,i,e);return gf(s,i,{phase:"finish",outcome:a===0?"ok":"error",exit_code:a,duration_ms:Date.now()-o}),fI.has(s)&&!El(r,e)&&await Ff(e,r),a}catch(a){let l=a instanceof Error?a:new Error(String(a));return gf(s,i,{phase:"fatal",outcome:"fatal",exit_code:1,duration_ms:Date.now()-o,error_class:l.name,error_message:l.message,error_stack:l.stack??null,causes:EX(l)}),yX(a,s,i,e)}}function gf(t,e,r){Oe({event:t,record_kind:"cli_action",command:t,argv:e,cwd:process.cwd(),db_path:Q(),lmctl_version:bt(),node_version:process.version,...r})}function yX(t,e,r,n){let s=t instanceof Error?t:new Error(String(t));return n.stderr.write(`error: ${s.message}
3277
+ `),1)}async function gX(t,e={stdout:process.stdout,stderr:process.stderr}){let r=$f();try{return await yX(t,e)}finally{Cf(r)}}async function yX(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 d=t[++a];if(d===void 0||d.startsWith("--"))return hX(e,"missing value for --db");process.env.LMCTL_DB=d;continue}if(l==="--debug"){Of();continue}r.push(l)}let n=r[0];if(n==="--version"||n==="-v"||n==="-V")return e.stdout.write(`lmctl ${bt()}
3278
+ `),0;if(n==="--help"||n==="-h"||n===void 0)return e.stdout.write(hf),0;if(n==="help"){let[a,...l]=r.slice(1);return a===void 0||a==="--help"||a==="-h"?(e.stdout.write(hf),0):fI.has(a)?pI(a,[...l,"--help"],e):_I(e,a)}fl(Q(),e.stderr);let[s,...i]=r;if(s===void 0)return e.stdout.write(hf),0;let o=Date.now();gf(s,i,{phase:"start",started_at:new Date(o).toISOString()});try{let a=await pI(s,i,e);return gf(s,i,{phase:"finish",outcome:a===0?"ok":"error",exit_code:a,duration_ms:Date.now()-o}),fI.has(s)&&!yl(r,e)&&await Ff(e,r),a}catch(a){let l=a instanceof Error?a:new Error(String(a));return gf(s,i,{phase:"fatal",outcome:"fatal",exit_code:1,duration_ms:Date.now()-o,error_class:l.name,error_message:l.message,error_stack:l.stack??null,causes:wX(l)}),EX(a,s,i,e)}}function gf(t,e,r){Oe({event:t,record_kind:"cli_action",command:t,argv:e,cwd:process.cwd(),db_path:Q(),lmctl_version:bt(),node_version:process.version,...r})}function EX(t,e,r,n){let s=t instanceof Error?t:new Error(String(t));return n.stderr.write(`error: ${s.message}
3279
3279
  `),Mf()?(n.stderr.write(`(debug details written to ~/.lmctl/debug-*.log)
3280
3280
  `),1):(n.stderr.write(`(re-run with --debug for the full stack trace and context in ~/.lmctl/debug-*.log)
3281
- `),1)}function EX(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 pI(t,e,r){switch(t){case"api":{let{runApi:n}=await Promise.resolve().then(()=>(lc(),Jh));return n(e,r)}case"serve":{let{runServe:n}=await Promise.resolve().then(()=>(Uv(),Fv));return n(e,r)}case"chat":{let{runChat:n}=await Promise.resolve().then(()=>(SS(),vS));return n(e,r)}case"recover":{let{runRecover:n}=await Promise.resolve().then(()=>(xS(),AS));return n(e,r)}case"mcp":{let{runMcp:n}=await Promise.resolve().then(()=>(DS(),MS));return n(e,r)}case"device":{let{runDevice:n}=await Promise.resolve().then(()=>(PS(),jS));return n(e,r)}case"mail":{let{runMail:n}=await Promise.resolve().then(()=>(KS(),VS));return n(e,r)}case"team":{let{runTeam:n}=await Promise.resolve().then(()=>(hb(),_b));return n(e,r)}case"tail":{let{runTail:n}=await Promise.resolve().then(()=>(bb(),Sb));return n(e,r)}case"health":{let{runInfo:n}=await Promise.resolve().then(()=>($b(),Ob));return n(e,r)}case"ls":{let{runLs:n}=await Promise.resolve().then(()=>(Db(),Mb));return n(e,r)}case"lint":{let{runLint:n}=await Promise.resolve().then(()=>(ii(),si));return n(e,r)}case"seed":{let{runSeed:n}=await Promise.resolve().then(()=>(ii(),si));return n(e,r)}case"hire":{let{runHire:n}=await Promise.resolve().then(()=>(ii(),si));return n(e,r)}case"refresh":{let{runRefresh:n}=await Promise.resolve().then(()=>(ii(),si));return n(e,r)}case"clone":{let{runClone:n}=await Promise.resolve().then(()=>(ik(),sk));return n(e,r)}case"plan":{let{runPlan:n}=await Promise.resolve().then(()=>(dk(),lk));return n(e,r)}case"terminal":{let{runTerminal:n}=await Promise.resolve().then(()=>(yk(),gk));return n(e,r)}case"diagnose":{let{runDiagnose:n}=await Promise.resolve().then(()=>(Ok(),Lk));return n(e,r)}case"diagnose-prompt":{let{runDiagnosePrompt:n}=await Promise.resolve().then(()=>(Fk(),Pk));return n(e,r)}case"status":{let{runStatus:n}=await Promise.resolve().then(()=>(dI(),lI));return n(e,r)}case"db":return wX(e,r);default:return _I(r,t)}}async function wX(t,e){let[r,...n]=t;return r==="--help"||r==="-h"||r==="help"?(e.stdout.write(`usage: lmctl db <subcommand>
3281
+ `),1)}function wX(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 pI(t,e,r){switch(t){case"api":{let{runApi:n}=await Promise.resolve().then(()=>(ac(),Jh));return n(e,r)}case"serve":{let{runServe:n}=await Promise.resolve().then(()=>(Uv(),Fv));return n(e,r)}case"chat":{let{runChat:n}=await Promise.resolve().then(()=>(SS(),vS));return n(e,r)}case"recover":{let{runRecover:n}=await Promise.resolve().then(()=>(xS(),AS));return n(e,r)}case"mcp":{let{runMcp:n}=await Promise.resolve().then(()=>(DS(),MS));return n(e,r)}case"device":{let{runDevice:n}=await Promise.resolve().then(()=>(PS(),jS));return n(e,r)}case"mail":{let{runMail:n}=await Promise.resolve().then(()=>(KS(),VS));return n(e,r)}case"team":{let{runTeam:n}=await Promise.resolve().then(()=>(hb(),_b));return n(e,r)}case"tail":{let{runTail:n}=await Promise.resolve().then(()=>(bb(),Sb));return n(e,r)}case"health":{let{runInfo:n}=await Promise.resolve().then(()=>($b(),Ob));return n(e,r)}case"ls":{let{runLs:n}=await Promise.resolve().then(()=>(Db(),Mb));return n(e,r)}case"lint":{let{runLint:n}=await Promise.resolve().then(()=>(ii(),si));return n(e,r)}case"seed":{let{runSeed:n}=await Promise.resolve().then(()=>(ii(),si));return n(e,r)}case"hire":{let{runHire:n}=await Promise.resolve().then(()=>(ii(),si));return n(e,r)}case"refresh":{let{runRefresh:n}=await Promise.resolve().then(()=>(ii(),si));return n(e,r)}case"clone":{let{runClone:n}=await Promise.resolve().then(()=>(ik(),sk));return n(e,r)}case"plan":{let{runPlan:n}=await Promise.resolve().then(()=>(dk(),lk));return n(e,r)}case"terminal":{let{runTerminal:n}=await Promise.resolve().then(()=>(yk(),gk));return n(e,r)}case"diagnose":{let{runDiagnose:n}=await Promise.resolve().then(()=>(Ok(),Lk));return n(e,r)}case"diagnose-prompt":{let{runDiagnosePrompt:n}=await Promise.resolve().then(()=>(Fk(),Pk));return n(e,r)}case"status":{let{runStatus:n}=await Promise.resolve().then(()=>(dI(),lI));return n(e,r)}case"db":return TX(e,r);default:return _I(r,t)}}async function TX(t,e){let[r,...n]=t;return r==="--help"||r==="-h"||r==="help"?(e.stdout.write(`usage: lmctl db <subcommand>
3282
3282
 
3283
3283
  backfill-events Replay the legacy tables into the event-log
3284
3284
  (with --db <copy>) substrate and rebuild projections. Idempotent;
3285
3285
  run against a COPY of the DB, never the live file.
3286
3286
  downgrade --to <version> --confirm Documented stub (restore from backup).
3287
- `),0):r==="backfill-events"?TX(n,e):r==="downgrade"?(e.stderr.write(`not yet implemented; restore from backup, or run lmctl migrate (forward-migrates ok)
3287
+ `),0):r==="backfill-events"?vX(n,e):r==="downgrade"?(e.stderr.write(`not yet implemented; restore from backup, or run lmctl migrate (forward-migrates ok)
3288
3288
  `),1):(e.stderr.write(`usage: lmctl db <subcommand> (backfill-events | downgrade)
3289
- `),1)}async function TX(t,e){let{resolveDbPath:r}=await Promise.resolve().then(()=>(Ye(),vf)),n=r();if(!((process.env.LMCTL_DB??"").length>0)&&!t.includes("--allow-live"))return e.stderr.write(`refusing to backfill the default live DB.
3289
+ `),1)}async function vX(t,e){let{resolveDbPath:r}=await Promise.resolve().then(()=>(Ye(),vf)),n=r();if(!((process.env.LMCTL_DB??"").length>0)&&!t.includes("--allow-live"))return e.stderr.write(`refusing to backfill the default live DB.
3290
3290
  resolved target: ${n}
3291
3291
  run against a COPY: cp <state.db> copy.db && lmctl --db copy.db db backfill-events
3292
3292
  (or pass --allow-live to target the resolved DB deliberately).
3293
- `),1;let{migrate:i}=await Promise.resolve().then(()=>(kl(),Yf)),{backfillEventLog:o}=await Promise.resolve().then(()=>(mI(),uI)),a=i({dbPath:n});try{let l=o(a);return e.stdout.write(`${JSON.stringify(l,null,2)}
3294
- `),0}finally{a.close()}}if(process.argv[1]!==void 0&&import.meta.url===pX(process.argv[1]).href){let t=await hX(process.argv.slice(2));process.exitCode=t}export{hX as runCli};
3293
+ `),1;let{migrate:i}=await Promise.resolve().then(()=>(bl(),Yf)),{backfillEventLog:o}=await Promise.resolve().then(()=>(mI(),uI)),a=i({dbPath:n});try{let l=o(a);return e.stdout.write(`${JSON.stringify(l,null,2)}
3294
+ `),0}finally{a.close()}}if(process.argv[1]!==void 0&&import.meta.url===_X(process.argv[1]).href){let t=await gX(process.argv.slice(2));process.exitCode=t}export{gX as runCli};