@lmctl-ai/lmctl 0.1.93 → 0.1.94

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli/index.js CHANGED
@@ -1,19 +1,19 @@
1
- var ov=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var re=(t,e)=>{for(var r in e)ov(t,r,{get:e[r],enumerable:!0})};import{existsSync as Yr,readdirSync as iv,readFileSync as av}from"node:fs";import{homedir as lv,platform as rm}from"node:os";import{join as Pt}from"node:path";function vr(){let t=process.env.LMCTL_HOME;return t!==void 0&&t.length>0?t:Pt(lv(),cv)}function Jn(){return Pt(vr(),nm)}function Ir(){return Pt(vr(),uv)}function Ft(t){return Pt(Ir(),t)}function rr(t){return Pt(Ft(t),nm)}function ml(){let t=[],e=new Set,r=o=>{Yr(o.db_path)&&(e.has(o.db_path)||(e.add(o.db_path),t.push(o)))};r({workspace_name:null,db_path:Jn(),kind:"legacy"});let n=Ir();if(!Yr(n))return t;let s;try{s=iv(n)}catch{return t}for(let o of s.sort())Xe(o)&&r({workspace_name:o,db_path:rr(o),kind:"workspace"});return t}function pl(t){return Pt(Ft(t),"projects")}function uo(){return Pt(vr(),dv)}function Xe(t){return!(t.length===0||t.length>64||!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(t)||t==="."||t==="..")}function fo(){let t=uo();if(!Yr(t))return null;try{let e=av(t,"utf8").trim();return e.length===0||!Xe(e)?null:e}catch{return null}}function Xn(){let t=process.env.LMCTL_WORKSPACE;return t!==void 0&&t.length>0&&Xe(t)?t:fo()}function le(t){if(t!==void 0&&t.length>0)return t;if(process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0)return process.env.LMCTL_DB;let e=Xn();if(e!==null)return rr(e);let r=Jn();return Yr(r)||!Yr(Ir())?r:rr(sm)}function pv(t,e=rm()){return e!=="linux"?!1:t.startsWith("/mnt/c/")||t==="/mnt/c"}function om(t,e=process.stderr,r=rm()){pv(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 ov=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var re=(t,e)=>{for(var r in e)ov(t,r,{get:e[r],enumerable:!0})};import{existsSync as Yr,readdirSync as iv,readFileSync as av}from"node:fs";import{homedir as lv,platform as rm}from"node:os";import{join as Pt}from"node:path";function vr(){let t=process.env.LMCTL_HOME;return t!==void 0&&t.length>0?t:Pt(lv(),cv)}function Jn(){return Pt(vr(),nm)}function Ir(){return Pt(vr(),uv)}function Ft(t){return Pt(Ir(),t)}function rr(t){return Pt(Ft(t),nm)}function ml(){let t=[],e=new Set,r=o=>{Yr(o.db_path)&&(e.has(o.db_path)||(e.add(o.db_path),t.push(o)))};r({workspace_name:null,db_path:Jn(),kind:"legacy"});let n=Ir();if(!Yr(n))return t;let s;try{s=iv(n)}catch{return t}for(let o of s.sort())Ge(o)&&r({workspace_name:o,db_path:rr(o),kind:"workspace"});return t}function pl(t){return Pt(Ft(t),"projects")}function uo(){return Pt(vr(),dv)}function Ge(t){return!(t.length===0||t.length>64||!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(t)||t==="."||t==="..")}function fo(){let t=uo();if(!Yr(t))return null;try{let e=av(t,"utf8").trim();return e.length===0||!Ge(e)?null:e}catch{return null}}function Xn(){let t=process.env.LMCTL_WORKSPACE;return t!==void 0&&t.length>0&&Ge(t)?t:fo()}function le(t){if(t!==void 0&&t.length>0)return t;if(process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0)return process.env.LMCTL_DB;let e=Xn();if(e!==null)return rr(e);let r=Jn();return Yr(r)||!Yr(Ir())?r:rr(sm)}function pv(t,e=rm()){return e!=="linux"?!1:t.startsWith("/mnt/c/")||t==="/mnt/c"}function om(t,e=process.stderr,r=rm()){pv(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
  `)}function hl(){return Pt(vr(),fv)}function im(){return Pt(vr(),mv)}function hv(){try{return Yr(hl())}catch{return!1}}function am(t=process.stderr){hv()&&t.write(`note: legacy ~/.lmctl/profiles/ detected \u2014 run 'lmctl workspace migrate' to move it to ~/.lmctl/workspaces/
3
- `)}var cv,nm,uv,dv,sm,fv,mv,Nr,Ge=E(()=>{"use strict";cv=".lmctl",nm="state.db",uv="workspaces",dv="active-workspace",sm="default",fv="profiles",mv="active-profile";Nr={default:sm}});function wv(t){for(let e of yv)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 Ev(t){let e=t.toLowerCase();return!!(e==="::1"||e==="::"||e.startsWith("fe80:")||e.startsWith("fe80::"))}function Sv(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 Gn(t){let e=t;for(let{re:r,replacement:n}of gv)e=e.replace(r,n);return e=e.replace(Tv,r=>!Sv(r)||wv(r)?r:lm),e=e.replace(bv,r=>Ev(r)?r:lm),e}function Vn(t){return t.split(`
3
+ `)}var cv,nm,uv,dv,sm,fv,mv,Nr,Ve=E(()=>{"use strict";cv=".lmctl",nm="state.db",uv="workspaces",dv="active-workspace",sm="default",fv="profiles",mv="active-profile";Nr={default:sm}});function wv(t){for(let e of yv)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 Ev(t){let e=t.toLowerCase();return!!(e==="::1"||e==="::"||e.startsWith("fe80:")||e.startsWith("fe80::"))}function Sv(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 Gn(t){let e=t;for(let{re:r,replacement:n}of gv)e=e.replace(r,n);return e=e.replace(Tv,r=>!Sv(r)||wv(r)?r:lm),e=e.replace(bv,r=>Ev(r)?r:lm),e}function Vn(t){return t.split(`
4
4
  `).map(e=>Gn(e)).join(`
5
- `)}function um(t,e){let r=t.toUpperCase();return r.includes("TOKEN")||r.includes("SECRET")||r.includes("KEY")||r.includes("PASSWORD")||r.includes("PASSWD")||r.includes("CREDENTIAL")||r.includes("AUTH")?{key:t,value:at}:{key:t,value:Gn(e)}}function nr(t){if(typeof t=="string")return Gn(t);if(Array.isArray(t))return t.map(e=>nr(e));if(t!==null&&typeof t=="object"){let e={};for(let[r,n]of Object.entries(t)){let s=r.toUpperCase();s.includes("TOKEN")||s.includes("SECRET")||s.includes("KEY")||s.includes("PASSWORD")||s.includes("PASSWD")||s.includes("CREDENTIAL")?e[r]=typeof n=="string"?at:nr(n):e[r]=nr(n)}return e}return t}function dm(t,e){for(let{name:r,re:n}of kv){let s=e.match(n);if(s!==null&&!s[0].includes(at))throw new xr(t,r)}}var at,_v,lm,cm,gv,yv,Tv,bv,kv,xr,mo=E(()=>{"use strict";at="[REDACTED]",_v="[REDACTED_EMAIL]",lm="[REDACTED_IP]",cm="[USER]",gv=[{re:/(authorization\s*[:=]\s*)(bearer\s+[^\s,;"']+)/gi,replacement:`$1Bearer ${at}`},{re:/(authorization\s*[:=]\s*)(basic\s+[^\s,;"']+)/gi,replacement:`$1Basic ${at}`},{re:/\b(Bearer\s+)[A-Za-z0-9_\-./+=]{8,}/g,replacement:`$1${at}`},{re:/\bsk-ant-[A-Za-z0-9_\-]{8,}/g,replacement:at},{re:/\bsk-[A-Za-z0-9_\-]{16,}/g,replacement:at},{re:/\bgh[pousr]_[A-Za-z0-9]{30,}/g,replacement:at},{re:/\bAKIA[0-9A-Z]{16}\b/g,replacement:at},{re:/\b(api[_-]?key|token|secret|password|passwd)(\s*[:=]\s*"?)([A-Za-z0-9_\-./+=]{8,})("?)/gi,replacement:`$1$2${at}$4`},{re:/(\/home\/)[^/\s"'`]+/g,replacement:`$1${cm}`},{re:/(\/Users\/)[^/\s"'`]+/g,replacement:`$1${cm}`},{re:/\b[A-Za-z0-9._%+\-]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,}\b/g,replacement:_v}],yv=["127.","10.","192.168.","0.0.0.0"];Tv=/\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/g,bv=/\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;kv=[{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"'`]+/}],xr=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 vv}from"node:fs";import{readFile as yl,stat as fm}from"node:fs/promises";import{homedir as Iv}from"node:os";import{join as Nv}from"node:path";import{fileURLToPath as xv}from"node:url";function lt(){try{let t=new URL("../../package.json",import.meta.url),e=JSON.parse(vv(xv(t),"utf8"));if(typeof e.version=="string")return e.version}catch{}return"0.0.0"}async function mm(t){let e=new Set(t.include??po),r={};return e.has("serve")&&(r.serve=await $v(t)),e.has("db")&&(r.db=Rv(t)),e.has("runs")&&(r.runs=jv(t)),e.has("jobs")&&(r.jobs=Ov(t)),e.has("attentions")&&(r.attentions=Lv(t)),e.has("env")&&(r.env=await Cv(t)),e.has("intents")&&(r.intents=await Dv(t)),r}async function $v(t){let e=t.pidFile??process.env.LMCTL_PID_FILE,r=t.serveLog??process.env.LMCTL_SERVE_LOG,n=t.logTailLines??1e3,s=null,o="none";if(e!==void 0)try{let u=(await yl(e,"utf8")).trim(),d=Number.parseInt(u,10);Number.isInteger(d)&&d>0&&(s=d,o="pidfile")}catch{}let i=null;if(s!==null)try{process.kill(s,0),i=!0}catch{i=!1}let a="",l=null,c=0;if(r===void 0)l="no serve log configured (set LMCTL_SERVE_LOG or --serve-log)";else try{let d=(await yl(r,"utf8")).split(`
5
+ `)}function um(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:lt}:{key:t,value:Gn(e)}}function nr(t){if(typeof t=="string")return Gn(t);if(Array.isArray(t))return t.map(e=>nr(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"?lt:nr(n):e[r]=nr(n)}return e}return t}function dm(t,e){for(let{name:r,re:n}of kv){let s=e.match(n);if(s!==null&&!s[0].includes(lt))throw new xr(t,r)}}var lt,_v,lm,cm,gv,yv,Tv,bv,kv,xr,mo=E(()=>{"use strict";lt="[REDACTED]",_v="[REDACTED_EMAIL]",lm="[REDACTED_IP]",cm="[USER]",gv=[{re:/(authorization\s*[:=]\s*)(bearer\s+[^\s,;"']+)/gi,replacement:`$1Bearer ${lt}`},{re:/(authorization\s*[:=]\s*)(basic\s+[^\s,;"']+)/gi,replacement:`$1Basic ${lt}`},{re:/\b(Bearer\s+)[A-Za-z0-9_\-./+=]{8,}/g,replacement:`$1${lt}`},{re:/\bsk-ant-[A-Za-z0-9_\-]{8,}/g,replacement:lt},{re:/\bsk-[A-Za-z0-9_\-]{16,}/g,replacement:lt},{re:/\bgh[pousr]_[A-Za-z0-9]{30,}/g,replacement:lt},{re:/\bAKIA[0-9A-Z]{16}\b/g,replacement:lt},{re:/\b(api[_-]?key|token|secret|password|passwd)(\s*[:=]\s*"?)([A-Za-z0-9_\-./+=]{8,})("?)/gi,replacement:`$1$2${lt}$4`},{re:/(\/home\/)[^/\s"'`]+/g,replacement:`$1${cm}`},{re:/(\/Users\/)[^/\s"'`]+/g,replacement:`$1${cm}`},{re:/\b[A-Za-z0-9._%+\-]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,}\b/g,replacement:_v}],yv=["127.","10.","192.168.","0.0.0.0"];Tv=/\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/g,bv=/\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;kv=[{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"'`]+/}],xr=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 vv}from"node:fs";import{readFile as yl,stat as fm}from"node:fs/promises";import{homedir as Iv}from"node:os";import{join as Nv}from"node:path";import{fileURLToPath as xv}from"node:url";function ct(){try{let t=new URL("../../package.json",import.meta.url),e=JSON.parse(vv(xv(t),"utf8"));if(typeof e.version=="string")return e.version}catch{}return"0.0.0"}async function mm(t){let e=new Set(t.include??po),r={};return e.has("serve")&&(r.serve=await $v(t)),e.has("db")&&(r.db=Rv(t)),e.has("runs")&&(r.runs=jv(t)),e.has("jobs")&&(r.jobs=Ov(t)),e.has("attentions")&&(r.attentions=Lv(t)),e.has("env")&&(r.env=await Cv(t)),e.has("intents")&&(r.intents=await Dv(t)),r}async function $v(t){let e=t.pidFile??process.env.LMCTL_PID_FILE,r=t.serveLog??process.env.LMCTL_SERVE_LOG,n=t.logTailLines??1e3,s=null,o="none";if(e!==void 0)try{let u=(await yl(e,"utf8")).trim(),d=Number.parseInt(u,10);Number.isInteger(d)&&d>0&&(s=d,o="pidfile")}catch{}let i=null;if(s!==null)try{process.kill(s,0),i=!0}catch{i=!1}let a="",l=null,c=0;if(r===void 0)l="no serve log configured (set LMCTL_SERVE_LOG or --serve-log)";else try{let d=(await yl(r,"utf8")).split(`
6
6
  `),f=d.slice(Math.max(0,d.length-n));c=f.length,a=Vn(f.join(`
7
7
  `))}catch(u){l=`serve log unreadable: ${u instanceof Error?u.message:String(u)}`}return{pid:s,pid_source:o,pid_alive:i,log_tail_lines:c,log_tail:a,log_note:l}}function Rv(t){let{dal:e}=t,r="unknown";try{r=e.query("PRAGMA integrity_check;").map(i=>i.integrity_check??JSON.stringify(i)).join(`
8
8
  `)}catch(o){r=`integrity_check failed: ${o instanceof Error?o.message:String(o)}`}let n=0;try{n=e.query("PRAGMA user_version;")[0]?.user_version??0}catch{n=0}let s={};try{let o=e.query("SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' ORDER BY name");for(let{name:i}of o)try{let a=e.query(`SELECT COUNT(*) AS c FROM "${i.replace(/"/g,'""')}"`);s[i]=a[0]?.c??0}catch{s[i]=-1}}catch{}return{integrity_check:r,schema_version:n,table_counts:s}}function jv(t){let{dal:e}=t,r=(t.now??new Date).toISOString(),n=(t.staleThresholdMin??60)*6e4,s=new Date(Date.parse(r)-n).toISOString(),o=e.query(`SELECT ${gl} FROM run ORDER BY id DESC LIMIT 50`),i=e.query(`SELECT ${gl} FROM run WHERE paused_at IS NOT NULL AND terminal_state IS NULL ORDER BY paused_at DESC LIMIT 50`),a=e.query(`SELECT ${gl} FROM run
9
9
  WHERE terminal_state IS NULL
10
10
  AND started_at < ?
11
11
  ORDER BY started_at ASC LIMIT 50`,s);return{last_50:nr(o),stale:nr(a),paused:nr(i)}}function Ov(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:i,c:a}of r)i==="queued"?n.pending+=a:i==="running"?n.running+=a:i==="done"||i==="succeeded"?n.done+=a:i==="failed"?n.failed+=a:i==="paused"&&(n.paused+=a);let s=e.query("SELECT id FROM job WHERE status IN ('queued', 'available') ORDER BY id DESC LIMIT 100"),o=e.query("SELECT id FROM job WHERE status = 'running' ORDER BY id DESC LIMIT 100");return{queue_state:n,pending_ids:s.map(i=>i.id),running_ids:o.map(i=>i.id)}}function Lv(t){let{dal:e}=t,r=e.query(`SELECT id, kind, severity, project_id, run_id, external_object_id, requires_user, created_at
12
- FROM attention WHERE acknowledged_at IS NULL ORDER BY created_at DESC LIMIT 100`);return{unacked:nr(r)}}async function Cv(t){let e=lt(),r=process.version,n=_l("uname",["-a"],{encoding:"utf8"}),s=Vn((n.stdout??"").trim()),o=[],i=t.dbPath??process.env.LMCTL_DB;if(i!==void 0)try{await fm(i);let u=_l("du",["-sh",i],{encoding:"utf8"});u.status===0&&o.push(u.stdout.trim())}catch{}let a=t.sessiondir??process.env.LMCTL_SESSIONDIR;if(a!==void 0)try{await fm(a);let u=_l("du",["-sh",a],{encoding:"utf8"});u.status===0&&o.push(u.stdout.trim())}catch{}let l=o.length===0?"(no paths configured)":Vn(o.join(`
12
+ FROM attention WHERE acknowledged_at IS NULL ORDER BY created_at DESC LIMIT 100`);return{unacked:nr(r)}}async function Cv(t){let e=ct(),r=process.version,n=_l("uname",["-a"],{encoding:"utf8"}),s=Vn((n.stdout??"").trim()),o=[],i=t.dbPath??process.env.LMCTL_DB;if(i!==void 0)try{await fm(i);let u=_l("du",["-sh",i],{encoding:"utf8"});u.status===0&&o.push(u.stdout.trim())}catch{}let a=t.sessiondir??process.env.LMCTL_SESSIONDIR;if(a!==void 0)try{await fm(a);let u=_l("du",["-sh",a],{encoding:"utf8"});u.status===0&&o.push(u.stdout.trim())}catch{}let l=o.length===0?"(no paths configured)":Vn(o.join(`
13
13
  `)),c=[];for(let u of Av){let d=process.env[u];if(d===void 0){c.push({key:u,value:"(unset)"});continue}c.push(um(u,d))}return{lmctl_next_version:e,node_version:r,os_info:s,disk_usage:l,env_keys_present:c}}function Mv(){return process.env.LMCTL_INTENT_LOG??Nv(Iv(),".lmctl","recent-intents.log")}async function Dv(t){let e=t.intentLog??Mv(),r=t.intentLogTailLines??500;try{let s=(await yl(e,"utf8")).split(`
14
14
  `).filter(i=>i.length>0),o=s.slice(Math.max(0,s.length-r));return{source_path:e,tail_lines:o.length,tail:Vn(o.join(`
15
- `)),note:null}}catch(n){return n.code==="ENOENT"?{source_path:e,tail_lines:0,tail:"",note:"no intent log present (status never run on this host)"}:{source_path:e,tail_lines:0,tail:"",note:`intent log unreadable: ${n instanceof Error?n.message:String(n)}`}}}var po,Av,gl,Kn=E(()=>{"use strict";mo();po=["serve","db","runs","jobs","attentions","env","intents"];Av=["LMCTL_DB","LMCTL_API_URL","LMCTL_API_TOKEN","LMCTL_PID_FILE","LMCTL_SERVE_LOG","LMCTL_SESSIONDIR","LMCTL_DAEMON_INTERVAL_MS","LMCTL_SESSION_SIZE_DISABLED","NODE_ENV","PATH"];gl=["id","job_id","workflow_id","team_id","current_state","terminal_state","started_at","ended_at","paused_at","parent_run_id","blocker"].join(", ")});import{readFileSync as _m,appendFileSync as Pv,mkdirSync as Fv,existsSync as oJ,readdirSync as iJ,unlinkSync as aJ}from"node:fs";import{join as _o,dirname as Uv}from"node:path";import{homedir as Wv}from"node:os";function wl(){return _o(Wv(),".lmctl")}function gm(){zr=!0,process.env.LMCTL_DEBUG="1"}function ym(){return{cliDebug:zr,lmctlDebugEnv:process.env.LMCTL_DEBUG}}function wm(t){zr=t.cliDebug,t.lmctlDebugEnv===void 0?delete process.env.LMCTL_DEBUG:process.env.LMCTL_DEBUG=t.lmctlDebugEnv}function he(){if(zr)return!0;let t=Date.now();return t-hm>=Bv&&(pm=Jv(),hm=t),pm}function El(){return zr||process.env.LMCTL_DEBUG==="1"}function Hv(){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 ct(t,e){if(e?.verbose){if(!zr)return}else if(!e?.always&&!he())return;try{qv();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};Pv(ho,JSON.stringify(r)+`
16
- `)}catch{}}function qv(){if(!ho){let e=Hv().slice(0,13).replace("T","-");ho=_o(wl(),`debug-${e}.log`)}Fv(Uv(ho),{recursive:!0})}function Fe(...t){ct({event:"legacy",msg:t.join(" ")})}function bt(...t){ct({event:"legacy",msg:t.join(" ")},{verbose:!0})}function z(t){ct(t,{always:!0})}function Jv(){return Xv()||Gv()}function Xv(){try{let t=_m(_o(wl(),"config.toml"),"utf-8");for(let e of t.split(`
15
+ `)),note:null}}catch(n){return n.code==="ENOENT"?{source_path:e,tail_lines:0,tail:"",note:"no intent log present (status never run on this host)"}:{source_path:e,tail_lines:0,tail:"",note:`intent log unreadable: ${n instanceof Error?n.message:String(n)}`}}}var po,Av,gl,Kn=E(()=>{"use strict";mo();po=["serve","db","runs","jobs","attentions","env","intents"];Av=["LMCTL_DB","LMCTL_API_URL","LMCTL_API_TOKEN","LMCTL_PID_FILE","LMCTL_SERVE_LOG","LMCTL_SESSIONDIR","LMCTL_DAEMON_INTERVAL_MS","LMCTL_SESSION_SIZE_DISABLED","NODE_ENV","PATH"];gl=["id","job_id","workflow_id","team_id","current_state","terminal_state","started_at","ended_at","paused_at","parent_run_id","blocker"].join(", ")});import{readFileSync as _m,appendFileSync as Pv,mkdirSync as Fv,existsSync as oJ,readdirSync as iJ,unlinkSync as aJ}from"node:fs";import{join as _o,dirname as Uv}from"node:path";import{homedir as Wv}from"node:os";function wl(){return _o(Wv(),".lmctl")}function gm(){zr=!0,process.env.LMCTL_DEBUG="1"}function ym(){return{cliDebug:zr,lmctlDebugEnv:process.env.LMCTL_DEBUG}}function wm(t){zr=t.cliDebug,t.lmctlDebugEnv===void 0?delete process.env.LMCTL_DEBUG:process.env.LMCTL_DEBUG=t.lmctlDebugEnv}function he(){if(zr||process.env.LMCTL_DEBUG==="1")return!0;let t=Date.now();return t-hm>=Bv&&(pm=Jv(),hm=t),pm}function El(){return zr||process.env.LMCTL_DEBUG==="1"}function Hv(){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 Le(t,e){if(e?.verbose){if(!zr)return}else if(!e?.always&&!he())return;try{qv();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};Pv(ho,JSON.stringify(r)+`
16
+ `)}catch{}}function qv(){if(!ho){let e=Hv().slice(0,13).replace("T","-");ho=_o(wl(),`debug-${e}.log`)}Fv(Uv(ho),{recursive:!0})}function Ue(...t){Le({event:"legacy",msg:t.join(" ")})}function bt(...t){Le({event:"legacy",msg:t.join(" ")},{verbose:!0})}function z(t){Le(t,{always:!0})}function Jv(){return Xv()||Gv()}function Xv(){try{let t=_m(_o(wl(),"config.toml"),"utf-8");for(let e of t.split(`
17
17
  `)){let r=e.trim();if(!r||r.startsWith("#"))continue;if(r.startsWith("["))break;let n=/^debug\s*=\s*(.+)$/.exec(r);if(n){let s=n[1].trim().toLowerCase().replace(/^["']|["']$/g,"");return s==="true"||s==="1"}}}catch{}return!1}function Gv(){try{let t=_m(_o(wl(),"config.json"),"utf-8"),e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)&&e.debug===!0}catch{}return!1}var zr,pm,hm,Bv,ho,Ne=E(()=>{"use strict";zr=!1,pm=!1,hm=0,Bv=5e3;ho=null});function Yn(t){try{return new URL(t).protocol==="https:"}catch{return!1}}function Tl(t){return/^[A-Za-z]:[\\/]/.test(t)?!1:/^[A-Za-z][A-Za-z0-9+.-]*:/.test(t)}function zn(t,e){return!Tl(t)||Yn(t)?null:`${e} must use https://: ${t}`}async function go(t,e){let r=zn(t,e.description);if(r!==null||!Yn(t))throw new Error(r??`${e.description} must use https://: ${t}`);let n=e.timeoutMs??15e3,s=new AbortController,o=setTimeout(()=>s.abort(),n);try{let i;try{i=await fetch(t,{signal:s.signal,redirect:"manual"})}catch(a){throw Em(t,e.description,n,a)}if(i.type==="opaqueredirect"||i.status>=300&&i.status<400)throw new Error(`refusing to follow redirect from ${e.description} ${t} (https-only: the URL must serve the content directly, not redirect)`);if(!i.ok)throw new Error(`failed to fetch ${e.description} ${t}: HTTP ${i.status}${i.statusText?` ${i.statusText}`:""}`);try{return Buffer.from(await i.arrayBuffer())}catch(a){throw Em(t,e.description,n,a)}}finally{clearTimeout(o)}}function Em(t,e,r,n){let o=n instanceof Error&&n.name==="AbortError"?`timed out after ${r}ms`:n instanceof Error?n.message:String(n);return new Error(`failed to fetch ${e} ${t}: ${o}`)}var bl=E(()=>{"use strict"});import{existsSync as uI}from"node:fs";import{createRequire as dI}from"node:module";function fI(){return kl===null&&(kl=dI(import.meta.url)("node:sqlite").DatabaseSync),kl}function vl(t){return t.length===1&&mI(t[0])?[t[0]]:t}function mI(t){if(!xl(t))return!1;let e=Object.getPrototypeOf(t);return e===Object.prototype||e===null}function xl(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var kl,Il,yo,Nl,Al=E(()=>{"use strict";kl=null;Il=class{name;handle;transactionDepth=0;savepointId=0;constructor(e,r={}){if(r.fileMustExist===!0&&e!==":memory:"&&!uI(e))throw new Error("unable to open database file");this.name=e,this.handle=new(fI())(e,{readOnly:r.readonly===!0}),this.exec("PRAGMA busy_timeout = 5000")}prepare(e){return new Nl(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)}}},yo=Il,Nl=class{handle;rawMode=!1;constructor(e){this.handle=e,this.handle.setAllowBareNamedParameters(!0)}get(...e){let r=this.handle.get(...vl(e));return this.normalizeRow(r)}all(...e){return this.handle.all(...vl(e)).map(r=>this.normalizeRow(r))}run(...e){let r=this.handle.run(...vl(e));return{changes:Number(r.changes),lastInsertRowid:Number(r.lastInsertRowid)}}raw(){return this.rawMode=!0,this}normalizeRow(e){return e==null?e:this.rawMode&&xl(e)?Object.values(e):xl(e)?{...e}:e}}});import{existsSync as pI,mkdirSync as hI,readFileSync as _I}from"node:fs";import{homedir as gI}from"node:os";import{dirname as bm,join as yI,resolve as Sm}from"node:path";import{fileURLToPath as wI,pathToFileURL as EI}from"node:url";function Rl(t){t.dbPath!==":memory:"&&hI(bm(t.dbPath),{recursive:!0});let e=new yo(t.dbPath);e.pragma("journal_mode = WAL"),e.pragma("synchronous = NORMAL"),e.pragma("foreign_keys = ON");let r=vm(e);return r===0&&(e.exec(_I(TI,"utf8")),e.pragma(`user_version = ${$l}`)),SI(e,r),e}function SI(t,e){let r=e;if(r<2&&r!==0&&(t.exec(`
18
18
  CREATE TABLE IF NOT EXISTS session_size (
19
19
  id INTEGER PRIMARY KEY AUTOINCREMENT,
@@ -1157,10 +1157,9 @@ var ov=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var re=(t,e)=>{f
1157
1157
  error_detail = ?,
1158
1158
  truncated = ?
1159
1159
  WHERE id = ?
1160
- `),...Am(t),...Im(t)}}function jI(t,e){return e===void 0?{resumed:!1,reason:t}:{resumed:!1,reason:t,valid:e}}var Ll,Ue=E(()=>{"use strict";jl();Nm();$m();Lm();Mm();rs();Ll=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;tryAcquireAgentInflightTxn;recvMailboxMessagesTxn;constructor(e){e.pragma("foreign_keys = ON"),this.db=e,this.stmts=RI(e),this.claimTxn=e.transaction((r,n,s)=>{let o=this.stmts.selectClaimableJob.get(s,s,s);return o===void 0||this.stmts.claimJob.run(r,n,s,o.id,s,s,s).changes!==1?null:this.getJob(o.id)}),this.claimWithConcurrencyTxn=e.transaction((r,n,s,o)=>{let i=this.stmts.selectClaimableJobs.all(s,s,s);for(let a of i){let l=this.getJob(a.id);if(l===null)continue;let c=o(l);if(c.concurrency_key!==null&&(l.concurrency_key_resolved!==c.concurrency_key&&this.stmts.setJobConcurrencyKey.run(c.concurrency_key,l.id),(this.stmts.countRunningByConcurrencyKey.get(c.concurrency_key,s,l.id)?.count??0)>=Math.max(1,c.concurrent_limit)))continue;if(this.stmts.claimJob.run(r,n,s,l.id,s,s,s).changes===1)return this.getJob(l.id)}return null}),this.claimByIdWithConcurrencyTxn=e.transaction((r,n,s,o,i)=>{let a=this.getJob(r);if(a===null)return{claimed:!1,reason:"not_found",job_id:r};if(a.locked_until!==null&&a.locked_until>=o)return{claimed:!1,reason:"locked",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let c=a.status==="queued"&&a.available_at<=o,u=a.status==="running"&&a.locked_until!==null&&a.locked_until<o;if(!c&&!u)return{claimed:!1,reason:"not_claimable",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let d=i(a);if(d.concurrency_key!==null&&(a.concurrency_key_resolved!==d.concurrency_key&&this.stmts.setJobConcurrencyKey.run(d.concurrency_key,a.id),(this.stmts.countRunningByConcurrencyKey.get(d.concurrency_key,o,a.id)?.count??0)>=Math.max(1,d.concurrent_limit)))return{claimed:!1,reason:"concurrency_limit",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};if(this.stmts.claimJob.run(n,s,o,a.id,o,o,o).changes!==1){let p=this.getJob(a.id);return{claimed:!1,reason:p?.locked_until!==null&&p?.locked_until!==void 0&&p.locked_until>=o?"locked":"not_claimable",job_id:r,status:p?.status??a.status,locked_by:p?.locked_by??a.locked_by,locked_until:p?.locked_until??a.locked_until}}let m=this.getJob(a.id);return m===null?{claimed:!1,reason:"not_found",job_id:r}:{claimed:!0,job:m}}),this.resumeRunTxn=e.transaction((r,n,s)=>jI("state_not_found")),this.resumeInteractiveTxn=e.transaction((r,n,s,o)=>{let i=this.getInteractiveSessionByStepId(r);if(i===null)return{resumed:!1,reason:"not_found"};if(i.status!=="waiting_operator")return{resumed:!1,reason:"not_waiting_operator"};let a=this.getRun(i.run_id);if(a===null)return{resumed:!1,reason:"run_not_found"};let l=s?"done":"waiting_agent";return this.stmts.updateInteractiveSession.run(l,n,Date.now(),i.id),this.stmts.resumeRunState.run(i.state_name,a.id),this.stmts.requeuePausedJob.run(o,a.job_id),{resumed:!0,session:this.getInteractiveSessionByStepId(r),run:this.getRun(a.id),job:this.getJob(a.job_id)}}),this.resumeEscalationTxn=e.transaction((r,n,s)=>{let o=this.stmts.getAttention.get(r);if(o===void 0)return{resumed:!1,reason:"not_found"};if(o.kind!==Eo)return{resumed:!1,reason:"wrong_kind"};if(o.acknowledged_at!==null)return{resumed:!1,reason:"already_acked"};if(o.run_id===null)return{resumed:!1,reason:"run_not_found"};let i=null,a=[];if(o.payload!==null)try{let u=JSON.parse(o.payload);u.step!==void 0&&typeof u.step.id=="string"&&u.step.id.length>0&&(i=u.step.id),Array.isArray(u.declared_outcomes)&&(a=u.declared_outcomes.filter(d=>typeof d=="string"))}catch{}if(i===null)return{resumed:!1,reason:"no_step"};let l=this.getRun(o.run_id);if(l===null)return{resumed:!1,reason:"run_not_found"};if(n!==ts&&!a.includes(n))return{resumed:!1,reason:Pm};let c={};if(l.pending_escalation_decision!==null)try{let u=JSON.parse(l.pending_escalation_decision);u!==null&&typeof u=="object"&&!Array.isArray(u)&&(c=u)}catch{c={}}return c[i]=n,this.stmts.setRunPendingEscalationDecision.run(JSON.stringify(c),l.id),this.stmts.resumeRunState.run(i,l.id),this.stmts.requeuePausedJob.run(s,l.job_id),this.stmts.ackAttention.run(s,r),{resumed:!0,run:this.getRun(l.id),job:this.getJob(l.job_id)}}),this.tryAcquireAgentInflightTxn=(r,n={})=>{this.db.exec("BEGIN IMMEDIATE");try{let s=n.reclaim_observed,o=this.stmts.acquireAgentInflight.get({...r,holder_pid:process.pid,stale_before:n.stale_before??null,force:n.force===!0?1:0,reclaim_observed_sender_teamfile:s?.sender_teamfile??null,reclaim_observed_sender_alias:s?.sender_alias??null,reclaim_observed_started_at:s?.started_at??null,reclaim_observed_holder_pid:typeof s?.holder_pid=="number"?s.holder_pid:null}),i=o!==void 0?{acquired:!0,current:o}:{acquired:!1,current:this.getAgentInflight(r.receiver_teamfile,r.receiver_alias)??(()=>{throw new Error("agent_inflight conflict row disappeared during acquire")})()};return this.db.exec("COMMIT"),i}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}},this.recvMailboxMessagesTxn=e.transaction((r,n)=>{let s=this.stmts.listAllMailboxMessagesForReceiver.all(r,n);for(let o of s)this.stmts.deleteMailboxMessage.run(o.id);return s})}close(){this.db.close()}query(e,...r){let n=e.trim().toLowerCase();if(!n.startsWith("select")&&!n.startsWith("with")&&!n.startsWith("pragma"))throw new Error("Dal.query only allows read-only SELECT/WITH/PRAGMA statements");return this.db.prepare(e).all(...r)}insertWorkflow(e){Um(e.name,e.definition,i=>this.getWorkflowByName(i));let r=this.stmts.insertWorkflow.run(e.name,e.version??1,e.definition_schema_version??1,e.definition,F()),n=this.getWorkflow(Number(r.lastInsertRowid)),s=this.stmts.insertWorkflowVersion.run(n.id,n.version,e.definition,e.author??null,F());this.stmts.updateWorkflowActiveVersion.run(s.lastInsertRowid,n.id),(e.source_uri!=null||e.source_sha256!=null)&&this.stmts.setWorkflowSource.run(e.source_uri??null,e.source_sha256??null,n.id);let o=this.getWorkflow(n.id);return this.syncWorkflowTriggers(n.id,e.definition),o}upsertWorkflow(e){Um(e.name,e.definition,i=>this.getWorkflowByName(i));let r=this.getWorkflowByName(e.name);if(r===null)return this.insertWorkflow({name:e.name,definition_schema_version:e.definition_schema_version,definition:e.definition,author:e.author,source_uri:e.source_uri,source_sha256:e.source_sha256});let s=(this.stmts.getLatestWorkflowVersion.get(r.id)?.version??r.version)+1,o=this.stmts.insertWorkflowVersion.run(r.id,s,e.definition,e.author??null,F());return this.stmts.updateWorkflowActiveVersionDefinitionAndVersion.run(Number(o.lastInsertRowid),e.definition,e.definition_schema_version??r.definition_schema_version,s,r.id),(e.source_uri!=null||e.source_sha256!=null)&&this.stmts.setWorkflowSource.run(e.source_uri??null,e.source_sha256??null,r.id),this.syncWorkflowTriggers(r.id,e.definition),this.getWorkflow(r.id)}insertCompositionUnit(e){this.stmts.insertCompositionUnit.run(e.name,e.version,e.lang,e.source,e.source_sha,e.compiled_workflow_version_id,F())}getWorkflow(e){return this.stmts.getWorkflow.get(e)??null}getWorkflowByName(e,r){return(r===void 0?this.stmts.findWorkflowLatest.get(e):this.stmts.findWorkflowVersion.get(e,r))??null}findWorkflowByName(e,r){return this.getWorkflowByName(e,r)}insertWorkflowVersion(e,r,n){let o=(this.stmts.getLatestWorkflowVersion.get(e)?.version??0)+1,i=this.stmts.insertWorkflowVersion.run(e,o,r,n??null,F());return this.stmts.getWorkflowVersion.get(i.lastInsertRowid)}activateWorkflowVersion(e,r){let n=this.getWorkflowVersionById(r);if(n===null||n.workflow_id!==e)return null;let s=1;try{let o=JSON.parse(n.definition);typeof o.definition_schema_version=="number"&&(s=o.definition_schema_version)}catch{}return this.stmts.updateWorkflowActiveVersionAndDefinition.run(r,n.definition,s,e),this.syncWorkflowTriggers(e,n.definition),this.getWorkflow(e)}getWorkflowVersionById(e){return this.stmts.getWorkflowVersion.get(e)??null}listWorkflowVersions(e){return this.stmts.listWorkflowVersions.all(e)}upsertTriggerInstance(e){return this.stmts.upsertTriggerInstance.run(e.workflow_id,e.trigger_id,e.trigger_type,e.parameters,e.enabled===!1?0:1,F()),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,F(),e),this.stmts.getTriggerInstance.get(e)??null}setTriggerFailure(e,r){return this.stmts.setTriggerFailure.run(F(),r,e),this.stmts.getTriggerInstance.get(e)??null}syncWorkflowTriggers(e,r){let n;try{n=JSON.parse(r)}catch{return}if(n===null||typeof n!="object"||Array.isArray(n))return;let s=n.triggers;if(Array.isArray(s))for(let o of s){if(o===null||typeof o!="object"||Array.isArray(o))continue;let i=o;typeof i.id!="string"||i.id.length===0||typeof i.type!="string"||i.type.length===0||this.upsertTriggerInstance({workflow_id:e,trigger_id:i.id,trigger_type:i.type,parameters:JSON.stringify(i.parameters??{})})}}insertTeam(e){let r=this.stmts.insertTeam.run(e.name,F());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,F());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,F(),e),this.stmts.getTeamMember.get(e)??null}listMembersInState(e){return this.stmts.listMembersInState.all(e)}setMemberPromptSnapshot(e,r){return this.stmts.setMemberPromptSnapshot.run(r,e),this.stmts.getTeamMember.get(e)??null}setMemberProviderResolved(e,r){return this.stmts.setMemberProviderResolved.run(r,e),this.stmts.getTeamMember.get(e)??null}setMemberRolePrompt(e,r){return this.stmts.setMemberRolePrompt.run(r,e),this.stmts.getTeamMember.get(e)??null}updateTeamMemberMeta(e,r){let n=this.stmts.getTeamMember.get(e);if(n===void 0)return null;let s=Object.prototype.hasOwnProperty.call(r,"role_prompt"),o=Object.prototype.hasOwnProperty.call(r,"model"),i=Object.prototype.hasOwnProperty.call(r,"provider");return this.stmts.updateTeamMemberMeta.run(s?r.role_prompt??null:n.role_prompt,o?r.model??null:n.model,i?r.provider??n.provider:n.provider,e),this.stmts.getTeamMember.get(e)??null}insertTeamMemberCompanion(e){let r=this.stmts.insertTeamMemberCompanion.run(e.interpreter_id,e.companion_id,F());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",F());return this.stmts.getProject.get(r.lastInsertRowid)}listProjects(){return this.stmts.listProjects.all()}getProject(e){return this.stmts.getProject.get(e)??null}findProjectByName(e){return this.stmts.findProjectByName.get(e)??null}setProjectIntakeConfig(e,r){return this.stmts.setProjectIntakeConfig.run(r,e),this.stmts.getProject.get(e)??null}updateProjectSettings(e,r){let n=this.stmts.getProject.get(e);if(n===void 0)return null;let s=Object.prototype.hasOwnProperty.call(r,"local_path"),o=Object.prototype.hasOwnProperty.call(r,"durable_memory_mode"),i=Object.prototype.hasOwnProperty.call(r,"default_branch"),a=Object.prototype.hasOwnProperty.call(r,"intake_config");return this.stmts.updateProjectSettings.run(s?r.local_path:n.local_path,o?r.durable_memory_mode:n.durable_memory_mode,i?r.default_branch??null:n.default_branch,a?r.intake_config??null:n.intake_config,e),this.stmts.getProject.get(e)??null}listProjectsWithIntakeEnabled(){return this.stmts.listProjectsWithIntakeConfig.all().filter(e=>{if(e.intake_config===null)return!1;try{let r=JSON.parse(e.intake_config);return typeof r=="object"&&r!==null&&!Array.isArray(r)&&r.scan_github_issues===!0}catch{return!1}})}getProjectByJob(e){return this.stmts.getProjectByJob.get(e)??null}insertProjectWorkflow(e){let r=e.condition??null,n=this.stmts.findProjectWorkflowUnique.get(e.project_id,e.workflow_id,r);if(n!==void 0)return n;let s=this.stmts.insertProjectWorkflow.run(e.project_id,e.workflow_id,r,e.parameters_override??null,e.enabled===!1?0:1,e.priority??100,F());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=F(),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,F(),e)??null}claimIssue(e,r){return this.stmts.claimIssue.get(r,F(),e)??null}closeIssue(e,r,n){let s=F(),o=this.stmts.closeIssue.get(r,n??null,s,s,e);if(o===void 0)throw new Error(`issue not found: ${e}`);return o}reopenIssue(e,r){let n=this.stmts.reopenIssue.get(r,F(),e);if(n===void 0)throw this.getIssue(e)===null?new Error(`issue not found: ${e}`):new Error(`issue ${e} is not closed`);return n}updateIssue(e,r){let n=this.getIssue(e);if(n===null)throw new Error(`issue not found: ${e}`);let s=Object.prototype.hasOwnProperty.call(r,"labels"),o=Object.prototype.hasOwnProperty.call(r,"ai_test_path"),i=this.stmts.updateIssue.get(r.title??n.title,r.body??n.body,r.severity??n.severity,s?r.labels??null:n.labels,o?r.ai_test_path??null:n.ai_test_path,F(),e);if(i===void 0)throw new Error(`issue not found: ${e}`);return i}listWorkflows(){return this.stmts.listWorkflows.all()}getOrCreateWebuiSession(e,r){let n=this.stmts.getWebuiSession.get(e);if(n!==void 0)return n;let s=F();return this.stmts.insertWebuiSession.run(e,r,"N1",null,null,null,null,"authenticated",s,s),this.stmts.getWebuiSession.get(e)}getWebuiSession(e){return this.stmts.getWebuiSession.get(e)??null}updateWebuiSessionTransition(e,r,n,s,o){if(this.stmts.updateWebuiSessionTransition.run(r,n,s,o,F(),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,F(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}createChatbotSession(e,r){let n=NI(),s=F();return this.stmts.insertChatbotSession.run(n,e,r??null,s,s,"active"),this.stmts.getChatbotSession.get(n)}getChatbotSession(e){return this.stmts.getChatbotSession.get(e)??null}listChatbotSessions(e){return this.stmts.listChatbotSessionsForUser.all(e)}appendChatbotMessage(e,r,n,s){let o=F(),i=this.stmts.insertChatbotMessage.run(e,r,n,s??null,o);return this.stmts.touchChatbotSession.run(o,e),this.stmts.getChatbotMessage.get(i.lastInsertRowid)}listChatbotMessages(e){return this.stmts.listChatbotMessages.all(e)}getConfig(e){return this.stmts.getConfig.get(e)?.value??null}setConfig(e,r){this.stmts.upsertConfig.run(e,r,F())}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??F(),e.dedupe_key??null,e.concurrency_key??null,F());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=F(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimTxn(e.worker_id,n,r)}claimNextJobWithConcurrency(e){let r=F(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimWithConcurrencyTxn(e.worker_id,n,r,e.evaluator)}claimJobByIdWithConcurrency(e){let r=F(),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:F();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,F()),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,F()),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??F(),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,F());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=F(),n=this.stmts.insertWebProject.run(e.workspace_id,e.name,e.repo_path,e.config_json??null,e.linked_v4_project_id??null,r,r),s=Number(n.lastInsertRowid),o=this.getWebProject(s);if(o===null)throw new Error(`web_project ${s} missing after insert`);return o}updateWebProject(e){let r=this.getWebProject(e.id);return r===null||r.deleted_at!==null?null:(this.stmts.updateWebProject.run(e.name??r.name,e.config_json===void 0?r.config_json:e.config_json,F(),e.id),this.getWebProject(e.id))}softDeleteWebProject(e){return this.stmts.softDeleteWebProject.run(F(),e).changes===1}loadMailboxCursor(e,r){return this.stmts.loadMailboxCursor.get(e,r)??null}saveMailboxCursor(e){this.stmts.saveMailboxCursor.run(e.user_id,e.mailbox_key,e.last_processed_version_id,e.last_processed_seq??null,e.last_processed_at)}addUsage(e){this.stmts.addUsage.run(e.user_id,e.device_id,e.period,e.put,e.get,e.list,e.updated_at)}loadUsage(e,r,n){return this.stmts.loadUsage.get(e,r,n)??null}sumUsageForPeriod(e,r){let n=this.stmts.sumUsageForPeriod.get(e,r);return{put:n?.put??0,get:n?.get??0,list:n?.list??0}}upsertRootTeam(e){this.stmts.upsertRootTeam.run(e.teamfile_path,e.name,e.raw_text,e.raw_sha256,e.registered_at,e.last_seeded_at)}getRootTeam(e){return this.stmts.getRootTeam.get(e)??null}listRootTeams(){return this.stmts.listRootTeams.all()}insertTeamChatLog(e){let r=this.stmts.insertTeamChatLog.run(e.root_teamfile,e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias,e.message,e.response,e.status,e.error_detail,e.truncated,e.created_at);return Number(r.lastInsertRowid)}listTeamChatLog(e){return this.stmts.listTeamChatLog.all(e)}listTeamChatLogSinceId(e,r=500){return this.stmts.listTeamChatLogSinceId.all(e,Math.max(1,Math.trunc(r)))}getMaxTeamChatLogId(){return this.stmts.getMaxTeamChatLogId.get()?.max_id??0}loadTeamChatLogCursor(e){return this.stmts.loadTeamChatLogCursor.get(e)??null}saveTeamChatLogCursor(e){this.stmts.saveTeamChatLogCursor.run(e.cursor_key,e.last_pushed_id,e.updated_at)}startTrackedInvocation(e){let r=e.started_at??F(),n=e.holder_host??xI(),s=e.last_heartbeat_at??r,o=this.stmts.insertTrackedInvocation.run(e.kind,e.origin,e.scope_teamfile??null,e.from_identity,e.target_teamfile??null,e.target_alias??null,e.root_teamfile??null,e.cwd??null,Ut(e.command),r,e.holder_pid??null,n,s,Ut(e.meta));return this.getTrackedInvocation(Number(o.lastInsertRowid))}getTrackedInvocation(e){return this.stmts.getTrackedInvocation.get(e)??null}listAllRunningTrackedInvocations(){return this.stmts.listAllRunningTrackedInvocations.all()}finishTrackedInvocation(e,r){let n=r.ended_at??F();return 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?null:this.getTrackedInvocation(e)}reclaimTrackedInvocationIfUnchanged(e,r,n){let s=n.ended_at??F();return 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?null:this.getTrackedInvocation(e)}heartbeatTrackedInvocation(e,r=F()){return this.stmts.heartbeatTrackedInvocation.run(r,e).changes!==1?null:this.getTrackedInvocation(e)}listTrackedInvocations(e={}){let r=[],n=[];e.from!==void 0&&(r.push("from_identity = ?"),n.push(e.from)),e.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(e.scope_teamfile)),e.status!==void 0&&(r.push("status = ?"),n.push(e.status)),e.kind!==void 0&&(r.push("kind = ?"),n.push(e.kind)),e.origin!==void 0&&(r.push("origin = ?"),n.push(e.origin));let s=Math.max(1,Math.min(1e3,Math.trunc(e.limit??100)));n.push(s);let o=r.length===0?"":` WHERE ${r.join(" AND ")}`;return this.db.prepare(`SELECT * FROM tracked_invocation${o} ORDER BY started_at DESC, id DESC LIMIT ?`).all(...n)}maxTrackedInvocationId(e={}){let r=[],n=[];e.from!==void 0&&(r.push("from_identity = ?"),n.push(e.from)),e.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(e.scope_teamfile));let s=r.length===0?"":` WHERE ${r.join(" AND ")}`,o=this.db.prepare(`SELECT COALESCE(MAX(id), 0) AS max_id FROM tracked_invocation${s}`).get(...n);return Number(o?.max_id??0)}listRunningTrackedInvocations(e={}){return this.listTrackedInvocations({...e,status:"running"})}sendMailboxMessage(e){let r=this.stmts.insertMailboxMessage.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile??null,e.sender_alias??null,e.root_teamfile??null,Om(e.payload),e.created_at??F(),e.remote_transport??null,e.remote_message_id??null,e.remote_thread_id??null,e.meta??null);return this.getMailboxMessage(Number(r.lastInsertRowid))}getMailboxMessage(e){return this.stmts.getMailboxMessage.get(e)??null}peekMailboxMessages(e,r=1e3){return this.stmts.listMailboxMessagesForReceiver.all(e.receiver_teamfile,e.receiver_alias,Math.max(1,Math.min(1e3,Math.trunc(r))))}recvMailboxMessages(e){return this.recvMailboxMessagesTxn(e.receiver_teamfile,e.receiver_alias)}updateTeamChatLogResponse(e,r){this.stmts.updateTeamChatLogResponse.run(r.response,r.status,r.error_detail,r.truncated,e)}getAgentInflight(e,r){return this.stmts.getAgentInflight.get(e,r)??null}listAgentInflight(){return this.stmts.listAgentInflight.all()}tryAcquireAgentInflight(e,r){return this.tryAcquireAgentInflightTxn(e,r)}clearAgentInflight(e,r){this.stmts.clearAgentInflight.run(e,r)}clearObservedTerminalAgentInflight(e,r,n){return this.stmts.clearObservedTerminalAgentInflight.run({receiver_teamfile:e,receiver_alias:r,observed_sender_teamfile:n.sender_teamfile,observed_sender_alias:n.sender_alias,observed_started_at:n.started_at,observed_holder_pid:n.holder_pid}).changes===1}releaseAgentInflight(e){this.db.exec("BEGIN IMMEDIATE");try{let r=this.getAgentInflight(e.receiver_teamfile,e.receiver_alias);if(r===null||r.sender_teamfile!==e.sender_teamfile||r.sender_alias!==e.sender_alias)return this.db.exec("COMMIT"),!1;if(r.active_count<=1)return this.stmts.clearAgentInflightIfSender.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias),this.db.exec("COMMIT"),!0;let n=this.stmts.decrementAgentInflight.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias);return this.db.exec("COMMIT"),n.changes===1}catch(r){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),r}}clearAgentInflightOlderThan(e){return this.stmts.clearAgentInflightOlderThan.run(e).changes}getTerminalLock(e,r){let n=this.stmts.getRuntimeState.get(Zn,es(e,r),Qn);return n===void 0?null:Cm(n.data)}setTerminalLock(e){this.stmts.upsertRuntimeState.run(Zn,es(e.teamfile,e.alias),Qn,JSON.stringify(e),e.last_heartbeat)}heartbeatTerminalLock(e,r,n,s){this.db.exec("BEGIN IMMEDIATE");try{let o=this.getTerminalLock(e,r);if(o===null||o.lock_id!==n)return this.db.exec("COMMIT"),!1;let i={...o,last_heartbeat:s};return this.stmts.upsertRuntimeState.run(Zn,es(e,r),Qn,JSON.stringify(i),s),this.db.exec("COMMIT"),!0}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}clearTerminalLock(e,r,n){this.db.exec("BEGIN IMMEDIATE");try{let s=this.getTerminalLock(e,r);if(s===null||s.lock_id!==n)return this.db.exec("COMMIT"),!1;let o=this.stmts.deleteRuntimeState.run(Zn,es(e,r),Qn);return this.db.exec("COMMIT"),o.changes===1}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}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,F(),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,F())}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,F());return this.stmts.getStep.get(r.lastInsertRowid)}finishStep(e,r,n){return this.stmts.finishStep.run(r??null,n??null,F(),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??F(),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,F());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,F()).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,F()),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,F());return this.stmts.getAttention.get(r.lastInsertRowid)}acknowledgeAttention(e){return this.stmts.ackAttention.run(F(),e),this.stmts.getAttention.get(e)??null}upsertDurableMemory(e){let r=F();return this.stmts.upsertDurableMemory.run(e.project_id,e.type,e.name,e.description??null,e.body,r,r),this.stmts.getDurableMemoryByName.get(e.project_id,e.name)}getDurableMemoryByName(e,r){return this.stmts.getDurableMemoryByName.get(e,r)??null}deleteDurableMemory(e,r){return this.stmts.deleteDurableMemory.run(e,r).changes>0}listDurableMemory(e,r){return r!==void 0?this.stmts.listDurableMemoryByType.all(e,r):this.stmts.listDurableMemory.all(e)}indexDurableMemory(e,r){return r!==void 0&&r.length>0?this.stmts.listDurableMemory.all(e).filter(s=>r.includes(s.type)).map(({name:s,description:o,type:i,updated_at:a})=>({name:s,description:o,type:i,updated_at:a})):this.stmts.listDurableMemory.all(e).map(({name:n,description:s,type:o,updated_at:i})=>({name:n,description:s,type:o,updated_at:i}))}recordSessionSize(e){let r=this.stmts.insertSessionSize.run(e.team_name,e.alias,e.sessionid,e.input_tokens??null,e.cache_tokens??null,e.output_tokens??null,e.total_tokens??null,e.observed_at??F());return this.stmts.getSessionSize.get(r.lastInsertRowid)}latestSessionSizes(){return this.stmts.latestSessionSizes.all()}sessionSizeHistory(e,r,n=20){return this.stmts.sessionSizeHistory.all(e,r,n)}insertSessionEvent(e){let r=this.stmts.insertSessionEvent.run(e.run_id,e.step_id??null,e.kind,e.timestamp_ms,e.payload,e.payload_truncated??0,e.overflow_artifact_id??null);return this.stmts.getSessionEvent.get(r.lastInsertRowid)}listSessionEvents(e,r){return r!==void 0?this.stmts.listSessionEventsSince.all(e,r):this.stmts.listSessionEvents.all(e)}listSessionEventsSince(e,r=1e3){return this.stmts.listAllEventsSince.all(e,r)}latestAgentCall(e){let r=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call' ORDER BY id DESC LIMIT 1").get(e);if(r===void 0)return null;try{let n=JSON.parse(r.payload);return typeof n.alias!="string"||typeof n.provider!="string"?null:{alias:n.alias,provider:n.provider,...typeof n.model=="string"?{model:n.model}:{}}}catch{return null}}agentCallTokenTotals(e){let r=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call'").all(e),n=0,s=0,o=0;for(let i of r)try{let a=JSON.parse(i.payload);typeof a.tokens_in=="number"&&(n+=a.tokens_in),typeof a.tokens_out=="number"&&(s+=a.tokens_out),o+=1}catch{}return{totalInputTokens:n,totalOutputTokens:s,agentCallCount:o}}addRollupValue(e){this.stmts.upsertRollupStat.run(e.run_id,e.step_id??null,e.metric_kind,e.value,e.bucket_start_ms,e.bucket_end_ms,e.updated_at)}listRollupStats(e){return this.stmts.listRollupStats.all(e)}getRollupCursor(){return this.stmts.getRollupCursor.get("last_event_id")?.value??0}setRollupCursor(e){this.stmts.setRollupCursor.run("last_event_id",e)}insertDriftSignal(e){let r=this.stmts.insertDriftSignal.run(e.team_member_id,e.project_id??null,e.signal_kind,e.severity,e.description,e.detected_at,e.expires_at??null,e.payload??null);return this.stmts.getDriftSignal.get(r.lastInsertRowid)}listDriftSignals(e={}){return e.team_member_id!==void 0&&e.unacked?this.stmts.listUnackedDriftByMember.all(e.team_member_id):e.team_member_id!==void 0?this.stmts.listDriftByMember.all(e.team_member_id):e.project_id!==void 0?this.stmts.listDriftByProject.all(e.project_id):this.stmts.listAllDrift.all()}hasUnackedDriftSignal(e,r,n){return this.stmts.findUnackedDrift.get(e,r??null,n)!==void 0}acknowledgeDriftSignal(e){return this.stmts.ackDriftSignal.run(Date.now(),e),this.stmts.getDriftSignal.get(e)??null}insertInteractiveSession(e){let r=Date.now();return this.stmts.insertInteractiveSession.run(e.run_id,e.step_id,e.state_name,e.status,r,r),this.stmts.getInteractiveSessionByStepId.get(e.step_id)}getInteractiveSessionByStepId(e){return this.stmts.getInteractiveSessionByStepId.get(e)??null}getInteractiveSessionByRunAndState(e,r){return this.stmts.getInteractiveSessionByRunAndState.get(e,r)??null}setInteractiveAgentOutput(e,r,n){this.stmts.setInteractiveAgentOutput.run(r,n,Date.now(),e)}resumeInteractive(e,r,n){return this.resumeInteractiveTxn(e,r,n,F())}resumeEscalation(e,r){return this.resumeEscalationTxn(e,r,F())}}});import{realpathSync as OI}from"node:fs";import{resolve as LI}from"node:path";function Ml(t){let e=LI(t);try{return OI(e)}catch{return e}}var Bm=E(()=>{"use strict"});import{platform as Hm}from"node:os";function St(t){let e=new ns;for(let r of t)e.registerAdapter(r);return e}var ns,Dl=E(()=>{"use strict";Bm();ns=class{providers=[];adapters=new Map;register(e){this.providers.push(e)}async listAll(e){let r=[],n=e?.provider?this.providers.filter(i=>i.name===e.provider):this.providers,s=await Promise.all(n.map(i=>i.discoverSessions()));for(let i of s)r.push(...i);let o=r;if(e?.workspace){let i=Ml(e.workspace);o=o.filter(a=>Ml(a.cwd)===i)}if(e?.from){let i=e.from.getTime();o=o.filter(a=>a.modifiedAt.getTime()>=i)}if(e?.to){let i=e.to.getTime();o=o.filter(a=>a.modifiedAt.getTime()<=i)}return o.sort((i,a)=>a.modifiedAt.getTime()-i.modifiedAt.getTime()),e?.limit&&(o=o.slice(0,e.limit)),o}async getSession(e,r){let n=r?this.providers.filter(s=>s.name===r):this.providers;for(let s of n){let o=await s.loadSession(e);if(o)return o}return null}async resolveSession(e,r){let n=await this.resolveSessions(e,r);return n.length===1?n[0]:null}async resolveSessions(e,r){let n=r?this.providers.filter(o=>o.name===r):this.providers,s=[];for(let o of n){let i=await o.resolveSessionPath(e);i&&s.push({provider:o,filePath:i})}return s}getWatchTargets(){let e=Hm()==="darwin"||Hm()==="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 qm}from"node:fs";import{createInterface as Jm}from"node:readline";import{stat as CI}from"node:fs/promises";import{homedir as MI}from"node:os";async function*We(t){let e=qm(t,{encoding:"utf-8"}),r=Jm({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 Le(t,e){let r=[],n=qm(t,{encoding:"utf-8"}),s=Jm({input:n,crlfDelay:1/0});try{for await(let o of s){let i=o.trim();if(i){try{r.push(JSON.parse(i))}catch{}if(r.length>=e)break}}}finally{s.close(),n.destroy()}return r}async function $e(t){let e=await CI(t);return{createdAt:e.birthtime,modifiedAt:e.mtime}}function de(t){return t.replace(/\\n/g,`
1161
- `).replace(/\\t/g," ").replace(/\\r/g,"\r")}function V(t,e){return t.length<=e?t:t.slice(0,e-3)+"..."}var ke,sr=E(()=>{"use strict";ke=MI()});import{readdir as To,stat as Xm,unlink as DI}from"node:fs/promises";import{join as Qr,basename as Gm}from"node:path";function PI(t){return t==="file-history-snapshot"||t==="progress"||t==="system"||t==="queue-operation"}function FI(t){if(t.type==="system"){let e=t.message?.content;if(typeof e=="string"&&e.trim())return de(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 Vm(t){let e=0,r=0,n=0,s=0,o=0,i=0,a;for await(let l of We(t))if(!l.isSidechain){if(l.type==="user"&&!l.isMeta&&l.message){let c=l.message.content;if(typeof c=="string"){if(c.includes("<command-name>")||c.includes("<local-command-"))continue;e++}}else if(l.type==="assistant"&&l.message){let c=l.message.content;if(Array.isArray(c))for(let d of c)d.type==="text"&&e++;let u=l.message.usage;if(u){let d=u.input_tokens||0,f=u.cache_creation_input_tokens||0,m=u.cache_read_input_tokens||0,p=u.output_tokens||0;r+=d+f+m,n+=m,s+=f,o+=p;let _=d+f+m;_&&(i=_),a={inputTokens:d,cacheWriteInputTokens:f,cachedInputTokens:m,outputTokens:p}}}}return{messageCount:e,totalInputTokens:r,totalCacheReadInputTokens:n,totalCacheWriteInputTokens:s,totalOutputTokens:o,lastInputTokens:i,lastTokenUsage:a}}var bo,Km=E(()=>{"use strict";sr();bo=class{name="claude";claudeDir;projectsDir;constructor(e={}){this.claudeDir=e.claudeDir||Qr(ke,".claude"),this.projectsDir=Qr(this.claudeDir,"projects")}getWatchPaths(){return[{directory:this.projectsDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await To(this.projectsDir)}catch{return e}for(let n of r){let s=Qr(this.projectsDir,n);if(!(await Xm(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await To(s)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=Gm(a,".jsonl");if(!/^[0-9a-f]{8}-/.test(l))continue;let c=Qr(s,a);try{let u=await this.extractSummary(c,l);u&&e.push(u)}catch{}}}return e}async extractSummary(e,r){let n=await Le(e,50),s=await $e(e),o="",i,a,l,c,u,d;for(let m of n)if(!PI(m.type)&&(!o&&m.cwd&&(o=m.cwd),!i&&m.slug&&(i=m.slug),!a&&m.version&&(a=m.version),!d&&m.timestamp&&(d=new Date(m.timestamp)),m.type==="assistant"&&m.message?.model&&(l=m.message.model),m.type==="user"&&!m.isMeta&&m.message)){let p=m.message.content;if(typeof p=="string"){if(p.includes("<command-name>")||p.includes("<local-command-"))continue;c||(c=V(p.trim(),80)),u=V(p.trim(),80)}}if(!o)return null;let f=await Vm(e);return{provider:"claude",sessionId:r,slug:i,cwd:o,createdAt:d||s.createdAt,modifiedAt:s.modifiedAt,model:l,cliVersion:a,startCommand:"claude",firstUserMessage:c,lastUserMessage:u,messageCount:f.messageCount,filePath:e,totalInputTokens:f.totalInputTokens||void 0,totalCachedInputTokens:f.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:f.totalCacheWriteInputTokens||void 0,totalOutputTokens:f.totalOutputTokens||void 0,lastInputTokens:f.lastInputTokens||void 0,lastTokenUsage:f.lastTokenUsage}}async loadSession(e){let r=await this.resolveSessionFile(e);if(!r)return null;let n=await $e(r),s=[],o="",i,a,l,c,u,d,f,m=e;for await(let _ of We(r))if(_.type!=="file-history-snapshot"&&!_.isSidechain){if(!o&&_.cwd&&(o=_.cwd),!i&&_.slug&&(i=_.slug),!a&&_.version&&(a=_.version),!c&&_.gitBranch&&(c=_.gitBranch),!f&&_.timestamp&&(f=new Date(_.timestamp)),_.sessionId&&(m=_.sessionId),_.type==="system"||_.type==="progress"||_.type==="queue-operation"){s.push({role:"system",timestamp:new Date(_.timestamp||0),content:FI(_)});continue}if(_.type==="user"&&_.message){if(_.isMeta)continue;let g=new Date(_.timestamp||0),h=_.message.content;if(typeof h=="string"){if(h.includes("<command-name>")||h.includes("<local-command-"))continue;u||(u=V(h.trim(),80)),d=V(h.trim(),80),s.push({role:"user",timestamp:g,content:de(h.trim())})}else if(Array.isArray(h)){for(let b of h)if(b.type==="tool_result"){let w=typeof b.content=="string"?de(b.content):JSON.stringify(b.content);s.push({role:"tool_result",timestamp:g,content:w,toolCallId:b.tool_use_id})}}}if(_.type==="assistant"&&_.message){_.message.model&&(l=_.message.model);let g=new Date(_.timestamp||0),h=_.message.content;if(Array.isArray(h))for(let b of h)b.type==="text"&&b.text?s.push({role:"assistant",timestamp:g,content:de(b.text),model:_.message.model}):b.type==="tool_use"?s.push({role:"tool_use",timestamp:g,content:b.name||"unknown tool",toolName:b.name,toolInput:JSON.stringify(b.input,null,2),toolCallId:b.id,model:_.message.model}):b.type==="thinking"&&b.thinking&&s.push({role:"thinking",timestamp:g,content:b.thinking})}}if(!o)return null;let p=await Vm(r);return{provider:"claude",sessionId:m,slug:i,cwd:o,createdAt:f||n.createdAt,modifiedAt:n.modifiedAt,model:l,cliVersion:a,startCommand:"claude",gitBranch:c,firstUserMessage:u,lastUserMessage:d,messageCount:p.messageCount,filePath:r,totalInputTokens:p.totalInputTokens||void 0,totalCachedInputTokens:p.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:p.totalCacheWriteInputTokens||void 0,totalOutputTokens:p.totalOutputTokens||void 0,lastInputTokens:p.lastInputTokens||void 0,lastTokenUsage:p.lastTokenUsage,messages:s}}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await DI(r),!0):!1}async resolveSessionFile(e){let r;try{r=await To(this.projectsDir)}catch{return null}let n=[];for(let i of r){let a=Qr(this.projectsDir,i);if(!(await Xm(a).catch(()=>null))?.isDirectory())continue;let c;try{c=await To(a)}catch{continue}for(let u of c){if(!u.endsWith(".jsonl"))continue;let d=Gm(u,".jsonl");/^[0-9a-f]{8}-/.test(d)&&n.push({filePath:Qr(a,u),fileSessionId:d})}}let s=n.find(i=>i.fileSessionId===e);if(s)return s.filePath;let o=n.filter(i=>i.fileSessionId.startsWith(e));if(o.length===1)return o[0].filePath;for(let i of n){let a=await Le(i.filePath,20);for(let l of a)if(l.slug&&l.slug===e)return i.filePath}return null}}});function So(t){return"'"+t.replace(/'/g,"'\\''")+"'"}function WI(t,e,r){if(!r)return"";let n=t.tools[e]??Pl[e],s=n?.profiles?.[r]?.flags??Pl[e]?.profiles?.[r]?.flags;if(s!==void 0)return s.trim();if(n?.profile_flag)return n.profile_flag.replace(/\{\{profile\}\}/g,r).trim();throw new Error(`Profile "${r}" is not configured for tool "${e}"`)}function Ym(t,e){return!!t.tools[e]}function zm(t,e,r,n,s){let o=t.tools[e]??Pl[e],i;if(o?.agent){let l=So(n);i=o.agent.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,l)}else{let l=UI[e];if(!l)throw new Error(`No agent command configured for tool "${e}"`);let c=l.argv.map(u=>u.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,n));if(l.mode==="stdin"){let u=c.map(So).join(" ");i=`printf '%s\\n' ${So(n)} | ${u}`}else i=c.map(So).join(" ")}let a=WI(t,e,s);return a&&(i+=" "+a),i}var Pl,UI,Zm=E(()=>{"use strict";Pl={claude:{start:"claude",resume:"claude --resume {{session_id}} --dangerously-skip-permissions",profiles:{default:{description:"Default profile",flags:""}}},codex:{start:"codex",resume:"codex resume {{session_id}} --dangerously-bypass-approvals-and-sandbox",profiles:{default:{description:"Default profile",flags:""}}},opencode:{start:"opencode",resume:"opencode --session {{session_id}}",profiles:{default:{description:"Default profile",flags:""}}},gemini:{start:"gemini",resume:"gemini --resume {{session_id}} -y",profiles:{default:{description:"Default profile",flags:""}}},copilot:{start:"copilot",resume:"copilot --resume={{session_id}} --yolo",profiles:{default:{description:"Default profile",flags:""}}},qwen:{start:"qwen",resume:"qwen --resume {{session_id}} --approval-mode yolo",profiles:{default:{description:"Default profile",flags:""}}},agy:{start:"agy",resume:"agy --conversation {{session_id}} --dangerously-skip-permissions",profiles:{default:{description:"Default profile",flags:""}}}},UI={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 Qm(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 ep=E(()=>{"use strict"});var BI,Ee,ko,kt=E(()=>{"use strict";BI="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: ${BI}`,ko=`send this exact lmctl seed instruction: "${Ee}"`});function Wt(t,e){let r={...t??process.env,PWD:e};return delete r.OLDPWD,r}function HI(t,e){return e===void 0||e.length===0?t:{...t??process.env,[ss]:e}}function Be(t,e,r){return HI(Wt(t,e),r)}var ss,ut=E(()=>{"use strict";ss="LMCTL_SELF_SESSIONID"});import{spawn as tp}from"node:child_process";import{mkdirSync as qI}from"node:fs";var Fl,Re,Bt=E(()=>{"use strict";Zm();ep();kt();ut();Fl=class t extends Error{cancelReason;constructor(e,r){super(e),this.name="TurnAbortError",this.cancelReason=r,Object.setPrototypeOf(this,t.prototype)}},Re=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 qI(e,{recursive:!0}),new Promise(n=>{let s;try{s=tp(this.binary,this.seedArgsFor(r),{cwd:e,env:Wt(void 0,e),stdio:["pipe","pipe","pipe"],timeout:6e4})}catch(a){return n({success:!1,error:a instanceof Error?a.message:String(a)})}let o="";s.stderr?.on("data",a=>{o+=a.toString()});let i=r?.prompt!==void 0&&this.seedStdin!==void 0?`${r.prompt}
1162
- `:this.seedStdin;i&&s.stdin?.write(i),s.stdin?.end(),s.on("exit",a=>{n(a===0||a===null?{success:!0}:{success:!1,error:o.trim().slice(0,200)||`exit code ${a}`})}),s.on("error",a=>{n({success:!1,error:a.message})})})}resumeCommand(e,r){return this.resumeTemplate.replace(/\{\{session_id\}\}/g,e)}startCommand(e){return this.startTemplate}manualSeedHint(e){return{launchCommand:`cd ${e} && ${this.binary}`,postLaunchNote:ko,lsCommand:`lmctl ls --provider ${this.name} --sessiondir ${e}`}}static DEFAULT_IDLE_TIMEOUT_MS=8*60*60*1e3;sendTurn(e,r){if(r.userConfig&&Ym(r.userConfig,this.name)){let s=r.userConfig.tools[this.name];if(s?.agent)return this.runOneShotAgent(e,r,s.agent)}let n=r.timeoutMs??t.DEFAULT_IDLE_TIMEOUT_MS;return n<=0&&!r.signal?this.transportFn(e,{...r,binary:this.binary}):this.withTimeouts(n,e,r)}withTimeouts(e,r,n){let s=new AbortController,o,i,a="",l,c=()=>{e<=0||(clearTimeout(o),o=setTimeout(()=>{n.onIdleWarning?.(e),u(),s.abort(),l&&l({text:a,sessionId:n.sessionId,durationMs:e,status:"stalled",stalledAfterMs:e})},e))},u=()=>{clearTimeout(o)};n.signal&&(n.signal.aborted?(i="external",s.abort()):n.signal.addEventListener("abort",()=>{i="external",s.abort()},{once:!0})),c();let d={...n,binary:this.binary,signal:s.signal,onDelta:p=>{a+=p,c(),n.onDelta?.(p)},onProgress:p=>{p.kind!=="api_retry"&&c(),n.onProgress?.(p)}},f=this.transportFn(r,d).then(p=>(u(),{...p,status:"ok"})).catch(p=>{throw u(),i==="external"?new Fl("Turn cancelled","external"):p}),m=new Promise(p=>{l=p});return Promise.race([f,m])}runOneShotAgent(e,r,n){let s=zm(r.userConfig,this.name,r.sessionId,e,r.profile),o=Date.now();return new Promise((i,a)=>{let l=Qm(r.env),c=tp(s,{shell:!0,cwd:r.cwd,env:Be(r.env,r.cwd,r.sessionId),stdio:["pipe","pipe","pipe"]}),u=!1,d=!1,f=setTimeout(()=>{d=!0,c.kill()},l),m="",p="";if(c.stdout?.on("data",_=>{let g=_.toString();m+=g,r.onDelta?.(g)}),c.stderr?.on("data",_=>{p+=_.toString()}),r.signal){if(r.signal.aborted)return clearTimeout(f),c.kill(),a(new Error("Aborted"));r.signal.addEventListener("abort",()=>c.kill(),{once:!0})}c.on("exit",_=>{if(u)return;u=!0,clearTimeout(f);let g=Date.now()-o;d?a(new Error(`Agent command timed out after ${l}ms`)):_===0||_===null?i({text:m.trim(),sessionId:r.sessionId,durationMs:g}):a(new Error(p.trim().slice(0,200)||`Agent command exited with code ${_}`))}),c.on("error",_=>{u||(u=!0,clearTimeout(f),a(_))})})}}});function Io(t,e){let r;if(e&&typeof e=="object"){let n=e.code;typeof n=="number"&&(r=n)}return new qt(t,r,e)}var Qe,ve,Ht,vo,qt,en=E(()=>{"use strict";Qe=class extends Error{constructor(e,r){super(e,r),this.name=this.constructor.name}},ve=class extends Qe{},Ht=class extends Qe{exitCode;signal;stderr;constructor(e,r,n=null,s){super(e),this.exitCode=r,this.signal=n,this.stderr=s}},vo=class extends Qe{line;constructor(e,r,n){super(e,{cause:n}),this.line=r}},qt=class extends Qe{rpcCode;rpcData;constructor(e,r,n){super(e),r!==void 0&&(this.rpcCode=r),n!==void 0&&(this.rpcData=n)}}});import*as Wl from"node:child_process";function XI(t){if(typeof Wl.spawnSync=="function")try{Wl.spawnSync("taskkill",["/T","/F","/PID",String(t)],{windowsHide:!0})}catch{}}function rp(t){return t.exitCode!==null||t.signalCode!==null}function Ul(t,e){return rp(t)?Promise.resolve(!0):new Promise(r=>{let n=!1,s=()=>{n||(n=!0,clearTimeout(o),r(!0))},o=setTimeout(()=>{n||(n=!0,t.removeListener("exit",s),r(!1))},e);t.once("exit",s)})}async function dt(t,e={}){let r=Date.now(),n=e.stdinEnd!==!1,s=e.softDelayMs??5e3,o=e.killDelayMs??5e3,i=e.platform??process.platform,a=e.runTaskkill??XI;if(rp(t))return{signal:"natural",elapsedMs:Date.now()-r};if(n&&t.stdin&&!t.stdin.destroyed)try{t.stdin.end()}catch{}if(await Ul(t,s))return{signal:"stdin",elapsedMs:Date.now()-r};if(i==="win32"&&typeof t.pid=="number")a(t.pid);else try{t.kill("SIGTERM")}catch{}if(await Ul(t,o))return{signal:"SIGTERM",elapsedMs:Date.now()-r};if(i!=="win32")try{t.kill("SIGKILL")}catch{}return await Ul(t,JI)?{signal:"SIGKILL",elapsedMs:Date.now()-r}:{signal:"abandoned",elapsedMs:Date.now()-r}}var JI,No=E(()=>{"use strict";JI=1e3});function np(t){he()&&process.stderr.write(`[debug] ${t}
1163
- `)}function or(t,e){let r=VI[t];if(r)return r[e]??r.yolo}function YI(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 ft(t,e,r="yolo"){if(KI.has(t)){np(`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"?or(t,"plan"):GI[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 z({event:"yolo_assert_failed",provider:t,reason:"unconfigured_provider",args:e.join(" "),message:s}),new ve(s)}if(!YI(e,n)){let s=n.join(" "),o=`${t} spawn missing YOLO flag '${s}' \u2014 YOLO is mandatory for every provider; see src/providers/yolo-contract.ts. Got argv: [${e.map(i=>JSON.stringify(i)).join(", ")}]`;throw z({event:"yolo_assert_failed",provider:t,reason:"flag_missing",required_flag:s,mode:r,args:e.join(" "),message:o}),new ve(o)}np(`YOLO ${t} [mode=${r}]: argv flag '${n.join(" ")}'`)}var GI,VI,KI,tn=E(()=>{"use strict";en();Ne();GI={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"],gemini:["-y"],copilot:["--yolo"],agy:["--dangerously-skip-permissions"],lmplayer:["--dangerously-skip-permissions"]},VI={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"]}};KI=new Set(["codex","opencode"])});import{spawn as zI}from"node:child_process";import{existsSync as ZI}from"node:fs";function e0(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(`
1160
+ `),...Am(t),...Im(t)}}function jI(t,e){return e===void 0?{resumed:!1,reason:t}:{resumed:!1,reason:t,valid:e}}var Ll,We=E(()=>{"use strict";jl();Nm();$m();Lm();Mm();rs();Ll=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;tryAcquireAgentInflightTxn;recvMailboxMessagesTxn;constructor(e){e.pragma("foreign_keys = ON"),this.db=e,this.stmts=RI(e),this.claimTxn=e.transaction((r,n,s)=>{let o=this.stmts.selectClaimableJob.get(s,s,s);return o===void 0||this.stmts.claimJob.run(r,n,s,o.id,s,s,s).changes!==1?null:this.getJob(o.id)}),this.claimWithConcurrencyTxn=e.transaction((r,n,s,o)=>{let i=this.stmts.selectClaimableJobs.all(s,s,s);for(let a of i){let l=this.getJob(a.id);if(l===null)continue;let c=o(l);if(c.concurrency_key!==null&&(l.concurrency_key_resolved!==c.concurrency_key&&this.stmts.setJobConcurrencyKey.run(c.concurrency_key,l.id),(this.stmts.countRunningByConcurrencyKey.get(c.concurrency_key,s,l.id)?.count??0)>=Math.max(1,c.concurrent_limit)))continue;if(this.stmts.claimJob.run(r,n,s,l.id,s,s,s).changes===1)return this.getJob(l.id)}return null}),this.claimByIdWithConcurrencyTxn=e.transaction((r,n,s,o,i)=>{let a=this.getJob(r);if(a===null)return{claimed:!1,reason:"not_found",job_id:r};if(a.locked_until!==null&&a.locked_until>=o)return{claimed:!1,reason:"locked",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let c=a.status==="queued"&&a.available_at<=o,u=a.status==="running"&&a.locked_until!==null&&a.locked_until<o;if(!c&&!u)return{claimed:!1,reason:"not_claimable",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let d=i(a);if(d.concurrency_key!==null&&(a.concurrency_key_resolved!==d.concurrency_key&&this.stmts.setJobConcurrencyKey.run(d.concurrency_key,a.id),(this.stmts.countRunningByConcurrencyKey.get(d.concurrency_key,o,a.id)?.count??0)>=Math.max(1,d.concurrent_limit)))return{claimed:!1,reason:"concurrency_limit",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};if(this.stmts.claimJob.run(n,s,o,a.id,o,o,o).changes!==1){let p=this.getJob(a.id);return{claimed:!1,reason:p?.locked_until!==null&&p?.locked_until!==void 0&&p.locked_until>=o?"locked":"not_claimable",job_id:r,status:p?.status??a.status,locked_by:p?.locked_by??a.locked_by,locked_until:p?.locked_until??a.locked_until}}let m=this.getJob(a.id);return m===null?{claimed:!1,reason:"not_found",job_id:r}:{claimed:!0,job:m}}),this.resumeRunTxn=e.transaction((r,n,s)=>jI("state_not_found")),this.resumeInteractiveTxn=e.transaction((r,n,s,o)=>{let i=this.getInteractiveSessionByStepId(r);if(i===null)return{resumed:!1,reason:"not_found"};if(i.status!=="waiting_operator")return{resumed:!1,reason:"not_waiting_operator"};let a=this.getRun(i.run_id);if(a===null)return{resumed:!1,reason:"run_not_found"};let l=s?"done":"waiting_agent";return this.stmts.updateInteractiveSession.run(l,n,Date.now(),i.id),this.stmts.resumeRunState.run(i.state_name,a.id),this.stmts.requeuePausedJob.run(o,a.job_id),{resumed:!0,session:this.getInteractiveSessionByStepId(r),run:this.getRun(a.id),job:this.getJob(a.job_id)}}),this.resumeEscalationTxn=e.transaction((r,n,s)=>{let o=this.stmts.getAttention.get(r);if(o===void 0)return{resumed:!1,reason:"not_found"};if(o.kind!==Eo)return{resumed:!1,reason:"wrong_kind"};if(o.acknowledged_at!==null)return{resumed:!1,reason:"already_acked"};if(o.run_id===null)return{resumed:!1,reason:"run_not_found"};let i=null,a=[];if(o.payload!==null)try{let u=JSON.parse(o.payload);u.step!==void 0&&typeof u.step.id=="string"&&u.step.id.length>0&&(i=u.step.id),Array.isArray(u.declared_outcomes)&&(a=u.declared_outcomes.filter(d=>typeof d=="string"))}catch{}if(i===null)return{resumed:!1,reason:"no_step"};let l=this.getRun(o.run_id);if(l===null)return{resumed:!1,reason:"run_not_found"};if(n!==ts&&!a.includes(n))return{resumed:!1,reason:Pm};let c={};if(l.pending_escalation_decision!==null)try{let u=JSON.parse(l.pending_escalation_decision);u!==null&&typeof u=="object"&&!Array.isArray(u)&&(c=u)}catch{c={}}return c[i]=n,this.stmts.setRunPendingEscalationDecision.run(JSON.stringify(c),l.id),this.stmts.resumeRunState.run(i,l.id),this.stmts.requeuePausedJob.run(s,l.job_id),this.stmts.ackAttention.run(s,r),{resumed:!0,run:this.getRun(l.id),job:this.getJob(l.job_id)}}),this.tryAcquireAgentInflightTxn=(r,n={})=>{this.db.exec("BEGIN IMMEDIATE");try{let s=n.reclaim_observed,o=this.stmts.acquireAgentInflight.get({...r,holder_pid:process.pid,stale_before:n.stale_before??null,force:n.force===!0?1:0,reclaim_observed_sender_teamfile:s?.sender_teamfile??null,reclaim_observed_sender_alias:s?.sender_alias??null,reclaim_observed_started_at:s?.started_at??null,reclaim_observed_holder_pid:typeof s?.holder_pid=="number"?s.holder_pid:null}),i=o!==void 0?{acquired:!0,current:o}:{acquired:!1,current:this.getAgentInflight(r.receiver_teamfile,r.receiver_alias)??(()=>{throw new Error("agent_inflight conflict row disappeared during acquire")})()};return this.db.exec("COMMIT"),i}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}},this.recvMailboxMessagesTxn=e.transaction((r,n)=>{let s=this.stmts.listAllMailboxMessagesForReceiver.all(r,n);for(let o of s)this.stmts.deleteMailboxMessage.run(o.id);return s})}close(){this.db.close()}query(e,...r){let n=e.trim().toLowerCase();if(!n.startsWith("select")&&!n.startsWith("with")&&!n.startsWith("pragma"))throw new Error("Dal.query only allows read-only SELECT/WITH/PRAGMA statements");return this.db.prepare(e).all(...r)}insertWorkflow(e){Um(e.name,e.definition,i=>this.getWorkflowByName(i));let r=this.stmts.insertWorkflow.run(e.name,e.version??1,e.definition_schema_version??1,e.definition,F()),n=this.getWorkflow(Number(r.lastInsertRowid)),s=this.stmts.insertWorkflowVersion.run(n.id,n.version,e.definition,e.author??null,F());this.stmts.updateWorkflowActiveVersion.run(s.lastInsertRowid,n.id),(e.source_uri!=null||e.source_sha256!=null)&&this.stmts.setWorkflowSource.run(e.source_uri??null,e.source_sha256??null,n.id);let o=this.getWorkflow(n.id);return this.syncWorkflowTriggers(n.id,e.definition),o}upsertWorkflow(e){Um(e.name,e.definition,i=>this.getWorkflowByName(i));let r=this.getWorkflowByName(e.name);if(r===null)return this.insertWorkflow({name:e.name,definition_schema_version:e.definition_schema_version,definition:e.definition,author:e.author,source_uri:e.source_uri,source_sha256:e.source_sha256});let s=(this.stmts.getLatestWorkflowVersion.get(r.id)?.version??r.version)+1,o=this.stmts.insertWorkflowVersion.run(r.id,s,e.definition,e.author??null,F());return this.stmts.updateWorkflowActiveVersionDefinitionAndVersion.run(Number(o.lastInsertRowid),e.definition,e.definition_schema_version??r.definition_schema_version,s,r.id),(e.source_uri!=null||e.source_sha256!=null)&&this.stmts.setWorkflowSource.run(e.source_uri??null,e.source_sha256??null,r.id),this.syncWorkflowTriggers(r.id,e.definition),this.getWorkflow(r.id)}insertCompositionUnit(e){this.stmts.insertCompositionUnit.run(e.name,e.version,e.lang,e.source,e.source_sha,e.compiled_workflow_version_id,F())}getWorkflow(e){return this.stmts.getWorkflow.get(e)??null}getWorkflowByName(e,r){return(r===void 0?this.stmts.findWorkflowLatest.get(e):this.stmts.findWorkflowVersion.get(e,r))??null}findWorkflowByName(e,r){return this.getWorkflowByName(e,r)}insertWorkflowVersion(e,r,n){let o=(this.stmts.getLatestWorkflowVersion.get(e)?.version??0)+1,i=this.stmts.insertWorkflowVersion.run(e,o,r,n??null,F());return this.stmts.getWorkflowVersion.get(i.lastInsertRowid)}activateWorkflowVersion(e,r){let n=this.getWorkflowVersionById(r);if(n===null||n.workflow_id!==e)return null;let s=1;try{let o=JSON.parse(n.definition);typeof o.definition_schema_version=="number"&&(s=o.definition_schema_version)}catch{}return this.stmts.updateWorkflowActiveVersionAndDefinition.run(r,n.definition,s,e),this.syncWorkflowTriggers(e,n.definition),this.getWorkflow(e)}getWorkflowVersionById(e){return this.stmts.getWorkflowVersion.get(e)??null}listWorkflowVersions(e){return this.stmts.listWorkflowVersions.all(e)}upsertTriggerInstance(e){return this.stmts.upsertTriggerInstance.run(e.workflow_id,e.trigger_id,e.trigger_type,e.parameters,e.enabled===!1?0:1,F()),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,F(),e),this.stmts.getTriggerInstance.get(e)??null}setTriggerFailure(e,r){return this.stmts.setTriggerFailure.run(F(),r,e),this.stmts.getTriggerInstance.get(e)??null}syncWorkflowTriggers(e,r){let n;try{n=JSON.parse(r)}catch{return}if(n===null||typeof n!="object"||Array.isArray(n))return;let s=n.triggers;if(Array.isArray(s))for(let o of s){if(o===null||typeof o!="object"||Array.isArray(o))continue;let i=o;typeof i.id!="string"||i.id.length===0||typeof i.type!="string"||i.type.length===0||this.upsertTriggerInstance({workflow_id:e,trigger_id:i.id,trigger_type:i.type,parameters:JSON.stringify(i.parameters??{})})}}insertTeam(e){let r=this.stmts.insertTeam.run(e.name,F());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,F());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,F(),e),this.stmts.getTeamMember.get(e)??null}listMembersInState(e){return this.stmts.listMembersInState.all(e)}setMemberPromptSnapshot(e,r){return this.stmts.setMemberPromptSnapshot.run(r,e),this.stmts.getTeamMember.get(e)??null}setMemberProviderResolved(e,r){return this.stmts.setMemberProviderResolved.run(r,e),this.stmts.getTeamMember.get(e)??null}setMemberRolePrompt(e,r){return this.stmts.setMemberRolePrompt.run(r,e),this.stmts.getTeamMember.get(e)??null}updateTeamMemberMeta(e,r){let n=this.stmts.getTeamMember.get(e);if(n===void 0)return null;let s=Object.prototype.hasOwnProperty.call(r,"role_prompt"),o=Object.prototype.hasOwnProperty.call(r,"model"),i=Object.prototype.hasOwnProperty.call(r,"provider");return this.stmts.updateTeamMemberMeta.run(s?r.role_prompt??null:n.role_prompt,o?r.model??null:n.model,i?r.provider??n.provider:n.provider,e),this.stmts.getTeamMember.get(e)??null}insertTeamMemberCompanion(e){let r=this.stmts.insertTeamMemberCompanion.run(e.interpreter_id,e.companion_id,F());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",F());return this.stmts.getProject.get(r.lastInsertRowid)}listProjects(){return this.stmts.listProjects.all()}getProject(e){return this.stmts.getProject.get(e)??null}findProjectByName(e){return this.stmts.findProjectByName.get(e)??null}setProjectIntakeConfig(e,r){return this.stmts.setProjectIntakeConfig.run(r,e),this.stmts.getProject.get(e)??null}updateProjectSettings(e,r){let n=this.stmts.getProject.get(e);if(n===void 0)return null;let s=Object.prototype.hasOwnProperty.call(r,"local_path"),o=Object.prototype.hasOwnProperty.call(r,"durable_memory_mode"),i=Object.prototype.hasOwnProperty.call(r,"default_branch"),a=Object.prototype.hasOwnProperty.call(r,"intake_config");return this.stmts.updateProjectSettings.run(s?r.local_path:n.local_path,o?r.durable_memory_mode:n.durable_memory_mode,i?r.default_branch??null:n.default_branch,a?r.intake_config??null:n.intake_config,e),this.stmts.getProject.get(e)??null}listProjectsWithIntakeEnabled(){return this.stmts.listProjectsWithIntakeConfig.all().filter(e=>{if(e.intake_config===null)return!1;try{let r=JSON.parse(e.intake_config);return typeof r=="object"&&r!==null&&!Array.isArray(r)&&r.scan_github_issues===!0}catch{return!1}})}getProjectByJob(e){return this.stmts.getProjectByJob.get(e)??null}insertProjectWorkflow(e){let r=e.condition??null,n=this.stmts.findProjectWorkflowUnique.get(e.project_id,e.workflow_id,r);if(n!==void 0)return n;let s=this.stmts.insertProjectWorkflow.run(e.project_id,e.workflow_id,r,e.parameters_override??null,e.enabled===!1?0:1,e.priority??100,F());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=F(),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,F(),e)??null}claimIssue(e,r){return this.stmts.claimIssue.get(r,F(),e)??null}closeIssue(e,r,n){let s=F(),o=this.stmts.closeIssue.get(r,n??null,s,s,e);if(o===void 0)throw new Error(`issue not found: ${e}`);return o}reopenIssue(e,r){let n=this.stmts.reopenIssue.get(r,F(),e);if(n===void 0)throw this.getIssue(e)===null?new Error(`issue not found: ${e}`):new Error(`issue ${e} is not closed`);return n}updateIssue(e,r){let n=this.getIssue(e);if(n===null)throw new Error(`issue not found: ${e}`);let s=Object.prototype.hasOwnProperty.call(r,"labels"),o=Object.prototype.hasOwnProperty.call(r,"ai_test_path"),i=this.stmts.updateIssue.get(r.title??n.title,r.body??n.body,r.severity??n.severity,s?r.labels??null:n.labels,o?r.ai_test_path??null:n.ai_test_path,F(),e);if(i===void 0)throw new Error(`issue not found: ${e}`);return i}listWorkflows(){return this.stmts.listWorkflows.all()}getOrCreateWebuiSession(e,r){let n=this.stmts.getWebuiSession.get(e);if(n!==void 0)return n;let s=F();return this.stmts.insertWebuiSession.run(e,r,"N1",null,null,null,null,"authenticated",s,s),this.stmts.getWebuiSession.get(e)}getWebuiSession(e){return this.stmts.getWebuiSession.get(e)??null}updateWebuiSessionTransition(e,r,n,s,o){if(this.stmts.updateWebuiSessionTransition.run(r,n,s,o,F(),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,F(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}createChatbotSession(e,r){let n=NI(),s=F();return this.stmts.insertChatbotSession.run(n,e,r??null,s,s,"active"),this.stmts.getChatbotSession.get(n)}getChatbotSession(e){return this.stmts.getChatbotSession.get(e)??null}listChatbotSessions(e){return this.stmts.listChatbotSessionsForUser.all(e)}appendChatbotMessage(e,r,n,s){let o=F(),i=this.stmts.insertChatbotMessage.run(e,r,n,s??null,o);return this.stmts.touchChatbotSession.run(o,e),this.stmts.getChatbotMessage.get(i.lastInsertRowid)}listChatbotMessages(e){return this.stmts.listChatbotMessages.all(e)}getConfig(e){return this.stmts.getConfig.get(e)?.value??null}setConfig(e,r){this.stmts.upsertConfig.run(e,r,F())}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??F(),e.dedupe_key??null,e.concurrency_key??null,F());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=F(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimTxn(e.worker_id,n,r)}claimNextJobWithConcurrency(e){let r=F(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimWithConcurrencyTxn(e.worker_id,n,r,e.evaluator)}claimJobByIdWithConcurrency(e){let r=F(),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:F();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,F()),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,F()),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??F(),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,F());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=F(),n=this.stmts.insertWebProject.run(e.workspace_id,e.name,e.repo_path,e.config_json??null,e.linked_v4_project_id??null,r,r),s=Number(n.lastInsertRowid),o=this.getWebProject(s);if(o===null)throw new Error(`web_project ${s} missing after insert`);return o}updateWebProject(e){let r=this.getWebProject(e.id);return r===null||r.deleted_at!==null?null:(this.stmts.updateWebProject.run(e.name??r.name,e.config_json===void 0?r.config_json:e.config_json,F(),e.id),this.getWebProject(e.id))}softDeleteWebProject(e){return this.stmts.softDeleteWebProject.run(F(),e).changes===1}loadMailboxCursor(e,r){return this.stmts.loadMailboxCursor.get(e,r)??null}saveMailboxCursor(e){this.stmts.saveMailboxCursor.run(e.user_id,e.mailbox_key,e.last_processed_version_id,e.last_processed_seq??null,e.last_processed_at)}addUsage(e){this.stmts.addUsage.run(e.user_id,e.device_id,e.period,e.put,e.get,e.list,e.updated_at)}loadUsage(e,r,n){return this.stmts.loadUsage.get(e,r,n)??null}sumUsageForPeriod(e,r){let n=this.stmts.sumUsageForPeriod.get(e,r);return{put:n?.put??0,get:n?.get??0,list:n?.list??0}}upsertRootTeam(e){this.stmts.upsertRootTeam.run(e.teamfile_path,e.name,e.raw_text,e.raw_sha256,e.registered_at,e.last_seeded_at)}getRootTeam(e){return this.stmts.getRootTeam.get(e)??null}listRootTeams(){return this.stmts.listRootTeams.all()}insertTeamChatLog(e){let r=this.stmts.insertTeamChatLog.run(e.root_teamfile,e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias,e.message,e.response,e.status,e.error_detail,e.truncated,e.created_at);return Number(r.lastInsertRowid)}listTeamChatLog(e){return this.stmts.listTeamChatLog.all(e)}listTeamChatLogSinceId(e,r=500){return this.stmts.listTeamChatLogSinceId.all(e,Math.max(1,Math.trunc(r)))}getMaxTeamChatLogId(){return this.stmts.getMaxTeamChatLogId.get()?.max_id??0}loadTeamChatLogCursor(e){return this.stmts.loadTeamChatLogCursor.get(e)??null}saveTeamChatLogCursor(e){this.stmts.saveTeamChatLogCursor.run(e.cursor_key,e.last_pushed_id,e.updated_at)}startTrackedInvocation(e){let r=e.started_at??F(),n=e.holder_host??xI(),s=e.last_heartbeat_at??r,o=this.stmts.insertTrackedInvocation.run(e.kind,e.origin,e.scope_teamfile??null,e.from_identity,e.target_teamfile??null,e.target_alias??null,e.root_teamfile??null,e.cwd??null,Ut(e.command),r,e.holder_pid??null,n,s,Ut(e.meta));return this.getTrackedInvocation(Number(o.lastInsertRowid))}getTrackedInvocation(e){return this.stmts.getTrackedInvocation.get(e)??null}listAllRunningTrackedInvocations(){return this.stmts.listAllRunningTrackedInvocations.all()}finishTrackedInvocation(e,r){let n=r.ended_at??F();return 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?null:this.getTrackedInvocation(e)}reclaimTrackedInvocationIfUnchanged(e,r,n){let s=n.ended_at??F();return 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?null:this.getTrackedInvocation(e)}heartbeatTrackedInvocation(e,r=F()){return this.stmts.heartbeatTrackedInvocation.run(r,e).changes!==1?null:this.getTrackedInvocation(e)}listTrackedInvocations(e={}){let r=[],n=[];e.from!==void 0&&(r.push("from_identity = ?"),n.push(e.from)),e.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(e.scope_teamfile)),e.status!==void 0&&(r.push("status = ?"),n.push(e.status)),e.kind!==void 0&&(r.push("kind = ?"),n.push(e.kind)),e.origin!==void 0&&(r.push("origin = ?"),n.push(e.origin));let s=Math.max(1,Math.min(1e3,Math.trunc(e.limit??100)));n.push(s);let o=r.length===0?"":` WHERE ${r.join(" AND ")}`;return this.db.prepare(`SELECT * FROM tracked_invocation${o} ORDER BY started_at DESC, id DESC LIMIT ?`).all(...n)}maxTrackedInvocationId(e={}){let r=[],n=[];e.from!==void 0&&(r.push("from_identity = ?"),n.push(e.from)),e.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(e.scope_teamfile));let s=r.length===0?"":` WHERE ${r.join(" AND ")}`,o=this.db.prepare(`SELECT COALESCE(MAX(id), 0) AS max_id FROM tracked_invocation${s}`).get(...n);return Number(o?.max_id??0)}listRunningTrackedInvocations(e={}){return this.listTrackedInvocations({...e,status:"running"})}sendMailboxMessage(e){let r=this.stmts.insertMailboxMessage.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile??null,e.sender_alias??null,e.root_teamfile??null,Om(e.payload),e.created_at??F(),e.remote_transport??null,e.remote_message_id??null,e.remote_thread_id??null,e.meta??null);return this.getMailboxMessage(Number(r.lastInsertRowid))}getMailboxMessage(e){return this.stmts.getMailboxMessage.get(e)??null}peekMailboxMessages(e,r=1e3){return this.stmts.listMailboxMessagesForReceiver.all(e.receiver_teamfile,e.receiver_alias,Math.max(1,Math.min(1e3,Math.trunc(r))))}recvMailboxMessages(e){return this.recvMailboxMessagesTxn(e.receiver_teamfile,e.receiver_alias)}updateTeamChatLogResponse(e,r){this.stmts.updateTeamChatLogResponse.run(r.response,r.status,r.error_detail,r.truncated,e)}getAgentInflight(e,r){return this.stmts.getAgentInflight.get(e,r)??null}listAgentInflight(){return this.stmts.listAgentInflight.all()}tryAcquireAgentInflight(e,r){return this.tryAcquireAgentInflightTxn(e,r)}clearAgentInflight(e,r){this.stmts.clearAgentInflight.run(e,r)}clearObservedTerminalAgentInflight(e,r,n){return this.stmts.clearObservedTerminalAgentInflight.run({receiver_teamfile:e,receiver_alias:r,observed_sender_teamfile:n.sender_teamfile,observed_sender_alias:n.sender_alias,observed_started_at:n.started_at,observed_holder_pid:n.holder_pid}).changes===1}releaseAgentInflight(e){this.db.exec("BEGIN IMMEDIATE");try{let r=this.getAgentInflight(e.receiver_teamfile,e.receiver_alias);if(r===null||r.sender_teamfile!==e.sender_teamfile||r.sender_alias!==e.sender_alias)return this.db.exec("COMMIT"),!1;if(r.active_count<=1)return this.stmts.clearAgentInflightIfSender.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias),this.db.exec("COMMIT"),!0;let n=this.stmts.decrementAgentInflight.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias);return this.db.exec("COMMIT"),n.changes===1}catch(r){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),r}}clearAgentInflightOlderThan(e){return this.stmts.clearAgentInflightOlderThan.run(e).changes}getTerminalLock(e,r){let n=this.stmts.getRuntimeState.get(Zn,es(e,r),Qn);return n===void 0?null:Cm(n.data)}setTerminalLock(e){this.stmts.upsertRuntimeState.run(Zn,es(e.teamfile,e.alias),Qn,JSON.stringify(e),e.last_heartbeat)}heartbeatTerminalLock(e,r,n,s){this.db.exec("BEGIN IMMEDIATE");try{let o=this.getTerminalLock(e,r);if(o===null||o.lock_id!==n)return this.db.exec("COMMIT"),!1;let i={...o,last_heartbeat:s};return this.stmts.upsertRuntimeState.run(Zn,es(e,r),Qn,JSON.stringify(i),s),this.db.exec("COMMIT"),!0}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}clearTerminalLock(e,r,n){this.db.exec("BEGIN IMMEDIATE");try{let s=this.getTerminalLock(e,r);if(s===null||s.lock_id!==n)return this.db.exec("COMMIT"),!1;let o=this.stmts.deleteRuntimeState.run(Zn,es(e,r),Qn);return this.db.exec("COMMIT"),o.changes===1}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}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,F(),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,F())}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,F());return this.stmts.getStep.get(r.lastInsertRowid)}finishStep(e,r,n){return this.stmts.finishStep.run(r??null,n??null,F(),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??F(),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,F());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,F()).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,F()),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,F());return this.stmts.getAttention.get(r.lastInsertRowid)}acknowledgeAttention(e){return this.stmts.ackAttention.run(F(),e),this.stmts.getAttention.get(e)??null}upsertDurableMemory(e){let r=F();return this.stmts.upsertDurableMemory.run(e.project_id,e.type,e.name,e.description??null,e.body,r,r),this.stmts.getDurableMemoryByName.get(e.project_id,e.name)}getDurableMemoryByName(e,r){return this.stmts.getDurableMemoryByName.get(e,r)??null}deleteDurableMemory(e,r){return this.stmts.deleteDurableMemory.run(e,r).changes>0}listDurableMemory(e,r){return r!==void 0?this.stmts.listDurableMemoryByType.all(e,r):this.stmts.listDurableMemory.all(e)}indexDurableMemory(e,r){return r!==void 0&&r.length>0?this.stmts.listDurableMemory.all(e).filter(s=>r.includes(s.type)).map(({name:s,description:o,type:i,updated_at:a})=>({name:s,description:o,type:i,updated_at:a})):this.stmts.listDurableMemory.all(e).map(({name:n,description:s,type:o,updated_at:i})=>({name:n,description:s,type:o,updated_at:i}))}recordSessionSize(e){let r=this.stmts.insertSessionSize.run(e.team_name,e.alias,e.sessionid,e.input_tokens??null,e.cache_tokens??null,e.output_tokens??null,e.total_tokens??null,e.observed_at??F());return this.stmts.getSessionSize.get(r.lastInsertRowid)}latestSessionSizes(){return this.stmts.latestSessionSizes.all()}sessionSizeHistory(e,r,n=20){return this.stmts.sessionSizeHistory.all(e,r,n)}insertSessionEvent(e){let r=this.stmts.insertSessionEvent.run(e.run_id,e.step_id??null,e.kind,e.timestamp_ms,e.payload,e.payload_truncated??0,e.overflow_artifact_id??null);return this.stmts.getSessionEvent.get(r.lastInsertRowid)}listSessionEvents(e,r){return r!==void 0?this.stmts.listSessionEventsSince.all(e,r):this.stmts.listSessionEvents.all(e)}listSessionEventsSince(e,r=1e3){return this.stmts.listAllEventsSince.all(e,r)}latestAgentCall(e){let r=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call' ORDER BY id DESC LIMIT 1").get(e);if(r===void 0)return null;try{let n=JSON.parse(r.payload);return typeof n.alias!="string"||typeof n.provider!="string"?null:{alias:n.alias,provider:n.provider,...typeof n.model=="string"?{model:n.model}:{}}}catch{return null}}agentCallTokenTotals(e){let r=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call'").all(e),n=0,s=0,o=0;for(let i of r)try{let a=JSON.parse(i.payload);typeof a.tokens_in=="number"&&(n+=a.tokens_in),typeof a.tokens_out=="number"&&(s+=a.tokens_out),o+=1}catch{}return{totalInputTokens:n,totalOutputTokens:s,agentCallCount:o}}addRollupValue(e){this.stmts.upsertRollupStat.run(e.run_id,e.step_id??null,e.metric_kind,e.value,e.bucket_start_ms,e.bucket_end_ms,e.updated_at)}listRollupStats(e){return this.stmts.listRollupStats.all(e)}getRollupCursor(){return this.stmts.getRollupCursor.get("last_event_id")?.value??0}setRollupCursor(e){this.stmts.setRollupCursor.run("last_event_id",e)}insertDriftSignal(e){let r=this.stmts.insertDriftSignal.run(e.team_member_id,e.project_id??null,e.signal_kind,e.severity,e.description,e.detected_at,e.expires_at??null,e.payload??null);return this.stmts.getDriftSignal.get(r.lastInsertRowid)}listDriftSignals(e={}){return e.team_member_id!==void 0&&e.unacked?this.stmts.listUnackedDriftByMember.all(e.team_member_id):e.team_member_id!==void 0?this.stmts.listDriftByMember.all(e.team_member_id):e.project_id!==void 0?this.stmts.listDriftByProject.all(e.project_id):this.stmts.listAllDrift.all()}hasUnackedDriftSignal(e,r,n){return this.stmts.findUnackedDrift.get(e,r??null,n)!==void 0}acknowledgeDriftSignal(e){return this.stmts.ackDriftSignal.run(Date.now(),e),this.stmts.getDriftSignal.get(e)??null}insertInteractiveSession(e){let r=Date.now();return this.stmts.insertInteractiveSession.run(e.run_id,e.step_id,e.state_name,e.status,r,r),this.stmts.getInteractiveSessionByStepId.get(e.step_id)}getInteractiveSessionByStepId(e){return this.stmts.getInteractiveSessionByStepId.get(e)??null}getInteractiveSessionByRunAndState(e,r){return this.stmts.getInteractiveSessionByRunAndState.get(e,r)??null}setInteractiveAgentOutput(e,r,n){this.stmts.setInteractiveAgentOutput.run(r,n,Date.now(),e)}resumeInteractive(e,r,n){return this.resumeInteractiveTxn(e,r,n,F())}resumeEscalation(e,r){return this.resumeEscalationTxn(e,r,F())}}});import{realpathSync as OI}from"node:fs";import{resolve as LI}from"node:path";function Ml(t){let e=LI(t);try{return OI(e)}catch{return e}}var Bm=E(()=>{"use strict"});import{platform as Hm}from"node:os";function St(t){let e=new ns;for(let r of t)e.registerAdapter(r);return e}var ns,Dl=E(()=>{"use strict";Bm();ns=class{providers=[];adapters=new Map;register(e){this.providers.push(e)}async listAll(e){let r=[],n=e?.provider?this.providers.filter(i=>i.name===e.provider):this.providers,s=await Promise.all(n.map(i=>i.discoverSessions()));for(let i of s)r.push(...i);let o=r;if(e?.workspace){let i=Ml(e.workspace);o=o.filter(a=>Ml(a.cwd)===i)}if(e?.from){let i=e.from.getTime();o=o.filter(a=>a.modifiedAt.getTime()>=i)}if(e?.to){let i=e.to.getTime();o=o.filter(a=>a.modifiedAt.getTime()<=i)}return o.sort((i,a)=>a.modifiedAt.getTime()-i.modifiedAt.getTime()),e?.limit&&(o=o.slice(0,e.limit)),o}async getSession(e,r){let n=r?this.providers.filter(s=>s.name===r):this.providers;for(let s of n){let o=await s.loadSession(e);if(o)return o}return null}async resolveSession(e,r){let n=await this.resolveSessions(e,r);return n.length===1?n[0]:null}async resolveSessions(e,r){let n=r?this.providers.filter(o=>o.name===r):this.providers,s=[];for(let o of n){let i=await o.resolveSessionPath(e);i&&s.push({provider:o,filePath:i})}return s}getWatchTargets(){let e=Hm()==="darwin"||Hm()==="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 qm}from"node:fs";import{createInterface as Jm}from"node:readline";import{stat as CI}from"node:fs/promises";import{homedir as MI}from"node:os";async function*Be(t){let e=qm(t,{encoding:"utf-8"}),r=Jm({input:e,crlfDelay:1/0});try{for await(let n of r){let s=n.trim();if(s)try{yield JSON.parse(s)}catch{}}}finally{e.destroy()}}async function Ce(t,e){let r=[],n=qm(t,{encoding:"utf-8"}),s=Jm({input:n,crlfDelay:1/0});try{for await(let o of s){let i=o.trim();if(i){try{r.push(JSON.parse(i))}catch{}if(r.length>=e)break}}}finally{s.close(),n.destroy()}return r}async function $e(t){let e=await CI(t);return{createdAt:e.birthtime,modifiedAt:e.mtime}}function de(t){return t.replace(/\\n/g,`
1161
+ `).replace(/\\t/g," ").replace(/\\r/g,"\r")}function V(t,e){return t.length<=e?t:t.slice(0,e-3)+"..."}var ke,sr=E(()=>{"use strict";ke=MI()});import{readdir as To,stat as Xm,unlink as DI}from"node:fs/promises";import{join as Qr,basename as Gm}from"node:path";function PI(t){return t==="file-history-snapshot"||t==="progress"||t==="system"||t==="queue-operation"}function FI(t){if(t.type==="system"){let e=t.message?.content;if(typeof e=="string"&&e.trim())return de(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 Vm(t){let e=0,r=0,n=0,s=0,o=0,i=0,a;for await(let l of Be(t))if(!l.isSidechain){if(l.type==="user"&&!l.isMeta&&l.message){let c=l.message.content;if(typeof c=="string"){if(c.includes("<command-name>")||c.includes("<local-command-"))continue;e++}}else if(l.type==="assistant"&&l.message){let c=l.message.content;if(Array.isArray(c))for(let d of c)d.type==="text"&&e++;let u=l.message.usage;if(u){let d=u.input_tokens||0,f=u.cache_creation_input_tokens||0,m=u.cache_read_input_tokens||0,p=u.output_tokens||0;r+=d+f+m,n+=m,s+=f,o+=p;let h=d+f+m;h&&(i=h),a={inputTokens:d,cacheWriteInputTokens:f,cachedInputTokens:m,outputTokens:p}}}}return{messageCount:e,totalInputTokens:r,totalCacheReadInputTokens:n,totalCacheWriteInputTokens:s,totalOutputTokens:o,lastInputTokens:i,lastTokenUsage:a}}var bo,Km=E(()=>{"use strict";sr();bo=class{name="claude";claudeDir;projectsDir;constructor(e={}){this.claudeDir=e.claudeDir||Qr(ke,".claude"),this.projectsDir=Qr(this.claudeDir,"projects")}getWatchPaths(){return[{directory:this.projectsDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await To(this.projectsDir)}catch{return e}for(let n of r){let s=Qr(this.projectsDir,n);if(!(await Xm(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await To(s)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=Gm(a,".jsonl");if(!/^[0-9a-f]{8}-/.test(l))continue;let c=Qr(s,a);try{let u=await this.extractSummary(c,l);u&&e.push(u)}catch{}}}return e}async extractSummary(e,r){let n=await Ce(e,50),s=await $e(e),o="",i,a,l,c,u,d;for(let m of n)if(!PI(m.type)&&(!o&&m.cwd&&(o=m.cwd),!i&&m.slug&&(i=m.slug),!a&&m.version&&(a=m.version),!d&&m.timestamp&&(d=new Date(m.timestamp)),m.type==="assistant"&&m.message?.model&&(l=m.message.model),m.type==="user"&&!m.isMeta&&m.message)){let p=m.message.content;if(typeof p=="string"){if(p.includes("<command-name>")||p.includes("<local-command-"))continue;c||(c=V(p.trim(),80)),u=V(p.trim(),80)}}if(!o)return null;let f=await Vm(e);return{provider:"claude",sessionId:r,slug:i,cwd:o,createdAt:d||s.createdAt,modifiedAt:s.modifiedAt,model:l,cliVersion:a,startCommand:"claude",firstUserMessage:c,lastUserMessage:u,messageCount:f.messageCount,filePath:e,totalInputTokens:f.totalInputTokens||void 0,totalCachedInputTokens:f.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:f.totalCacheWriteInputTokens||void 0,totalOutputTokens:f.totalOutputTokens||void 0,lastInputTokens:f.lastInputTokens||void 0,lastTokenUsage:f.lastTokenUsage}}async loadSession(e){let r=await this.resolveSessionFile(e);if(!r)return null;let n=await $e(r),s=[],o="",i,a,l,c,u,d,f,m=e;for await(let h of Be(r))if(h.type!=="file-history-snapshot"&&!h.isSidechain){if(!o&&h.cwd&&(o=h.cwd),!i&&h.slug&&(i=h.slug),!a&&h.version&&(a=h.version),!c&&h.gitBranch&&(c=h.gitBranch),!f&&h.timestamp&&(f=new Date(h.timestamp)),h.sessionId&&(m=h.sessionId),h.type==="system"||h.type==="progress"||h.type==="queue-operation"){s.push({role:"system",timestamp:new Date(h.timestamp||0),content:FI(h)});continue}if(h.type==="user"&&h.message){if(h.isMeta)continue;let g=new Date(h.timestamp||0),_=h.message.content;if(typeof _=="string"){if(_.includes("<command-name>")||_.includes("<local-command-"))continue;u||(u=V(_.trim(),80)),d=V(_.trim(),80),s.push({role:"user",timestamp:g,content:de(_.trim())})}else if(Array.isArray(_)){for(let b of _)if(b.type==="tool_result"){let w=typeof b.content=="string"?de(b.content):JSON.stringify(b.content);s.push({role:"tool_result",timestamp:g,content:w,toolCallId:b.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 b of _)b.type==="text"&&b.text?s.push({role:"assistant",timestamp:g,content:de(b.text),model:h.message.model}):b.type==="tool_use"?s.push({role:"tool_use",timestamp:g,content:b.name||"unknown tool",toolName:b.name,toolInput:JSON.stringify(b.input,null,2),toolCallId:b.id,model:h.message.model}):b.type==="thinking"&&b.thinking&&s.push({role:"thinking",timestamp:g,content:b.thinking})}}if(!o)return null;let p=await Vm(r);return{provider:"claude",sessionId:m,slug:i,cwd:o,createdAt:f||n.createdAt,modifiedAt:n.modifiedAt,model:l,cliVersion:a,startCommand:"claude",gitBranch:c,firstUserMessage:u,lastUserMessage:d,messageCount:p.messageCount,filePath:r,totalInputTokens:p.totalInputTokens||void 0,totalCachedInputTokens:p.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:p.totalCacheWriteInputTokens||void 0,totalOutputTokens:p.totalOutputTokens||void 0,lastInputTokens:p.lastInputTokens||void 0,lastTokenUsage:p.lastTokenUsage,messages:s}}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await DI(r),!0):!1}async resolveSessionFile(e){let r;try{r=await To(this.projectsDir)}catch{return null}let n=[];for(let i of r){let a=Qr(this.projectsDir,i);if(!(await Xm(a).catch(()=>null))?.isDirectory())continue;let c;try{c=await To(a)}catch{continue}for(let u of c){if(!u.endsWith(".jsonl"))continue;let d=Gm(u,".jsonl");/^[0-9a-f]{8}-/.test(d)&&n.push({filePath:Qr(a,u),fileSessionId:d})}}let s=n.find(i=>i.fileSessionId===e);if(s)return s.filePath;let o=n.filter(i=>i.fileSessionId.startsWith(e));if(o.length===1)return o[0].filePath;for(let i of n){let a=await Ce(i.filePath,20);for(let l of a)if(l.slug&&l.slug===e)return i.filePath}return null}}});function So(t){return"'"+t.replace(/'/g,"'\\''")+"'"}function WI(t,e,r){if(!r)return"";let n=t.tools[e]??Pl[e],s=n?.profiles?.[r]?.flags??Pl[e]?.profiles?.[r]?.flags;if(s!==void 0)return s.trim();if(n?.profile_flag)return n.profile_flag.replace(/\{\{profile\}\}/g,r).trim();throw new Error(`Profile "${r}" is not configured for tool "${e}"`)}function Ym(t,e){return!!t.tools[e]}function zm(t,e,r,n,s){let o=t.tools[e]??Pl[e],i;if(o?.agent){let l=So(n);i=o.agent.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,l)}else{let l=UI[e];if(!l)throw new Error(`No agent command configured for tool "${e}"`);let c=l.argv.map(u=>u.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,n));if(l.mode==="stdin"){let u=c.map(So).join(" ");i=`printf '%s\\n' ${So(n)} | ${u}`}else i=c.map(So).join(" ")}let a=WI(t,e,s);return a&&(i+=" "+a),i}var Pl,UI,Zm=E(()=>{"use strict";Pl={claude:{start:"claude",resume:"claude --resume {{session_id}} --dangerously-skip-permissions",profiles:{default:{description:"Default profile",flags:""}}},codex:{start:"codex",resume:"codex resume {{session_id}} --dangerously-bypass-approvals-and-sandbox",profiles:{default:{description:"Default profile",flags:""}}},opencode:{start:"opencode",resume:"opencode --session {{session_id}}",profiles:{default:{description:"Default profile",flags:""}}},gemini:{start:"gemini",resume:"gemini --resume {{session_id}} -y",profiles:{default:{description:"Default profile",flags:""}}},copilot:{start:"copilot",resume:"copilot --resume={{session_id}} --yolo",profiles:{default:{description:"Default profile",flags:""}}},qwen:{start:"qwen",resume:"qwen --resume {{session_id}} --approval-mode yolo",profiles:{default:{description:"Default profile",flags:""}}},agy:{start:"agy",resume:"agy --conversation {{session_id}} --dangerously-skip-permissions",profiles:{default:{description:"Default profile",flags:""}}}},UI={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 Qm(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 ep=E(()=>{"use strict"});var BI,Ee,ko,kt=E(()=>{"use strict";BI="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: ${BI}`,ko=`send this exact lmctl seed instruction: "${Ee}"`});function Wt(t,e){let r={...t??process.env,PWD:e};return delete r.OLDPWD,r}function HI(t,e){return e===void 0||e.length===0?t:{...t??process.env,[ss]:e}}function He(t,e,r){return HI(Wt(t,e),r)}var ss,ut=E(()=>{"use strict";ss="LMCTL_SELF_SESSIONID"});import{spawn as tp}from"node:child_process";import{mkdirSync as qI}from"node:fs";var Fl,Re,Bt=E(()=>{"use strict";Zm();ep();kt();ut();Fl=class t extends Error{cancelReason;constructor(e,r){super(e),this.name="TurnAbortError",this.cancelReason=r,Object.setPrototypeOf(this,t.prototype)}},Re=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 qI(e,{recursive:!0}),new Promise(n=>{let s;try{s=tp(this.binary,this.seedArgsFor(r),{cwd:e,env:Wt(void 0,e),stdio:["pipe","pipe","pipe"],timeout:6e4})}catch(a){return n({success:!1,error:a instanceof Error?a.message:String(a)})}let o="";s.stderr?.on("data",a=>{o+=a.toString()});let i=r?.prompt!==void 0&&this.seedStdin!==void 0?`${r.prompt}
1162
+ `:this.seedStdin;i&&s.stdin?.write(i),s.stdin?.end(),s.on("exit",a=>{n(a===0||a===null?{success:!0}:{success:!1,error:o.trim().slice(0,200)||`exit code ${a}`})}),s.on("error",a=>{n({success:!1,error:a.message})})})}resumeCommand(e,r){return this.resumeTemplate.replace(/\{\{session_id\}\}/g,e)}startCommand(e){return this.startTemplate}manualSeedHint(e){return{launchCommand:`cd ${e} && ${this.binary}`,postLaunchNote:ko,lsCommand:`lmctl ls --provider ${this.name} --sessiondir ${e}`}}static DEFAULT_IDLE_TIMEOUT_MS=8*60*60*1e3;sendTurn(e,r){if(r.userConfig&&Ym(r.userConfig,this.name)){let s=r.userConfig.tools[this.name];if(s?.agent)return this.runOneShotAgent(e,r,s.agent)}let n=r.timeoutMs??t.DEFAULT_IDLE_TIMEOUT_MS;return n<=0&&!r.signal?this.transportFn(e,{...r,binary:this.binary}):this.withTimeouts(n,e,r)}withTimeouts(e,r,n){let s=new AbortController,o,i,a="",l,c=()=>{e<=0||(clearTimeout(o),o=setTimeout(()=>{n.onIdleWarning?.(e),u(),s.abort(),l&&l({text:a,sessionId:n.sessionId,durationMs:e,status:"stalled",stalledAfterMs:e})},e))},u=()=>{clearTimeout(o)};n.signal&&(n.signal.aborted?(i="external",s.abort()):n.signal.addEventListener("abort",()=>{i="external",s.abort()},{once:!0})),c();let d={...n,binary:this.binary,signal:s.signal,onDelta:p=>{a+=p,c(),n.onDelta?.(p)},onProgress:p=>{p.kind!=="api_retry"&&c(),n.onProgress?.(p)}},f=this.transportFn(r,d).then(p=>(u(),{...p,status:"ok"})).catch(p=>{throw u(),i==="external"?new Fl("Turn cancelled","external"):p}),m=new Promise(p=>{l=p});return Promise.race([f,m])}runOneShotAgent(e,r,n){let s=zm(r.userConfig,this.name,r.sessionId,e,r.profile),o=Date.now();return new Promise((i,a)=>{let l=Qm(r.env),c=tp(s,{shell:!0,cwd:r.cwd,env:He(r.env,r.cwd,r.sessionId),stdio:["pipe","pipe","pipe"]}),u=!1,d=!1,f=setTimeout(()=>{d=!0,c.kill()},l),m="",p="";if(c.stdout?.on("data",h=>{let g=h.toString();m+=g,r.onDelta?.(g)}),c.stderr?.on("data",h=>{p+=h.toString()}),r.signal){if(r.signal.aborted)return clearTimeout(f),c.kill(),a(new Error("Aborted"));r.signal.addEventListener("abort",()=>c.kill(),{once:!0})}c.on("exit",h=>{if(u)return;u=!0,clearTimeout(f);let g=Date.now()-o;d?a(new Error(`Agent command timed out after ${l}ms`)):h===0||h===null?i({text:m.trim(),sessionId:r.sessionId,durationMs:g}):a(new Error(p.trim().slice(0,200)||`Agent command exited with code ${h}`))}),c.on("error",h=>{u||(u=!0,clearTimeout(f),a(h))})})}}});function Io(t,e){let r;if(e&&typeof e=="object"){let n=e.code;typeof n=="number"&&(r=n)}return new qt(t,r,e)}var et,ve,Ht,vo,qt,en=E(()=>{"use strict";et=class extends Error{constructor(e,r){super(e,r),this.name=this.constructor.name}},ve=class extends et{},Ht=class extends et{exitCode;signal;stderr;constructor(e,r,n=null,s){super(e),this.exitCode=r,this.signal=n,this.stderr=s}},vo=class extends et{line;constructor(e,r,n){super(e,{cause:n}),this.line=r}},qt=class extends et{rpcCode;rpcData;constructor(e,r,n){super(e),r!==void 0&&(this.rpcCode=r),n!==void 0&&(this.rpcData=n)}}});import*as Wl from"node:child_process";function XI(t){if(typeof Wl.spawnSync=="function")try{Wl.spawnSync("taskkill",["/T","/F","/PID",String(t)],{windowsHide:!0})}catch{}}function rp(t){return t.exitCode!==null||t.signalCode!==null}function Ul(t,e){return rp(t)?Promise.resolve(!0):new Promise(r=>{let n=!1,s=()=>{n||(n=!0,clearTimeout(o),r(!0))},o=setTimeout(()=>{n||(n=!0,t.removeListener("exit",s),r(!1))},e);t.once("exit",s)})}async function dt(t,e={}){let r=Date.now(),n=e.stdinEnd!==!1,s=e.softDelayMs??5e3,o=e.killDelayMs??5e3,i=e.platform??process.platform,a=e.runTaskkill??XI;if(rp(t))return{signal:"natural",elapsedMs:Date.now()-r};if(n&&t.stdin&&!t.stdin.destroyed)try{t.stdin.end()}catch{}if(await Ul(t,s))return{signal:"stdin",elapsedMs:Date.now()-r};if(i==="win32"&&typeof t.pid=="number")a(t.pid);else try{t.kill("SIGTERM")}catch{}if(await Ul(t,o))return{signal:"SIGTERM",elapsedMs:Date.now()-r};if(i!=="win32")try{t.kill("SIGKILL")}catch{}return await Ul(t,JI)?{signal:"SIGKILL",elapsedMs:Date.now()-r}:{signal:"abandoned",elapsedMs:Date.now()-r}}var JI,No=E(()=>{"use strict";JI=1e3});function np(t){he()&&Le({event:"legacy",msg:`[debug] ${t}`},{always:!0})}function or(t,e){let r=VI[t];if(r)return r[e]??r.yolo}function YI(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 ft(t,e,r="yolo"){if(KI.has(t)){np(`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"?or(t,"plan"):GI[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 z({event:"yolo_assert_failed",provider:t,reason:"unconfigured_provider",args:e.join(" "),message:s}),new ve(s)}if(!YI(e,n)){let s=n.join(" "),o=`${t} spawn missing YOLO flag '${s}' \u2014 YOLO is mandatory for every provider; see src/providers/yolo-contract.ts. Got argv: [${e.map(i=>JSON.stringify(i)).join(", ")}]`;throw z({event:"yolo_assert_failed",provider:t,reason:"flag_missing",required_flag:s,mode:r,args:e.join(" "),message:o}),new ve(o)}np(`YOLO ${t} [mode=${r}]: argv flag '${n.join(" ")}'`)}var GI,VI,KI,tn=E(()=>{"use strict";en();Ne();GI={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"],gemini:["-y"],copilot:["--yolo"],agy:["--dangerously-skip-permissions"],lmplayer:["--dangerously-skip-permissions"]},VI={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"]}};KI=new Set(["codex","opencode"])});import{spawn as zI}from"node:child_process";import{existsSync as ZI}from"node:fs";function e0(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(`
1164
1163
 
1165
1164
  --- additional response (turn ${r+1} of ${t.length}; likely an injected mid-call notification) ---
1166
1165
 
@@ -1168,16 +1167,16 @@ var ov=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var re=(t,e)=>{f
1168
1167
  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:
1169
1168
  ${e}
1170
1169
 
1171
- ${r}`:r}function sp(t,e){return new Promise((r,n)=>{let s=e.tool||"claude",o=e.binaryPath||QI[s]||"claude",i=["-p","","--output-format","stream-json","--input-format","stream-json"];s==="claude"&&i.push("--verbose"),e.sessionId&&i.push("--resume",e.sessionId),e.model&&i.push("--model",e.model);let a=e.permissionMode??"yolo",l=or(s,a)??s0[s]??["--dangerously-skip-permissions"];i.push(...l);try{ft(s,i,a)}catch(g){return n(g)}if(e.cwd&&!ZI(e.cwd))return z({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),n(new ve(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=zI(o,i,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Be(e.env,e.cwd,e.sessionId)}),u=!1;if(e.signal){if(e.signal.aborted)return u=!0,z({event:"transport_abort",provider:s,phase:"pre_spawn"}),dt(c).catch(()=>{}),n(new Error("Aborted"));e.signal.addEventListener("abort",()=>{u=!0,z({event:"transport_abort",provider:s}),dt(c).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let d=t0({onEvent:e.onEvent,onText:e.onText}),f="";function m(g){let h=d.sawResult();d.processLine(g),!h&&d.sawResult()&&c.stdin?.end()}c.stdout?.on("data",g=>{f+=g.toString();let h=f.split(`
1172
- `);f=h.pop()||"";for(let b of h)m(b)});let p="";c.stderr?.on("data",g=>{p+=g.toString()}),c.on("error",g=>{z({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:g.message}),n(new ve(`Failed to spawn ${o}: ${g.message}`,{cause:g}))}),c.on("exit",g=>{if(u)return;f.trim()&&m(f);let h=d.finalize();h?(bt(`stream-json: result ${h.result.slice(0,80)}${h.result.length>80?"...":""} (${h.durationMs}ms)`),r({...h,exitCode:g})):(z({event:"transport_error",provider:s,error_class:"Error",reason:"provider_no_result",exit_code:g,stderr_tail:p.slice(0,500)}),n(new Error(n0({tool:s,exitCode:g,stderr:p}))))});let _=JSON.stringify({type:"user",message:{role:"user",content:t}});c.stdin?.write(_+`
1170
+ ${r}`:r}function sp(t,e){return new Promise((r,n)=>{let s=e.tool||"claude",o=e.binaryPath||QI[s]||"claude",i=["-p","","--output-format","stream-json","--input-format","stream-json"];s==="claude"&&i.push("--verbose"),e.sessionId&&i.push("--resume",e.sessionId),e.model&&i.push("--model",e.model);let a=e.permissionMode??"yolo",l=or(s,a)??s0[s]??["--dangerously-skip-permissions"];i.push(...l);try{ft(s,i,a)}catch(g){return n(g)}if(e.cwd&&!ZI(e.cwd))return z({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),n(new ve(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=zI(o,i,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:He(e.env,e.cwd,e.sessionId)}),u=!1;if(e.signal){if(e.signal.aborted)return u=!0,z({event:"transport_abort",provider:s,phase:"pre_spawn"}),dt(c).catch(()=>{}),n(new Error("Aborted"));e.signal.addEventListener("abort",()=>{u=!0,z({event:"transport_abort",provider:s}),dt(c).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let d=t0({onEvent:e.onEvent,onText:e.onText}),f="";function m(g){let _=d.sawResult();d.processLine(g),!_&&d.sawResult()&&c.stdin?.end()}c.stdout?.on("data",g=>{f+=g.toString();let _=f.split(`
1171
+ `);f=_.pop()||"";for(let b of _)m(b)});let p="";c.stderr?.on("data",g=>{p+=g.toString()}),c.on("error",g=>{z({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:g.message}),n(new ve(`Failed to spawn ${o}: ${g.message}`,{cause:g}))}),c.on("exit",g=>{if(u)return;f.trim()&&m(f);let _=d.finalize();_?(bt(`stream-json: result ${_.result.slice(0,80)}${_.result.length>80?"...":""} (${_.durationMs}ms)`),r({..._,exitCode:g})):(z({event:"transport_error",provider:s,error_class:"Error",reason:"provider_no_result",exit_code:g,stderr_tail:p.slice(0,500)}),n(new Error(n0({tool:s,exitCode:g,stderr:p}))))});let h=JSON.stringify({type:"user",message:{role:"user",content:t}});c.stdin?.write(h+`
1173
1172
  `),bt(`stream-json: prompt sent (${t.length} chars)`)})}var QI,s0,op=E(()=>{"use strict";en();No();tn();Ne();ut();QI={claude:"claude",qwen:"qwen"};s0={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"]}});function xo(t={}){return[]}var Bl=E(()=>{"use strict"});import{spawn as o0}from"node:child_process";import{createInterface as i0}from"node:readline";import{existsSync as a0,readFileSync as l0}from"node:fs";import{fileURLToPath as c0}from"node:url";function u0(t){return t==="plan"?"read-only":"danger-full-access"}function f0(){return{clientInfo:{name:"lmctl",title:"lmctl",version:d0},capabilities:{experimentalApi:!1}}}function ir(t,e){bt(`[codex:${t}] ${JSON.stringify(e)}`)}function m0(){return{agentItems:new Map,resultText:""}}function ip(t,e,r,n){let s=t.method;if(!s)return!1;let o=t.params;if(s==="turn/started")return e.agentItems.clear(),e.resultText="",!1;if(s==="item/started"){let i=o?.item;if(i?.type==="agentMessage"&&typeof i.id=="string"){let a=typeof i.phase=="string"?i.phase:void 0,l=a==="commentary"||a==="final_answer"?a:void 0;return e.agentItems.set(i.id,{phase:l,buffer:""}),!0}return!1}if(s==="item/agentMessage/delta"){let i=o?.delta||"",a=typeof o?.itemId=="string"?o.itemId:void 0;if(!i)return!0;let l=a?e.agentItems.get(a):void 0;return l?(l.phase==="commentary"||(l.buffer+=i),r?.(i),l.phase&&o&&(o._lmctlItemPhase=l.phase)):(e.resultText+=i,r?.(i)),!0}if(s==="item/completed"){let i=o?.item;if(i?.type==="agentMessage"&&typeof i.id=="string"){let a=e.agentItems.get(i.id);if(a){if(a.phase!=="commentary"){let l=typeof i.text=="string"?i.text:a.buffer;if(n&&typeof i.text=="string"&&i.text!==a.buffer){let c=typeof o?.threadId=="string"?o.threadId:void 0,u=typeof o?.turnId=="string"?o.turnId:void 0;n({itemId:i.id,threadId:c,turnId:u,expectedFromItemText:i.text,gotFromBuffer:a.buffer})}e.resultText+=l}e.agentItems.delete(i.id)}return!0}return!1}return!1}function p0(t){for(let[,e]of t.agentItems.entries())e.phase!=="commentary"&&e.buffer&&(t.resultText+=e.buffer);t.agentItems.clear()}function h0(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 _0(){return{pendingCodexError:null}}function g0(t){let e=t.stderr.trim().slice(0,500),r=`lmctl: codex app-server exited with code ${t.exitCode} before completing the turn.
1174
1173
  One possible cause: Codex stopped before delivering a terminal turn/completed event.`;return e?`Original provider error:
1175
1174
  ${e}
1176
1175
 
1177
- ${r}`:r}function y0(t,e){let r=h0(t);return r.willRetry||(e.pendingCodexError=r.turnError),r}function w0(t,e){if(e.pendingCodexError){let o=e.pendingCodexError;return e.pendingCodexError=null,{shouldReject:!0,turnError:o}}let n=t.params?.turn;if((typeof n?.status=="string"?n.status:void 0)==="failed"){let o=n?.error,i=typeof o?.message=="string"?o.message:void 0,a=i&&i.length>0?i:"(no message)";return{shouldReject:!0,turnError:new Error(`Turn errored: ${a}`)}}return{shouldReject:!1}}function ap(t,e){return new Promise((r,n)=>{let s=e.binaryPath||"codex",o=["app-server","--listen","stdio://"];e.model&&o.push("-c",`model=${JSON.stringify(e.model)}`);let i=e.isLead??e.alias?.toLowerCase()==="lead",a=i?xo():[];o.push(...a),he()&&Fe(JSON.stringify({event:"codex_mcp_inject",alias:e.alias??null,isLead:i,injected:a.length>0}));let l=e.permissionMode??"yolo",c=u0(l);try{ft("codex",o,l)}catch(M){return n(M)}if(e.cwd&&!a0(e.cwd))return z({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`}),n(new ve(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let u=o0(s,o,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Be(e.env,e.cwd,e.threadId)}),d=!1;if(e.signal){if(e.signal.aborted)return d=!0,z({event:"transport_abort",provider:"codex",phase:"pre_spawn"}),dt(u).catch(()=>{}),n(new Error("Aborted"));e.signal.addEventListener("abort",()=>{d=!0,z({event:"transport_abort",provider:"codex"}),dt(u).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let f=i0({input:u.stdout}),m=new Map,p=1,_=e.threadId||"",g="",h=!1,b=!1,w=Date.now(),k=m0(),N=_0();function v(M,L={}){return new Promise(($,Z)=>{let J=p++;m.set(J,{resolve:$,reject:Z});let I=JSON.stringify({jsonrpc:"2.0",id:J,method:M,params:L});u.stdin?.write(I+`
1176
+ ${r}`:r}function y0(t,e){let r=h0(t);return r.willRetry||(e.pendingCodexError=r.turnError),r}function w0(t,e){if(e.pendingCodexError){let o=e.pendingCodexError;return e.pendingCodexError=null,{shouldReject:!0,turnError:o}}let n=t.params?.turn;if((typeof n?.status=="string"?n.status:void 0)==="failed"){let o=n?.error,i=typeof o?.message=="string"?o.message:void 0,a=i&&i.length>0?i:"(no message)";return{shouldReject:!0,turnError:new Error(`Turn errored: ${a}`)}}return{shouldReject:!1}}function ap(t,e){return new Promise((r,n)=>{let s=e.binaryPath||"codex",o=["app-server","--listen","stdio://"];e.model&&o.push("-c",`model=${JSON.stringify(e.model)}`);let i=e.isLead??e.alias?.toLowerCase()==="lead",a=i?xo():[];o.push(...a),he()&&Ue(JSON.stringify({event:"codex_mcp_inject",alias:e.alias??null,isLead:i,injected:a.length>0}));let l=e.permissionMode??"yolo",c=u0(l);try{ft("codex",o,l)}catch(M){return n(M)}if(e.cwd&&!a0(e.cwd))return z({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`}),n(new ve(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let u=o0(s,o,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:He(e.env,e.cwd,e.threadId)}),d=!1;if(e.signal){if(e.signal.aborted)return d=!0,z({event:"transport_abort",provider:"codex",phase:"pre_spawn"}),dt(u).catch(()=>{}),n(new Error("Aborted"));e.signal.addEventListener("abort",()=>{d=!0,z({event:"transport_abort",provider:"codex"}),dt(u).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let f=i0({input:u.stdout}),m=new Map,p=1,h=e.threadId||"",g="",_=!1,b=!1,w=Date.now(),k=m0(),N=_0();function v(M,L={}){return new Promise(($,Z)=>{let J=p++;m.set(J,{resolve:$,reject:Z});let I=JSON.stringify({jsonrpc:"2.0",id:J,method:M,params:L});u.stdin?.write(I+`
1178
1177
  `)})}function R(M,L={}){let $=JSON.stringify({jsonrpc:"2.0",method:M,params:L});u.stdin?.write($+`
1179
- `)}f.on("line",M=>{let L;try{L=JSON.parse(M)}catch{return}if(typeof L.id=="number"&&m.has(L.id)){let J=m.get(L.id);if(m.delete(L.id),L.error){let I=L.error,x=typeof I?.message=="string"&&I.message.length>0?I.message:JSON.stringify(L.error);J.reject(Io(`codex app-server error: ${x}`,I))}else J.resolve(L);e.onEvent?.(L);return}let $=L.method;if(!$){e.onEvent?.(L);return}if($==="thread/started"){let I=L.params?.thread;I?.id&&(_=I.id)}let Z=he()?J=>{ir("item.text/buffer-mismatch",{itemId:J.itemId,threadId:J.threadId??null,turnId:J.turnId??null,expectedFromItemText:J.expectedFromItemText,gotFromBuffer:J.gotFromBuffer,expectedLen:J.expectedFromItemText.length,gotLen:J.gotFromBuffer.length})}:void 0;if($==="turn/started"){let J=L.params,I=J?.turn;I?.id&&(g=I.id),ip(L,k,e.onDelta,Z),he()&&ir("turn/started",{params:J??null})}if(he()&&($==="item/started"||$==="item/completed")){let J=L.params;J?.item?.type==="agentMessage"&&ir($,{params:J??null})}if($==="item/started"||$==="item/agentMessage/delta"||$==="item/completed"){if($==="item/agentMessage/delta"){let J=L.params;he()&&ir("agentMessage/delta",{params:J??null})}ip(L,k,e.onDelta,Z)}if($==="turn/completed"){let J=L.params;if(he())for(let[x,C]of k.agentItems.entries())C.buffer&&ir("turn/completed/unflushed-item",{itemId:x,phase:C.phase,bufferLen:C.buffer.length});p0(k),he()&&ir("turn/completed",{params:J??null});let I=w0(L,N);I.shouldReject?(he()&&ir("turn/completed/terminal-reject",{message:I.turnError.message}),b=!0,h=!0,u.stdin?.end(),n(I.turnError)):(h=!0,u.stdin?.end())}if($==="error"){let J=y0(L,N);if(he()){let I=L.params,x=I?.error,C=typeof x?.message=="string"?x.message:"(no message)";ir(J.willRetry?"error/retry":"error/terminal-deferred",{message:C,willRetry:J.willRetry,params:I??null})}}e.onEvent?.(L)});let G="";u.stderr?.on("data",M=>{G+=M.toString()}),u.on("error",M=>{z({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:M.message}),n(new ve(`Failed to spawn codex app-server: ${M.message}`,{cause:M}))}),u.on("exit",M=>{if(!d&&!b){if(h){r({result:k.resultText,threadId:_,turnId:g,durationMs:Date.now()-w,exitCode:M});return}if(N.pendingCodexError){n(N.pendingCodexError);return}z({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:M,stderr_tail:G.slice(0,500)}),n(new Error(g0({exitCode:M,stderr:G})))}}),(async()=>{try{if(await v("initialize",f0()),R("initialized",{}),e.threadId)try{let M=v("thread/resume",{threadId:e.threadId,sandbox:c,approvalPolicy:"never",...e.model?{model:e.model}:{}}),L=new Promise(($,Z)=>setTimeout(()=>Z(new Error("resume timeout")),5e3));await Promise.race([M,L]),_=e.threadId}catch{process.stderr.write(`[codex] thread/resume failed, creating new thread
1180
- `);let L=(await v("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:c,...e.model?{model:e.model}:{}})).result?.thread;L?.id&&(_=L.id)}else{let L=(await v("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:c,...e.model?{model:e.model}:{}})).result?.thread;L?.id&&(_=L.id)}await v("turn/start",{threadId:_,input:[{type:"text",text:t}],...e.model?{model:e.model}:{}})}catch(M){dt(u).catch(()=>{}),n(M instanceof Error?M:new Error(String(M)))}})()})}var d0,lp=E(()=>{"use strict";Ne();Ne();en();No();tn();Bl();Ne();ut();d0=(()=>{try{let t=new URL("../../../package.json",import.meta.url),e=JSON.parse(l0(c0(t),"utf8"));return typeof e.version=="string"?e.version:"0.0.0"}catch{return"0.0.0"}})()});import{existsSync as dp,mkdirSync as E0,readFileSync as fp,writeFileSync as cp}from"node:fs";import{join as os,resolve as T0}from"node:path";function mp(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 Hl(t,e,r={existsSync:dp,readFileSync:fp}){let n=[];for(let s of t){if(s.provider.trim().toLowerCase()!=="opencode")continue;let o=T0(e,s.sessiondir??e);for(let i of b0(o)){let a=S0(i,r);a!==void 0&&Object.prototype.hasOwnProperty.call(a,"permission")&&(mp(a.permission)||n.push(`[${s.alias}] ${i} sets a non-allow \`permission\`, which opencode merges over lmctl's YOLO (.opencode/opencode.json permission:"allow") \u2014 the member may hang on permission prompts. Set \`permission: "allow"\` in that file (or remove the key).`))}}return n}function b0(t){return[os(t,".opencode","opencode.jsonc"),os(t,"opencode.jsonc"),os(t,"opencode.json")]}function S0(t,e){try{if(!e.existsSync(t))return;let r=e.readFileSync(t,"utf-8"),n=JSON.parse(k0(r));return n===null||typeof n!="object"||Array.isArray(n)?void 0:n}catch{return}}function k0(t){let e="",r=!1,n="",s=!1;for(let o=0;o<t.length;o+=1){let i=t[o],a=t[o+1];if(r){e+=i,s?s=!1:i==="\\"?s=!0:i===n&&(r=!1,n="");continue}if(i==='"'||i==="'"){r=!0,n=i,e+=i;continue}if(i==="/"&&a==="/"){for(;o<t.length&&t[o]!==`
1178
+ `)}f.on("line",M=>{let L;try{L=JSON.parse(M)}catch{return}if(typeof L.id=="number"&&m.has(L.id)){let J=m.get(L.id);if(m.delete(L.id),L.error){let I=L.error,x=typeof I?.message=="string"&&I.message.length>0?I.message:JSON.stringify(L.error);J.reject(Io(`codex app-server error: ${x}`,I))}else J.resolve(L);e.onEvent?.(L);return}let $=L.method;if(!$){e.onEvent?.(L);return}if($==="thread/started"){let I=L.params?.thread;I?.id&&(h=I.id)}let Z=he()?J=>{ir("item.text/buffer-mismatch",{itemId:J.itemId,threadId:J.threadId??null,turnId:J.turnId??null,expectedFromItemText:J.expectedFromItemText,gotFromBuffer:J.gotFromBuffer,expectedLen:J.expectedFromItemText.length,gotLen:J.gotFromBuffer.length})}:void 0;if($==="turn/started"){let J=L.params,I=J?.turn;I?.id&&(g=I.id),ip(L,k,e.onDelta,Z),he()&&ir("turn/started",{params:J??null})}if(he()&&($==="item/started"||$==="item/completed")){let J=L.params;J?.item?.type==="agentMessage"&&ir($,{params:J??null})}if($==="item/started"||$==="item/agentMessage/delta"||$==="item/completed"){if($==="item/agentMessage/delta"){let J=L.params;he()&&ir("agentMessage/delta",{params:J??null})}ip(L,k,e.onDelta,Z)}if($==="turn/completed"){let J=L.params;if(he())for(let[x,C]of k.agentItems.entries())C.buffer&&ir("turn/completed/unflushed-item",{itemId:x,phase:C.phase,bufferLen:C.buffer.length});p0(k),he()&&ir("turn/completed",{params:J??null});let I=w0(L,N);I.shouldReject?(he()&&ir("turn/completed/terminal-reject",{message:I.turnError.message}),b=!0,_=!0,u.stdin?.end(),n(I.turnError)):(_=!0,u.stdin?.end())}if($==="error"){let J=y0(L,N);if(he()){let I=L.params,x=I?.error,C=typeof x?.message=="string"?x.message:"(no message)";ir(J.willRetry?"error/retry":"error/terminal-deferred",{message:C,willRetry:J.willRetry,params:I??null})}}e.onEvent?.(L)});let G="";u.stderr?.on("data",M=>{G+=M.toString()}),u.on("error",M=>{z({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:M.message}),n(new ve(`Failed to spawn codex app-server: ${M.message}`,{cause:M}))}),u.on("exit",M=>{if(!d&&!b){if(_){r({result:k.resultText,threadId:h,turnId:g,durationMs:Date.now()-w,exitCode:M});return}if(N.pendingCodexError){n(N.pendingCodexError);return}z({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:M,stderr_tail:G.slice(0,500)}),n(new Error(g0({exitCode:M,stderr:G})))}}),(async()=>{try{if(await v("initialize",f0()),R("initialized",{}),e.threadId)try{let M=v("thread/resume",{threadId:e.threadId,sandbox:c,approvalPolicy:"never",...e.model?{model:e.model}:{}}),L=new Promise(($,Z)=>setTimeout(()=>Z(new Error("resume timeout")),5e3));await Promise.race([M,L]),h=e.threadId}catch{process.stderr.write(`[codex] thread/resume failed, creating new thread
1179
+ `);let L=(await v("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:c,...e.model?{model:e.model}:{}})).result?.thread;L?.id&&(h=L.id)}else{let L=(await v("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:c,...e.model?{model:e.model}:{}})).result?.thread;L?.id&&(h=L.id)}await v("turn/start",{threadId:h,input:[{type:"text",text:t}],...e.model?{model:e.model}:{}})}catch(M){dt(u).catch(()=>{}),n(M instanceof Error?M:new Error(String(M)))}})()})}var d0,lp=E(()=>{"use strict";Ne();Ne();en();No();tn();Bl();Ne();ut();d0=(()=>{try{let t=new URL("../../../package.json",import.meta.url),e=JSON.parse(l0(c0(t),"utf8"));return typeof e.version=="string"?e.version:"0.0.0"}catch{return"0.0.0"}})()});import{existsSync as dp,mkdirSync as E0,readFileSync as fp,writeFileSync as cp}from"node:fs";import{join as os,resolve as T0}from"node:path";function mp(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 Hl(t,e,r={existsSync:dp,readFileSync:fp}){let n=[];for(let s of t){if(s.provider.trim().toLowerCase()!=="opencode")continue;let o=T0(e,s.sessiondir??e);for(let i of b0(o)){let a=S0(i,r);a!==void 0&&Object.prototype.hasOwnProperty.call(a,"permission")&&(mp(a.permission)||n.push(`[${s.alias}] ${i} sets a non-allow \`permission\`, which opencode merges over lmctl's YOLO (.opencode/opencode.json permission:"allow") \u2014 the member may hang on permission prompts. Set \`permission: "allow"\` in that file (or remove the key).`))}}return n}function b0(t){return[os(t,".opencode","opencode.jsonc"),os(t,"opencode.jsonc"),os(t,"opencode.json")]}function S0(t,e){try{if(!e.existsSync(t))return;let r=e.readFileSync(t,"utf-8"),n=JSON.parse(k0(r));return n===null||typeof n!="object"||Array.isArray(n)?void 0:n}catch{return}}function k0(t){let e="",r=!1,n="",s=!1;for(let o=0;o<t.length;o+=1){let i=t[o],a=t[o+1];if(r){e+=i,s?s=!1:i==="\\"?s=!0:i===n&&(r=!1,n="");continue}if(i==='"'||i==="'"){r=!0,n=i,e+=i;continue}if(i==="/"&&a==="/"){for(;o<t.length&&t[o]!==`
1181
1180
  `;)o+=1;o<t.length&&(e+=t[o]);continue}if(i==="/"&&a==="*"){for(o+=2;o<t.length&&!(t[o]==="*"&&t[o+1]==="/");)o+=1;o+=1;continue}e+=i}return e.replace(/,\s*([}\]])/g,"$1")}function Ao(t,e={}){let r=os(t,".opencode"),n=os(r,"opencode.json");if(!dp(n)){E0(r,{recursive:!0});let i=JSON.stringify({permission:"allow"},null,2);return cp(n,i+`
1182
1181
  `,"utf-8"),!0}let s;try{s=JSON.parse(fp(n,"utf-8"))}catch{return console.log(up.yellow(` .opencode/opencode.json at ${n} is malformed \u2014 skipping opencode config install.`)),!1}if(typeof s!="object"||s===null)return console.log(up.yellow(` .opencode/opencode.json at ${n} is not an object \u2014 skipping opencode config install.`)),!1;let o=!1;return s.permission===void 0&&(s.permission="allow",o=!0),mp(s.permission)||z({event:"opencode_yolo_override",provider:"opencode",config_path:n,user_permission:s.permission,message:`opencode.json has a user-set 'permission' value other than 'allow' \u2014 lmctl's YOLO contract is NOT in effect; turns may hang waiting on permission prompts. Set permission: "allow" or remove the key to restore YOLO.`}),o&&cp(n,JSON.stringify(s,null,2)+`
1183
1182
  `,"utf-8"),o}var up,$o=E(()=>{"use strict";Ne();up={yellow:t=>t}});import{spawn as v0}from"node:child_process";import{existsSync as I0}from"node:fs";import{createInterface as N0}from"node:readline";function x0(t){let e=t.stderr.trim().slice(0,500),r=`lmctl: ${t.tool} ACP process exited with code ${t.exitCode} before completing the prompt.
@@ -1186,31 +1185,31 @@ ${e}
1186
1185
 
1187
1186
  ${r}`:r}function M0(t){let e=[...t.matchAll(R0)];if(e.length>0){let r=e[e.length-1],n=(r.index??0)+r[0].length;return pp(t.slice(n).trimStart())}return pp(D0(t.replace(j0,"")))}function D0(t){let e=O0.exec(t);if(e===null)return t;let r=t.slice(e[0].length),n=[...r.matchAll(L0)];if(n.length<2)return t;let s=n[0],o=(s.index??0)+s[0].length;return r.slice(o).trimStart()}function pp(t){let e=[...t.matchAll(C0)];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 _p(t,e){let r=A0[e.tool];return r?new Promise((n,s)=>{let o=e.binaryPath||r.binary;if(e.tool==="opencode")try{Ao(e.cwd)}catch(v){z({event:"opencode_config_install_failed",cwd:e.cwd,error_message:v instanceof Error?v.message:String(v)})}let i=e.permissionMode??"yolo",a=[...r.args];if(i==="plan")if(e.tool==="gemini"){let v=or("gemini","plan"),R=or("gemini","yolo");a=a.filter(G=>!(R??[]).includes(G)),v&&a.push(...v)}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.
1188
1187
  `);e.model&&e.tool==="gemini"&&a.push("--model",e.model);let l=e.tool==="copilot"?"yolo":i;try{ft(e.tool,a,l)}catch(v){return s(v)}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.
1189
- `),e.cwd&&!I0(e.cwd))return z({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),s(new ve(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=v0(o,a,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Be(e.env,e.cwd,e.sessionId)}),u=Date.now(),d=!1;if(e.signal){if(e.signal.aborted)return d=!0,z({event:"transport_abort",provider:e.tool,phase:"pre_spawn"}),dt(c).catch(()=>{}),s(new Error("Aborted"));e.signal.addEventListener("abort",()=>{d=!0,z({event:"transport_abort",provider:e.tool,elapsed_ms:Date.now()-u}),dt(c).catch(()=>{}),s(new Error("Aborted"))},{once:!0})}let f=N0({input:c.stdout}),m=new Map,p=e.sessionId||"",_="",g="",h=!1,b=!1;function w(v,R={}){return new Promise((G,M)=>{let L=$0++;m.set(L,{resolve:G,reject:M});let $=JSON.stringify({jsonrpc:"2.0",id:L,method:v,params:R});ct({event:"acp_send",direction:"SEND",provider:e.tool,method:v,id:L,params:R}),c.stdin?.write($+`
1190
- `)})}f.on("line",v=>{let R;try{R=JSON.parse(v)}catch{return}if(ct({event:"acp_recv",direction:"RECV",provider:e.tool,id:typeof R.id=="number"?R.id:void 0,method:typeof R.method=="string"?R.method:void 0,preview:JSON.stringify(R).slice(0,300)}),e.onEvent?.(R),typeof R.id=="number"&&m.has(R.id)){let M=m.get(R.id);if(m.delete(R.id),R.error){let L=R.error,$=typeof L?.message=="string"&&L.message.length>0?L.message:JSON.stringify(R.error);M.reject(Io(`ACP RPC error: ${$}`,L))}else M.resolve(R);return}let G=R.method;if(G){if(typeof R.id=="number"){z({event:"acp_unhandled_request",provider:e.tool,method:G,id:R.id,params:R.params});let M=JSON.stringify({jsonrpc:"2.0",id:R.id,error:{code:-32601,message:`Method not found: ${G} (lmctl does not implement server-side ACP methods)`}});ct({event:"acp_send",direction:"SEND",provider:e.tool,replyTo:R.id,error:"method not found"}),c.stdin?.write(M+`
1191
- `);return}if(G==="session/update"){let L=R.params?.update;if(L?.sessionUpdate==="agent_message_chunk"){let Z=L.content?.text||"";Z&&b&&(_+=Z,e.onDelta?.(Z))}}}});let k="";c.stderr?.on("data",v=>{k+=v.toString()}),c.on("error",v=>{z({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:v.message,elapsed_ms:Date.now()-u}),s(new ve(`Failed to spawn ${r.binary} ${r.args.join(" ")}: ${v.message}`,{cause:v}))}),c.on("exit",v=>{d||(h?n({result:e.tool==="gemini"?M0(_):_,sessionId:p,durationMs:Date.now()-u,stopReason:g,exitCode:v}):(z({event:"transport_error",provider:e.tool,error_class:"Error",reason:"provider_no_result",exit_code:v,stderr_tail:k.slice(0,500),elapsed_ms:Date.now()-u}),s(new Error(x0({tool:e.tool,exitCode:v,stderr:k})))))});function N(v,R={}){let G=JSON.stringify({jsonrpc:"2.0",method:v,params:R});c.stdin?.write(G+`
1188
+ `),e.cwd&&!I0(e.cwd))return z({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),s(new ve(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=v0(o,a,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:He(e.env,e.cwd,e.sessionId)}),u=Date.now(),d=!1;if(e.signal){if(e.signal.aborted)return d=!0,z({event:"transport_abort",provider:e.tool,phase:"pre_spawn"}),dt(c).catch(()=>{}),s(new Error("Aborted"));e.signal.addEventListener("abort",()=>{d=!0,z({event:"transport_abort",provider:e.tool,elapsed_ms:Date.now()-u}),dt(c).catch(()=>{}),s(new Error("Aborted"))},{once:!0})}let f=N0({input:c.stdout}),m=new Map,p=e.sessionId||"",h="",g="",_=!1,b=!1;function w(v,R={}){return new Promise((G,M)=>{let L=$0++;m.set(L,{resolve:G,reject:M});let $=JSON.stringify({jsonrpc:"2.0",id:L,method:v,params:R});Le({event:"acp_send",direction:"SEND",provider:e.tool,method:v,id:L,params:R}),c.stdin?.write($+`
1189
+ `)})}f.on("line",v=>{let R;try{R=JSON.parse(v)}catch{return}if(Le({event:"acp_recv",direction:"RECV",provider:e.tool,id:typeof R.id=="number"?R.id:void 0,method:typeof R.method=="string"?R.method:void 0,preview:JSON.stringify(R).slice(0,300)}),e.onEvent?.(R),typeof R.id=="number"&&m.has(R.id)){let M=m.get(R.id);if(m.delete(R.id),R.error){let L=R.error,$=typeof L?.message=="string"&&L.message.length>0?L.message:JSON.stringify(R.error);M.reject(Io(`ACP RPC error: ${$}`,L))}else M.resolve(R);return}let G=R.method;if(G){if(typeof R.id=="number"){z({event:"acp_unhandled_request",provider:e.tool,method:G,id:R.id,params:R.params});let M=JSON.stringify({jsonrpc:"2.0",id:R.id,error:{code:-32601,message:`Method not found: ${G} (lmctl does not implement server-side ACP methods)`}});Le({event:"acp_send",direction:"SEND",provider:e.tool,replyTo:R.id,error:"method not found"}),c.stdin?.write(M+`
1190
+ `);return}if(G==="session/update"){let L=R.params?.update;if(L?.sessionUpdate==="agent_message_chunk"){let Z=L.content?.text||"";Z&&b&&(h+=Z,e.onDelta?.(Z))}}}});let k="";c.stderr?.on("data",v=>{k+=v.toString()}),c.on("error",v=>{z({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:v.message,elapsed_ms:Date.now()-u}),s(new ve(`Failed to spawn ${r.binary} ${r.args.join(" ")}: ${v.message}`,{cause:v}))}),c.on("exit",v=>{d||(_?n({result:e.tool==="gemini"?M0(h):h,sessionId:p,durationMs:Date.now()-u,stopReason:g,exitCode:v}):(z({event:"transport_error",provider:e.tool,error_class:"Error",reason:"provider_no_result",exit_code:v,stderr_tail:k.slice(0,500),elapsed_ms:Date.now()-u}),s(new Error(x0({tool:e.tool,exitCode:v,stderr:k})))))});function N(v,R={}){let G=JSON.stringify({jsonrpc:"2.0",method:v,params:R});c.stdin?.write(G+`
1192
1191
  `)}(async()=>{try{if(await w("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),N("notifications/initialized"),e.sessionId)try{p=(await w("session/load",{sessionId:e.sessionId,cwd:e.cwd,mcpServers:[]})).result?.sessionId||e.sessionId}catch(R){if(e.requireResume)throw new Error(`Cannot resume session ${e.sessionId} via ACP: ${R instanceof Error?R.message:String(R)}`);process.stderr.write(`[acp] session/load failed for ${e.sessionId}, creating new session
1193
1192
  `),p=(await w("session/new",{cwd:e.cwd,mcpServers:[]})).result?.sessionId||""}else p=(await w("session/new",{cwd:e.cwd,mcpServers:[]})).result?.sessionId||"";if(e.model&&e.tool==="opencode")try{await w("session/set_config_option",{sessionId:p,configId:"model",value:e.model}),bt(`acp: set_config_option(model=${e.model}) ok`)}catch(R){let G=R instanceof Error?R.message:String(R);process.stderr.write(`[acp] set_config_option(model=${e.model}) failed: ${G}
1194
1193
  `)}if(e.effort&&e.tool==="opencode")try{await w("session/set_config_option",{sessionId:p,configId:"effort",value:e.effort}),bt(`acp: set_config_option(effort=${e.effort}) ok`)}catch(R){let G=R instanceof Error?R.message:String(R);process.stderr.write(`[acp] set_config_option(effort=${e.effort}) failed: ${G}
1195
- `)}_="",b=!0,bt(`acp: prompt sent (${t.length} chars)`),g=(await w("session/prompt",{sessionId:p,prompt:[{type:"text",text:t}]})).result?.stopReason||"",h=!0,bt(`acp: result received (${_.length} chars, stopReason=${g})`),c.stdin?.end()}catch(v){dt(c).catch(()=>{}),s(v instanceof Error?v:new Error(String(v)))}})()}):Promise.reject(new Error(`No ACP config for tool "${e.tool}"`))}var A0,$0,hp,R0,j0,O0,L0,C0,gp=E(()=>{"use strict";Ne();en();No();tn();$o();Ne();ut();A0={gemini:{binary:"gemini",args:["--acp","-y","--skip-trust"]},copilot:{binary:"copilot",args:["--acp","--yolo"]},opencode:{binary:"opencode",args:["acp"]}},$0=1,hp="(?:png|jpe?g|webp|heic|pdf)",R0=new RegExp(`\\bSTANCE:\\s*\\S+_\\d{6,}\\.${hp}\\s*`,"gi"),j0=new RegExp(`^ACK:\\s*waiting for explicit lmctl task\\.\\d{6,}\\.${hp}\\s*`,"i"),O0=/^ACK:\s*waiting for explicit lmctl task[._]?\s*/i,L0=/^STANCE:\s+\S+\s*$/gim,C0=/\[Thought:\s*true\]\s*/gi});function ye(t,e=120){let r=t.replace(/\s+/g," ").trim();return r.length>e?r.slice(0,e-1)+"\u2026":r}function yp(t,e){return r=>{if(r.kind==="tool_use"&&typeof r.id=="string"){if(t.size>=P0){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 F0(){let t=new Map;return(e,r)=>{U0(e,yp(t,r))}}function U0(t,e){let r=t.type;if(r==="system"){let n=t.subtype;if(n==="api_retry"){let s=typeof t.attempt=="number"?t.attempt:void 0,o=typeof t.max_retries=="number"?t.max_retries:void 0,i=typeof t.error_status=="number"?t.error_status:void 0,a=typeof t.error=="string"?t.error:void 0,l=typeof t.retry_delay_ms=="number"?t.retry_delay_ms:void 0,c=[];s!==void 0&&c.push(o!==void 0?`attempt ${s}/${o}`:`attempt ${s}`),i!==void 0&&c.push(`HTTP ${i}`),l!==void 0&&c.push(`retry in ${Math.round(l/1e3)}s`),a&&c.push(ye(a,60));let u=c.length>0?c.join(", "):n;e({kind:"api_retry",summary:u});return}if(n==="api_error"){let s=typeof t.error_status=="number"?t.error_status:void 0,o=typeof t.error=="string"?t.error:void 0,i=["api_error"];s!==void 0&&i.push(`HTTP ${s}`),o&&i.push(ye(o,80)),e({kind:"other",summary:i.join(": "),raw:t});return}e({kind:"system",summary:n||"system",raw:t});return}if(r==="assistant"||r==="user"){let s=t.message?.content;if(!Array.isArray(s))return;for(let o of s){let i=o.type;if(i==="text"){let a=o.text||"";a&&e({kind:"text",summary:ye(a),raw:o})}else if(i==="tool_use"){let a=o.name||"tool",l=typeof o.id=="string"?o.id:void 0,c=o.input,u="";c&&(typeof c.command=="string"?u=c.command:typeof c.file_path=="string"?u=c.file_path:typeof c.path=="string"?u=c.path:typeof c.pattern=="string"?u=c.pattern:typeof c.url=="string"?u=c.url:u=ye(JSON.stringify(c))),e({kind:"tool_use",tool:a,summary:ye(u),id:l,raw:o})}else if(i==="thinking"){let a=o.thinking||"";e({kind:"thinking",summary:ye(a),raw:o})}else if(i==="tool_result"){let l=o.is_error===!0?"error":"ok",c=typeof o.tool_use_id=="string"?o.tool_use_id:void 0,u,d=o.content;if(typeof d=="string")u=`${d.split(`
1194
+ `)}h="",b=!0,bt(`acp: prompt sent (${t.length} chars)`),g=(await w("session/prompt",{sessionId:p,prompt:[{type:"text",text:t}]})).result?.stopReason||"",_=!0,bt(`acp: result received (${h.length} chars, stopReason=${g})`),c.stdin?.end()}catch(v){dt(c).catch(()=>{}),s(v instanceof Error?v:new Error(String(v)))}})()}):Promise.reject(new Error(`No ACP config for tool "${e.tool}"`))}var A0,$0,hp,R0,j0,O0,L0,C0,gp=E(()=>{"use strict";Ne();en();No();tn();$o();Ne();ut();A0={gemini:{binary:"gemini",args:["--acp","-y","--skip-trust"]},copilot:{binary:"copilot",args:["--acp","--yolo"]},opencode:{binary:"opencode",args:["acp"]}},$0=1,hp="(?:png|jpe?g|webp|heic|pdf)",R0=new RegExp(`\\bSTANCE:\\s*\\S+_\\d{6,}\\.${hp}\\s*`,"gi"),j0=new RegExp(`^ACK:\\s*waiting for explicit lmctl task\\.\\d{6,}\\.${hp}\\s*`,"i"),O0=/^ACK:\s*waiting for explicit lmctl task[._]?\s*/i,L0=/^STANCE:\s+\S+\s*$/gim,C0=/\[Thought:\s*true\]\s*/gi});function ye(t,e=120){let r=t.replace(/\s+/g," ").trim();return r.length>e?r.slice(0,e-1)+"\u2026":r}function yp(t,e){return r=>{if(r.kind==="tool_use"&&typeof r.id=="string"){if(t.size>=P0){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 F0(){let t=new Map;return(e,r)=>{U0(e,yp(t,r))}}function U0(t,e){let r=t.type;if(r==="system"){let n=t.subtype;if(n==="api_retry"){let s=typeof t.attempt=="number"?t.attempt:void 0,o=typeof t.max_retries=="number"?t.max_retries:void 0,i=typeof t.error_status=="number"?t.error_status:void 0,a=typeof t.error=="string"?t.error:void 0,l=typeof t.retry_delay_ms=="number"?t.retry_delay_ms:void 0,c=[];s!==void 0&&c.push(o!==void 0?`attempt ${s}/${o}`:`attempt ${s}`),i!==void 0&&c.push(`HTTP ${i}`),l!==void 0&&c.push(`retry in ${Math.round(l/1e3)}s`),a&&c.push(ye(a,60));let u=c.length>0?c.join(", "):n;e({kind:"api_retry",summary:u});return}if(n==="api_error"){let s=typeof t.error_status=="number"?t.error_status:void 0,o=typeof t.error=="string"?t.error:void 0,i=["api_error"];s!==void 0&&i.push(`HTTP ${s}`),o&&i.push(ye(o,80)),e({kind:"other",summary:i.join(": "),raw:t});return}e({kind:"system",summary:n||"system",raw:t});return}if(r==="assistant"||r==="user"){let s=t.message?.content;if(!Array.isArray(s))return;for(let o of s){let i=o.type;if(i==="text"){let a=o.text||"";a&&e({kind:"text",summary:ye(a),raw:o})}else if(i==="tool_use"){let a=o.name||"tool",l=typeof o.id=="string"?o.id:void 0,c=o.input,u="";c&&(typeof c.command=="string"?u=c.command:typeof c.file_path=="string"?u=c.file_path:typeof c.path=="string"?u=c.path:typeof c.pattern=="string"?u=c.pattern:typeof c.url=="string"?u=c.url:u=ye(JSON.stringify(c))),e({kind:"tool_use",tool:a,summary:ye(u),id:l,raw:o})}else if(i==="thinking"){let a=o.thinking||"";e({kind:"thinking",summary:ye(a),raw:o})}else if(i==="tool_result"){let l=o.is_error===!0?"error":"ok",c=typeof o.tool_use_id=="string"?o.tool_use_id:void 0,u,d=o.content;if(typeof d=="string")u=`${d.split(`
1196
1195
  `).length} lines, ${d.length} chars`;else if(Array.isArray(d)){let f=d.map(m=>typeof m=="object"&&m&&"text"in m?m.text:"").filter(Boolean).join("");f&&(u=`${f.split(`
1197
- `).length} lines, ${f.length} chars`)}e({kind:"tool_result",status:l,summary:u,id:c,raw:o})}else i&&e({kind:"other",summary:i,raw:o})}return}if(r==="result"){e({kind:"system",summary:"result",raw:t});return}}async function Ro(t,e){let r=e.binary==="qwen"?"qwen":"claude",n=e.onProgress?F0():void 0,s=await sp(t,{sessionId:e.sessionId,cwd:e.cwd,env:e.env,tool:r,binaryPath:e.progPath,model:e.model,permissionMode:e.permissionMode,onText:e.onDelta,onEvent:n?o=>n(o,e.onProgress):void 0,signal:e.signal});return{text:s.result,sessionId:s.sessionId,durationMs:s.durationMs,numTurns:s.numTurns}}function W0(){let t=new Map;return(e,r)=>{B0(e,yp(t,r))}}function B0(t,e){if(t.method!=="session/update")return;let s=t.params?.update;if(!s)return;let o=s.sessionUpdate;if(o){if(o==="agent_message_chunk"){let a=s.content?.text||"";a&&e({kind:"text",summary:ye(a)});return}if(o==="agent_thought_chunk"){let a=s.content?.text||"";e({kind:"thinking",summary:ye(a)});return}if(o==="tool_call"){let i=s.title||s.kind||"tool",a=typeof s.toolCallId=="string"?s.toolCallId:void 0,l="",c=s.rawInput;c&&(typeof c.command=="string"?l=c.command:typeof c.file_path=="string"?l=c.file_path:typeof c.path=="string"?l=c.path:l=ye(JSON.stringify(c))),e({kind:"tool_use",tool:i,summary:ye(l),id:a});return}if(o==="tool_call_update"){let i=s.status||"",a=typeof s.toolCallId=="string"?s.toolCallId:void 0;if(i==="completed"||i==="failed")e({kind:"tool_result",summary:i,status:i==="failed"?"error":"ok",id:a});else if(i==="in_progress"){let l=s.content,c=typeof l=="string"?l:typeof l?.text=="string"?l.text:"",u=c?`running\u2026 ${ye(c,80)}`:"running\u2026";e({kind:"other",summary:u,id:a})}return}e({kind:"other",summary:o})}}async function rn(t,e){let r=e.acpTool||e.binary;e.model&&r==="copilot"&&ct({event:"model_ignored",provider:r,model:e.model,reason:"copilot --acp does not implement per-session model selection"});let n=e.onProgress?W0():void 0,s=await _p(t,{tool:r,sessionId:e.sessionId,cwd:e.cwd,env:e.env,binaryPath:e.progPath,model:e.model,effort:e.effort,alias:e.alias,permissionMode:e.permissionMode,onDelta:e.onDelta,onEvent:n?o=>n(o,e.onProgress):void 0,signal:e.signal});return{text:s.result,sessionId:s.sessionId,durationMs:s.durationMs,stopReason:s.stopReason}}function H0(t,e){let r=t.method;if(!r)return;let n=t.params;if(r==="turn/started"){e({kind:"system",summary:"turn started"});return}if(r==="turn/completed"){e({kind:"system",summary:"turn completed"});return}if(r==="error"){let s=n?.error,o=typeof s?.message=="string"?s.message:void 0,i=o&&o.length>0?o:"(no message)",a=n?.willRetry===!0;e(a?{kind:"api_retry",summary:`codex retry: ${ye(i,120)}`}:{kind:"other",summary:`codex error: ${ye(i,120)}`});return}if(r==="item/started"||r==="item/completed"){let s=n?.item;if(!s)return;let o=s.type,i=r==="item/started";switch(o){case"commandExecution":{let a=typeof s.id=="string"?s.id:void 0,l=s.command,c=Array.isArray(l)?l.join(" "):typeof l=="string"?l:"";if(i)e({kind:"tool_use",tool:"Bash",summary:ye(c||"(command)"),id:a});else{let u=s.exitCode,d=s.status||"",f=typeof s.durationMs=="number"?s.durationMs:void 0,m=typeof u=="number"?`exit ${u}`:d||"done",p=[];typeof u=="number"?p.push(`exit ${u}`):d&&p.push(d),typeof f=="number"&&p.push(`${Math.round(f/1e3)}s`),e({kind:"tool_result",summary:p.join(", ")||"done",status:m,elapsedMs:f,id:a})}return}case"fileChange":{let a=typeof s.id=="string"?s.id:void 0;if(i){let l=s.changes,c=Array.isArray(l)?l.map(u=>u.path||"").filter(Boolean).join(", "):"";e({kind:"tool_use",tool:"FileChange",summary:ye(c||"(edit)"),id:a})}else{let l=s.status||"done";e({kind:"tool_result",summary:l,status:l,id:a})}return}case"mcpToolCall":{let a=typeof s.id=="string"?s.id:void 0,l=s.server||"mcp",c=s.tool||"tool";if(i)e({kind:"tool_use",tool:`${l}/${c}`,summary:"",id:a});else{let u=s.status||"done";e({kind:"tool_result",summary:u,status:u,id:a})}return}case"webSearch":{let a=typeof s.id=="string"?s.id:void 0;e(i?{kind:"tool_use",tool:"WebSearch",summary:ye(s.query||""),id:a}:{kind:"tool_result",summary:"done",status:"done",id:a});return}case"reasoning":{i&&e({kind:"thinking",summary:""});return}case"agentMessage":case"userMessage":return;default:{o&&e({kind:i?"tool_use":"tool_result",tool:o,summary:""});return}}}if(r==="item/agentMessage/delta"){let s=n?.delta||"";if(s){let o=typeof n?._lmctlItemPhase=="string"?n._lmctlItemPhase:void 0;e(o==="commentary"?{kind:"thinking",summary:ye(s)}:{kind:"text",summary:ye(s)})}return}if(r==="item/reasoning/summaryTextDelta"||r==="item/reasoning/textDelta"){let s=n?.delta||"";s&&e({kind:"thinking",summary:ye(s)});return}if(r==="item/commandExecution/outputDelta"){let s=(typeof n?.delta=="string"?n.delta:"")||"";if(s){let o=s.split(`
1196
+ `).length} lines, ${f.length} chars`)}e({kind:"tool_result",status:l,summary:u,id:c,raw:o})}else i&&e({kind:"other",summary:i,raw:o})}return}if(r==="result"){e({kind:"system",summary:"result",raw:t});return}}async function Ro(t,e){let r=e.binary==="qwen"?"qwen":"claude",n=e.onProgress?F0():void 0,s=await sp(t,{sessionId:e.sessionId,cwd:e.cwd,env:e.env,tool:r,binaryPath:e.progPath,model:e.model,permissionMode:e.permissionMode,onText:e.onDelta,onEvent:n?o=>n(o,e.onProgress):void 0,signal:e.signal});return{text:s.result,sessionId:s.sessionId,durationMs:s.durationMs,numTurns:s.numTurns}}function W0(){let t=new Map;return(e,r)=>{B0(e,yp(t,r))}}function B0(t,e){if(t.method!=="session/update")return;let s=t.params?.update;if(!s)return;let o=s.sessionUpdate;if(o){if(o==="agent_message_chunk"){let a=s.content?.text||"";a&&e({kind:"text",summary:ye(a)});return}if(o==="agent_thought_chunk"){let a=s.content?.text||"";e({kind:"thinking",summary:ye(a)});return}if(o==="tool_call"){let i=s.title||s.kind||"tool",a=typeof s.toolCallId=="string"?s.toolCallId:void 0,l="",c=s.rawInput;c&&(typeof c.command=="string"?l=c.command:typeof c.file_path=="string"?l=c.file_path:typeof c.path=="string"?l=c.path:l=ye(JSON.stringify(c))),e({kind:"tool_use",tool:i,summary:ye(l),id:a});return}if(o==="tool_call_update"){let i=s.status||"",a=typeof s.toolCallId=="string"?s.toolCallId:void 0;if(i==="completed"||i==="failed")e({kind:"tool_result",summary:i,status:i==="failed"?"error":"ok",id:a});else if(i==="in_progress"){let l=s.content,c=typeof l=="string"?l:typeof l?.text=="string"?l.text:"",u=c?`running\u2026 ${ye(c,80)}`:"running\u2026";e({kind:"other",summary:u,id:a})}return}e({kind:"other",summary:o})}}async function rn(t,e){let r=e.acpTool||e.binary;e.model&&r==="copilot"&&Le({event:"model_ignored",provider:r,model:e.model,reason:"copilot --acp does not implement per-session model selection"});let n=e.onProgress?W0():void 0,s=await _p(t,{tool:r,sessionId:e.sessionId,cwd:e.cwd,env:e.env,binaryPath:e.progPath,model:e.model,effort:e.effort,alias:e.alias,permissionMode:e.permissionMode,onDelta:e.onDelta,onEvent:n?o=>n(o,e.onProgress):void 0,signal:e.signal});return{text:s.result,sessionId:s.sessionId,durationMs:s.durationMs,stopReason:s.stopReason}}function H0(t,e){let r=t.method;if(!r)return;let n=t.params;if(r==="turn/started"){e({kind:"system",summary:"turn started"});return}if(r==="turn/completed"){e({kind:"system",summary:"turn completed"});return}if(r==="error"){let s=n?.error,o=typeof s?.message=="string"?s.message:void 0,i=o&&o.length>0?o:"(no message)",a=n?.willRetry===!0;e(a?{kind:"api_retry",summary:`codex retry: ${ye(i,120)}`}:{kind:"other",summary:`codex error: ${ye(i,120)}`});return}if(r==="item/started"||r==="item/completed"){let s=n?.item;if(!s)return;let o=s.type,i=r==="item/started";switch(o){case"commandExecution":{let a=typeof s.id=="string"?s.id:void 0,l=s.command,c=Array.isArray(l)?l.join(" "):typeof l=="string"?l:"";if(i)e({kind:"tool_use",tool:"Bash",summary:ye(c||"(command)"),id:a});else{let u=s.exitCode,d=s.status||"",f=typeof s.durationMs=="number"?s.durationMs:void 0,m=typeof u=="number"?`exit ${u}`:d||"done",p=[];typeof u=="number"?p.push(`exit ${u}`):d&&p.push(d),typeof f=="number"&&p.push(`${Math.round(f/1e3)}s`),e({kind:"tool_result",summary:p.join(", ")||"done",status:m,elapsedMs:f,id:a})}return}case"fileChange":{let a=typeof s.id=="string"?s.id:void 0;if(i){let l=s.changes,c=Array.isArray(l)?l.map(u=>u.path||"").filter(Boolean).join(", "):"";e({kind:"tool_use",tool:"FileChange",summary:ye(c||"(edit)"),id:a})}else{let l=s.status||"done";e({kind:"tool_result",summary:l,status:l,id:a})}return}case"mcpToolCall":{let a=typeof s.id=="string"?s.id:void 0,l=s.server||"mcp",c=s.tool||"tool";if(i)e({kind:"tool_use",tool:`${l}/${c}`,summary:"",id:a});else{let u=s.status||"done";e({kind:"tool_result",summary:u,status:u,id:a})}return}case"webSearch":{let a=typeof s.id=="string"?s.id:void 0;e(i?{kind:"tool_use",tool:"WebSearch",summary:ye(s.query||""),id:a}:{kind:"tool_result",summary:"done",status:"done",id:a});return}case"reasoning":{i&&e({kind:"thinking",summary:""});return}case"agentMessage":case"userMessage":return;default:{o&&e({kind:i?"tool_use":"tool_result",tool:o,summary:""});return}}}if(r==="item/agentMessage/delta"){let s=n?.delta||"";if(s){let o=typeof n?._lmctlItemPhase=="string"?n._lmctlItemPhase:void 0;e(o==="commentary"?{kind:"thinking",summary:ye(s)}:{kind:"text",summary:ye(s)})}return}if(r==="item/reasoning/summaryTextDelta"||r==="item/reasoning/textDelta"){let s=n?.delta||"";s&&e({kind:"thinking",summary:ye(s)});return}if(r==="item/commandExecution/outputDelta"){let s=(typeof n?.delta=="string"?n.delta:"")||"";if(s){let o=s.split(`
1198
1197
  `).filter(l=>l.length>0),i=o[o.length-1]||"",a=o.length>1?`${o.length} lines: ${ye(i,60)}`:ye(s,80);e({kind:"other",summary:`running\u2026 ${a}`})}else e({kind:"other",summary:"running\u2026"});return}if(r==="item/commandExecution/terminalInteraction"||r==="item/commandExecution/outputChunk"||r==="item/commandExecution/output"){let s=(typeof n?.stdin=="string"?n.stdin:"")||(typeof n?.delta=="string"?n.delta:"")||(typeof n?.output=="string"?n.output:"")||(typeof n?.text=="string"?n.text:"")||(typeof n?.content=="string"?n.content:"")||(typeof n?.chunk=="string"?n.chunk:"")||"";if(s){let o=s.split(`
1199
1198
  `).filter(l=>l.length>0),i=o[o.length-1]||"",a=o.length>1?`${o.length} lines: ${ye(i,60)}`:ye(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 wp(t,e){let r=await ap(t,{threadId:e.sessionId,cwd:e.cwd,env:e.env,binaryPath:e.progPath,model:e.model,alias:e.alias,isLead:e.isLead,permissionMode:e.permissionMode,onDelta:e.onDelta,onEvent:e.onProgress?n=>H0(n,e.onProgress):void 0,signal:e.signal});return{text:r.result,sessionId:r.threadId,durationMs:r.durationMs}}var P0,Ar=E(()=>{"use strict";op();lp();gp();Ne();P0=256});function Jl(t){return new ql(t)}var ql,Xl=E(()=>{"use strict";Km();Bt();Ar();kt();ql=class extends Re{constructor(e){super({provider:new bo(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:Ro})}}});import{readdir as q0,stat as Ep,unlink as J0}from"node:fs/promises";import{join as is,basename as X0}from"node:path";function G0(t,e,r){return`${t}|${e.toISOString()}|${r}`}function as(t,e,r){let n=G0(r.role,r.timestamp,r.content);e.has(n)||(e.add(n),t.push(r))}function Tp(t,e){return e==="exec"||t==="codex_exec"?"codex exec":"codex"}function V0(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 jo(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 jo(r)}).filter(r=>r.length>0).join(`
1200
- `);try{return JSON.stringify(t)}catch{return String(t)}}async function bp(t){let e=0,r=0,n=0,s=0,o=0,i,a;for await(let l of We(t)){if(l.type==="response_item"&&l.payload){let c=l.payload;if(c.type==="message"&&c.role==="user"&&c.content)for(let u of c.content)u.type==="input_text"&&typeof u.text=="string"&&u.text&&e++;else if(c.type==="message"&&c.role==="assistant"&&c.content)for(let u of c.content)u.type==="output_text"&&typeof u.text=="string"&&u.text&&e++}if(l.payload&&typeof l.payload.model_context_window=="number"&&(a=l.payload.model_context_window),l.type==="event_msg"&&l.payload?.type==="token_count"&&l.payload.info?.total_token_usage){let c=l.payload.info.total_token_usage;r=c.input_tokens??r,n=c.cached_input_tokens??c.cache_read_input_tokens??n,s=c.output_tokens??s,o=c.reasoning_output_tokens??o;let u=V0(l.payload.info.last_token_usage);u&&(i=u),typeof l.payload.info.model_context_window=="number"&&(a=l.payload.info.model_context_window)}}return{messageCount:e,totalInputTokens:r,totalCachedInputTokens:n,totalOutputTokens:s,totalReasoningOutputTokens:o,lastTokenUsage:i,modelContextWindow:a}}var Oo,Sp=E(()=>{"use strict";sr();Oo=class{name="codex";codexDirs;constructor(e={}){let r=[is(ke,".codex"),is(ke,".code")];if(e.codexDirs&&e.codexDirs.length>0){this.codexDirs=[...new Set(e.codexDirs)];return}let n=[e.codexDir||r[0],e.codeDir||r[1]];this.codexDirs=[...new Set(n)]}getWatchPaths(){return this.codexDirs.map(e=>({directory:is(e,"sessions"),filePattern:/\.jsonl$/}))}async getSessionsDirs(){let e=[];for(let r of this.codexDirs){let n=is(r,"sessions");try{await Ep(n),e.push(n)}catch{}}return e}async discoverSessions(){let e=[],r=await this.getSessionsDirs();for(let n of r){let s=await this.findSessionFiles(n);for(let o of s)try{let i=await this.extractSummary(o);i&&e.push(i)}catch{}}return e}async findSessionFiles(e){let r=[],n;try{n=await q0(e)}catch{return r}for(let s of n){let o=is(e,s),i=await Ep(o).catch(()=>null);if(i)if(i.isDirectory()){let a=await this.findSessionFiles(o);r.push(...a)}else s.endsWith(".jsonl")&&r.push(o)}return r}extractSessionIdFromFilename(e){let r=X0(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 Le(e,30),n=await $e(e),s=this.extractSessionIdFromFilename(e),o="",i,a,l,c,u,d,f;for(let p of r){if(p.type==="session_meta"&&p.payload&&(p.payload.id&&(s=p.payload.id),p.payload.cwd&&(o=p.payload.cwd),p.payload.cli_version&&(i=p.payload.cli_version),p.payload.timestamp&&(l=new Date(p.payload.timestamp)),p.payload.originator&&(d=p.payload.originator),p.payload.source&&(f=p.payload.source)),p.type==="turn_context"&&p.payload&&(p.payload.model&&(a=p.payload.model),!o&&p.payload.cwd&&(o=p.payload.cwd)),p.type==="event_msg"&&p.payload?.type==="user_message"){let _=p.payload.message||p.payload.text;_&&(c||(c=V(_.trim(),80)),u=V(_.trim(),80))}if(p.type==="response_item"&&p.payload?.type==="message"&&p.payload.role==="user"&&p.payload.content){let _=p.payload.content.find(g=>g.type==="input_text"&&typeof g.text=="string"&&g.text);typeof _?.text=="string"&&(c||(c=V(_.text.trim(),80)),u=V(_.text.trim(),80))}}if(!o)return null;let m=await bp(e);return{provider:"codex",sessionId:s,cwd:o,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:i,startCommand:Tp(d,f),firstUserMessage:c,lastUserMessage:u,messageCount:m.messageCount,filePath:e,totalInputTokens:m.totalInputTokens||void 0,totalCachedInputTokens:m.totalCachedInputTokens||void 0,totalOutputTokens:m.totalOutputTokens||void 0,totalReasoningOutputTokens:m.totalReasoningOutputTokens||void 0,lastInputTokens:m.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:m.lastTokenUsage,modelContextWindow:m.modelContextWindow}}async loadSession(e){let r=await this.resolveSessionFile(e);if(!r)return null;let n=await $e(r),s=[],o="",i,a,l,c,u,d=e,f,m=new Set;for await(let _ of We(r)){let g=_.timestamp?new Date(_.timestamp):new Date;if(_.type==="session_meta"&&_.payload){_.payload.id&&(d=_.payload.id),_.payload.cwd&&(o=_.payload.cwd),_.payload.cli_version&&(i=_.payload.cli_version),_.payload.timestamp&&(l=new Date(_.payload.timestamp)),f=Tp(_.payload.originator,_.payload.source);continue}if(_.type==="turn_context"&&_.payload){_.payload.model&&(a=_.payload.model),!o&&_.payload.cwd&&(o=_.payload.cwd);continue}if(_.type==="response_item"&&_.payload){let h=_.payload;if(h.type==="message"){if(h.role==="user"&&h.content){for(let b of h.content)if(b.type==="input_text"&&typeof b.text=="string"&&b.text){let w=b.text.trim();c||(c=V(w,80)),u=V(w,80),as(s,m,{role:"user",timestamp:g,content:de(w)})}continue}if(h.role==="assistant"&&h.content){for(let b of h.content)b.type==="output_text"&&typeof b.text=="string"&&b.text&&as(s,m,{role:"assistant",timestamp:g,content:de(b.text),model:a});continue}if(h.role!=="user"&&h.role!=="assistant"&&h.content){for(let b of h.content)(b.type==="input_text"||b.type==="output_text")&&typeof b.text=="string"&&b.text&&as(s,m,{role:"system",timestamp:g,content:de(b.text.trim())});continue}}if(h.type==="function_call"){s.push({role:"tool_use",timestamp:g,content:h.name||"unknown tool",toolName:h.name,toolInput:h.arguments!==void 0?de(jo(h.arguments)):void 0,toolCallId:h.call_id});continue}if(h.type==="function_call_output"){s.push({role:"tool_result",timestamp:g,content:de(jo(h.output)),toolCallId:h.call_id});continue}if(h.type==="reasoning"&&h.summary){let b=h.summary.map(w=>jo(w.text)).join(`
1201
- `);b.trim()&&as(s,m,{role:"thinking",timestamp:g,content:de(b)});continue}}if(_.type==="event_msg"&&_.payload&&_.payload.type==="agent_reasoning"){let h=_.payload.message||_.payload.text;h&&as(s,m,{role:"thinking",timestamp:g,content:de(h)})}}if(!o)return null;let p=await bp(r);return{provider:"codex",sessionId:d,cwd:o,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:i,startCommand:f,firstUserMessage:c,lastUserMessage:u,messageCount:p.messageCount,filePath:r,totalInputTokens:p.totalInputTokens||void 0,totalCachedInputTokens:p.totalCachedInputTokens||void 0,totalOutputTokens:p.totalOutputTokens||void 0,totalReasoningOutputTokens:p.totalReasoningOutputTokens||void 0,lastInputTokens:p.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:p.lastTokenUsage,modelContextWindow:p.modelContextWindow,messages:s}}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await J0(r),!0):!1}async resolveSessionFile(e){let r=await this.getSessionsDirs(),n=[];for(let o of r){let i=await this.findSessionFiles(o);n.push(...i)}for(let o of n)if(this.extractSessionIdFromFilename(o)===e)return o;let s=[];for(let o of n)this.extractSessionIdFromFilename(o).startsWith(e)&&s.push(o);if(s.length===1)return s[0];for(let o of n){let i=await Le(o,1);if(i.length>0&&i[0].type==="session_meta"){let a=i[0].payload?.id;if(a===e||a&&a.startsWith(e))return o}}return null}}});function Vl(t){return new Gl(t)}var Gl,Kl=E(()=>{"use strict";Sp();Bt();Ar();kt();Gl=class extends Re{constructor(e){super({provider:new Oo(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}
1199
+ `);try{return JSON.stringify(t)}catch{return String(t)}}async function bp(t){let e=0,r=0,n=0,s=0,o=0,i,a;for await(let l of Be(t)){if(l.type==="response_item"&&l.payload){let c=l.payload;if(c.type==="message"&&c.role==="user"&&c.content)for(let u of c.content)u.type==="input_text"&&typeof u.text=="string"&&u.text&&e++;else if(c.type==="message"&&c.role==="assistant"&&c.content)for(let u of c.content)u.type==="output_text"&&typeof u.text=="string"&&u.text&&e++}if(l.payload&&typeof l.payload.model_context_window=="number"&&(a=l.payload.model_context_window),l.type==="event_msg"&&l.payload?.type==="token_count"&&l.payload.info?.total_token_usage){let c=l.payload.info.total_token_usage;r=c.input_tokens??r,n=c.cached_input_tokens??c.cache_read_input_tokens??n,s=c.output_tokens??s,o=c.reasoning_output_tokens??o;let u=V0(l.payload.info.last_token_usage);u&&(i=u),typeof l.payload.info.model_context_window=="number"&&(a=l.payload.info.model_context_window)}}return{messageCount:e,totalInputTokens:r,totalCachedInputTokens:n,totalOutputTokens:s,totalReasoningOutputTokens:o,lastTokenUsage:i,modelContextWindow:a}}var Oo,Sp=E(()=>{"use strict";sr();Oo=class{name="codex";codexDirs;constructor(e={}){let r=[is(ke,".codex"),is(ke,".code")];if(e.codexDirs&&e.codexDirs.length>0){this.codexDirs=[...new Set(e.codexDirs)];return}let n=[e.codexDir||r[0],e.codeDir||r[1]];this.codexDirs=[...new Set(n)]}getWatchPaths(){return this.codexDirs.map(e=>({directory:is(e,"sessions"),filePattern:/\.jsonl$/}))}async getSessionsDirs(){let e=[];for(let r of this.codexDirs){let n=is(r,"sessions");try{await Ep(n),e.push(n)}catch{}}return e}async discoverSessions(){let e=[],r=await this.getSessionsDirs();for(let n of r){let s=await this.findSessionFiles(n);for(let o of s)try{let i=await this.extractSummary(o);i&&e.push(i)}catch{}}return e}async findSessionFiles(e){let r=[],n;try{n=await q0(e)}catch{return r}for(let s of n){let o=is(e,s),i=await Ep(o).catch(()=>null);if(i)if(i.isDirectory()){let a=await this.findSessionFiles(o);r.push(...a)}else s.endsWith(".jsonl")&&r.push(o)}return r}extractSessionIdFromFilename(e){let r=X0(e,".jsonl"),n=r.match(/rollout-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}-(.+)$/);return n?n[1]:r}async extractSummary(e){let r=await Ce(e,30),n=await $e(e),s=this.extractSessionIdFromFilename(e),o="",i,a,l,c,u,d,f;for(let p of r){if(p.type==="session_meta"&&p.payload&&(p.payload.id&&(s=p.payload.id),p.payload.cwd&&(o=p.payload.cwd),p.payload.cli_version&&(i=p.payload.cli_version),p.payload.timestamp&&(l=new Date(p.payload.timestamp)),p.payload.originator&&(d=p.payload.originator),p.payload.source&&(f=p.payload.source)),p.type==="turn_context"&&p.payload&&(p.payload.model&&(a=p.payload.model),!o&&p.payload.cwd&&(o=p.payload.cwd)),p.type==="event_msg"&&p.payload?.type==="user_message"){let h=p.payload.message||p.payload.text;h&&(c||(c=V(h.trim(),80)),u=V(h.trim(),80))}if(p.type==="response_item"&&p.payload?.type==="message"&&p.payload.role==="user"&&p.payload.content){let h=p.payload.content.find(g=>g.type==="input_text"&&typeof g.text=="string"&&g.text);typeof h?.text=="string"&&(c||(c=V(h.text.trim(),80)),u=V(h.text.trim(),80))}}if(!o)return null;let m=await bp(e);return{provider:"codex",sessionId:s,cwd:o,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:i,startCommand:Tp(d,f),firstUserMessage:c,lastUserMessage:u,messageCount:m.messageCount,filePath:e,totalInputTokens:m.totalInputTokens||void 0,totalCachedInputTokens:m.totalCachedInputTokens||void 0,totalOutputTokens:m.totalOutputTokens||void 0,totalReasoningOutputTokens:m.totalReasoningOutputTokens||void 0,lastInputTokens:m.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:m.lastTokenUsage,modelContextWindow:m.modelContextWindow}}async loadSession(e){let r=await this.resolveSessionFile(e);if(!r)return null;let n=await $e(r),s=[],o="",i,a,l,c,u,d=e,f,m=new Set;for await(let h of Be(r)){let g=h.timestamp?new Date(h.timestamp):new Date;if(h.type==="session_meta"&&h.payload){h.payload.id&&(d=h.payload.id),h.payload.cwd&&(o=h.payload.cwd),h.payload.cli_version&&(i=h.payload.cli_version),h.payload.timestamp&&(l=new Date(h.payload.timestamp)),f=Tp(h.payload.originator,h.payload.source);continue}if(h.type==="turn_context"&&h.payload){h.payload.model&&(a=h.payload.model),!o&&h.payload.cwd&&(o=h.payload.cwd);continue}if(h.type==="response_item"&&h.payload){let _=h.payload;if(_.type==="message"){if(_.role==="user"&&_.content){for(let b of _.content)if(b.type==="input_text"&&typeof b.text=="string"&&b.text){let w=b.text.trim();c||(c=V(w,80)),u=V(w,80),as(s,m,{role:"user",timestamp:g,content:de(w)})}continue}if(_.role==="assistant"&&_.content){for(let b of _.content)b.type==="output_text"&&typeof b.text=="string"&&b.text&&as(s,m,{role:"assistant",timestamp:g,content:de(b.text),model:a});continue}if(_.role!=="user"&&_.role!=="assistant"&&_.content){for(let b of _.content)(b.type==="input_text"||b.type==="output_text")&&typeof b.text=="string"&&b.text&&as(s,m,{role:"system",timestamp:g,content:de(b.text.trim())});continue}}if(_.type==="function_call"){s.push({role:"tool_use",timestamp:g,content:_.name||"unknown tool",toolName:_.name,toolInput:_.arguments!==void 0?de(jo(_.arguments)):void 0,toolCallId:_.call_id});continue}if(_.type==="function_call_output"){s.push({role:"tool_result",timestamp:g,content:de(jo(_.output)),toolCallId:_.call_id});continue}if(_.type==="reasoning"&&_.summary){let b=_.summary.map(w=>jo(w.text)).join(`
1200
+ `);b.trim()&&as(s,m,{role:"thinking",timestamp:g,content:de(b)});continue}}if(h.type==="event_msg"&&h.payload&&h.payload.type==="agent_reasoning"){let _=h.payload.message||h.payload.text;_&&as(s,m,{role:"thinking",timestamp:g,content:de(_)})}}if(!o)return null;let p=await bp(r);return{provider:"codex",sessionId:d,cwd:o,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:i,startCommand:f,firstUserMessage:c,lastUserMessage:u,messageCount:p.messageCount,filePath:r,totalInputTokens:p.totalInputTokens||void 0,totalCachedInputTokens:p.totalCachedInputTokens||void 0,totalOutputTokens:p.totalOutputTokens||void 0,totalReasoningOutputTokens:p.totalReasoningOutputTokens||void 0,lastInputTokens:p.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:p.lastTokenUsage,modelContextWindow:p.modelContextWindow,messages:s}}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await J0(r),!0):!1}async resolveSessionFile(e){let r=await this.getSessionsDirs(),n=[];for(let o of r){let i=await this.findSessionFiles(o);n.push(...i)}for(let o of n)if(this.extractSessionIdFromFilename(o)===e)return o;let s=[];for(let o of n)this.extractSessionIdFromFilename(o).startsWith(e)&&s.push(o);if(s.length===1)return s[0];for(let o of n){let i=await Ce(o,1);if(i.length>0&&i[0].type==="session_meta"){let a=i[0].payload?.id;if(a===e||a&&a.startsWith(e))return o}}return null}}});function Vl(t){return new Gl(t)}var Gl,Kl=E(()=>{"use strict";Sp();Bt();Ar();kt();Gl=class extends Re{constructor(e){super({provider:new Oo(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}
1202
1201
  `,resumeTemplate:"codex resume {{session_id}}",startTemplate:"codex",transport:wp})}seedArgsFor(e){let r=super.seedArgsFor(e);return e?.model?[...r.slice(0,-1),"--model",e.model,r[r.length-1]]:r}}});function ls(t){if(!t.trim())return"unknown";let e=t.split(/\r?\n/).filter(n=>n.trim().length>0);if(e.length>1)try{let n=JSON.parse(e[0]);if(n!==null&&typeof n=="object"&&!Array.isArray(n)&&"kind"in n)return"jsonl"}catch{}let r;try{r=JSON.parse(t)}catch{return"unknown"}if(r!==null&&typeof r=="object"&&!Array.isArray(r)){let n=r;if(Array.isArray(n.messages))return"json";if("kind"in n)return"jsonl"}return"unknown"}function Lo(t){let e=ls(t);if(e==="unknown")throw new Error("gemini session content matches neither known format (old .json with messages[] or new .jsonl with kind metadata)");if(e==="json"){let a=JSON.parse(t);return{sessionId:a.sessionId,projectHash:a.projectHash,startTime:a.startTime,lastUpdated:a.lastUpdated,kind:a.kind,messages:Array.isArray(a.messages)?a.messages:[]}}let r=t.split(`
1203
1202
  `).map(a=>a).filter(a=>a.trim().length>0);if(r.length===0)throw new Error("gemini session file is empty");let n=r[0],s;try{s=JSON.parse(n)}catch(a){throw new Error(`gemini JSONL session: metadata line failed to parse: ${a instanceof Error?a.message:String(a)}`)}if(s===null||typeof s!="object")throw new Error("gemini JSONL session: metadata line is not an object");let o=[],i=new Map;for(let a=1;a<r.length;a++){let l;try{l=JSON.parse(r[a])}catch{continue}if(l===null||typeof l!="object")continue;let c=l;if("$set"in c&&c.$set&&typeof c.$set=="object"){Object.assign(s,c.$set);continue}if(typeof c.id=="string"||typeof c.type=="string"){let u=c;if(typeof u.id=="string"){let d=i.get(u.id);d?K0(d,u):(o.push(u),i.set(u.id,u))}else o.push(u)}}return{sessionId:typeof s.sessionId=="string"?s.sessionId:void 0,projectHash:typeof s.projectHash=="string"?s.projectHash:void 0,startTime:typeof s.startTime=="string"?s.startTime:void 0,lastUpdated:typeof s.lastUpdated=="string"?s.lastUpdated:void 0,kind:typeof s.kind=="string"?s.kind:void 0,messages:o}}function K0(t,e){for(let[r,n]of Object.entries(e))if(n!==void 0){if(r==="tokens"&&kp(t.tokens)&&kp(n)){t.tokens={...t.tokens,...n};continue}t[r]=n}}function kp(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function vp(t,e){if(e==="json")return JSON.stringify(t,null,2);let{messages:r,...n}=t,s=[JSON.stringify(n)];for(let o of r)s.push(JSON.stringify(o));return s.join(`
1204
1203
  `)+`
1205
- `}var Yl=E(()=>{"use strict"});import{createHash as Y0}from"node:crypto";import{readdir as cs,readFile as Ip,stat as Co,unlink as z0}from"node:fs/promises";import{join as Ve,basename as Z0,dirname as Q0}from"node:path";import{cwd as eN}from"node:process";function Np(t){return t?typeof t=="string"?t:Array.isArray(t)?t.map(e=>e.text||"").join(""):"":""}function xp(t){return t==="user"}function zl(t){return t==="gemini"||t==="assistant"}function $r(t,e=new Date(0)){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function tN(t){return`${t.sessionId}\0${t.cwd}`}function rN(t,e){let r=t.filePaths??[t.filePath],n=e.filePaths??[e.filePath],s=[...new Set([...r,...n])],o=e.modifiedAt.getTime()>=t.modifiedAt.getTime()?e:t;return{...o,createdAt:t.createdAt.getTime()<=e.createdAt.getTime()?t.createdAt:e.createdAt,modifiedAt:o.modifiedAt,filePath:o.filePath,filePaths:s}}function Mo(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}function Ap(t){let e=0,r=0,n=0,s=0,o=0,i;for(let a of t){if(!zl(a.type)||!a.tokens)continue;let l=Mo(a.tokens.input),c=Mo(a.tokens.cached),u=Math.max(l-c,0),d=Mo(a.tokens.output),f=Mo(a.tokens.thoughts);e+=l,r+=c,n+=d,s+=f,o=l,i={inputTokens:u,cachedInputTokens:c,cacheWriteInputTokens:0,outputTokens:d,reasoningOutputTokens:f,totalTokens:l+d+f}}return{totalInputTokens:e,totalCachedInputTokens:r,totalOutputTokens:n,totalReasoningOutputTokens:s,lastInputTokens:o,lastTokenUsage:i}}function nN(t){return Y0("sha256").update(t).digest("hex")}function us(t,e){let r=e;for(;r&&!t.has(r);){t.add(r);let n=Q0(r);if(n===r)break;r=n}}var Do,$p=E(()=>{"use strict";sr();Yl();Ne();Do=class{name="gemini";workspaceHashMap;geminiProjectsFile;geminiTmpDir;claudeProjectsDir;codexSessionDirs;extraWorkspacePaths;constructor(e={}){let r=e.geminiDir||Ve(ke,".gemini");this.geminiProjectsFile=Ve(r,"projects.json"),this.geminiTmpDir=Ve(r,"tmp");let n=e.claudeDir||Ve(ke,".claude");this.claudeProjectsDir=Ve(n,"projects");let s=[Ve(ke,".codex"),Ve(ke,".code")],o=e.codexDirs&&e.codexDirs.length>0?e.codexDirs:[e.codexDir||s[0],e.codeDir||s[1]];this.codexSessionDirs=[...new Set(o)].map(i=>Ve(i,"sessions")),this.extraWorkspacePaths=e.extraWorkspacePaths||[]}getWatchPaths(){return[{directory:this.geminiTmpDir,filePattern:/\.jsonl?$/}]}async discoverSessions(){let e=await this.findSessionFiles(),r=new Map;for(let n of e)try{let s=await this.extractSummary(n);if(!s)continue;let o=tN(s),i=r.get(o);r.set(o,i?rN(i,s):s)}catch{}return[...r.values()]}async loadSession(e){let r=await this.resolveSessionFile(e);if(!r)return null;let n;try{n=await this.readSessionFile(r)}catch{return null}if(!n)return null;let s=await $e(r),o=[],i=n.messages||[],a=n.sessionId||this.extractSessionIdFromFilename(r),l=n.projectHash||"",c=await this.resolveWorkspace(l),u,d,f;for(let g of i){let h=$r(g.timestamp),b=g.type,w=de(Np(g.content));if(xp(b)){let N=w.trim();N&&(u||(u=V(N,80)),d=V(N,80)),o.push({role:"user",timestamp:h,content:N||w});continue}if(zl(b)){g.model&&(f=g.model);for(let N of g.thoughts||[]){let v=[N.subject,N.description].filter(Boolean).join(`
1206
- `).trim();v&&o.push({role:"thinking",timestamp:$r(N.timestamp,h),content:de(v)})}o.push({role:"assistant",timestamp:h,content:w,model:g.model});continue}let k=b?`[${b}] `:"";o.push({role:"system",timestamp:h,content:`${k}${w}`.trim()})}let m=$r(n.startTime,s.createdAt),p=$r(n.lastUpdated,s.modifiedAt),_=Ap(i);return{provider:"gemini",sessionId:a,cwd:c,createdAt:m,modifiedAt:p,model:f,startCommand:"gemini",firstUserMessage:u,lastUserMessage:d,messageCount:o.filter(g=>g.role==="user"||g.role==="assistant").length,filePath:r,totalInputTokens:_.totalInputTokens||void 0,totalCachedInputTokens:_.totalCachedInputTokens||void 0,totalOutputTokens:_.totalOutputTokens||void 0,totalReasoningOutputTokens:_.totalReasoningOutputTokens||void 0,lastInputTokens:_.lastInputTokens||void 0,lastTokenUsage:_.lastTokenUsage,messages:o}}async extractSummary(e){let r=await this.readSessionFile(e);if(!r)return null;let n=await $e(e),s=r.messages||[],o=r.sessionId||this.extractSessionIdFromFilename(e),i=r.projectHash||"",a=await this.resolveWorkspace(i),l,c,u,d=0;for(let m of s)if(xp(m.type)){d++;let p=Np(m.content).trim();p&&(l||(l=V(de(p),80)),c=V(de(p),80))}else zl(m.type)&&(d++,m.model&&(u=m.model));let f=Ap(s);return{provider:"gemini",sessionId:o,cwd:a,createdAt:$r(r.startTime,n.createdAt),modifiedAt:$r(r.lastUpdated,n.modifiedAt),model:u,startCommand:"gemini",firstUserMessage:l,lastUserMessage:c,messageCount:d,filePath:e,totalInputTokens:f.totalInputTokens||void 0,totalCachedInputTokens:f.totalCachedInputTokens||void 0,totalOutputTokens:f.totalOutputTokens||void 0,totalReasoningOutputTokens:f.totalReasoningOutputTokens||void 0,lastInputTokens:f.lastInputTokens||void 0,lastTokenUsage:f.lastTokenUsage}}async readSessionFile(e){let r=await Ip(e,"utf-8");if(ls(r)==="unknown")return z({event:"gemini_session_format_unknown",provider:"gemini",file:e,preview:r.slice(0,120),message:`gemini session file at ${e} matches neither old (.json with messages[]) nor new (.jsonl with kind metadata) format. Skipping; lmctl ls / audit / stats will not see this session.`}),null;try{return Lo(r)}catch{return null}}extractSessionIdFromFilename(e){let r=Z0(e).replace(/\.jsonl?$/,""),n=r.match(/session-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-(.+)$/);return n?n[1]:r}async findSessionFiles(){let e=[],r;try{r=await cs(this.geminiTmpDir)}catch{return e}for(let n of r){let s=Ve(this.geminiTmpDir,n,"chats");if(!(await Co(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await cs(s)}catch{continue}for(let a of i)a.startsWith("session-")&&(!a.endsWith(".json")&&!a.endsWith(".jsonl")||e.push(Ve(s,a)))}return e}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await z0(r),!0):!1}async resolveSessionFile(e){let r=await this.findSessionFiles(),n=[];for(let s of r){let o=await this.readSessionFile(s).catch(()=>null),i=this.extractSessionIdFromFilename(s),a=o?.sessionId||i,l=a===e||a.startsWith(e),c=i===e||i.startsWith(e)||i.length>=8&&e.startsWith(i);if(!l&&!c)continue;let u=await $e(s).catch(()=>({createdAt:new Date(0),modifiedAt:new Date(0)}));n.push({filePath:s,modifiedAt:$r(o?.lastUpdated,u.modifiedAt)})}return n.sort((s,o)=>{let i=o.modifiedAt.getTime()-s.modifiedAt.getTime();return i!==0?i:o.filePath.localeCompare(s.filePath)}),n[0]?.filePath??null}async resolveWorkspace(e){return e?(await this.getWorkspaceHashMap()).get(e)||`[hash:${e.slice(0,16)}]`:"(unknown workspace)"}async getWorkspaceHashMap(){if(this.workspaceHashMap)return this.workspaceHashMap;let e=new Set;us(e,eN());for(let n of this.extraWorkspacePaths)us(e,n);for(let n of await this.collectGeminiProjectPaths())us(e,n);for(let n of await this.collectCodexCwds())us(e,n);for(let n of await this.collectClaudeCwds())us(e,n);let r=new Map;for(let n of e)r.set(nN(n),n);return this.workspaceHashMap=r,r}async collectGeminiProjectPaths(){let e;try{e=await Ip(this.geminiProjectsFile,"utf-8")}catch{return[]}try{let n=JSON.parse(e).projects;return!n||typeof n!="object"||Array.isArray(n)?[]:Object.keys(n)}catch{return[]}}async collectCodexCwds(){let e=new Set;for(let r of this.codexSessionDirs){let n=await this.findJsonlFiles(r);for(let s of n){let i=(await Le(s,1).catch(()=>[]))[0]?.payload?.cwd;i&&e.add(i)}}return[...e]}async collectClaudeCwds(){let e=new Set,r;try{r=await cs(this.claudeProjectsDir)}catch{return[]}for(let n of r){let s=Ve(this.claudeProjectsDir,n);if(!(await Co(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await cs(s)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=Ve(s,a),u=(await Le(l,1).catch(()=>[]))[0]?.cwd;u&&e.add(u)}}return[...e]}async findJsonlFiles(e){let r=[];if(!(await Co(e).catch(()=>null))?.isDirectory())return r;let s;try{s=await cs(e)}catch{return r}for(let o of s){let i=Ve(e,o),a=await Co(i).catch(()=>null);if(a)if(a.isDirectory()){let l=await this.findJsonlFiles(i);r.push(...l)}else o.endsWith(".jsonl")&&r.push(i)}return r}}});import{readFileSync as sN,writeFileSync as oN,mkdirSync as iN}from"node:fs";import{join as aN,dirname as lN}from"node:path";import{randomUUID as cN}from"node:crypto";function Ql(t){return new Zl(t)}var Zl,ec=E(()=>{"use strict";$p();Bt();Ar();kt();Yl();Zl=class extends Re{constructor(e){super({provider:new Do(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)=>rn(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(`
1204
+ `}var Yl=E(()=>{"use strict"});import{createHash as Y0}from"node:crypto";import{readdir as cs,readFile as Ip,stat as Co,unlink as z0}from"node:fs/promises";import{join as Ke,basename as Z0,dirname as Q0}from"node:path";import{cwd as eN}from"node:process";function Np(t){return t?typeof t=="string"?t:Array.isArray(t)?t.map(e=>e.text||"").join(""):"":""}function xp(t){return t==="user"}function zl(t){return t==="gemini"||t==="assistant"}function $r(t,e=new Date(0)){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function tN(t){return`${t.sessionId}\0${t.cwd}`}function rN(t,e){let r=t.filePaths??[t.filePath],n=e.filePaths??[e.filePath],s=[...new Set([...r,...n])],o=e.modifiedAt.getTime()>=t.modifiedAt.getTime()?e:t;return{...o,createdAt:t.createdAt.getTime()<=e.createdAt.getTime()?t.createdAt:e.createdAt,modifiedAt:o.modifiedAt,filePath:o.filePath,filePaths:s}}function Mo(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}function Ap(t){let e=0,r=0,n=0,s=0,o=0,i;for(let a of t){if(!zl(a.type)||!a.tokens)continue;let l=Mo(a.tokens.input),c=Mo(a.tokens.cached),u=Math.max(l-c,0),d=Mo(a.tokens.output),f=Mo(a.tokens.thoughts);e+=l,r+=c,n+=d,s+=f,o=l,i={inputTokens:u,cachedInputTokens:c,cacheWriteInputTokens:0,outputTokens:d,reasoningOutputTokens:f,totalTokens:l+d+f}}return{totalInputTokens:e,totalCachedInputTokens:r,totalOutputTokens:n,totalReasoningOutputTokens:s,lastInputTokens:o,lastTokenUsage:i}}function nN(t){return Y0("sha256").update(t).digest("hex")}function us(t,e){let r=e;for(;r&&!t.has(r);){t.add(r);let n=Q0(r);if(n===r)break;r=n}}var Do,$p=E(()=>{"use strict";sr();Yl();Ne();Do=class{name="gemini";workspaceHashMap;geminiProjectsFile;geminiTmpDir;claudeProjectsDir;codexSessionDirs;extraWorkspacePaths;constructor(e={}){let r=e.geminiDir||Ke(ke,".gemini");this.geminiProjectsFile=Ke(r,"projects.json"),this.geminiTmpDir=Ke(r,"tmp");let n=e.claudeDir||Ke(ke,".claude");this.claudeProjectsDir=Ke(n,"projects");let s=[Ke(ke,".codex"),Ke(ke,".code")],o=e.codexDirs&&e.codexDirs.length>0?e.codexDirs:[e.codexDir||s[0],e.codeDir||s[1]];this.codexSessionDirs=[...new Set(o)].map(i=>Ke(i,"sessions")),this.extraWorkspacePaths=e.extraWorkspacePaths||[]}getWatchPaths(){return[{directory:this.geminiTmpDir,filePattern:/\.jsonl?$/}]}async discoverSessions(){let e=await this.findSessionFiles(),r=new Map;for(let n of e)try{let s=await this.extractSummary(n);if(!s)continue;let o=tN(s),i=r.get(o);r.set(o,i?rN(i,s):s)}catch{}return[...r.values()]}async loadSession(e){let r=await this.resolveSessionFile(e);if(!r)return null;let n;try{n=await this.readSessionFile(r)}catch{return null}if(!n)return null;let s=await $e(r),o=[],i=n.messages||[],a=n.sessionId||this.extractSessionIdFromFilename(r),l=n.projectHash||"",c=await this.resolveWorkspace(l),u,d,f;for(let g of i){let _=$r(g.timestamp),b=g.type,w=de(Np(g.content));if(xp(b)){let N=w.trim();N&&(u||(u=V(N,80)),d=V(N,80)),o.push({role:"user",timestamp:_,content:N||w});continue}if(zl(b)){g.model&&(f=g.model);for(let N of g.thoughts||[]){let v=[N.subject,N.description].filter(Boolean).join(`
1205
+ `).trim();v&&o.push({role:"thinking",timestamp:$r(N.timestamp,_),content:de(v)})}o.push({role:"assistant",timestamp:_,content:w,model:g.model});continue}let k=b?`[${b}] `:"";o.push({role:"system",timestamp:_,content:`${k}${w}`.trim()})}let m=$r(n.startTime,s.createdAt),p=$r(n.lastUpdated,s.modifiedAt),h=Ap(i);return{provider:"gemini",sessionId:a,cwd:c,createdAt:m,modifiedAt:p,model:f,startCommand:"gemini",firstUserMessage:u,lastUserMessage:d,messageCount:o.filter(g=>g.role==="user"||g.role==="assistant").length,filePath:r,totalInputTokens:h.totalInputTokens||void 0,totalCachedInputTokens:h.totalCachedInputTokens||void 0,totalOutputTokens:h.totalOutputTokens||void 0,totalReasoningOutputTokens:h.totalReasoningOutputTokens||void 0,lastInputTokens:h.lastInputTokens||void 0,lastTokenUsage:h.lastTokenUsage,messages:o}}async extractSummary(e){let r=await this.readSessionFile(e);if(!r)return null;let n=await $e(e),s=r.messages||[],o=r.sessionId||this.extractSessionIdFromFilename(e),i=r.projectHash||"",a=await this.resolveWorkspace(i),l,c,u,d=0;for(let m of s)if(xp(m.type)){d++;let p=Np(m.content).trim();p&&(l||(l=V(de(p),80)),c=V(de(p),80))}else zl(m.type)&&(d++,m.model&&(u=m.model));let f=Ap(s);return{provider:"gemini",sessionId:o,cwd:a,createdAt:$r(r.startTime,n.createdAt),modifiedAt:$r(r.lastUpdated,n.modifiedAt),model:u,startCommand:"gemini",firstUserMessage:l,lastUserMessage:c,messageCount:d,filePath:e,totalInputTokens:f.totalInputTokens||void 0,totalCachedInputTokens:f.totalCachedInputTokens||void 0,totalOutputTokens:f.totalOutputTokens||void 0,totalReasoningOutputTokens:f.totalReasoningOutputTokens||void 0,lastInputTokens:f.lastInputTokens||void 0,lastTokenUsage:f.lastTokenUsage}}async readSessionFile(e){let r=await Ip(e,"utf-8");if(ls(r)==="unknown")return z({event:"gemini_session_format_unknown",provider:"gemini",file:e,preview:r.slice(0,120),message:`gemini session file at ${e} matches neither old (.json with messages[]) nor new (.jsonl with kind metadata) format. Skipping; lmctl ls / audit / stats will not see this session.`}),null;try{return Lo(r)}catch{return null}}extractSessionIdFromFilename(e){let r=Z0(e).replace(/\.jsonl?$/,""),n=r.match(/session-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-(.+)$/);return n?n[1]:r}async findSessionFiles(){let e=[],r;try{r=await cs(this.geminiTmpDir)}catch{return e}for(let n of r){let s=Ke(this.geminiTmpDir,n,"chats");if(!(await Co(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await cs(s)}catch{continue}for(let a of i)a.startsWith("session-")&&(!a.endsWith(".json")&&!a.endsWith(".jsonl")||e.push(Ke(s,a)))}return e}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await z0(r),!0):!1}async resolveSessionFile(e){let r=await this.findSessionFiles(),n=[];for(let s of r){let o=await this.readSessionFile(s).catch(()=>null),i=this.extractSessionIdFromFilename(s),a=o?.sessionId||i,l=a===e||a.startsWith(e),c=i===e||i.startsWith(e)||i.length>=8&&e.startsWith(i);if(!l&&!c)continue;let u=await $e(s).catch(()=>({createdAt:new Date(0),modifiedAt:new Date(0)}));n.push({filePath:s,modifiedAt:$r(o?.lastUpdated,u.modifiedAt)})}return n.sort((s,o)=>{let i=o.modifiedAt.getTime()-s.modifiedAt.getTime();return i!==0?i:o.filePath.localeCompare(s.filePath)}),n[0]?.filePath??null}async resolveWorkspace(e){return e?(await this.getWorkspaceHashMap()).get(e)||`[hash:${e.slice(0,16)}]`:"(unknown workspace)"}async getWorkspaceHashMap(){if(this.workspaceHashMap)return this.workspaceHashMap;let e=new Set;us(e,eN());for(let n of this.extraWorkspacePaths)us(e,n);for(let n of await this.collectGeminiProjectPaths())us(e,n);for(let n of await this.collectCodexCwds())us(e,n);for(let n of await this.collectClaudeCwds())us(e,n);let r=new Map;for(let n of e)r.set(nN(n),n);return this.workspaceHashMap=r,r}async collectGeminiProjectPaths(){let e;try{e=await Ip(this.geminiProjectsFile,"utf-8")}catch{return[]}try{let n=JSON.parse(e).projects;return!n||typeof n!="object"||Array.isArray(n)?[]:Object.keys(n)}catch{return[]}}async collectCodexCwds(){let e=new Set;for(let r of this.codexSessionDirs){let n=await this.findJsonlFiles(r);for(let s of n){let i=(await Ce(s,1).catch(()=>[]))[0]?.payload?.cwd;i&&e.add(i)}}return[...e]}async collectClaudeCwds(){let e=new Set,r;try{r=await cs(this.claudeProjectsDir)}catch{return[]}for(let n of r){let s=Ke(this.claudeProjectsDir,n);if(!(await Co(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await cs(s)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=Ke(s,a),u=(await Ce(l,1).catch(()=>[]))[0]?.cwd;u&&e.add(u)}}return[...e]}async findJsonlFiles(e){let r=[];if(!(await Co(e).catch(()=>null))?.isDirectory())return r;let s;try{s=await cs(e)}catch{return r}for(let o of s){let i=Ke(e,o),a=await Co(i).catch(()=>null);if(a)if(a.isDirectory()){let l=await this.findJsonlFiles(i);r.push(...l)}else o.endsWith(".jsonl")&&r.push(i)}return r}}});import{readFileSync as sN,writeFileSync as oN,mkdirSync as iN}from"node:fs";import{join as aN,dirname as lN}from"node:path";import{randomUUID as cN}from"node:crypto";function Ql(t){return new Zl(t)}var Zl,ec=E(()=>{"use strict";$p();Bt();Ar();kt();Yl();Zl=class extends Re{constructor(e){super({provider:new Do(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)=>rn(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(`
1207
1206
  `)}manualSeedHint(e){return{launchCommand:`cd ${e} && gemini --skip-trust`,postLaunchNote:ko,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=sN(n,"utf-8"),o=ls(s),i=Lo(s),a=cN();i.sessionId=a,i.kind="main";let l=lN(n),c=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),u=o==="jsonl"?".jsonl":".json",d=`session-${c}-${a.slice(0,8)}${u}`,f=aN(l,d);return iN(l,{recursive:!0}),oN(f,vp(i,o),"utf-8"),{success:!0,sessionId:a,filePath:f}}catch(s){return{success:!1,error:s instanceof Error?s.message:String(s)}}}}});import{readdir as Rp,readFile as uN,rm as dN,stat as nn}from"node:fs/promises";import{basename as fN,join as mt}from"node:path";function mN(t){let e={};for(let r of t.split(`
1208
- `)){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 Rr(t){if(!t)return;let e=new Date(t);return Number.isNaN(e.getTime())?void 0:e}async function pN(t){let e=0;for await(let r of We(t))(r.type==="user.message"||r.type==="assistant.message"&&(r.data?.content||"").trim())&&e++;return e}var Po,jp=E(()=>{"use strict";sr();Po=class{name="copilot";sessionStateDir;constructor(e={}){let r=e.copilotDir||mt(ke,".copilot");this.sessionStateDir=mt(r,"session-state")}getWatchPaths(){return[{directory:this.sessionStateDir,filePattern:/events\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await Rp(this.sessionStateDir)}catch{return e}for(let n of r){let s=mt(this.sessionStateDir,n);if((await nn(s).catch(()=>null))?.isDirectory())try{let i=await this.extractSummary(s,n);i&&e.push(i)}catch{}}return e}async loadSession(e){let r=await this.resolveSessionDir(e);if(!r)return null;let n=await this.readWorkspaceYaml(r),s=mt(r,"events.jsonl"),o=await nn(s).catch(()=>null),i=o?s:mt(r,"workspace.yaml"),a=await $e(o?s:r),l=[],c=n?.cwd||"(unknown workspace)",u,d,f,m,p,_,g=n?.id||fN(r)||e;if(o)for await(let h of We(s)){let b=Rr(h.timestamp)||a.modifiedAt;if(h.type==="session.start"&&h.data){h.data.sessionId&&(g=h.data.sessionId),h.data.copilotVersion&&(d=h.data.copilotVersion),h.data.startTime&&(_=Rr(h.data.startTime)),h.data.selectedModel&&(u=h.data.selectedModel),h.data.context&&(h.data.context.cwd&&(c=h.data.context.cwd),h.data.context.branch&&(f=h.data.context.branch));continue}if(h.type==="session.model_change"&&h.data?.newModel){u=h.data.newModel;continue}if(h.type==="user.message"&&h.data){let w=h.data.content||"",k=w.trim();k&&(m||(m=V(k,80)),p=V(k,80)),l.push({role:"user",timestamp:b,content:de(k||w)});continue}if(h.type==="assistant.message"&&h.data){let w=(h.data.content||"").trim();if(w&&l.push({role:"assistant",timestamp:b,content:de(w),model:u}),h.data.toolRequests)for(let k of h.data.toolRequests)l.push({role:"tool_use",timestamp:b,content:k.name||"unknown tool",toolName:k.name,toolInput:k.arguments?JSON.stringify(k.arguments,null,2):void 0,toolCallId:k.toolCallId});continue}if(h.type==="tool.execution_complete"&&h.data){let w=h.data.result?.content||"",k=h.data.result?.detailedContent||"";l.push({role:"tool_result",timestamp:b,content:de(w),toolDetailedContent:k?de(k):void 0,toolCallId:h.data.toolCallId});continue}if(h.type==="assistant.reasoning"&&h.data?.content){l.push({role:"thinking",timestamp:b,content:de(h.data.content)});continue}if(h.type==="session.error"||h.type==="session.warning"||h.type==="session.info"||h.type==="system.message"){let w=h.data?.message||"";w.trim()&&l.push({role:"system",timestamp:b,content:de(w)});continue}}if(!m){let h=(n?.summary||"").trim();h&&(m=V(h,80))}return{provider:"copilot",sessionId:g,cwd:c,createdAt:_??Rr(n?.created_at)??a.createdAt,modifiedAt:Rr(n?.updated_at)??a.modifiedAt,model:u,cliVersion:d,startCommand:"copilot",gitBranch:f,firstUserMessage:m,lastUserMessage:p,messageCount:l.filter(h=>h.role==="user"||h.role==="assistant").length,filePath:i,messages:l}}async extractSummary(e,r){let n=await this.readWorkspaceYaml(e),s=mt(e,"events.jsonl"),o=await nn(s).catch(()=>null),i=o?s:mt(e,"workspace.yaml"),a=await $e(o?s:e),l=o?await Le(s,20):[],c=n?.id||r,u=n?.cwd||"(unknown workspace)",d,f,m,p,_;for(let h of l)if(h.type==="session.start"&&h.data&&(h.data.sessionId&&(c=h.data.sessionId),h.data.copilotVersion&&(f=h.data.copilotVersion),h.data.startTime&&(m=Rr(h.data.startTime)),h.data.selectedModel&&(d=h.data.selectedModel),h.data.context?.cwd&&(u=h.data.context.cwd)),h.type==="session.model_change"&&h.data?.newModel&&(d||(d=h.data.newModel)),h.type==="user.message"&&h.data){let b=(h.data.content||"").trim();b&&(p||(p=V(b,80)),_=V(b,80))}if(!p){let h=(n?.summary||"").trim();h&&(p=V(h,80))}let g=o?await pN(s):0;return{provider:"copilot",sessionId:c,cwd:u,createdAt:m??Rr(n?.created_at)??a.createdAt,modifiedAt:Rr(n?.updated_at)??a.modifiedAt,model:d,cliVersion:f,startCommand:"copilot",firstUserMessage:p,lastUserMessage:_,messageCount:g,filePath:i}}async readWorkspaceYaml(e){let r=mt(e,"workspace.yaml");try{let n=await uN(r,"utf-8");return mN(n)}catch{return null}}async resolveSessionPath(e){return this.resolveSessionDir(e)}async deleteSession(e){let r=await this.resolveSessionDir(e);return r?(await dN(r,{recursive:!0}),!0):!1}async resolveSessionDir(e){let r;try{r=await Rp(this.sessionStateDir)}catch{return null}if(r.includes(e)){let s=mt(this.sessionStateDir,e);if((await nn(s).catch(()=>null))?.isDirectory())return s}let n=[];for(let s of r)if(s.startsWith(e)){let o=mt(this.sessionStateDir,s);(await nn(o).catch(()=>null))?.isDirectory()&&n.push(o)}if(n.length===1)return n[0];for(let s of r){let o=mt(this.sessionStateDir,s);if(!(await nn(o).catch(()=>null))?.isDirectory())continue;let a=await this.readWorkspaceYaml(o);if(a&&(a.id===e||a.id?.startsWith(e)))return o}return null}}});function tc(t){return new Re({provider:new Po(t),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:(e,r)=>rn(e,{...r,acpTool:"copilot"})})}var rc=E(()=>{"use strict";jp();Bt();Ar();kt()});import{existsSync as Op,readdirSync as hN,statSync as Lp}from"node:fs";import{join as ar}from"node:path";import{createRequire as _N}from"node:module";function Cp(){return nc===null&&(nc=_N(import.meta.url)("node:sqlite").DatabaseSync),nc}function gN(){let t=process.env.XDG_DATA_HOME||ar(ke,".local","share"),e=process.env.XDG_CONFIG_HOME||ar(ke,".config");return[ar(t,"opencode","opencode.db"),ar(e,"opencode","opencode.db")]}function yN(){if(process.env.OPENCODE_DB)return[process.env.OPENCODE_DB];let t=process.env.XDG_DATA_HOME||ar(ke,".local","share"),e=ar(t,"lmplayer"),r=ar(e,"opencode-local.db"),n=[r];try{let s=hN(e).filter(o=>/^opencode.*\.db$/u.test(o)).map(o=>ar(e,o)).filter(o=>o!==r).sort((o,i)=>{try{return Lp(i).mtimeMs-Lp(o).mtimeMs}catch{return 0}});n.push(...s)}catch{}return n}function wN(t){return t==="lmplayer"?yN():gN()}var nc,sn,sc=E(()=>{"use strict";sr();nc=null;sn=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=wN(this.name)}existingDbPaths(){return this.dbPaths.filter(e=>Op(e))}openDb(e){return Op(e)?new(Cp())(e,{open:!0,readOnly:!0}):null}async discoverSessions(){let e=[];for(let r of this.existingDbPaths()){let n=this.openDb(r);if(n)try{let s=new Map,o=n.prepare("SELECT id, worktree, name FROM project").all();for(let a of o)s.set(a.id,a);let i=n.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
1207
+ `)){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 Rr(t){if(!t)return;let e=new Date(t);return Number.isNaN(e.getTime())?void 0:e}async function pN(t){let e=0;for await(let r of Be(t))(r.type==="user.message"||r.type==="assistant.message"&&(r.data?.content||"").trim())&&e++;return e}var Po,jp=E(()=>{"use strict";sr();Po=class{name="copilot";sessionStateDir;constructor(e={}){let r=e.copilotDir||mt(ke,".copilot");this.sessionStateDir=mt(r,"session-state")}getWatchPaths(){return[{directory:this.sessionStateDir,filePattern:/events\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await Rp(this.sessionStateDir)}catch{return e}for(let n of r){let s=mt(this.sessionStateDir,n);if((await nn(s).catch(()=>null))?.isDirectory())try{let i=await this.extractSummary(s,n);i&&e.push(i)}catch{}}return e}async loadSession(e){let r=await this.resolveSessionDir(e);if(!r)return null;let n=await this.readWorkspaceYaml(r),s=mt(r,"events.jsonl"),o=await nn(s).catch(()=>null),i=o?s:mt(r,"workspace.yaml"),a=await $e(o?s:r),l=[],c=n?.cwd||"(unknown workspace)",u,d,f,m,p,h,g=n?.id||fN(r)||e;if(o)for await(let _ of Be(s)){let b=Rr(_.timestamp)||a.modifiedAt;if(_.type==="session.start"&&_.data){_.data.sessionId&&(g=_.data.sessionId),_.data.copilotVersion&&(d=_.data.copilotVersion),_.data.startTime&&(h=Rr(_.data.startTime)),_.data.selectedModel&&(u=_.data.selectedModel),_.data.context&&(_.data.context.cwd&&(c=_.data.context.cwd),_.data.context.branch&&(f=_.data.context.branch));continue}if(_.type==="session.model_change"&&_.data?.newModel){u=_.data.newModel;continue}if(_.type==="user.message"&&_.data){let w=_.data.content||"",k=w.trim();k&&(m||(m=V(k,80)),p=V(k,80)),l.push({role:"user",timestamp:b,content:de(k||w)});continue}if(_.type==="assistant.message"&&_.data){let w=(_.data.content||"").trim();if(w&&l.push({role:"assistant",timestamp:b,content:de(w),model:u}),_.data.toolRequests)for(let k of _.data.toolRequests)l.push({role:"tool_use",timestamp:b,content:k.name||"unknown tool",toolName:k.name,toolInput:k.arguments?JSON.stringify(k.arguments,null,2):void 0,toolCallId:k.toolCallId});continue}if(_.type==="tool.execution_complete"&&_.data){let w=_.data.result?.content||"",k=_.data.result?.detailedContent||"";l.push({role:"tool_result",timestamp:b,content:de(w),toolDetailedContent:k?de(k):void 0,toolCallId:_.data.toolCallId});continue}if(_.type==="assistant.reasoning"&&_.data?.content){l.push({role:"thinking",timestamp:b,content:de(_.data.content)});continue}if(_.type==="session.error"||_.type==="session.warning"||_.type==="session.info"||_.type==="system.message"){let w=_.data?.message||"";w.trim()&&l.push({role:"system",timestamp:b,content:de(w)});continue}}if(!m){let _=(n?.summary||"").trim();_&&(m=V(_,80))}return{provider:"copilot",sessionId:g,cwd:c,createdAt:h??Rr(n?.created_at)??a.createdAt,modifiedAt:Rr(n?.updated_at)??a.modifiedAt,model:u,cliVersion:d,startCommand:"copilot",gitBranch:f,firstUserMessage:m,lastUserMessage:p,messageCount:l.filter(_=>_.role==="user"||_.role==="assistant").length,filePath:i,messages:l}}async extractSummary(e,r){let n=await this.readWorkspaceYaml(e),s=mt(e,"events.jsonl"),o=await nn(s).catch(()=>null),i=o?s:mt(e,"workspace.yaml"),a=await $e(o?s:e),l=o?await Ce(s,20):[],c=n?.id||r,u=n?.cwd||"(unknown workspace)",d,f,m,p,h;for(let _ of l)if(_.type==="session.start"&&_.data&&(_.data.sessionId&&(c=_.data.sessionId),_.data.copilotVersion&&(f=_.data.copilotVersion),_.data.startTime&&(m=Rr(_.data.startTime)),_.data.selectedModel&&(d=_.data.selectedModel),_.data.context?.cwd&&(u=_.data.context.cwd)),_.type==="session.model_change"&&_.data?.newModel&&(d||(d=_.data.newModel)),_.type==="user.message"&&_.data){let b=(_.data.content||"").trim();b&&(p||(p=V(b,80)),h=V(b,80))}if(!p){let _=(n?.summary||"").trim();_&&(p=V(_,80))}let g=o?await pN(s):0;return{provider:"copilot",sessionId:c,cwd:u,createdAt:m??Rr(n?.created_at)??a.createdAt,modifiedAt:Rr(n?.updated_at)??a.modifiedAt,model:d,cliVersion:f,startCommand:"copilot",firstUserMessage:p,lastUserMessage:h,messageCount:g,filePath:i}}async readWorkspaceYaml(e){let r=mt(e,"workspace.yaml");try{let n=await uN(r,"utf-8");return mN(n)}catch{return null}}async resolveSessionPath(e){return this.resolveSessionDir(e)}async deleteSession(e){let r=await this.resolveSessionDir(e);return r?(await dN(r,{recursive:!0}),!0):!1}async resolveSessionDir(e){let r;try{r=await Rp(this.sessionStateDir)}catch{return null}if(r.includes(e)){let s=mt(this.sessionStateDir,e);if((await nn(s).catch(()=>null))?.isDirectory())return s}let n=[];for(let s of r)if(s.startsWith(e)){let o=mt(this.sessionStateDir,s);(await nn(o).catch(()=>null))?.isDirectory()&&n.push(o)}if(n.length===1)return n[0];for(let s of r){let o=mt(this.sessionStateDir,s);if(!(await nn(o).catch(()=>null))?.isDirectory())continue;let a=await this.readWorkspaceYaml(o);if(a&&(a.id===e||a.id?.startsWith(e)))return o}return null}}});function tc(t){return new Re({provider:new Po(t),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:(e,r)=>rn(e,{...r,acpTool:"copilot"})})}var rc=E(()=>{"use strict";jp();Bt();Ar();kt()});import{existsSync as Op,readdirSync as hN,statSync as Lp}from"node:fs";import{join as ar}from"node:path";import{createRequire as _N}from"node:module";function Cp(){return nc===null&&(nc=_N(import.meta.url)("node:sqlite").DatabaseSync),nc}function gN(){let t=process.env.XDG_DATA_HOME||ar(ke,".local","share"),e=process.env.XDG_CONFIG_HOME||ar(ke,".config");return[ar(t,"opencode","opencode.db"),ar(e,"opencode","opencode.db")]}function yN(){if(process.env.OPENCODE_DB)return[process.env.OPENCODE_DB];let t=process.env.XDG_DATA_HOME||ar(ke,".local","share"),e=ar(t,"lmplayer"),r=ar(e,"opencode-local.db"),n=[r];try{let s=hN(e).filter(o=>/^opencode.*\.db$/u.test(o)).map(o=>ar(e,o)).filter(o=>o!==r).sort((o,i)=>{try{return Lp(i).mtimeMs-Lp(o).mtimeMs}catch{return 0}});n.push(...s)}catch{}return n}function wN(t){return t==="lmplayer"?yN():gN()}var nc,sn,sc=E(()=>{"use strict";sr();nc=null;sn=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=wN(this.name)}existingDbPaths(){return this.dbPaths.filter(e=>Op(e))}openDb(e){return Op(e)?new(Cp())(e,{open:!0,readOnly:!0}):null}async discoverSessions(){let e=[];for(let r of this.existingDbPaths()){let n=this.openDb(r);if(n)try{let s=new Map,o=n.prepare("SELECT id, worktree, name FROM project").all();for(let a of o)s.set(a.id,a);let i=n.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
1209
1208
  s.time_created, s.time_updated
1210
1209
  FROM session s
1211
1210
  ORDER BY s.time_updated DESC`).all();for(let a of i){let l=s.get(a.project_id),c=a.directory||l?.worktree||"(unknown)",u=n.prepare(`SELECT m.id, m.data, m.time_created FROM message m
1212
- WHERE m.session_id = ? ORDER BY m.time_created ASC`).all(a.id),d=0,f,m,p,_=[];for(let h of u){let b;try{b=JSON.parse(h.data)}catch{continue}p||(p=b.model?.modelID||b.modelID),(b.role==="user"||b.role==="assistant")&&d++,b.role==="user"&&_.push(h.id)}let g=[..._.length>0?[_[0]]:[],..._.length>1?[_[_.length-1]]:[]];for(let h of g){let b=n.prepare("SELECT id, data FROM part WHERE message_id = ? ORDER BY time_created ASC").all(h),w=this.extractText(b);w&&(f||(f=V(w,80)),m=V(w,80))}e.push({provider:this.name,sessionId:a.id,slug:a.slug,cwd:c,createdAt:new Date(a.time_created),modifiedAt:new Date(a.time_updated),model:p,startCommand:this.startCommand,firstUserMessage:f,lastUserMessage:m,messageCount:d,filePath:r})}}catch{}finally{n.close()}}return e.sort((r,n)=>n.modifiedAt.getTime()-r.modifiedAt.getTime())}async loadSession(e){for(let r of this.existingDbPaths()){let n=this.openDb(r);if(n)try{let s=this.findSessionRow(n,e);if(!s)continue;return this.buildSessionDetail(n,s,r)}catch{}finally{n.close()}}return null}buildSessionDetail(e,r,n){let s=e.prepare("SELECT id, worktree, name FROM project WHERE id = ?").get(r.project_id),o=r.directory||s?.worktree||"(unknown)",i=e.prepare(`SELECT id, session_id, time_created, time_updated, data
1213
- FROM message WHERE session_id = ? ORDER BY time_created ASC`).all(r.id),a=[],l=0,c,u,d;for(let f of i){let m;try{m=JSON.parse(f.data)}catch{continue}c||(c=m.model?.modelID||m.modelID);let p=m.model?.modelID||m.modelID,_=new Date(m.time?.created||f.time_created),g=e.prepare("SELECT id, data FROM part WHERE message_id = ? ORDER BY time_created ASC").all(f.id);if(m.role==="user"){let h=this.extractText(g);h&&(u||(u=V(h,80)),d=V(h,80)),a.push({role:"user",timestamp:_,content:h||"(empty)"}),l++}else if(m.role==="assistant"){for(let h of g){let b;try{b=JSON.parse(h.data)}catch{continue}b.type==="text"&&b.text?a.push({role:"assistant",timestamp:_,content:b.text,model:p}):b.type==="reasoning"&&b.text?a.push({role:"thinking",timestamp:_,content:b.text}):b.type==="tool"&&b.tool&&(a.push({role:"tool_use",timestamp:_,content:`${b.tool}`,toolName:b.tool,toolCallId:b.callID,toolInput:b.state?.input?JSON.stringify(b.state.input):void 0}),(b.state?.output||b.state?.error)&&a.push({role:"tool_result",timestamp:_,content:b.state.error||b.state.output||"",toolCallId:b.callID}))}l++}}return{provider:this.name,sessionId:r.id,slug:r.slug,cwd:o,createdAt:new Date(r.time_created),modifiedAt:new Date(r.time_updated),model:c,startCommand:this.startCommand,firstUserMessage:u,lastUserMessage:d,messageCount:l,filePath:n,messages:a}}extractText(e){let r=[];for(let n of e){let s;try{s=JSON.parse(n.data)}catch{continue}s.type==="text"&&s.text&&r.push(s.text)}return r.join(`
1211
+ WHERE m.session_id = ? ORDER BY m.time_created ASC`).all(a.id),d=0,f,m,p,h=[];for(let _ of u){let b;try{b=JSON.parse(_.data)}catch{continue}p||(p=b.model?.modelID||b.modelID),(b.role==="user"||b.role==="assistant")&&d++,b.role==="user"&&h.push(_.id)}let g=[...h.length>0?[h[0]]:[],...h.length>1?[h[h.length-1]]:[]];for(let _ of g){let b=n.prepare("SELECT id, data FROM part WHERE message_id = ? ORDER BY time_created ASC").all(_),w=this.extractText(b);w&&(f||(f=V(w,80)),m=V(w,80))}e.push({provider:this.name,sessionId:a.id,slug:a.slug,cwd:c,createdAt:new Date(a.time_created),modifiedAt:new Date(a.time_updated),model:p,startCommand:this.startCommand,firstUserMessage:f,lastUserMessage:m,messageCount:d,filePath:r})}}catch{}finally{n.close()}}return e.sort((r,n)=>n.modifiedAt.getTime()-r.modifiedAt.getTime())}async loadSession(e){for(let r of this.existingDbPaths()){let n=this.openDb(r);if(n)try{let s=this.findSessionRow(n,e);if(!s)continue;return this.buildSessionDetail(n,s,r)}catch{}finally{n.close()}}return null}buildSessionDetail(e,r,n){let s=e.prepare("SELECT id, worktree, name FROM project WHERE id = ?").get(r.project_id),o=r.directory||s?.worktree||"(unknown)",i=e.prepare(`SELECT id, session_id, time_created, time_updated, data
1212
+ FROM message WHERE session_id = ? ORDER BY time_created ASC`).all(r.id),a=[],l=0,c,u,d;for(let f of i){let m;try{m=JSON.parse(f.data)}catch{continue}c||(c=m.model?.modelID||m.modelID);let p=m.model?.modelID||m.modelID,h=new Date(m.time?.created||f.time_created),g=e.prepare("SELECT id, data FROM part WHERE message_id = ? ORDER BY time_created ASC").all(f.id);if(m.role==="user"){let _=this.extractText(g);_&&(u||(u=V(_,80)),d=V(_,80)),a.push({role:"user",timestamp:h,content:_||"(empty)"}),l++}else if(m.role==="assistant"){for(let _ of g){let b;try{b=JSON.parse(_.data)}catch{continue}b.type==="text"&&b.text?a.push({role:"assistant",timestamp:h,content:b.text,model:p}):b.type==="reasoning"&&b.text?a.push({role:"thinking",timestamp:h,content:b.text}):b.type==="tool"&&b.tool&&(a.push({role:"tool_use",timestamp:h,content:`${b.tool}`,toolName:b.tool,toolCallId:b.callID,toolInput:b.state?.input?JSON.stringify(b.state.input):void 0}),(b.state?.output||b.state?.error)&&a.push({role:"tool_result",timestamp:h,content:b.state.error||b.state.output||"",toolCallId:b.callID}))}l++}}return{provider:this.name,sessionId:r.id,slug:r.slug,cwd:o,createdAt:new Date(r.time_created),modifiedAt:new Date(r.time_updated),model:c,startCommand:this.startCommand,firstUserMessage:u,lastUserMessage:d,messageCount:l,filePath:n,messages:a}}extractText(e){let r=[];for(let n of e){let s;try{s=JSON.parse(n.data)}catch{continue}s.type==="text"&&s.text&&r.push(s.text)}return r.join(`
1214
1213
  `).trim()}async resolveSessionPath(e){for(let r of this.existingDbPaths()){let n=this.openDb(r);if(n)try{if(this.findSessionRow(n,e))return r}catch{}finally{n.close()}}return null}async deleteSession(e){for(let r of this.existingDbPaths()){let n=new(Cp())(r,{open:!0});try{let s=this.findSessionRow(n,e);if(!s)continue;return n.prepare("DELETE FROM session WHERE id = ?").run(s.id).changes>0}catch{}finally{n.close()}}return!1}findSessionRow(e,r){let n=e.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
1215
1214
  s.time_created, s.time_updated
1216
1215
  FROM session s WHERE s.id = ?`).get(r);if(n)return n;let s=e.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
@@ -1218,11 +1217,11 @@ ${r}`:r}function M0(t){let e=[...t.matchAll(R0)];if(e.length>0){let r=e[e.length
1218
1217
  FROM session s
1219
1218
  WHERE s.id LIKE ?
1220
1219
  ORDER BY s.time_updated DESC
1221
- LIMIT 2`).all(`${r}%`);return s.length!==1?null:s[0]}}});function ic(){return new oc}var oc,ac=E(()=>{"use strict";sc();Bt();Ar();kt();oc=class extends Re{constructor(){super({provider:new sn,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)=>rn(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 EN}from"node:child_process";import{mkdirSync as TN}from"node:fs";function cc(t){return new lc(t)}async function bN(t,e){let r=Date.now(),n=Mp({prompt:t,sessionId:e.sessionId,model:e.model,effort:e.effort,formatJson:!0,permissionMode:e.permissionMode??"yolo"});ft("lmplayer",n,e.permissionMode??"yolo");let s=await Dp(e.binary,n,{cwd:e.cwd,env:Be(e.env,e.cwd,e.sessionId),signal:e.signal,onText:o=>{e.onProgress?.({kind:"text",summary:o.slice(0,120)}),e.onDelta?.(o)}});if(s.code!==0&&s.code!==null)throw new Error(s.stderr.trim().slice(0,200)||`lmplayer exited with code ${s.code}`);return{text:s.text.trim(),sessionId:s.sessionId??e.sessionId,durationMs:Date.now()-r}}function Mp(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(...or("lmplayer",t.permissionMode)??[]),e.push(t.prompt),e}function Dp(t,e,r){return new Promise((n,s)=>{let o;try{o=EN(t,e,{cwd:r.cwd,env:r.env,stdio:["ignore","pipe","pipe"]})}catch(g){s(g);return}let i="",a="",l="",c,u,d=[],f=!1,m=r.timeoutMs===void 0?void 0:setTimeout(()=>{f||(f=!0,o.kill(),p(),s(new Error(`lmplayer seed timed out after ${r.timeoutMs}ms`)))},r.timeoutMs),p=()=>{m!==void 0&&clearTimeout(m)},_=g=>{let h=g.trim();if(!h)return;let b;try{b=JSON.parse(h)}catch{d.push(g),r.onText?.(g);return}if(!Uo(b))return;let w=Fo(b,!1);c===void 0&&w!==void 0&&(c=w),u=Fo(b,!0)??u;let k=Pp(b);k&&(d.push(k),r.onText?.(k))};o.stdout?.on("data",g=>{let h=g.toString("utf8");i+=h,l+=h;let b=l.indexOf(`
1222
- `);for(;b>=0;){let w=l.slice(0,b);l=l.slice(b+1),_(w),b=l.indexOf(`
1223
- `)}}),o.stderr?.on("data",g=>{a+=g.toString("utf8")}),r.signal&&(r.signal.aborted?o.kill():r.signal.addEventListener("abort",()=>o.kill(),{once:!0})),o.on("exit",g=>{f||(f=!0,p(),l.length>0&&_(l),n({code:g,stdout:i,stderr:a,sessionId:c??u,text:d.join("")}))}),o.on("error",g=>{f||(f=!0,p(),s(g))})})}function Pp(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(Uo(r)){let n=Pp(r);if(n)return n}}}function Fo(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(Uo(r)){let n=Fo(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(Uo(s)){let o=Fo(s,e);if(o!==void 0)return o}}}function Uo(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var lc,uc=E(()=>{"use strict";sc();Bt();kt();tn();ut();lc=class extends Re{constructor(e){super({provider:new sn({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:bN})}seedArgsFor(e){return Mp({prompt:e?.prompt??Ee,model:e?.model,effort:e?.effort,formatJson:!0,permissionMode:"yolo"})}async seed(e,r){TN(e,{recursive:!0});let n=this.seedArgsFor(r);ft("lmplayer",n);try{let s=await Dp(this.binary,n,{cwd:e,env:Wt(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 Wo,readFile as SN,rm as kN}from"node:fs/promises";import{basename as Fp,join as lr}from"node:path";function Up(t){return t.type==="user"||t.message?.role==="user"}function Wp(t){return t.type==="assistant"||t.message?.role==="assistant"||t.message?.role==="model"}function Bp(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(`
1220
+ LIMIT 2`).all(`${r}%`);return s.length!==1?null:s[0]}}});function ic(){return new oc}var oc,ac=E(()=>{"use strict";sc();Bt();Ar();kt();oc=class extends Re{constructor(){super({provider:new sn,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)=>rn(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 EN}from"node:child_process";import{mkdirSync as TN}from"node:fs";function cc(t){return new lc(t)}async function bN(t,e){let r=Date.now(),n=Mp({prompt:t,sessionId:e.sessionId,model:e.model,effort:e.effort,formatJson:!0,permissionMode:e.permissionMode??"yolo"});ft("lmplayer",n,e.permissionMode??"yolo");let s=await Dp(e.binary,n,{cwd:e.cwd,env:He(e.env,e.cwd,e.sessionId),signal:e.signal,onText:o=>{e.onProgress?.({kind:"text",summary:o.slice(0,120)}),e.onDelta?.(o)}});if(s.code!==0&&s.code!==null)throw new Error(s.stderr.trim().slice(0,200)||`lmplayer exited with code ${s.code}`);return{text:s.text.trim(),sessionId:s.sessionId??e.sessionId,durationMs:Date.now()-r}}function Mp(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(...or("lmplayer",t.permissionMode)??[]),e.push(t.prompt),e}function Dp(t,e,r){return new Promise((n,s)=>{let o;try{o=EN(t,e,{cwd:r.cwd,env:r.env,stdio:["ignore","pipe","pipe"]})}catch(g){s(g);return}let i="",a="",l="",c,u,d=[],f=!1,m=r.timeoutMs===void 0?void 0:setTimeout(()=>{f||(f=!0,o.kill(),p(),s(new Error(`lmplayer seed timed out after ${r.timeoutMs}ms`)))},r.timeoutMs),p=()=>{m!==void 0&&clearTimeout(m)},h=g=>{let _=g.trim();if(!_)return;let b;try{b=JSON.parse(_)}catch{d.push(g),r.onText?.(g);return}if(!Uo(b))return;let w=Fo(b,!1);c===void 0&&w!==void 0&&(c=w),u=Fo(b,!0)??u;let k=Pp(b);k&&(d.push(k),r.onText?.(k))};o.stdout?.on("data",g=>{let _=g.toString("utf8");i+=_,l+=_;let b=l.indexOf(`
1221
+ `);for(;b>=0;){let w=l.slice(0,b);l=l.slice(b+1),h(w),b=l.indexOf(`
1222
+ `)}}),o.stderr?.on("data",g=>{a+=g.toString("utf8")}),r.signal&&(r.signal.aborted?o.kill():r.signal.addEventListener("abort",()=>o.kill(),{once:!0})),o.on("exit",g=>{f||(f=!0,p(),l.length>0&&h(l),n({code:g,stdout:i,stderr:a,sessionId:c??u,text:d.join("")}))}),o.on("error",g=>{f||(f=!0,p(),s(g))})})}function Pp(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(Uo(r)){let n=Pp(r);if(n)return n}}}function Fo(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(Uo(r)){let n=Fo(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(Uo(s)){let o=Fo(s,e);if(o!==void 0)return o}}}function Uo(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var lc,uc=E(()=>{"use strict";sc();Bt();kt();tn();ut();lc=class extends Re{constructor(e){super({provider:new sn({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:bN})}seedArgsFor(e){return Mp({prompt:e?.prompt??Ee,model:e?.model,effort:e?.effort,formatJson:!0,permissionMode:"yolo"})}async seed(e,r){TN(e,{recursive:!0});let n=this.seedArgsFor(r);ft("lmplayer",n);try{let s=await Dp(this.binary,n,{cwd:e,env:Wt(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 Wo,readFile as SN,rm as kN}from"node:fs/promises";import{basename as Fp,join as lr}from"node:path";function Up(t){return t.type==="user"||t.message?.role==="user"}function Wp(t){return t.type==="assistant"||t.message?.role==="assistant"||t.message?.role==="model"}function Bp(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(`
1224
1223
  `):Array.isArray(e.parts)?e.parts.filter(r=>!r.thought&&r.type!=="thinking").map(r=>r.text||"").join(`
1225
- `):"":""}function Hp(t){return t.model||t.message?.model}var Bo,qp=E(()=>{"use strict";sr();Bo=class{name="qwen";baseDir;constructor(e){this.baseDir=e?.qwenDir||lr(ke,".qwen")}async discoverSessions(){let e=lr(this.baseDir,"projects"),r;try{r=await Wo(e)}catch{return[]}let n=[];for(let s of r){let o=lr(e,s,"chats"),i;try{i=await Wo(o)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),c=lr(o,a);try{let u=await this.extractSummary(c,l);u&&n.push(u)}catch{}}}return n}async extractSummary(e,r){let n=await Le(e,30);if(n.length===0)return null;let s=await $e(e),o="(unknown)",i,a,l,c,u=0;for(let d of n){if(d.cwd&&(o=d.cwd,d.version&&(a=d.version)),d.type==="system"&&d.cwd&&(o=d.cwd,d.version&&(a=d.version),d.model&&(i=d.model)),Up(d)){let f=Bp(d).trim();f&&(l||(l=V(f,80)),c=V(f,80)),u++}if(Wp(d)){let f=Hp(d);f&&(i=f),u++}}return{provider:"qwen",sessionId:r,cwd:o,createdAt:s.createdAt,modifiedAt:s.modifiedAt,model:i,cliVersion:a,startCommand:"qwen",firstUserMessage:l,lastUserMessage:c,messageCount:u,filePath:e}}async loadSession(e){let r=await this.resolveSessionPath(e);if(!r)return null;let n=Fp(r,".jsonl");return this.loadFromFile(r,n)}async loadFromFile(e,r){let n=await $e(e),s="(unknown)",o,i,a,l,c,u,d=[];for await(let f of We(e)){if(f.cwd&&(s=f.cwd,f.version&&(i=f.version),f.gitBranch&&(a=f.gitBranch)),f.type==="system"&&f.cwd&&(s=f.cwd,f.version&&(i=f.version),f.model&&(o=f.model),f.gitBranch&&(a=f.gitBranch)),!f.message)continue;let m=f.message,p=f.timestamp?new Date(f.timestamp):n.modifiedAt;if(Up(f)){let _=Bp(f);_.trim()&&(c||(c=V(_.trim(),80)),u=V(_.trim(),80)),d.push({role:"user",timestamp:p,content:_})}else if(Wp(f)){let _=Hp(f);if(_&&(o=_),Array.isArray(m.content))for(let g of m.content)g.type==="text"&&g.text?d.push({role:"assistant",timestamp:p,content:g.text,model:_}):g.type==="thinking"&&g.thinking&&d.push({role:"thinking",timestamp:p,content:g.thinking});else if(typeof m.content=="string")d.push({role:"assistant",timestamp:p,content:m.content,model:_});else if(Array.isArray(m.parts))for(let g of m.parts)if(g.thought||g.type==="thinking"){let h=g.thinking||g.text;h&&d.push({role:"thinking",timestamp:p,content:h})}else g.text&&d.push({role:"assistant",timestamp:p,content:g.text,model:_})}}return{provider:"qwen",sessionId:r,slug:l,cwd:s,createdAt:n.createdAt,modifiedAt:n.modifiedAt,model:o,cliVersion:i,gitBranch:a,startCommand:"qwen",firstUserMessage:c,lastUserMessage:u,messageCount:d.length,filePath:e,messages:d}}async resolveSessionPath(e){let r=lr(this.baseDir,"projects");try{let n=await Wo(r),s=[];for(let o of n){let i=lr(r,o,"chats",`${e}.jsonl`);try{return await SN(i,{flag:"r"}),i}catch{continue}}for(let o of n){let i=lr(r,o,"chats"),a;try{a=await Wo(i)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;Fp(l,".jsonl").startsWith(e)&&s.push(lr(i,l))}}if(s.length===1)return s[0]}catch{}return null}async deleteSession(e){let r=await this.resolveSessionPath(e);if(!r)return!1;try{return await kN(r),!0}catch{return!1}}}});function fc(){return new dc}var dc,mc=E(()=>{"use strict";qp();Bt();Ar();kt();dc=class extends Re{constructor(){super({provider:new Bo,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:Ro})}}});import{readdir as Jp,readFile as vN,rm as Xp,stat as Gp}from"node:fs/promises";import{basename as pc,join as Jt}from"node:path";async function IN(t){let e=await Promise.all(t.map(r=>$e(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 NN(t,e){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function Vp(t){return t.type==="USER_INPUT"}function Kp(t){return t.source==="MODEL"&&t.type==="PLANNER_RESPONSE"}function xN(t){return t.source==="MODEL"&&t.type!=="PLANNER_RESPONSE"}function Yp(t){if(!t)return"";let e=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(t);return e?e[1]:t}function zp(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 AN(t){if(t===void 0)return"";try{return JSON.stringify(t)}catch{return String(t)}}async function $N(t){for await(let e of We(t)){let r=e.tool_calls?.map(s=>s.args)??[];for(let s of r){let o=RN(s);if(o)return o}let n=jN(e.content);if(n)return n}return null}function RN(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 jN(t){return t?/"Cwd":"([^"]+)"/.exec(t)?.[1]??null:null}function Zp(t){if(t.endsWith(".db"))return pc(t,".db");let e="/brain/",r=t.indexOf(e);return r===-1?null:t.slice(r+e.length).split("/")[0]||null}var Ho,Qp=E(()=>{"use strict";sr();Ho=class{name="agy";baseDir;constructor(e={}){this.baseDir=e.agyDir||Jt(ke,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:Jt(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let e=Jt(this.baseDir,"conversations"),r;try{r=await Jp(e)}catch{return[]}let n=[];for(let s of r){if(!s.endsWith(".db"))continue;let o=pc(s,".db");try{let i=await this.extractSummary(o);i&&n.push(i)}catch{}}return n}conversationPath(e){return Jt(this.baseDir,"conversations",`${e}.db`)}transcriptPath(e){return Jt(this.baseDir,"brain",e,".system_generated","logs","transcript.jsonl")}async existingTranscriptPath(e){let r=this.transcriptPath(e);try{return await Gp(r),r}catch{return null}}async extractSummary(e){let r=this.conversationPath(e),n=await this.existingTranscriptPath(e),s=n??r,o=await IN([r,n].filter(Boolean)),i=await this.resolveCwd(e,n),a,l,c,u=0;if(n){let d=await Le(n,80);for(let f of d){let m=zp(f.content);if(m&&(a=m),Vp(f)){let p=Yp(f.content).trim();p&&(l||(l=V(p,80)),c=V(p,80)),u++}else Kp(f)&&u++}}return{provider:"agy",sessionId:e,cwd:i,createdAt:o.createdAt,modifiedAt:o.modifiedAt,model:a,startCommand:"agy",firstUserMessage:l,lastUserMessage:c,messageCount:u,filePath:s,filePaths:n?[r,n]:[r]}}async loadSession(e){let r=await this.resolveSessionPath(e);if(!r)return null;let n=Zp(r);if(!n)return null;let s=await this.extractSummary(n);if(!s)return null;let o=await this.existingTranscriptPath(n),i=[],a=s.model,l=s.firstUserMessage,c=s.lastUserMessage;if(o)for await(let u of We(o)){let d=NN(u.created_at,s.modifiedAt),f=zp(u.content);if(f&&(a=f),Vp(u)){let m=Yp(u.content),p=m.trim();p&&(l||(l=V(p,80)),c=V(p,80)),i.push({role:"user",timestamp:d,content:m});continue}if(Array.isArray(u.tool_calls))for(let m of u.tool_calls)i.push({role:"tool_use",timestamp:d,content:AN(m.args),toolName:m.name||"tool"});Kp(u)&&u.content?i.push({role:"assistant",timestamp:d,content:u.content,model:a}):xN(u)&&u.content&&i.push({role:"tool_result",timestamp:d,content:u.content,toolName:u.type?.toLowerCase()}),u.thinking&&i.push({role:"thinking",timestamp:d,content:u.thinking})}return{...s,model:a,firstUserMessage:l,lastUserMessage:c,messageCount:i.length,messages:i}}async resolveSessionPath(e){let r=this.conversationPath(e);try{return await Gp(r),r}catch{}let n=Jt(this.baseDir,"conversations");try{let s=[];for(let o of await Jp(n)){if(!o.endsWith(".db"))continue;pc(o,".db").startsWith(e)&&s.push(Jt(n,o))}if(s.length===1)return s[0]}catch{}return null}async deleteSession(e){let r=await this.resolveSessionPath(e);if(!r)return!1;let n=Zp(r);return n?(await Xp(this.conversationPath(n),{force:!0}),await Xp(Jt(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 $N(r);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(e){let r=Jt(this.baseDir,"cache","last_conversations.json");try{let n=JSON.parse(await vN(r,"utf8"));for(let[s,o]of Object.entries(n))if(o===e)return s}catch{}return null}}});import{spawn as ON}from"node:child_process";function _c(t){return new hc(t)}async function LN(t,e){let r=Date.now(),n=["--conversation",e.sessionId,"-p",t,"--dangerously-skip-permissions","--print-timeout",MN(e.timeoutMs)];e.model&&n.push("--model",e.model),ft("agy",n,e.permissionMode??"yolo"),e.onProgress?.({kind:"system",summary:"agy -p one-shot started (no streaming events)"});let{stdout:s}=await CN(e.binary,n,{cwd:e.cwd,env:Be(e.env,e.cwd,e.sessionId),signal:e.signal});return e.onProgress?.({kind:"system",summary:"agy -p one-shot completed"}),{text:s.trimEnd(),sessionId:e.sessionId,durationMs:Date.now()-r}}function CN(t,e,r){return new Promise((n,s)=>{let o;try{o=ON(t,e,{cwd:r.cwd,env:r.env,stdio:["ignore","pipe","pipe"]})}catch(c){s(c);return}let i="",a="";o.stdout?.on("data",c=>{i+=c.toString()}),o.stderr?.on("data",c=>{a+=c.toString()});let l=()=>{o.kill("SIGTERM"),s(new Error("agy turn aborted"))};if(r.signal){if(r.signal.aborted){l();return}r.signal.addEventListener("abort",l,{once:!0})}o.on("error",c=>{r.signal?.removeEventListener("abort",l),s(c)}),o.on("exit",(c,u)=>{if(r.signal?.removeEventListener("abort",l),c===0){n({stdout:i,stderr:a});return}let d=u?`signal ${u}`:`exit code ${c}`,f=a.trim()||i.trim();s(new Error(`agy failed (${d})${f?`: ${f}`:""}`))})})}function MN(t){return!t||t<=0?"8h":`${Math.max(1,Math.ceil(t/1e3))}s`}var hc,gc=E(()=>{"use strict";Qp();Bt();kt();ut();tn();hc=class extends Re{constructor(e){super({provider:new Ho(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:LN})}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 DN}from"node:crypto";import{join as PN}from"node:path";function FN(t){return DN("sha256").update(t).digest("hex").slice(0,8)}function UN(t){let e=t.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"session"}function WN(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 BN(t){return t.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function qo(t){return Math.max(1,Math.ceil(t.length/4))}function eh(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 Ec(){return new wc}var jr,yc,wc,Tc=E(()=>{"use strict";jr=new Map;yc=class{name="ClaudeMock";async discoverSessions(){return[...jr.values()].map(eh)}async loadSession(e){let r=jr.get(e);return r===void 0?null:{...eh(r),messages:r.messages.slice()}}async resolveSessionPath(e){return jr.get(e)?.filePath??null}async deleteSession(e){return jr.delete(e)}},wc=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new yc;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=UN(WN(e,r)),s=`mock-${n}-${FN(`${e}:${n}`)}`,o=new Date,i=jr.get(s),a=r?.prompt??"ClaudeMock seed",l=qo(a),c={sessionId:s,cwd:e,filePath:PN(e,".lmctl-claude-mock",`${s}.json`),createdAt:i?.createdAt??o,modifiedAt:o,messages:i?.messages.slice()??[],totalInputTokens:i?.totalInputTokens??0,totalOutputTokens:i?.totalOutputTokens??0};return c.messages.push({role:"user",timestamp:o,content:a}),c.messages.push({role:"assistant",timestamp:o,content:"ACK: ClaudeMock seeded"}),c.totalInputTokens+=l,c.totalOutputTokens+=qo("ACK: ClaudeMock seeded"),jr.set(s,c),{success:!0}}resumeCommand(e){return`ClaudeMock --resume ${e}`}startCommand(){return"ClaudeMock"}manualSeedHint(e){return{launchCommand:`cd ${e} && ClaudeMock`,postLaunchNote:"ClaudeMock is a hermetic test provider; no manual seed is required.",lsCommand:`lmctl ls --provider ClaudeMock --sessiondir ${e}`}}forkHint(e){return"ClaudeMock does not support fork."}async fork(e,r){return{success:!1,error:"ClaudeMock does not support fork."}}async sendTurn(e,r){let n=Date.now(),s=jr.get(r.sessionId);if(s===void 0)throw new Error(`ClaudeMock session not found: ${r.sessionId}`);let o=new Date,i=`ClaudeMock ack: ${BN(e)}`;return s.messages.push({role:"user",timestamp:o,content:e}),s.messages.push({role:"assistant",timestamp:o,content:i,model:r.model??"claude-mock"}),s.modifiedAt=o,s.totalInputTokens+=qo(e),s.totalOutputTokens+=qo(i),r.onProgress?.({kind:"text",summary:"ClaudeMock deterministic reply"}),{text:i,sessionId:r.sessionId,durationMs:Math.max(1,Date.now()-n),stopReason:"mock_stop",numTurns:1,status:"ok"}}}});function vt(t){let e=[Jl({claudeDir:t?.claudeDir}),Vl({codexDir:t?.codexDir,codeDir:t?.codeDir}),Ql({geminiDir:t?.geminiDir,claudeDir:t?.claudeDir,codexDir:t?.codexDir,codeDir:t?.codeDir}),tc({copilotDir:t?.copilotDir}),ic(),cc({lmplayerDbPath:t?.lmplayerDbPath}),fc(),_c({agyDir:t?.agyDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&e.push(Ec()),e}var bc=E(()=>{"use strict";Xl();Kl();ec();rc();ac();uc();mc();gc();Tc();Xl();Kl();ec();rc();ac();uc();mc();gc();Tc()});var Ic={};re(Ic,{ProviderRegistry:()=>ns,TransportConnectionError:()=>ve,TransportError:()=>Qe,TransportJsonError:()=>vo,TransportProcessError:()=>Ht,TransportRpcError:()=>qt,_resetDefaultRegistryForTests:()=>HN,chat:()=>Xt,countTokens:()=>vc,createAdapterRegistry:()=>St,createAllAdapters:()=>vt,listSessions:()=>kc,seed:()=>Sc});function Xo(){return Jo===null&&(Jo=St(vt())),Jo}function HN(){Jo=null}function rh(t,e){let r=t.getAdapter(e);if(!r)throw new Error(`provider "${e}" is not registered in this registry`);return r}async function Xt(t){let e=t.registry??Xo(),r=rh(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 Sc(t){let e=t.registry??Xo(),r=rh(e,t.provider),n=await th(e,t.provider,t.cwd),s=await r.seed(t.cwd,{model:t.model,effort:t.effort,prompt:t.prompt});if(!s.success)return{success:!1,error:s.error};if(s.sessionId)return{success:!0,sessionId:s.sessionId};let o=await th(e,t.provider,t.cwd),i=qN(n,o);return i?{success:!0,sessionId:i}:{success:!0}}async function th(t,e,r){let n=await t.listAll({provider:e,workspace:r}),s=new Map;for(let o of n)s.set(o.sessionId,o.modifiedAt);return s}function qN(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 kc(t={}){return(t.registry??Xo()).listAll({provider:t.provider,workspace:t.workspace,limit:t.limit,from:t.from,to:t.to})}async function vc(t){let r=await(t.registry??Xo()).getSession(t.sessionId,t.provider);if(!r)throw new Error(`session "${t.sessionId}" not found`);let n=r.totalInputTokens??0,s=r.totalCachedInputTokens??0,o=r.totalCacheWriteInputTokens??0,i=r.totalOutputTokens??0,a=r.totalReasoningOutputTokens??0;return{provider:r.provider,sessionId:r.sessionId,input:n,cachedInput:s,cacheWriteInput:o,output:i,reasoningOutput:a,total:n+s+o+i+a,lastTurn:r.lastTokenUsage}}var Jo,It=E(()=>{"use strict";Dl();bc();Dl();bc();en();Jo=null});function JN(){return Nc===null&&(Nc=St(vt())),Nc}async function an(t){let{dal:e,team_member_id:r}=t,n=e!==void 0&&r!==void 0;n&&e.setMemberState(r,"in_chat");let s=!1,o;try{return await GN(t)}catch(i){throw s=!0,o=i,i}finally{if(n)if(!s)on.delete(r),e.setMemberState(r,"idle");else{let i=XN(o,r);e.setMemberState(r,i!==null?"attention_needed":"idle",i)}}}function XN(t,e){if(!(t instanceof Ie))return on.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=(on.get(e)??0)+1;return r>=3?(on.delete(e),"consecutive_timeouts"):(on.set(e,r),null)}return on.delete(e),null}async function GN(t){let e=t.timeoutMs,r=typeof e=="number"&&e>0,n=JN(),s;try{let u=await n.resolveSession(t.sessionid);if(!u)return Promise.reject(new Ie("other",null,`library: sessionid "${t.sessionid}" matched no registered provider`,xc(t.sessionid,t.sessiondir,"unresolved")));s=u.provider.name}catch(u){return Promise.reject(new Ie("other",null,`library: session resolution failed: ${nh(u)}`,xc(t.sessionid,t.sessiondir,"unresolved")))}let o=xc(t.sessionid,t.sessiondir,s),i=new AbortController,a=r?setTimeout(()=>i.abort(),e):null,l=!1;i.signal.addEventListener("abort",()=>{l=!0},{once:!0});let c=Date.now();try{let u=await Xt({provider:s,sessionId:t.sessionid,cwd:t.sessiondir,prompt:t.prompt,timeoutMs:0,signal:i.signal,registry:n,onProgress:t.onProgress,permissionMode:t.permissionMode});if(u.status==="stalled")throw new Ie("timeout",null,`library: stalled after ${u.stalledAfterMs??0}ms`,o);return{text:u.text,ms:Date.now()-c,exit_status:0,argv:o}}catch(u){throw l?new Ie("timeout",null,`library: wall-clock timeout after ${e??0}ms`,o):VN(u,o)}finally{a!==null&&clearTimeout(a)}}function xc(t,e,r){return["<library>","chat",t,e,"--provider",r]}function nh(t){return t instanceof Error?t.message:String(t)}function VN(t,e){if(t instanceof Ie)return t;if(t instanceof ve){let r=t.cause;return r?.code==="ENOENT_CWD"?new Ie("sessiondir_missing",null,t.message,e):r?.code==="ENOENT"?new Ie("enoent",null,t.message,e):new Ie("other",null,t.message,e)}return t instanceof Ht?new Ie("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof qt?new Ie("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof Qe?new Ie("other",null,t.message,e):new Ie("other",null,nh(t),e)}var Ie,Nc,on,ds=E(()=>{"use strict";It();Ie=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"}},Nc=null;on=new Map});function sh(){return Ac===null&&(Ac=St(vt())),Ac}function YN(t,e){if(!KN.test(t))return t;let r=e.getConfig(`workspace.${t}`);if(r===null||r.length===0)throw new xe("other",null,`workspace has no mapping for ${t}; run \`lmctl workspace init\` (or set workspace.${t} in lmctl_config)`,["<library>","seed","--provider",t]);return r}async function ln(t){let e=YN(t.member.provider,t.dal),r=e===t.member.provider?t.member:{...t.member,provider:e},n=await zN({member:r});return t.dal.setMemberProviderResolved(t.member.id,e),{sessionid:n.sessionid,provider_resolved:e}}async function zN(t){let e=t.member.provider,r=t.member.sessiondir,n=$c("seed",r,e);try{let s=await Sc({provider:e,cwd:r,registry:sh()});if(!s.success)throw QN(s.error,n);if(!s.sessionId)throw new xe("parse",0,"",n);return{sessionid:s.sessionId}}catch(s){throw s instanceof xe?s:Rc(s,n)}}async function oh(t){return ZN(t)}async function ZN(t){let e=sh(),r=$c("tokens",t.sessionid,"unresolved"),n;try{let o=await e.resolveSession(t.sessionid);if(!o)throw new xe("parse",0,`library: sessionid "${t.sessionid}" matched no registered provider`,r);n=o.provider.name}catch(o){throw o instanceof xe?o:Rc(o,r)}let s=$c("tokens",t.sessionid,n);try{let o=await vc({sessionId:t.sessionid,provider:n,registry:e});return{input_tokens:o.input,cache_tokens:o.cachedInput+o.cacheWriteInput,output_tokens:o.output,total_tokens:o.total}}catch(o){throw o instanceof xe?o:Rc(o,s)}}function $c(t,e,r){return["<library>",t,e,"--provider",r]}function QN(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 Rc(t,e){return t instanceof xe?t:t instanceof ve?t.cause?.code==="ENOENT"?new xe("enoent",null,t.message,e):new xe("other",null,t.message,e):t instanceof Ht?new xe("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof qt?new xe("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof Qe?new xe("other",null,t.message,e):new xe("other",null,t instanceof Error?t.message:String(t),e)}var xe,Ac,KN,Go=E(()=>{"use strict";It();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"}},Ac=null;KN=/^provider[123]$/});function Vo(t){return Buffer.from(t,"utf8").toString("base64url")}function ms(t){return Buffer.from(t,"base64url").toString("utf8")}async function ih(t,e=r=>oh({sessionid:r})){if(process.env.LMCTL_SESSION_SIZE_DISABLED==="1")return{recorded:0,failed:0};let r=0,n=0;for(let s of ex(t)){let o=s.member.sessionid;if(o!==null)try{let i=await e(o);t.recordSessionSize({team_name:s.team_name,alias:s.member.alias,sessionid:o,...i}),r+=1}catch(i){n+=1;try{t.raiseAttention({kind:"daemon_session_size_failed",severity:"warn",payload:JSON.stringify({team_name:s.team_name,alias:s.member.alias,sessionid:o,error:i instanceof Error?i.message:String(i)})})}catch{}}}return{recorded:r,failed:n}}async function ah(t,e,r){let n=lh(t,e,r);if(n===null||n.member.sessionid===null)throw new Error("session member not found");if(n.member.state!=="idle")throw new fs(r,n.member.state);t.setMemberState(n.member.id,"in_chat","compacting");try{return await an({sessionid:n.member.sessionid,sessiondir:n.member.sessiondir,prompt:"/compact"}),t.setMemberState(n.member.id,"idle",null),{ok:!0,row:ch(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 jc(t,e,r){let n=lh(t,e,r);if(n===null)throw new Error("session member not found");let s=await ln({member:n.member,dal:t});return t.updateTeamMemberSession(n.member.id,s.sessionid),{ok:!0,sessionid:s.sessionid,row:ch(t,e,r)}}function ex(t){return t.listTeams().flatMap(e=>t.listTeamMembers(e.id).filter(r=>r.sessionid!==null).map(r=>({team_name:e.name,member:r})))}function lh(t,e,r){let n=t.findTeamByName(e);if(n===null)return null;let s=t.findTeamMemberByAlias(n.id,r);return s===null?null:{team_name:n.name,member:s}}function ch(t,e,r){return t.sessionSizeHistory(e,r,1)[0]??null}var fs,Ko=E(()=>{"use strict";ds();Go();fs=class extends Error{constructor(e,r){super(`member ${e} is currently ${r}; cannot compact while busy`),this.name="MemberBusyError"}}});async function Oc(t){let e=t.dal,r=t.nowMs??Date.now(),n=t.thresholdMs??rx(e),s=r-n,o=e.query(`
1224
+ `):"":""}function Hp(t){return t.model||t.message?.model}var Bo,qp=E(()=>{"use strict";sr();Bo=class{name="qwen";baseDir;constructor(e){this.baseDir=e?.qwenDir||lr(ke,".qwen")}async discoverSessions(){let e=lr(this.baseDir,"projects"),r;try{r=await Wo(e)}catch{return[]}let n=[];for(let s of r){let o=lr(e,s,"chats"),i;try{i=await Wo(o)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),c=lr(o,a);try{let u=await this.extractSummary(c,l);u&&n.push(u)}catch{}}}return n}async extractSummary(e,r){let n=await Ce(e,30);if(n.length===0)return null;let s=await $e(e),o="(unknown)",i,a,l,c,u=0;for(let d of n){if(d.cwd&&(o=d.cwd,d.version&&(a=d.version)),d.type==="system"&&d.cwd&&(o=d.cwd,d.version&&(a=d.version),d.model&&(i=d.model)),Up(d)){let f=Bp(d).trim();f&&(l||(l=V(f,80)),c=V(f,80)),u++}if(Wp(d)){let f=Hp(d);f&&(i=f),u++}}return{provider:"qwen",sessionId:r,cwd:o,createdAt:s.createdAt,modifiedAt:s.modifiedAt,model:i,cliVersion:a,startCommand:"qwen",firstUserMessage:l,lastUserMessage:c,messageCount:u,filePath:e}}async loadSession(e){let r=await this.resolveSessionPath(e);if(!r)return null;let n=Fp(r,".jsonl");return this.loadFromFile(r,n)}async loadFromFile(e,r){let n=await $e(e),s="(unknown)",o,i,a,l,c,u,d=[];for await(let f of Be(e)){if(f.cwd&&(s=f.cwd,f.version&&(i=f.version),f.gitBranch&&(a=f.gitBranch)),f.type==="system"&&f.cwd&&(s=f.cwd,f.version&&(i=f.version),f.model&&(o=f.model),f.gitBranch&&(a=f.gitBranch)),!f.message)continue;let m=f.message,p=f.timestamp?new Date(f.timestamp):n.modifiedAt;if(Up(f)){let h=Bp(f);h.trim()&&(c||(c=V(h.trim(),80)),u=V(h.trim(),80)),d.push({role:"user",timestamp:p,content:h})}else if(Wp(f)){let h=Hp(f);if(h&&(o=h),Array.isArray(m.content))for(let g of m.content)g.type==="text"&&g.text?d.push({role:"assistant",timestamp:p,content:g.text,model:h}):g.type==="thinking"&&g.thinking&&d.push({role:"thinking",timestamp:p,content:g.thinking});else if(typeof m.content=="string")d.push({role:"assistant",timestamp:p,content:m.content,model:h});else if(Array.isArray(m.parts))for(let g of m.parts)if(g.thought||g.type==="thinking"){let _=g.thinking||g.text;_&&d.push({role:"thinking",timestamp:p,content:_})}else g.text&&d.push({role:"assistant",timestamp:p,content:g.text,model:h})}}return{provider:"qwen",sessionId:r,slug:l,cwd:s,createdAt:n.createdAt,modifiedAt:n.modifiedAt,model:o,cliVersion:i,gitBranch:a,startCommand:"qwen",firstUserMessage:c,lastUserMessage:u,messageCount:d.length,filePath:e,messages:d}}async resolveSessionPath(e){let r=lr(this.baseDir,"projects");try{let n=await Wo(r),s=[];for(let o of n){let i=lr(r,o,"chats",`${e}.jsonl`);try{return await SN(i,{flag:"r"}),i}catch{continue}}for(let o of n){let i=lr(r,o,"chats"),a;try{a=await Wo(i)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;Fp(l,".jsonl").startsWith(e)&&s.push(lr(i,l))}}if(s.length===1)return s[0]}catch{}return null}async deleteSession(e){let r=await this.resolveSessionPath(e);if(!r)return!1;try{return await kN(r),!0}catch{return!1}}}});function fc(){return new dc}var dc,mc=E(()=>{"use strict";qp();Bt();Ar();kt();dc=class extends Re{constructor(){super({provider:new Bo,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:Ro})}}});import{readdir as Jp,readFile as vN,rm as Xp,stat as Gp}from"node:fs/promises";import{basename as pc,join as Jt}from"node:path";async function IN(t){let e=await Promise.all(t.map(r=>$e(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 NN(t,e){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function Vp(t){return t.type==="USER_INPUT"}function Kp(t){return t.source==="MODEL"&&t.type==="PLANNER_RESPONSE"}function xN(t){return t.source==="MODEL"&&t.type!=="PLANNER_RESPONSE"}function Yp(t){if(!t)return"";let e=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(t);return e?e[1]:t}function zp(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 AN(t){if(t===void 0)return"";try{return JSON.stringify(t)}catch{return String(t)}}async function $N(t){for await(let e of Be(t)){let r=e.tool_calls?.map(s=>s.args)??[];for(let s of r){let o=RN(s);if(o)return o}let n=jN(e.content);if(n)return n}return null}function RN(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 jN(t){return t?/"Cwd":"([^"]+)"/.exec(t)?.[1]??null:null}function Zp(t){if(t.endsWith(".db"))return pc(t,".db");let e="/brain/",r=t.indexOf(e);return r===-1?null:t.slice(r+e.length).split("/")[0]||null}var Ho,Qp=E(()=>{"use strict";sr();Ho=class{name="agy";baseDir;constructor(e={}){this.baseDir=e.agyDir||Jt(ke,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:Jt(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let e=Jt(this.baseDir,"conversations"),r;try{r=await Jp(e)}catch{return[]}let n=[];for(let s of r){if(!s.endsWith(".db"))continue;let o=pc(s,".db");try{let i=await this.extractSummary(o);i&&n.push(i)}catch{}}return n}conversationPath(e){return Jt(this.baseDir,"conversations",`${e}.db`)}transcriptPath(e){return Jt(this.baseDir,"brain",e,".system_generated","logs","transcript.jsonl")}async existingTranscriptPath(e){let r=this.transcriptPath(e);try{return await Gp(r),r}catch{return null}}async extractSummary(e){let r=this.conversationPath(e),n=await this.existingTranscriptPath(e),s=n??r,o=await IN([r,n].filter(Boolean)),i=await this.resolveCwd(e,n),a,l,c,u=0;if(n){let d=await Ce(n,80);for(let f of d){let m=zp(f.content);if(m&&(a=m),Vp(f)){let p=Yp(f.content).trim();p&&(l||(l=V(p,80)),c=V(p,80)),u++}else Kp(f)&&u++}}return{provider:"agy",sessionId:e,cwd:i,createdAt:o.createdAt,modifiedAt:o.modifiedAt,model:a,startCommand:"agy",firstUserMessage:l,lastUserMessage:c,messageCount:u,filePath:s,filePaths:n?[r,n]:[r]}}async loadSession(e){let r=await this.resolveSessionPath(e);if(!r)return null;let n=Zp(r);if(!n)return null;let s=await this.extractSummary(n);if(!s)return null;let o=await this.existingTranscriptPath(n),i=[],a=s.model,l=s.firstUserMessage,c=s.lastUserMessage;if(o)for await(let u of Be(o)){let d=NN(u.created_at,s.modifiedAt),f=zp(u.content);if(f&&(a=f),Vp(u)){let m=Yp(u.content),p=m.trim();p&&(l||(l=V(p,80)),c=V(p,80)),i.push({role:"user",timestamp:d,content:m});continue}if(Array.isArray(u.tool_calls))for(let m of u.tool_calls)i.push({role:"tool_use",timestamp:d,content:AN(m.args),toolName:m.name||"tool"});Kp(u)&&u.content?i.push({role:"assistant",timestamp:d,content:u.content,model:a}):xN(u)&&u.content&&i.push({role:"tool_result",timestamp:d,content:u.content,toolName:u.type?.toLowerCase()}),u.thinking&&i.push({role:"thinking",timestamp:d,content:u.thinking})}return{...s,model:a,firstUserMessage:l,lastUserMessage:c,messageCount:i.length,messages:i}}async resolveSessionPath(e){let r=this.conversationPath(e);try{return await Gp(r),r}catch{}let n=Jt(this.baseDir,"conversations");try{let s=[];for(let o of await Jp(n)){if(!o.endsWith(".db"))continue;pc(o,".db").startsWith(e)&&s.push(Jt(n,o))}if(s.length===1)return s[0]}catch{}return null}async deleteSession(e){let r=await this.resolveSessionPath(e);if(!r)return!1;let n=Zp(r);return n?(await Xp(this.conversationPath(n),{force:!0}),await Xp(Jt(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 $N(r);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(e){let r=Jt(this.baseDir,"cache","last_conversations.json");try{let n=JSON.parse(await vN(r,"utf8"));for(let[s,o]of Object.entries(n))if(o===e)return s}catch{}return null}}});import{spawn as ON}from"node:child_process";function _c(t){return new hc(t)}async function LN(t,e){let r=Date.now(),n=["--conversation",e.sessionId,"-p",t,"--dangerously-skip-permissions","--print-timeout",MN(e.timeoutMs)];e.model&&n.push("--model",e.model),ft("agy",n,e.permissionMode??"yolo"),e.onProgress?.({kind:"system",summary:"agy -p one-shot started (no streaming events)"});let{stdout:s}=await CN(e.binary,n,{cwd:e.cwd,env:He(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 CN(t,e,r){return new Promise((n,s)=>{let o;try{o=ON(t,e,{cwd:r.cwd,env:r.env,stdio:["ignore","pipe","pipe"]})}catch(c){s(c);return}let i="",a="";o.stdout?.on("data",c=>{i+=c.toString()}),o.stderr?.on("data",c=>{a+=c.toString()});let l=()=>{o.kill("SIGTERM"),s(new Error("agy turn aborted"))};if(r.signal){if(r.signal.aborted){l();return}r.signal.addEventListener("abort",l,{once:!0})}o.on("error",c=>{r.signal?.removeEventListener("abort",l),s(c)}),o.on("exit",(c,u)=>{if(r.signal?.removeEventListener("abort",l),c===0){n({stdout:i,stderr:a});return}let d=u?`signal ${u}`:`exit code ${c}`,f=a.trim()||i.trim();s(new Error(`agy failed (${d})${f?`: ${f}`:""}`))})})}function MN(t){return!t||t<=0?"8h":`${Math.max(1,Math.ceil(t/1e3))}s`}var hc,gc=E(()=>{"use strict";Qp();Bt();kt();ut();tn();hc=class extends Re{constructor(e){super({provider:new Ho(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:LN})}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 DN}from"node:crypto";import{join as PN}from"node:path";function FN(t){return DN("sha256").update(t).digest("hex").slice(0,8)}function UN(t){let e=t.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"session"}function WN(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 BN(t){return t.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function qo(t){return Math.max(1,Math.ceil(t.length/4))}function eh(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 Ec(){return new wc}var jr,yc,wc,Tc=E(()=>{"use strict";jr=new Map;yc=class{name="ClaudeMock";async discoverSessions(){return[...jr.values()].map(eh)}async loadSession(e){let r=jr.get(e);return r===void 0?null:{...eh(r),messages:r.messages.slice()}}async resolveSessionPath(e){return jr.get(e)?.filePath??null}async deleteSession(e){return jr.delete(e)}},wc=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new yc;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=UN(WN(e,r)),s=`mock-${n}-${FN(`${e}:${n}`)}`,o=new Date,i=jr.get(s),a=r?.prompt??"ClaudeMock seed",l=qo(a),c={sessionId:s,cwd:e,filePath:PN(e,".lmctl-claude-mock",`${s}.json`),createdAt:i?.createdAt??o,modifiedAt:o,messages:i?.messages.slice()??[],totalInputTokens:i?.totalInputTokens??0,totalOutputTokens:i?.totalOutputTokens??0};return c.messages.push({role:"user",timestamp:o,content:a}),c.messages.push({role:"assistant",timestamp:o,content:"ACK: ClaudeMock seeded"}),c.totalInputTokens+=l,c.totalOutputTokens+=qo("ACK: ClaudeMock seeded"),jr.set(s,c),{success:!0}}resumeCommand(e){return`ClaudeMock --resume ${e}`}startCommand(){return"ClaudeMock"}manualSeedHint(e){return{launchCommand:`cd ${e} && ClaudeMock`,postLaunchNote:"ClaudeMock is a hermetic test provider; no manual seed is required.",lsCommand:`lmctl ls --provider ClaudeMock --sessiondir ${e}`}}forkHint(e){return"ClaudeMock does not support fork."}async fork(e,r){return{success:!1,error:"ClaudeMock does not support fork."}}async sendTurn(e,r){let n=Date.now(),s=jr.get(r.sessionId);if(s===void 0)throw new Error(`ClaudeMock session not found: ${r.sessionId}`);let o=new Date,i=`ClaudeMock ack: ${BN(e)}`;return s.messages.push({role:"user",timestamp:o,content:e}),s.messages.push({role:"assistant",timestamp:o,content:i,model:r.model??"claude-mock"}),s.modifiedAt=o,s.totalInputTokens+=qo(e),s.totalOutputTokens+=qo(i),r.onProgress?.({kind:"text",summary:"ClaudeMock deterministic reply"}),{text:i,sessionId:r.sessionId,durationMs:Math.max(1,Date.now()-n),stopReason:"mock_stop",numTurns:1,status:"ok"}}}});function vt(t){let e=[Jl({claudeDir:t?.claudeDir}),Vl({codexDir:t?.codexDir,codeDir:t?.codeDir}),Ql({geminiDir:t?.geminiDir,claudeDir:t?.claudeDir,codexDir:t?.codexDir,codeDir:t?.codeDir}),tc({copilotDir:t?.copilotDir}),ic(),cc({lmplayerDbPath:t?.lmplayerDbPath}),fc(),_c({agyDir:t?.agyDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&e.push(Ec()),e}var bc=E(()=>{"use strict";Xl();Kl();ec();rc();ac();uc();mc();gc();Tc();Xl();Kl();ec();rc();ac();uc();mc();gc();Tc()});var Ic={};re(Ic,{ProviderRegistry:()=>ns,TransportConnectionError:()=>ve,TransportError:()=>et,TransportJsonError:()=>vo,TransportProcessError:()=>Ht,TransportRpcError:()=>qt,_resetDefaultRegistryForTests:()=>HN,chat:()=>Xt,countTokens:()=>vc,createAdapterRegistry:()=>St,createAllAdapters:()=>vt,listSessions:()=>kc,seed:()=>Sc});function Xo(){return Jo===null&&(Jo=St(vt())),Jo}function HN(){Jo=null}function rh(t,e){let r=t.getAdapter(e);if(!r)throw new Error(`provider "${e}" is not registered in this registry`);return r}async function Xt(t){let e=t.registry??Xo(),r=rh(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 Sc(t){let e=t.registry??Xo(),r=rh(e,t.provider),n=await th(e,t.provider,t.cwd),s=await r.seed(t.cwd,{model:t.model,effort:t.effort,prompt:t.prompt});if(!s.success)return{success:!1,error:s.error};if(s.sessionId)return{success:!0,sessionId:s.sessionId};let o=await th(e,t.provider,t.cwd),i=qN(n,o);return i?{success:!0,sessionId:i}:{success:!0}}async function th(t,e,r){let n=await t.listAll({provider:e,workspace:r}),s=new Map;for(let o of n)s.set(o.sessionId,o.modifiedAt);return s}function qN(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 kc(t={}){return(t.registry??Xo()).listAll({provider:t.provider,workspace:t.workspace,limit:t.limit,from:t.from,to:t.to})}async function vc(t){let r=await(t.registry??Xo()).getSession(t.sessionId,t.provider);if(!r)throw new Error(`session "${t.sessionId}" not found`);let n=r.totalInputTokens??0,s=r.totalCachedInputTokens??0,o=r.totalCacheWriteInputTokens??0,i=r.totalOutputTokens??0,a=r.totalReasoningOutputTokens??0;return{provider:r.provider,sessionId:r.sessionId,input:n,cachedInput:s,cacheWriteInput:o,output:i,reasoningOutput:a,total:n+s+o+i+a,lastTurn:r.lastTokenUsage}}var Jo,It=E(()=>{"use strict";Dl();bc();Dl();bc();en();Jo=null});function JN(){return Nc===null&&(Nc=St(vt())),Nc}async function an(t){let{dal:e,team_member_id:r}=t,n=e!==void 0&&r!==void 0;n&&e.setMemberState(r,"in_chat");let s=!1,o;try{return await GN(t)}catch(i){throw s=!0,o=i,i}finally{if(n)if(!s)on.delete(r),e.setMemberState(r,"idle");else{let i=XN(o,r);e.setMemberState(r,i!==null?"attention_needed":"idle",i)}}}function XN(t,e){if(!(t instanceof Ie))return on.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=(on.get(e)??0)+1;return r>=3?(on.delete(e),"consecutive_timeouts"):(on.set(e,r),null)}return on.delete(e),null}async function GN(t){let e=t.timeoutMs,r=typeof e=="number"&&e>0,n=JN(),s;try{let u=await n.resolveSession(t.sessionid);if(!u)return Promise.reject(new Ie("other",null,`library: sessionid "${t.sessionid}" matched no registered provider`,xc(t.sessionid,t.sessiondir,"unresolved")));s=u.provider.name}catch(u){return Promise.reject(new Ie("other",null,`library: session resolution failed: ${nh(u)}`,xc(t.sessionid,t.sessiondir,"unresolved")))}let o=xc(t.sessionid,t.sessiondir,s),i=new AbortController,a=r?setTimeout(()=>i.abort(),e):null,l=!1;i.signal.addEventListener("abort",()=>{l=!0},{once:!0});let c=Date.now();try{let u=await Xt({provider:s,sessionId:t.sessionid,cwd:t.sessiondir,prompt:t.prompt,timeoutMs:0,signal:i.signal,registry:n,onProgress:t.onProgress,permissionMode:t.permissionMode});if(u.status==="stalled")throw new Ie("timeout",null,`library: stalled after ${u.stalledAfterMs??0}ms`,o);return{text:u.text,ms:Date.now()-c,exit_status:0,argv:o}}catch(u){throw l?new Ie("timeout",null,`library: wall-clock timeout after ${e??0}ms`,o):VN(u,o)}finally{a!==null&&clearTimeout(a)}}function xc(t,e,r){return["<library>","chat",t,e,"--provider",r]}function nh(t){return t instanceof Error?t.message:String(t)}function VN(t,e){if(t instanceof Ie)return t;if(t instanceof ve){let r=t.cause;return r?.code==="ENOENT_CWD"?new Ie("sessiondir_missing",null,t.message,e):r?.code==="ENOENT"?new Ie("enoent",null,t.message,e):new Ie("other",null,t.message,e)}return t instanceof Ht?new Ie("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof qt?new Ie("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof et?new Ie("other",null,t.message,e):new Ie("other",null,nh(t),e)}var Ie,Nc,on,ds=E(()=>{"use strict";It();Ie=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"}},Nc=null;on=new Map});function sh(){return Ac===null&&(Ac=St(vt())),Ac}function YN(t,e){if(!KN.test(t))return t;let r=e.getConfig(`workspace.${t}`);if(r===null||r.length===0)throw new xe("other",null,`workspace has no mapping for ${t}; run \`lmctl workspace init\` (or set workspace.${t} in lmctl_config)`,["<library>","seed","--provider",t]);return r}async function ln(t){let e=YN(t.member.provider,t.dal),r=e===t.member.provider?t.member:{...t.member,provider:e},n=await zN({member:r});return t.dal.setMemberProviderResolved(t.member.id,e),{sessionid:n.sessionid,provider_resolved:e}}async function zN(t){let e=t.member.provider,r=t.member.sessiondir,n=$c("seed",r,e);try{let s=await Sc({provider:e,cwd:r,registry:sh()});if(!s.success)throw QN(s.error,n);if(!s.sessionId)throw new xe("parse",0,"",n);return{sessionid:s.sessionId}}catch(s){throw s instanceof xe?s:Rc(s,n)}}async function oh(t){return ZN(t)}async function ZN(t){let e=sh(),r=$c("tokens",t.sessionid,"unresolved"),n;try{let o=await e.resolveSession(t.sessionid);if(!o)throw new xe("parse",0,`library: sessionid "${t.sessionid}" matched no registered provider`,r);n=o.provider.name}catch(o){throw o instanceof xe?o:Rc(o,r)}let s=$c("tokens",t.sessionid,n);try{let o=await vc({sessionId:t.sessionid,provider:n,registry:e});return{input_tokens:o.input,cache_tokens:o.cachedInput+o.cacheWriteInput,output_tokens:o.output,total_tokens:o.total}}catch(o){throw o instanceof xe?o:Rc(o,s)}}function $c(t,e,r){return["<library>",t,e,"--provider",r]}function QN(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 Rc(t,e){return t instanceof xe?t:t instanceof ve?t.cause?.code==="ENOENT"?new xe("enoent",null,t.message,e):new xe("other",null,t.message,e):t instanceof Ht?new xe("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof qt?new xe("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof et?new xe("other",null,t.message,e):new xe("other",null,t instanceof Error?t.message:String(t),e)}var xe,Ac,KN,Go=E(()=>{"use strict";It();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"}},Ac=null;KN=/^provider[123]$/});function Vo(t){return Buffer.from(t,"utf8").toString("base64url")}function ms(t){return Buffer.from(t,"base64url").toString("utf8")}async function ih(t,e=r=>oh({sessionid:r})){if(process.env.LMCTL_SESSION_SIZE_DISABLED==="1")return{recorded:0,failed:0};let r=0,n=0;for(let s of ex(t)){let o=s.member.sessionid;if(o!==null)try{let i=await e(o);t.recordSessionSize({team_name:s.team_name,alias:s.member.alias,sessionid:o,...i}),r+=1}catch(i){n+=1;try{t.raiseAttention({kind:"daemon_session_size_failed",severity:"warn",payload:JSON.stringify({team_name:s.team_name,alias:s.member.alias,sessionid:o,error:i instanceof Error?i.message:String(i)})})}catch{}}}return{recorded:r,failed:n}}async function ah(t,e,r){let n=lh(t,e,r);if(n===null||n.member.sessionid===null)throw new Error("session member not found");if(n.member.state!=="idle")throw new fs(r,n.member.state);t.setMemberState(n.member.id,"in_chat","compacting");try{return await an({sessionid:n.member.sessionid,sessiondir:n.member.sessiondir,prompt:"/compact"}),t.setMemberState(n.member.id,"idle",null),{ok:!0,row:ch(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 jc(t,e,r){let n=lh(t,e,r);if(n===null)throw new Error("session member not found");let s=await ln({member:n.member,dal:t});return t.updateTeamMemberSession(n.member.id,s.sessionid),{ok:!0,sessionid:s.sessionid,row:ch(t,e,r)}}function ex(t){return t.listTeams().flatMap(e=>t.listTeamMembers(e.id).filter(r=>r.sessionid!==null).map(r=>({team_name:e.name,member:r})))}function lh(t,e,r){let n=t.findTeamByName(e);if(n===null)return null;let s=t.findTeamMemberByAlias(n.id,r);return s===null?null:{team_name:n.name,member:s}}function ch(t,e,r){return t.sessionSizeHistory(e,r,1)[0]??null}var fs,Ko=E(()=>{"use strict";ds();Go();fs=class extends Error{constructor(e,r){super(`member ${e} is currently ${r}; cannot compact while busy`),this.name="MemberBusyError"}}});async function Oc(t){let e=t.dal,r=t.nowMs??Date.now(),n=t.thresholdMs??rx(e),s=r-n,o=e.query(`
1226
1225
  SELECT
1227
1226
  isess.id AS interactive_session_id,
1228
1227
  isess.run_id,
@@ -1251,7 +1250,7 @@ ${r}`:r}function M0(t){let e=[...t.matchAll(R0)];if(e.length>0){let r=e[e.length
1251
1250
  `),i={scanned:o.length,hung_detected:0,attentions_created:0,duplicates_suppressed:0};for(let a of o){let l=ox(a.workflow_definition,a.session_state_name,a.step_state_name);if(l===null)continue;let c=nx(e,a.team_id,l);if(c===null||c.sessionid===null)continue;let u=c.alias.toLowerCase()!=="lead",d=a.last_activity_at<s&&(a.last_event_at===null||a.last_event_at<s),f=a.started_at<s;if(!u||!d||!f)continue;let m={session_id:c.sessionid,step_id:a.step_id,member_alias:c.alias,provider:Ae(c),last_activity_at:a.last_activity_at,elapsed_ms:r-a.started_at,session_state:a.session_status,factors:{leaf:!0,no_activity:!0,elapsed:!0}};if(i.hung_detected+=1,sx(e,a.run_id,a.step_id,c.sessionid)){i.duplicates_suppressed+=1;continue}let p={run_id:a.run_id,project_id:a.project_id,payload:m};e.raiseAttention({kind:"session_hung",severity:"warn",project_id:a.project_id,run_id:a.run_id,requires_user:!0,payload:JSON.stringify(m)}),i.attentions_created+=1,t.enableKillHook===!0&&t.killHook!==void 0&&await t.killHook(p)}return i}function rx(t){return uh(t.getConfig(Yo),tx)*1e3}function Lc(t,e){return uh(t.getConfig(zo),e)}function uh(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 nx(t,e,r){return t.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",e,r)[0]??null}function sx(t,e,r,n){return t.query(`SELECT * FROM attention
1252
1251
  WHERE kind = 'session_hung'
1253
1252
  AND run_id = ?
1254
- AND acknowledged_at IS NULL`,e).some(o=>{let i=dh(o.payload);return i!==null&&i.step_id===r&&i.session_id===n})}function ox(t,e,r){let n=dh(t);return n===null?null:ix(n,e,r)??ax(n,e,r)}function ix(t,e,r){if(!Array.isArray(t.steps))return null;let n=t.steps.filter(lx),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 o=Or(s.members)?s.members:null,i=o!==null&&Or(o.agent)?o.agent:null;return typeof i?.alias=="string"?i.alias:null}function ax(t,e,r){if(!Or(t.states))return null;let n=t.states[e]??t.states[r];if(!Or(n))return null;let s=n;if(!Or(s.agent))return null;let o=s.agent;return typeof o.alias=="string"?o.alias:null}function lx(t){return Or(t)}function dh(t){if(t===null)return null;try{let e=JSON.parse(t);return Or(e)?e:null}catch{return null}}function Or(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var Yo,zo,tx,Cc=E(()=>{"use strict";Ue();Yo="monitor.session_hung.elapsed_threshold_seconds",zo="monitor.session_hung.check_interval_ms",tx=600});function Qo(t){let e=t.query(`
1253
+ AND acknowledged_at IS NULL`,e).some(o=>{let i=dh(o.payload);return i!==null&&i.step_id===r&&i.session_id===n})}function ox(t,e,r){let n=dh(t);return n===null?null:ix(n,e,r)??ax(n,e,r)}function ix(t,e,r){if(!Array.isArray(t.steps))return null;let n=t.steps.filter(lx),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 o=Or(s.members)?s.members:null,i=o!==null&&Or(o.agent)?o.agent:null;return typeof i?.alias=="string"?i.alias:null}function ax(t,e,r){if(!Or(t.states))return null;let n=t.states[e]??t.states[r];if(!Or(n))return null;let s=n;if(!Or(s.agent))return null;let o=s.agent;return typeof o.alias=="string"?o.alias:null}function lx(t){return Or(t)}function dh(t){if(t===null)return null;try{let e=JSON.parse(t);return Or(e)?e:null}catch{return null}}function Or(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var Yo,zo,tx,Cc=E(()=>{"use strict";We();Yo="monitor.session_hung.elapsed_threshold_seconds",zo="monitor.session_hung.check_interval_ms",tx=600});function Qo(t){let e=t.query(`
1255
1254
  SELECT status, COUNT(*) AS count FROM job GROUP BY status
1256
1255
  `),r={queued:Zo(e,"queued"),running:Zo(e,"running"),done:Zo(e,"done"),failed:Zo(e,"failed"),total:Dc(e)},n=t.query(`
1257
1256
  SELECT terminal_state, COUNT(*) AS count FROM run GROUP BY terminal_state
@@ -1292,14 +1291,14 @@ ${r}`:r}function M0(t){let e=[...t.matchAll(R0)];if(e.length>0){let r=e[e.length
1292
1291
  JOIN job j ON j.id = r.job_id
1293
1292
  WHERE j.project_id = ? AND s.ended_at IS NULL
1294
1293
  ${n!==null?"AND r.started_at >= ?":""}
1295
- GROUP BY s.state_name`,...f),p=new Map;for(let w of d){let k=p.get(w.state_name)??{lt5:0,btw5_15:0,btw15_60:0,gt60:0,noEnd:0},N=w.duration_ms;N<3e5?k.lt5++:N<9e5?k.btw5_15++:N<36e5?k.btw15_60++:k.gt60++,p.set(w.state_name,k)}for(let w of m){let k=p.get(w.state_name)??{lt5:0,btw5_15:0,btw15_60:0,gt60:0,noEnd:0};k.noEnd+=w.cnt,p.set(w.state_name,k)}let _=[...p.entries()].map(([w,k])=>({state_name:w,lt_5min:k.lt5,btw_5_15min:k.btw5_15,btw_15_60min:k.btw15_60,gt_60min:k.gt60,no_end:k.noEnd})),g=t.query(`SELECT s.state_name, s.run_id, COUNT(*) AS attempt_count
1294
+ GROUP BY s.state_name`,...f),p=new Map;for(let w of d){let k=p.get(w.state_name)??{lt5:0,btw5_15:0,btw15_60:0,gt60:0,noEnd:0},N=w.duration_ms;N<3e5?k.lt5++:N<9e5?k.btw5_15++:N<36e5?k.btw15_60++:k.gt60++,p.set(w.state_name,k)}for(let w of m){let k=p.get(w.state_name)??{lt5:0,btw5_15:0,btw15_60:0,gt60:0,noEnd:0};k.noEnd+=w.cnt,p.set(w.state_name,k)}let h=[...p.entries()].map(([w,k])=>({state_name:w,lt_5min:k.lt5,btw_5_15min:k.btw5_15,btw_15_60min:k.btw15_60,gt_60min:k.gt60,no_end:k.noEnd})),g=t.query(`SELECT s.state_name, s.run_id, COUNT(*) AS attempt_count
1296
1295
  FROM step s
1297
1296
  JOIN run r ON r.id = s.run_id
1298
1297
  JOIN job j ON j.id = r.job_id
1299
1298
  WHERE j.project_id = ?
1300
1299
  ${n!==null?"AND r.started_at >= ?":""}
1301
1300
  GROUP BY s.run_id, s.state_name
1302
- HAVING COUNT(*) > 1`,...s),h=new Map;for(let w of g){let k=h.get(w.state_name)??{runs:0,total_attempts:0};k.runs++,k.total_attempts+=w.attempt_count,h.set(w.state_name,k)}let b=[...h.entries()].map(([w,k])=>({state_name:w,retried_runs:k.runs,avg_retries:k.runs>0?Number((k.total_attempts/k.runs).toFixed(2)):0}));return{request_changes_rate:u,step_duration_histogram:_,retry_counts:b}}function Uc(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
1301
+ HAVING COUNT(*) > 1`,...s),_=new Map;for(let w of g){let k=_.get(w.state_name)??{runs:0,total_attempts:0};k.runs++,k.total_attempts+=w.attempt_count,_.set(w.state_name,k)}let b=[..._.entries()].map(([w,k])=>({state_name:w,retried_runs:k.runs,avg_retries:k.runs>0?Number((k.total_attempts/k.runs).toFixed(2)):0}));return{request_changes_rate:u,step_duration_histogram:h,retry_counts:b}}function Uc(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
1303
1302
  FROM session_event se
1304
1303
  JOIN run r ON r.id = se.run_id
1305
1304
  JOIN job j ON j.id = r.job_id
@@ -1339,22 +1338,22 @@ ${r}`:r}function M0(t){let e=[...t.matchAll(R0)];if(e.length>0){let r=e[e.length
1339
1338
  AND json_extract(payload, '$.elapsedMs') > 0
1340
1339
  AND payload_truncated = 0
1341
1340
  ORDER BY json_extract(payload, '$.tool') ASC,
1342
- json_extract(payload, '$.elapsedMs') ASC`,r),i=new Map;for(let l of o){let c=i.get(l.tool_name)??[];c.push(l.elapsed_ms),i.set(l.tool_name,c)}let a=new Map(s.map(l=>[l.tool_name,l.cnt]));return n.map(l=>{let c=a.get(l.tool_name)??0,u=i.get(l.tool_name)??[],d=u.length>0?u.reduce((p,_)=>p+_,0)/u.length:null,f=u.length>0?u[Math.floor(u.length*.5)]??null:null,m=u.length>0?u[Math.floor(u.length*.95)]??null:null;return{tool_name:l.tool_name,invocations:l.cnt,successes:c,hit_rate_pct:l.cnt>0?`${(c/l.cnt*100).toFixed(1)}%`:"0.0%",avg_latency_ms:d!==null?Math.round(d):null,p50_latency_ms:f,p95_latency_ms:m}})}function vh(t){try{let e=JSON.parse(t);if(e.schema_version==="lmctl/v3"&&Array.isArray(e.steps)){let r=[],n=new Map,s=new Map;for(let o of e.steps){let i=typeof o.id=="string"?o.id:null;i!==null&&(r.push(i),typeof o.type=="string"&&s.set(i,o.type),typeof o.name=="string"&&o.name.length>0&&n.set(o.name,i))}return{schema:"v3",nodes:r,nodeTypes:s,nameToId:n}}if(e.states!==null&&typeof e.states=="object"){let r=e.states,n=new Map;for(let[l,c]of Object.entries(r))if(c!==null&&typeof c=="object"){let u=c.type;typeof u=="string"&&n.set(l,u)}let s=typeof e.start_at=="string"?e.start_at:null,o=Object.keys(r),i=s!==null&&o.includes(s)?[s,...o.filter(l=>l!==s)]:o,a=e.terminals!==null&&typeof e.terminals=="object"?Object.keys(e.terminals).map(l=>`@terminal:${l}`):[];for(let l of a)n.set(l,"Terminal");return{schema:"v2",nodes:[...i,...a],nodeTypes:n,nameToId:new Map}}}catch{}return{schema:"unknown",nodes:[],nodeTypes:new Map,nameToId:new Map}}function un(t,e){let r=t.query("SELECT * FROM run WHERE id = ?",e)[0];if(r===void 0)return null;let n=t.query("SELECT * FROM workflow WHERE id = ?",r.workflow_id)[0]??null,s=(()=>{let g=t.query("SELECT * FROM job WHERE id = ?",r.job_id)[0];return g===void 0?null:t.query("SELECT * FROM project WHERE id = ?",g.project_id)[0]?.name??null})(),o=n!==null?vh(n.definition):{schema:"unknown",nodes:[],nodeTypes:new Map,nameToId:new Map},i=t.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",e),a=g=>o.schema==="v3"&&o.nameToId.has(g)?o.nameToId.get(g):g,l=new Map;for(let g of i)l.set(a(g.state_name),g);let c=t.query(`SELECT state_name, status, last_agent_output
1341
+ json_extract(payload, '$.elapsedMs') ASC`,r),i=new Map;for(let l of o){let c=i.get(l.tool_name)??[];c.push(l.elapsed_ms),i.set(l.tool_name,c)}let a=new Map(s.map(l=>[l.tool_name,l.cnt]));return n.map(l=>{let c=a.get(l.tool_name)??0,u=i.get(l.tool_name)??[],d=u.length>0?u.reduce((p,h)=>p+h,0)/u.length:null,f=u.length>0?u[Math.floor(u.length*.5)]??null:null,m=u.length>0?u[Math.floor(u.length*.95)]??null:null;return{tool_name:l.tool_name,invocations:l.cnt,successes:c,hit_rate_pct:l.cnt>0?`${(c/l.cnt*100).toFixed(1)}%`:"0.0%",avg_latency_ms:d!==null?Math.round(d):null,p50_latency_ms:f,p95_latency_ms:m}})}function vh(t){try{let e=JSON.parse(t);if(e.schema_version==="lmctl/v3"&&Array.isArray(e.steps)){let r=[],n=new Map,s=new Map;for(let o of e.steps){let i=typeof o.id=="string"?o.id:null;i!==null&&(r.push(i),typeof o.type=="string"&&s.set(i,o.type),typeof o.name=="string"&&o.name.length>0&&n.set(o.name,i))}return{schema:"v3",nodes:r,nodeTypes:s,nameToId:n}}if(e.states!==null&&typeof e.states=="object"){let r=e.states,n=new Map;for(let[l,c]of Object.entries(r))if(c!==null&&typeof c=="object"){let u=c.type;typeof u=="string"&&n.set(l,u)}let s=typeof e.start_at=="string"?e.start_at:null,o=Object.keys(r),i=s!==null&&o.includes(s)?[s,...o.filter(l=>l!==s)]:o,a=e.terminals!==null&&typeof e.terminals=="object"?Object.keys(e.terminals).map(l=>`@terminal:${l}`):[];for(let l of a)n.set(l,"Terminal");return{schema:"v2",nodes:[...i,...a],nodeTypes:n,nameToId:new Map}}}catch{}return{schema:"unknown",nodes:[],nodeTypes:new Map,nameToId:new Map}}function un(t,e){let r=t.query("SELECT * FROM run WHERE id = ?",e)[0];if(r===void 0)return null;let n=t.query("SELECT * FROM workflow WHERE id = ?",r.workflow_id)[0]??null,s=(()=>{let g=t.query("SELECT * FROM job WHERE id = ?",r.job_id)[0];return g===void 0?null:t.query("SELECT * FROM project WHERE id = ?",g.project_id)[0]?.name??null})(),o=n!==null?vh(n.definition):{schema:"unknown",nodes:[],nodeTypes:new Map,nameToId:new Map},i=t.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",e),a=g=>o.schema==="v3"&&o.nameToId.has(g)?o.nameToId.get(g):g,l=new Map;for(let g of i)l.set(a(g.state_name),g);let c=t.query(`SELECT state_name, status, last_agent_output
1343
1342
  FROM interactive_session
1344
1343
  WHERE run_id = ? AND status = 'waiting_operator'
1345
- ORDER BY id DESC LIMIT 1`,e)[0],u=c!==void 0?a(c.state_name):null,d=u,f=c?.last_agent_output??null;if(d===null){let g=i.find(h=>h.ended_at===null);g!==void 0?d=a(g.state_name):i.length>0?d=a(i[i.length-1].state_name):d=r.current_state}r.terminal_state!==null&&(d=`@terminal:${r.terminal_state}`,f=null);let m=new Set,p=[...o.nodes];for(let g of i){let h=a(g.state_name);!o.nodes.includes(h)&&!p.includes(h)&&p.push(h)}d!==null&&!p.includes(d)&&p.push(d);let _=[];for(let g of p){if(m.has(g))continue;m.add(g);let h=g===d,b=l.get(g),w="pending",k=null;if(g.startsWith("@terminal:"))w=r.terminal_state===g.slice(10)?"done":"pending";else if(b!==void 0&&(b.ended_at===null?w=h&&u===g?"paused":"running":b.outcome===null?w="failed":w="done",b.ended_at!==null)){let N=Date.parse(b.started_at),v=Date.parse(b.ended_at);!Number.isNaN(N)&&!Number.isNaN(v)&&(k=v-N)}h&&u===g&&(w="paused"),_.push({id:g,status:w,is_current:h,elapsed_ms:k,prompt:h&&w==="paused"?f:null,expected:h&&w==="paused"?"free_text":null})}return{run_id:e,workflow_name:n?.name??null,workflow_version:n?.version??null,workflow_version_id:r.workflow_version_id,project:s,paused:r.paused_at!==null&&r.terminal_state===null,terminal_state:r.terminal_state,current_state:d,nodes:_}}function si(t){let e=[],r=t.workflow_name??"?",n=t.workflow_version!==null?`v${t.workflow_version}`:"v?",s=t.terminal_state!==null?`terminal:${t.terminal_state}`:t.paused?"paused":"running";e.push(`run: ${t.run_id} (${r}, ${n}) - ${s}`),t.project!==null&&e.push(`project: ${t.project}`),e.push(""),e.push("workflow tree:");for(let o of t.nodes)e.push(...ux(o));return`${e.join(`
1344
+ ORDER BY id DESC LIMIT 1`,e)[0],u=c!==void 0?a(c.state_name):null,d=u,f=c?.last_agent_output??null;if(d===null){let g=i.find(_=>_.ended_at===null);g!==void 0?d=a(g.state_name):i.length>0?d=a(i[i.length-1].state_name):d=r.current_state}r.terminal_state!==null&&(d=`@terminal:${r.terminal_state}`,f=null);let m=new Set,p=[...o.nodes];for(let g of i){let _=a(g.state_name);!o.nodes.includes(_)&&!p.includes(_)&&p.push(_)}d!==null&&!p.includes(d)&&p.push(d);let h=[];for(let g of p){if(m.has(g))continue;m.add(g);let _=g===d,b=l.get(g),w="pending",k=null;if(g.startsWith("@terminal:"))w=r.terminal_state===g.slice(10)?"done":"pending";else if(b!==void 0&&(b.ended_at===null?w=_&&u===g?"paused":"running":b.outcome===null?w="failed":w="done",b.ended_at!==null)){let N=Date.parse(b.started_at),v=Date.parse(b.ended_at);!Number.isNaN(N)&&!Number.isNaN(v)&&(k=v-N)}_&&u===g&&(w="paused"),h.push({id:g,status:w,is_current:_,elapsed_ms:k,prompt:_&&w==="paused"?f:null,expected:_&&w==="paused"?"free_text":null})}return{run_id:e,workflow_name:n?.name??null,workflow_version:n?.version??null,workflow_version_id:r.workflow_version_id,project:s,paused:r.paused_at!==null&&r.terminal_state===null,terminal_state:r.terminal_state,current_state:d,nodes:h}}function si(t){let e=[],r=t.workflow_name??"?",n=t.workflow_version!==null?`v${t.workflow_version}`:"v?",s=t.terminal_state!==null?`terminal:${t.terminal_state}`:t.paused?"paused":"running";e.push(`run: ${t.run_id} (${r}, ${n}) - ${s}`),t.project!==null&&e.push(`project: ${t.project}`),e.push(""),e.push("workflow tree:");for(let o of t.nodes)e.push(...ux(o));return`${e.join(`
1346
1345
  `)}
1347
- `}function ux(t){let e=[],r=dx(t.status),n=[];t.status==="done"&&t.elapsed_ms!==null?n.push(`done, ${(t.elapsed_ms/1e3).toFixed(1)}s`):t.status==="failed"?n.push("failed"):t.status==="paused"?n.push("paused, waiting for operator input"):t.status==="running"?n.push("running"):t.status==="pending"&&n.push("pending");let s=n.length>0?`(${n.join(", ")})`:"",o=t.is_current?" <- CURRENT":"",i=t.id.padEnd(28);if(e.push(` ${r} ${i} ${s}${o}`.trimEnd()),t.is_current&&t.status==="paused"&&t.prompt!==null){let a=t.prompt.split(/\r?\n/)[0]??"",l=a.length>80?`${a.slice(0,80)}...`:a;e.push(` \u2514 prompt: "${l}"`),t.expected!==null&&e.push(` \u2514 expected: ${t.expected}`)}return e}function dx(t){switch(t){case"done":return"[x]";case"failed":return"[!]";case"paused":return"[*]";case"running":return"[>]";case"pending":return"[ ]";default:return" "}}function oi(t,e,r={}){let n=r.nowMs??Date.now(),s=t.query("SELECT * FROM run WHERE id = ?",e)[0];if(s===void 0)return null;let o=t.query("SELECT * FROM workflow WHERE id = ?",s.workflow_id)[0]??null,i=s.workflow_version_id===null?null:t.query("SELECT version FROM workflow_version WHERE id = ?",s.workflow_version_id)[0]??null,a=t.query("SELECT * FROM job WHERE id = ?",s.job_id)[0]??null,l=a===null?null:t.query("SELECT * FROM project WHERE id = ?",a.project_id)[0]??null,c=o!==null?vh(o.definition):{schema:"unknown",nodes:[],nodeTypes:new Map,nameToId:new Map},u=N=>c.schema==="v3"&&c.nameToId.has(N)?c.nameToId.get(N):N,d=t.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",e),f=new Map;for(let N of d)f.set(u(N.state_name),N);let m=t.query("SELECT * FROM interactive_session WHERE run_id = ? ORDER BY id ASC",e),p=new Map;for(let N of m)p.set(u(N.state_name),N);let _=new Map,g=t.query("SELECT MAX(timestamp_ms) AS timestamp_ms FROM session_event WHERE run_id = ? AND step_id IS NULL",e)[0]?.timestamp_ms??null;for(let N of t.query(`SELECT step_id, MAX(timestamp_ms) AS timestamp_ms
1346
+ `}function ux(t){let e=[],r=dx(t.status),n=[];t.status==="done"&&t.elapsed_ms!==null?n.push(`done, ${(t.elapsed_ms/1e3).toFixed(1)}s`):t.status==="failed"?n.push("failed"):t.status==="paused"?n.push("paused, waiting for operator input"):t.status==="running"?n.push("running"):t.status==="pending"&&n.push("pending");let s=n.length>0?`(${n.join(", ")})`:"",o=t.is_current?" <- CURRENT":"",i=t.id.padEnd(28);if(e.push(` ${r} ${i} ${s}${o}`.trimEnd()),t.is_current&&t.status==="paused"&&t.prompt!==null){let a=t.prompt.split(/\r?\n/)[0]??"",l=a.length>80?`${a.slice(0,80)}...`:a;e.push(` \u2514 prompt: "${l}"`),t.expected!==null&&e.push(` \u2514 expected: ${t.expected}`)}return e}function dx(t){switch(t){case"done":return"[x]";case"failed":return"[!]";case"paused":return"[*]";case"running":return"[>]";case"pending":return"[ ]";default:return" "}}function oi(t,e,r={}){let n=r.nowMs??Date.now(),s=t.query("SELECT * FROM run WHERE id = ?",e)[0];if(s===void 0)return null;let o=t.query("SELECT * FROM workflow WHERE id = ?",s.workflow_id)[0]??null,i=s.workflow_version_id===null?null:t.query("SELECT version FROM workflow_version WHERE id = ?",s.workflow_version_id)[0]??null,a=t.query("SELECT * FROM job WHERE id = ?",s.job_id)[0]??null,l=a===null?null:t.query("SELECT * FROM project WHERE id = ?",a.project_id)[0]??null,c=o!==null?vh(o.definition):{schema:"unknown",nodes:[],nodeTypes:new Map,nameToId:new Map},u=N=>c.schema==="v3"&&c.nameToId.has(N)?c.nameToId.get(N):N,d=t.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",e),f=new Map;for(let N of d)f.set(u(N.state_name),N);let m=t.query("SELECT * FROM interactive_session WHERE run_id = ? ORDER BY id ASC",e),p=new Map;for(let N of m)p.set(u(N.state_name),N);let h=new Map,g=t.query("SELECT MAX(timestamp_ms) AS timestamp_ms FROM session_event WHERE run_id = ? AND step_id IS NULL",e)[0]?.timestamp_ms??null;for(let N of t.query(`SELECT step_id, MAX(timestamp_ms) AS timestamp_ms
1348
1347
  FROM session_event
1349
1348
  WHERE run_id = ? AND step_id IS NOT NULL
1350
- GROUP BY step_id`,e))N.step_id!==null&&_.set(N.step_id,N.timestamp_ms);let h=fx(c,d,u),b=mx(s.current_state),w=t.query(`SELECT kind, severity, payload
1349
+ GROUP BY step_id`,e))N.step_id!==null&&h.set(N.step_id,N.timestamp_ms);let _=fx(c,d,u),b=mx(s.current_state),w=t.query(`SELECT kind, severity, payload
1351
1350
  FROM attention
1352
1351
  WHERE run_id = ?
1353
1352
  AND kind = 'session_hung'
1354
1353
  AND acknowledged_at IS NULL
1355
- ORDER BY id ASC`,e).map(N=>({kind:N.kind,severity:N.severity,payload:Ex(N.payload)})),k=h.map(N=>{let v=f.get(N),R=p.get(N),G=px(s,N,b,v,R),M=v===void 0?null:Date.parse(v.started_at),L=v?.ended_at===null||v===void 0?null:Date.parse(v.ended_at),$=v===void 0||Number.isNaN(M??NaN)?null:L!==null&&!Number.isNaN(L)?L-M:G==="running"||G==="paused"?n-M:null,Z=v===void 0?null:_.get(v.id)??null,J=Tx(R?.last_activity_at??null,Z,g),I=o===null||R===void 0?void 0:gx(t,s.team_id,o.definition,R.state_name,v?.state_name??N);return{step_id:v?.id??null,state_id:N,status:G,started_at:v?.started_at??null,ended_at:v?.ended_at??null,last_activity_at:J,elapsed_ms:$,...I!==void 0?{member:I}:{},...R!==void 0?{interactive_session:{id:R.id,status:R.status,turn_count:R.turn_count,state_name:R.state_name}}:{}}});return{run_id:e,workflow_name:o?.name??null,workflow_version:i?.version??o?.version??null,workflow_version_id:s.workflow_version_id,project:l?.name??null,status:_x(s,a,k),submitted_at:a?.enqueued_at??s.started_at,nodes:k,current_node_index:hx(k,s.terminal_state!==null),related_attentions:w}}function ii(t,e={}){let r=e.nowMs??Date.now(),n=[],s=t.workflow_name??"?",o=t.workflow_version!==null?`v${t.workflow_version}`:"v?";n.push(`run ${t.run_id} - ${s}, ${o} - ${t.status}`);let i=`${t.submitted_at} (${mh(Date.parse(t.submitted_at),r)} ago)`;n.push(`project: ${t.project??"?"} | submitted: ${i}`),n.push(""),n.push("timeline:"),n.push(`${fh(t.submitted_at,t.submitted_at)} submit`);for(let a of t.nodes){let l=a.started_at===null?"[ ]":fh(t.submitted_at,a.started_at),c=a.status.padEnd(7),u=a.elapsed_ms===null?"":` elapsed ${ai(a.elapsed_ms)}`;if(n.push(`${l} ${a.state_id.padEnd(24)} ${c}${u}`.trimEnd()),a.interactive_session!==void 0){let d=a.last_activity_at===null?"last activity unknown":`last activity ${mh(a.last_activity_at,r)} ago`,f=a.member!==void 0?`${a.member.alias} member`:"interactive member";n.push(` ${" ".repeat(24)} ${d}`),n.push(` ${" ".repeat(24)} ${f}, ${a.interactive_session.status}`)}}if(t.related_attentions.length>0){n.push(""),n.push("attentions:");for(let a of t.related_attentions)n.push(`- ${a.kind}${bx(a.payload)}`)}return`${n.join(`
1354
+ ORDER BY id ASC`,e).map(N=>({kind:N.kind,severity:N.severity,payload:Ex(N.payload)})),k=_.map(N=>{let v=f.get(N),R=p.get(N),G=px(s,N,b,v,R),M=v===void 0?null:Date.parse(v.started_at),L=v?.ended_at===null||v===void 0?null:Date.parse(v.ended_at),$=v===void 0||Number.isNaN(M??NaN)?null:L!==null&&!Number.isNaN(L)?L-M:G==="running"||G==="paused"?n-M:null,Z=v===void 0?null:h.get(v.id)??null,J=Tx(R?.last_activity_at??null,Z,g),I=o===null||R===void 0?void 0:gx(t,s.team_id,o.definition,R.state_name,v?.state_name??N);return{step_id:v?.id??null,state_id:N,status:G,started_at:v?.started_at??null,ended_at:v?.ended_at??null,last_activity_at:J,elapsed_ms:$,...I!==void 0?{member:I}:{},...R!==void 0?{interactive_session:{id:R.id,status:R.status,turn_count:R.turn_count,state_name:R.state_name}}:{}}});return{run_id:e,workflow_name:o?.name??null,workflow_version:i?.version??o?.version??null,workflow_version_id:s.workflow_version_id,project:l?.name??null,status:_x(s,a,k),submitted_at:a?.enqueued_at??s.started_at,nodes:k,current_node_index:hx(k,s.terminal_state!==null),related_attentions:w}}function ii(t,e={}){let r=e.nowMs??Date.now(),n=[],s=t.workflow_name??"?",o=t.workflow_version!==null?`v${t.workflow_version}`:"v?";n.push(`run ${t.run_id} - ${s}, ${o} - ${t.status}`);let i=`${t.submitted_at} (${mh(Date.parse(t.submitted_at),r)} ago)`;n.push(`project: ${t.project??"?"} | submitted: ${i}`),n.push(""),n.push("timeline:"),n.push(`${fh(t.submitted_at,t.submitted_at)} submit`);for(let a of t.nodes){let l=a.started_at===null?"[ ]":fh(t.submitted_at,a.started_at),c=a.status.padEnd(7),u=a.elapsed_ms===null?"":` elapsed ${ai(a.elapsed_ms)}`;if(n.push(`${l} ${a.state_id.padEnd(24)} ${c}${u}`.trimEnd()),a.interactive_session!==void 0){let d=a.last_activity_at===null?"last activity unknown":`last activity ${mh(a.last_activity_at,r)} ago`,f=a.member!==void 0?`${a.member.alias} member`:"interactive member";n.push(` ${" ".repeat(24)} ${d}`),n.push(` ${" ".repeat(24)} ${f}, ${a.interactive_session.status}`)}}if(t.related_attentions.length>0){n.push(""),n.push("attentions:");for(let a of t.related_attentions)n.push(`- ${a.kind}${bx(a.payload)}`)}return`${n.join(`
1356
1355
  `)}
1357
- `}function fx(t,e,r){let n=t.nodes.filter(s=>s.startsWith("@terminal:")?!1:t.nodeTypes.get(s)!=="lmctl/terminal"&&t.nodeTypes.get(s)!=="Terminal");for(let s of e){let o=r(s.state_name);n.includes(o)||n.push(o)}return n}function mx(t){return t===null?null:t.startsWith("__paused__:")?t.slice(11):t}function px(t,e,r,n,s){return n===void 0?"pending":n.ended_at===null?s?.status==="waiting_operator"||t.paused_at!==null&&r===e?"paused":"running":n.outcome===null?"failed":"done"}function hx(t,e){if(t.length===0)return null;let r=t.findIndex(s=>s.status==="running"||s.status==="paused"||s.status==="failed");if(r>=0)return r;if(e){for(let s=t.length-1;s>=0;s-=1)if(t[s].status==="done")return s}let n=t.findIndex(s=>s.status==="pending");return n>=0?n:t.length-1}function _x(t,e,r){return t.terminal_state!==null?t.terminal_state:t.paused_at!==null?"paused":e?.status==="failed"||r.some(n=>n.status==="failed")?"failed":"running"}function gx(t,e,r,n,s){let o=yx(r,n,s);if(o===null)return;let i=t.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",e,o)[0];return i===void 0?void 0:{alias:i.alias,provider:Ae(i)}}function yx(t,e,r){let n=wx(t);if(n===null)return null;if(Array.isArray(n.steps)){let s=n.steps.find(a=>cr(a)?a.id===e||a.name===e||a.name===r:!1),o=cr(s?.members)?s.members:null,i=o!==null&&cr(o.agent)?o.agent:null;return typeof i?.alias=="string"?i.alias:null}if(cr(n.states)){let s=n.states[e]??n.states[r];if(!cr(s))return null;let o=cr(s.agent)?s.agent:null;return typeof o?.alias=="string"?o.alias:null}return null}function wx(t){try{let e=JSON.parse(t);return cr(e)?e:null}catch{return null}}function Ex(t){if(t===null)return null;try{return JSON.parse(t)}catch{return t}}function cr(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Tx(...t){let e=t.filter(r=>r!==null&&Number.isFinite(r));return e.length===0?null:Math.max(...e)}function fh(t,e){let r=Date.parse(t),n=Date.parse(e);return Number.isNaN(r)||Number.isNaN(n)?"[+? ]":`[+${ai(Math.max(0,n-r)).padEnd(6)}]`}function mh(t,e){return Number.isNaN(t)?"?":ai(Math.max(0,e-t))}function ai(t){let e=Math.max(0,Math.round(t/1e3));if(e<60)return`${e}s`;let r=Math.floor(e/60),n=e%60;if(r<60)return n===0?`${r}m`:`${r}m${n}s`;let s=Math.floor(r/60),o=r%60;return o===0?`${s}h`:`${s}h${o}m`}function bx(t){if(!cr(t))return"";let e=typeof t.step_id=="number"?` on step ${t.step_id}`:"",r=typeof t.member_alias=="string"?t.member_alias:null,n=typeof t.provider=="string"?t.provider:null,s=typeof t.elapsed_ms=="number"?`, ${ai(t.elapsed_ms)} elapsed`:"",o=r===null?"":` (${r}${n===null?"":` ${n}`}${s})`;return`${e}${o}`}var bh,Gt=E(()=>{"use strict";Ue();bh=`SELECT a.id AS attention_id,
1356
+ `}function fx(t,e,r){let n=t.nodes.filter(s=>s.startsWith("@terminal:")?!1:t.nodeTypes.get(s)!=="lmctl/terminal"&&t.nodeTypes.get(s)!=="Terminal");for(let s of e){let o=r(s.state_name);n.includes(o)||n.push(o)}return n}function mx(t){return t===null?null:t.startsWith("__paused__:")?t.slice(11):t}function px(t,e,r,n,s){return n===void 0?"pending":n.ended_at===null?s?.status==="waiting_operator"||t.paused_at!==null&&r===e?"paused":"running":n.outcome===null?"failed":"done"}function hx(t,e){if(t.length===0)return null;let r=t.findIndex(s=>s.status==="running"||s.status==="paused"||s.status==="failed");if(r>=0)return r;if(e){for(let s=t.length-1;s>=0;s-=1)if(t[s].status==="done")return s}let n=t.findIndex(s=>s.status==="pending");return n>=0?n:t.length-1}function _x(t,e,r){return t.terminal_state!==null?t.terminal_state:t.paused_at!==null?"paused":e?.status==="failed"||r.some(n=>n.status==="failed")?"failed":"running"}function gx(t,e,r,n,s){let o=yx(r,n,s);if(o===null)return;let i=t.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",e,o)[0];return i===void 0?void 0:{alias:i.alias,provider:Ae(i)}}function yx(t,e,r){let n=wx(t);if(n===null)return null;if(Array.isArray(n.steps)){let s=n.steps.find(a=>cr(a)?a.id===e||a.name===e||a.name===r:!1),o=cr(s?.members)?s.members:null,i=o!==null&&cr(o.agent)?o.agent:null;return typeof i?.alias=="string"?i.alias:null}if(cr(n.states)){let s=n.states[e]??n.states[r];if(!cr(s))return null;let o=cr(s.agent)?s.agent:null;return typeof o?.alias=="string"?o.alias:null}return null}function wx(t){try{let e=JSON.parse(t);return cr(e)?e:null}catch{return null}}function Ex(t){if(t===null)return null;try{return JSON.parse(t)}catch{return t}}function cr(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Tx(...t){let e=t.filter(r=>r!==null&&Number.isFinite(r));return e.length===0?null:Math.max(...e)}function fh(t,e){let r=Date.parse(t),n=Date.parse(e);return Number.isNaN(r)||Number.isNaN(n)?"[+? ]":`[+${ai(Math.max(0,n-r)).padEnd(6)}]`}function mh(t,e){return Number.isNaN(t)?"?":ai(Math.max(0,e-t))}function ai(t){let e=Math.max(0,Math.round(t/1e3));if(e<60)return`${e}s`;let r=Math.floor(e/60),n=e%60;if(r<60)return n===0?`${r}m`:`${r}m${n}s`;let s=Math.floor(r/60),o=r%60;return o===0?`${s}h`:`${s}h${o}m`}function bx(t){if(!cr(t))return"";let e=typeof t.step_id=="number"?` on step ${t.step_id}`:"",r=typeof t.member_alias=="string"?t.member_alias:null,n=typeof t.provider=="string"?t.provider:null,s=typeof t.elapsed_ms=="number"?`, ${ai(t.elapsed_ms)} elapsed`:"",o=r===null?"":` (${r}${n===null?"":` ${n}`}${s})`;return`${e}${o}`}var bh,Gt=E(()=>{"use strict";We();bh=`SELECT a.id AS attention_id,
1358
1357
  a.kind AS kind,
1359
1358
  a.severity AS severity,
1360
1359
  a.created_at AS created_at,
@@ -1440,38 +1439,38 @@ ${r}`:r}function M0(t){let e=[...t.matchAll(R0)];if(e.length>0){let r=e[e.length
1440
1439
  `),2):c==="create"?dA(l,u,e,s):c==="claim"?fA(l,u,e,s):c==="claim-next"?mA(l,u,e,s):c==="close"?pA(l,u,e,s):c==="reopen"?hA(l,u,e,s):c==="list"?wA(l,u,e,s):c==="show"?EA(l,u,e,s):(e.stderr.write(`error: --direct does not support: issues ${c} (supported: list, show, create, claim, claim-next, close, reopen)
1441
1440
  `),2)}return o==="status"?TA(l,i,e,s):o==="projects"?bA(l,i,e,s):o==="workflows"?SA(l,i,e,s):o==="runs"?kA(l,i,e,s):o==="attentions"||o==="attention"?$A(l,i,e,s):o==="escalations"?Uh(l,i,e):(e.stderr.write(`error: --direct is not supported for: ${o} (supported: issues, status, projects, workflows, runs, attentions, escalations, run where, run timeline)
1442
1441
  `),2)}catch(c){return e.stderr.write(`error: ${c instanceof Error?c.message:String(c)}
1443
- `),1}finally{a&&l.close()}}function Ke(t,e,r){t.stdout.write(`${r?JSON.stringify(e,null,2):JSON.stringify(e)}
1442
+ `),1}finally{a&&l.close()}}function Ye(t,e,r){t.stdout.write(`${r?JSON.stringify(e,null,2):JSON.stringify(e)}
1444
1443
  `)}function dA(t,e,r,n){let s=Lh(e,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
1445
1444
  `),2;let o=decodeURIComponent(s.path.replace(/^\/api\/projects\//,"").replace(/\/issues$/,"")),i=t.findProjectByName(o);if(i===null)return r.stderr.write(`error: project not found: ${o}
1446
1445
  `),1;let a=JSON.parse(s.body),l=_A(a.severity);if(typeof l=="object"&&l!==null&&"error"in l)return r.stderr.write(`error: ${l.error}
1447
1446
  `),2;let c=gA(a.labels);if(typeof c=="string"&&c.startsWith("error:"))return r.stderr.write(`error: ${c.slice(6)}
1448
- `),2;let u=t.createIssue({project_id:i.id,title:a.title,body:a.body,...l!==void 0?{severity:l}:{},labels:c,ai_test_path:typeof a.ai_test_path=="string"?a.ai_test_path:null,source_run_id:typeof a.source_run_id=="number"?a.source_run_id:null});return Ke(r,u,n),0}function fA(t,e,r,n){let s=Ch(e,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
1447
+ `),2;let u=t.createIssue({project_id:i.id,title:a.title,body:a.body,...l!==void 0?{severity:l}:{},labels:c,ai_test_path:typeof a.ai_test_path=="string"?a.ai_test_path:null,source_run_id:typeof a.source_run_id=="number"?a.source_run_id:null});return Ye(r,u,n),0}function fA(t,e,r,n){let s=Ch(e,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
1449
1448
  `),2;let o=Number(s.path.match(/\/api\/issues\/(\d+)\/claim$/)[1]),i=JSON.parse(s.body),a=t.getIssue(o);if(a===null)return r.stderr.write(`error: issue not found: ${o}
1450
1449
  `),1;let l=t.claimIssue(o,i.assigned_run_id);return l===null?(r.stderr.write(`error: issue ${o} is not in a claimable state (status=${a.status})
1451
- `),1):(Ke(r,l,n),0)}function mA(t,e,r,n){let s=Mh(e,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
1450
+ `),1):(Ye(r,l,n),0)}function mA(t,e,r,n){let s=Mh(e,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
1452
1451
  `),2;let o=decodeURIComponent(s.path.replace(/^\/api\/projects\//,"").replace(/\/issues\/claim-next$/,"")),i=t.findProjectByName(o);if(i===null)return r.stderr.write(`error: project not found: ${o}
1453
- `),1;let a=JSON.parse(s.body),l=t.claimNextIssue(i.id,a.assigned_run_id);return l===null?(Ke(r,{status:"queue_empty"},n),1):(Ke(r,l,n),0)}function pA(t,e,r,n){let s=Dh(e,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
1452
+ `),1;let a=JSON.parse(s.body),l=t.claimNextIssue(i.id,a.assigned_run_id);return l===null?(Ye(r,{status:"queue_empty"},n),1):(Ye(r,l,n),0)}function pA(t,e,r,n){let s=Dh(e,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
1454
1453
  `),2;let o=Number(s.path.match(/\/api\/issues\/(\d+)\/close$/)[1]),i=JSON.parse(s.body),a=t.getIssue(o);if(a===null)return r.stderr.write(`error: issue not found: ${o}
1455
1454
  `),1;let l=typeof i.closed_run_id=="number"?i.closed_run_id:a.assigned_run_id;if(l===null)return r.stderr.write(`error: missing closed_run_id
1456
- `),2;let c=t.closeIssue(o,l,typeof i.commit_hash=="string"?i.commit_hash:null);return Ke(r,c,n),0}function hA(t,e,r,n){let s=Ph(e,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
1455
+ `),2;let c=t.closeIssue(o,l,typeof i.commit_hash=="string"?i.commit_hash:null);return Ye(r,c,n),0}function hA(t,e,r,n){let s=Ph(e,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
1457
1456
  `),2;let o=Number(s.path.match(/\/api\/issues\/(\d+)\/reopen$/)[1]),i=JSON.parse(s.body),a=t.getIssue(o);if(a===null)return r.stderr.write(`error: issue not found: ${o}
1458
1457
  `),1;let l=typeof i.source_run_id=="number"?i.source_run_id:a.closed_run_id??a.source_run_id;if(l===null)return r.stderr.write(`error: missing source_run_id
1459
- `),2;let c=t.reopenIssue(o,l);return Ke(r,c,n),0}function _A(t){if(t!=null)return typeof t=="string"&&Ah.includes(t)?t:{error:`invalid severity: ${String(t)}`}}function gA(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 wA(t,e,r,n){let[s,...o]=e;if(s===void 0||s.startsWith("--"))return r.stderr.write(`error: usage: lmctl api --direct issues list <project> [--status STATUS] [--severity SEVERITY] [--ai-test-path P]
1458
+ `),2;let c=t.reopenIssue(o,l);return Ye(r,c,n),0}function _A(t){if(t!=null)return typeof t=="string"&&Ah.includes(t)?t:{error:`invalid severity: ${String(t)}`}}function gA(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 wA(t,e,r,n){let[s,...o]=e;if(s===void 0||s.startsWith("--"))return r.stderr.write(`error: usage: lmctl api --direct issues list <project> [--status STATUS] [--severity SEVERITY] [--ai-test-path P]
1460
1459
  `),2;let i,a,l;for(let d=0;d<o.length;d+=1){let f=o[d],m=o[++d];if(m===void 0||m.startsWith("--"))return r.stderr.write(`error: missing value for ${f}
1461
1460
  `),2;if(f==="--status"){let p=xh(m,yA);if(typeof p=="string")return r.stderr.write(`error: ${p}
1462
1461
  `),2;i=p}else if(f==="--severity"){let p=xh(m,Ah);if(typeof p=="string")return r.stderr.write(`error: ${p}
1463
1462
  `),2;a=p}else if(f==="--ai-test-path")l=m;else return r.stderr.write(`error: ${se(f)}
1464
1463
  `),2}let c=t.findProjectByName(s);if(c===null)return r.stderr.write(`error: project not found: ${s}
1465
- `),1;let u=t.listIssues(c.id,{...i!==void 0?{status:i}:{},...a!==void 0?{severity:a}:{},...l!==void 0?{ai_test_path:l}:{}});return Ke(r,u,n),0}function EA(t,e,r,n){if(e.length!==1)return r.stderr.write(`error: usage: lmctl api --direct issues show <id>
1464
+ `),1;let u=t.listIssues(c.id,{...i!==void 0?{status:i}:{},...a!==void 0?{severity:a}:{},...l!==void 0?{ai_test_path:l}:{}});return Ye(r,u,n),0}function EA(t,e,r,n){if(e.length!==1)return r.stderr.write(`error: usage: lmctl api --direct issues show <id>
1466
1465
  `),2;let s=oe(e[0],"id");if(typeof s=="string")return r.stderr.write(`error: ${s}
1467
1466
  `),2;let o=t.getIssue(s);return o===null?(r.stderr.write(`error: issue not found: ${s}
1468
- `),1):(Ke(r,o,n),0)}function TA(t,e,r,n){return e.length>0?(r.stderr.write(`error: ${se(e[0])}
1469
- `),2):(Ke(r,Qo(t),n),0)}function bA(t,e,r,n){return e.length>0?(r.stderr.write(`error: ${se(e[0])}
1470
- `),2):(Ke(r,ei(t),n),0)}function SA(t,e,r,n){return e.length>0?(r.stderr.write(`error: ${se(e[0])}
1471
- `),2):(Ke(r,ti(t),n),0)}function kA(t,e,r,n){let s;for(let o=0;o<e.length;o+=1){let i=e[o],a=e[++o];if(a===void 0||a.startsWith("--"))return r.stderr.write(`error: missing value for ${i}
1467
+ `),1):(Ye(r,o,n),0)}function TA(t,e,r,n){return e.length>0?(r.stderr.write(`error: ${se(e[0])}
1468
+ `),2):(Ye(r,Qo(t),n),0)}function bA(t,e,r,n){return e.length>0?(r.stderr.write(`error: ${se(e[0])}
1469
+ `),2):(Ye(r,ei(t),n),0)}function SA(t,e,r,n){return e.length>0?(r.stderr.write(`error: ${se(e[0])}
1470
+ `),2):(Ye(r,ti(t),n),0)}function kA(t,e,r,n){let s;for(let o=0;o<e.length;o+=1){let i=e[o],a=e[++o];if(a===void 0||a.startsWith("--"))return r.stderr.write(`error: missing value for ${i}
1472
1471
  `),2;if(i==="--limit"){if(!/^\d+$/.test(a)||Number(a)<=0)return r.stderr.write(`error: invalid --limit: ${a}
1473
1472
  `),2;s=Number(a)}else return r.stderr.write(`error: ${se(i)}
1474
- `),2}return Ke(r,cn(t,s!==void 0?{limit:s}:{}),n),0}function vA(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`error: usage: lmctl api --direct run where <run_id> [--json]
1473
+ `),2}return Ye(r,cn(t,s!==void 0?{limit:s}:{}),n),0}function vA(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`error: usage: lmctl api --direct run where <run_id> [--json]
1475
1474
  `),2;if(!/^\d+$/.test(r)||Number(r)<=0)return e.stderr.write(`error: invalid run_id: ${r}
1476
1475
  `),2;let s=!1;for(let a of n){if(a==="--json"){s=!0;continue}return e.stderr.write(`error: ${se(a)}
1477
1476
  `),2}let o=e.dal===void 0,i=e.dal??ge({path:le()});try{let a=un(i,Number(r));return a===null?(e.stderr.write(`error: run not found: ${r}
@@ -1501,7 +1500,7 @@ ${r}`:r}function M0(t){let e=[...t.matchAll(R0)];if(e.length>0){let r=e[e.length
1501
1500
  `):(e.stdout.write(await i.text()),i.headers.get("content-type")?.includes("text/plain")||e.stdout.write(`
1502
1501
  `)),0):(e.stderr.write(`error: HTTP ${i.status}: ${await i.text()}
1503
1502
  `),i.status===400?2:1)}function $A(t,e,r,n){let s=!1;for(let o of e){if(o==="--unacked"){s=!0;continue}return r.stderr.write(`error: ${se(o)}
1504
- `),2}return Ke(r,ur(t,{unacked:s}),n),0}function Uh(t,e,r){let[n,...s]=e;if(n===void 0)return r.stderr.write(`error: --direct escalations requires a subcommand (list|show|respond)
1503
+ `),2}return Ye(r,ur(t,{unacked:s}),n),0}function Uh(t,e,r){let[n,...s]=e;if(n===void 0)return r.stderr.write(`error: --direct escalations requires a subcommand (list|show|respond)
1505
1504
  `),2;if(n==="list"){let o=Rh(s);if(typeof o=="string")return r.stderr.write(`error: ${o}
1506
1505
  `),2;let i={all:o.all};o.project!==void 0&&(i.project=o.project),o.since!==void 0&&(i.since=o.since);let a=ni(t,i);return jh(a,o.json,r)}if(n==="show"){let o=s.filter(l=>l!=="--json"&&l!=="--text");if(o.length!==1)return r.stderr.write(`usage: lmctl api --direct escalations show <attention_id> [--json|--text]
1507
1506
  `),2;let i=oe(o[0],"attention_id");if(typeof i=="string")return r.stderr.write(`error: ${i}
@@ -1513,7 +1512,7 @@ ${r}`:r}function M0(t){let e=[...t.matchAll(R0)];if(e.length>0){let r=e[e.length
1513
1512
  `),2;let a=o[1],l=Nt(t,i);if(l===null)return r.stderr.write(`error: escalation not found: ${i}
1514
1513
  `),1;let c=ur(t).find(m=>m.id===i);if(c===void 0)return r.stderr.write(`error: escalation not found: ${i}
1515
1514
  `),1;if(c.kind==="workflow_escalation"){let m=t.resumeEscalation(i,a);if(!m.resumed)return r.stderr.write(`error: escalation resume failed: ${m.reason} (attention=${i})
1516
- `),2;let p=ur(t).find(g=>g.id===i),_={ok:!0,attention_id:i,run_id:m.run.id,decision:a,session_status:"escalation_resumed",acknowledged_at:p?.acknowledged_at??null};return n?r.stdout.write(`${JSON.stringify(_,null,2)}
1515
+ `),2;let p=ur(t).find(g=>g.id===i),h={ok:!0,attention_id:i,run_id:m.run.id,decision:a,session_status:"escalation_resumed",acknowledged_at:p?.acknowledged_at??null};return n?r.stdout.write(`${JSON.stringify(h,null,2)}
1517
1516
  `):r.stdout.write(`ok: attention ${i} acknowledged; run ${m.run.id} resumed with decision "${a}"
1518
1517
  `),0}if(c.kind!=="interactive_waiting_operator")return r.stderr.write(`error: attention ${i} is kind=${c.kind}, not interactive_waiting_operator
1519
1518
  `),2;if(c.acknowledged_at!==null)return r.stderr.write(`error: attention ${i} is already acknowledged (${c.acknowledged_at})
@@ -1521,7 +1520,7 @@ ${r}`:r}function M0(t){let e=[...t.matchAll(R0)];if(e.length>0){let r=e[e.length
1521
1520
  `),2;let u=t.resumeInteractive(l.step_id,a,s);if(!u.resumed)return r.stderr.write(`error: interactive respond failed: ${u.reason} (step_id=${l.step_id})
1522
1521
  `),2;let d=t.acknowledgeAttention(i),f={ok:!0,attention_id:i,step_id:l.step_id,session_status:u.session.status,acknowledged_at:d?.acknowledged_at??null};return n?r.stdout.write(`${JSON.stringify(f,null,2)}
1523
1522
  `):r.stdout.write(`ok: attention ${i} acknowledged; step ${l.step_id} resumed (session_status=${f.session_status})
1524
- `),0}function xh(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 Ix,Nx,Ah,li,jx,Ox,Lx,Cx,yA,Bc=E(()=>{"use strict";Ue();Ge();Ko();Cc();Gt();Ix="http://127.0.0.1:8787",Nx=`usage: lmctl api [--direct] <subcommand> ...
1523
+ `),0}function xh(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 Ix,Nx,Ah,li,jx,Ox,Lx,Cx,yA,Bc=E(()=>{"use strict";We();Ve();Ko();Cc();Gt();Ix="http://127.0.0.1:8787",Nx=`usage: lmctl api [--direct] <subcommand> ...
1525
1524
 
1526
1525
  Call the lmctl HTTP API using the configured daemon URL/token. Some
1527
1526
  workflow shellstep-safe commands also support --direct to use the local DAL
@@ -1584,15 +1583,15 @@ ON EVERY NEW TASK:
1584
1583
  2. Pull only the chapters relevant to your current task. Don't load everything.
1585
1584
  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.
1586
1585
 
1587
- Don't dump all of durable-memory into your context. The pattern is index-first, chapter-on-demand.`});function pi(t){return KA.has(t)}function Gc(){return Xc===null&&(Xc=St(vt())),Xc}function Vc(t,e,r={}){if(!pi(t))return null;try{let n=Gc().getAdapter?.(t);if(n===void 0)return null;let s=n.resumeCommand(e).trim();if(s.length===0)return null;let o=s.split(/\s+/),i=t==="codex"&&r.isLead===!0?xo({warn:()=>{}}):[];return[...o,...i,...Xh[t]??[]]}catch{return null}}function mn(t,e){let r=Vc(t,e);return r===null?null:r.join(" ")}function Vt(t,e){return Gc().getSession(t,e)}async function hi(t){return(await Gc().resolveSessions(t)).map(r=>r.provider.name)}var Xh,KA,Gh,Xc,Dr=E(()=>{"use strict";It();Bl();Xh={claude:["--dangerously-skip-permissions"],codex:["--dangerously-bypass-approvals-and-sandbox"],gemini:["-y"],copilot:["--yolo"],opencode:[],qwen:["--approval-mode","yolo"],agy:[],lmplayer:[]},KA=new Set(Object.keys(Xh)),Gh=/^[\w.:-]+$/;Xc=null});import{createHash as YA}from"node:crypto";import{existsSync as ys,mkdirSync as Kh,readFileSync as ws,readdirSync as zA,renameSync as ZA,statSync as QA,unlinkSync as e$,writeFileSync as _i}from"node:fs";import{homedir as t$}from"node:os";import{dirname as Kc,isAbsolute as Vh,join as et,relative as r$,resolve as pn}from"node:path";import{fileURLToPath as n$}from"node:url";function zh(t){let e=pn(t);for(;;){let r=et(e,Yc);try{if(QA(r).isDirectory())return r}catch{}let n=Kc(e);if(n===e)return null;e=n}}function yi(t=process.cwd()){let e=process.env.LMCTL_HOME;if(e!==void 0&&e.trim().length>0)return pn(e);let r=zh(t);return r!==null?r:et(Yh(),Yc)}function Zh(t){return et(yi(t),"templates","workflows")}function Qh(){return pn(Kc(n$(import.meta.url)),"..","..","workflows")}function s$(t){let e=et(t,e_);try{let r=JSON.parse(ws(e,"utf8"));if(r&&typeof r=="object"&&r.files&&typeof r.files=="object")return{version:String(r.version??""),files:r.files}}catch{}return{version:"",files:{}}}function o$(t,e){Kh(t,{recursive:!0});let r=et(t,e_),n=`${r}.tmp-${process.pid}`;_i(n,`${JSON.stringify(e,null,2)}
1588
- `,"utf8"),ZA(n,r)}function i$(t){if(typeof t=="object"&&t!==null&&"code"in t){let e=t.code;if(typeof e=="string")return e}}function a$(t,e,r,n,s){let o=`${e}.dist-${r}`;for(let i=0;i<1e3;i+=1){let a=i===0?o:`${o}-${i}`,l=et(t,a);try{return _i(l,n,{flag:"wx"}),a}catch(c){if(i$(c)!=="EEXIST")throw c;if(gi(ws(l))===s)return a}}throw new Error(`could not find available dist shadow path for ${e}`)}function l$(t,e){if(Vh(e)||Kc(e)!=="workflows")return null;let r=e.slice(10);if(r.length===0||r.includes("/")||r.includes("\\")||r.includes(".."))return null;let n=pn(t,"templates","workflows"),s=pn(t,"templates",e),o=r$(n,s);return o.length===0||o.startsWith("..")||Vh(o)||o.includes("/")||o.includes("\\")?null:s}function c$(t,e,r){for(let[n,s]of Object.entries(e.files)){if(r.has(n))continue;let o=l$(t,n);if(o===null){delete e.files[n];continue}if(!ys(o)){delete e.files[n];continue}try{if(gi(ws(o))!==s)continue;e$(o),delete e.files[n]}catch{}}}function wi(t={}){let e=yi(t.cwd),r=et(e,"templates","workflows"),n=Qh(),s={basedir:e,copied:[],refreshed:[],preserved:[],shadowed:[]};try{let o=ys(n)?zA(n).filter(c=>c.endsWith(".compound.json")||c.endsWith(".lmctl")||c==="index.jsonl"):[];if(o.length===0)return s;Kh(r,{recursive:!0});let i=s$(e),a=lt(),l=new Set(o.map(c=>`workflows/${c}`));for(let c of o){let u=`workflows/${c}`,d=ws(et(n,c)),f=gi(d),m=et(r,c);if(!ys(m)){try{_i(m,d,{flag:"wx"}),s.copied.push(c)}catch{}i.files[u]=f;continue}let p=gi(ws(m));if(p===f){i.files[u]=f;continue}let _=i.files[u];if(_!==void 0&&p===_)_i(m,d),i.files[u]=f,s.refreshed.push(c);else{let g=a$(r,c,a,d,f);s.preserved.push(c),s.shadowed.push(g)}}c$(e,i,l),o$(e,{version:a,files:i.files})}catch(o){if(t.swallow!==!0)throw o}return s}function zc(t){let e=[],r=process.env.LMCTL_HOME;r!==void 0&&r.trim().length>0&&e.push(pn(r));let n=zh(t??process.cwd());return n!==null&&e.push(n),e.push(et(Yh(),Yc)),e}function Ei(t,e){let r=zc(e),n=[`${t}.compound.json`,`${t}.lmctl`];for(let s of r)for(let o of n){let i=et(s,"templates","workflows",o);if(ys(i))return i}for(let s of n){let o=et(Qh(),s);if(ys(o))return o}return null}var Yc,Yh,gi,e_,Ti=E(()=>{"use strict";Kn();Yc=".lmctl",Yh=()=>process.env.HOME??t$(),gi=t=>YA("sha256").update(t).digest("hex");e_=".dist-manifest.json"});import{createHash as u$}from"node:crypto";import{existsSync as d$,mkdirSync as f$,writeFileSync as m$}from"node:fs";import{dirname as p$,join as hn}from"node:path";function fr(t){return typeof t=="string"&&t.startsWith(t_)}function E$(t){if(!fr(t))throw new pt(`not an lmctl:// URI: ${t}`,"malformed");let e=t.slice(t_.length),r=e.indexOf("/");if(r<=0)throw new pt(`malformed lmctl:// URI (expected lmctl://<workflow|mcp|skill>/<name>): ${t}`,"malformed");let n=e.slice(0,r);if(!y$.has(n))throw new pt(`unknown lmctl:// kind '${n}' (expected workflow|mcp|skill): ${t}`,"malformed");let s=e.slice(r+1),o,i=s.indexOf("@");i>=0&&(o=s.slice(i+1).trim(),s=s.slice(0,i));let a=s.trim();if(a.length===0)throw new pt(`empty name in lmctl:// URI: ${t}`,"malformed");if(/[\\/]|\.\./.test(a))throw new pt(`invalid name in lmctl:// URI (no path separators): ${t}`,"malformed");return{kind:n,name:a,...o!==void 0&&o.length>0?{ref:o}:{}}}function T$(t,e,r){if(t==="workflow")return Ei(e,r);let n=t==="mcp"?hn("templates","mcp",`${e}.json`):hn("templates","skills",e,"SKILL.md");for(let s of zc(r)){let o=hn(s,n);if(d$(o))return o}return null}function b$(t,e,r){let n=hn(yi(r),_$,t);return t==="skill"?hn(n,e,"SKILL.md"):hn(n,`${e}${t==="workflow"?".compound.json":".json"}`)}function S$(t,e){if(e.trim().length===0)return!1;if(t==="skill")return!0;let r=e.trim();if(t==="mcp")try{let n=JSON.parse(r);return n!==null&&typeof n=="object"}catch{return!1}if(r.startsWith("{")||r.startsWith("["))try{return JSON.parse(r),!0}catch{return!1}return!0}async function Es(t,e){let{kind:r,name:n,ref:s}=E$(t),o=T$(r,n,e);if(o!==null)return o;let i=`${h$}${r}/${n}`,a;try{a=await fetch(i,{signal:AbortSignal.timeout(g$)})}catch(u){throw new pt(`lmctl:// '${t}' not found locally or at the remote catalog ${i} (${u instanceof Error?u.message:String(u)}). Failing closed.`,"missing")}if(!a.ok)throw new pt(`lmctl:// '${t}' not found locally or at the remote catalog ${i} (HTTP ${a.status}). Failing closed.`,"missing");let l=await a.text();if(s!==void 0){let u=w$.exec(s);if(u!==null){let d=u$("sha256").update(l).digest("hex");if(d.toLowerCase()!==u[1].toLowerCase())throw new pt(`lmctl:// '${t}' remote artifact FAILED integrity pin (expected sha256 ${u[1]}, got ${d}) \u2014 discarded, NOT cached.`,"validation-failure")}}if(!S$(r,l))throw new pt(`lmctl:// '${t}' remote artifact failed shape validation for ${r} \u2014 discarded, NOT cached.`,"validation-failure");let c=b$(r,n,e);return f$(p$(c),{recursive:!0}),m$(c,l,"utf8"),c}var t_,h$,_$,g$,y$,pt,w$,Zc=E(()=>{"use strict";Ti();t_="lmctl://",h$="https://lmctl.com/templates/",_$=".cache",g$=8e3,y$=new Set(["workflow","mcp","skill"]),pt=class extends Error{reason;constructor(e,r="malformed"){super(e),this.reason=r,this.name="LmctlUriError"}},w$=/^(?:sha256[:-])?([0-9a-f]{64})$/i});import{existsSync as k$,mkdirSync as v$,readFileSync as I$,renameSync as N$,unlinkSync as x$,writeFileSync as A$}from"node:fs";import{homedir as n_}from"node:os";import{dirname as Ts,join as xt,resolve as $$}from"node:path";function Si(t,e,r){let n=Ts($$(r)),s=new Set,o=new Map;for(let i of e.members){if(s.add(i.provider),i.teamfile!==void 0)continue;let a=i.sessiondir??n,l=o.get(a)??new Set;l.add(i.provider),o.set(a,l)}for(let[i,a]of o.entries()){let l=new Set([mr]),c=a.has("copilot"),u=[...a].some(d=>d!=="copilot");c&&!u&&l.add(R$),Pr(xt(i,".mcp.json"),"mcpServers",[...l])}for(let i of s)L$(i)}function Qc(t=s_??n_()){return xt(t,".copilot","mcp-config.json")}function o_(t,e){let r={};if(He.existsSync(t)){let o=JSON.parse(He.readFileSync(t,"utf8"));if(!_n(o))throw new Error(`${t} is not a JSON object`);r=o}let n=_n(r.mcpServers)?{...r.mcpServers}:{},s=!1;for(let[o,i]of Object.entries(e)){let a=_n(n[o])?n[o]:void 0;P$(a,i)||(n[o]=i,s=!0)}return s?(r.mcpServers=n,i_(t,r),{changed:!0}):{changed:!1}}function i_(t,e){He.mkdirSync(Ts(t),{recursive:!0});let r=xt(Ts(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{He.writeFileSync(r,`${JSON.stringify(e,null,2)}
1589
- `,"utf8"),He.renameSync(r,t)}catch(n){try{He.unlinkSync(r)}catch{}throw n}}function O$(t,e){He.mkdirSync(Ts(t),{recursive:!0});let r=xt(Ts(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{He.writeFileSync(r,e,"utf8"),He.renameSync(r,t)}catch(n){try{He.unlinkSync(r)}catch{}throw n}}function Pr(t,e,r){try{if(!He.existsSync(t))return;let n=JSON.parse(He.readFileSync(t,"utf8"));if(!_n(n)||!_n(n[e]))return;let s={...n[e]},o=[];for(let i of r)Object.prototype.hasOwnProperty.call(s,i)&&(delete s[i],o.push(i));if(o.length===0)return;n[e]=s,i_(t,n),z({event:"mcp_cleanup",path:t,removed:o})}catch{}}function L$(t){let e=s_??n_();switch(t){case"copilot":Pr(Qc(e),"mcpServers",[mr]);return;case"claude":Pr(xt(e,".claude.json"),"mcpServers",[mr]);return;case"gemini":Pr(xt(e,".gemini","settings.json"),"mcpServers",[mr]);return;case"qwen":Pr(xt(e,".qwen","settings.json"),"mcpServers",[mr]);return;case"agy":Pr(xt(e,".gemini","antigravity-cli","settings.json"),"mcpServers",[mr]);return;case"opencode":Pr(xt(e,".config","opencode","opencode.json"),"mcp",[mr]);return;case"codex":C$(xt(e,".codex","config.toml"),mr);return;default:return}}function C$(t,e){try{if(!He.existsSync(t))return;let n=He.readFileSync(t,"utf8").split(/\n/),s=[],o=new Set,i=!1;for(let a of n){let l=M$(a);if(l===null)return;if(l!==void 0){if(r_(l,e)){i=!0,o.add(e);continue}i=!1,s.push(a);continue}if(i){if(/^\s*(?:#.*)?$/.test(a)){s.push(a);continue}o.add(e);continue}let c=D$(a);if(c===null)return;if(c!==void 0&&r_(c,e)){o.add(e);continue}s.push(a)}if(o.size===0)return;O$(t,s.join(`
1590
- `)),z({event:"mcp_cleanup",path:t,removed:[...o]})}catch{}}function r_(t,e){return t.length>=2&&t[0]==="mcp_servers"&&t[1]===e}function M$(t){if(!/^\s*\[/.test(t))return;let e=/^\s*\[([^\]\r\n]+)\]\s*(?:#.*)?$/.exec(t);return e===null?null:a_(e[1])}function D$(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 a_(r)}function a_(t){let e=[],r=0,n=()=>{for(;r<t.length&&/\s/.test(t[r]);)r+=1};for(;r<t.length;){if(n(),r>=t.length)return null;if(t[r]==='"'){r+=1;let s="",o=!1;for(;r<t.length;){let i=t[r];if(i==="\\"){if(r+1>=t.length)return null;s+=t[r+1],r+=2;continue}if(i==='"'){r+=1,o=!0;break}s+=i,r+=1}if(!o)return null;e.push(s)}else{let s=r;for(;r<t.length&&/[A-Za-z0-9_-]/.test(t[r]);)r+=1;if(r===s)return null;e.push(t.slice(s,r))}if(n(),r>=t.length)break;if(t[r]!==".")return null;r+=1}return e.length>0?e:null}function P$(t,e){return t!==void 0&&bi(t)===bi(e)}function bi(t){return Array.isArray(t)?`[${t.map(e=>bi(e)).join(",")}]`:_n(t)?`{${Object.keys(t).sort().map(e=>`${JSON.stringify(e)}:${bi(t[e])}`).join(",")}}`:JSON.stringify(t)}function _n(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var R$,mr,j$,He,s_,ki=E(()=>{"use strict";Ne();R$="lmctl",mr="lmctl0",j$={existsSync:k$,mkdirSync:v$,readFileSync:I$,writeFileSync:A$,renameSync:N$,unlinkSync:x$},He=j$});import{spawnSync as m_}from"node:child_process";import{cpSync as l_,existsSync as ru,mkdirSync as p_,mkdtempSync as F$,readFileSync as h_,statSync as U$,writeFileSync as eu}from"node:fs";import{homedir as W$,tmpdir as B$}from"node:os";import{basename as c_,join as tt}from"node:path";function Kt(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function tu(t,e,r){if(Array.isArray(t)){for(let n of t)tu(n,e,r);return}if(Kt(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))tu(n,e,r)}}function X$(t,e){let r={mcp:[],skills:[]},n=new Set;for(let o of t.listProjects()){if(o.team_id!==e.team_id)continue;let i=t.getWorkflowByName(o.workflow_name);if(i===null||n.has(i.id))continue;n.add(i.id);let a;try{a=JSON.parse(i.definition)}catch{continue}if(!(!Kt(a)||!Array.isArray(a.steps)))for(let l of a.steps)Kt(l)&&l.members!==void 0&&tu(l.members,e.alias,r)}let s=o=>{let i=new Map;for(let a of o)i.set(J$(a),a);return[...i.values()]};return{mcp:s(r.mcp),skills:s(r.skills)}}function G$(t,e){return t.listProjects().find(r=>r.team_id===e.team_id)?.local_path}async function __(t,e){let r;try{r=await fetch(t,{signal:AbortSignal.timeout(H$)})}catch(s){throw new rt(e,`fetch ${t} failed: ${s.message}`)}if(!r.ok)throw new rt(e,`fetch ${t} \u2192 HTTP ${r.status}`);let n=await r.text();if(n.length>u_)throw new rt(e,`fetched ${t} exceeds ${u_} bytes`);return n}async function V$(t,e){if(typeof t!="string")return[t];fr(t)&&(t=await Es(t));let r;if(nu.test(t))r=await __(t,e);else{if(!ru(t))throw new rt(e,`mcp file not found: ${t}`);r=h_(t,"utf8")}let n;try{n=JSON.parse(r)}catch{throw new rt(e,`mcp source is not JSON: ${t}`)}if(Kt(n)&&Kt(n.mcpServers))return Object.entries(n.mcpServers).map(([s,o])=>({name:s,...Kt(o)?o:{}}));if(Kt(n)&&typeof n.name=="string")return[n];throw new rt(e,`mcp source ${t} is neither {mcpServers:{\u2026}} nor a {name,\u2026} server`)}function Ii(t){return t.type==="http"||t.type==="sse"||t.url!==void 0&&t.command===void 0}function vi(t,e,r,n){let s=m_(t,e,{cwd:r,env:Wt(void 0,r),encoding:"utf8",timeout:6e4});if(s.error)throw new rt(n,`spawn ${t} failed: ${s.error.message}`);if(s.status!==0)throw new rt(n,`${t} ${e.slice(0,3).join(" ")} exited ${s.status}: ${(s.stderr??"").trim().slice(0,200)}`)}function K$(t,e,r){m_(t,e,{cwd:r,env:Wt(void 0,r),encoding:"utf8",timeout:6e4})}function Y$(t,e){return t==="claude"?["mcp","remove",e,"--scope","user"]:["mcp","remove",e]}function z$(t){let e=["mcp","add"];if(Ii(t)){e.push("-t",t.type==="sse"?"sse":"http");for(let[r,n]of Object.entries(t.headers??{}))e.push("-H",`${r}: ${n}`);e.push(t.name,t.url??"")}else{for(let[r,n]of Object.entries(t.env??{}))e.push("-e",`${r}=${n}`);e.push(t.name,t.command??"",...t.args??[])}return e}function Z$(t){if(Ii(t))return["mcp","add",t.name,"--url",t.url??""];let e=["mcp","add",t.name];for(let[r,n]of Object.entries(t.env??{}))e.push("--env",`${r}=${n}`);return e.push("--",t.command??"",...t.args??[]),e}function Q$(t){let e=tt(process.env.XDG_CONFIG_HOME??tt(gn(),".config"),"opencode"),r=tt(e,"opencode.json"),n={};if(ru(r))try{let o=JSON.parse(h_(r,"utf8"));Kt(o)&&(n=o)}catch{}let s=Kt(n.mcp)?{...n.mcp}:{};for(let o of t){let{name:i,...a}=o;s[i]=Ii(o)?{type:"remote",url:a.url,enabled:!0,...a.headers?{headers:a.headers}:{}}:{type:"local",command:[a.command??"",...a.args??[]],enabled:!0,...a.env?{environment:a.env}:{}}}n.mcp=s,n.permission===void 0&&(n.permission="allow"),p_(e,{recursive:!0}),eu(r,`${JSON.stringify(n,null,2)}
1591
- `,"utf8")}function eR(t,e){let r={};for(let n of t)r[n.name]=Ii(n)?{type:n.type==="sse"?"sse":"http",url:n.url,...n.headers?{headers:n.headers}:{}}:{type:"stdio",command:n.command,args:n.args??[],...n.env?{env:n.env}:{}};try{o_(Qc(gn()),r)}catch(n){throw new rt(e,`copilot MCP config install failed: ${n instanceof Error?n.message:String(n)}`)}}function tR(t){if(typeof t!="string")return t.name;let e=c_(t.replace(/\/+$/,""));return e.toLowerCase()==="skill.md"?c_(t.replace(/\/skill\.md$/i,"")):e}async function d_(t,e,r){let n=tR(t),s=tt(e,n);if(p_(s,{recursive:!0}),typeof t!="string")return eu(tt(s,"SKILL.md"),t.content,"utf8"),{name:n,dir:s};if(fr(t)&&(t=await Es(t)),nu.test(t))return eu(tt(s,"SKILL.md"),await __(t,r),"utf8"),{name:n,dir:s};if(!ru(t))throw new rt(r,`skill path not found: ${t}`);return U$(t).isDirectory()?(l_(t,s,{recursive:!0}),{name:n,dir:s}):(l_(t,tt(s,"SKILL.md")),{name:n,dir:s})}async function Ni(t){let{dal:e,member:r,stderr:n}=t,s=X$(e,r);if(s.mcp.length===0&&s.skills.length===0)return;let o=Ae(r),i=r.sessiondir||t.baseDir||G$(e,r)||process.cwd(),a=l=>{n.write(`[seed:${r.alias}] ${l}
1592
- `)};if(s.mcp.length>0){let l=[];for(let c of s.mcp)l.push(...await V$(c,r.alias));if(o==="opencode")Q$(l);else if(o==="copilot")eR(l,r.alias);else if(o==="claude"||o==="gemini"||o==="qwen"||o==="agy"||o==="codex")for(let c of l)if(K$(o,Y$(o,c.name),i),o==="claude"){let{name:u,...d}=c;vi("claude",["mcp","add-json",u,JSON.stringify(d),"--scope","user"],i,r.alias)}else o==="codex"?vi("codex",Z$(c),i,r.alias):vi(o,z$(c),i,r.alias);else a(`provider ${o} has no known MCP install mechanism \u2014 ${l.length} declared server(s) NOT installed.`);["opencode","claude","gemini","qwen","agy","codex","copilot"].includes(o)&&a(`installed ${l.length} MCP server(s) into ${o} (idempotent).`)}if(s.skills.length>0)if(q$.has(o))a(`skills for ${o} are honest-BLOCKED \u2014 opencode has NO SKILL.md filesystem ingestion (no \`skill\` subcommand, no skills dir, no SKILL.md in the opencode package; \`opencode agent\` is a distinct artifact); ${s.skills.length} declared skill(s) NOT installed (operator follow-up).`);else if(o==="gemini"||o==="agy"){let l=F$(tt(B$(),`lmctl-skill-${r.alias}-`));for(let c of s.skills){let u=typeof c=="string"&&!nu.test(c)?c:(await d_(c,l,r.alias)).dir;vi(o,["skills","install",u,"--scope","user","--consent"],i,r.alias)}a(`installed ${s.skills.length} skill(s) via \`${o} skills install --scope user\` (idempotent).`)}else if(f_[o]!==void 0){let l=f_[o]();for(let c of s.skills)await d_(c,l,r.alias);a(`installed ${s.skills.length} skill(s) \u2192 ${l}/<name>/SKILL.md (idempotent overwrite).`)}else a(`provider ${o} has no verified skills mechanism \u2014 ${s.skills.length} declared skill(s) NOT installed.`)}var rt,nu,H$,u_,q$,J$,gn,f_,su=E(()=>{"use strict";Ue();Zc();ut();ki();rt=class extends Error{alias;constructor(e,r){super(`capability install failed for ${e}: ${r}`),this.alias=e,this.name="CapabilityInstallError"}},nu=/^https?:\/\//i,H$=8e3,u_=1e6,q$=new Set(["opencode"]),J$=t=>JSON.stringify(t),gn=()=>process.env.HOME??W$();f_={claude:()=>tt(gn(),".claude","skills"),qwen:()=>tt(gn(),".qwen","skills"),codex:()=>tt(gn(),".codex","skills"),copilot:()=>tt(gn(),".copilot","skills")}});async function O(t,e){if(t.dal!==void 0)return e(t.dal);let r=ge({path:le()});try{return await e(r)}finally{r.close()}}function P(t,e,r=["--json"]){let n=new Set(e),s=new Set(r),o=[],i={};for(let a=0;a<t.length;a+=1){let l=t[a];if(!l.startsWith("--")){o.push(l);continue}if(s.has(l)){i[l]=!0;continue}if(!n.has(l))return{positionals:o,flags:i,error:`unknown flag: ${l}`};let c=t[a+1];if(c===void 0||c.startsWith("--"))return{positionals:o,flags:i,error:`missing value for ${l}`};i[l]=c,a+=1}return{positionals:o,flags:i}}function A(t,e){let r=t.flags[e];return typeof r=="string"?r:void 0}function D(t,e){return t.flags[e]===!0}function W(t,e){t.stdout.write(`${JSON.stringify(e,null,2)}
1586
+ Don't dump all of durable-memory into your context. The pattern is index-first, chapter-on-demand.`});function pi(t){return KA.has(t)}function Gc(){return Xc===null&&(Xc=St(vt())),Xc}function Vc(t,e,r={}){if(!pi(t))return null;try{let n=Gc().getAdapter?.(t);if(n===void 0)return null;let s=n.resumeCommand(e).trim();if(s.length===0)return null;let o=s.split(/\s+/),i=t==="codex"&&r.isLead===!0?xo({warn:()=>{}}):[];return[...o,...i,...Xh[t]??[]]}catch{return null}}function mn(t,e){let r=Vc(t,e);return r===null?null:r.join(" ")}function Vt(t,e){return Gc().getSession(t,e)}async function hi(t){return(await Gc().resolveSessions(t)).map(r=>r.provider.name)}var Xh,KA,Gh,Xc,Dr=E(()=>{"use strict";It();Bl();Xh={claude:["--dangerously-skip-permissions"],codex:["--dangerously-bypass-approvals-and-sandbox"],gemini:["-y"],copilot:["--yolo"],opencode:[],qwen:["--approval-mode","yolo"],agy:[],lmplayer:[]},KA=new Set(Object.keys(Xh)),Gh=/^[\w.:-]+$/;Xc=null});import{createHash as YA}from"node:crypto";import{existsSync as ys,mkdirSync as Kh,readFileSync as ws,readdirSync as zA,renameSync as ZA,statSync as QA,unlinkSync as e$,writeFileSync as _i}from"node:fs";import{homedir as t$}from"node:os";import{dirname as Kc,isAbsolute as Vh,join as tt,relative as r$,resolve as pn}from"node:path";import{fileURLToPath as n$}from"node:url";function zh(t){let e=pn(t);for(;;){let r=tt(e,Yc);try{if(QA(r).isDirectory())return r}catch{}let n=Kc(e);if(n===e)return null;e=n}}function yi(t=process.cwd()){let e=process.env.LMCTL_HOME;if(e!==void 0&&e.trim().length>0)return pn(e);let r=zh(t);return r!==null?r:tt(Yh(),Yc)}function Zh(t){return tt(yi(t),"templates","workflows")}function Qh(){return pn(Kc(n$(import.meta.url)),"..","..","workflows")}function s$(t){let e=tt(t,e_);try{let r=JSON.parse(ws(e,"utf8"));if(r&&typeof r=="object"&&r.files&&typeof r.files=="object")return{version:String(r.version??""),files:r.files}}catch{}return{version:"",files:{}}}function o$(t,e){Kh(t,{recursive:!0});let r=tt(t,e_),n=`${r}.tmp-${process.pid}`;_i(n,`${JSON.stringify(e,null,2)}
1587
+ `,"utf8"),ZA(n,r)}function i$(t){if(typeof t=="object"&&t!==null&&"code"in t){let e=t.code;if(typeof e=="string")return e}}function a$(t,e,r,n,s){let o=`${e}.dist-${r}`;for(let i=0;i<1e3;i+=1){let a=i===0?o:`${o}-${i}`,l=tt(t,a);try{return _i(l,n,{flag:"wx"}),a}catch(c){if(i$(c)!=="EEXIST")throw c;if(gi(ws(l))===s)return a}}throw new Error(`could not find available dist shadow path for ${e}`)}function l$(t,e){if(Vh(e)||Kc(e)!=="workflows")return null;let r=e.slice(10);if(r.length===0||r.includes("/")||r.includes("\\")||r.includes(".."))return null;let n=pn(t,"templates","workflows"),s=pn(t,"templates",e),o=r$(n,s);return o.length===0||o.startsWith("..")||Vh(o)||o.includes("/")||o.includes("\\")?null:s}function c$(t,e,r){for(let[n,s]of Object.entries(e.files)){if(r.has(n))continue;let o=l$(t,n);if(o===null){delete e.files[n];continue}if(!ys(o)){delete e.files[n];continue}try{if(gi(ws(o))!==s)continue;e$(o),delete e.files[n]}catch{}}}function wi(t={}){let e=yi(t.cwd),r=tt(e,"templates","workflows"),n=Qh(),s={basedir:e,copied:[],refreshed:[],preserved:[],shadowed:[]};try{let o=ys(n)?zA(n).filter(c=>c.endsWith(".compound.json")||c.endsWith(".lmctl")||c==="index.jsonl"):[];if(o.length===0)return s;Kh(r,{recursive:!0});let i=s$(e),a=ct(),l=new Set(o.map(c=>`workflows/${c}`));for(let c of o){let u=`workflows/${c}`,d=ws(tt(n,c)),f=gi(d),m=tt(r,c);if(!ys(m)){try{_i(m,d,{flag:"wx"}),s.copied.push(c)}catch{}i.files[u]=f;continue}let p=gi(ws(m));if(p===f){i.files[u]=f;continue}let h=i.files[u];if(h!==void 0&&p===h)_i(m,d),i.files[u]=f,s.refreshed.push(c);else{let g=a$(r,c,a,d,f);s.preserved.push(c),s.shadowed.push(g)}}c$(e,i,l),o$(e,{version:a,files:i.files})}catch(o){if(t.swallow!==!0)throw o}return s}function zc(t){let e=[],r=process.env.LMCTL_HOME;r!==void 0&&r.trim().length>0&&e.push(pn(r));let n=zh(t??process.cwd());return n!==null&&e.push(n),e.push(tt(Yh(),Yc)),e}function Ei(t,e){let r=zc(e),n=[`${t}.compound.json`,`${t}.lmctl`];for(let s of r)for(let o of n){let i=tt(s,"templates","workflows",o);if(ys(i))return i}for(let s of n){let o=tt(Qh(),s);if(ys(o))return o}return null}var Yc,Yh,gi,e_,Ti=E(()=>{"use strict";Kn();Yc=".lmctl",Yh=()=>process.env.HOME??t$(),gi=t=>YA("sha256").update(t).digest("hex");e_=".dist-manifest.json"});import{createHash as u$}from"node:crypto";import{existsSync as d$,mkdirSync as f$,writeFileSync as m$}from"node:fs";import{dirname as p$,join as hn}from"node:path";function fr(t){return typeof t=="string"&&t.startsWith(t_)}function E$(t){if(!fr(t))throw new pt(`not an lmctl:// URI: ${t}`,"malformed");let e=t.slice(t_.length),r=e.indexOf("/");if(r<=0)throw new pt(`malformed lmctl:// URI (expected lmctl://<workflow|mcp|skill>/<name>): ${t}`,"malformed");let n=e.slice(0,r);if(!y$.has(n))throw new pt(`unknown lmctl:// kind '${n}' (expected workflow|mcp|skill): ${t}`,"malformed");let s=e.slice(r+1),o,i=s.indexOf("@");i>=0&&(o=s.slice(i+1).trim(),s=s.slice(0,i));let a=s.trim();if(a.length===0)throw new pt(`empty name in lmctl:// URI: ${t}`,"malformed");if(/[\\/]|\.\./.test(a))throw new pt(`invalid name in lmctl:// URI (no path separators): ${t}`,"malformed");return{kind:n,name:a,...o!==void 0&&o.length>0?{ref:o}:{}}}function T$(t,e,r){if(t==="workflow")return Ei(e,r);let n=t==="mcp"?hn("templates","mcp",`${e}.json`):hn("templates","skills",e,"SKILL.md");for(let s of zc(r)){let o=hn(s,n);if(d$(o))return o}return null}function b$(t,e,r){let n=hn(yi(r),_$,t);return t==="skill"?hn(n,e,"SKILL.md"):hn(n,`${e}${t==="workflow"?".compound.json":".json"}`)}function S$(t,e){if(e.trim().length===0)return!1;if(t==="skill")return!0;let r=e.trim();if(t==="mcp")try{let n=JSON.parse(r);return n!==null&&typeof n=="object"}catch{return!1}if(r.startsWith("{")||r.startsWith("["))try{return JSON.parse(r),!0}catch{return!1}return!0}async function Es(t,e){let{kind:r,name:n,ref:s}=E$(t),o=T$(r,n,e);if(o!==null)return o;let i=`${h$}${r}/${n}`,a;try{a=await fetch(i,{signal:AbortSignal.timeout(g$)})}catch(u){throw new pt(`lmctl:// '${t}' not found locally or at the remote catalog ${i} (${u instanceof Error?u.message:String(u)}). Failing closed.`,"missing")}if(!a.ok)throw new pt(`lmctl:// '${t}' not found locally or at the remote catalog ${i} (HTTP ${a.status}). Failing closed.`,"missing");let l=await a.text();if(s!==void 0){let u=w$.exec(s);if(u!==null){let d=u$("sha256").update(l).digest("hex");if(d.toLowerCase()!==u[1].toLowerCase())throw new pt(`lmctl:// '${t}' remote artifact FAILED integrity pin (expected sha256 ${u[1]}, got ${d}) \u2014 discarded, NOT cached.`,"validation-failure")}}if(!S$(r,l))throw new pt(`lmctl:// '${t}' remote artifact failed shape validation for ${r} \u2014 discarded, NOT cached.`,"validation-failure");let c=b$(r,n,e);return f$(p$(c),{recursive:!0}),m$(c,l,"utf8"),c}var t_,h$,_$,g$,y$,pt,w$,Zc=E(()=>{"use strict";Ti();t_="lmctl://",h$="https://lmctl.com/templates/",_$=".cache",g$=8e3,y$=new Set(["workflow","mcp","skill"]),pt=class extends Error{reason;constructor(e,r="malformed"){super(e),this.reason=r,this.name="LmctlUriError"}},w$=/^(?:sha256[:-])?([0-9a-f]{64})$/i});import{existsSync as k$,mkdirSync as v$,readFileSync as I$,renameSync as N$,unlinkSync as x$,writeFileSync as A$}from"node:fs";import{homedir as n_}from"node:os";import{dirname as Ts,join as xt,resolve as $$}from"node:path";function Si(t,e,r){let n=Ts($$(r)),s=new Set,o=new Map;for(let i of e.members){if(s.add(i.provider),i.teamfile!==void 0)continue;let a=i.sessiondir??n,l=o.get(a)??new Set;l.add(i.provider),o.set(a,l)}for(let[i,a]of o.entries()){let l=new Set([mr]),c=a.has("copilot"),u=[...a].some(d=>d!=="copilot");c&&!u&&l.add(R$),Pr(xt(i,".mcp.json"),"mcpServers",[...l])}for(let i of s)L$(i)}function Qc(t=s_??n_()){return xt(t,".copilot","mcp-config.json")}function o_(t,e){let r={};if(qe.existsSync(t)){let o=JSON.parse(qe.readFileSync(t,"utf8"));if(!_n(o))throw new Error(`${t} is not a JSON object`);r=o}let n=_n(r.mcpServers)?{...r.mcpServers}:{},s=!1;for(let[o,i]of Object.entries(e)){let a=_n(n[o])?n[o]:void 0;P$(a,i)||(n[o]=i,s=!0)}return s?(r.mcpServers=n,i_(t,r),{changed:!0}):{changed:!1}}function i_(t,e){qe.mkdirSync(Ts(t),{recursive:!0});let r=xt(Ts(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{qe.writeFileSync(r,`${JSON.stringify(e,null,2)}
1588
+ `,"utf8"),qe.renameSync(r,t)}catch(n){try{qe.unlinkSync(r)}catch{}throw n}}function O$(t,e){qe.mkdirSync(Ts(t),{recursive:!0});let r=xt(Ts(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{qe.writeFileSync(r,e,"utf8"),qe.renameSync(r,t)}catch(n){try{qe.unlinkSync(r)}catch{}throw n}}function Pr(t,e,r){try{if(!qe.existsSync(t))return;let n=JSON.parse(qe.readFileSync(t,"utf8"));if(!_n(n)||!_n(n[e]))return;let s={...n[e]},o=[];for(let i of r)Object.prototype.hasOwnProperty.call(s,i)&&(delete s[i],o.push(i));if(o.length===0)return;n[e]=s,i_(t,n),z({event:"mcp_cleanup",path:t,removed:o})}catch{}}function L$(t){let e=s_??n_();switch(t){case"copilot":Pr(Qc(e),"mcpServers",[mr]);return;case"claude":Pr(xt(e,".claude.json"),"mcpServers",[mr]);return;case"gemini":Pr(xt(e,".gemini","settings.json"),"mcpServers",[mr]);return;case"qwen":Pr(xt(e,".qwen","settings.json"),"mcpServers",[mr]);return;case"agy":Pr(xt(e,".gemini","antigravity-cli","settings.json"),"mcpServers",[mr]);return;case"opencode":Pr(xt(e,".config","opencode","opencode.json"),"mcp",[mr]);return;case"codex":C$(xt(e,".codex","config.toml"),mr);return;default:return}}function C$(t,e){try{if(!qe.existsSync(t))return;let n=qe.readFileSync(t,"utf8").split(/\n/),s=[],o=new Set,i=!1;for(let a of n){let l=M$(a);if(l===null)return;if(l!==void 0){if(r_(l,e)){i=!0,o.add(e);continue}i=!1,s.push(a);continue}if(i){if(/^\s*(?:#.*)?$/.test(a)){s.push(a);continue}o.add(e);continue}let c=D$(a);if(c===null)return;if(c!==void 0&&r_(c,e)){o.add(e);continue}s.push(a)}if(o.size===0)return;O$(t,s.join(`
1589
+ `)),z({event:"mcp_cleanup",path:t,removed:[...o]})}catch{}}function r_(t,e){return t.length>=2&&t[0]==="mcp_servers"&&t[1]===e}function M$(t){if(!/^\s*\[/.test(t))return;let e=/^\s*\[([^\]\r\n]+)\]\s*(?:#.*)?$/.exec(t);return e===null?null:a_(e[1])}function D$(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 a_(r)}function a_(t){let e=[],r=0,n=()=>{for(;r<t.length&&/\s/.test(t[r]);)r+=1};for(;r<t.length;){if(n(),r>=t.length)return null;if(t[r]==='"'){r+=1;let s="",o=!1;for(;r<t.length;){let i=t[r];if(i==="\\"){if(r+1>=t.length)return null;s+=t[r+1],r+=2;continue}if(i==='"'){r+=1,o=!0;break}s+=i,r+=1}if(!o)return null;e.push(s)}else{let s=r;for(;r<t.length&&/[A-Za-z0-9_-]/.test(t[r]);)r+=1;if(r===s)return null;e.push(t.slice(s,r))}if(n(),r>=t.length)break;if(t[r]!==".")return null;r+=1}return e.length>0?e:null}function P$(t,e){return t!==void 0&&bi(t)===bi(e)}function bi(t){return Array.isArray(t)?`[${t.map(e=>bi(e)).join(",")}]`:_n(t)?`{${Object.keys(t).sort().map(e=>`${JSON.stringify(e)}:${bi(t[e])}`).join(",")}}`:JSON.stringify(t)}function _n(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var R$,mr,j$,qe,s_,ki=E(()=>{"use strict";Ne();R$="lmctl",mr="lmctl0",j$={existsSync:k$,mkdirSync:v$,readFileSync:I$,writeFileSync:A$,renameSync:N$,unlinkSync:x$},qe=j$});import{spawnSync as m_}from"node:child_process";import{cpSync as l_,existsSync as ru,mkdirSync as p_,mkdtempSync as F$,readFileSync as h_,statSync as U$,writeFileSync as eu}from"node:fs";import{homedir as W$,tmpdir as B$}from"node:os";import{basename as c_,join as rt}from"node:path";function Kt(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function tu(t,e,r){if(Array.isArray(t)){for(let n of t)tu(n,e,r);return}if(Kt(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))tu(n,e,r)}}function X$(t,e){let r={mcp:[],skills:[]},n=new Set;for(let o of t.listProjects()){if(o.team_id!==e.team_id)continue;let i=t.getWorkflowByName(o.workflow_name);if(i===null||n.has(i.id))continue;n.add(i.id);let a;try{a=JSON.parse(i.definition)}catch{continue}if(!(!Kt(a)||!Array.isArray(a.steps)))for(let l of a.steps)Kt(l)&&l.members!==void 0&&tu(l.members,e.alias,r)}let s=o=>{let i=new Map;for(let a of o)i.set(J$(a),a);return[...i.values()]};return{mcp:s(r.mcp),skills:s(r.skills)}}function G$(t,e){return t.listProjects().find(r=>r.team_id===e.team_id)?.local_path}async function __(t,e){let r;try{r=await fetch(t,{signal:AbortSignal.timeout(H$)})}catch(s){throw new nt(e,`fetch ${t} failed: ${s.message}`)}if(!r.ok)throw new nt(e,`fetch ${t} \u2192 HTTP ${r.status}`);let n=await r.text();if(n.length>u_)throw new nt(e,`fetched ${t} exceeds ${u_} bytes`);return n}async function V$(t,e){if(typeof t!="string")return[t];fr(t)&&(t=await Es(t));let r;if(nu.test(t))r=await __(t,e);else{if(!ru(t))throw new nt(e,`mcp file not found: ${t}`);r=h_(t,"utf8")}let n;try{n=JSON.parse(r)}catch{throw new nt(e,`mcp source is not JSON: ${t}`)}if(Kt(n)&&Kt(n.mcpServers))return Object.entries(n.mcpServers).map(([s,o])=>({name:s,...Kt(o)?o:{}}));if(Kt(n)&&typeof n.name=="string")return[n];throw new nt(e,`mcp source ${t} is neither {mcpServers:{\u2026}} nor a {name,\u2026} server`)}function Ii(t){return t.type==="http"||t.type==="sse"||t.url!==void 0&&t.command===void 0}function vi(t,e,r,n){let s=m_(t,e,{cwd:r,env:Wt(void 0,r),encoding:"utf8",timeout:6e4});if(s.error)throw new nt(n,`spawn ${t} failed: ${s.error.message}`);if(s.status!==0)throw new nt(n,`${t} ${e.slice(0,3).join(" ")} exited ${s.status}: ${(s.stderr??"").trim().slice(0,200)}`)}function K$(t,e,r){m_(t,e,{cwd:r,env:Wt(void 0,r),encoding:"utf8",timeout:6e4})}function Y$(t,e){return t==="claude"?["mcp","remove",e,"--scope","user"]:["mcp","remove",e]}function z$(t){let e=["mcp","add"];if(Ii(t)){e.push("-t",t.type==="sse"?"sse":"http");for(let[r,n]of Object.entries(t.headers??{}))e.push("-H",`${r}: ${n}`);e.push(t.name,t.url??"")}else{for(let[r,n]of Object.entries(t.env??{}))e.push("-e",`${r}=${n}`);e.push(t.name,t.command??"",...t.args??[])}return e}function Z$(t){if(Ii(t))return["mcp","add",t.name,"--url",t.url??""];let e=["mcp","add",t.name];for(let[r,n]of Object.entries(t.env??{}))e.push("--env",`${r}=${n}`);return e.push("--",t.command??"",...t.args??[]),e}function Q$(t){let e=rt(process.env.XDG_CONFIG_HOME??rt(gn(),".config"),"opencode"),r=rt(e,"opencode.json"),n={};if(ru(r))try{let o=JSON.parse(h_(r,"utf8"));Kt(o)&&(n=o)}catch{}let s=Kt(n.mcp)?{...n.mcp}:{};for(let o of t){let{name:i,...a}=o;s[i]=Ii(o)?{type:"remote",url:a.url,enabled:!0,...a.headers?{headers:a.headers}:{}}:{type:"local",command:[a.command??"",...a.args??[]],enabled:!0,...a.env?{environment:a.env}:{}}}n.mcp=s,n.permission===void 0&&(n.permission="allow"),p_(e,{recursive:!0}),eu(r,`${JSON.stringify(n,null,2)}
1590
+ `,"utf8")}function eR(t,e){let r={};for(let n of t)r[n.name]=Ii(n)?{type:n.type==="sse"?"sse":"http",url:n.url,...n.headers?{headers:n.headers}:{}}:{type:"stdio",command:n.command,args:n.args??[],...n.env?{env:n.env}:{}};try{o_(Qc(gn()),r)}catch(n){throw new nt(e,`copilot MCP config install failed: ${n instanceof Error?n.message:String(n)}`)}}function tR(t){if(typeof t!="string")return t.name;let e=c_(t.replace(/\/+$/,""));return e.toLowerCase()==="skill.md"?c_(t.replace(/\/skill\.md$/i,"")):e}async function d_(t,e,r){let n=tR(t),s=rt(e,n);if(p_(s,{recursive:!0}),typeof t!="string")return eu(rt(s,"SKILL.md"),t.content,"utf8"),{name:n,dir:s};if(fr(t)&&(t=await Es(t)),nu.test(t))return eu(rt(s,"SKILL.md"),await __(t,r),"utf8"),{name:n,dir:s};if(!ru(t))throw new nt(r,`skill path not found: ${t}`);return U$(t).isDirectory()?(l_(t,s,{recursive:!0}),{name:n,dir:s}):(l_(t,rt(s,"SKILL.md")),{name:n,dir:s})}async function Ni(t){let{dal:e,member:r,stderr:n}=t,s=X$(e,r);if(s.mcp.length===0&&s.skills.length===0)return;let o=Ae(r),i=r.sessiondir||t.baseDir||G$(e,r)||process.cwd(),a=l=>{n.write(`[seed:${r.alias}] ${l}
1591
+ `)};if(s.mcp.length>0){let l=[];for(let c of s.mcp)l.push(...await V$(c,r.alias));if(o==="opencode")Q$(l);else if(o==="copilot")eR(l,r.alias);else if(o==="claude"||o==="gemini"||o==="qwen"||o==="agy"||o==="codex")for(let c of l)if(K$(o,Y$(o,c.name),i),o==="claude"){let{name:u,...d}=c;vi("claude",["mcp","add-json",u,JSON.stringify(d),"--scope","user"],i,r.alias)}else o==="codex"?vi("codex",Z$(c),i,r.alias):vi(o,z$(c),i,r.alias);else a(`provider ${o} has no known MCP install mechanism \u2014 ${l.length} declared server(s) NOT installed.`);["opencode","claude","gemini","qwen","agy","codex","copilot"].includes(o)&&a(`installed ${l.length} MCP server(s) into ${o} (idempotent).`)}if(s.skills.length>0)if(q$.has(o))a(`skills for ${o} are honest-BLOCKED \u2014 opencode has NO SKILL.md filesystem ingestion (no \`skill\` subcommand, no skills dir, no SKILL.md in the opencode package; \`opencode agent\` is a distinct artifact); ${s.skills.length} declared skill(s) NOT installed (operator follow-up).`);else if(o==="gemini"||o==="agy"){let l=F$(rt(B$(),`lmctl-skill-${r.alias}-`));for(let c of s.skills){let u=typeof c=="string"&&!nu.test(c)?c:(await d_(c,l,r.alias)).dir;vi(o,["skills","install",u,"--scope","user","--consent"],i,r.alias)}a(`installed ${s.skills.length} skill(s) via \`${o} skills install --scope user\` (idempotent).`)}else if(f_[o]!==void 0){let l=f_[o]();for(let c of s.skills)await d_(c,l,r.alias);a(`installed ${s.skills.length} skill(s) \u2192 ${l}/<name>/SKILL.md (idempotent overwrite).`)}else a(`provider ${o} has no verified skills mechanism \u2014 ${s.skills.length} declared skill(s) NOT installed.`)}var nt,nu,H$,u_,q$,J$,gn,f_,su=E(()=>{"use strict";We();Zc();ut();ki();nt=class extends Error{alias;constructor(e,r){super(`capability install failed for ${e}: ${r}`),this.alias=e,this.name="CapabilityInstallError"}},nu=/^https?:\/\//i,H$=8e3,u_=1e6,q$=new Set(["opencode"]),J$=t=>JSON.stringify(t),gn=()=>process.env.HOME??W$();f_={claude:()=>rt(gn(),".claude","skills"),qwen:()=>rt(gn(),".qwen","skills"),codex:()=>rt(gn(),".codex","skills"),copilot:()=>rt(gn(),".copilot","skills")}});async function O(t,e){if(t.dal!==void 0)return e(t.dal);let r=ge({path:le()});try{return await e(r)}finally{r.close()}}function P(t,e,r=["--json"]){let n=new Set(e),s=new Set(r),o=[],i={};for(let a=0;a<t.length;a+=1){let l=t[a];if(!l.startsWith("--")){o.push(l);continue}if(s.has(l)){i[l]=!0;continue}if(!n.has(l))return{positionals:o,flags:i,error:`unknown flag: ${l}`};let c=t[a+1];if(c===void 0||c.startsWith("--"))return{positionals:o,flags:i,error:`missing value for ${l}`};i[l]=c,a+=1}return{positionals:o,flags:i}}function A(t,e){let r=t.flags[e];return typeof r=="string"?r:void 0}function D(t,e){return t.flags[e]===!0}function W(t,e){t.stdout.write(`${JSON.stringify(e,null,2)}
1593
1592
  `)}function y(t,e){return t.stderr.write(`error: ${e}
1594
1593
  `),1}function _e(t,e){let r=e instanceof Error?e.message:String(e);return t.stderr.write(`internal error: ${r}
1595
- `),2}var fe=E(()=>{"use strict";Ue();Ge()});var T_={};re(T_,{defaultTeamNameForProject:()=>ER,resolveAlias:()=>$i,resolveProject:()=>xi,resolveTeam:()=>Ai,runCode:()=>sR});import{execFileSync as rR}from"node:child_process";import{basename as nR,resolve as g_}from"node:path";import*as iu from"node:readline";import{setTimeout as ou}from"node:timers/promises";async function sR(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r===void 0)return oR(e);if(r==="chat"&&(n.includes("--help")||n.includes("-h")))return w_(e);if(r==="spec"&&(n.includes("--help")||n.includes("-h")))return pR(e);try{return await O(e,async s=>{switch(r){case"team":return iR(n,e,s);case"chat":return dR(n,e,s);case"spec":return fR(n,e,s);default:return y(e,"usage: lmctl code <team|chat|spec> ...")}})}catch(s){return _e(e,s)}}function oR(t){return t.stdout.write(["usage: lmctl code <team|chat|spec> ..."," lmctl code spec <task-description> [options]","","Manage the active project code team, chat with a code agent, or start","spec-driven code work.","","subcommands:"," team add <alias> --provider P [--model M] [--role R] [--sessiondir DIR] [--project NAME] [--team NAME] [--json]"," team list"," team show <alias>"," team rm <alias>"," chat [--alias A]"," spec <task-description> [--slug S] [--template W]",""].join(`
1594
+ `),2}var fe=E(()=>{"use strict";We();Ve()});var T_={};re(T_,{defaultTeamNameForProject:()=>ER,resolveAlias:()=>$i,resolveProject:()=>xi,resolveTeam:()=>Ai,runCode:()=>sR});import{execFileSync as rR}from"node:child_process";import{basename as nR,resolve as g_}from"node:path";import*as iu from"node:readline";import{setTimeout as ou}from"node:timers/promises";async function sR(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r===void 0)return oR(e);if(r==="chat"&&(n.includes("--help")||n.includes("-h")))return w_(e);if(r==="spec"&&(n.includes("--help")||n.includes("-h")))return pR(e);try{return await O(e,async s=>{switch(r){case"team":return iR(n,e,s);case"chat":return dR(n,e,s);case"spec":return fR(n,e,s);default:return y(e,"usage: lmctl code <team|chat|spec> ...")}})}catch(s){return _e(e,s)}}function oR(t){return t.stdout.write(["usage: lmctl code <team|chat|spec> ..."," lmctl code spec <task-description> [options]","","Manage the active project code team, chat with a code agent, or start","spec-driven code work.","","subcommands:"," team add <alias> --provider P [--model M] [--role R] [--sessiondir DIR] [--project NAME] [--team NAME] [--json]"," team list"," team show <alias>"," team rm <alias>"," chat [--alias A]"," spec <task-description> [--slug S] [--template W]",""].join(`
1596
1595
  `)),0}function iR(t,e,r){let[n,...s]=t;switch(n){case"add":return aR(s,e,r);case"list":return lR(s,e,r);case"show":return cR(s,e,r);case"rm":return uR(s,e,r);default:return y(e,"usage: lmctl code team <add|list|show|rm>")}}function aR(t,e,r){let n=P(t,["--project","--team","--provider","--model","--role","--sessiondir"]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0)return y(e,"usage: code team add <alias> --provider P [--model M] [--role R] [--sessiondir DIR] [--project NAME] [--team NAME] [--json]");let o=A(n,"--provider");if(o===void 0)return y(e,"code team add requires --provider");let i=yn(e,r,A(n,"--project"),A(n,"--team"));if(typeof i=="number")return i;let a=r.insertTeamMember({team_id:i.team.id,alias:s,provider:o,model:A(n,"--model")??null,role:A(n,"--role")??"agent",sessiondir:A(n,"--sessiondir")??i.project.local_path});return D(n,"--json")?W(e,a):e.stdout.write(`added member ${a.alias} to ${i.team.name}
1597
1596
  `),0}function lR(t,e,r){let n=P(t,["--project","--team"]);if(n.error!==void 0)return y(e,n.error);let s=yn(e,r,A(n,"--project"),A(n,"--team"));if(typeof s=="number")return s;let o=E_(r.listTeamMembers(s.team.id));if(D(n,"--json"))W(e,o);else for(let i of o)e.stdout.write(`${i.alias} ${i.role} ${Ae(i)} ${i.sessionid??"(unseeded)"}
1598
1597
  `);return 0}function cR(t,e,r){let n=P(t,["--project","--team"]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0)return y(e,"usage: code team show <alias>");let o=yn(e,r,A(n,"--project"),A(n,"--team"));if(typeof o=="number")return o;let i=r.findTeamMemberByAlias(o.team.id,s);return i===null||i.state==="retired"?y(e,`member not found: ${s}`):(D(n,"--json")?W(e,i):(e.stdout.write(`member ${i.alias}
@@ -1623,13 +1622,13 @@ Don't dump all of durable-memory into your context. The pattern is index-first,
1623
1622
  ${i}
1624
1623
  `),await Ni({dal:e,member:o,stderr:t.stderr,baseDir:r.local_path});let a=o.role_prompt??"",l=a.length>0?`${a}
1625
1624
 
1626
- ${fn}`:fn;return e.setMemberPromptSnapshot(o.id,l)??o}function ER(t){return`${nR(t.local_path)}-code`}var y_,au=E(()=>{"use strict";ds();Go();gs();qc();Jc();Ue();Dr();su();fe();Bc();y_="spec-driven-task"});import b_ from"jexl";function pr(t){b_.compile(S_(t))}async function Fr(t,e){return b_.eval(S_(t),e)}function S_(t){return t.replace(/([A-Za-z_$][\w$.[\]]*)\.includes\(([^()]+)\)/g,"($2 in $1)")}var wn=E(()=>{"use strict"});import{z as T}from"zod";function pu(t){let e=t.trim();return e.startsWith("={{")&&e.endsWith("}}")?e.slice(3,-2).trim():t}var TR,k_,lu,cu,uu,du,fu,mu,v_,bR,SR,kR,ks,vR,Ri,ji,Oi,Li,Ci,I_,IR,NR,xR,AR,Mi,En=E(()=>{"use strict";wn();TR=T.object({kind:T.enum(["success","neutral","failure"])}),k_=T.enum(["string","number","boolean","object","array"]),lu=T.object({name:T.string().min(1),type:k_,required:T.boolean().optional(),default:T.unknown().optional(),description:T.string().optional()}),cu=T.object({name:T.string().min(1),type:k_,source_step_id:T.string().min(1),source_field:T.string().min(1),description:T.string().optional()}),uu=T.object({id:T.string().min(1),type:T.string().min(1),parameters:T.record(T.string(),T.unknown()).default({})}),du="__failure__",fu=T.object({tools:T.array(T.string().min(1)).optional(),auth:T.array(T.string().min(1)).optional()}).strict().optional(),mu=T.object({on_unhandled_failure:T.object({attention_kind:T.string().min(1).default("workflow_failed"),severity:T.enum(["warn","error","critical"]).default("warn"),capture_evidence:T.boolean().default(!0),recommend_recovery:T.string().min(1).optional()}).optional(),on_unhandled_failure_state:T.string().min(1).optional()}).optional(),v_=T.object({type:T.literal("AssertRepoClean"),fail_message:T.string().min(1).optional(),next:T.string().min(1)}),bR=T.object({name:T.string().min(1),command:T.string().min(1).optional(),args:T.array(T.string()).optional(),env:T.record(T.string(),T.string()).optional(),type:T.enum(["stdio","http","sse"]).optional(),url:T.string().min(1).optional(),headers:T.record(T.string(),T.string()).optional()}).strict(),SR=T.union([T.string().min(1),bR]),kR=T.union([T.string().min(1),T.object({name:T.string().min(1),content:T.string().min(1)}).strict()]),ks=T.object({team:T.string().min(1),alias:T.string().min(1),prompt_template:T.string().optional(),mcp:T.array(SR).optional(),skills:T.array(kR).optional()}),vR=T.object({kind:T.literal("shell"),command:T.string().min(1),description:T.string().optional()}),Ri=T.object({type:T.literal("Review"),state_name:T.string().min(1),coder:ks,pre_checks:T.array(vR).optional(),reviewers:T.array(ks.extend({rubric_artifact:T.string().optional()})).optional(),outcomes:T.object({approve:T.string().min(1),request_changes:T.string().optional(),fail_pre_check:T.string().optional(),max_loops_exceeded:T.string().optional()}),writes_to_project_path:T.boolean().optional(),durable_memory_tags:T.array(T.string().min(1)).optional(),write_back_durable_memory:T.union([T.boolean(),T.string().min(1)]).optional(),max_loops:T.number().int().positive().default(5),loop_feedback_artifact:T.string().optional(),outcomes_from_stance:T.record(T.string(),T.string().min(1)).optional()}).superRefine((t,e)=>{(t.reviewers??[]).length>0&&t.outcomes_from_stance!==void 0&&e.addIssue({code:"custom",path:["outcomes_from_stance"],message:"outcomes_from_stance cannot be used when reviewers is non-empty"})}),ji=T.object({type:T.literal("Consolidate"),state_name:T.string().min(1),researchers:T.array(ks.extend({topic:T.string().min(1)})).optional(),consolidator:ks,outcomes:T.object({ok:T.string().min(1),error:T.string().optional()}),research_artifact_prefix:T.string().optional(),durable_memory_tags:T.array(T.string().min(1)).optional(),write_back_durable_memory:T.union([T.boolean(),T.string().min(1)]).optional()}),Oi=T.object({type:T.literal("Interactive"),state_name:T.string().min(1),agent:ks.extend({initial_prompt_template:T.string().min(1)}),termination:T.object({operator_signal:T.boolean().default(!0),agent_signal:T.string().optional(),max_turns:T.number().int().positive().default(20),timeout_seconds:T.number().int().positive().optional()}),outcomes:T.object({done:T.string().min(1),timeout:T.string().optional()}),artifact_name:T.string().optional(),durable_memory_tags:T.array(T.string().min(1)).optional(),write_back_durable_memory:T.union([T.boolean(),T.string().min(1)]).optional()}),Li=T.object({type:T.literal("Loop"),state_name:T.string().min(1),over:T.string().min(1),item_var:T.string().min(1),body:T.string().min(1),outcomes:T.object({ok:T.string().min(1),error:T.string().optional()}),stop_on_error:T.boolean().default(!0),max_items:T.number().int().positive().default(1e3)}),Ci=T.object({type:T.literal("ShellStep"),state_name:T.string().min(1),command:T.string().min(1),outcomes_from_exit:T.record(T.string(),T.string().min(1)),timeout_ms:T.number().int().nonnegative().optional(),capture_output_to:T.string().optional(),writes_to_project_path:T.boolean().optional()}),I_=T.object({type:T.literal("Choice"),state_name:T.string().min(1),branches:T.array(T.object({when:T.string().min(1),next:T.string().min(1)})).default([]),default_next:T.string().min(1).optional()}).superRefine((t,e)=>{for(let[r,n]of t.branches.entries())try{pr(pu(n.when))}catch(s){let o=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["branches",r,"when"],message:`invalid jexl expression: ${o}`})}}),IR=T.discriminatedUnion("type",[v_,Ri,ji,Oi,Li,Ci,I_]),NR=T.object({type:T.literal("ForEach"),state_name:T.string().min(1),items_from:T.string().min(1),mode:T.enum(["sequential","parallel"]).default("sequential"),max_concurrency:T.number().int().positive().default(1),on_item_failure:T.enum(["continue","stop"]).default("stop"),body:IR,outcomes:T.object({all_ok:T.string().min(1),any_failed:T.string().optional()})}).superRefine((t,e)=>{try{pr(pu(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}`})}}),xR=T.object({type:T.literal("Subflow"),state_name:T.string().min(1),workflow_name:T.string().min(1),inputs:T.record(T.string(),T.string().min(1)).optional(),outcomes:T.record(T.string(),T.string().min(1))}).superRefine((t,e)=>{for(let[r,n]of Object.entries(t.inputs??{}))try{pr(pu(n))}catch(s){let o=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["inputs",r],message:`invalid jexl expression: ${o}`})}}),AR=T.discriminatedUnion("type",[v_,Ri,ji,Oi,Li,Ci,I_,NR,xR]),Mi=T.object({name:T.string().min(1),version:T.number().int().positive(),definition_schema_version:T.union([T.literal(1),T.literal(2)]),description:T.string().optional(),estimated_duration_ms:T.number().int().nonnegative().optional(),primitive_version:T.union([T.literal(1),T.literal(2)]).default(1),start_at:T.string().min(1),states:T.record(T.string().min(1),AR),terminals:T.record(T.string().min(1),TR),errors:mu,concurrency_key:T.string().min(1).optional(),concurrent_limit:T.number().int().positive().optional(),default_task_timeout_ms:T.number().int().positive().max(216e5).optional(),inputs:T.array(lu).optional(),outputs:T.array(cu).optional(),triggers:T.array(uu).optional(),read_only:T.boolean().optional(),requires:fu}).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 Q}from"zod";var $R,Di,RR,jR,OR,At,Tn=E(()=>{"use strict";En();$R=/^s-[a-z0-9-]+-[a-f0-9]{4}$/,Di=Q.string().regex($R),RR=Q.object({step_id:Di,type:Q.literal("main"),index:Q.number().int().min(0)}),jR=Q.record(Di,Q.record(Q.string().min(1),Q.array(Q.array(RR)))),OR=Q.object({id:Di,name:Q.string().min(1),type:Q.string().min(1),typeVersion:Q.number().int().positive().default(1),parameters:Q.record(Q.string(),Q.unknown()).default({}),members:Q.record(Q.string(),Q.unknown()).optional(),estimated_duration_ms:Q.number().int().nonnegative().optional()}),At=Q.object({schema_version:Q.literal("lmctl/v3"),definition_schema_version:Q.literal(3),name:Q.string().min(1),version:Q.number().int().positive(),description:Q.string().optional(),estimated_duration_ms:Q.number().int().nonnegative().optional(),default_task_timeout_ms:Q.number().int().positive().max(216e5).optional(),concurrency_key:Q.string().min(1).optional(),concurrent_limit:Q.number().int().positive().optional(),errors:mu,inputs:Q.array(lu).optional(),outputs:Q.array(cu).optional(),steps:Q.array(OR).min(1),connections:jR.default({}),entry_step_id:Di,triggers:Q.array(uu).optional(),read_only:Q.boolean().optional(),requires:fu}).superRefine((t,e)=>{let r=new Set;for(let[n,s]of t.steps.entries())r.has(s.id)&&e.addIssue({code:"custom",path:["steps",n,"id"],message:`duplicate step id: ${s.id}`}),r.add(s.id);r.has(t.entry_step_id)||e.addIssue({code:"custom",path:["entry_step_id"],message:`entry_step_id does not reference an existing step: ${t.entry_step_id}`});for(let[n,s]of Object.entries(t.connections)){r.has(n)||e.addIssue({code:"custom",path:["connections",n],message:`connection source does not reference an existing step: ${n}`});for(let[o,i]of Object.entries(s))for(let[a,l]of i.entries())for(let[c,u]of l.entries())r.has(u.step_id)||e.addIssue({code:"custom",path:["connections",n,o,a,c,"step_id"],message:`connection target does not reference an existing step: ${u.step_id}`})}})});function Pi(t){return _u(t)}function _u(t){if(Array.isArray(t))return t.map(_u);if(t===null||typeof t!="object")return t;let e=t,r={};for(let n of Object.keys(e))r[n]=_u(e[n]);if(typeof r.type=="string"){let n=CR[r.type];n!==void 0&&(r.type=n)}return r}var hu,LR,CR,gu=E(()=>{"use strict";hu="lmctl.builtin.",LR={Review:`${hu}Review`,Research:`${hu}Research`,Consolidate:`${hu}Consolidate`},CR=Object.fromEntries(Object.entries(LR).map(([t,e])=>[e,t]))});import{readFileSync as MR}from"node:fs";function A_(t){return DR(t)}function DR(t){let e=Pi(UR(t));if(FR(e),$_(e)===3)return PR(e);let r=Mi.safeParse(e);if(!r.success)throw new Yt({errors:r.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message}))});let n=WR(r.data);if(n.errors.length>0||n.unresolvedRefs.length>0)throw new Yt(n);return r.data}function PR(t){let e=At.safeParse(t);if(!e.success)throw new Yt({errors:e.error.issues.map(r=>({path:r.path.length===0?"$":r.path.map(String).join("."),message:r.message}))});return e.data}function FR(t){if(typeof t!="object"||t===null||!("definition_schema_version"in t))return;let e=$_(t);if(!(e===null||N_.includes(e)))throw new Yt({errors:[{path:"definition_schema_version",message:`unsupported definition_schema_version ${e}; supported versions: ${N_.join(", ")}`}]})}function $_(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 UR(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
1625
+ ${fn}`:fn;return e.setMemberPromptSnapshot(o.id,l)??o}function ER(t){return`${nR(t.local_path)}-code`}var y_,au=E(()=>{"use strict";ds();Go();gs();qc();Jc();We();Dr();su();fe();Bc();y_="spec-driven-task"});import b_ from"jexl";function pr(t){b_.compile(S_(t))}async function Fr(t,e){return b_.eval(S_(t),e)}function S_(t){return t.replace(/([A-Za-z_$][\w$.[\]]*)\.includes\(([^()]+)\)/g,"($2 in $1)")}var wn=E(()=>{"use strict"});import{z as T}from"zod";function pu(t){let e=t.trim();return e.startsWith("={{")&&e.endsWith("}}")?e.slice(3,-2).trim():t}var TR,k_,lu,cu,uu,du,fu,mu,v_,bR,SR,kR,ks,vR,Ri,ji,Oi,Li,Ci,I_,IR,NR,xR,AR,Mi,En=E(()=>{"use strict";wn();TR=T.object({kind:T.enum(["success","neutral","failure"])}),k_=T.enum(["string","number","boolean","object","array"]),lu=T.object({name:T.string().min(1),type:k_,required:T.boolean().optional(),default:T.unknown().optional(),description:T.string().optional()}),cu=T.object({name:T.string().min(1),type:k_,source_step_id:T.string().min(1),source_field:T.string().min(1),description:T.string().optional()}),uu=T.object({id:T.string().min(1),type:T.string().min(1),parameters:T.record(T.string(),T.unknown()).default({})}),du="__failure__",fu=T.object({tools:T.array(T.string().min(1)).optional(),auth:T.array(T.string().min(1)).optional()}).strict().optional(),mu=T.object({on_unhandled_failure:T.object({attention_kind:T.string().min(1).default("workflow_failed"),severity:T.enum(["warn","error","critical"]).default("warn"),capture_evidence:T.boolean().default(!0),recommend_recovery:T.string().min(1).optional()}).optional(),on_unhandled_failure_state:T.string().min(1).optional()}).optional(),v_=T.object({type:T.literal("AssertRepoClean"),fail_message:T.string().min(1).optional(),next:T.string().min(1)}),bR=T.object({name:T.string().min(1),command:T.string().min(1).optional(),args:T.array(T.string()).optional(),env:T.record(T.string(),T.string()).optional(),type:T.enum(["stdio","http","sse"]).optional(),url:T.string().min(1).optional(),headers:T.record(T.string(),T.string()).optional()}).strict(),SR=T.union([T.string().min(1),bR]),kR=T.union([T.string().min(1),T.object({name:T.string().min(1),content:T.string().min(1)}).strict()]),ks=T.object({team:T.string().min(1),alias:T.string().min(1),prompt_template:T.string().optional(),mcp:T.array(SR).optional(),skills:T.array(kR).optional()}),vR=T.object({kind:T.literal("shell"),command:T.string().min(1),description:T.string().optional()}),Ri=T.object({type:T.literal("Review"),state_name:T.string().min(1),coder:ks,pre_checks:T.array(vR).optional(),reviewers:T.array(ks.extend({rubric_artifact:T.string().optional()})).optional(),outcomes:T.object({approve:T.string().min(1),request_changes:T.string().optional(),fail_pre_check:T.string().optional(),max_loops_exceeded:T.string().optional()}),writes_to_project_path:T.boolean().optional(),durable_memory_tags:T.array(T.string().min(1)).optional(),write_back_durable_memory:T.union([T.boolean(),T.string().min(1)]).optional(),max_loops:T.number().int().positive().default(5),loop_feedback_artifact:T.string().optional(),outcomes_from_stance:T.record(T.string(),T.string().min(1)).optional()}).superRefine((t,e)=>{(t.reviewers??[]).length>0&&t.outcomes_from_stance!==void 0&&e.addIssue({code:"custom",path:["outcomes_from_stance"],message:"outcomes_from_stance cannot be used when reviewers is non-empty"})}),ji=T.object({type:T.literal("Consolidate"),state_name:T.string().min(1),researchers:T.array(ks.extend({topic:T.string().min(1)})).optional(),consolidator:ks,outcomes:T.object({ok:T.string().min(1),error:T.string().optional()}),research_artifact_prefix:T.string().optional(),durable_memory_tags:T.array(T.string().min(1)).optional(),write_back_durable_memory:T.union([T.boolean(),T.string().min(1)]).optional()}),Oi=T.object({type:T.literal("Interactive"),state_name:T.string().min(1),agent:ks.extend({initial_prompt_template:T.string().min(1)}),termination:T.object({operator_signal:T.boolean().default(!0),agent_signal:T.string().optional(),max_turns:T.number().int().positive().default(20),timeout_seconds:T.number().int().positive().optional()}),outcomes:T.object({done:T.string().min(1),timeout:T.string().optional()}),artifact_name:T.string().optional(),durable_memory_tags:T.array(T.string().min(1)).optional(),write_back_durable_memory:T.union([T.boolean(),T.string().min(1)]).optional()}),Li=T.object({type:T.literal("Loop"),state_name:T.string().min(1),over:T.string().min(1),item_var:T.string().min(1),body:T.string().min(1),outcomes:T.object({ok:T.string().min(1),error:T.string().optional()}),stop_on_error:T.boolean().default(!0),max_items:T.number().int().positive().default(1e3)}),Ci=T.object({type:T.literal("ShellStep"),state_name:T.string().min(1),command:T.string().min(1),outcomes_from_exit:T.record(T.string(),T.string().min(1)),timeout_ms:T.number().int().nonnegative().optional(),capture_output_to:T.string().optional(),writes_to_project_path:T.boolean().optional()}),I_=T.object({type:T.literal("Choice"),state_name:T.string().min(1),branches:T.array(T.object({when:T.string().min(1),next:T.string().min(1)})).default([]),default_next:T.string().min(1).optional()}).superRefine((t,e)=>{for(let[r,n]of t.branches.entries())try{pr(pu(n.when))}catch(s){let o=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["branches",r,"when"],message:`invalid jexl expression: ${o}`})}}),IR=T.discriminatedUnion("type",[v_,Ri,ji,Oi,Li,Ci,I_]),NR=T.object({type:T.literal("ForEach"),state_name:T.string().min(1),items_from:T.string().min(1),mode:T.enum(["sequential","parallel"]).default("sequential"),max_concurrency:T.number().int().positive().default(1),on_item_failure:T.enum(["continue","stop"]).default("stop"),body:IR,outcomes:T.object({all_ok:T.string().min(1),any_failed:T.string().optional()})}).superRefine((t,e)=>{try{pr(pu(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}`})}}),xR=T.object({type:T.literal("Subflow"),state_name:T.string().min(1),workflow_name:T.string().min(1),inputs:T.record(T.string(),T.string().min(1)).optional(),outcomes:T.record(T.string(),T.string().min(1))}).superRefine((t,e)=>{for(let[r,n]of Object.entries(t.inputs??{}))try{pr(pu(n))}catch(s){let o=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["inputs",r],message:`invalid jexl expression: ${o}`})}}),AR=T.discriminatedUnion("type",[v_,Ri,ji,Oi,Li,Ci,I_,NR,xR]),Mi=T.object({name:T.string().min(1),version:T.number().int().positive(),definition_schema_version:T.union([T.literal(1),T.literal(2)]),description:T.string().optional(),estimated_duration_ms:T.number().int().nonnegative().optional(),primitive_version:T.union([T.literal(1),T.literal(2)]).default(1),start_at:T.string().min(1),states:T.record(T.string().min(1),AR),terminals:T.record(T.string().min(1),TR),errors:mu,concurrency_key:T.string().min(1).optional(),concurrent_limit:T.number().int().positive().optional(),default_task_timeout_ms:T.number().int().positive().max(216e5).optional(),inputs:T.array(lu).optional(),outputs:T.array(cu).optional(),triggers:T.array(uu).optional(),read_only:T.boolean().optional(),requires:fu}).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 Q}from"zod";var $R,Di,RR,jR,OR,At,Tn=E(()=>{"use strict";En();$R=/^s-[a-z0-9-]+-[a-f0-9]{4}$/,Di=Q.string().regex($R),RR=Q.object({step_id:Di,type:Q.literal("main"),index:Q.number().int().min(0)}),jR=Q.record(Di,Q.record(Q.string().min(1),Q.array(Q.array(RR)))),OR=Q.object({id:Di,name:Q.string().min(1),type:Q.string().min(1),typeVersion:Q.number().int().positive().default(1),parameters:Q.record(Q.string(),Q.unknown()).default({}),members:Q.record(Q.string(),Q.unknown()).optional(),estimated_duration_ms:Q.number().int().nonnegative().optional()}),At=Q.object({schema_version:Q.literal("lmctl/v3"),definition_schema_version:Q.literal(3),name:Q.string().min(1),version:Q.number().int().positive(),description:Q.string().optional(),estimated_duration_ms:Q.number().int().nonnegative().optional(),default_task_timeout_ms:Q.number().int().positive().max(216e5).optional(),concurrency_key:Q.string().min(1).optional(),concurrent_limit:Q.number().int().positive().optional(),errors:mu,inputs:Q.array(lu).optional(),outputs:Q.array(cu).optional(),steps:Q.array(OR).min(1),connections:jR.default({}),entry_step_id:Di,triggers:Q.array(uu).optional(),read_only:Q.boolean().optional(),requires:fu}).superRefine((t,e)=>{let r=new Set;for(let[n,s]of t.steps.entries())r.has(s.id)&&e.addIssue({code:"custom",path:["steps",n,"id"],message:`duplicate step id: ${s.id}`}),r.add(s.id);r.has(t.entry_step_id)||e.addIssue({code:"custom",path:["entry_step_id"],message:`entry_step_id does not reference an existing step: ${t.entry_step_id}`});for(let[n,s]of Object.entries(t.connections)){r.has(n)||e.addIssue({code:"custom",path:["connections",n],message:`connection source does not reference an existing step: ${n}`});for(let[o,i]of Object.entries(s))for(let[a,l]of i.entries())for(let[c,u]of l.entries())r.has(u.step_id)||e.addIssue({code:"custom",path:["connections",n,o,a,c,"step_id"],message:`connection target does not reference an existing step: ${u.step_id}`})}})});function Pi(t){return _u(t)}function _u(t){if(Array.isArray(t))return t.map(_u);if(t===null||typeof t!="object")return t;let e=t,r={};for(let n of Object.keys(e))r[n]=_u(e[n]);if(typeof r.type=="string"){let n=CR[r.type];n!==void 0&&(r.type=n)}return r}var hu,LR,CR,gu=E(()=>{"use strict";hu="lmctl.builtin.",LR={Review:`${hu}Review`,Research:`${hu}Research`,Consolidate:`${hu}Consolidate`},CR=Object.fromEntries(Object.entries(LR).map(([t,e])=>[e,t]))});import{readFileSync as MR}from"node:fs";function A_(t){return DR(t)}function DR(t){let e=Pi(UR(t));if(FR(e),$_(e)===3)return PR(e);let r=Mi.safeParse(e);if(!r.success)throw new Yt({errors:r.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message}))});let n=WR(r.data);if(n.errors.length>0||n.unresolvedRefs.length>0)throw new Yt(n);return r.data}function PR(t){let e=At.safeParse(t);if(!e.success)throw new Yt({errors:e.error.issues.map(r=>({path:r.path.length===0?"$":r.path.map(String).join("."),message:r.message}))});return e.data}function FR(t){if(typeof t!="object"||t===null||!("definition_schema_version"in t))return;let e=$_(t);if(!(e===null||N_.includes(e)))throw new Yt({errors:[{path:"definition_schema_version",message:`unsupported definition_schema_version ${e}; supported versions: ${N_.join(", ")}`}]})}function $_(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 UR(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
1627
1626
  `)||e.startsWith("{")||e.startsWith("[")?x_(t,"$"):e.endsWith(".json")?x_(MR(e,"utf8"),e):t}function x_(t,e){try{return JSON.parse(t)}catch(r){let n=r instanceof Error?r.message:"invalid JSON";throw new Yt({errors:[{path:e,message:`invalid JSON: ${n}`}]})}}function WR(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"}),BR(t,n,r);for(let[s,o]of Object.entries(t.states))new Set(Object.keys(t.terminals));return{errors:e,unresolvedRefs:r}}function BR(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 N_,Yt,R_=E(()=>{"use strict";En();Tn();gu();N_=[1,2,3],Yt=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 HR}from"node:crypto";function j_(t,e){let r=qR(e),n=HR("sha1").update(`${t}:${e}`).digest("hex").slice(0,4);return`s-${r}-${n}`}function qR(t){let e=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"step"}var O_=E(()=>{"use strict";Tn()});function GR(t,e){let r=XR[t]??[],n={},s={};for(let[o,i]of Object.entries(e))r.includes(o)?s[o]=i:n[o]=i;return{params:n,members:s}}function D_(t){let e=[],r=(I,x)=>{throw new bn([{line:I,message:x}])},n=t.split(`
1628
- `),s=[];for(let I=0;I<n.length;I+=1){let C=YR(n[I]).trim();C.length>0&&s.push({n:I+1,text:C})}s.length===0&&r(1,"empty composition: expected a `workflow <name> v<version>` header");let o=/^workflow\s+(\S+)\s+v(\d+)$/.exec(s[0].text)??r(s[0].n,`expected header \`workflow <name> v<version>\`, got: ${s[0].text}`),i=o[1],a=Number.parseInt(o[2],10),l=new Map,c=[],u=[],d=[],f,m={},p=new Map,_=new Map,g=new Map,h=(I,x,C,q,B,U)=>{l.has(I)&&r(q,`duplicate step/terminal id: ${I}`),/^[A-Za-z][\w-]*$/.test(I)||r(q,`invalid id (must start with a letter): ${I}`),l.set(I,{declId:I,type:x,params:C,line:q,isTerminal:B,...U?{members:U}:{}}),u.push(I)},b=I=>{let x=[],C=I+1;for(;C<s.length;C+=1){let q=/^([A-Za-z][\w-]*|default)\s*->\s*([A-Za-z][\w-]*)$/.exec(s[C].text);if(q===null)break;x.push({label:q[1],dst:q[2]})}return{branches:x,nextIdx:C-1}};for(let I=1;I<s.length;I+=1){let{n:x,text:C}=s[I],q=C.split(/\s+/,1)[0];if(/^meta\s*\(/.test(C)){I!==1&&r(x,"`meta(...)` must be the preamble \u2014 the FIRST line after the `workflow` header (at most one, before any construct)");let B=/^meta\s*\((.*)\)\s*$/.exec(C)??r(x,`malformed \`meta\` (expected \`meta({ "requires"?:\u2026, "default_task_timeout_ms"?:\u2026, "errors"?:\u2026, "concurrency_key"?:\u2026, "concurrent_limit"?:\u2026 })\`): ${C}`),U=hr(B[1],x,r);for(let te of Object.keys(U))C_.has(te)||r(x,`unknown \`meta\` key \`${te}\` \u2014 only workflow-level runtime metadata is allowed: ${[...C_].join(", ")} (no grammar inflation; bounded)`);m=U;continue}if(q==="step"){let B=/^step\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(C)??r(x,`malformed \`step\` (expected \`step <id> = <archetype>(k=v, ...)\`): ${C}`),U=B[1],te=B[2],we=B[3],ae=L_[te];ae===void 0&&r(x,`unknown step type: ${te} (supported \`step\` archetypes: ${Object.keys(L_).join(", ")}; choice/terminal/loop/foreach/call/decide have their own constructs)`);let{params:Se,members:Dt}=GR(ae,hr(we,x,r));h(U,ae,Se,x,!1,Object.keys(Dt).length>0?Dt:void 0);continue}if(q==="trigger"){let B=/^trigger\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(C)??r(x,`malformed \`trigger\` (expected \`trigger <id> = <trigger-type>({ ...json... })\`): ${C}`),U=B[1],te=B[2],we=B[3],ae=M_[te];ae===void 0&&r(x,`unknown trigger type: ${te} (registered trigger archetypes: ${Object.keys(M_).join(", ")})`),p.has(U)&&r(x,`duplicate trigger id: ${U}`),p.set(U,{id:U,type:ae,parameters:hr(we,x,r)});continue}if(q==="mcp"||q==="skill"){let B=new RegExp(`^${q}\\s+([A-Za-z][\\w-]*)\\s*=\\s*(.+)$`).exec(C)??r(x,`malformed \`${q}\` decl (expected \`${q} <name> = {json} | ${q} <name> = "<file|url>"\`): ${C}`),U=B[1],te=B[2].trim(),we=q==="mcp"?_:g;we.has(U)&&r(x,`duplicate ${q} declaration: ${U}`);let ae;if(te.startsWith("{")){let Se=hr(te,x,r);q==="mcp"?ae={...Se,name:U}:((typeof Se.content!="string"||Se.content.length===0)&&r(x,`\`skill ${U}\`: inline form requires a non-empty string \`content\` (a SKILL.md body)`),ae={name:U,content:Se.content})}else{let Se=P_(te);(typeof Se!="string"||Se.length===0)&&r(x,`\`${q} ${U}\`: string form must be a non-empty file path or http(s) URL`),ae=Se}we.set(U,ae);continue}if(q==="terminal"){let B=/^terminal\s+([A-Za-z][\w-]*)\s*=\s*([A-Za-z][\w-]*)(?:\s+(success|failure|neutral))?\s*$/.exec(C)??r(x,`malformed \`terminal\` (expected \`terminal <id> = <name> [success|failure|neutral]\`): ${C}`);h(B[1],"lmctl/terminal",{name:B[2],kind:B[3]??"neutral"},x,!0);continue}if(q==="seq"){let U=C.slice(3).trim().split(/\s*(->|-[a-z0-9_]+->)\s*/).map(te=>te.trim()).filter(te=>te.length>0);(U.length<3||U.length%2===0)&&r(x,`malformed \`seq\` (expected \`<id> -> <id> [ -> <id> ... ]\`, optional \`-<port>->\`): ${C}`);for(let te=0;te+2<U.length+1&&!(te+2>U.length-1);te+=2){let we=U[te],ae=U[te+1],Se=U[te+2],Dt=ae==="->"?"main":ae.slice(1,-2);c.push({srcDeclId:we,port:Dt,dstDeclId:Se,line:x})}continue}if(q==="choice"){let U=(/^choice\s+([A-Za-z][\w-]*)\s*:$/.exec(C)??r(x,`malformed \`choice\` (expected \`choice <id>:\` then \`when <predicate> -<port>-> <id>\` lines): ${C}`))[1],te=[],we,ae=I+1;for(;ae<s.length;ae+=1){let Se=s[ae].text,Dt=/^when\s+(.+)\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(Se);if(Dt!==null){we!==void 0&&r(s[ae].n,`\`choice ${U}\`: a \`when\` branch may not follow \`default\` (branches are ordered, default is the fallback)`);let qn=Dt[2];te.push({when:Dt[1].trim(),next:`@terminal:${qn}`}),c.push({srcDeclId:U,port:qn,dstDeclId:Dt[3],line:s[ae].n});continue}let fl=/^default\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(Se);if(fl!==null){we!==void 0&&r(s[ae].n,`\`choice ${U}\` has more than one \`default\``);let qn=fl[1];we=`@terminal:${qn}`,c.push({srcDeclId:U,port:qn,dstDeclId:fl[2],line:s[ae].n});continue}break}te.length===0&&r(x,`\`choice ${U}\` has no \`when\` branches (need \u22651 \`when <jexl-predicate> -<port>-> <id>\`)`),h(U,"lmctl/choice",{branches:te,...we!==void 0?{default_next:we}:{}},x,!1),I=ae-1;continue}if(q==="loop"){let B=/^loop\s+([A-Za-z][\w-]*)\s*=\s*loop\s*\((.*)\)\s*$/.exec(C)??r(x,`malformed \`loop\` (expected \`loop <id> = loop(k=v, ...)\`): ${C}`);h(B[1],"lmctl/loop",hr(B[2],x,r),x,!1);continue}if(q==="foreach"){let B=/^foreach\s+([A-Za-z][\w-]*)\s*=\s*foreach\s*\((.*)\)\s*$/.exec(C)??r(x,`malformed \`foreach\` (expected \`foreach <id> = foreach(items=<expr>, ...)\`): ${C}`),U=hr(B[2],x,r);"mode"in U&&r(x,"foreach is SEQUENTIAL-ONLY: `mode` is not permitted (single-thread; durable-memory/composition-language-design.md \xA7Execution model)"),h(B[1],"lmctl/foreach",U,x,!1);continue}if(q==="call"){let B=/^call\s+([A-Za-z][\w-]*)\s*=\s*call\s*\((.*)\)\s*$/.exec(C)??r(x,`malformed \`call\` (expected \`call <id> = call(workflow=<name>, ...)\`): ${C}`),U=B[1],te=hr(B[2],x,r),we=te.workflow;(typeof we!="string"||we.length===0)&&r(x,`\`call ${U}\` requires a \`workflow=<name>\` argument`);let{workflow:ae,...Se}=te;h(U,"lmctl/subflow",{workflow_name:we,...Se},x,!1),d.push({declId:U,target:we,line:x});continue}if(q==="decide"){let B=/^decide\s+([A-Za-z][\w-]*)\s+by\s+agent\s*\((.*)\)\s*:$/.exec(C)??r(x,`malformed \`decide\` (expected \`decide <id> by agent(k=v, ...):\`): ${C}`),U=B[1],te=hr(B[2],x,r),{branches:we,nextIdx:ae}=b(I);we.length===0&&r(x,`\`decide ${U}\` has no outcomes (need at least one \`<outcome> -> <id>\`)`),h(U,"lmctl/interactive",{termination:{operator_signal:!0}},x,!1,{agent:te});for(let Se of we)c.push({srcDeclId:U,port:Se.label,dstDeclId:Se.dst,line:x});I=ae;continue}if(q==="entry"){let B=/^entry\s+([A-Za-z][\w-]*)$/.exec(C)??r(x,`malformed \`entry\` (expected \`entry <id>\`): ${C}`);f!==void 0&&r(x,`duplicate \`entry\` (already set to ${f})`),f=B[1];continue}r(x,`unknown statement \`${q}\` (grammar: workflow / meta / trigger / mcp / skill / step / terminal / seq / choice / loop / foreach / call / decide / entry)`)}u.length===0&&r(s[0].n,"composition declares no steps"),f===void 0&&(f=u[0]),l.has(f)||r(s[0].n,`entry references undeclared step: ${f}`);let w=I=>{if(Array.isArray(I)){for(let C of I)w(C);return}if(typeof I!="object"||I===null)return;let x=I;if(typeof x.alias=="string")for(let[C,q]of[["mcp",_],["skills",g]]){let B=x[C];Array.isArray(B)&&(x[C]=B.map(U=>typeof U=="string"&&q.has(U)?structuredClone(q.get(U)):U))}for(let C of Object.values(x))w(C)};for(let I of u){let x=l.get(I);x.members!==void 0&&w(x.members)}let k=I=>j_(i,I),N=u.map(I=>{let x=l.get(I);return{id:k(I),name:I,type:x.type,typeVersion:1,parameters:x.params,...x.members?{members:x.members}:{}}}),v={};for(let I of c){l.has(I.srcDeclId)||r(I.line,`edge source references undeclared step: ${I.srcDeclId}`),l.has(I.dstDeclId)||r(I.line,`dangling edge target: ${I.dstDeclId} is not declared`),l.get(I.srcDeclId).isTerminal&&r(I.line,`terminal \`${I.srcDeclId}\` cannot have an outgoing edge`);let x=k(I.srcDeclId);v[x]??={},v[x][I.port]!==void 0&&r(I.line,`duplicate edge port \`${I.port}\` on step \`${I.srcDeclId}\``),v[x][I.port]=[[{step_id:k(I.dstDeclId),type:"main",index:0}]]}for(let I of u){let x=l.get(I);VR.has(x.type)||r(x.line,`unknown archetype \`${x.type}\` for step \`${I}\` \u2014 not a registered builtin (src/engine/archetypes/index.ts:17-32)`)}for(let I of d)I.target===i&&r(I.line,`subflow cycle: \`call ${I.declId}\` invokes this workflow (\`${i}\`) \u2014 direct recursion is not allowed (cross-workflow A\u2192B\u2192A cycle detection is deferred to the M3 compile.ts seam)`);let R=new Map;for(let I of c){let x=R.get(I.srcDeclId);x===void 0?R.set(I.srcDeclId,[I.dstDeclId]):x.push(I.dstDeclId)}for(let I of u){let x=l.get(I);if(x.type!=="lmctl/loop")continue;let C=x.params.body;if(typeof C=="string"&&l.has(C)){let q=R.get(I);q===void 0?R.set(I,[C]):q.push(C)}}let G=new Set([f]),M=[f];for(;M.length>0;){let I=M.shift();for(let x of R.get(I)??[])G.has(x)||(G.add(x),M.push(x))}for(let I of u)G.has(I)||r(l.get(I).line,`step \`${I}\` is unreachable from entry \`${f}\``);let L=new Map;for(let I of c){let x=L.get(I.srcDeclId);x===void 0&&(x=new Set,L.set(I.srcDeclId,x)),x.add(I.port)}let $=new Set(["approve","request_changes","fail_pre_check","max_loops_exceeded"]);for(let I of u){let x=l.get(I);if(x.isTerminal)continue;let C=L.get(I)??new Set;if(x.type==="lmctl/review"){let B=[...C].some(U=>!$.has(U));!C.has("approve")&&!B&&r(x.line,`uncovered outcome: review step \`${I}\` wires neither \`approve\` nor any stance outcome \u2014 route \`approve\` (\`seq ${I} -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 q=KR[x.type];if(q!==void 0)for(let B of q)C.has(B)||r(x.line,`uncovered outcome: required outcome \`${B}\` of step \`${I}\` (\`${x.type}\`) has no connection \u2014 route it (\`seq ${I} -${B}-> <target|terminal>\`)`);else C.size===0&&r(x.line,`uncovered outcome: non-terminal step \`${I}\` (\`${x.type}\`) has no outgoing connection \u2014 wire it with \`seq\` or route to a \`terminal\``)}for(let I of u){let x=l.get(I),C=JR[x.type];if(C===void 0)continue;let q={...x.params,...x.members??{},type:C.v2type,state_name:I,...Object.keys(C.outcomes).length>0?{outcomes:C.outcomes}:{}},B=C.schema.safeParse(q);if(!B.success){let U=B.error.issues[0],te=U.path.length===0?"$":U.path.map(String).join(".");r(x.line,`step \`${I}\` (\`${x.type}\`) has invalid params for archetype \`${C.v2type}\` at \`${te}\`: ${U.message} \u2014 this would crash the engine (it derefs this field unguarded). Provide it via the structured form: \`step ${I} = ${x.type.replace("lmctl/","")}({ ... })\``)}}let Z={schema_version:"lmctl/v3",definition_schema_version:3,name:i,version:a,...m,...p.size>0?{triggers:[...p.values()]}:{},steps:N,connections:v,entry_step_id:k(f)},J=At.safeParse(Z);if(!J.success)throw new bn(J.error.issues.map(I=>({line:s[0].n,message:`emitted V3 invalid at ${I.path.length===0?"$":I.path.map(String).join(".")}: ${I.message}`})));return J.data}function YR(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 hr(t,e,r){let n=t.trim();if(n.length===0)return{};if(n.startsWith("{")){let o;try{o=JSON.parse(n)}catch(i){r(e,`malformed structured args (expected a single-line JSON object): ${i.message}`)}return(o===null||typeof o!="object"||Array.isArray(o))&&r(e,"structured args must be a JSON object"),o}let s={};for(let o of zR(n)){let i=o.indexOf("=");i===-1&&r(e,`malformed arg (expected k=v): ${o}`);let a=o.slice(0,i).trim(),l=o.slice(i+1).trim();/^[A-Za-z_][\w-]*$/.test(a)||r(e,`invalid arg name: ${a}`),s[a]=P_(l)}return s}function zR(t){return t.split(",").map(e=>e.trim()).filter(e=>e.length>0)}function P_(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 JR,XR,L_,bn,VR,KR,C_,M_,F_=E(()=>{"use strict";Tn();O_();En();JR={"lmctl/review":{v2type:"Review",outcomes:{approve:"_"},schema:Ri},"lmctl/consolidate":{v2type:"Consolidate",outcomes:{ok:"_"},schema:ji},"lmctl/interactive":{v2type:"Interactive",outcomes:{done:"_"},schema:Oi},"lmctl/loop":{v2type:"Loop",outcomes:{ok:"_"},schema:Li},"lmctl/shell-step":{v2type:"ShellStep",outcomes:{},schema:Ci}},XR={"lmctl/review":["coder","reviewers"],"lmctl/consolidate":["researchers","consolidator"],"lmctl/interactive":["agent"]};L_={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:
1627
+ `),s=[];for(let I=0;I<n.length;I+=1){let C=YR(n[I]).trim();C.length>0&&s.push({n:I+1,text:C})}s.length===0&&r(1,"empty composition: expected a `workflow <name> v<version>` header");let o=/^workflow\s+(\S+)\s+v(\d+)$/.exec(s[0].text)??r(s[0].n,`expected header \`workflow <name> v<version>\`, got: ${s[0].text}`),i=o[1],a=Number.parseInt(o[2],10),l=new Map,c=[],u=[],d=[],f,m={},p=new Map,h=new Map,g=new Map,_=(I,x,C,q,B,U)=>{l.has(I)&&r(q,`duplicate step/terminal id: ${I}`),/^[A-Za-z][\w-]*$/.test(I)||r(q,`invalid id (must start with a letter): ${I}`),l.set(I,{declId:I,type:x,params:C,line:q,isTerminal:B,...U?{members:U}:{}}),u.push(I)},b=I=>{let x=[],C=I+1;for(;C<s.length;C+=1){let q=/^([A-Za-z][\w-]*|default)\s*->\s*([A-Za-z][\w-]*)$/.exec(s[C].text);if(q===null)break;x.push({label:q[1],dst:q[2]})}return{branches:x,nextIdx:C-1}};for(let I=1;I<s.length;I+=1){let{n:x,text:C}=s[I],q=C.split(/\s+/,1)[0];if(/^meta\s*\(/.test(C)){I!==1&&r(x,"`meta(...)` must be the preamble \u2014 the FIRST line after the `workflow` header (at most one, before any construct)");let B=/^meta\s*\((.*)\)\s*$/.exec(C)??r(x,`malformed \`meta\` (expected \`meta({ "requires"?:\u2026, "default_task_timeout_ms"?:\u2026, "errors"?:\u2026, "concurrency_key"?:\u2026, "concurrent_limit"?:\u2026 })\`): ${C}`),U=hr(B[1],x,r);for(let te of Object.keys(U))C_.has(te)||r(x,`unknown \`meta\` key \`${te}\` \u2014 only workflow-level runtime metadata is allowed: ${[...C_].join(", ")} (no grammar inflation; bounded)`);m=U;continue}if(q==="step"){let B=/^step\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(C)??r(x,`malformed \`step\` (expected \`step <id> = <archetype>(k=v, ...)\`): ${C}`),U=B[1],te=B[2],we=B[3],ae=L_[te];ae===void 0&&r(x,`unknown step type: ${te} (supported \`step\` archetypes: ${Object.keys(L_).join(", ")}; choice/terminal/loop/foreach/call/decide have their own constructs)`);let{params:Se,members:Dt}=GR(ae,hr(we,x,r));_(U,ae,Se,x,!1,Object.keys(Dt).length>0?Dt:void 0);continue}if(q==="trigger"){let B=/^trigger\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(C)??r(x,`malformed \`trigger\` (expected \`trigger <id> = <trigger-type>({ ...json... })\`): ${C}`),U=B[1],te=B[2],we=B[3],ae=M_[te];ae===void 0&&r(x,`unknown trigger type: ${te} (registered trigger archetypes: ${Object.keys(M_).join(", ")})`),p.has(U)&&r(x,`duplicate trigger id: ${U}`),p.set(U,{id:U,type:ae,parameters:hr(we,x,r)});continue}if(q==="mcp"||q==="skill"){let B=new RegExp(`^${q}\\s+([A-Za-z][\\w-]*)\\s*=\\s*(.+)$`).exec(C)??r(x,`malformed \`${q}\` decl (expected \`${q} <name> = {json} | ${q} <name> = "<file|url>"\`): ${C}`),U=B[1],te=B[2].trim(),we=q==="mcp"?h:g;we.has(U)&&r(x,`duplicate ${q} declaration: ${U}`);let ae;if(te.startsWith("{")){let Se=hr(te,x,r);q==="mcp"?ae={...Se,name:U}:((typeof Se.content!="string"||Se.content.length===0)&&r(x,`\`skill ${U}\`: inline form requires a non-empty string \`content\` (a SKILL.md body)`),ae={name:U,content:Se.content})}else{let Se=P_(te);(typeof Se!="string"||Se.length===0)&&r(x,`\`${q} ${U}\`: string form must be a non-empty file path or http(s) URL`),ae=Se}we.set(U,ae);continue}if(q==="terminal"){let B=/^terminal\s+([A-Za-z][\w-]*)\s*=\s*([A-Za-z][\w-]*)(?:\s+(success|failure|neutral))?\s*$/.exec(C)??r(x,`malformed \`terminal\` (expected \`terminal <id> = <name> [success|failure|neutral]\`): ${C}`);_(B[1],"lmctl/terminal",{name:B[2],kind:B[3]??"neutral"},x,!0);continue}if(q==="seq"){let U=C.slice(3).trim().split(/\s*(->|-[a-z0-9_]+->)\s*/).map(te=>te.trim()).filter(te=>te.length>0);(U.length<3||U.length%2===0)&&r(x,`malformed \`seq\` (expected \`<id> -> <id> [ -> <id> ... ]\`, optional \`-<port>->\`): ${C}`);for(let te=0;te+2<U.length+1&&!(te+2>U.length-1);te+=2){let we=U[te],ae=U[te+1],Se=U[te+2],Dt=ae==="->"?"main":ae.slice(1,-2);c.push({srcDeclId:we,port:Dt,dstDeclId:Se,line:x})}continue}if(q==="choice"){let U=(/^choice\s+([A-Za-z][\w-]*)\s*:$/.exec(C)??r(x,`malformed \`choice\` (expected \`choice <id>:\` then \`when <predicate> -<port>-> <id>\` lines): ${C}`))[1],te=[],we,ae=I+1;for(;ae<s.length;ae+=1){let Se=s[ae].text,Dt=/^when\s+(.+)\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(Se);if(Dt!==null){we!==void 0&&r(s[ae].n,`\`choice ${U}\`: a \`when\` branch may not follow \`default\` (branches are ordered, default is the fallback)`);let qn=Dt[2];te.push({when:Dt[1].trim(),next:`@terminal:${qn}`}),c.push({srcDeclId:U,port:qn,dstDeclId:Dt[3],line:s[ae].n});continue}let fl=/^default\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(Se);if(fl!==null){we!==void 0&&r(s[ae].n,`\`choice ${U}\` has more than one \`default\``);let qn=fl[1];we=`@terminal:${qn}`,c.push({srcDeclId:U,port:qn,dstDeclId:fl[2],line:s[ae].n});continue}break}te.length===0&&r(x,`\`choice ${U}\` has no \`when\` branches (need \u22651 \`when <jexl-predicate> -<port>-> <id>\`)`),_(U,"lmctl/choice",{branches:te,...we!==void 0?{default_next:we}:{}},x,!1),I=ae-1;continue}if(q==="loop"){let B=/^loop\s+([A-Za-z][\w-]*)\s*=\s*loop\s*\((.*)\)\s*$/.exec(C)??r(x,`malformed \`loop\` (expected \`loop <id> = loop(k=v, ...)\`): ${C}`);_(B[1],"lmctl/loop",hr(B[2],x,r),x,!1);continue}if(q==="foreach"){let B=/^foreach\s+([A-Za-z][\w-]*)\s*=\s*foreach\s*\((.*)\)\s*$/.exec(C)??r(x,`malformed \`foreach\` (expected \`foreach <id> = foreach(items=<expr>, ...)\`): ${C}`),U=hr(B[2],x,r);"mode"in U&&r(x,"foreach is SEQUENTIAL-ONLY: `mode` is not permitted (single-thread; durable-memory/composition-language-design.md \xA7Execution model)"),_(B[1],"lmctl/foreach",U,x,!1);continue}if(q==="call"){let B=/^call\s+([A-Za-z][\w-]*)\s*=\s*call\s*\((.*)\)\s*$/.exec(C)??r(x,`malformed \`call\` (expected \`call <id> = call(workflow=<name>, ...)\`): ${C}`),U=B[1],te=hr(B[2],x,r),we=te.workflow;(typeof we!="string"||we.length===0)&&r(x,`\`call ${U}\` requires a \`workflow=<name>\` argument`);let{workflow:ae,...Se}=te;_(U,"lmctl/subflow",{workflow_name:we,...Se},x,!1),d.push({declId:U,target:we,line:x});continue}if(q==="decide"){let B=/^decide\s+([A-Za-z][\w-]*)\s+by\s+agent\s*\((.*)\)\s*:$/.exec(C)??r(x,`malformed \`decide\` (expected \`decide <id> by agent(k=v, ...):\`): ${C}`),U=B[1],te=hr(B[2],x,r),{branches:we,nextIdx:ae}=b(I);we.length===0&&r(x,`\`decide ${U}\` has no outcomes (need at least one \`<outcome> -> <id>\`)`),_(U,"lmctl/interactive",{termination:{operator_signal:!0}},x,!1,{agent:te});for(let Se of we)c.push({srcDeclId:U,port:Se.label,dstDeclId:Se.dst,line:x});I=ae;continue}if(q==="entry"){let B=/^entry\s+([A-Za-z][\w-]*)$/.exec(C)??r(x,`malformed \`entry\` (expected \`entry <id>\`): ${C}`);f!==void 0&&r(x,`duplicate \`entry\` (already set to ${f})`),f=B[1];continue}r(x,`unknown statement \`${q}\` (grammar: workflow / meta / trigger / mcp / skill / step / terminal / seq / choice / loop / foreach / call / decide / entry)`)}u.length===0&&r(s[0].n,"composition declares no steps"),f===void 0&&(f=u[0]),l.has(f)||r(s[0].n,`entry references undeclared step: ${f}`);let w=I=>{if(Array.isArray(I)){for(let C of I)w(C);return}if(typeof I!="object"||I===null)return;let x=I;if(typeof x.alias=="string")for(let[C,q]of[["mcp",h],["skills",g]]){let B=x[C];Array.isArray(B)&&(x[C]=B.map(U=>typeof U=="string"&&q.has(U)?structuredClone(q.get(U)):U))}for(let C of Object.values(x))w(C)};for(let I of u){let x=l.get(I);x.members!==void 0&&w(x.members)}let k=I=>j_(i,I),N=u.map(I=>{let x=l.get(I);return{id:k(I),name:I,type:x.type,typeVersion:1,parameters:x.params,...x.members?{members:x.members}:{}}}),v={};for(let I of c){l.has(I.srcDeclId)||r(I.line,`edge source references undeclared step: ${I.srcDeclId}`),l.has(I.dstDeclId)||r(I.line,`dangling edge target: ${I.dstDeclId} is not declared`),l.get(I.srcDeclId).isTerminal&&r(I.line,`terminal \`${I.srcDeclId}\` cannot have an outgoing edge`);let x=k(I.srcDeclId);v[x]??={},v[x][I.port]!==void 0&&r(I.line,`duplicate edge port \`${I.port}\` on step \`${I.srcDeclId}\``),v[x][I.port]=[[{step_id:k(I.dstDeclId),type:"main",index:0}]]}for(let I of u){let x=l.get(I);VR.has(x.type)||r(x.line,`unknown archetype \`${x.type}\` for step \`${I}\` \u2014 not a registered builtin (src/engine/archetypes/index.ts:17-32)`)}for(let I of d)I.target===i&&r(I.line,`subflow cycle: \`call ${I.declId}\` invokes this workflow (\`${i}\`) \u2014 direct recursion is not allowed (cross-workflow A\u2192B\u2192A cycle detection is deferred to the M3 compile.ts seam)`);let R=new Map;for(let I of c){let x=R.get(I.srcDeclId);x===void 0?R.set(I.srcDeclId,[I.dstDeclId]):x.push(I.dstDeclId)}for(let I of u){let x=l.get(I);if(x.type!=="lmctl/loop")continue;let C=x.params.body;if(typeof C=="string"&&l.has(C)){let q=R.get(I);q===void 0?R.set(I,[C]):q.push(C)}}let G=new Set([f]),M=[f];for(;M.length>0;){let I=M.shift();for(let x of R.get(I)??[])G.has(x)||(G.add(x),M.push(x))}for(let I of u)G.has(I)||r(l.get(I).line,`step \`${I}\` is unreachable from entry \`${f}\``);let L=new Map;for(let I of c){let x=L.get(I.srcDeclId);x===void 0&&(x=new Set,L.set(I.srcDeclId,x)),x.add(I.port)}let $=new Set(["approve","request_changes","fail_pre_check","max_loops_exceeded"]);for(let I of u){let x=l.get(I);if(x.isTerminal)continue;let C=L.get(I)??new Set;if(x.type==="lmctl/review"){let B=[...C].some(U=>!$.has(U));!C.has("approve")&&!B&&r(x.line,`uncovered outcome: review step \`${I}\` wires neither \`approve\` nor any stance outcome \u2014 route \`approve\` (\`seq ${I} -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 q=KR[x.type];if(q!==void 0)for(let B of q)C.has(B)||r(x.line,`uncovered outcome: required outcome \`${B}\` of step \`${I}\` (\`${x.type}\`) has no connection \u2014 route it (\`seq ${I} -${B}-> <target|terminal>\`)`);else C.size===0&&r(x.line,`uncovered outcome: non-terminal step \`${I}\` (\`${x.type}\`) has no outgoing connection \u2014 wire it with \`seq\` or route to a \`terminal\``)}for(let I of u){let x=l.get(I),C=JR[x.type];if(C===void 0)continue;let q={...x.params,...x.members??{},type:C.v2type,state_name:I,...Object.keys(C.outcomes).length>0?{outcomes:C.outcomes}:{}},B=C.schema.safeParse(q);if(!B.success){let U=B.error.issues[0],te=U.path.length===0?"$":U.path.map(String).join(".");r(x.line,`step \`${I}\` (\`${x.type}\`) has invalid params for archetype \`${C.v2type}\` at \`${te}\`: ${U.message} \u2014 this would crash the engine (it derefs this field unguarded). Provide it via the structured form: \`step ${I} = ${x.type.replace("lmctl/","")}({ ... })\``)}}let Z={schema_version:"lmctl/v3",definition_schema_version:3,name:i,version:a,...m,...p.size>0?{triggers:[...p.values()]}:{},steps:N,connections:v,entry_step_id:k(f)},J=At.safeParse(Z);if(!J.success)throw new bn(J.error.issues.map(I=>({line:s[0].n,message:`emitted V3 invalid at ${I.path.length===0?"$":I.path.map(String).join(".")}: ${I.message}`})));return J.data}function YR(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 hr(t,e,r){let n=t.trim();if(n.length===0)return{};if(n.startsWith("{")){let o;try{o=JSON.parse(n)}catch(i){r(e,`malformed structured args (expected a single-line JSON object): ${i.message}`)}return(o===null||typeof o!="object"||Array.isArray(o))&&r(e,"structured args must be a JSON object"),o}let s={};for(let o of zR(n)){let i=o.indexOf("=");i===-1&&r(e,`malformed arg (expected k=v): ${o}`);let a=o.slice(0,i).trim(),l=o.slice(i+1).trim();/^[A-Za-z_][\w-]*$/.test(a)||r(e,`invalid arg name: ${a}`),s[a]=P_(l)}return s}function zR(t){return t.split(",").map(e=>e.trim()).filter(e=>e.length>0)}function P_(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 JR,XR,L_,bn,VR,KR,C_,M_,F_=E(()=>{"use strict";Tn();O_();En();JR={"lmctl/review":{v2type:"Review",outcomes:{approve:"_"},schema:Ri},"lmctl/consolidate":{v2type:"Consolidate",outcomes:{ok:"_"},schema:ji},"lmctl/interactive":{v2type:"Interactive",outcomes:{done:"_"},schema:Oi},"lmctl/loop":{v2type:"Loop",outcomes:{ok:"_"},schema:Li},"lmctl/shell-step":{v2type:"ShellStep",outcomes:{},schema:Ci}},XR={"lmctl/review":["coder","reviewers"],"lmctl/consolidate":["researchers","consolidator"],"lmctl/interactive":["agent"]};L_={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:
1629
1628
  ${e.map(r=>` line ${r.line}: ${r.message}`).join(`
1630
1629
  `)}`),this.issues=e,this.name="DslCompileError"}},VR=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"]),KR={"lmctl/consolidate":["ok"],"lmctl/interactive":["done"],"lmctl/loop":["ok"],"lmctl/foreach":["all_ok"]},C_=new Set(["requires","default_task_timeout_ms","errors","concurrency_key","concurrent_limit"]),M_={"trigger-schedule":"lmctl/trigger-schedule","trigger-gh-issue":"lmctl/trigger-gh-issue"}});import{readFileSync as ZR}from"node:fs";function QR(){let t=process.env.LMCTL_DSL;return t===void 0?!0:!["0","false","off"].includes(t.trim().toLowerCase())}function ej(t){for(let e of t.split(`
1631
- `)){let r=e.replace(/#.*/,"").trim();if(r.length!==0)return/^workflow\s+\S+\s+v\d+\s*$/.test(r)}return!1}function Ce(t){if(typeof t=="string"&&QR()&&ej(t)){let r;try{r=D_(t)}catch(s){throw s instanceof bn?new zt(s.issues.map(o=>({path:`dsl:${o.line}`,message:o.message}))):s}let n=At.safeParse(r);if(!n.success)throw new zt(n.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));return n.data}let e=Pi(rj(t));if(nj(e)&&e.definition_schema_version===3){let r=At.safeParse(e);if(!r.success)throw new zt(r.error.issues.map(n=>({path:n.path.length===0?"$":n.path.map(String).join("."),message:n.message})));return r.data}return tj(e)}function tj(t){let e=Mi.safeParse(t);if(!e.success)throw new zt(e.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));let r=e.data,n=new Set(["Task","Pause","Parallel","LoopUntil","Pass","Fail","Succeed"]);for(let[s,o]of Object.entries(r.states))if(n.has(o.type))throw new zt([{path:`states.${s}`,message:`v2 workflows (primitive_version: 2) may not use v1 primitive type: ${o.type}`}]);try{return A_(r)}catch(s){throw s instanceof Yt?new yu(s):s}}function rj(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
1632
- `)||e.startsWith("{")||e.startsWith("[")?U_(t):e.endsWith(".json")?U_(ZR(e,"utf8")):t}function U_(t){return JSON.parse(t)}function nj(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var yu,zt,Sn=E(()=>{"use strict";En();R_();gu();Tn();F_();yu=class extends Error{causeError;constructor(e){super("compiler emitted invalid atomic workflow"),this.causeError=e,this.name="CompilerInvariantError"}},zt=class extends Error{issues;constructor(e){super("compound workflow validation failed"),this.issues=e,this.name="CompilerValidationError"}}});function Fi(t){let e=t.workflow?.concurrent_limit??1,r=t.job.concurrency_key_resolved??t.workflow?.concurrency_key??null;return r===null||r.trim().length===0?{concurrency_key:null,concurrent_limit:e}:{concurrency_key:sj(r,{job:{id:t.job.id,kind:t.job.source,source:t.job.source,source_ref:t.job.source_ref,payload:ij(t.job.payload)},project:t.project===null?null:{id:t.project.id,name:t.project.name}}),concurrent_limit:e}}function sj(t,e){return t.replace(/\{\{\s*([^}]+?)\s*\}\}/g,(r,n)=>{let s=oj(e,n.trim());return s==null?"":typeof s=="string"?s:typeof s=="number"||typeof s=="boolean"?String(s):JSON.stringify(s)})}function oj(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 ij(t){if(t===null||t.trim().length===0)return null;try{return JSON.parse(t)}catch{return t}}var wu=E(()=>{"use strict"});var W_={};re(W_,{enqueueFromAgentOutput:()=>lj,enqueueFromGitHubIssue:()=>Eu,enqueueManual:()=>aj,enqueueScheduled:()=>cj});function Eu(t,e){return Wi(t,{project_id:e.project_id,workflow_id_override:e.workflow_id_override??null,source:"gh_issue",source_ref:e.issue_url,dedupe_key:e.dedupe_key??e.issue_url,payload:Ui(e.payload),concurrency_key:e.concurrency_key,priority:e.priority})}function aj(t,e){return Wi(t,{project_id:e.project_id,workflow_id_override:null,source:"manual",source_ref:e.source_ref??null,dedupe_key:e.source_ref??null,payload:Ui(e.payload),concurrency_key:e.concurrency_key})}function lj(t,e){let r=e.sequence===void 0?`run:${e.parent_run_id}`:`run:${e.parent_run_id}:${e.sequence}`;return Wi(t,{project_id:e.project_id,workflow_id_override:null,source:"agent_output",source_ref:r,dedupe_key:r,available_at:e.available_at,payload:Ui(e.payload),concurrency_key:e.concurrency_key})}function cj(t,e){return Wi(t,{project_id:e.project_id,workflow_id_override:null,source:"schedule",source_ref:e.source_ref,dedupe_key:e.source_ref,available_at:e.available_at,payload:Ui(e.payload),concurrency_key:e.concurrency_key})}function Ui(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function Wi(t,e){let r=e.concurrency_key;if(r!==void 0)return t.enqueueJob({...e,concurrency_key:r});let n=t.getProject(e.project_id),s=n===null?null:e.workflow_id_override!==void 0&&e.workflow_id_override!==null?t.getWorkflow(e.workflow_id_override):t.getWorkflowByName(n.workflow_name);if(n===null||s===null)return t.enqueueJob(e);try{let o=Ce(s.definition),i={id:-1,project_id:e.project_id,workflow_id_override:e.workflow_id_override??null,source:e.source,source_ref:e.source_ref??null,payload:e.payload??null,status:"queued",priority:e.priority??0,available_at:e.available_at??new Date().toISOString(),locked_by:null,locked_until:null,attempt_count:0,last_error:null,dedupe_key:e.dedupe_key??null,concurrency_key_resolved:null,enqueued_at:new Date().toISOString(),started_at:null,ended_at:null,run_id:null},a=Fi({workflow:o,job:i,project:n});return t.enqueueJob({...e,concurrency_key:a.concurrency_key})}catch{return t.enqueueJob(e)}}var Tu=E(()=>{"use strict";Sn();wu()});async function H_(t){let e=t.dal.listProjectWorkflows(t.project.id,{enabled_only:!0});if(e.length===0)return B_(t.dal,t.project.id,t.issue,t.issue.url,null,t.issue,void 0);let r={event:{kind:"github_issue",issue:t.issue}},n=[],s=0;for(let o of e){if(!await uj(o.condition,r))continue;let i=`${t.issue.url}#workflow:${o.workflow_id}`,a={issue:t.issue,...dj(o.parameters_override)},l=B_(t.dal,t.project.id,t.issue,i,o.workflow_id,a,-o.priority);n.push(...l.jobs),s+=l.new_jobs}return{jobs:n,new_jobs:s}}function B_(t,e,r,n,s,o,i){let a=t.findJobBySourceAndDedupe("gh_issue",n);return{jobs:[Eu(t,{project_id:e,issue_url:r.url,payload:o,workflow_id_override:s,dedupe_key:n,priority:i})],new_jobs:a===null?1:0}}async function uj(t,e){if(t===null||t.trim().length===0)return!0;try{return await Fr(t,e)===!0}catch{return!1}}function dj(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 q_=E(()=>{"use strict";wn();Tu()});import{spawnSync as fj}from"node:child_process";async function Su(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=fj(t.binary??"gh",n,{encoding:"utf8",timeout:t.timeoutMs??6e4,maxBuffer:10*1024*1024});if(s.error!==void 0)throw s.error;if(s.status!==0)throw new Error(`gh issue list failed: ${s.stderr??""}`.trim());let o;try{o=JSON.parse(s.stdout??"[]")}catch{throw new Error("gh issue list returned malformed JSON")}if(!pj(o))throw new Error("gh issue list returned unexpected JSON shape");let i=0;for(let a of o){let l=await H_({dal:t.dal,project:t.project,issue:hj(a)});i+=l.new_jobs}return{scanned:o.length,new_jobs:i}}async function kn(t){if(process.env.LMCTL_INTAKE_DISABLED==="1")return[];let e=[];for(let r of t.listProjectsWithIntakeEnabled()){let n=mj(r.intake_config);try{let s=await Su({dal:t,project:r,labels:n.labels,state:n.state});e.push({project_id:r.id,project_name:r.name,...s})}catch(s){let o=s instanceof Error?s.message:String(s);e.push({project_id:r.id,project_name:r.name,scanned:0,new_jobs:0,error:o});try{t.raiseAttention({kind:"daemon_intake_scan_failed",severity:"warn",project_id:r.id,payload:JSON.stringify({project_id:r.id,project_name:r.name,error:o})})}catch{}}}return e}function mj(t){if(t===null)return{};try{let e=JSON.parse(t);if(!bu(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 pj(t){return Array.isArray(t)&&t.every(e=>{if(!bu(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:bu(n)&&typeof n.name=="string"))})}function hj(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 bu(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var Bi=E(()=>{"use strict";q_()});function X_(t){return async e=>gj(t.app,e,t.log!==void 0?{log:t.log}:{})}async function gj(t,e,r={}){let n=yj(e.path),s={"content-type":"application/json",...e.headers??{},[Hi]:ku},o={method:e.method,headers:s};e.body!==void 0&&e.method!=="GET"&&e.method!=="DELETE"&&(o.body=typeof e.body=="string"?e.body:JSON.stringify(e.body));let i=new Request(n,o),a=Date.now();try{let l=await t.fetch(i),c=await wj(l);if(r.log!==void 0){let u=Date.now()-a;r.log(`[mailbox-dispatch] ${e.method} ${J_(e.path)} \u2192 ${c.status} (${u}ms)`)}return c}catch(l){if(r.log!==void 0){let c=Date.now()-a;r.log(`[mailbox-dispatch] ${e.method} ${J_(e.path)} \u2192 ERR (${c}ms)`)}throw l}}function J_(t){let e=t.startsWith("/")?t:`/${t}`,r=e.search(/[?#]/);return r===-1?e:e.slice(0,r)}function yj(t){let e=t.startsWith("/")?t:`/${t}`;return`${_j}${e}`}async function wj(t){let e=await t.text(),r;if(e==="")r=void 0;else try{r=JSON.parse(e)}catch{r=e}let n={};t.headers.forEach((o,i)=>{i.toLowerCase()!==Hi&&(n[i]=o)});let s={status:t.status};return Object.keys(n).length>0&&(s.headers=n),r!==void 0&&(s.body=r),s}var Hi,ku,_j,vu=E(()=>{"use strict";Hi="x-mailbox-channel",ku="1",_j="http://mailbox.local"});import{createHash as G_,createHmac as Ej,timingSafeEqual as Tj}from"node:crypto";function V_(){return async(t,e)=>{let r=K_();if(r===null||Ij(t.req.path)){await e();return}if(t.req.path.startsWith("/mailbox/")&&t.req.header(Hi)===ku){await e();return}let n=t.req.query("token");if(n!==void 0&&qi(n,r)){Nu(t,r),await e();return}if(vj(t,r)){await e();return}return t.req.path.startsWith("/api/")||t.req.path.startsWith("/mailbox/")?t.json({error:"API requires auth; set LMCTL_API_TOKEN"},401):t.redirect("/login",302)}}function K_(){let t=process.env.LMCTL_API_TOKEN;return t&&t.length>0?t:null}function Y_(t){let e=K_();return e!==null&&qi(t,e)}function Nu(t,e,r=new Date){t.header("Set-Cookie",`${Iu}=${Sj(e,r)}; Path=/; HttpOnly; SameSite=Lax`)}function z_(t){t.header("Set-Cookie",`${Iu}=; Path=/; HttpOnly; SameSite=Lax; Max-Age=0`)}function Sj(t,e=new Date){let n=`auth=ok|${new Date(e.getTime()+bj*24*60*60*1e3).toISOString()}`;return Buffer.from(`${n}|${Z_(t,n)}`,"utf8").toString("base64url")}function kj(t,e,r=new Date){let n;try{n=Buffer.from(t,"base64url").toString("utf8")}catch{return!1}let s=n.split("|");if(s.length!==3||s[0]!=="auth=ok")return!1;let o=new Date(s[1]);return Number.isNaN(o.getTime())||o.getTime()<=r.getTime()?!1:qi(s[2],Z_(e,`${s[0]}|${s[1]}`))}function qi(t,e){return Tj(G_("sha256").update(t).digest(),G_("sha256").update(e).digest())}function vj(t,e){let r=/^Bearer\s+(.+)$/i.exec(t.req.header("authorization")??"")?.[1];if(r!==void 0&&qi(r,e))return!0;let n=Nj(t.req.header("cookie")??"")[Iu];return n!==void 0&&kj(n,e)}function Ij(t){return t==="/login"||t==="/logout"}function Nj(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 Z_(t,e){return Ej("sha256",t).update(e).digest("hex")}var Iu,bj,Q_=E(()=>{"use strict";vu();Iu="lmctl_next_session",bj=30});import{existsSync as vn,mkdirSync as xj,readdirSync as Aj,readFileSync as Ji,unlinkSync as $j,writeFileSync as $u}from"node:fs";import{join as Ur}from"node:path";function nt(t){if(!Rj.test(t))throw new Error(`invalid memory name "${t}": only alphanumeric characters, underscores, and hyphens are allowed`)}function tg(t,e){let r=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(r===null)return null;let n=r[1],s=r[2].trimStart(),o=n.match(/^type:\s*(.+)$/m),i=n.match(/^description:\s*(.+)$/m),a=o?.[1]?.trim()??"";return Cj(a)?{name:t,type:a,description:i?.[1]?.trim()??null,body:s,created_at:eg,updated_at:eg}:null}function jj(t,e,r,n){let s=r!==null?`
1630
+ `)){let r=e.replace(/#.*/,"").trim();if(r.length!==0)return/^workflow\s+\S+\s+v\d+\s*$/.test(r)}return!1}function Me(t){if(typeof t=="string"&&QR()&&ej(t)){let r;try{r=D_(t)}catch(s){throw s instanceof bn?new zt(s.issues.map(o=>({path:`dsl:${o.line}`,message:o.message}))):s}let n=At.safeParse(r);if(!n.success)throw new zt(n.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));return n.data}let e=Pi(rj(t));if(nj(e)&&e.definition_schema_version===3){let r=At.safeParse(e);if(!r.success)throw new zt(r.error.issues.map(n=>({path:n.path.length===0?"$":n.path.map(String).join("."),message:n.message})));return r.data}return tj(e)}function tj(t){let e=Mi.safeParse(t);if(!e.success)throw new zt(e.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));let r=e.data,n=new Set(["Task","Pause","Parallel","LoopUntil","Pass","Fail","Succeed"]);for(let[s,o]of Object.entries(r.states))if(n.has(o.type))throw new zt([{path:`states.${s}`,message:`v2 workflows (primitive_version: 2) may not use v1 primitive type: ${o.type}`}]);try{return A_(r)}catch(s){throw s instanceof Yt?new yu(s):s}}function rj(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
1631
+ `)||e.startsWith("{")||e.startsWith("[")?U_(t):e.endsWith(".json")?U_(ZR(e,"utf8")):t}function U_(t){return JSON.parse(t)}function nj(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var yu,zt,Sn=E(()=>{"use strict";En();R_();gu();Tn();F_();yu=class extends Error{causeError;constructor(e){super("compiler emitted invalid atomic workflow"),this.causeError=e,this.name="CompilerInvariantError"}},zt=class extends Error{issues;constructor(e){super("compound workflow validation failed"),this.issues=e,this.name="CompilerValidationError"}}});function Fi(t){let e=t.workflow?.concurrent_limit??1,r=t.job.concurrency_key_resolved??t.workflow?.concurrency_key??null;return r===null||r.trim().length===0?{concurrency_key:null,concurrent_limit:e}:{concurrency_key:sj(r,{job:{id:t.job.id,kind:t.job.source,source:t.job.source,source_ref:t.job.source_ref,payload:ij(t.job.payload)},project:t.project===null?null:{id:t.project.id,name:t.project.name}}),concurrent_limit:e}}function sj(t,e){return t.replace(/\{\{\s*([^}]+?)\s*\}\}/g,(r,n)=>{let s=oj(e,n.trim());return s==null?"":typeof s=="string"?s:typeof s=="number"||typeof s=="boolean"?String(s):JSON.stringify(s)})}function oj(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 ij(t){if(t===null||t.trim().length===0)return null;try{return JSON.parse(t)}catch{return t}}var wu=E(()=>{"use strict"});var W_={};re(W_,{enqueueFromAgentOutput:()=>lj,enqueueFromGitHubIssue:()=>Eu,enqueueManual:()=>aj,enqueueScheduled:()=>cj});function Eu(t,e){return Wi(t,{project_id:e.project_id,workflow_id_override:e.workflow_id_override??null,source:"gh_issue",source_ref:e.issue_url,dedupe_key:e.dedupe_key??e.issue_url,payload:Ui(e.payload),concurrency_key:e.concurrency_key,priority:e.priority})}function aj(t,e){return Wi(t,{project_id:e.project_id,workflow_id_override:null,source:"manual",source_ref:e.source_ref??null,dedupe_key:e.source_ref??null,payload:Ui(e.payload),concurrency_key:e.concurrency_key})}function lj(t,e){let r=e.sequence===void 0?`run:${e.parent_run_id}`:`run:${e.parent_run_id}:${e.sequence}`;return Wi(t,{project_id:e.project_id,workflow_id_override:null,source:"agent_output",source_ref:r,dedupe_key:r,available_at:e.available_at,payload:Ui(e.payload),concurrency_key:e.concurrency_key})}function cj(t,e){return Wi(t,{project_id:e.project_id,workflow_id_override:null,source:"schedule",source_ref:e.source_ref,dedupe_key:e.source_ref,available_at:e.available_at,payload:Ui(e.payload),concurrency_key:e.concurrency_key})}function Ui(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function Wi(t,e){let r=e.concurrency_key;if(r!==void 0)return t.enqueueJob({...e,concurrency_key:r});let n=t.getProject(e.project_id),s=n===null?null:e.workflow_id_override!==void 0&&e.workflow_id_override!==null?t.getWorkflow(e.workflow_id_override):t.getWorkflowByName(n.workflow_name);if(n===null||s===null)return t.enqueueJob(e);try{let o=Me(s.definition),i={id:-1,project_id:e.project_id,workflow_id_override:e.workflow_id_override??null,source:e.source,source_ref:e.source_ref??null,payload:e.payload??null,status:"queued",priority:e.priority??0,available_at:e.available_at??new Date().toISOString(),locked_by:null,locked_until:null,attempt_count:0,last_error:null,dedupe_key:e.dedupe_key??null,concurrency_key_resolved:null,enqueued_at:new Date().toISOString(),started_at:null,ended_at:null,run_id:null},a=Fi({workflow:o,job:i,project:n});return t.enqueueJob({...e,concurrency_key:a.concurrency_key})}catch{return t.enqueueJob(e)}}var Tu=E(()=>{"use strict";Sn();wu()});async function H_(t){let e=t.dal.listProjectWorkflows(t.project.id,{enabled_only:!0});if(e.length===0)return B_(t.dal,t.project.id,t.issue,t.issue.url,null,t.issue,void 0);let r={event:{kind:"github_issue",issue:t.issue}},n=[],s=0;for(let o of e){if(!await uj(o.condition,r))continue;let i=`${t.issue.url}#workflow:${o.workflow_id}`,a={issue:t.issue,...dj(o.parameters_override)},l=B_(t.dal,t.project.id,t.issue,i,o.workflow_id,a,-o.priority);n.push(...l.jobs),s+=l.new_jobs}return{jobs:n,new_jobs:s}}function B_(t,e,r,n,s,o,i){let a=t.findJobBySourceAndDedupe("gh_issue",n);return{jobs:[Eu(t,{project_id:e,issue_url:r.url,payload:o,workflow_id_override:s,dedupe_key:n,priority:i})],new_jobs:a===null?1:0}}async function uj(t,e){if(t===null||t.trim().length===0)return!0;try{return await Fr(t,e)===!0}catch{return!1}}function dj(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 q_=E(()=>{"use strict";wn();Tu()});import{spawnSync as fj}from"node:child_process";async function Su(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=fj(t.binary??"gh",n,{encoding:"utf8",timeout:t.timeoutMs??6e4,maxBuffer:10*1024*1024});if(s.error!==void 0)throw s.error;if(s.status!==0)throw new Error(`gh issue list failed: ${s.stderr??""}`.trim());let o;try{o=JSON.parse(s.stdout??"[]")}catch{throw new Error("gh issue list returned malformed JSON")}if(!pj(o))throw new Error("gh issue list returned unexpected JSON shape");let i=0;for(let a of o){let l=await H_({dal:t.dal,project:t.project,issue:hj(a)});i+=l.new_jobs}return{scanned:o.length,new_jobs:i}}async function kn(t){if(process.env.LMCTL_INTAKE_DISABLED==="1")return[];let e=[];for(let r of t.listProjectsWithIntakeEnabled()){let n=mj(r.intake_config);try{let s=await Su({dal:t,project:r,labels:n.labels,state:n.state});e.push({project_id:r.id,project_name:r.name,...s})}catch(s){let o=s instanceof Error?s.message:String(s);e.push({project_id:r.id,project_name:r.name,scanned:0,new_jobs:0,error:o});try{t.raiseAttention({kind:"daemon_intake_scan_failed",severity:"warn",project_id:r.id,payload:JSON.stringify({project_id:r.id,project_name:r.name,error:o})})}catch{}}}return e}function mj(t){if(t===null)return{};try{let e=JSON.parse(t);if(!bu(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 pj(t){return Array.isArray(t)&&t.every(e=>{if(!bu(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:bu(n)&&typeof n.name=="string"))})}function hj(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 bu(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var Bi=E(()=>{"use strict";q_()});function X_(t){return async e=>gj(t.app,e,t.log!==void 0?{log:t.log}:{})}async function gj(t,e,r={}){let n=yj(e.path),s={"content-type":"application/json",...e.headers??{},[Hi]:ku},o={method:e.method,headers:s};e.body!==void 0&&e.method!=="GET"&&e.method!=="DELETE"&&(o.body=typeof e.body=="string"?e.body:JSON.stringify(e.body));let i=new Request(n,o),a=Date.now();try{let l=await t.fetch(i),c=await wj(l);if(r.log!==void 0){let u=Date.now()-a;r.log(`[mailbox-dispatch] ${e.method} ${J_(e.path)} \u2192 ${c.status} (${u}ms)`)}return c}catch(l){if(r.log!==void 0){let c=Date.now()-a;r.log(`[mailbox-dispatch] ${e.method} ${J_(e.path)} \u2192 ERR (${c}ms)`)}throw l}}function J_(t){let e=t.startsWith("/")?t:`/${t}`,r=e.search(/[?#]/);return r===-1?e:e.slice(0,r)}function yj(t){let e=t.startsWith("/")?t:`/${t}`;return`${_j}${e}`}async function wj(t){let e=await t.text(),r;if(e==="")r=void 0;else try{r=JSON.parse(e)}catch{r=e}let n={};t.headers.forEach((o,i)=>{i.toLowerCase()!==Hi&&(n[i]=o)});let s={status:t.status};return Object.keys(n).length>0&&(s.headers=n),r!==void 0&&(s.body=r),s}var Hi,ku,_j,vu=E(()=>{"use strict";Hi="x-mailbox-channel",ku="1",_j="http://mailbox.local"});import{createHash as G_,createHmac as Ej,timingSafeEqual as Tj}from"node:crypto";function V_(){return async(t,e)=>{let r=K_();if(r===null||Ij(t.req.path)){await e();return}if(t.req.path.startsWith("/mailbox/")&&t.req.header(Hi)===ku){await e();return}let n=t.req.query("token");if(n!==void 0&&qi(n,r)){Nu(t,r),await e();return}if(vj(t,r)){await e();return}return t.req.path.startsWith("/api/")||t.req.path.startsWith("/mailbox/")?t.json({error:"API requires auth; set LMCTL_API_TOKEN"},401):t.redirect("/login",302)}}function K_(){let t=process.env.LMCTL_API_TOKEN;return t&&t.length>0?t:null}function Y_(t){let e=K_();return e!==null&&qi(t,e)}function Nu(t,e,r=new Date){t.header("Set-Cookie",`${Iu}=${Sj(e,r)}; Path=/; HttpOnly; SameSite=Lax`)}function z_(t){t.header("Set-Cookie",`${Iu}=; Path=/; HttpOnly; SameSite=Lax; Max-Age=0`)}function Sj(t,e=new Date){let n=`auth=ok|${new Date(e.getTime()+bj*24*60*60*1e3).toISOString()}`;return Buffer.from(`${n}|${Z_(t,n)}`,"utf8").toString("base64url")}function kj(t,e,r=new Date){let n;try{n=Buffer.from(t,"base64url").toString("utf8")}catch{return!1}let s=n.split("|");if(s.length!==3||s[0]!=="auth=ok")return!1;let o=new Date(s[1]);return Number.isNaN(o.getTime())||o.getTime()<=r.getTime()?!1:qi(s[2],Z_(e,`${s[0]}|${s[1]}`))}function qi(t,e){return Tj(G_("sha256").update(t).digest(),G_("sha256").update(e).digest())}function vj(t,e){let r=/^Bearer\s+(.+)$/i.exec(t.req.header("authorization")??"")?.[1];if(r!==void 0&&qi(r,e))return!0;let n=Nj(t.req.header("cookie")??"")[Iu];return n!==void 0&&kj(n,e)}function Ij(t){return t==="/login"||t==="/logout"}function Nj(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 Z_(t,e){return Ej("sha256",t).update(e).digest("hex")}var Iu,bj,Q_=E(()=>{"use strict";vu();Iu="lmctl_next_session",bj=30});import{existsSync as vn,mkdirSync as xj,readdirSync as Aj,readFileSync as Ji,unlinkSync as $j,writeFileSync as $u}from"node:fs";import{join as Ur}from"node:path";function st(t){if(!Rj.test(t))throw new Error(`invalid memory name "${t}": only alphanumeric characters, underscores, and hyphens are allowed`)}function tg(t,e){let r=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(r===null)return null;let n=r[1],s=r[2].trimStart(),o=n.match(/^type:\s*(.+)$/m),i=n.match(/^description:\s*(.+)$/m),a=o?.[1]?.trim()??"";return Cj(a)?{name:t,type:a,description:i?.[1]?.trim()??null,body:s,created_at:eg,updated_at:eg}:null}function jj(t,e,r,n){let s=r!==null?`
1633
1632
  description: ${r}`:"";return`---
1634
1633
  name: ${t}${s}
1635
1634
  type: ${e}
@@ -1638,7 +1637,7 @@ ${n}`}function Oj(t,e,r,n){let s=Ur(t,Ru),o=`- [${e}.md](${e}.md)${n!==null?` \u
1638
1637
  `)?`${i}
1639
1638
  ${o}
1640
1639
  `:`${i}${o}
1641
- `,$u(s,i,"utf8")}function Lj(t,e){let r=Ur(t,Ru);if(!vn(r))return;let n=Ji(r,"utf8"),s=new RegExp(`^- \\[${rg(e)}\\.md\\].*$\\r?\\n?`,"m");s.test(n)&&$u(r,n.replace(s,""),"utf8")}function rg(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Cj(t){return t==="user"||t==="feedback"||t==="project"||t==="reference"}function ht(t,e){return t.durable_memory_mode==="db"?new Au(e,t.id):new xu(t.local_path)}var Rj,Ru,eg,xu,Au,ju=E(()=>{"use strict";Rj=/^[a-zA-Z0-9_-]+$/;Ru="MEMORY.md",eg="1970-01-01T00:00:00.000Z",xu=class{dir;constructor(e){this.dir=Ur(e,"durable-memory")}read(e){nt(e);let r=Ur(this.dir,`${e}.md`);if(!vn(r))return null;let n=Ji(r,"utf8");return tg(e,n)}write(e){nt(e.name),xj(this.dir,{recursive:!0});let r=Ur(this.dir,`${e.name}.md`),n=!vn(r),s=jj(e.name,e.type,e.description??null,e.body);return $u(r,s,"utf8"),Oj(this.dir,e.name,e.type,e.description??null),{created:n}}index(e){return this.listFiles().filter(r=>e===void 0||e.length===0||e.includes(r.type)).map(({name:r,type:n,description:s,updated_at:o})=>({name:r,type:n,description:s,updated_at:o}))}list(e){return this.listFiles().filter(r=>e===void 0||r.type===e).map(({name:r,type:n,updated_at:s})=>({name:r,type:n,updated_at:s}))}delete(e){nt(e);let r=Ur(this.dir,`${e}.md`);return vn(r)?($j(r),Lj(this.dir,e),!0):!1}listFiles(){if(!vn(this.dir))return[];let e=Aj(this.dir).filter(n=>n.endsWith(".md")&&n!==Ru),r=[];for(let n of e){let s=n.slice(0,-3),o=Ji(Ur(this.dir,n),"utf8"),i=tg(s,o);i!==null&&r.push(i)}return r.sort((n,s)=>n.name.localeCompare(s.name))}};Au=class{dal;projectId;constructor(e,r){this.dal=e,this.projectId=r}read(e){nt(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){nt(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 nt(e),this.dal.deleteDurableMemory(this.projectId,e)}}});function sg(t,e){let{dal:r}=e;t.get("/api/durable-memory/index/:project_id",n=>{let s=Number(n.req.param("project_id")),o=r.getProject(s);if(o===null)return n.json({error:"project not found"},404);let i=ht(o,r),a=n.req.query("types"),l=a!==void 0&&a.length>0?a.split(",").map(c=>c.trim()).filter(Boolean):void 0;return n.json(i.index(l))}),t.get("/api/durable-memory/read/:project_id/:name",n=>{let s=Number(n.req.param("project_id")),o=n.req.param("name"),i=r.getProject(s);if(i===null)return n.json({error:"project not found"},404);let a=ht(i,r),l;try{l=a.read(o)}catch(c){return n.json({error:c.message},400)}return l===null?n.json({error:`memory entry not found: ${o}`},404):n.json(l)}),t.post("/api/durable-memory/write/:project_id",async n=>{let s=Number(n.req.param("project_id")),o=r.getProject(s);if(o===null)return n.json({error:"project not found"},404);let i;try{i=await n.req.json()}catch{return n.json({error:"invalid JSON body"},400)}let a=typeof i.type=="string"?i.type:null,l=typeof i.name=="string"?i.name:null,c=typeof i.body=="string"?i.body:null,u=typeof i.description=="string"?i.description:null;if(a===null||!ng.has(a))return n.json({error:`invalid type: must be one of ${[...ng].join("|")}`},400);if(l===null)return n.json({error:"missing name"},400);if(c===null)return n.json({error:"missing body"},400);let d=ht(o,r),f;try{({created:f}=d.write({type:a,name:l,description:u,body:c}))}catch(m){return n.json({error:m.message},400)}return n.json({success:!0,created_or_updated:f?"created":"updated"})}),t.get("/api/durable-memory/list/:project_id",n=>{let s=Number(n.req.param("project_id")),o=r.getProject(s);if(o===null)return n.json({error:"project not found"},404);let i=ht(o,r),a=n.req.query("type");return n.json(i.list(a))})}var ng,og=E(()=>{"use strict";ju();ng=new Set(["user","feedback","project","reference"])});function Dj(t){let e=4294967295;for(let r=0;r<t.length;r+=1)e=(Mj[(e^t[r])&255]^e>>>8)>>>0;return(e^4294967295)>>>0}function Pj(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 ig(t,e=new Date){let{time:r,date:n}=Pj(e),s=[],o=[],i=0,a=new TextEncoder;for(let _ of t){let g=a.encode(_.name),h=Dj(_.data),b=_.data.length,w=new Uint8Array(30+g.length),k=new DataView(w.buffer);k.setUint32(0,67324752,!0),k.setUint16(4,20,!0),k.setUint16(6,0,!0),k.setUint16(8,0,!0),k.setUint16(10,r,!0),k.setUint16(12,n,!0),k.setUint32(14,h,!0),k.setUint32(18,b,!0),k.setUint32(22,b,!0),k.setUint16(26,g.length,!0),k.setUint16(28,0,!0),w.set(g,30),s.push(w,_.data);let N=new Uint8Array(46+g.length),v=new DataView(N.buffer);v.setUint32(0,33639248,!0),v.setUint16(4,20,!0),v.setUint16(6,20,!0),v.setUint16(8,0,!0),v.setUint16(10,0,!0),v.setUint16(12,r,!0),v.setUint16(14,n,!0),v.setUint32(16,h,!0),v.setUint32(20,b,!0),v.setUint32(24,b,!0),v.setUint16(28,g.length,!0),v.setUint16(30,0,!0),v.setUint16(32,0,!0),v.setUint16(34,0,!0),v.setUint16(36,0,!0),v.setUint32(38,0,!0),v.setUint32(42,i,!0),N.set(g,46),o.push(N),i+=w.length+_.data.length}let l=i,c=0;for(let _ of o)c+=_.length;let u=new Uint8Array(22),d=new DataView(u.buffer);d.setUint32(0,101010256,!0),d.setUint16(4,0,!0),d.setUint16(6,0,!0),d.setUint16(8,t.length,!0),d.setUint16(10,t.length,!0),d.setUint32(12,c,!0),d.setUint32(16,l,!0),d.setUint16(20,0,!0);let f=l+c+u.length,m=new Uint8Array(f),p=0;for(let _ of s)m.set(_,p),p+=_.length;for(let _ of o)m.set(_,p),p+=_.length;return m.set(u,p),m}var Mj,ag=E(()=>{"use strict";Mj=(()=>{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 Vi,mkdirSync as Fj,readdirSync as Uj,readFileSync as ug,statSync as Wj,unlinkSync as Bj,writeFileSync as Hj}from"node:fs";import{join as Ns}from"node:path";function dg(t,e){let{dal:r}=e;t.post("/api/projects",async n=>{let s=await _t(n);if(typeof s=="string")return j(n,s,400);let o=ce(s,"name"),i=ce(s,"local_path");if(o===null||o.length===0)return j(n,"missing or empty name",400);if(i===null||i.length===0)return j(n,"missing or empty local_path",400);if(r.findProjectByName(o)!==null)return j(n,`project already exists: ${o}`,409);let a=ce(s,"workflow_name")??"bugfix",l,c=ce(s,"team_name");if(c!==null&&c.length>0){let d=r.findTeamByName(c);if(d===null)return j(n,`team not found: ${c}`,404);l=d.id}else{let d=r.listTeams();if(d.length===0)return j(n,"no teams exist; create a team first",400);l=d[0].id}let u=r.insertProject({name:o,local_path:i,workflow_name:a,team_id:l,default_branch:ce(s,"default_branch")});return n.json(u,201)}),t.patch("/api/projects/:name",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=await _t(n);if(typeof o=="string")return j(n,o,400);let i={};if(Object.prototype.hasOwnProperty.call(o,"local_path")){let l=o.local_path;if(typeof l!="string"||l.length===0)return j(n,"local_path must be a non-empty string",400);i.local_path=l}if(Object.prototype.hasOwnProperty.call(o,"durable_memory_mode")){let l=o.durable_memory_mode;if(l!=="folder"&&l!=="db")return j(n,'durable_memory_mode must be "folder" or "db"',400);i.durable_memory_mode=l}if(Object.prototype.hasOwnProperty.call(o,"default_branch")){let l=o.default_branch;if(l!==null&&typeof l!="string")return j(n,"default_branch must be string or null",400);i.default_branch=l}if(Object.prototype.hasOwnProperty.call(o,"intake_config")){let l=o.intake_config;if(l===null)i.intake_config=null;else if(typeof l=="string")i.intake_config=l;else if(typeof l=="object"&&!Array.isArray(l))i.intake_config=JSON.stringify(l);else return j(n,"intake_config must be a JSON object, string, or null",400)}let a=r.updateProjectSettings(s.id,i);return a===null?j(n,"project not found",404):n.json(a)}),t.post("/api/teams",async n=>{let s=await _t(n);if(typeof s=="string")return j(n,s,400);let o=ce(s,"name");if(o===null||o.length===0)return j(n,"missing or empty name",400);if(r.findTeamByName(o)!==null)return j(n,`team already exists: ${o}`,409);let i=r.insertTeam({name:o});return n.json(i,201)}),t.post("/api/teams/:name/members",async n=>{let s=r.findTeamByName(n.req.param("name"));if(s===null)return j(n,"team not found",404);let o=await _t(n);if(typeof o=="string")return j(n,o,400);let i=ce(o,"alias"),a=ce(o,"provider");if(i===null||i.length===0)return j(n,"missing or empty alias",400);if(a===null||a.length===0)return j(n,"missing or empty provider",400);if(r.findTeamMemberByAlias(s.id,i)!==null)return j(n,`member already exists: ${i}`,409);let l=ce(o,"model"),c=r.insertTeamMember({team_id:s.id,alias:i,provider:a,model:l,sessiondir:`.lmctl/sessions/${s.name}/${i}`}),u=ce(o,"role_prompt");u!==null&&r.setMemberRolePrompt(c.id,u);let d=r.findTeamMemberByAlias(s.id,i);return n.json(d??c,201)}),t.put("/api/teams/:name/members/:alias",async n=>{let s=r.findTeamByName(n.req.param("name"));if(s===null)return j(n,"team not found",404);let o=r.findTeamMemberByAlias(s.id,n.req.param("alias"));if(o===null)return j(n,"member not found",404);let i=await _t(n);if(typeof i=="string")return j(n,i,400);let a={};if(Object.prototype.hasOwnProperty.call(i,"role_prompt")){let c=i.role_prompt;if(c!==null&&typeof c!="string")return j(n,"role_prompt must be string or null",400);a.role_prompt=c}if(Object.prototype.hasOwnProperty.call(i,"model")){let c=i.model;if(c!==null&&typeof c!="string")return j(n,"model must be string or null",400);a.model=c}if(Object.prototype.hasOwnProperty.call(i,"provider")){let c=i.provider;if(typeof c!="string"||c.length===0)return j(n,"provider must be a non-empty string",400);a.provider=c}if(Object.keys(a).length===0)return j(n,"no updatable fields provided",400);let l=r.updateTeamMemberMeta(o.id,a);return l===null?j(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 j(n,"project not found",404);let o=ht(s,r);return n.json(o.index())}),t.post("/api/projects/:name/durable-memory",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=await _t(n);if(typeof o=="string")return j(n,o,400);let i=ce(o,"name"),a=ce(o,"body"),l=ce(o,"type");if(i===null||i.length===0)return j(n,"missing or empty name",400);if(a===null)return j(n,"missing body",400);if(l===null||!Xi.includes(l))return j(n,`invalid type: must be one of ${Xi.join("|")}`,400);try{nt(i)}catch(d){return j(n,d.message,400)}let c=ht(s,r);try{if(c.read(i)!==null)return j(n,`chapter already exists: ${i}`,409)}catch(d){return j(n,d.message,400)}try{c.write({type:l,name:i,description:ce(o,"description"),body:a})}catch(d){return j(n,d.message,400)}let u=c.read(i);return u===null?j(n,"chapter created but unreadable",500):n.json(u,201)}),t.get("/api/projects/:name/durable-memory/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=ht(s,r),i;try{i=o.read(n.req.param("chapter"))}catch(a){return j(n,a.message,400)}return i===null?j(n,"chapter not found",404):n.json(i)}),t.put("/api/projects/:name/durable-memory/:chapter",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=n.req.param("chapter"),i=await _t(n);if(typeof i=="string")return j(n,i,400);let a=ht(s,r),l;try{l=a.read(o)}catch(m){return j(n,m.message,400)}if(l===null)return j(n,"chapter not found",404);let c=ce(i,"body")??l.body,u=Object.prototype.hasOwnProperty.call(i,"description")?ce(i,"description"):l.description,d=ce(i,"type")??l.type;if(!Xi.includes(d))return j(n,`invalid type: must be one of ${Xi.join("|")}`,400);try{a.write({type:d,name:o,description:u,body:c})}catch(m){return j(n,m.message,400)}let f=a.read(o);return f===null?j(n,"chapter updated but unreadable",500):n.json(f)}),t.delete("/api/projects/:name/durable-memory/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=ht(s,r),i;try{i=o.delete(n.req.param("chapter"))}catch(a){return j(n,a.message,400)}return i?n.json({removed:!0}):j(n,"chapter not found",404)}),t.get("/api/projects/:name/ai-test",n=>{let s=r.findProjectByName(n.req.param("name"));return s===null?j(n,"project not found",404):n.json(Jj(s.local_path))}),t.post("/api/projects/:name/ai-test",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=await _t(n);if(typeof o=="string")return j(n,o,400);let i=ce(o,"name"),a=ce(o,"body"),l=ce(o,"type");if(i===null||i.length===0)return j(n,"missing or empty name",400);if(a===null)return j(n,"missing body",400);if(l===null||!Gi.has(l))return j(n,`invalid type: must be one of ${[...Gi].join("|")}`,400);try{nt(i)}catch(f){return j(n,f.message,400)}let c=vs(s.local_path),u=Ns(c,`${i}.md`);if(Vi(u))return j(n,`chapter already exists: ${i}`,409);Fj(c,{recursive:!0}),cg(u,i,l,ce(o,"description"),a);let d=Is(c,i);return d===null?j(n,"chapter created but unreadable",500):n.json(d,201)}),t.get("/api/projects/:name/ai-test/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);try{nt(n.req.param("chapter"))}catch(i){return j(n,i.message,400)}let o=Is(vs(s.local_path),n.req.param("chapter"));return o===null?j(n,"chapter not found",404):n.json(o)}),t.put("/api/projects/:name/ai-test/:chapter",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=n.req.param("chapter");try{nt(o)}catch(m){return j(n,m.message,400)}let i=vs(s.local_path),a=Is(i,o);if(a===null)return j(n,"chapter not found",404);let l=await _t(n);if(typeof l=="string")return j(n,l,400);let c=ce(l,"body")??a.body,u=Object.prototype.hasOwnProperty.call(l,"description")?ce(l,"description"):a.description,d=ce(l,"type")??a.type;if(!Gi.has(d))return j(n,`invalid type: must be one of ${[...Gi].join("|")}`,400);cg(Ns(i,`${o}.md`),o,d,u,c);let f=Is(i,o);return f===null?j(n,"chapter updated but unreadable",500):n.json(f)}),t.delete("/api/projects/:name/ai-test/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=n.req.param("chapter");try{nt(o)}catch(a){return j(n,a.message,400)}let i=Ns(vs(s.local_path),`${o}.md`);return Vi(i)?(Bj(i),n.json({removed:!0})):j(n,"chapter not found",404)}),t.get("/api/tokens",n=>n.json([])),t.post("/api/tokens",n=>j(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 _t(n);return typeof s=="string"?j(n,s,400):n.json({accepted:s,note:"settings persistence not yet implemented"})}),t.get("/api/chat/sessions",n=>n.json(r.listChatbotSessions(lg))),t.post("/api/chat/sessions",async n=>{let s=await qj(n);if(typeof s=="string")return j(n,s,400);let o=s!==null?ce(s,"title"):null,i=r.createChatbotSession(lg,o);return n.json(i,201)}),t.get("/api/chat/sessions/:id/messages",n=>{let s=n.req.param("id");return r.getChatbotSession(s)===null?j(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 j(n,"chat session not found",404);let o=await _t(n);if(typeof o=="string")return j(n,o,400);let i=ce(o,"role"),a=ce(o,"content");if(i===null||i!=="user"&&i!=="assistant"&&i!=="tool")return j(n,"role must be one of user|assistant|tool",400);if(a===null)return j(n,"missing content",400);let l=r.appendChatbotMessage(s,i,a);return n.json(l,201)}),t.get("/api/runs/:id/artifacts.zip",n=>{let s=Number(n.req.param("id"));if(!Number.isInteger(s))return j(n,"invalid run id",400);if(r.getRun(s)===null)return j(n,"run not found",404);let i=Cr(r,s),a=[];for(let c of i){let u=Gj(c),d=null;if(c.content!==null&&c.content!==void 0)d=new TextEncoder().encode(c.content);else if(c.path!==null&&c.path!==void 0)try{let f=ug(c.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);d=new Uint8Array(m)}catch{d=new Uint8Array(0)}d!==null&&a.push({name:u,data:d})}let l=ig(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 j(t,e,r){return t.json({error:e},r)}async function _t(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 qj(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 vs(t){return Ns(t,"ai-test")}function Is(t,e){let r=Ns(t,`${e}.md`);if(!Vi(r))return null;let n=ug(r,"utf8"),s=Xj(n),o=Wj(r).mtime.toISOString();return{name:e,type:s.type,description:s.description,body:s.body,updated_at:o}}function Jj(t){let e=vs(t);return Vi(e)?Uj(e).filter(r=>r.endsWith(".md")&&r!=="index.md").map(r=>r.slice(0,-3)).sort().map(r=>{let n=Is(e,r);if(n===null)return null;let{name:s,type:o,description:i,updated_at:a}=n;return{name:s,type:o,description:i,updated_at:a}}).filter(r=>r!==null):[]}function cg(t,e,r,n,s){let o=n!==null&&n.length>0?`
1640
+ `,$u(s,i,"utf8")}function Lj(t,e){let r=Ur(t,Ru);if(!vn(r))return;let n=Ji(r,"utf8"),s=new RegExp(`^- \\[${rg(e)}\\.md\\].*$\\r?\\n?`,"m");s.test(n)&&$u(r,n.replace(s,""),"utf8")}function rg(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Cj(t){return t==="user"||t==="feedback"||t==="project"||t==="reference"}function ht(t,e){return t.durable_memory_mode==="db"?new Au(e,t.id):new xu(t.local_path)}var Rj,Ru,eg,xu,Au,ju=E(()=>{"use strict";Rj=/^[a-zA-Z0-9_-]+$/;Ru="MEMORY.md",eg="1970-01-01T00:00:00.000Z",xu=class{dir;constructor(e){this.dir=Ur(e,"durable-memory")}read(e){st(e);let r=Ur(this.dir,`${e}.md`);if(!vn(r))return null;let n=Ji(r,"utf8");return tg(e,n)}write(e){st(e.name),xj(this.dir,{recursive:!0});let r=Ur(this.dir,`${e.name}.md`),n=!vn(r),s=jj(e.name,e.type,e.description??null,e.body);return $u(r,s,"utf8"),Oj(this.dir,e.name,e.type,e.description??null),{created:n}}index(e){return this.listFiles().filter(r=>e===void 0||e.length===0||e.includes(r.type)).map(({name:r,type:n,description:s,updated_at:o})=>({name:r,type:n,description:s,updated_at:o}))}list(e){return this.listFiles().filter(r=>e===void 0||r.type===e).map(({name:r,type:n,updated_at:s})=>({name:r,type:n,updated_at:s}))}delete(e){st(e);let r=Ur(this.dir,`${e}.md`);return vn(r)?($j(r),Lj(this.dir,e),!0):!1}listFiles(){if(!vn(this.dir))return[];let e=Aj(this.dir).filter(n=>n.endsWith(".md")&&n!==Ru),r=[];for(let n of e){let s=n.slice(0,-3),o=Ji(Ur(this.dir,n),"utf8"),i=tg(s,o);i!==null&&r.push(i)}return r.sort((n,s)=>n.name.localeCompare(s.name))}};Au=class{dal;projectId;constructor(e,r){this.dal=e,this.projectId=r}read(e){st(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){st(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 st(e),this.dal.deleteDurableMemory(this.projectId,e)}}});function sg(t,e){let{dal:r}=e;t.get("/api/durable-memory/index/:project_id",n=>{let s=Number(n.req.param("project_id")),o=r.getProject(s);if(o===null)return n.json({error:"project not found"},404);let i=ht(o,r),a=n.req.query("types"),l=a!==void 0&&a.length>0?a.split(",").map(c=>c.trim()).filter(Boolean):void 0;return n.json(i.index(l))}),t.get("/api/durable-memory/read/:project_id/:name",n=>{let s=Number(n.req.param("project_id")),o=n.req.param("name"),i=r.getProject(s);if(i===null)return n.json({error:"project not found"},404);let a=ht(i,r),l;try{l=a.read(o)}catch(c){return n.json({error:c.message},400)}return l===null?n.json({error:`memory entry not found: ${o}`},404):n.json(l)}),t.post("/api/durable-memory/write/:project_id",async n=>{let s=Number(n.req.param("project_id")),o=r.getProject(s);if(o===null)return n.json({error:"project not found"},404);let i;try{i=await n.req.json()}catch{return n.json({error:"invalid JSON body"},400)}let a=typeof i.type=="string"?i.type:null,l=typeof i.name=="string"?i.name:null,c=typeof i.body=="string"?i.body:null,u=typeof i.description=="string"?i.description:null;if(a===null||!ng.has(a))return n.json({error:`invalid type: must be one of ${[...ng].join("|")}`},400);if(l===null)return n.json({error:"missing name"},400);if(c===null)return n.json({error:"missing body"},400);let d=ht(o,r),f;try{({created:f}=d.write({type:a,name:l,description:u,body:c}))}catch(m){return n.json({error:m.message},400)}return n.json({success:!0,created_or_updated:f?"created":"updated"})}),t.get("/api/durable-memory/list/:project_id",n=>{let s=Number(n.req.param("project_id")),o=r.getProject(s);if(o===null)return n.json({error:"project not found"},404);let i=ht(o,r),a=n.req.query("type");return n.json(i.list(a))})}var ng,og=E(()=>{"use strict";ju();ng=new Set(["user","feedback","project","reference"])});function Dj(t){let e=4294967295;for(let r=0;r<t.length;r+=1)e=(Mj[(e^t[r])&255]^e>>>8)>>>0;return(e^4294967295)>>>0}function Pj(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 ig(t,e=new Date){let{time:r,date:n}=Pj(e),s=[],o=[],i=0,a=new TextEncoder;for(let h of t){let g=a.encode(h.name),_=Dj(h.data),b=h.data.length,w=new Uint8Array(30+g.length),k=new DataView(w.buffer);k.setUint32(0,67324752,!0),k.setUint16(4,20,!0),k.setUint16(6,0,!0),k.setUint16(8,0,!0),k.setUint16(10,r,!0),k.setUint16(12,n,!0),k.setUint32(14,_,!0),k.setUint32(18,b,!0),k.setUint32(22,b,!0),k.setUint16(26,g.length,!0),k.setUint16(28,0,!0),w.set(g,30),s.push(w,h.data);let N=new Uint8Array(46+g.length),v=new DataView(N.buffer);v.setUint32(0,33639248,!0),v.setUint16(4,20,!0),v.setUint16(6,20,!0),v.setUint16(8,0,!0),v.setUint16(10,0,!0),v.setUint16(12,r,!0),v.setUint16(14,n,!0),v.setUint32(16,_,!0),v.setUint32(20,b,!0),v.setUint32(24,b,!0),v.setUint16(28,g.length,!0),v.setUint16(30,0,!0),v.setUint16(32,0,!0),v.setUint16(34,0,!0),v.setUint16(36,0,!0),v.setUint32(38,0,!0),v.setUint32(42,i,!0),N.set(g,46),o.push(N),i+=w.length+h.data.length}let l=i,c=0;for(let h of o)c+=h.length;let u=new Uint8Array(22),d=new DataView(u.buffer);d.setUint32(0,101010256,!0),d.setUint16(4,0,!0),d.setUint16(6,0,!0),d.setUint16(8,t.length,!0),d.setUint16(10,t.length,!0),d.setUint32(12,c,!0),d.setUint32(16,l,!0),d.setUint16(20,0,!0);let f=l+c+u.length,m=new Uint8Array(f),p=0;for(let h of s)m.set(h,p),p+=h.length;for(let h of o)m.set(h,p),p+=h.length;return m.set(u,p),m}var Mj,ag=E(()=>{"use strict";Mj=(()=>{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 Vi,mkdirSync as Fj,readdirSync as Uj,readFileSync as ug,statSync as Wj,unlinkSync as Bj,writeFileSync as Hj}from"node:fs";import{join as Ns}from"node:path";function dg(t,e){let{dal:r}=e;t.post("/api/projects",async n=>{let s=await _t(n);if(typeof s=="string")return j(n,s,400);let o=ce(s,"name"),i=ce(s,"local_path");if(o===null||o.length===0)return j(n,"missing or empty name",400);if(i===null||i.length===0)return j(n,"missing or empty local_path",400);if(r.findProjectByName(o)!==null)return j(n,`project already exists: ${o}`,409);let a=ce(s,"workflow_name")??"bugfix",l,c=ce(s,"team_name");if(c!==null&&c.length>0){let d=r.findTeamByName(c);if(d===null)return j(n,`team not found: ${c}`,404);l=d.id}else{let d=r.listTeams();if(d.length===0)return j(n,"no teams exist; create a team first",400);l=d[0].id}let u=r.insertProject({name:o,local_path:i,workflow_name:a,team_id:l,default_branch:ce(s,"default_branch")});return n.json(u,201)}),t.patch("/api/projects/:name",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=await _t(n);if(typeof o=="string")return j(n,o,400);let i={};if(Object.prototype.hasOwnProperty.call(o,"local_path")){let l=o.local_path;if(typeof l!="string"||l.length===0)return j(n,"local_path must be a non-empty string",400);i.local_path=l}if(Object.prototype.hasOwnProperty.call(o,"durable_memory_mode")){let l=o.durable_memory_mode;if(l!=="folder"&&l!=="db")return j(n,'durable_memory_mode must be "folder" or "db"',400);i.durable_memory_mode=l}if(Object.prototype.hasOwnProperty.call(o,"default_branch")){let l=o.default_branch;if(l!==null&&typeof l!="string")return j(n,"default_branch must be string or null",400);i.default_branch=l}if(Object.prototype.hasOwnProperty.call(o,"intake_config")){let l=o.intake_config;if(l===null)i.intake_config=null;else if(typeof l=="string")i.intake_config=l;else if(typeof l=="object"&&!Array.isArray(l))i.intake_config=JSON.stringify(l);else return j(n,"intake_config must be a JSON object, string, or null",400)}let a=r.updateProjectSettings(s.id,i);return a===null?j(n,"project not found",404):n.json(a)}),t.post("/api/teams",async n=>{let s=await _t(n);if(typeof s=="string")return j(n,s,400);let o=ce(s,"name");if(o===null||o.length===0)return j(n,"missing or empty name",400);if(r.findTeamByName(o)!==null)return j(n,`team already exists: ${o}`,409);let i=r.insertTeam({name:o});return n.json(i,201)}),t.post("/api/teams/:name/members",async n=>{let s=r.findTeamByName(n.req.param("name"));if(s===null)return j(n,"team not found",404);let o=await _t(n);if(typeof o=="string")return j(n,o,400);let i=ce(o,"alias"),a=ce(o,"provider");if(i===null||i.length===0)return j(n,"missing or empty alias",400);if(a===null||a.length===0)return j(n,"missing or empty provider",400);if(r.findTeamMemberByAlias(s.id,i)!==null)return j(n,`member already exists: ${i}`,409);let l=ce(o,"model"),c=r.insertTeamMember({team_id:s.id,alias:i,provider:a,model:l,sessiondir:`.lmctl/sessions/${s.name}/${i}`}),u=ce(o,"role_prompt");u!==null&&r.setMemberRolePrompt(c.id,u);let d=r.findTeamMemberByAlias(s.id,i);return n.json(d??c,201)}),t.put("/api/teams/:name/members/:alias",async n=>{let s=r.findTeamByName(n.req.param("name"));if(s===null)return j(n,"team not found",404);let o=r.findTeamMemberByAlias(s.id,n.req.param("alias"));if(o===null)return j(n,"member not found",404);let i=await _t(n);if(typeof i=="string")return j(n,i,400);let a={};if(Object.prototype.hasOwnProperty.call(i,"role_prompt")){let c=i.role_prompt;if(c!==null&&typeof c!="string")return j(n,"role_prompt must be string or null",400);a.role_prompt=c}if(Object.prototype.hasOwnProperty.call(i,"model")){let c=i.model;if(c!==null&&typeof c!="string")return j(n,"model must be string or null",400);a.model=c}if(Object.prototype.hasOwnProperty.call(i,"provider")){let c=i.provider;if(typeof c!="string"||c.length===0)return j(n,"provider must be a non-empty string",400);a.provider=c}if(Object.keys(a).length===0)return j(n,"no updatable fields provided",400);let l=r.updateTeamMemberMeta(o.id,a);return l===null?j(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 j(n,"project not found",404);let o=ht(s,r);return n.json(o.index())}),t.post("/api/projects/:name/durable-memory",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=await _t(n);if(typeof o=="string")return j(n,o,400);let i=ce(o,"name"),a=ce(o,"body"),l=ce(o,"type");if(i===null||i.length===0)return j(n,"missing or empty name",400);if(a===null)return j(n,"missing body",400);if(l===null||!Xi.includes(l))return j(n,`invalid type: must be one of ${Xi.join("|")}`,400);try{st(i)}catch(d){return j(n,d.message,400)}let c=ht(s,r);try{if(c.read(i)!==null)return j(n,`chapter already exists: ${i}`,409)}catch(d){return j(n,d.message,400)}try{c.write({type:l,name:i,description:ce(o,"description"),body:a})}catch(d){return j(n,d.message,400)}let u=c.read(i);return u===null?j(n,"chapter created but unreadable",500):n.json(u,201)}),t.get("/api/projects/:name/durable-memory/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=ht(s,r),i;try{i=o.read(n.req.param("chapter"))}catch(a){return j(n,a.message,400)}return i===null?j(n,"chapter not found",404):n.json(i)}),t.put("/api/projects/:name/durable-memory/:chapter",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=n.req.param("chapter"),i=await _t(n);if(typeof i=="string")return j(n,i,400);let a=ht(s,r),l;try{l=a.read(o)}catch(m){return j(n,m.message,400)}if(l===null)return j(n,"chapter not found",404);let c=ce(i,"body")??l.body,u=Object.prototype.hasOwnProperty.call(i,"description")?ce(i,"description"):l.description,d=ce(i,"type")??l.type;if(!Xi.includes(d))return j(n,`invalid type: must be one of ${Xi.join("|")}`,400);try{a.write({type:d,name:o,description:u,body:c})}catch(m){return j(n,m.message,400)}let f=a.read(o);return f===null?j(n,"chapter updated but unreadable",500):n.json(f)}),t.delete("/api/projects/:name/durable-memory/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=ht(s,r),i;try{i=o.delete(n.req.param("chapter"))}catch(a){return j(n,a.message,400)}return i?n.json({removed:!0}):j(n,"chapter not found",404)}),t.get("/api/projects/:name/ai-test",n=>{let s=r.findProjectByName(n.req.param("name"));return s===null?j(n,"project not found",404):n.json(Jj(s.local_path))}),t.post("/api/projects/:name/ai-test",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=await _t(n);if(typeof o=="string")return j(n,o,400);let i=ce(o,"name"),a=ce(o,"body"),l=ce(o,"type");if(i===null||i.length===0)return j(n,"missing or empty name",400);if(a===null)return j(n,"missing body",400);if(l===null||!Gi.has(l))return j(n,`invalid type: must be one of ${[...Gi].join("|")}`,400);try{st(i)}catch(f){return j(n,f.message,400)}let c=vs(s.local_path),u=Ns(c,`${i}.md`);if(Vi(u))return j(n,`chapter already exists: ${i}`,409);Fj(c,{recursive:!0}),cg(u,i,l,ce(o,"description"),a);let d=Is(c,i);return d===null?j(n,"chapter created but unreadable",500):n.json(d,201)}),t.get("/api/projects/:name/ai-test/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);try{st(n.req.param("chapter"))}catch(i){return j(n,i.message,400)}let o=Is(vs(s.local_path),n.req.param("chapter"));return o===null?j(n,"chapter not found",404):n.json(o)}),t.put("/api/projects/:name/ai-test/:chapter",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=n.req.param("chapter");try{st(o)}catch(m){return j(n,m.message,400)}let i=vs(s.local_path),a=Is(i,o);if(a===null)return j(n,"chapter not found",404);let l=await _t(n);if(typeof l=="string")return j(n,l,400);let c=ce(l,"body")??a.body,u=Object.prototype.hasOwnProperty.call(l,"description")?ce(l,"description"):a.description,d=ce(l,"type")??a.type;if(!Gi.has(d))return j(n,`invalid type: must be one of ${[...Gi].join("|")}`,400);cg(Ns(i,`${o}.md`),o,d,u,c);let f=Is(i,o);return f===null?j(n,"chapter updated but unreadable",500):n.json(f)}),t.delete("/api/projects/:name/ai-test/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=n.req.param("chapter");try{st(o)}catch(a){return j(n,a.message,400)}let i=Ns(vs(s.local_path),`${o}.md`);return Vi(i)?(Bj(i),n.json({removed:!0})):j(n,"chapter not found",404)}),t.get("/api/tokens",n=>n.json([])),t.post("/api/tokens",n=>j(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 _t(n);return typeof s=="string"?j(n,s,400):n.json({accepted:s,note:"settings persistence not yet implemented"})}),t.get("/api/chat/sessions",n=>n.json(r.listChatbotSessions(lg))),t.post("/api/chat/sessions",async n=>{let s=await qj(n);if(typeof s=="string")return j(n,s,400);let o=s!==null?ce(s,"title"):null,i=r.createChatbotSession(lg,o);return n.json(i,201)}),t.get("/api/chat/sessions/:id/messages",n=>{let s=n.req.param("id");return r.getChatbotSession(s)===null?j(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 j(n,"chat session not found",404);let o=await _t(n);if(typeof o=="string")return j(n,o,400);let i=ce(o,"role"),a=ce(o,"content");if(i===null||i!=="user"&&i!=="assistant"&&i!=="tool")return j(n,"role must be one of user|assistant|tool",400);if(a===null)return j(n,"missing content",400);let l=r.appendChatbotMessage(s,i,a);return n.json(l,201)}),t.get("/api/runs/:id/artifacts.zip",n=>{let s=Number(n.req.param("id"));if(!Number.isInteger(s))return j(n,"invalid run id",400);if(r.getRun(s)===null)return j(n,"run not found",404);let i=Cr(r,s),a=[];for(let c of i){let u=Gj(c),d=null;if(c.content!==null&&c.content!==void 0)d=new TextEncoder().encode(c.content);else if(c.path!==null&&c.path!==void 0)try{let f=ug(c.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);d=new Uint8Array(m)}catch{d=new Uint8Array(0)}d!==null&&a.push({name:u,data:d})}let l=ig(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 j(t,e,r){return t.json({error:e},r)}async function _t(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 qj(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 vs(t){return Ns(t,"ai-test")}function Is(t,e){let r=Ns(t,`${e}.md`);if(!Vi(r))return null;let n=ug(r,"utf8"),s=Xj(n),o=Wj(r).mtime.toISOString();return{name:e,type:s.type,description:s.description,body:s.body,updated_at:o}}function Jj(t){let e=vs(t);return Vi(e)?Uj(e).filter(r=>r.endsWith(".md")&&r!=="index.md").map(r=>r.slice(0,-3)).sort().map(r=>{let n=Is(e,r);if(n===null)return null;let{name:s,type:o,description:i,updated_at:a}=n;return{name:s,type:o,description:i,updated_at:a}}).filter(r=>r!==null):[]}function cg(t,e,r,n,s){let o=n!==null&&n.length>0?`
1642
1641
  description: ${n}`:"",i=`---
1643
1642
  name: ${e}${o}
1644
1643
  type: ${r}
@@ -1708,23 +1707,23 @@ ${s}`;Hj(t,i,"utf8")}function Xj(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r
1708
1707
  JOIN step s ON s.id = sa.step_id
1709
1708
  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 o=s[0].id,i=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
1710
1709
  JOIN step s ON s.id = sa.step_id
1711
- WHERE s.run_id = ? ORDER BY sa.id ASC`,t),l=new Map;for(let $ of a){let Z=l.get($.step_id)??[];Z.push({kind:$.kind,id:$.id}),l.set($.step_id,Z)}let c=i.map($=>({id:$.id,state_name:$.state_name,outcome:$.outcome,duration_ms:$.started_at!==null&&$.ended_at!==null?Math.max(0,new Date($.ended_at).getTime()-new Date($.started_at).getTime()):null,artifacts:l.get($.id)??[]})),u=e.query("SELECT kind, COUNT(*) AS count FROM session_event WHERE run_id = ? GROUP BY kind",t),d=e.query("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'tool_result' AND payload_truncated = 0",t),f=0;for(let $ of d)try{let Z=JSON.parse($.payload);typeof Z.elapsedMs=="number"&&Z.elapsedMs>0&&(f+=Z.elapsedMs)}catch{}let m=u.map($=>({kind:$.kind,count:$.count,total_elapsed_ms:$.kind==="tool_result"?f:0})),p=c.filter($=>$.outcome==="request_changes"),_=[...new Set(p.map($=>$.state_name))],g=new Date(n.started_at).getTime(),h=n.ended_at!==null?new Date(n.ended_at).getTime():Date.now(),w=e.query("SELECT project_id FROM job WHERE id = ?",n.job_id)[0]?.project_id??null,k=w!==null?e.query(`SELECT id, signal_kind, severity, description, detected_at FROM drift_signal
1712
- WHERE project_id = ? AND detected_at >= ? AND detected_at <= ? ORDER BY detected_at ASC`,w,g,h):[],v=e.query(`SELECT SUM(input_tokens) AS input, SUM(output_tokens) AS output
1713
- FROM session_size WHERE observed_at >= ? AND observed_at <= ?`,n.started_at,n.ended_at??new Date().toISOString())[0],R=v?.input!==null&&v?.input!==void 0?`input: ${v.input}, output: ${v.output??0}`:"n/a",G=e.getWorkflow(n.workflow_id),M=n.started_at!==null&&n.ended_at!==null?Math.max(0,new Date(n.ended_at).getTime()-new Date(n.started_at).getTime()):null,L={run_id:t,workflow_name:G?.name??null,started_at:n.started_at,ended_at:n.ended_at,terminal_state:n.terminal_state,duration_ms:M,steps:c,tool_stats:m,reviewer_interventions:{count:p.length,state_names:_},drift_signals:k,token_totals:R};e.insertStepArtifact({step_id:o,kind:"run_report",content:JSON.stringify(L)})}var pg=E(()=>{"use strict"});import{spawnSync as _g}from"node:child_process";function Lu(t){return Yj[t]??`no install hint; ensure '${t}' is on PATH`}function zj(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 hg(t){return _g("which",[t],{encoding:"utf8"}).status===0}function gg(t){if(t===void 0)return null;for(let e of t.tools??[])if(!hg(e)){let r=Lu(e);return{kind:"missing_tool",tool:e,install_hint:r,message:`missing dependency: ${e}; ${r}`}}for(let e of t.auth??[]){if(!hg(e)){let s=Lu(e);return{kind:"missing_tool",tool:e,install_hint:s,message:`missing dependency: ${e}; ${s}`}}let r=zj(e);if(r===null)continue;let n=_g(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:Lu(e),message:`${e} not authenticated; run \`${e} login\` or equivalent`,detail:s.length>0?s:void 0}}}return null}var Yj,yg=E(()=>{"use strict";Yj={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 Zj,readdirSync as Qj,readFileSync as eO}from"node:fs";import{join as wg}from"node:path";function tO(t){let e=t.match(/^---\n([\s\S]*?)\n---/);if(!e)return[];let r=e[1],n=r.match(/^tags:\s*\[([^\]]*)\]/m);if(n)return n[1].split(",").map(o=>o.trim()).filter(Boolean);let s=r.match(/^tags:\s*\n((?:\s*-\s+.+\n?)*)/m);return s?s[1].split(`
1710
+ WHERE s.run_id = ? ORDER BY sa.id ASC`,t),l=new Map;for(let $ of a){let Z=l.get($.step_id)??[];Z.push({kind:$.kind,id:$.id}),l.set($.step_id,Z)}let c=i.map($=>({id:$.id,state_name:$.state_name,outcome:$.outcome,duration_ms:$.started_at!==null&&$.ended_at!==null?Math.max(0,new Date($.ended_at).getTime()-new Date($.started_at).getTime()):null,artifacts:l.get($.id)??[]})),u=e.query("SELECT kind, COUNT(*) AS count FROM session_event WHERE run_id = ? GROUP BY kind",t),d=e.query("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'tool_result' AND payload_truncated = 0",t),f=0;for(let $ of d)try{let Z=JSON.parse($.payload);typeof Z.elapsedMs=="number"&&Z.elapsedMs>0&&(f+=Z.elapsedMs)}catch{}let m=u.map($=>({kind:$.kind,count:$.count,total_elapsed_ms:$.kind==="tool_result"?f:0})),p=c.filter($=>$.outcome==="request_changes"),h=[...new Set(p.map($=>$.state_name))],g=new Date(n.started_at).getTime(),_=n.ended_at!==null?new Date(n.ended_at).getTime():Date.now(),w=e.query("SELECT project_id FROM job WHERE id = ?",n.job_id)[0]?.project_id??null,k=w!==null?e.query(`SELECT id, signal_kind, severity, description, detected_at FROM drift_signal
1711
+ WHERE project_id = ? AND detected_at >= ? AND detected_at <= ? ORDER BY detected_at ASC`,w,g,_):[],v=e.query(`SELECT SUM(input_tokens) AS input, SUM(output_tokens) AS output
1712
+ FROM session_size WHERE observed_at >= ? AND observed_at <= ?`,n.started_at,n.ended_at??new Date().toISOString())[0],R=v?.input!==null&&v?.input!==void 0?`input: ${v.input}, output: ${v.output??0}`:"n/a",G=e.getWorkflow(n.workflow_id),M=n.started_at!==null&&n.ended_at!==null?Math.max(0,new Date(n.ended_at).getTime()-new Date(n.started_at).getTime()):null,L={run_id:t,workflow_name:G?.name??null,started_at:n.started_at,ended_at:n.ended_at,terminal_state:n.terminal_state,duration_ms:M,steps:c,tool_stats:m,reviewer_interventions:{count:p.length,state_names:h},drift_signals:k,token_totals:R};e.insertStepArtifact({step_id:o,kind:"run_report",content:JSON.stringify(L)})}var pg=E(()=>{"use strict"});import{spawnSync as _g}from"node:child_process";function Lu(t){return Yj[t]??`no install hint; ensure '${t}' is on PATH`}function zj(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 hg(t){return _g("which",[t],{encoding:"utf8"}).status===0}function gg(t){if(t===void 0)return null;for(let e of t.tools??[])if(!hg(e)){let r=Lu(e);return{kind:"missing_tool",tool:e,install_hint:r,message:`missing dependency: ${e}; ${r}`}}for(let e of t.auth??[]){if(!hg(e)){let s=Lu(e);return{kind:"missing_tool",tool:e,install_hint:s,message:`missing dependency: ${e}; ${s}`}}let r=zj(e);if(r===null)continue;let n=_g(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:Lu(e),message:`${e} not authenticated; run \`${e} login\` or equivalent`,detail:s.length>0?s:void 0}}}return null}var Yj,yg=E(()=>{"use strict";Yj={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 Zj,readdirSync as Qj,readFileSync as eO}from"node:fs";import{join as wg}from"node:path";function tO(t){let e=t.match(/^---\n([\s\S]*?)\n---/);if(!e)return[];let r=e[1],n=r.match(/^tags:\s*\[([^\]]*)\]/m);if(n)return n[1].split(",").map(o=>o.trim()).filter(Boolean);let s=r.match(/^tags:\s*\n((?:\s*-\s+.+\n?)*)/m);return s?s[1].split(`
1714
1713
  `).map(o=>o.replace(/^\s*-\s+/,"").trim()).filter(Boolean):[]}function Eg(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 Tg(t,e){if(e.length===0)return null;let r=wg(t,"durable-memory");if(!Zj(r))return null;let n;try{n=Qj(r).filter(o=>o.endsWith(".md")&&o!=="index.md")}catch{return null}let s=[];for(let o of n)try{let i=eO(wg(r,o),"utf8");if(tO(i).some(l=>e.includes(l))){let l=Eg(i,"name")??o.replace(".md",""),c=Eg(i,"description");s.push(c?`${l} (${c})`:l)}}catch{}return s.length===0?null:`[Durable-memory entries relevant to this task: ${s.join(", ")}. Pull the full chapter as needed.]`}var bg=E(()=>{"use strict"});function Du(t){let e=t.trim().replace(rO,"").trim();for(let r=0;r<4;r+=1){let n=nO.exec(e);if(n===null)break;e=n[2].trim()}return e}function Sg(t){let e=t.trim(),r=sO.exec(e);if(r!==null)return r[2];let n=oO.exec(e);return n!==null?n[0]:null}function xs(t,e){let r=t.split(`
1715
1714
  `),n=null,s=-1;for(let i=0;i<r.length;i+=1){let a=Du(r[i]),l=Cu.exec(a);if(l===null)continue;let c=l[1].trim();if(Mu.test(c))continue;let u=Sg(c);u!==null&&(n=u,s=i)}if(n===null)return{outcome:null,reason:"no_stance"};if(!e.includes(n))return{outcome:null,reason:"unknown_outcome",actual:n};let o={};for(let i=s-1;i>=0;i-=1){let a=Du(r[i]),l=Cu.exec(a);if(l===null)break;let c=Mu.exec(l[1].trim());if(c===null)break;o[c[1]]=c[2].trim()}return{outcome:n,evidence:o}}function kg(t){let e=t.split(`
1716
- `),r=null;for(let n=0;n<e.length;n+=1){let s=Du(e[n]),o=Cu.exec(s);if(o===null)continue;let i=o[1].trim();if(Mu.test(i))continue;let a=Sg(i);if(a===null||!Zr(a))continue;let c=i.slice(i.indexOf(a)+a.length).replace(/^[`*_:\s\-–—]+/,"").trim();r={token:a,reason:c}}return r}var rO,nO,Cu,Mu,sO,oO,Pu=E(()=>{"use strict";rs();rO=/^#{1,6}\s+/,nO=/^(```|\*\*|__|`|\*|_)([\s\S]+?)\1$/,Cu=/^STANCE:\s+(.+)$/,Mu=/^([A-Z][A-Z0-9_]*):\s*(.+)$/,sO=/^(```|\*\*|__|`|\*|_)([A-Za-z0-9_-]+)\1/,oO=/^[A-Za-z0-9_-]+/});function vg(t,e,r){return n=>{let s=r(),o=Date.now(),i=JSON.stringify({kind:n.kind,tool:n.tool??null,summary:n.summary??null,id:n.id??null,elapsedMs:n.elapsedMs??null,status:n.status??null}),a=Buffer.byteLength(i,"utf8");if(a<=262144){t.insertSessionEvent({run_id:e,step_id:s,kind:n.kind,timestamp_ms:o,payload:i});return}let l=i.slice(0,1024),c=JSON.stringify({truncated:!0,size:a,preview:l});if(s!==null){let u=t.insertStepArtifact({step_id:s,kind:"session_event_overflow",content:i});t.insertSessionEvent({run_id:e,step_id:s,kind:n.kind,timestamp_ms:o,payload:c,payload_truncated:1,overflow_artifact_id:u.id})}else t.insertSessionEvent({run_id:e,step_id:null,kind:n.kind,timestamp_ms:o,payload:c,payload_truncated:1,overflow_artifact_id:null})}}var Ig=E(()=>{"use strict"});import{readFileSync as iO}from"node:fs";import{dirname as aO,join as lO}from"node:path";import{fileURLToPath as cO}from"node:url";function fO(t){return t.rules.map(e=>({command:e.command,subcommands:e.argv_patterns.map(r=>r.trim().split(/\s+/)),kind:e.kind}))}function _O(t){let e=[],r=[];for(let n of t)uO.has(n)?(r.length>0&&e.push(r),r=[]):r.push(n);return r.length>0&&e.push(r),e}function gO(t,e){if(t.length===0)return{matched:!1};let r=0;for(;r<t.length&&dO.test(t[r]);)r+=1;if(r>=t.length)return{matched:!1};let n=t[r],s=t.slice(r+1);for(let o of e)if(n===o.command){for(let i of o.subcommands)if(i.every((l,c)=>s[c]===l))return{matched:!0,kind:o.kind}}return{matched:!1}}function yO(t,e){if(t.length===0)return{matched:!1};let r=_O(t);for(let n of r){let s=gO(n,e);if(s.matched)return s}return{matched:!1}}function Fu(t){return yO(t,hO)}function wO(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 Uu(t){return wO(t).split(" ").filter(e=>e.length>0)}var uO,dO,mO,pO,hO,Ng=E(()=>{"use strict";uO=new Set(["&&","||",";","|",">",">>","<","<<"]),dO=/^[A-Za-z_][A-Za-z0-9_]*=/;mO=aO(cO(import.meta.url)),pO=JSON.parse(iO(lO(mO,"side_effect_classifier.json"),"utf-8")),hO=fO(pO)});function Ki(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 xg(t,e){try{return await Fr(Wu(t)??t,Ki(e))===!0}catch{return!1}}async function Yi(t,e){try{return await Fr(Wu(t)??t,Ki(e))}catch{return}}async function Ag(t,e){if(typeof t!="string")return t;let r=Wu(t);if(r===null)return t;try{return await Fr(r,Ki(e))}catch{return}}async function $g(t,e){let r=Array.from(t.matchAll(/=\{\{([\s\S]*?)\}\}/g));if(r.length===0)return t;let n="",s=0;for(let o of r){let i=o.index??0;n+=t.slice(s,i);let a=o[1]?.trim()??"";try{n+=EO(await Fr(a,Ki(e)))}catch{n+=""}s=i+o[0].length}return n+=t.slice(s),n}function Wu(t){let e=t.trim();return!e.startsWith("={{")||!e.endsWith("}}")?null:e.slice(3,-2).trim()}function EO(t){return t==null?"":typeof t=="string"?t:JSON.stringify(t)}var As=E(()=>{"use strict";wn()});import{existsSync as Rg,readdirSync as jg,readFileSync as TO,statSync as Og}from"node:fs";import{join as Zi}from"node:path";function Lg(t,e,r,n){return Object.assign(t,{stateId:e,state:r,displayName:n})}function X(t,e){return t.dal.insertStep({...e,parent_step_id:t.parent_step_id})}function K(t,e){return e.startsWith("@terminal:")?{kind:"terminal",terminal:e.slice(10)}:t.states[e]===void 0?{kind:"escalate",token:e,reason:`unknown state ref '${e}'`}:{kind:"state",state:e}}function st(t,e,r,n,s={}){let o=F(),i=X(t,{run_id:t.run_id,state_name:e.name});t.steps_executed+=1,t.dal.finishStep(i.id,null,`escalation:${n}`.slice(0,480)),t.dal.setRunPausedState(t.run_id,`${$s}${e.id}`,o);let a=t.dal.getRun(t.run_id),l=Zr(r)?"generic":"unhandled";return t.dal.raiseAttention({kind:Eo,severity:"attn",project_id:t.project.id,run_id:t.run_id,requires_user:!0,payload:JSON.stringify({run_id:t.run_id,step_id:i.id,project_id:t.project.id,workflow_name:t.workflow.name,workflow_version_id:a?.workflow_version_id??null,step:{id:e.id,name:e.name,type:e.type},tier:l,token:r,reason:n,declared_outcomes:[...s.declared_outcomes??[]],agent_output:bO(s.agent_output??n),paused_at:o,created_at:o})}),t.dal.pauseJob(t.job.id),{kind:"paused"}}function bO(t){return t.length>8e3?`${t.slice(0,8e3)}
1717
- \u2026[truncated ${t.length-8e3} chars]`:t}function Y(t,e,r,n){t.outcomes[e]=n,r!==e&&(t.outcomes[r]=n)}function ee(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 Cg(t,e){let r=e.trim();if(r.startsWith("[")){try{let n=JSON.parse(r);if(Array.isArray(n)&&n.every(s=>typeof s=="string"))return n}catch{return null}return null}if(r.startsWith("job.payload.")){let n=r.slice(12);if(n.length===0)return null;let o=_r(t.job.payload)?.[n];if(Array.isArray(o)&&o.every(i=>typeof i=="string"))return o}return null}async function Ye(t,e,r){let n=t.replace(/(?<!=)\{\{\s*([a-zA-Z0-9_.]+)\s*\}\}/g,(s,o)=>{if(o==="run_id")return String(e.run_id);if(o==="state_id")return r;if(o==="item")return e.iteration?.item??"";if(o==="index")return e.iteration===null?"":String(e.iteration.index);if(o.startsWith("project.")){let i=o.slice(8);if(i==="id")return String(e.project.id);if(i==="name")return e.project.name;if(i==="local_path")return e.project.local_path;if(i==="default_branch")return e.project.default_branch??"";if(i==="owner"){let a=e.project.name.indexOf("/");return a>0?e.project.name.slice(0,a):""}if(i==="repo"){let a=e.project.name.indexOf("/");return a>0?e.project.name.slice(a+1):e.project.name}if(i==="test_command"){let a=e.project.test_command;return a===null||a===""?"npm test":a}return""}if(o==="job_payload"){let i=_r(e.job.payload);return i===null?"":JSON.stringify(i)}if(o.startsWith("job_payload.")){let i=o.slice(12),l=_r(e.job.payload)?.[i];return l==null?"":String(l)}if(o.startsWith("outcomes.")){let i=SO(e.outcomes,o.slice(9));return i==null?"":typeof i=="string"?i:JSON.stringify(i)}return""});return $g(n,e)}function SO(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 _r(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 Rs(t){let{context:e,stateId:r,member:n,prompt:s,stepId:o,timeoutMs:i,writesToProjectPath:a}=t,l=vg(e.dal,e.run_id,()=>o),c=Bu(e,r),u={violation:null},d=b=>{if(l(b),u.violation===null&&b.kind==="tool_use"&&b.tool==="Bash"&&b.summary){let w=Uu(b.summary),k=Fu(w);k.matched&&!c&&(u.violation={summary:b.summary,kind:k.kind})}},f=new Date(Date.now()-1),m=0,p=0,_=b=>{d(b),kO(b,(w,k)=>{m+=w,p+=k})},g=await an({sessionid:n.sessionid,sessiondir:n.sessiondir,prompt:s,timeoutMs:i,dal:e.dal,team_member_id:n.id,onProgress:_});e.dal.insertSessionEvent({run_id:e.run_id,step_id:o,kind:"agent_call",timestamp_ms:Date.now(),payload:JSON.stringify({alias:n.alias,provider:Ae(n),model:n.model??"unknown",tokens_in:m,tokens_out:p,wall_time_ms:g.ms})}),vO(e.project,e.dal,f);let h=u.violation;return h!==null?{kind:"g3_violation",summary:h.summary,violationKind:h.kind}:!a&&e.project.local_path.trim().length>0&&Hu(e.project.local_path,f)?{kind:"g2_violation"}:{kind:"ok",text:g.text,ms:g.ms,argv:g.argv}}function kO(t,e){let r=t.raw;if(r==null)return;let s=r.message?.usage;if(s!==void 0){let i=zi(s.input_tokens),a=zi(s.output_tokens);(i>0||a>0)&&e(i,a);return}let o=r.usage;if(o!==void 0){let i=zi(o.input_tokens),a=zi(o.output_tokens);(i>0||a>0)&&e(i,a)}}function zi(t){return typeof t=="number"&&Number.isFinite(t)&&t>=0?t:0}async function Zt(t,e,r,n){if(r.sessionid===null)return;let s=`${e}:write_back`,o=X(t,{run_id:t.run_id,state_name:s});t.steps_executed+=1;let a=`This state completed successfully.${typeof n=="string"?` Category hint: "${n}".`:""} Did you learn anything worth preserving in durable-memory? If yes, use Write to create/update an entry under <project>/durable-memory/<descriptive-name>.md. Include YAML frontmatter (name/description/type[/tags]). Be brief \u2014 one entry per insight. If you didn't learn anything new, respond with \`STANCE: no_writeback\` and the engine moves on.`;try{let l=await Rs({context:t,stateId:s,member:r,prompt:a,stepId:o.id,timeoutMs:t.workflow.default_task_timeout_ms,writesToProjectPath:!1});if(l.kind==="ok"){t.dal.insertStepArtifact({step_id:o.id,kind:"write_back_transcript",content:l.text});let c=!l.text.includes("STANCE: no_writeback");t.dal.finishStep(o.id,c?"wrote_back":"no_writeback","write_back_turn")}else t.dal.finishStep(o.id,null,`write_back_${l.kind}`)}catch{t.dal.finishStep(o.id,null,"write_back_error")}}async function In(t,e,r,n,s,o,i,a=!1,l){let c=t.membersByAlias.get(r.alias);if(c===void 0||c.sessionid===null)return{outcome:null,text:"",status_detail:`missing_agent:${r.alias}`};let u=X(t,{run_id:t.run_id,state_name:e});t.steps_executed+=1;let d=[];c.prompt_snapshot!==null&&c.prompt_snapshot.length>0&&d.push(c.prompt_snapshot),o&&d.push(Fm(s)),l!=null&&l.length>0&&d.push(l);let f=r.prompt_template!==void 0?await Ye(r.prompt_template,t,e):"";f.length>0&&d.push(f),n!==null&&n.length>0&&d.push(n);let m=d.join(`
1715
+ `),r=null;for(let n=0;n<e.length;n+=1){let s=Du(e[n]),o=Cu.exec(s);if(o===null)continue;let i=o[1].trim();if(Mu.test(i))continue;let a=Sg(i);if(a===null||!Zr(a))continue;let c=i.slice(i.indexOf(a)+a.length).replace(/^[`*_:\s\-–—]+/,"").trim();r={token:a,reason:c}}return r}var rO,nO,Cu,Mu,sO,oO,Pu=E(()=>{"use strict";rs();rO=/^#{1,6}\s+/,nO=/^(```|\*\*|__|`|\*|_)([\s\S]+?)\1$/,Cu=/^STANCE:\s+(.+)$/,Mu=/^([A-Z][A-Z0-9_]*):\s*(.+)$/,sO=/^(```|\*\*|__|`|\*|_)([A-Za-z0-9_-]+)\1/,oO=/^[A-Za-z0-9_-]+/});function vg(t,e,r){return n=>{let s=r(),o=Date.now(),i=JSON.stringify({kind:n.kind,tool:n.tool??null,summary:n.summary??null,id:n.id??null,elapsedMs:n.elapsedMs??null,status:n.status??null}),a=Buffer.byteLength(i,"utf8");if(a<=262144){t.insertSessionEvent({run_id:e,step_id:s,kind:n.kind,timestamp_ms:o,payload:i});return}let l=i.slice(0,1024),c=JSON.stringify({truncated:!0,size:a,preview:l});if(s!==null){let u=t.insertStepArtifact({step_id:s,kind:"session_event_overflow",content:i});t.insertSessionEvent({run_id:e,step_id:s,kind:n.kind,timestamp_ms:o,payload:c,payload_truncated:1,overflow_artifact_id:u.id})}else t.insertSessionEvent({run_id:e,step_id:null,kind:n.kind,timestamp_ms:o,payload:c,payload_truncated:1,overflow_artifact_id:null})}}var Ig=E(()=>{"use strict"});import{readFileSync as iO}from"node:fs";import{dirname as aO,join as lO}from"node:path";import{fileURLToPath as cO}from"node:url";function fO(t){return t.rules.map(e=>({command:e.command,subcommands:e.argv_patterns.map(r=>r.trim().split(/\s+/)),kind:e.kind}))}function _O(t){let e=[],r=[];for(let n of t)uO.has(n)?(r.length>0&&e.push(r),r=[]):r.push(n);return r.length>0&&e.push(r),e}function gO(t,e){if(t.length===0)return{matched:!1};let r=0;for(;r<t.length&&dO.test(t[r]);)r+=1;if(r>=t.length)return{matched:!1};let n=t[r],s=t.slice(r+1);for(let o of e)if(n===o.command){for(let i of o.subcommands)if(i.every((l,c)=>s[c]===l))return{matched:!0,kind:o.kind}}return{matched:!1}}function yO(t,e){if(t.length===0)return{matched:!1};let r=_O(t);for(let n of r){let s=gO(n,e);if(s.matched)return s}return{matched:!1}}function Fu(t){return yO(t,hO)}function wO(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 Uu(t){return wO(t).split(" ").filter(e=>e.length>0)}var uO,dO,mO,pO,hO,Ng=E(()=>{"use strict";uO=new Set(["&&","||",";","|",">",">>","<","<<"]),dO=/^[A-Za-z_][A-Za-z0-9_]*=/;mO=aO(cO(import.meta.url)),pO=JSON.parse(iO(lO(mO,"side_effect_classifier.json"),"utf-8")),hO=fO(pO)});function Ki(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 xg(t,e){try{return await Fr(Wu(t)??t,Ki(e))===!0}catch{return!1}}async function Yi(t,e){try{return await Fr(Wu(t)??t,Ki(e))}catch{return}}async function Ag(t,e){if(typeof t!="string")return t;let r=Wu(t);if(r===null)return t;try{return await Fr(r,Ki(e))}catch{return}}async function $g(t,e){let r=Array.from(t.matchAll(/=\{\{([\s\S]*?)\}\}/g));if(r.length===0)return t;let n="",s=0;for(let o of r){let i=o.index??0;n+=t.slice(s,i);let a=o[1]?.trim()??"";try{n+=EO(await Fr(a,Ki(e)))}catch{n+=""}s=i+o[0].length}return n+=t.slice(s),n}function Wu(t){let e=t.trim();return!e.startsWith("={{")||!e.endsWith("}}")?null:e.slice(3,-2).trim()}function EO(t){return t==null?"":typeof t=="string"?t:JSON.stringify(t)}var As=E(()=>{"use strict";wn()});import{existsSync as Rg,readdirSync as jg,readFileSync as TO,statSync as Og}from"node:fs";import{join as Zi}from"node:path";function Lg(t,e,r,n){return Object.assign(t,{stateId:e,state:r,displayName:n})}function X(t,e){return t.dal.insertStep({...e,parent_step_id:t.parent_step_id})}function K(t,e){return e.startsWith("@terminal:")?{kind:"terminal",terminal:e.slice(10)}:t.states[e]===void 0?{kind:"escalate",token:e,reason:`unknown state ref '${e}'`}:{kind:"state",state:e}}function ot(t,e,r,n,s={}){let o=F(),i=X(t,{run_id:t.run_id,state_name:e.name});t.steps_executed+=1,t.dal.finishStep(i.id,null,`escalation:${n}`.slice(0,480)),t.dal.setRunPausedState(t.run_id,`${$s}${e.id}`,o);let a=t.dal.getRun(t.run_id),l=Zr(r)?"generic":"unhandled";return t.dal.raiseAttention({kind:Eo,severity:"attn",project_id:t.project.id,run_id:t.run_id,requires_user:!0,payload:JSON.stringify({run_id:t.run_id,step_id:i.id,project_id:t.project.id,workflow_name:t.workflow.name,workflow_version_id:a?.workflow_version_id??null,step:{id:e.id,name:e.name,type:e.type},tier:l,token:r,reason:n,declared_outcomes:[...s.declared_outcomes??[]],agent_output:bO(s.agent_output??n),paused_at:o,created_at:o})}),t.dal.pauseJob(t.job.id),{kind:"paused"}}function bO(t){return t.length>8e3?`${t.slice(0,8e3)}
1716
+ \u2026[truncated ${t.length-8e3} chars]`:t}function Y(t,e,r,n){t.outcomes[e]=n,r!==e&&(t.outcomes[r]=n)}function ee(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 Cg(t,e){let r=e.trim();if(r.startsWith("[")){try{let n=JSON.parse(r);if(Array.isArray(n)&&n.every(s=>typeof s=="string"))return n}catch{return null}return null}if(r.startsWith("job.payload.")){let n=r.slice(12);if(n.length===0)return null;let o=_r(t.job.payload)?.[n];if(Array.isArray(o)&&o.every(i=>typeof i=="string"))return o}return null}async function ze(t,e,r){let n=t.replace(/(?<!=)\{\{\s*([a-zA-Z0-9_.]+)\s*\}\}/g,(s,o)=>{if(o==="run_id")return String(e.run_id);if(o==="state_id")return r;if(o==="item")return e.iteration?.item??"";if(o==="index")return e.iteration===null?"":String(e.iteration.index);if(o.startsWith("project.")){let i=o.slice(8);if(i==="id")return String(e.project.id);if(i==="name")return e.project.name;if(i==="local_path")return e.project.local_path;if(i==="default_branch")return e.project.default_branch??"";if(i==="owner"){let a=e.project.name.indexOf("/");return a>0?e.project.name.slice(0,a):""}if(i==="repo"){let a=e.project.name.indexOf("/");return a>0?e.project.name.slice(a+1):e.project.name}if(i==="test_command"){let a=e.project.test_command;return a===null||a===""?"npm test":a}return""}if(o==="job_payload"){let i=_r(e.job.payload);return i===null?"":JSON.stringify(i)}if(o.startsWith("job_payload.")){let i=o.slice(12),l=_r(e.job.payload)?.[i];return l==null?"":String(l)}if(o.startsWith("outcomes.")){let i=SO(e.outcomes,o.slice(9));return i==null?"":typeof i=="string"?i:JSON.stringify(i)}return""});return $g(n,e)}function SO(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 _r(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 Rs(t){let{context:e,stateId:r,member:n,prompt:s,stepId:o,timeoutMs:i,writesToProjectPath:a}=t,l=vg(e.dal,e.run_id,()=>o),c=Bu(e,r),u={violation:null},d=b=>{if(l(b),u.violation===null&&b.kind==="tool_use"&&b.tool==="Bash"&&b.summary){let w=Uu(b.summary),k=Fu(w);k.matched&&!c&&(u.violation={summary:b.summary,kind:k.kind})}},f=new Date(Date.now()-1),m=0,p=0,h=b=>{d(b),kO(b,(w,k)=>{m+=w,p+=k})},g=await an({sessionid:n.sessionid,sessiondir:n.sessiondir,prompt:s,timeoutMs:i,dal:e.dal,team_member_id:n.id,onProgress:h});e.dal.insertSessionEvent({run_id:e.run_id,step_id:o,kind:"agent_call",timestamp_ms:Date.now(),payload:JSON.stringify({alias:n.alias,provider:Ae(n),model:n.model??"unknown",tokens_in:m,tokens_out:p,wall_time_ms:g.ms})}),vO(e.project,e.dal,f);let _=u.violation;return _!==null?{kind:"g3_violation",summary:_.summary,violationKind:_.kind}:!a&&e.project.local_path.trim().length>0&&Hu(e.project.local_path,f)?{kind:"g2_violation"}:{kind:"ok",text:g.text,ms:g.ms,argv:g.argv}}function kO(t,e){let r=t.raw;if(r==null)return;let s=r.message?.usage;if(s!==void 0){let i=zi(s.input_tokens),a=zi(s.output_tokens);(i>0||a>0)&&e(i,a);return}let o=r.usage;if(o!==void 0){let i=zi(o.input_tokens),a=zi(o.output_tokens);(i>0||a>0)&&e(i,a)}}function zi(t){return typeof t=="number"&&Number.isFinite(t)&&t>=0?t:0}async function Zt(t,e,r,n){if(r.sessionid===null)return;let s=`${e}:write_back`,o=X(t,{run_id:t.run_id,state_name:s});t.steps_executed+=1;let a=`This state completed successfully.${typeof n=="string"?` Category hint: "${n}".`:""} Did you learn anything worth preserving in durable-memory? If yes, use Write to create/update an entry under <project>/durable-memory/<descriptive-name>.md. Include YAML frontmatter (name/description/type[/tags]). Be brief \u2014 one entry per insight. If you didn't learn anything new, respond with \`STANCE: no_writeback\` and the engine moves on.`;try{let l=await Rs({context:t,stateId:s,member:r,prompt:a,stepId:o.id,timeoutMs:t.workflow.default_task_timeout_ms,writesToProjectPath:!1});if(l.kind==="ok"){t.dal.insertStepArtifact({step_id:o.id,kind:"write_back_transcript",content:l.text});let c=!l.text.includes("STANCE: no_writeback");t.dal.finishStep(o.id,c?"wrote_back":"no_writeback","write_back_turn")}else t.dal.finishStep(o.id,null,`write_back_${l.kind}`)}catch{t.dal.finishStep(o.id,null,"write_back_error")}}async function In(t,e,r,n,s,o,i,a=!1,l){let c=t.membersByAlias.get(r.alias);if(c===void 0||c.sessionid===null)return{outcome:null,text:"",status_detail:`missing_agent:${r.alias}`};let u=X(t,{run_id:t.run_id,state_name:e});t.steps_executed+=1;let d=[];c.prompt_snapshot!==null&&c.prompt_snapshot.length>0&&d.push(c.prompt_snapshot),o&&d.push(Fm(s)),l!=null&&l.length>0&&d.push(l);let f=r.prompt_template!==void 0?await ze(r.prompt_template,t,e):"";f.length>0&&d.push(f),n!==null&&n.length>0&&d.push(n);let m=d.join(`
1718
1717
 
1719
- `);try{let p=await Rs({context:t,stateId:e,member:c,prompt:m,stepId:u.id,timeoutMs:i,writesToProjectPath:a});if(p.kind==="g3_violation"||p.kind==="g2_violation"){let g=p.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${p.violationKind}`:"policy_violation:writes_to_project_path";return t.dal.insertSessionEvent({run_id:t.run_id,step_id:u.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(p.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:e,kind:p.violationKind,command_summary:p.summary,message:`State ${e} ran a classified side-effect command (${p.violationKind}) without a preceding approved Pause`}:{violation:"writes_to_project_path",state_id:e,message:`State ${e} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(u.id,null,g),{outcome:null,text:"",status_detail:g}}if(t.dal.insertStepArtifact({step_id:u.id,kind:`${e}_transcript`,content:p.text}),t.transcripts[e]=p.text,!o)return t.dal.finishStep(u.id,"done",`chat_ms=${p.ms}`),t.outcomes[e]="done",{outcome:"done",text:p.text,status_detail:`chat_ms=${p.ms}`};let _=xs(p.text,s);return t.dal.finishStep(u.id,_.outcome,_.outcome!==null?`chat_ms=${p.ms}`:_.reason),_.outcome!==null&&(t.outcomes[e]=_.outcome),{outcome:_.outcome,text:p.text,status_detail:_.outcome!==null?`chat_ms=${p.ms}`:_.reason}}catch(p){let _=p instanceof Ie?`chat_${p.kind}`:"chat_other";return t.dal.finishStep(u.id,null,_),{outcome:null,text:"",status_detail:_}}}function Nn(t,e){return(e?.length??0)>0?Tg(t.project.local_path,e):null}function Mg(t){return Fu(Uu(t))}function Bu(t,e){let r=t.dal.query(`SELECT state_name, outcome FROM step
1718
+ `);try{let p=await Rs({context:t,stateId:e,member:c,prompt:m,stepId:u.id,timeoutMs:i,writesToProjectPath:a});if(p.kind==="g3_violation"||p.kind==="g2_violation"){let g=p.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${p.violationKind}`:"policy_violation:writes_to_project_path";return t.dal.insertSessionEvent({run_id:t.run_id,step_id:u.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(p.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:e,kind:p.violationKind,command_summary:p.summary,message:`State ${e} ran a classified side-effect command (${p.violationKind}) without a preceding approved Pause`}:{violation:"writes_to_project_path",state_id:e,message:`State ${e} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(u.id,null,g),{outcome:null,text:"",status_detail:g}}if(t.dal.insertStepArtifact({step_id:u.id,kind:`${e}_transcript`,content:p.text}),t.transcripts[e]=p.text,!o)return t.dal.finishStep(u.id,"done",`chat_ms=${p.ms}`),t.outcomes[e]="done",{outcome:"done",text:p.text,status_detail:`chat_ms=${p.ms}`};let h=xs(p.text,s);return t.dal.finishStep(u.id,h.outcome,h.outcome!==null?`chat_ms=${p.ms}`:h.reason),h.outcome!==null&&(t.outcomes[e]=h.outcome),{outcome:h.outcome,text:p.text,status_detail:h.outcome!==null?`chat_ms=${p.ms}`:h.reason}}catch(p){let h=p instanceof Ie?`chat_${p.kind}`:"chat_other";return t.dal.finishStep(u.id,null,h),{outcome:null,text:"",status_detail:h}}}function Nn(t,e){return(e?.length??0)>0?Tg(t.project.local_path,e):null}function Mg(t){return Fu(Uu(t))}function Bu(t,e){let r=t.dal.query(`SELECT state_name, outcome FROM step
1720
1719
  WHERE run_id = ? AND state_name != ? AND ended_at IS NOT NULL
1721
1720
  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 Hu(t,e){if(!Rg(t))return!1;let r=Zi(t,"durable-memory");function n(s){let o;try{o=jg(s,{withFileTypes:!0})}catch{return!1}for(let i of o){if(i.name===".git")continue;let a=Zi(s,i.name);if(a!==r)if(i.isDirectory()){if(n(a))return!0}else try{if(Og(a).mtime>e)return!0}catch{}}return!1}return n(t)}function vO(t,e,r){let n=Zi(t.local_path,"durable-memory");if(!Rg(n))return;let s;try{s=jg(n)}catch{return}for(let o of s){if(!o.endsWith(".md")||o==="MEMORY.md")continue;let i=Zi(n,o),a;try{a=Og(i).mtime}catch{continue}if(a<=r)continue;let l;try{l=TO(i,"utf8")}catch{continue}let c=NO(l);if(c===null){process.stderr.write(`[durable-memory-sync] warning: ${o} has no valid frontmatter, skipping
1722
- `);continue}if(t.durable_memory_mode==="db")try{e.upsertDurableMemory({project_id:t.id,type:c.type,name:c.name,description:c.description,body:c.body})}catch{}}}function NO(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(e===null)return null;let r=e[1],n=e[2].trimStart(),s=r.match(/^name:\s*(.+)$/m),o=r.match(/^type:\s*(.+)$/m),i=r.match(/^description:\s*(.+)$/m),a=s?.[1]?.trim(),l=o?.[1]?.trim();return a===void 0||a.length===0||l===void 0||!IO.has(l)?null:{name:a,type:l,description:i?.[1]?.trim()??null,body:n}}var $s,IO,qe=E(()=>{"use strict";Ue();En();ds();bg();Pu();rs();Ig();Ng();As();$s="__paused__:";IO=new Set(["user","feedback","project","reference"])});import{spawnSync as Dg}from"node:child_process";function xO(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let o=t.project.local_path,i=Dg("git",["diff","--quiet"],{cwd:o}).status!==0,a=Dg("git",["diff","--cached","--quiet"],{cwd:o}).status!==0;if(i||a){let l=e.fail_message??"repository has uncommitted changes";return t.dal.finishStep(s.id,null,l),Y(t,r,n,du),{kind:"terminal",terminal:ee(t.workflow)}}return t.dal.finishStep(s.id,"clean","repo_clean"),Y(t,r,n,"clean"),K(t.workflow,e.next)}var Pg,Fg=E(()=>{"use strict";qe();Pg={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=>xO(t,t.state)}});async function AO(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;for(let o of e.branches)if(await xg(o.when,t))return t.dal.finishStep(s.id,"matched",o.when),Y(t,r,n,"matched"),K(t.workflow,o.next);return t.dal.finishStep(s.id,"no_match","choice_no_match"),Y(t,r,n,"no_match"),e.default_next!==void 0?K(t.workflow,e.default_next):{kind:"terminal",terminal:t.workflow.terminals.no_match?"no_match":ee(t.workflow)}}var Ug,Wg=E(()=>{"use strict";qe();As();Ug={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=>AO(t,t.state)}});async function $O(t,e){let r=t.stateId,n=t.displayName,s=t.workflow.default_task_timeout_ms,o=e.researchers??[],i=Nn(t,e.durable_memory_tags),a=new Array(o.length).fill(null);await Promise.all(o.map(async(m,p)=>{let _=`${n}:researcher_${m.alias}[${p}]`,g=await In(t,_,m,`TOPIC: ${m.topic}`,[],!1,s,!1,i);g.text.length>0&&(a[p]=g.text)}));let l=a.map((m,p)=>m!==null?`# Research ${p+1}: ${o[p]?.topic??""}
1721
+ `);continue}if(t.durable_memory_mode==="db")try{e.upsertDurableMemory({project_id:t.id,type:c.type,name:c.name,description:c.description,body:c.body})}catch{}}}function NO(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(e===null)return null;let r=e[1],n=e[2].trimStart(),s=r.match(/^name:\s*(.+)$/m),o=r.match(/^type:\s*(.+)$/m),i=r.match(/^description:\s*(.+)$/m),a=s?.[1]?.trim(),l=o?.[1]?.trim();return a===void 0||a.length===0||l===void 0||!IO.has(l)?null:{name:a,type:l,description:i?.[1]?.trim()??null,body:n}}var $s,IO,Je=E(()=>{"use strict";We();En();ds();bg();Pu();rs();Ig();Ng();As();$s="__paused__:";IO=new Set(["user","feedback","project","reference"])});import{spawnSync as Dg}from"node:child_process";function xO(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let o=t.project.local_path,i=Dg("git",["diff","--quiet"],{cwd:o}).status!==0,a=Dg("git",["diff","--cached","--quiet"],{cwd:o}).status!==0;if(i||a){let l=e.fail_message??"repository has uncommitted changes";return t.dal.finishStep(s.id,null,l),Y(t,r,n,du),{kind:"terminal",terminal:ee(t.workflow)}}return t.dal.finishStep(s.id,"clean","repo_clean"),Y(t,r,n,"clean"),K(t.workflow,e.next)}var Pg,Fg=E(()=>{"use strict";Je();Pg={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=>xO(t,t.state)}});async function AO(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;for(let o of e.branches)if(await xg(o.when,t))return t.dal.finishStep(s.id,"matched",o.when),Y(t,r,n,"matched"),K(t.workflow,o.next);return t.dal.finishStep(s.id,"no_match","choice_no_match"),Y(t,r,n,"no_match"),e.default_next!==void 0?K(t.workflow,e.default_next):{kind:"terminal",terminal:t.workflow.terminals.no_match?"no_match":ee(t.workflow)}}var Ug,Wg=E(()=>{"use strict";Je();As();Ug={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=>AO(t,t.state)}});async function $O(t,e){let r=t.stateId,n=t.displayName,s=t.workflow.default_task_timeout_ms,o=e.researchers??[],i=Nn(t,e.durable_memory_tags),a=new Array(o.length).fill(null);await Promise.all(o.map(async(m,p)=>{let h=`${n}:researcher_${m.alias}[${p}]`,g=await In(t,h,m,`TOPIC: ${m.topic}`,[],!1,s,!1,i);g.text.length>0&&(a[p]=g.text)}));let l=a.map((m,p)=>m!==null?`# Research ${p+1}: ${o[p]?.topic??""}
1723
1722
  ${m}`:null).filter(m=>m!==null).join(`
1724
1723
 
1725
- `),c=`${n}:consolidator`,u=await In(t,c,e.consolidator,l.length>0?l:null,["ok","error"],!0,s,!1,i),d=X(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,u.outcome===null||u.outcome==="error"){t.dal.finishStep(d.id,u.outcome,u.status_detail),u.outcome==="error"&&Y(t,r,n,"error");let m=e.outcomes.error;return m!==void 0?K(t.workflow,m):{kind:"terminal",terminal:ee(t.workflow)}}let f=e.research_artifact_prefix??n;if(t.dal.insertStepArtifact({step_id:d.id,kind:`${f}_consolidated`,content:u.text}),t.dal.finishStep(d.id,"ok","consolidated"),Y(t,r,n,"ok"),e.write_back_durable_memory){let m=t.membersByAlias.get(e.consolidator.alias);m!==void 0&&await Zt(t,n,m,e.write_back_durable_memory)}return K(t.workflow,e.outcomes.ok)}var Bg,Hg=E(()=>{"use strict";qe();Bg={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=>$O(t,t.state)}});async function RO(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let o=t.progress_step_id;t.progress_step_id=s.id;try{let i=await Yi(e.items_from,t),a=CO(i);if(a===null){t.dal.finishStep(s.id,null,`foreach_invalid_items:${e.items_from}`);let f=e.outcomes.any_failed;return f!==void 0?K(t.workflow,f):{kind:"terminal",terminal:ee(t.workflow)}}let l={routed:null},c=e.mode==="parallel"?await OO(t,e,s.id,a,l):await jO(t,e,s.id,a,l);if(l.routed!==null)return t.dal.finishStep(s.id,null,`foreach_propagated:${l.routed.kind}`),l.routed;let u=c.some(f=>f.outcome===null||f.outcome==="__failure__"),d=u?"any_failed":"all_ok";if(t.dal.finishStep(s.id,d,JSON.stringify({iterations:c,count:a.length})),Y(t,r,n,d),u){let f=e.outcomes.any_failed;return f!==void 0?K(t.workflow,f):{kind:"terminal",terminal:ee(t.workflow)}}return K(t.workflow,e.outcomes.all_ok)}finally{t.progress_step_id=o}}async function jO(t,e,r,n,s){let o=[];for(let i=0;i<n.length;i+=1){let a=await Jg(t,e,r,n[i],i,s);if(s.routed!==null||(o.push(a),(a.outcome===null||a.outcome==="__failure__")&&e.on_item_failure==="stop"))break}return o}async function OO(t,e,r,n,s){let o=new Array(n.length),i=0,a=Array.from({length:Math.min(e.max_concurrency,n.length)},async()=>{for(;i<n.length&&s.routed===null;){let l=i;i+=1,o[l]=await Jg(t,e,r,n[l],l,s)}});return await Promise.all(a),o}async function Jg(t,e,r,n,s,o){let i=t.iteration;t.iteration={item:n,index:s};let a=`${t.displayName}[${s}]`;t.emit_progress?.({kind:"item_started",data:{index:s,item:n}});let l;try{l=await t.dispatchState(a,e.body,{parent_step_id:r,iteration:{item:n,index:s}})}finally{t.iteration=i}(l.kind==="paused"||l.kind==="escalate")&&o.routed===null&&(o.routed=l);let u=l.kind==="terminal"&&t.workflow.terminals[l.terminal]?.kind==="failure"?"__failure__":LO(t.outcomes[a]);return t.emit_progress?.({kind:u===null||u==="__failure__"?"item_failed":"item_completed",data:{index:s,item:n,outcome:u}}),{index:s,value:n,outcome:u}}function LO(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function CO(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 qg,Xg=E(()=>{"use strict";qe();As();qg={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=>RO(t,t.state)}});async function MO(t,e){let r=t.stateId,n=t.displayName,s=e.termination.timeout_seconds!==void 0?e.termination.timeout_seconds*1e3:void 0,o=t.membersByAlias.get(e.agent.alias);if(o===void 0||o.sessionid===null){let f=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(f.id,null,`missing_agent:${e.agent.alias}`),{kind:"terminal",terminal:ee(t.workflow)}}let i=Nn(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,o,e.write_back_durable_memory),K(t.workflow,e.outcomes.done);if(a.status==="waiting_agent"){if(a.turn_count>=e.termination.max_turns){t.dal.finishStep(a.step_id,"timeout",`max_turns=${e.termination.max_turns}`),Y(t,r,n,"timeout");let m=e.outcomes.timeout;return m!==void 0?K(t.workflow,m):{kind:"terminal",terminal:ee(t.workflow)}}let f=a.last_operator_input??"";try{let m=await Rs({context:t,stateId:n,member:o,prompt:f,stepId:a.step_id,timeoutMs:s,writesToProjectPath:!1});if(m.kind==="g3_violation"||m.kind==="g2_violation"){let p=m.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${m.violationKind}`:"policy_violation:writes_to_project_path";return t.dal.insertSessionEvent({run_id:t.run_id,step_id:a.step_id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(m.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:n,kind:m.violationKind,command_summary:m.summary,message:`State ${n} ran a classified side-effect command (${m.violationKind}) without a preceding approved gate`}:{violation:"writes_to_project_path",state_id:n,message:`State ${n} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(a.step_id,null,p),{kind:"terminal",terminal:ee(t.workflow)}}return t.dal.setInteractiveAgentOutput(a.id,m.text,"waiting_operator"),e.termination.agent_signal!==void 0&&m.text.includes(e.termination.agent_signal)?(e.artifact_name!==void 0&&t.dal.insertStepArtifact({step_id:a.step_id,kind:e.artifact_name,content:m.text}),t.dal.finishStep(a.step_id,"done","agent_signal"),Y(t,r,n,"done"),e.write_back_durable_memory&&await Zt(t,n,o,e.write_back_durable_memory),K(t.workflow,e.outcomes.done)):(Gg({context:t,state:e,stateId:r,displayName:n,stepId:a.step_id,agentText:m.text}),{kind:"paused"})}catch(m){let p=m instanceof Ie?`chat_${m.kind}`:"chat_other";return t.dal.finishStep(a.step_id,null,p),{kind:"terminal",terminal:ee(t.workflow)}}}return{kind:"paused"}}let l=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let c=t.dal.insertInteractiveSession({run_id:t.run_id,step_id:l.id,state_name:r,status:"waiting_agent"}),u=await Ye(e.agent.initial_prompt_template,t,n),d=i?`${i}
1724
+ `),c=`${n}:consolidator`,u=await In(t,c,e.consolidator,l.length>0?l:null,["ok","error"],!0,s,!1,i),d=X(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,u.outcome===null||u.outcome==="error"){t.dal.finishStep(d.id,u.outcome,u.status_detail),u.outcome==="error"&&Y(t,r,n,"error");let m=e.outcomes.error;return m!==void 0?K(t.workflow,m):{kind:"terminal",terminal:ee(t.workflow)}}let f=e.research_artifact_prefix??n;if(t.dal.insertStepArtifact({step_id:d.id,kind:`${f}_consolidated`,content:u.text}),t.dal.finishStep(d.id,"ok","consolidated"),Y(t,r,n,"ok"),e.write_back_durable_memory){let m=t.membersByAlias.get(e.consolidator.alias);m!==void 0&&await Zt(t,n,m,e.write_back_durable_memory)}return K(t.workflow,e.outcomes.ok)}var Bg,Hg=E(()=>{"use strict";Je();Bg={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=>$O(t,t.state)}});async function RO(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let o=t.progress_step_id;t.progress_step_id=s.id;try{let i=await Yi(e.items_from,t),a=CO(i);if(a===null){t.dal.finishStep(s.id,null,`foreach_invalid_items:${e.items_from}`);let f=e.outcomes.any_failed;return f!==void 0?K(t.workflow,f):{kind:"terminal",terminal:ee(t.workflow)}}let l={routed:null},c=e.mode==="parallel"?await OO(t,e,s.id,a,l):await jO(t,e,s.id,a,l);if(l.routed!==null)return t.dal.finishStep(s.id,null,`foreach_propagated:${l.routed.kind}`),l.routed;let u=c.some(f=>f.outcome===null||f.outcome==="__failure__"),d=u?"any_failed":"all_ok";if(t.dal.finishStep(s.id,d,JSON.stringify({iterations:c,count:a.length})),Y(t,r,n,d),u){let f=e.outcomes.any_failed;return f!==void 0?K(t.workflow,f):{kind:"terminal",terminal:ee(t.workflow)}}return K(t.workflow,e.outcomes.all_ok)}finally{t.progress_step_id=o}}async function jO(t,e,r,n,s){let o=[];for(let i=0;i<n.length;i+=1){let a=await Jg(t,e,r,n[i],i,s);if(s.routed!==null||(o.push(a),(a.outcome===null||a.outcome==="__failure__")&&e.on_item_failure==="stop"))break}return o}async function OO(t,e,r,n,s){let o=new Array(n.length),i=0,a=Array.from({length:Math.min(e.max_concurrency,n.length)},async()=>{for(;i<n.length&&s.routed===null;){let l=i;i+=1,o[l]=await Jg(t,e,r,n[l],l,s)}});return await Promise.all(a),o}async function Jg(t,e,r,n,s,o){let i=t.iteration;t.iteration={item:n,index:s};let a=`${t.displayName}[${s}]`;t.emit_progress?.({kind:"item_started",data:{index:s,item:n}});let l;try{l=await t.dispatchState(a,e.body,{parent_step_id:r,iteration:{item:n,index:s}})}finally{t.iteration=i}(l.kind==="paused"||l.kind==="escalate")&&o.routed===null&&(o.routed=l);let u=l.kind==="terminal"&&t.workflow.terminals[l.terminal]?.kind==="failure"?"__failure__":LO(t.outcomes[a]);return t.emit_progress?.({kind:u===null||u==="__failure__"?"item_failed":"item_completed",data:{index:s,item:n,outcome:u}}),{index:s,value:n,outcome:u}}function LO(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function CO(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 qg,Xg=E(()=>{"use strict";Je();As();qg={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=>RO(t,t.state)}});async function MO(t,e){let r=t.stateId,n=t.displayName,s=e.termination.timeout_seconds!==void 0?e.termination.timeout_seconds*1e3:void 0,o=t.membersByAlias.get(e.agent.alias);if(o===void 0||o.sessionid===null){let f=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(f.id,null,`missing_agent:${e.agent.alias}`),{kind:"terminal",terminal:ee(t.workflow)}}let i=Nn(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,o,e.write_back_durable_memory),K(t.workflow,e.outcomes.done);if(a.status==="waiting_agent"){if(a.turn_count>=e.termination.max_turns){t.dal.finishStep(a.step_id,"timeout",`max_turns=${e.termination.max_turns}`),Y(t,r,n,"timeout");let m=e.outcomes.timeout;return m!==void 0?K(t.workflow,m):{kind:"terminal",terminal:ee(t.workflow)}}let f=a.last_operator_input??"";try{let m=await Rs({context:t,stateId:n,member:o,prompt:f,stepId:a.step_id,timeoutMs:s,writesToProjectPath:!1});if(m.kind==="g3_violation"||m.kind==="g2_violation"){let p=m.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${m.violationKind}`:"policy_violation:writes_to_project_path";return t.dal.insertSessionEvent({run_id:t.run_id,step_id:a.step_id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(m.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:n,kind:m.violationKind,command_summary:m.summary,message:`State ${n} ran a classified side-effect command (${m.violationKind}) without a preceding approved gate`}:{violation:"writes_to_project_path",state_id:n,message:`State ${n} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(a.step_id,null,p),{kind:"terminal",terminal:ee(t.workflow)}}return t.dal.setInteractiveAgentOutput(a.id,m.text,"waiting_operator"),e.termination.agent_signal!==void 0&&m.text.includes(e.termination.agent_signal)?(e.artifact_name!==void 0&&t.dal.insertStepArtifact({step_id:a.step_id,kind:e.artifact_name,content:m.text}),t.dal.finishStep(a.step_id,"done","agent_signal"),Y(t,r,n,"done"),e.write_back_durable_memory&&await Zt(t,n,o,e.write_back_durable_memory),K(t.workflow,e.outcomes.done)):(Gg({context:t,state:e,stateId:r,displayName:n,stepId:a.step_id,agentText:m.text}),{kind:"paused"})}catch(m){let p=m instanceof Ie?`chat_${m.kind}`:"chat_other";return t.dal.finishStep(a.step_id,null,p),{kind:"terminal",terminal:ee(t.workflow)}}}return{kind:"paused"}}let l=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let c=t.dal.insertInteractiveSession({run_id:t.run_id,step_id:l.id,state_name:r,status:"waiting_agent"}),u=await ze(e.agent.initial_prompt_template,t,n),d=i?`${i}
1726
1725
 
1727
- ${u}`:u;try{let f=await Rs({context:t,stateId:n,member:o,prompt:d,stepId:l.id,timeoutMs:s,writesToProjectPath:!1});if(f.kind==="g3_violation"||f.kind==="g2_violation"){let m=f.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${f.violationKind}`:"policy_violation:writes_to_project_path";return t.dal.insertSessionEvent({run_id:t.run_id,step_id:l.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(f.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:n,kind:f.violationKind,command_summary:f.summary,message:`State ${n} ran a classified side-effect command (${f.violationKind}) without a preceding approved gate`}:{violation:"writes_to_project_path",state_id:n,message:`State ${n} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:ee(t.workflow)}}return t.dal.setInteractiveAgentOutput(c.id,f.text,"waiting_operator"),e.artifact_name!==void 0&&t.dal.insertStepArtifact({step_id:l.id,kind:e.artifact_name,content:f.text}),e.termination.agent_signal!==void 0&&f.text.includes(e.termination.agent_signal)?(t.dal.finishStep(l.id,"done","agent_signal"),t.outcomes[n]="done",e.write_back_durable_memory&&await Zt(t,n,o,e.write_back_durable_memory),K(t.workflow,e.outcomes.done)):(Gg({context:t,state:e,stateId:r,displayName:n,stepId:l.id,agentText:f.text}),{kind:"paused"})}catch(f){let m=f instanceof Ie?`chat_${f.kind}`:"chat_other";return t.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:ee(t.workflow)}}}function Gg(t){let{context:e,state:r,stateId:n,displayName:s,stepId:o,agentText:i}=t,a=F();e.dal.setRunPausedState(e.run_id,`${$s}${n}`,a),e.dal.raiseAttention({kind:"interactive_waiting_operator",severity:"attn",project_id:e.project.id,run_id:e.run_id,requires_user:!0,payload:JSON.stringify(DO({context:e,stateId:s,state:r,stepId:o,agentText:i,pausedAt:a}))}),e.dal.pauseJob(e.job.id)}function DO(t){let{context:e,stateId:r,state:n,stepId:s,agentText:o,pausedAt:i}=t,a=e.dal.getRun(e.run_id),l=PO(e,r),c={kind:"free_text",choices:null};return{run_id:e.run_id,step_id:s,state_name:r,workflow_name:e.workflow.name,workflow_version_id:a?.workflow_version_id??null,node_path:l,prompt:o,expected_response:c,transcript_tail:FO(o,3),paused_at:i,created_run_inputs:_r(e.job.payload)}}function PO(t,e){let r=[],s=t.dal.getRun(t.run_id)?.parent_run_id??null;for(let o=0;o<32&&s!==null;o+=1){let i=t.dal.getRun(s);if(i===null)break;i.current_state!==null&&r.unshift(i.current_state),s=i.parent_run_id}return r.push(e),r}function FO(t,e){if(typeof t!="string"||t.length===0)return[];let r=t.split(/\r?\n/);return(r.length>0&&r[r.length-1]===""?r.slice(0,-1):r).slice(-e)}var Vg,Kg=E(()=>{"use strict";ds();qe();Vg={description:{displayName:"Interactive",name:"interactive",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],emits_progress:!0,builtin:!0},execute:async t=>MO(t,t.state)}});async function UO(t,e){let r=t.stateId,n=t.displayName,s=Cg(t,e.over);if(s===null){let d=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(d.id,null,`loop_invalid_items:${e.over}`);let f=e.outcomes.error;return f!==void 0?K(t.workflow,f):{kind:"terminal",terminal:ee(t.workflow)}}let o=t.workflow.states[e.body];if(o===void 0){let d=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(d.id,null,`loop_body_not_found:${e.body}`),{kind:"terminal",terminal:ee(t.workflow)}}let i=s.slice(0,e.max_items),a=[],l=!1;for(let d=0;d<i.length;d+=1){let f=i[d],m=`${n}[${d}]`,p=t.iteration;t.iteration={item:f,index:d};let _;try{_=await t.dispatchState(m,o,{iteration:{item:f,index:d}})}finally{t.iteration=p}if(_.kind==="paused"||_.kind==="escalate")return _;let g=WO(t.outcomes[m]);if(a.push({index:d,value:f,outcome:g}),g===null&&e.stop_on_error){l=!0;break}}let c=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let u=l?"error":"ok";if(t.dal.finishStep(c.id,u,JSON.stringify({iterations:a,count:i.length})),Y(t,r,n,u),l){let d=e.outcomes.error;return d!==void 0?K(t.workflow,d):{kind:"terminal",terminal:ee(t.workflow)}}return K(t.workflow,e.outcomes.ok)}function WO(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}var Yg,zg=E(()=>{"use strict";qe();Yg={description:{displayName:"Loop",name:"loop",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],builtin:!0},execute:async t=>UO(t,t.state)}});import{createHash as BO}from"node:crypto";import{existsSync as HO,mkdirSync as qO,readFileSync as JO,writeFileSync as XO}from"node:fs";import{dirname as GO,isAbsolute as Qg,normalize as VO,resolve as js}from"node:path";import{Document as KO,ExternalHyperlink as YO,HeadingLevel as xn,LevelFormat as zO,Packer as ZO,Paragraph as gt,Table as QO,TableCell as eL,TableRow as tL,TextRun as yt,WidthType as rL}from"docx";import{marked as nL}from"marked";async function sL(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;try{let o=await oL(t,e,n),i=await iL(t,e),a=await aL(t,e.title),l=await fL(o,a??t.workflow.name);if(l.length===0)throw new Error("rendered DOCX buffer was empty");return qO(GO(i),{recursive:!0}),XO(i,l),t.dal.insertStepArtifact({step_id:s.id,kind:"render_docx",path:i,sha:BO("sha256").update(l).digest("hex"),provider_call_mode:"library"}),t.dal.finishStep(s.id,"done",`wrote:${i}`),Y(t,r,n,{output_path:i,path:i,bytes:l.length}),K(t.workflow,e.outcomes?.done??"@terminal:done")}catch(o){let i=o instanceof Error?o.message:String(o);return t.dal.finishStep(s.id,"error",i),Y(t,r,n,{error:i}),K(t.workflow,e.outcomes?.error??"@terminal:error")}}async function oL(t,e,r){if(typeof e.markdown_source!="string"||e.markdown_source.trim().length===0)throw new Error("markdown_source is required");let n=(await Ye(e.markdown_source,t,r)).trim(),o=(n.length===0?dL(t,e.markdown_source):null)??n;if(o.length===0)throw new Error("markdown_source resolved empty");let i=cL(t.project.local_path,o);if(i!==null){if(!HO(i))throw new Error(`markdown_source file not found: ${i}`);return Qi(JO(i,"utf8"))}return Qi(o)}async function iL(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let r=(await Ye(e.output_path,t,t.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=lL(t.project.local_path,r);if(!n.endsWith(".docx"))throw new Error(`output_path must end with .docx: ${n}`);return n}async function aL(t,e){if(typeof e!="string"||e.trim().length===0)return null;let r=(await Ye(e,t,t.stateId)).trim();return r.length===0?null:r}function lL(t,e){let r=js(t);return VO(Qg(e)?js(e):js(r,e))}function cL(t,e){return uL(e)?Qg(e)?js(e):js(t,e):null}function uL(t){return t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function dL(t,e){let n=/context\.outcomes\.([A-Za-z0-9_-]+)\.output/.exec(e)?.[1];if(n===void 0)return null;let s=Object.entries(t.transcripts).filter(([i])=>i.startsWith(`${n}:coder[`)).sort(([i],[a])=>a.localeCompare(i))[0]?.[1];if(s!==void 0)return Qi(s);let o=t.dal.query(`SELECT sa.content
1726
+ ${u}`:u;try{let f=await Rs({context:t,stateId:n,member:o,prompt:d,stepId:l.id,timeoutMs:s,writesToProjectPath:!1});if(f.kind==="g3_violation"||f.kind==="g2_violation"){let m=f.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${f.violationKind}`:"policy_violation:writes_to_project_path";return t.dal.insertSessionEvent({run_id:t.run_id,step_id:l.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(f.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:n,kind:f.violationKind,command_summary:f.summary,message:`State ${n} ran a classified side-effect command (${f.violationKind}) without a preceding approved gate`}:{violation:"writes_to_project_path",state_id:n,message:`State ${n} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:ee(t.workflow)}}return t.dal.setInteractiveAgentOutput(c.id,f.text,"waiting_operator"),e.artifact_name!==void 0&&t.dal.insertStepArtifact({step_id:l.id,kind:e.artifact_name,content:f.text}),e.termination.agent_signal!==void 0&&f.text.includes(e.termination.agent_signal)?(t.dal.finishStep(l.id,"done","agent_signal"),t.outcomes[n]="done",e.write_back_durable_memory&&await Zt(t,n,o,e.write_back_durable_memory),K(t.workflow,e.outcomes.done)):(Gg({context:t,state:e,stateId:r,displayName:n,stepId:l.id,agentText:f.text}),{kind:"paused"})}catch(f){let m=f instanceof Ie?`chat_${f.kind}`:"chat_other";return t.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:ee(t.workflow)}}}function Gg(t){let{context:e,state:r,stateId:n,displayName:s,stepId:o,agentText:i}=t,a=F();e.dal.setRunPausedState(e.run_id,`${$s}${n}`,a),e.dal.raiseAttention({kind:"interactive_waiting_operator",severity:"attn",project_id:e.project.id,run_id:e.run_id,requires_user:!0,payload:JSON.stringify(DO({context:e,stateId:s,state:r,stepId:o,agentText:i,pausedAt:a}))}),e.dal.pauseJob(e.job.id)}function DO(t){let{context:e,stateId:r,state:n,stepId:s,agentText:o,pausedAt:i}=t,a=e.dal.getRun(e.run_id),l=PO(e,r),c={kind:"free_text",choices:null};return{run_id:e.run_id,step_id:s,state_name:r,workflow_name:e.workflow.name,workflow_version_id:a?.workflow_version_id??null,node_path:l,prompt:o,expected_response:c,transcript_tail:FO(o,3),paused_at:i,created_run_inputs:_r(e.job.payload)}}function PO(t,e){let r=[],s=t.dal.getRun(t.run_id)?.parent_run_id??null;for(let o=0;o<32&&s!==null;o+=1){let i=t.dal.getRun(s);if(i===null)break;i.current_state!==null&&r.unshift(i.current_state),s=i.parent_run_id}return r.push(e),r}function FO(t,e){if(typeof t!="string"||t.length===0)return[];let r=t.split(/\r?\n/);return(r.length>0&&r[r.length-1]===""?r.slice(0,-1):r).slice(-e)}var Vg,Kg=E(()=>{"use strict";ds();Je();Vg={description:{displayName:"Interactive",name:"interactive",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],emits_progress:!0,builtin:!0},execute:async t=>MO(t,t.state)}});async function UO(t,e){let r=t.stateId,n=t.displayName,s=Cg(t,e.over);if(s===null){let d=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(d.id,null,`loop_invalid_items:${e.over}`);let f=e.outcomes.error;return f!==void 0?K(t.workflow,f):{kind:"terminal",terminal:ee(t.workflow)}}let o=t.workflow.states[e.body];if(o===void 0){let d=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(d.id,null,`loop_body_not_found:${e.body}`),{kind:"terminal",terminal:ee(t.workflow)}}let i=s.slice(0,e.max_items),a=[],l=!1;for(let d=0;d<i.length;d+=1){let f=i[d],m=`${n}[${d}]`,p=t.iteration;t.iteration={item:f,index:d};let h;try{h=await t.dispatchState(m,o,{iteration:{item:f,index:d}})}finally{t.iteration=p}if(h.kind==="paused"||h.kind==="escalate")return h;let g=WO(t.outcomes[m]);if(a.push({index:d,value:f,outcome:g}),g===null&&e.stop_on_error){l=!0;break}}let c=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let u=l?"error":"ok";if(t.dal.finishStep(c.id,u,JSON.stringify({iterations:a,count:i.length})),Y(t,r,n,u),l){let d=e.outcomes.error;return d!==void 0?K(t.workflow,d):{kind:"terminal",terminal:ee(t.workflow)}}return K(t.workflow,e.outcomes.ok)}function WO(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}var Yg,zg=E(()=>{"use strict";Je();Yg={description:{displayName:"Loop",name:"loop",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],builtin:!0},execute:async t=>UO(t,t.state)}});import{createHash as BO}from"node:crypto";import{existsSync as HO,mkdirSync as qO,readFileSync as JO,writeFileSync as XO}from"node:fs";import{dirname as GO,isAbsolute as Qg,normalize as VO,resolve as js}from"node:path";import{Document as KO,ExternalHyperlink as YO,HeadingLevel as xn,LevelFormat as zO,Packer as ZO,Paragraph as gt,Table as QO,TableCell as eL,TableRow as tL,TextRun as yt,WidthType as rL}from"docx";import{marked as nL}from"marked";async function sL(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;try{let o=await oL(t,e,n),i=await iL(t,e),a=await aL(t,e.title),l=await fL(o,a??t.workflow.name);if(l.length===0)throw new Error("rendered DOCX buffer was empty");return qO(GO(i),{recursive:!0}),XO(i,l),t.dal.insertStepArtifact({step_id:s.id,kind:"render_docx",path:i,sha:BO("sha256").update(l).digest("hex"),provider_call_mode:"library"}),t.dal.finishStep(s.id,"done",`wrote:${i}`),Y(t,r,n,{output_path:i,path:i,bytes:l.length}),K(t.workflow,e.outcomes?.done??"@terminal:done")}catch(o){let i=o instanceof Error?o.message:String(o);return t.dal.finishStep(s.id,"error",i),Y(t,r,n,{error:i}),K(t.workflow,e.outcomes?.error??"@terminal:error")}}async function oL(t,e,r){if(typeof e.markdown_source!="string"||e.markdown_source.trim().length===0)throw new Error("markdown_source is required");let n=(await ze(e.markdown_source,t,r)).trim(),o=(n.length===0?dL(t,e.markdown_source):null)??n;if(o.length===0)throw new Error("markdown_source resolved empty");let i=cL(t.project.local_path,o);if(i!==null){if(!HO(i))throw new Error(`markdown_source file not found: ${i}`);return Qi(JO(i,"utf8"))}return Qi(o)}async function iL(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let r=(await ze(e.output_path,t,t.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=lL(t.project.local_path,r);if(!n.endsWith(".docx"))throw new Error(`output_path must end with .docx: ${n}`);return n}async function aL(t,e){if(typeof e!="string"||e.trim().length===0)return null;let r=(await ze(e,t,t.stateId)).trim();return r.length===0?null:r}function lL(t,e){let r=js(t);return VO(Qg(e)?js(e):js(r,e))}function cL(t,e){return uL(e)?Qg(e)?js(e):js(t,e):null}function uL(t){return t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function dL(t,e){let n=/context\.outcomes\.([A-Za-z0-9_-]+)\.output/.exec(e)?.[1];if(n===void 0)return null;let s=Object.entries(t.transcripts).filter(([i])=>i.startsWith(`${n}:coder[`)).sort(([i],[a])=>a.localeCompare(i))[0]?.[1];if(s!==void 0)return Qi(s);let o=t.dal.query(`SELECT sa.content
1728
1727
  FROM step_artifact sa
1729
1728
  JOIN step s ON s.id = sa.step_id
1730
1729
  WHERE s.run_id = ?
@@ -1732,18 +1731,18 @@ ${u}`:u;try{let f=await Rs({context:t,stateId:n,member:o,prompt:d,stepId:l.id,ti
1732
1731
  AND sa.content IS NOT NULL
1733
1732
  ORDER BY sa.id DESC
1734
1733
  LIMIT 1`,t.run_id,`${n}:coder[%`);return o[0]?.content===void 0?null:Qi(o[0].content)}function Qi(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}async function fL(t,e){let r=ty(nL.lexer(t,{gfm:!0})),n=new KO({title:e,numbering:{config:[{reference:"ordered-list",levels:[{level:0,format:zO.DECIMAL,text:"%1."}]}]},sections:[{children:r.length===0?[new gt("")]:r}]});return ZO.toBuffer(n)}function ty(t){let e=[];for(let r of t)switch(r.type){case"space":break;case"heading":e.push(new gt({heading:wL(r.depth),children:yr(gr(r))}));break;case"paragraph":e.push(new gt({children:yr(gr(r))}));break;case"text":e.push(new gt({children:gr(r).length===0?[new yt(r.text)]:yr(gr(r))}));break;case"blockquote":e.push(...ty(gr(r)).map(n=>n instanceof gt?n:new gt({children:[new yt(r.text)]})));break;case"list":_L(r)&&e.push(...mL(r));break;case"table":gL(r)&&e.push(pL(r));break;case"code":yL(r)&&e.push(...hL(r));break;case"hr":e.push(new gt(""));break;case"html":r.text.trim().length>0&&e.push(new gt({children:[new yt(r.text)]}));break;default:break}return e}function yr(t,e){let r=[];for(let n of t)switch(n.type){case"text":case"escape":r.push(new yt({text:n.text,...qu(e)}));break;case"strong":r.push(...yr(gr(n),{...e,bold:!0}));break;case"em":r.push(...yr(gr(n),{...e,italics:!0}));break;case"codespan":r.push(new yt({text:n.text,...qu({...e,code:!0})}));break;case"link":r.push(new YO({link:n.href,children:yr(gr(n),{...e})}));break;case"br":r.push(new yt({text:"",break:1}));break;case"image":r.push(new yt({text:`[image: ${n.text}]`,italics:!0}));break;case"del":r.push(new yt({text:n.text,strike:!0}));break;default:r.push(new yt({text:n.raw,...qu(e)}));break}return r.length===0?[new yt("")]:r}function qu(t){return{...t?.bold===!0?{bold:!0}:{},...t?.italics===!0?{italics:!0}:{},...t?.code===!0?{font:"Courier New"}:{}}}function mL(t){return t.items.map(e=>new gt({children:yr(e.tokens.length===1&&e.tokens[0]?.type==="text"?[{...e.tokens[0],text:Zg(e)+e.tokens[0].text}]:[{type:"text",raw:e.text,text:Zg(e)+e.text}]),...t.ordered?{numbering:{reference:"ordered-list",level:0}}:{bullet:{level:0}}}))}function Zg(t){return t.task?`[${t.checked?"x":" "}] `:""}function pL(t){let e=[t.header,...t.rows].map(r=>new tL({children:r.map(n=>new eL({children:[new gt({children:yr(n.tokens,n.header?{bold:!0}:void 0)})]}))}));return new QO({width:{size:100,type:rL.PERCENTAGE},rows:e})}function hL(t){return t.text.split(`
1735
- `).map(r=>new gt({children:[new yt({text:r.length===0?" ":r,font:"Courier New"})]}))}function gr(t){let e=t.tokens;return Array.isArray(e)?e:[]}function _L(t){return t.type==="list"&&Array.isArray(t.items)}function gL(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function yL(t){return t.type==="code"&&typeof t.text=="string"}function wL(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 ey,ry=E(()=>{"use strict";qe();ey={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=>sL(t,t.state)}});import{createHash as EL}from"node:crypto";import{existsSync as TL,mkdirSync as bL,readFileSync as ny,statSync as SL}from"node:fs";import{dirname as kL,isAbsolute as sy,normalize as vL,resolve as Os}from"node:path";import{marked as IL}from"marked";import NL from"write-excel-file/node";async function xL(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;try{let o=await AL(t,e),i=$L(e.input_format),a=await RL(t,e),l=await jL(t,e.title),c=i==="markdown"?WL(o):ML(o);await BL({sheets:c.length===0?[{name:"Sheet1",headers:[],rows:[]}]:c,outputPath:a,title:l??t.workflow.name});let u=SL(a).size;if(u===0)throw new Error("rendered XLSX file was empty");let d=EL("sha256").update(ny(a)).digest("hex");return t.dal.insertStepArtifact({step_id:s.id,kind:"render_xlsx",path:a,sha:d,provider_call_mode:"library"}),t.dal.finishStep(s.id,"done",`wrote:${a}`),Y(t,r,n,{output_path:a,path:a,bytes:u}),K(t.workflow,e.outcomes?.done??"@terminal:done")}catch(o){let i=o instanceof Error?o.message:String(o);return t.dal.finishStep(s.id,"error",i),Y(t,r,n,{error:i}),K(t.workflow,e.outcomes?.error??"@terminal:error")}}async function AL(t,e){if(typeof e.source!="string"||e.source.trim().length===0)return"";let r=(await Ye(e.source,t,t.stateId)).trim(),n=LL(t.project.local_path,r);if(n!==null){if(!TL(n))throw new Error(`source file not found: ${n}`);return ny(n,"utf8")}return r}function $L(t){if(t==null||t==="")return"json";if(t==="json"||t==="markdown")return t;throw new Error(`unsupported input_format: ${String(t)}`)}async function RL(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let r=(await Ye(e.output_path,t,t.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=OL(t.project.local_path,r);if(!n.endsWith(".xlsx"))throw new Error(`output_path must end with .xlsx: ${n}`);return n}async function jL(t,e){if(typeof e!="string"||e.trim().length===0)return null;let r=(await Ye(e,t,t.stateId)).trim();return r.length===0?null:r}function OL(t,e){let r=Os(t);return vL(sy(e)?Os(e):Os(r,e))}function LL(t,e){return CL(e)?sy(e)?Os(e):Os(t,e):null}function CL(t){return t.endsWith(".json")||t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function ML(t){if(t.trim().length===0)return[];let e;try{e=JSON.parse(t)}catch(r){let n=r instanceof Error?r.message:String(r);throw new Error(`invalid JSON source: ${n}`)}if(!ea(e)||!Array.isArray(e.sheets))throw new Error("JSON source must be an object with sheets[]");return e.sheets.map((r,n)=>DL(r,n))}function DL(t,e){if(!ea(t))throw new Error(`sheets[${e}] must be an object`);let r=PL(t.headers,`sheets[${e}].headers`),n=FL(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:UL(t.styles)}}function PL(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 FL(t,e){if(t===void 0)return[];if(!Array.isArray(t))throw new Error(`${e} must be an array`);return t.map((r,n)=>{if(!Array.isArray(r))throw new Error(`${e}[${n}] must be an array`);return r.map((s,o)=>{if(s===null||typeof s=="string"||typeof s=="number"||typeof s=="boolean")return s;throw new Error(`${e}[${n}][${o}] must be string, number, boolean, or null`)})})}function UL(t){if(!ea(t)||!ea(t.headers))return;let e={};return t.headers.bold===!0&&(e.bold=!0),typeof t.headers.fill=="string"&&(e.fill=t.headers.fill),Object.keys(e).length===0?void 0:e}function WL(t){let e=IL.lexer(t,{gfm:!0}),r=[],n=null;for(let s of e){if(KL(s)){n=s.text;continue}YL(s)&&(r.push({name:n??`Sheet${r.length+1}`,headers:s.header.map(o=>o.text),rows:s.rows.map(o=>o.map(i=>i.text)),headerStyle:{bold:!0}}),n=null)}return r}async function BL(t){bL(kL(t.outputPath),{recursive:!0});let e=new Set,r=t.sheets.map(n=>({sheet:XL(n.name,e),data:HL(n),columns:JL(n)}));await NL(r).toFile(t.outputPath)}function HL(t){let e=[];if(t.headers.length>0){let r=VL(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(qL));return e.length===0?[[{}]]:e}function qL(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 JL(t){let e=Math.max(t.headers.length,...t.rows.map(n=>n.length),1),r=[];for(let n=1;n<=e;n+=1){let s=[t.headers[n-1],...t.rows.map(i=>i[n-1])],o=Math.min(60,Math.max(10,...s.map(i=>String(i??"").length+2)));r.push({width:o})}return r}function XL(t,e){let r=GL(t),n=r,s=2;for(;e.has(n.toLowerCase());){let o=` ${s}`;n=`${r.slice(0,31-o.length)}${o}`,s+=1}return e.add(n.toLowerCase()),n}function GL(t){let e=t.replace(/[\[\]:*?/\\]/g," ").trim();return(e.length===0?"Sheet":e).slice(0,31)}function VL(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 KL(t){return t.type==="heading"&&typeof t.text=="string"}function YL(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function ea(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var oy,iy=E(()=>{"use strict";qe();oy={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=>xL(t,t.state)}});import{spawnSync as zL}from"node:child_process";async function QL(t,e){let r=t.stateId,n=t.displayName,s=t.workflow.default_task_timeout_ms;for(let f of e.pre_checks??[])if(zL("sh",["-c",f.command],{cwd:t.project.local_path}).status!==0){let p=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(p.id,"fail_pre_check",`pre_check_failed:${f.description??f.command}`),Y(t,r,n,"fail_pre_check");let _=e.outcomes.fail_pre_check;return _!==void 0?K(t.workflow,_):{kind:"terminal",terminal:ee(t.workflow)}}let o=Nn(t,e.durable_memory_tags),i=e.reviewers??[],a=null,l=i.length===0&&e.outcomes_from_stance!==void 0,c=l?Object.keys(e.outcomes_from_stance):[];for(let f=0;f<e.max_loops;f+=1){let m=`${n}:coder[${f}]`,p=await In(t,m,e.coder,a!==null?`PRIOR REVIEW FEEDBACK:
1736
- ${a}`:null,c,l,s,e.writes_to_project_path===!0,o);if(l){let g=kg(p.text);if(g!==null){let h=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(h.id,null,`escalation_vocab:${g.token}`),{kind:"escalate",token:g.token,reason:g.reason.length>0?`${g.token}: ${g.reason}`:g.token}}}if(p.outcome===null){let g=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(g.id,null,p.status_detail),{kind:"escalate",token:"",reason:`coder_no_outcome:${p.status_detail}`}}if(i.length===0){if(e.outcomes_from_stance!==void 0){let b=Object.keys(e.outcomes_from_stance),w=xs(p.text,b);if(w.outcome===null){let N=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(N.id,null,`unhandled_stance:${w.reason}`),{kind:"escalate",token:"",reason:`no_stance:${w.reason}`}}let k=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(k.id,w.outcome,"outcomes_from_stance"),Y(t,r,n,w.outcome),K(t.workflow,e.outcomes_from_stance[w.outcome])}let g=xs(p.text,ZL);if(g.outcome!==null){let b=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(b.id,g.outcome,"default_failure_stance"),Y(t,r,n,g.outcome),{kind:"escalate",token:g.outcome,reason:`failure_stance:${g.outcome}`}}let h=X(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,t.dal.finishStep(h.id,"approve","no_reviewers"),Y(t,r,n,"approve"),e.write_back_durable_memory){let b=t.membersByAlias.get(e.coder.alias);b!==void 0&&await Zt(t,n,b,e.write_back_durable_memory)}return K(t.workflow,e.outcomes.approve)}let _=await Promise.all(i.map(g=>In(t,`${n}:reviewer_${g.alias}[${f}]`,g,`CODER OUTPUT:
1737
- ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));if(_.every(g=>g.outcome==="approve")){let g=X(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,t.dal.finishStep(g.id,"approve",`loop=${f}`),Y(t,r,n,"approve"),e.write_back_durable_memory){let h=t.membersByAlias.get(e.coder.alias);h!==void 0&&await Zt(t,n,h,e.write_back_durable_memory)}return K(t.workflow,e.outcomes.approve)}if(a=_.filter(g=>g.outcome==="request_changes").map(g=>g.text).join(`
1734
+ `).map(r=>new gt({children:[new yt({text:r.length===0?" ":r,font:"Courier New"})]}))}function gr(t){let e=t.tokens;return Array.isArray(e)?e:[]}function _L(t){return t.type==="list"&&Array.isArray(t.items)}function gL(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function yL(t){return t.type==="code"&&typeof t.text=="string"}function wL(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 ey,ry=E(()=>{"use strict";Je();ey={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=>sL(t,t.state)}});import{createHash as EL}from"node:crypto";import{existsSync as TL,mkdirSync as bL,readFileSync as ny,statSync as SL}from"node:fs";import{dirname as kL,isAbsolute as sy,normalize as vL,resolve as Os}from"node:path";import{marked as IL}from"marked";import NL from"write-excel-file/node";async function xL(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;try{let o=await AL(t,e),i=$L(e.input_format),a=await RL(t,e),l=await jL(t,e.title),c=i==="markdown"?WL(o):ML(o);await BL({sheets:c.length===0?[{name:"Sheet1",headers:[],rows:[]}]:c,outputPath:a,title:l??t.workflow.name});let u=SL(a).size;if(u===0)throw new Error("rendered XLSX file was empty");let d=EL("sha256").update(ny(a)).digest("hex");return t.dal.insertStepArtifact({step_id:s.id,kind:"render_xlsx",path:a,sha:d,provider_call_mode:"library"}),t.dal.finishStep(s.id,"done",`wrote:${a}`),Y(t,r,n,{output_path:a,path:a,bytes:u}),K(t.workflow,e.outcomes?.done??"@terminal:done")}catch(o){let i=o instanceof Error?o.message:String(o);return t.dal.finishStep(s.id,"error",i),Y(t,r,n,{error:i}),K(t.workflow,e.outcomes?.error??"@terminal:error")}}async function AL(t,e){if(typeof e.source!="string"||e.source.trim().length===0)return"";let r=(await ze(e.source,t,t.stateId)).trim(),n=LL(t.project.local_path,r);if(n!==null){if(!TL(n))throw new Error(`source file not found: ${n}`);return ny(n,"utf8")}return r}function $L(t){if(t==null||t==="")return"json";if(t==="json"||t==="markdown")return t;throw new Error(`unsupported input_format: ${String(t)}`)}async function RL(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let r=(await ze(e.output_path,t,t.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=OL(t.project.local_path,r);if(!n.endsWith(".xlsx"))throw new Error(`output_path must end with .xlsx: ${n}`);return n}async function jL(t,e){if(typeof e!="string"||e.trim().length===0)return null;let r=(await ze(e,t,t.stateId)).trim();return r.length===0?null:r}function OL(t,e){let r=Os(t);return vL(sy(e)?Os(e):Os(r,e))}function LL(t,e){return CL(e)?sy(e)?Os(e):Os(t,e):null}function CL(t){return t.endsWith(".json")||t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function ML(t){if(t.trim().length===0)return[];let e;try{e=JSON.parse(t)}catch(r){let n=r instanceof Error?r.message:String(r);throw new Error(`invalid JSON source: ${n}`)}if(!ea(e)||!Array.isArray(e.sheets))throw new Error("JSON source must be an object with sheets[]");return e.sheets.map((r,n)=>DL(r,n))}function DL(t,e){if(!ea(t))throw new Error(`sheets[${e}] must be an object`);let r=PL(t.headers,`sheets[${e}].headers`),n=FL(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:UL(t.styles)}}function PL(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 FL(t,e){if(t===void 0)return[];if(!Array.isArray(t))throw new Error(`${e} must be an array`);return t.map((r,n)=>{if(!Array.isArray(r))throw new Error(`${e}[${n}] must be an array`);return r.map((s,o)=>{if(s===null||typeof s=="string"||typeof s=="number"||typeof s=="boolean")return s;throw new Error(`${e}[${n}][${o}] must be string, number, boolean, or null`)})})}function UL(t){if(!ea(t)||!ea(t.headers))return;let e={};return t.headers.bold===!0&&(e.bold=!0),typeof t.headers.fill=="string"&&(e.fill=t.headers.fill),Object.keys(e).length===0?void 0:e}function WL(t){let e=IL.lexer(t,{gfm:!0}),r=[],n=null;for(let s of e){if(KL(s)){n=s.text;continue}YL(s)&&(r.push({name:n??`Sheet${r.length+1}`,headers:s.header.map(o=>o.text),rows:s.rows.map(o=>o.map(i=>i.text)),headerStyle:{bold:!0}}),n=null)}return r}async function BL(t){bL(kL(t.outputPath),{recursive:!0});let e=new Set,r=t.sheets.map(n=>({sheet:XL(n.name,e),data:HL(n),columns:JL(n)}));await NL(r).toFile(t.outputPath)}function HL(t){let e=[];if(t.headers.length>0){let r=VL(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(qL));return e.length===0?[[{}]]:e}function qL(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 JL(t){let e=Math.max(t.headers.length,...t.rows.map(n=>n.length),1),r=[];for(let n=1;n<=e;n+=1){let s=[t.headers[n-1],...t.rows.map(i=>i[n-1])],o=Math.min(60,Math.max(10,...s.map(i=>String(i??"").length+2)));r.push({width:o})}return r}function XL(t,e){let r=GL(t),n=r,s=2;for(;e.has(n.toLowerCase());){let o=` ${s}`;n=`${r.slice(0,31-o.length)}${o}`,s+=1}return e.add(n.toLowerCase()),n}function GL(t){let e=t.replace(/[\[\]:*?/\\]/g," ").trim();return(e.length===0?"Sheet":e).slice(0,31)}function VL(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 KL(t){return t.type==="heading"&&typeof t.text=="string"}function YL(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function ea(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var oy,iy=E(()=>{"use strict";Je();oy={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=>xL(t,t.state)}});import{spawnSync as zL}from"node:child_process";async function QL(t,e){let r=t.stateId,n=t.displayName,s=t.workflow.default_task_timeout_ms;for(let f of e.pre_checks??[])if(zL("sh",["-c",f.command],{cwd:t.project.local_path}).status!==0){let p=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(p.id,"fail_pre_check",`pre_check_failed:${f.description??f.command}`),Y(t,r,n,"fail_pre_check");let h=e.outcomes.fail_pre_check;return h!==void 0?K(t.workflow,h):{kind:"terminal",terminal:ee(t.workflow)}}let o=Nn(t,e.durable_memory_tags),i=e.reviewers??[],a=null,l=i.length===0&&e.outcomes_from_stance!==void 0,c=l?Object.keys(e.outcomes_from_stance):[];for(let f=0;f<e.max_loops;f+=1){let m=`${n}:coder[${f}]`,p=await In(t,m,e.coder,a!==null?`PRIOR REVIEW FEEDBACK:
1735
+ ${a}`:null,c,l,s,e.writes_to_project_path===!0,o);if(l){let g=kg(p.text);if(g!==null){let _=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(_.id,null,`escalation_vocab:${g.token}`),{kind:"escalate",token:g.token,reason:g.reason.length>0?`${g.token}: ${g.reason}`:g.token}}}if(p.outcome===null){let g=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(g.id,null,p.status_detail),{kind:"escalate",token:"",reason:`coder_no_outcome:${p.status_detail}`}}if(i.length===0){if(e.outcomes_from_stance!==void 0){let b=Object.keys(e.outcomes_from_stance),w=xs(p.text,b);if(w.outcome===null){let N=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(N.id,null,`unhandled_stance:${w.reason}`),{kind:"escalate",token:"",reason:`no_stance:${w.reason}`}}let k=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(k.id,w.outcome,"outcomes_from_stance"),Y(t,r,n,w.outcome),K(t.workflow,e.outcomes_from_stance[w.outcome])}let g=xs(p.text,ZL);if(g.outcome!==null){let b=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(b.id,g.outcome,"default_failure_stance"),Y(t,r,n,g.outcome),{kind:"escalate",token:g.outcome,reason:`failure_stance:${g.outcome}`}}let _=X(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,t.dal.finishStep(_.id,"approve","no_reviewers"),Y(t,r,n,"approve"),e.write_back_durable_memory){let b=t.membersByAlias.get(e.coder.alias);b!==void 0&&await Zt(t,n,b,e.write_back_durable_memory)}return K(t.workflow,e.outcomes.approve)}let h=await Promise.all(i.map(g=>In(t,`${n}:reviewer_${g.alias}[${f}]`,g,`CODER OUTPUT:
1736
+ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));if(h.every(g=>g.outcome==="approve")){let g=X(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,t.dal.finishStep(g.id,"approve",`loop=${f}`),Y(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 K(t.workflow,e.outcomes.approve)}if(a=h.filter(g=>g.outcome==="request_changes").map(g=>g.text).join(`
1738
1737
 
1739
- `),e.loop_feedback_artifact!==void 0){let g=X(t,{run_id:t.run_id,state_name:`${n}:feedback[${f}]`});t.steps_executed+=1,t.dal.finishStep(g.id,"feedback_captured",`loop=${f}`),t.dal.insertStepArtifact({step_id:g.id,kind:e.loop_feedback_artifact,content:a})}}let u=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(u.id,"max_loops_exceeded",`loops=${e.max_loops}`),Y(t,r,n,"max_loops_exceeded");let d=e.outcomes.max_loops_exceeded;return d!==void 0?K(t.workflow,d):{kind:"terminal",terminal:ee(t.workflow)}}var ZL,ay,ly=E(()=>{"use strict";Pu();qe();ZL=["blocked","failed","aborted"],ay={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=>QL(t,t.state)}});import{spawnSync as eC}from"node:child_process";async function tC(t,e){let r=t.stateId,n=t.displayName,s=await Ye(e.command,t,n),o=Bu(t,n),i=Mg(s);if(i.matched&&!o){let _=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.insertSessionEvent({run_id:t.run_id,step_id:_.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"side_effect_without_pause",state_id:n,kind:i.kind,command:s,message:`ShellStep ${n} runs a classified side-effect command (${i.kind}) without a preceding approved gate`})}),t.dal.finishStep(_.id,null,`policy_violation:side_effect_without_pause:${i.kind}`),{kind:"terminal",terminal:ee(t.workflow)}}let a=new Date(Date.now()-1),l=typeof e.timeout_ms=="number"&&e.timeout_ms>0,c=eC("sh",["-c",s],{cwd:t.project.local_path,...l?{timeout:e.timeout_ms}:{},encoding:"utf8",env:{...process.env}}),u=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let d=typeof c.stderr=="string"?c.stderr:"",f=c.error;if((d.length>0||f!==void 0)&&t.dal.insertSessionEvent({run_id:t.run_id,step_id:u.id,kind:"shellstep_stderr",timestamp_ms:Date.now(),payload:JSON.stringify({state_id:n,exit_status:c.status,stderr:d,spawn_error:f===void 0?null:f instanceof Error?f.message:String(f),command:s})}),c.status===null)return l?(t.dal.finishStep(u.id,null,`timeout:${e.timeout_ms}ms`),{kind:"terminal",terminal:"shell_step_timeout"}):(t.dal.finishStep(u.id,null,"shell_step_signal_terminated"),{kind:"terminal",terminal:ee(t.workflow)});if(e.writes_to_project_path!==!0&&t.project.local_path.trim().length>0&&Hu(t.project.local_path,a))return t.dal.insertSessionEvent({run_id:t.run_id,step_id:u.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"writes_to_project_path",state_id:n,message:`ShellStep ${n} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(u.id,null,"policy_violation:writes_to_project_path"),{kind:"terminal",terminal:ee(t.workflow)};if(e.capture_output_to!==void 0){let _=c.stdout??"";t.dal.insertStepArtifact({step_id:u.id,kind:e.capture_output_to,content:_})}let m=String(c.status),p=e.outcomes_from_exit[m]??e.outcomes_from_exit.default;return p===void 0?(t.dal.insertStepArtifact({step_id:u.id,kind:"unhandled_exit",content:m}),t.dal.finishStep(u.id,null,`shell_step_unhandled_exit:${m}`),{kind:"terminal",terminal:"shell_step_unhandled_exit"}):(t.dal.finishStep(u.id,m,`exit=${c.status}`),Y(t,r,n,m),K(t.workflow,p))}var cy,uy=E(()=>{"use strict";qe();cy={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=>tC(t,t.state)}});async function rC(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let o=t.dal.getWorkflowByName(e.workflow_name);if(o===null)return t.dal.finishStep(s.id,null,`subflow_missing_workflow:${e.workflow_name}`),{kind:"terminal",terminal:ee(t.workflow)};let i=Ce(o.definition),a=await nC(t,e),l=await t.runChildWorkflow(o,i,a);if(l.paused===!0)return t.dal.finishStep(s.id,null,`subflow_paused:${l.run_id}`),{kind:"paused"};let c=l.terminal_state;if(c===null)return t.dal.finishStep(s.id,null,`subflow_no_terminal:${l.run_id}`),{kind:"terminal",terminal:ee(t.workflow)};Y(t,r,n,sC(t,l.run_id,i.outputs??[])),t.dal.finishStep(s.id,c,`child_run=${l.run_id}`);let u=e.outcomes[c]??e.outcomes.default;return u===void 0?{kind:"terminal",terminal:ee(t.workflow)}:K(t.workflow,u)}async function nC(t,e){let r={};for(let[n,s]of Object.entries(e.inputs??{})){let o=await Ag(s,t);r[n]=o===s?await Yi(s,t):o}return r}function sC(t,e,r){let n={};for(let s of r)n[s.name]=oC(t,e,s);return n}function oC(t,e,r){let s=t.dal.query("SELECT * FROM step WHERE run_id = ? AND state_name = ? ORDER BY id DESC LIMIT 1",e,r.source_step_id)[0];if(s===void 0)return null;let o=iC(s,r.source_field);if(o.found)return o.value;let a=t.dal.query("SELECT * FROM step_artifact WHERE step_id = ? AND kind = ? ORDER BY id DESC LIMIT 1",s.id,r.source_field)[0];return a===void 0?null:a.content??a.path??a.sha??null}function iC(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 dy,fy=E(()=>{"use strict";Sn();qe();As();dy={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=>rC(t,t.state)}});function aC(t,e){let r=t.stateId,n=t.displayName,s=e.name??n,o=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(o.id,s,e.kind??"neutral"),Y(t,r,n,s),{kind:"terminal",terminal:s}}var my,py=E(()=>{"use strict";qe();my={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=>aC(t,t.state)}});async function lC(t){let e=typeof t.parameters.org=="string"?t.parameters.org:"",r=typeof t.parameters.repo=="string"?t.parameters.repo:"";if(e.length===0||r.length===0)return null;let n=new URL(`https://api.github.com/repos/${e}/${r}/issues`);n.searchParams.set("state","open"),typeof t.parameters.label=="string"&&t.parameters.label.length>0&&n.searchParams.set("labels",t.parameters.label),typeof t.parameters.since=="string"&&t.parameters.since.length>0&&n.searchParams.set("since",t.parameters.since);let s=await fetch(n);if(!s.ok)throw new Error(`github issue trigger failed: HTTP ${s.status}`);let o=await s.json();if(!Array.isArray(o))throw new Error("github issue trigger returned unexpected JSON");let i=cC(t.cursor),a=o.filter(uC).filter(c=>c.id>i);if(a.length===0)return null;let l=Math.max(...a.map(c=>c.id));return{main:a.map(c=>({trigger_id:t.trigger_id,issue_id:c.id,issue_number:c.number,issue_url:c.html_url,title:c.title,cursor:String(l)}))}}function cC(t){if(t===void 0)return 0;let e=Number(t);return Number.isFinite(e)?e:0}function uC(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 hy,_y=E(()=>{"use strict";hy={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=>lC(t)}});async function dC(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 gy,yy=E(()=>{"use strict";gy={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=>dC(t)}});function wy(t){t.register(Pg),t.register(ay),t.register(Bg),t.register(Vg),t.register(Yg),t.register(ey),t.register(oy),t.register(cy),t.register(Ug),t.register(qg),t.register(dy),t.register(my),t.register(gy),t.register(hy)}var Ey=E(()=>{"use strict";Fg();Wg();Hg();Xg();Kg();zg();ry();iy();ly();uy();fy();py();_y();yy()});function ra(){return ta===null&&(ta=new Ju,wy(ta)),ta}var fC,Ju,ta,Xu=E(()=>{"use strict";Ey();fC={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"},Ju=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:fC[e];return r?this.types.get(r):void 0}list(){return Array.from(this.types.values())}},ta=null});async function Sy(t){xy(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=pC(e.definition,t.workflow),s=t.job.run_id===null?null:t.dal.getRun(t.job.run_id),o=Ls(n)?n.entry_step_id:n.start_at,i=s?.terminal_state===null?s:t.dal.insertRun({job_id:t.job.id,workflow_id:e.id,team_id:t.team.id,current_state:o}),a=n.requires,l=gg(a);if(l!==null)return t.dal.setRunTerminalState(i.id,"aborted"),t.dal.raiseAttention({kind:"missing_workflow_dependency",severity:"error",project_id:r.id,run_id:i.id,payload:JSON.stringify({run_id:i.id,workflow_name:n.name,kind:l.kind,tool:l.tool,install_hint:l.install_hint,last_error:l.message,detail:l.detail??null})}),{run_id:i.id,terminal_state:"aborted",steps_executed:0};let c=new Map(t.members.map(m=>[m.alias,m]));if(Ls(n)){let m=Gu({dal:t.dal,workflow:sa(n),job:t.job,project:r,run:i,membersByAlias:c,outcomes:s!==null&&i===s?t.dal.listLatestStepOutcomesByState(i.id):{},inputs:_r(t.job.payload)??{},team_id:t.team.id}),p=await vy(n,m,i.current_state??n.entry_step_id);return by(t.dal,r.id,i.id,n.name,p),p}let u=s!==null&&i===s?t.dal.listLatestStepOutcomesByState(i.id):{},d=Gu({dal:t.dal,workflow:n,job:t.job,project:r,run:i,membersByAlias:c,outcomes:u,inputs:_r(t.job.payload)??{},team_id:t.team.id}),f=await ky(d,i.current_state??n.start_at);return by(t.dal,r.id,i.id,n.name,f),f}function by(t,e,r,n,s){if(s.paused===!0)return;let o=s.terminal_state;if(o===null)return;let i="unknown",a=!1;try{let u=t.getRun(r);if(u!==null){let d=t.getWorkflow(u.workflow_id);if(d!==null){let f=JSON.parse(d.definition),p=(f.terminals??{})[o];if(p!==void 0&&typeof p.kind=="string"&&(p.kind==="success"||p.kind==="failure"||p.kind==="neutral")&&(i=p.kind),i==="unknown"&&Array.isArray(f.steps)){for(let g of f.steps)if(g.type==="lmctl/terminal"&&g.parameters!==null&&typeof g.parameters=="object"){let h=g.parameters;if(h.name===o&&(h.kind==="success"||h.kind==="failure"||h.kind==="neutral")){i=h.kind;break}}}let _=f.errors;if(_!==null&&typeof _=="object"){let g=_;(g.on_unhandled_failure!==void 0||g.on_unhandled_failure_state!==void 0)&&(a=!0)}}}}catch{}if(i==="success"||i==="failure"&&a)return;let l=null;try{l=t.query("SELECT status_detail FROM step WHERE run_id = ? ORDER BY id DESC LIMIT 1",r)[0]?.status_detail??null}catch{l=null}let c=i==="failure"?"workflow_failed":"workflow_has_issues";t.raiseAttention({kind:c,severity:i==="failure"?"error":"warn",project_id:e,run_id:r,payload:JSON.stringify({run_id:r,workflow_name:n,terminal_state:o,terminal_kind:i,last_error:l})})}function Gu(t){let e={dal:t.dal,workflow:t.workflow,job:t.job,project:t.project,run_id:t.run.id,membersByAlias:t.membersByAlias,inputs:t.inputs,outcomes:t.outcomes,transcripts:{},progress_step_id:null,steps_executed:0,last_state_id:null,errors_block_fired:!1,iteration:null,parent_step_id:null,dispatchState:async(r,n,s)=>{let o=e.parent_step_id,i=e.iteration;e.parent_step_id=s?.parent_step_id??o,e.iteration=s?.iteration??i;try{return await Vu(e,r,n,s?.display_name??r)}finally{e.parent_step_id=o,e.iteration=i}},runChildWorkflow:async(r,n,s)=>{xy(n);let o=Ls(n)?n.entry_step_id:n.start_at,i=t.dal.insertRun({job_id:t.job.id,workflow_id:r.id,team_id:t.team_id,current_state:o,parent_run_id:e.run_id}),a=Gu({dal:t.dal,workflow:Ls(n)?sa(n):n,job:t.job,project:t.project,run:i,membersByAlias:t.membersByAlias,outcomes:{},inputs:s,team_id:t.team_id});return Ls(n)?vy(n,a,i.current_state??n.entry_step_id):ky(a,i.current_state??n.start_at)}};return e}async function ky(t,e){let r=e;if(r.startsWith($s))return{run_id:t.run_id,terminal_state:null,steps_executed:0,paused:!0};for(let s=0;s<1e3;s+=1){if(r.startsWith("@terminal:"))return Qt(t,r.slice(10));t.dal.setRunCurrentState(t.run_id,r),t.last_state_id=r;let o=t.workflow.states[r];if(o===void 0){let l=na(t,ee(t.workflow));if(l.kind==="paused")return Me(t);if(l.kind==="escalate")return st(t,{id:r,name:r,type:"unknown"},l.token,l.reason),Me(t);if(l.kind==="terminal")return Qt(t,l.terminal);r=l.state;continue}let i,a=Ny(t,r);if(a!==null){let l=X(t,{run_id:t.run_id,state_name:r});if(t.steps_executed+=1,t.dal.finishStep(l.id,a,"escalation_resume"),Y(t,r,r,a),a===ts)return Qt(t,Ol);let c=o.outcomes?.[a];i=c!==void 0?K(t.workflow,c):st(t,{id:r,name:r,type:o.type},a,`no declared edge for resumed outcome '${a}' from state '${r}'`)}else i=await Vu(t,r,o);if(i.kind==="paused")return Me(t);if(i.kind==="escalate")return st(t,{id:r,name:r,type:o.type},i.token,i.reason),Me(t);if(i.kind==="terminal"){let l=na(t,i.terminal);if(l.kind==="paused")return Me(t);if(l.kind==="escalate")return st(t,{id:r,name:r,type:o.type},l.token,l.reason),Me(t);if(l.kind==="terminal")return Qt(t,l.terminal);r=l.state;continue}r=i.state}t.dal.raiseAttention({kind:"engine_step_limit_exceeded",severity:"error",project_id:t.project.id,run_id:t.run_id,payload:JSON.stringify({run_id:t.run_id})});let n=na(t,ee(t.workflow));return n.kind==="terminal"?Qt(t,n.terminal):Qt(t,ee(t.workflow))}async function vy(t,e,r){let n=new Map(t.steps.map(i=>[i.id,i])),s=new Map(t.steps.map(i=>[i.name,i])),o=r;for(let i=0;i<1e3;i+=1){e.dal.setRunCurrentState(e.run_id,o);let a=n.get(o);if(a===void 0)return st(e,{id:o,name:o,type:"unknown"},"",`internal:unknown v3 step '${o}'`),Me(e);let l=Ny(e,a.id);if(l!==null){let m=X(e,{run_id:e.run_id,state_name:a.name});if(e.steps_executed+=1,e.dal.finishStep(m.id,l,"escalation_resume"),Y(e,a.id,a.name,l),l===ts)return Qt(e,Ol);let p=Object.keys(t.connections[a.id]??{}),_=t.connections[a.id]?.[l]?.[0]?.[0]?.step_id??t.connections[a.id]?.main?.[0]?.[0]?.step_id;if(_===void 0)return st(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}),Me(e);o=_;continue}let c=await mC(e,t,a);if(c.kind==="paused")return Me(e);let u=Object.keys(t.connections[a.id]??{});if(c.kind==="escalate")return st(e,{id:a.id,name:a.name,type:a.type},c.token,c.reason,{declared_outcomes:u}),Me(e);let d=c.kind==="terminal"?c.terminal:c.state;if(a.type==="lmctl/terminal"){let m=e.workflow;e.workflow=sa(t,a);try{let p=na(e,d);if(p.kind==="paused")return Me(e);if(p.kind==="escalate")return st(e,{id:a.id,name:a.name,type:a.type},p.token,p.reason),Me(e);if(p.kind==="terminal")return Qt(e,p.terminal);let _=s.get(p.state);if(_===void 0)return st(e,{id:a.id,name:a.name,type:a.type},"",`internal:unknown v3 error handler step '${p.state}'`),Me(e);o=_.id;continue}finally{e.workflow=m}}if(Zr(d))return st(e,{id:a.id,name:a.name,type:a.type},d,`generic escalation '${d}' from step '${a.id}'`,{declared_outcomes:u}),Me(e);let f=t.connections[a.id]?.[d]?.[0]?.[0]?.step_id??t.connections[a.id]?.main?.[0]?.[0]?.step_id;if(f===void 0)return st(e,{id:a.id,name:a.name,type:a.type},d,`no declared edge for outcome '${d}' from step '${a.id}'`,{declared_outcomes:u}),Me(e);o=f}return e.dal.raiseAttention({kind:"engine_step_limit_exceeded",severity:"error",project_id:e.project.id,run_id:e.run_id,payload:JSON.stringify({run_id:e.run_id})}),Qt(e,"aborted")}async function mC(t,e,r){let n=Iy(e,r),s=t.workflow;t.workflow=sa(e,r);try{return await Vu(t,r.id,n,r.name)}finally{t.workflow=s}}function Iy(t,e){let r=e.parameters,n=e.members??{},s=Object.keys(t.connections[e.id]??{}),o=Object.fromEntries(s.map(a=>[a,`@terminal:${a}`])),i={state_name:e.name};switch(e.type){case"lmctl/review":{let a=s.filter(l=>!["approve","request_changes","fail_pre_check","max_loops_exceeded"].includes(l));return{...i,type:"Review",...r,coder:n.coder,reviewers:n.reviewers,outcomes:{approve:o.approve??"@terminal:approve",...o.request_changes!==void 0?{request_changes:o.request_changes}:{},...o.fail_pre_check!==void 0?{fail_pre_check:o.fail_pre_check}:{},...o.max_loops_exceeded!==void 0?{max_loops_exceeded:o.max_loops_exceeded}:{}},...a.length>0?{outcomes_from_stance:Object.fromEntries(a.map(l=>[l,`@terminal:${l}`]))}:{}}}case"lmctl/consolidate":return{...i,type:"Consolidate",...r,researchers:n.researchers,consolidator:n.consolidator,outcomes:{ok:o.ok??"@terminal:ok",...o.error!==void 0?{error:o.error}:{}}};case"lmctl/interactive":return{...i,type:"Interactive",...r,agent:n.agent,outcomes:{done:o.done??"@terminal:done",...o.timeout!==void 0?{timeout:o.timeout}:{}}};case"lmctl/loop":return{...i,type:"Loop",...r,outcomes:{ok:o.ok??"@terminal:ok",...o.error!==void 0?{error:o.error}:{}}};case"lmctl/render-docx":return{...i,type:"lmctl/render-docx",...r,outcomes:{done:o.done??"@terminal:done",...o.error!==void 0?{error:o.error}:{}}};case"lmctl/render-xlsx":return{...i,type:"lmctl/render-xlsx",...r,outcomes:{done:o.done??"@terminal:done",...o.error!==void 0?{error:o.error}:{}}};case"lmctl/shell-step":return{...i,type:"ShellStep",...r,outcomes_from_exit:r.outcomes_from_exit??Object.fromEntries(s.map(a=>[a.slice(5),`@terminal:${a}`]))};case"lmctl/assert-repo-clean":return{...i,type:"AssertRepoClean",...r,next:o.main??"@terminal:main"};case"lmctl/choice":return{...i,type:"Choice",...r};case"lmctl/foreach":return{...i,type:"ForEach",...r,outcomes:{all_ok:o.all_ok??"@terminal:all_ok",...o.any_failed!==void 0?{any_failed:o.any_failed}:{}}};case"lmctl/subflow":return{...i,type:"Subflow",...r,outcomes:o};case"lmctl/terminal":return{...i,type:"Terminal",name:r.name,kind:r.kind};default:return{...i,type:e.type,...r}}}async function Vu(t,e,r,n){let s=ra().get(r.type);if(s===void 0)throw new Error(`unknown archetype: ${r.type}`);if(s.execute===void 0)throw new Error(`archetype ${r.type} has no execute() - is it a trigger-only archetype used as a step?`);let o=t.emit_progress,i=t.progress_step_id;t.emit_progress=s.description.emits_progress===!0?gC(t,s):void 0,t.progress_step_id=null;try{return await s.execute(Lg(t,e,r,n??e))}finally{t.emit_progress=o,t.progress_step_id=i}}function pC(t,e){try{let r=JSON.parse(t);if(_C(r)&&r.definition_schema_version===3)return At.parse(r)}catch{return e}return e}function Ls(t){return t.definition_schema_version===3}function sa(t,e){let r=e===void 0?[]:Object.keys(t.connections[e.id]??{}),n=Object.fromEntries(r.map(o=>[o,{kind:o==="aborted"?"failure":"neutral"}])),s={};if(e?.type==="lmctl/loop"&&typeof e.parameters.body=="string"){let o=t.steps.find(i=>i.name===e.parameters.body);o!==void 0&&(s[e.parameters.body]=Iy(t,o))}return e?.type==="lmctl/terminal"&&typeof e.parameters.name=="string"&&(n[e.parameters.name]={kind:hC(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 hC(t){return t==="success"||t==="failure"||t==="neutral"?t:"neutral"}function _C(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function gC(t,e){let r=`progress.${e.description.namespace}/${e.description.name}`;return n=>{try{if(typeof n.kind!="string"||n.kind.length===0)return;t.dal.insertSessionEvent({run_id:t.run_id,step_id:t.progress_step_id,kind:`${r}.${n.kind}`,timestamp_ms:Date.now(),payload:JSON.stringify({message:n.message,data:n.data})})}catch(s){let o=s instanceof Error?s.message:String(s);console.warn(`[progress] dropped ${r} event: ${o}`)}}}function Qt(t,e){t.dal.setRunTerminalState(t.run_id,e);try{mg(t.run_id,t.dal)}catch{}return{run_id:t.run_id,terminal_state:e,steps_executed:t.steps_executed}}function Me(t){return{run_id:t.run_id,terminal_state:null,steps_executed:t.steps_executed,paused:!0}}function Ny(t,e){let n=t.dal.getRun(t.run_id)?.pending_escalation_decision??null;if(n===null)return null;let s;try{let a=JSON.parse(n);if(a===null||typeof a!="object"||Array.isArray(a))return null;s=a}catch{return null}let o=s[e];if(typeof o!="string")return null;delete s[e];let i=Object.keys(s).length>0?JSON.stringify(s):null;return t.dal.setRunPendingEscalationDecision(t.run_id,i),o}function na(t,e){if(!yC(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&&wC(t,e,r.on_unhandled_failure),{kind:"terminal",terminal:e}))}function yC(t,e){return t.definition_schema_version===2&&t.terminals[e]?.kind==="failure"}function wC(t,e,r){let n=EC(t),s=r.capture_evidence&&n!==null?TC(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 EC(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 TC(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 xy(t){if(!Ty.includes(t.definition_schema_version))throw new Error(`unsupported definition_schema_version ${t.definition_schema_version}; supported versions: ${Ty.join(", ")}`)}var Ty,Ay=E(()=>{"use strict";Tn();pg();yg();qe();Xu();rs();Ty=[1,2,3]});import{readFileSync as bC,readdirSync as SC}from"node:fs";import{basename as kC,join as vC,resolve as IC}from"node:path";function jy(t={}){let e=IC(t.workflowsDir??"workflows"),r=SC(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=>NC(vC(e,n)))}}function NC(t){let e=kC(t);try{let r=bC(t,"utf8"),n=Ce(r);return Cy(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:My(r)}}}function Oy(t,e){try{let r=Ce(e);return Cy(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:My(r)}}}function Ly(t){let e=[];e.push(`workflow verification - ${t.generated_at}`),e.push(`dir: ${t.workflows_dir}`),e.push(""),e.push(`${"status".padEnd(17)} ${"workflow".padEnd(36)} ${"first step".padEnd(52)} note`),e.push(`${"-".repeat(17)} ${"-".repeat(36)} ${"-".repeat(52)} ${"-".repeat(30)}`);for(let o of t.rows){let i=(o.workflow_name??o.file).slice(0,36).padEnd(36),a=`${o.first_step_id??"-"}${o.first_step_type===null?"":` (${o.first_step_type})`}`;e.push(`${o.status.padEnd(17)} ${i} ${a.slice(0,52).padEnd(52)} ${o.note}`)}let r=t.rows.filter(o=>o.status==="PASS").length,n=t.rows.filter(o=>o.status==="PASS_NEEDS_INPUTS").length,s=t.rows.filter(o=>o.status==="FAIL").length;return e.push(""),e.push(`summary: ${r} pass, ${n} pass_needs_inputs, ${s} fail`),`${e.join(`
1738
+ `),e.loop_feedback_artifact!==void 0){let g=X(t,{run_id:t.run_id,state_name:`${n}:feedback[${f}]`});t.steps_executed+=1,t.dal.finishStep(g.id,"feedback_captured",`loop=${f}`),t.dal.insertStepArtifact({step_id:g.id,kind:e.loop_feedback_artifact,content:a})}}let u=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(u.id,"max_loops_exceeded",`loops=${e.max_loops}`),Y(t,r,n,"max_loops_exceeded");let d=e.outcomes.max_loops_exceeded;return d!==void 0?K(t.workflow,d):{kind:"terminal",terminal:ee(t.workflow)}}var ZL,ay,ly=E(()=>{"use strict";Pu();Je();ZL=["blocked","failed","aborted"],ay={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=>QL(t,t.state)}});import{spawnSync as eC}from"node:child_process";async function tC(t,e){let r=t.stateId,n=t.displayName,s=await ze(e.command,t,n),o=Bu(t,n),i=Mg(s);if(i.matched&&!o){let h=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.insertSessionEvent({run_id:t.run_id,step_id:h.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"side_effect_without_pause",state_id:n,kind:i.kind,command:s,message:`ShellStep ${n} runs a classified side-effect command (${i.kind}) without a preceding approved gate`})}),t.dal.finishStep(h.id,null,`policy_violation:side_effect_without_pause:${i.kind}`),{kind:"terminal",terminal:ee(t.workflow)}}let a=new Date(Date.now()-1),l=typeof e.timeout_ms=="number"&&e.timeout_ms>0,c=eC("sh",["-c",s],{cwd:t.project.local_path,...l?{timeout:e.timeout_ms}:{},encoding:"utf8",env:{...process.env}}),u=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let d=typeof c.stderr=="string"?c.stderr:"",f=c.error;if((d.length>0||f!==void 0)&&t.dal.insertSessionEvent({run_id:t.run_id,step_id:u.id,kind:"shellstep_stderr",timestamp_ms:Date.now(),payload:JSON.stringify({state_id:n,exit_status:c.status,stderr:d,spawn_error:f===void 0?null:f instanceof Error?f.message:String(f),command:s})}),c.status===null)return l?(t.dal.finishStep(u.id,null,`timeout:${e.timeout_ms}ms`),{kind:"terminal",terminal:"shell_step_timeout"}):(t.dal.finishStep(u.id,null,"shell_step_signal_terminated"),{kind:"terminal",terminal:ee(t.workflow)});if(e.writes_to_project_path!==!0&&t.project.local_path.trim().length>0&&Hu(t.project.local_path,a))return t.dal.insertSessionEvent({run_id:t.run_id,step_id:u.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"writes_to_project_path",state_id:n,message:`ShellStep ${n} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(u.id,null,"policy_violation:writes_to_project_path"),{kind:"terminal",terminal:ee(t.workflow)};if(e.capture_output_to!==void 0){let h=c.stdout??"";t.dal.insertStepArtifact({step_id:u.id,kind:e.capture_output_to,content:h})}let m=String(c.status),p=e.outcomes_from_exit[m]??e.outcomes_from_exit.default;return p===void 0?(t.dal.insertStepArtifact({step_id:u.id,kind:"unhandled_exit",content:m}),t.dal.finishStep(u.id,null,`shell_step_unhandled_exit:${m}`),{kind:"terminal",terminal:"shell_step_unhandled_exit"}):(t.dal.finishStep(u.id,m,`exit=${c.status}`),Y(t,r,n,m),K(t.workflow,p))}var cy,uy=E(()=>{"use strict";Je();cy={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=>tC(t,t.state)}});async function rC(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let o=t.dal.getWorkflowByName(e.workflow_name);if(o===null)return t.dal.finishStep(s.id,null,`subflow_missing_workflow:${e.workflow_name}`),{kind:"terminal",terminal:ee(t.workflow)};let i=Me(o.definition),a=await nC(t,e),l=await t.runChildWorkflow(o,i,a);if(l.paused===!0)return t.dal.finishStep(s.id,null,`subflow_paused:${l.run_id}`),{kind:"paused"};let c=l.terminal_state;if(c===null)return t.dal.finishStep(s.id,null,`subflow_no_terminal:${l.run_id}`),{kind:"terminal",terminal:ee(t.workflow)};Y(t,r,n,sC(t,l.run_id,i.outputs??[])),t.dal.finishStep(s.id,c,`child_run=${l.run_id}`);let u=e.outcomes[c]??e.outcomes.default;return u===void 0?{kind:"terminal",terminal:ee(t.workflow)}:K(t.workflow,u)}async function nC(t,e){let r={};for(let[n,s]of Object.entries(e.inputs??{})){let o=await Ag(s,t);r[n]=o===s?await Yi(s,t):o}return r}function sC(t,e,r){let n={};for(let s of r)n[s.name]=oC(t,e,s);return n}function oC(t,e,r){let s=t.dal.query("SELECT * FROM step WHERE run_id = ? AND state_name = ? ORDER BY id DESC LIMIT 1",e,r.source_step_id)[0];if(s===void 0)return null;let o=iC(s,r.source_field);if(o.found)return o.value;let a=t.dal.query("SELECT * FROM step_artifact WHERE step_id = ? AND kind = ? ORDER BY id DESC LIMIT 1",s.id,r.source_field)[0];return a===void 0?null:a.content??a.path??a.sha??null}function iC(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 dy,fy=E(()=>{"use strict";Sn();Je();As();dy={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=>rC(t,t.state)}});function aC(t,e){let r=t.stateId,n=t.displayName,s=e.name??n,o=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(o.id,s,e.kind??"neutral"),Y(t,r,n,s),{kind:"terminal",terminal:s}}var my,py=E(()=>{"use strict";Je();my={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=>aC(t,t.state)}});async function lC(t){let e=typeof t.parameters.org=="string"?t.parameters.org:"",r=typeof t.parameters.repo=="string"?t.parameters.repo:"";if(e.length===0||r.length===0)return null;let n=new URL(`https://api.github.com/repos/${e}/${r}/issues`);n.searchParams.set("state","open"),typeof t.parameters.label=="string"&&t.parameters.label.length>0&&n.searchParams.set("labels",t.parameters.label),typeof t.parameters.since=="string"&&t.parameters.since.length>0&&n.searchParams.set("since",t.parameters.since);let s=await fetch(n);if(!s.ok)throw new Error(`github issue trigger failed: HTTP ${s.status}`);let o=await s.json();if(!Array.isArray(o))throw new Error("github issue trigger returned unexpected JSON");let i=cC(t.cursor),a=o.filter(uC).filter(c=>c.id>i);if(a.length===0)return null;let l=Math.max(...a.map(c=>c.id));return{main:a.map(c=>({trigger_id:t.trigger_id,issue_id:c.id,issue_number:c.number,issue_url:c.html_url,title:c.title,cursor:String(l)}))}}function cC(t){if(t===void 0)return 0;let e=Number(t);return Number.isFinite(e)?e:0}function uC(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 hy,_y=E(()=>{"use strict";hy={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=>lC(t)}});async function dC(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 gy,yy=E(()=>{"use strict";gy={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=>dC(t)}});function wy(t){t.register(Pg),t.register(ay),t.register(Bg),t.register(Vg),t.register(Yg),t.register(ey),t.register(oy),t.register(cy),t.register(Ug),t.register(qg),t.register(dy),t.register(my),t.register(gy),t.register(hy)}var Ey=E(()=>{"use strict";Fg();Wg();Hg();Xg();Kg();zg();ry();iy();ly();uy();fy();py();_y();yy()});function ra(){return ta===null&&(ta=new Ju,wy(ta)),ta}var fC,Ju,ta,Xu=E(()=>{"use strict";Ey();fC={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"},Ju=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:fC[e];return r?this.types.get(r):void 0}list(){return Array.from(this.types.values())}},ta=null});async function Sy(t){xy(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=pC(e.definition,t.workflow),s=t.job.run_id===null?null:t.dal.getRun(t.job.run_id),o=Ls(n)?n.entry_step_id:n.start_at,i=s?.terminal_state===null?s:t.dal.insertRun({job_id:t.job.id,workflow_id:e.id,team_id:t.team.id,current_state:o}),a=n.requires,l=gg(a);if(l!==null)return t.dal.setRunTerminalState(i.id,"aborted"),t.dal.raiseAttention({kind:"missing_workflow_dependency",severity:"error",project_id:r.id,run_id:i.id,payload:JSON.stringify({run_id:i.id,workflow_name:n.name,kind:l.kind,tool:l.tool,install_hint:l.install_hint,last_error:l.message,detail:l.detail??null})}),{run_id:i.id,terminal_state:"aborted",steps_executed:0};let c=new Map(t.members.map(m=>[m.alias,m]));if(Ls(n)){let m=Gu({dal:t.dal,workflow:sa(n),job:t.job,project:r,run:i,membersByAlias:c,outcomes:s!==null&&i===s?t.dal.listLatestStepOutcomesByState(i.id):{},inputs:_r(t.job.payload)??{},team_id:t.team.id}),p=await vy(n,m,i.current_state??n.entry_step_id);return by(t.dal,r.id,i.id,n.name,p),p}let u=s!==null&&i===s?t.dal.listLatestStepOutcomesByState(i.id):{},d=Gu({dal:t.dal,workflow:n,job:t.job,project:r,run:i,membersByAlias:c,outcomes:u,inputs:_r(t.job.payload)??{},team_id:t.team.id}),f=await ky(d,i.current_state??n.start_at);return by(t.dal,r.id,i.id,n.name,f),f}function by(t,e,r,n,s){if(s.paused===!0)return;let o=s.terminal_state;if(o===null)return;let i="unknown",a=!1;try{let u=t.getRun(r);if(u!==null){let d=t.getWorkflow(u.workflow_id);if(d!==null){let f=JSON.parse(d.definition),p=(f.terminals??{})[o];if(p!==void 0&&typeof p.kind=="string"&&(p.kind==="success"||p.kind==="failure"||p.kind==="neutral")&&(i=p.kind),i==="unknown"&&Array.isArray(f.steps)){for(let g of f.steps)if(g.type==="lmctl/terminal"&&g.parameters!==null&&typeof g.parameters=="object"){let _=g.parameters;if(_.name===o&&(_.kind==="success"||_.kind==="failure"||_.kind==="neutral")){i=_.kind;break}}}let h=f.errors;if(h!==null&&typeof h=="object"){let g=h;(g.on_unhandled_failure!==void 0||g.on_unhandled_failure_state!==void 0)&&(a=!0)}}}}catch{}if(i==="success"||i==="failure"&&a)return;let l=null;try{l=t.query("SELECT status_detail FROM step WHERE run_id = ? ORDER BY id DESC LIMIT 1",r)[0]?.status_detail??null}catch{l=null}let c=i==="failure"?"workflow_failed":"workflow_has_issues";t.raiseAttention({kind:c,severity:i==="failure"?"error":"warn",project_id:e,run_id:r,payload:JSON.stringify({run_id:r,workflow_name:n,terminal_state:o,terminal_kind:i,last_error:l})})}function Gu(t){let e={dal:t.dal,workflow:t.workflow,job:t.job,project:t.project,run_id:t.run.id,membersByAlias:t.membersByAlias,inputs:t.inputs,outcomes:t.outcomes,transcripts:{},progress_step_id:null,steps_executed:0,last_state_id:null,errors_block_fired:!1,iteration:null,parent_step_id:null,dispatchState:async(r,n,s)=>{let o=e.parent_step_id,i=e.iteration;e.parent_step_id=s?.parent_step_id??o,e.iteration=s?.iteration??i;try{return await Vu(e,r,n,s?.display_name??r)}finally{e.parent_step_id=o,e.iteration=i}},runChildWorkflow:async(r,n,s)=>{xy(n);let o=Ls(n)?n.entry_step_id:n.start_at,i=t.dal.insertRun({job_id:t.job.id,workflow_id:r.id,team_id:t.team_id,current_state:o,parent_run_id:e.run_id}),a=Gu({dal:t.dal,workflow:Ls(n)?sa(n):n,job:t.job,project:t.project,run:i,membersByAlias:t.membersByAlias,outcomes:{},inputs:s,team_id:t.team_id});return Ls(n)?vy(n,a,i.current_state??n.entry_step_id):ky(a,i.current_state??n.start_at)}};return e}async function ky(t,e){let r=e;if(r.startsWith($s))return{run_id:t.run_id,terminal_state:null,steps_executed:0,paused:!0};for(let s=0;s<1e3;s+=1){if(r.startsWith("@terminal:"))return Qt(t,r.slice(10));t.dal.setRunCurrentState(t.run_id,r),t.last_state_id=r;let o=t.workflow.states[r];if(o===void 0){let l=na(t,ee(t.workflow));if(l.kind==="paused")return De(t);if(l.kind==="escalate")return ot(t,{id:r,name:r,type:"unknown"},l.token,l.reason),De(t);if(l.kind==="terminal")return Qt(t,l.terminal);r=l.state;continue}let i,a=Ny(t,r);if(a!==null){let l=X(t,{run_id:t.run_id,state_name:r});if(t.steps_executed+=1,t.dal.finishStep(l.id,a,"escalation_resume"),Y(t,r,r,a),a===ts)return Qt(t,Ol);let c=o.outcomes?.[a];i=c!==void 0?K(t.workflow,c):ot(t,{id:r,name:r,type:o.type},a,`no declared edge for resumed outcome '${a}' from state '${r}'`)}else i=await Vu(t,r,o);if(i.kind==="paused")return De(t);if(i.kind==="escalate")return ot(t,{id:r,name:r,type:o.type},i.token,i.reason),De(t);if(i.kind==="terminal"){let l=na(t,i.terminal);if(l.kind==="paused")return De(t);if(l.kind==="escalate")return ot(t,{id:r,name:r,type:o.type},l.token,l.reason),De(t);if(l.kind==="terminal")return Qt(t,l.terminal);r=l.state;continue}r=i.state}t.dal.raiseAttention({kind:"engine_step_limit_exceeded",severity:"error",project_id:t.project.id,run_id:t.run_id,payload:JSON.stringify({run_id:t.run_id})});let n=na(t,ee(t.workflow));return n.kind==="terminal"?Qt(t,n.terminal):Qt(t,ee(t.workflow))}async function vy(t,e,r){let n=new Map(t.steps.map(i=>[i.id,i])),s=new Map(t.steps.map(i=>[i.name,i])),o=r;for(let i=0;i<1e3;i+=1){e.dal.setRunCurrentState(e.run_id,o);let a=n.get(o);if(a===void 0)return ot(e,{id:o,name:o,type:"unknown"},"",`internal:unknown v3 step '${o}'`),De(e);let l=Ny(e,a.id);if(l!==null){let m=X(e,{run_id:e.run_id,state_name:a.name});if(e.steps_executed+=1,e.dal.finishStep(m.id,l,"escalation_resume"),Y(e,a.id,a.name,l),l===ts)return Qt(e,Ol);let p=Object.keys(t.connections[a.id]??{}),h=t.connections[a.id]?.[l]?.[0]?.[0]?.step_id??t.connections[a.id]?.main?.[0]?.[0]?.step_id;if(h===void 0)return ot(e,{id:a.id,name:a.name,type:a.type},l,`no declared edge for resumed outcome '${l}' from step '${a.id}'`,{declared_outcomes:p}),De(e);o=h;continue}let c=await mC(e,t,a);if(c.kind==="paused")return De(e);let u=Object.keys(t.connections[a.id]??{});if(c.kind==="escalate")return ot(e,{id:a.id,name:a.name,type:a.type},c.token,c.reason,{declared_outcomes:u}),De(e);let d=c.kind==="terminal"?c.terminal:c.state;if(a.type==="lmctl/terminal"){let m=e.workflow;e.workflow=sa(t,a);try{let p=na(e,d);if(p.kind==="paused")return De(e);if(p.kind==="escalate")return ot(e,{id:a.id,name:a.name,type:a.type},p.token,p.reason),De(e);if(p.kind==="terminal")return Qt(e,p.terminal);let h=s.get(p.state);if(h===void 0)return ot(e,{id:a.id,name:a.name,type:a.type},"",`internal:unknown v3 error handler step '${p.state}'`),De(e);o=h.id;continue}finally{e.workflow=m}}if(Zr(d))return ot(e,{id:a.id,name:a.name,type:a.type},d,`generic escalation '${d}' from step '${a.id}'`,{declared_outcomes:u}),De(e);let f=t.connections[a.id]?.[d]?.[0]?.[0]?.step_id??t.connections[a.id]?.main?.[0]?.[0]?.step_id;if(f===void 0)return ot(e,{id:a.id,name:a.name,type:a.type},d,`no declared edge for outcome '${d}' from step '${a.id}'`,{declared_outcomes:u}),De(e);o=f}return e.dal.raiseAttention({kind:"engine_step_limit_exceeded",severity:"error",project_id:e.project.id,run_id:e.run_id,payload:JSON.stringify({run_id:e.run_id})}),Qt(e,"aborted")}async function mC(t,e,r){let n=Iy(e,r),s=t.workflow;t.workflow=sa(e,r);try{return await Vu(t,r.id,n,r.name)}finally{t.workflow=s}}function Iy(t,e){let r=e.parameters,n=e.members??{},s=Object.keys(t.connections[e.id]??{}),o=Object.fromEntries(s.map(a=>[a,`@terminal:${a}`])),i={state_name:e.name};switch(e.type){case"lmctl/review":{let a=s.filter(l=>!["approve","request_changes","fail_pre_check","max_loops_exceeded"].includes(l));return{...i,type:"Review",...r,coder:n.coder,reviewers:n.reviewers,outcomes:{approve:o.approve??"@terminal:approve",...o.request_changes!==void 0?{request_changes:o.request_changes}:{},...o.fail_pre_check!==void 0?{fail_pre_check:o.fail_pre_check}:{},...o.max_loops_exceeded!==void 0?{max_loops_exceeded:o.max_loops_exceeded}:{}},...a.length>0?{outcomes_from_stance:Object.fromEntries(a.map(l=>[l,`@terminal:${l}`]))}:{}}}case"lmctl/consolidate":return{...i,type:"Consolidate",...r,researchers:n.researchers,consolidator:n.consolidator,outcomes:{ok:o.ok??"@terminal:ok",...o.error!==void 0?{error:o.error}:{}}};case"lmctl/interactive":return{...i,type:"Interactive",...r,agent:n.agent,outcomes:{done:o.done??"@terminal:done",...o.timeout!==void 0?{timeout:o.timeout}:{}}};case"lmctl/loop":return{...i,type:"Loop",...r,outcomes:{ok:o.ok??"@terminal:ok",...o.error!==void 0?{error:o.error}:{}}};case"lmctl/render-docx":return{...i,type:"lmctl/render-docx",...r,outcomes:{done:o.done??"@terminal:done",...o.error!==void 0?{error:o.error}:{}}};case"lmctl/render-xlsx":return{...i,type:"lmctl/render-xlsx",...r,outcomes:{done:o.done??"@terminal:done",...o.error!==void 0?{error:o.error}:{}}};case"lmctl/shell-step":return{...i,type:"ShellStep",...r,outcomes_from_exit:r.outcomes_from_exit??Object.fromEntries(s.map(a=>[a.slice(5),`@terminal:${a}`]))};case"lmctl/assert-repo-clean":return{...i,type:"AssertRepoClean",...r,next:o.main??"@terminal:main"};case"lmctl/choice":return{...i,type:"Choice",...r};case"lmctl/foreach":return{...i,type:"ForEach",...r,outcomes:{all_ok:o.all_ok??"@terminal:all_ok",...o.any_failed!==void 0?{any_failed:o.any_failed}:{}}};case"lmctl/subflow":return{...i,type:"Subflow",...r,outcomes:o};case"lmctl/terminal":return{...i,type:"Terminal",name:r.name,kind:r.kind};default:return{...i,type:e.type,...r}}}async function Vu(t,e,r,n){let s=ra().get(r.type);if(s===void 0)throw new Error(`unknown archetype: ${r.type}`);if(s.execute===void 0)throw new Error(`archetype ${r.type} has no execute() - is it a trigger-only archetype used as a step?`);let o=t.emit_progress,i=t.progress_step_id;t.emit_progress=s.description.emits_progress===!0?gC(t,s):void 0,t.progress_step_id=null;try{return await s.execute(Lg(t,e,r,n??e))}finally{t.emit_progress=o,t.progress_step_id=i}}function pC(t,e){try{let r=JSON.parse(t);if(_C(r)&&r.definition_schema_version===3)return At.parse(r)}catch{return e}return e}function Ls(t){return t.definition_schema_version===3}function sa(t,e){let r=e===void 0?[]:Object.keys(t.connections[e.id]??{}),n=Object.fromEntries(r.map(o=>[o,{kind:o==="aborted"?"failure":"neutral"}])),s={};if(e?.type==="lmctl/loop"&&typeof e.parameters.body=="string"){let o=t.steps.find(i=>i.name===e.parameters.body);o!==void 0&&(s[e.parameters.body]=Iy(t,o))}return e?.type==="lmctl/terminal"&&typeof e.parameters.name=="string"&&(n[e.parameters.name]={kind:hC(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 hC(t){return t==="success"||t==="failure"||t==="neutral"?t:"neutral"}function _C(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function gC(t,e){let r=`progress.${e.description.namespace}/${e.description.name}`;return n=>{try{if(typeof n.kind!="string"||n.kind.length===0)return;t.dal.insertSessionEvent({run_id:t.run_id,step_id:t.progress_step_id,kind:`${r}.${n.kind}`,timestamp_ms:Date.now(),payload:JSON.stringify({message:n.message,data:n.data})})}catch(s){let o=s instanceof Error?s.message:String(s);console.warn(`[progress] dropped ${r} event: ${o}`)}}}function Qt(t,e){t.dal.setRunTerminalState(t.run_id,e);try{mg(t.run_id,t.dal)}catch{}return{run_id:t.run_id,terminal_state:e,steps_executed:t.steps_executed}}function De(t){return{run_id:t.run_id,terminal_state:null,steps_executed:t.steps_executed,paused:!0}}function Ny(t,e){let n=t.dal.getRun(t.run_id)?.pending_escalation_decision??null;if(n===null)return null;let s;try{let a=JSON.parse(n);if(a===null||typeof a!="object"||Array.isArray(a))return null;s=a}catch{return null}let o=s[e];if(typeof o!="string")return null;delete s[e];let i=Object.keys(s).length>0?JSON.stringify(s):null;return t.dal.setRunPendingEscalationDecision(t.run_id,i),o}function na(t,e){if(!yC(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&&wC(t,e,r.on_unhandled_failure),{kind:"terminal",terminal:e}))}function yC(t,e){return t.definition_schema_version===2&&t.terminals[e]?.kind==="failure"}function wC(t,e,r){let n=EC(t),s=r.capture_evidence&&n!==null?TC(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 EC(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 TC(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 xy(t){if(!Ty.includes(t.definition_schema_version))throw new Error(`unsupported definition_schema_version ${t.definition_schema_version}; supported versions: ${Ty.join(", ")}`)}var Ty,Ay=E(()=>{"use strict";Tn();pg();yg();Je();Xu();rs();Ty=[1,2,3]});import{readFileSync as bC,readdirSync as SC}from"node:fs";import{basename as kC,join as vC,resolve as IC}from"node:path";function jy(t={}){let e=IC(t.workflowsDir??"workflows"),r=SC(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=>NC(vC(e,n)))}}function NC(t){let e=kC(t);try{let r=bC(t,"utf8"),n=Me(r);return Cy(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:My(r)}}}function Oy(t,e){try{let r=Me(e);return Cy(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:My(r)}}}function Ly(t){let e=[];e.push(`workflow verification - ${t.generated_at}`),e.push(`dir: ${t.workflows_dir}`),e.push(""),e.push(`${"status".padEnd(17)} ${"workflow".padEnd(36)} ${"first step".padEnd(52)} note`),e.push(`${"-".repeat(17)} ${"-".repeat(36)} ${"-".repeat(52)} ${"-".repeat(30)}`);for(let o of t.rows){let i=(o.workflow_name??o.file).slice(0,36).padEnd(36),a=`${o.first_step_id??"-"}${o.first_step_type===null?"":` (${o.first_step_type})`}`;e.push(`${o.status.padEnd(17)} ${i} ${a.slice(0,52).padEnd(52)} ${o.note}`)}let r=t.rows.filter(o=>o.status==="PASS").length,n=t.rows.filter(o=>o.status==="PASS_NEEDS_INPUTS").length,s=t.rows.filter(o=>o.status==="FAIL").length;return e.push(""),e.push(`summary: ${r} pass, ${n} pass_needs_inputs, ${s} fail`),`${e.join(`
1740
1739
  `)}
1741
1740
  `}function Cy(t,e){let r=AC(e),n=$C(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=xC(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 xC(t){return(t??[]).filter(e=>e.required===!0&&e.default===void 0).map(e=>e.name)}function AC(t){return Ku(t)?t.entry_step_id:t.start_at}function $C(t){return Ku(t)?t.steps.find(e=>e.id===t.entry_step_id)?.type??null:t.states[t.start_at]?.type??null}function Ku(t){return t.definition_schema_version===3}function My(t){return t instanceof zt?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 Dy(t){let e=new Set;if(Ku(t))for(let r of t.steps){let n=r.members??{};$y(n,e)}else for(let r of Object.values(t.states))$y(r,e);return[...e].sort()}function $y(t,e){let r=["coder","agent","consolidator"],n=["reviewers","researchers"];for(let s of r){let o=t[s],i=Ry(o);i!==null&&e.add(i)}for(let s of n){let o=t[s];if(Array.isArray(o))for(let i of o){let a=Ry(i);a!==null&&e.add(a)}}}function Ry(t){if(t===null||typeof t!="object")return null;let e=t.alias;return typeof e=="string"&&e.length>0?e:null}var oa=E(()=>{"use strict";Sn()});function RC({dal:t}){let e=t.listProjects();for(let r of e){let s=t.query("SELECT * FROM job WHERE project_id = ? AND source = ? ORDER BY id DESC LIMIT 1",r.id,ia)[0]??null;if(s!==null&&(s.status==="queued"||s.status==="running"))continue;let i=(s?.payload?JSON.parse(s.payload):null)?.max_run_id??null,{count:a,maxRunId:l}=jC(t,r,i);if(a<20)continue;let c=i??"initial",u=`${Cs}:${r.id}:${c}`;t.enqueueJob({project_id:r.id,source:ia,source_ref:Cs,payload:JSON.stringify({kind:Cs,project_id:r.id,completed_sessions:a,max_run_id:l,since_run_id:i}),dedupe_key:u})}}function jC(t,e,r){let n=t.query(`SELECT COUNT(*) AS cnt, MAX(r.id) AS max_id
1742
1741
  FROM run r
1743
1742
  JOIN job j ON j.id = r.job_id
1744
1743
  WHERE j.project_id = ?
1745
1744
  AND r.terminal_state IS NOT NULL
1746
- ${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 Py(t){for(let e of OC)try{e(t)}catch{}}var ia,Cs,OC,Yu=E(()=>{"use strict";ia="memory_policy",Cs="memory_consolidation_request";OC=[RC]});var qy={};re(qy,{getOrInsertConsolidationWorkflow:()=>Uy,runJobById:()=>Ms,runOnce:()=>Br,startWorker:()=>PC});import{createHash as LC}from"node:crypto";import{readFileSync as CC}from"node:fs";import{pathToFileURL as MC}from"node:url";function Uy(t,e="durable-memory-consolidation-v2"){let r=t.getWorkflowByName(e);if(r!==null)return r;try{wi({swallow:!0});let n=Ei(e);if(n===null)return null;let s=CC(n,"utf8"),o=Ce(s);return t.insertWorkflow({name:e,version:o.version,definition_schema_version:o.definition_schema_version,definition:s,source_uri:MC(n).href,source_sha256:LC("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??Fy,evaluator:n=>By(t.dal,n)}),r===null?null:await Wy(t.dal,r,e)}catch(n){if(r!==null)return wr(t.dal,r,"worker_run_failed",Wr(n),e);try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:aa(Wr(n))})})}catch{}return null}finally{t.max_concurrent}}async function Ms(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??Fy,evaluator:s=>By(t.dal,s)});return n.claimed?(r=n.job,{claimed:!0,...await Wy(t.dal,r,e)}):n}catch(n){if(r!==null)return{claimed:!0,...wr(t.dal,r,"worker_run_failed",Wr(n),e)};try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:aa(Wr(n)),job_id:t.job_id})})}catch{}return{claimed:!1,reason:"not_claimable",job_id:t.job_id}}finally{t.max_concurrent}}async function Wy(t,e,r){let n=t.getProjectByJob(e.id);if(n===null)return wr(t,e,"worker_project_missing","project_not_found",r);let s=e.source===ia&&e.source_ref===Cs,o=e.run_id===null?null:t.getRun(e.run_id),i;if(o!==null?i=t.getWorkflow(o.workflow_id):s?i=Uy(t):i=Hy(t,e,n),i===null)return wr(t,e,"worker_workflow_missing","workflow_not_found",r,n);let a=t.getTeam(o?.team_id??n.team_id),l=a===null?[]:t.listTeamMembers(a.id);if(a===null||l.length===0)return wr(t,e,"worker_team_missing","team_not_found",r,n);let c;try{c=Ce(i.definition)}catch(d){return wr(t,e,"worker_workflow_invalid",Wr(d),r,n)}let u=FC(c,l);if(u.length>0)return wr(t,e,"worker_team_missing_aliases",`missing_aliases:${u.join(",")}`,r,n,a);try{let d=await Sy({dal:t,job:e,workflow:c,team:a,members:l,workflowRow:i});return t.setJobRun(e.id,d.run_id),d.paused===!0?{job_id:e.id,run_id:d.run_id,status:"paused",terminal_state:null,ms:Date.now()-r}:(t.releaseJob(e.id,"done",null),{job_id:e.id,run_id:d.run_id,status:"done",terminal_state:d.terminal_state,ms:Date.now()-r})}catch(d){return wr(t,e,"worker_run_failed",Wr(d),r,n,a)}}function By(t,e){let r=t.getProjectByJob(e.id);if(r===null)return{concurrency_key:e.concurrency_key_resolved,concurrent_limit:1};let n=Hy(t,e,r);if(n===null)return{concurrency_key:e.concurrency_key_resolved,concurrent_limit:1};let s=null;try{s=Ce(n.definition)}catch{s=null}return Fi({workflow:s,job:e,project:r})}function Hy(t,e,r){return e.workflow_id_override!==null?t.getWorkflow(e.workflow_id_override):t.getWorkflowByName(r.workflow_name)}async function PC(t){let e=!1,r=null,n=Promise.resolve(),s=async()=>{if(!e){try{let o;do o=await Br(t);while(!e&&o!==null)}catch(o){try{t.dal.raiseAttention({kind:"worker_loop_error",severity:"error",payload:JSON.stringify({error:aa(Wr(o))})})}catch{}}e||(r=setTimeout(()=>{n=s()},t.poll_interval_ms??DC))}};return n=s(),{stop:async()=>{e=!0,r!==null&&clearTimeout(r),await n.catch(()=>{})}}}function wr(t,e,r,n,s,o,i){let a=aa(n);return t.releaseJob(e.id,"failed",a),t.raiseAttention({kind:r,severity:"error",project_id:o?.id??e.project_id,payload:JSON.stringify({job_id:e.id,team_id:i?.id??null,error:a})}),{job_id:e.id,run_id:null,status:"failed",terminal_state:null,ms:Date.now()-s}}function Wr(t){return t instanceof Error?t.message:String(t)}function aa(t){return t.length>4096?t.slice(0,4096):t}function FC(t,e){let r=Dy(t);if(r.length===0)return[];let n=new Set(e.map(s=>s.alias));return r.filter(s=>!n.has(s))}var Fy,DC,Ds=E(()=>{"use strict";Ti();Ay();Sn();oa();wu();Yu();Fy=6e5,DC=5e3});import{existsSync as UC,readFileSync as WC}from"node:fs";import{marked as BC}from"marked";function Vy(t,e){t.get("/layman",r=>r.html(je("Layman Home",HC(e.dal)))),t.get("/api/layman",r=>r.json(Zy(e.dal))),t.get("/layman/start/:workflow",r=>{let n=Gy(r);return n===null?r.notFound():r.html(je(`Start ${An(n)}`,XC(e.dal,n)))}),t.post("/layman/start/:workflow",async r=>{let n=Gy(r);return n===null?r.notFound():n==="newspaper"?Jy(r,e.dal):GC(r,e.dal,n)}),t.get("/layman/run/:id",r=>{let n=Lr(e.dal,la(r,"id"));return n===null?r.notFound():r.html(je(`Run ${n.id}`,YC(e.dal,n)))}),t.get("/api/layman/run/:id",r=>{let n=Lr(e.dal,la(r,"id"));return n===null?r.notFound():r.json(aM(e.dal,n))}),t.post("/layman/run/:id/respond",async r=>ZC(r,e.dal)),t.get("/layman/newspaper",r=>r.html(je("Newspaper Subscriptions",oM(e.dal)))),t.post("/layman/newspaper",r=>Jy(r,e.dal)),t.delete("/layman/newspaper/:id",r=>Xy(r,e.dal)),t.post("/layman/newspaper/:id/delete",r=>Xy(r,e.dal))}function HC(t){let e=Zy(t);return`<section class="layman-home">
1745
+ ${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 Py(t){for(let e of OC)try{e(t)}catch{}}var ia,Cs,OC,Yu=E(()=>{"use strict";ia="memory_policy",Cs="memory_consolidation_request";OC=[RC]});var qy={};re(qy,{getOrInsertConsolidationWorkflow:()=>Uy,runJobById:()=>Ms,runOnce:()=>Br,startWorker:()=>PC});import{createHash as LC}from"node:crypto";import{readFileSync as CC}from"node:fs";import{pathToFileURL as MC}from"node:url";function Uy(t,e="durable-memory-consolidation-v2"){let r=t.getWorkflowByName(e);if(r!==null)return r;try{wi({swallow:!0});let n=Ei(e);if(n===null)return null;let s=CC(n,"utf8"),o=Me(s);return t.insertWorkflow({name:e,version:o.version,definition_schema_version:o.definition_schema_version,definition:s,source_uri:MC(n).href,source_sha256:LC("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??Fy,evaluator:n=>By(t.dal,n)}),r===null?null:await Wy(t.dal,r,e)}catch(n){if(r!==null)return wr(t.dal,r,"worker_run_failed",Wr(n),e);try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:aa(Wr(n))})})}catch{}return null}finally{t.max_concurrent}}async function Ms(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??Fy,evaluator:s=>By(t.dal,s)});return n.claimed?(r=n.job,{claimed:!0,...await Wy(t.dal,r,e)}):n}catch(n){if(r!==null)return{claimed:!0,...wr(t.dal,r,"worker_run_failed",Wr(n),e)};try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:aa(Wr(n)),job_id:t.job_id})})}catch{}return{claimed:!1,reason:"not_claimable",job_id:t.job_id}}finally{t.max_concurrent}}async function Wy(t,e,r){let n=t.getProjectByJob(e.id);if(n===null)return wr(t,e,"worker_project_missing","project_not_found",r);let s=e.source===ia&&e.source_ref===Cs,o=e.run_id===null?null:t.getRun(e.run_id),i;if(o!==null?i=t.getWorkflow(o.workflow_id):s?i=Uy(t):i=Hy(t,e,n),i===null)return wr(t,e,"worker_workflow_missing","workflow_not_found",r,n);let a=t.getTeam(o?.team_id??n.team_id),l=a===null?[]:t.listTeamMembers(a.id);if(a===null||l.length===0)return wr(t,e,"worker_team_missing","team_not_found",r,n);let c;try{c=Me(i.definition)}catch(d){return wr(t,e,"worker_workflow_invalid",Wr(d),r,n)}let u=FC(c,l);if(u.length>0)return wr(t,e,"worker_team_missing_aliases",`missing_aliases:${u.join(",")}`,r,n,a);try{let d=await Sy({dal:t,job:e,workflow:c,team:a,members:l,workflowRow:i});return t.setJobRun(e.id,d.run_id),d.paused===!0?{job_id:e.id,run_id:d.run_id,status:"paused",terminal_state:null,ms:Date.now()-r}:(t.releaseJob(e.id,"done",null),{job_id:e.id,run_id:d.run_id,status:"done",terminal_state:d.terminal_state,ms:Date.now()-r})}catch(d){return wr(t,e,"worker_run_failed",Wr(d),r,n,a)}}function By(t,e){let r=t.getProjectByJob(e.id);if(r===null)return{concurrency_key:e.concurrency_key_resolved,concurrent_limit:1};let n=Hy(t,e,r);if(n===null)return{concurrency_key:e.concurrency_key_resolved,concurrent_limit:1};let s=null;try{s=Me(n.definition)}catch{s=null}return Fi({workflow:s,job:e,project:r})}function Hy(t,e,r){return e.workflow_id_override!==null?t.getWorkflow(e.workflow_id_override):t.getWorkflowByName(r.workflow_name)}async function PC(t){let e=!1,r=null,n=Promise.resolve(),s=async()=>{if(!e){try{let o;do o=await Br(t);while(!e&&o!==null)}catch(o){try{t.dal.raiseAttention({kind:"worker_loop_error",severity:"error",payload:JSON.stringify({error:aa(Wr(o))})})}catch{}}e||(r=setTimeout(()=>{n=s()},t.poll_interval_ms??DC))}};return n=s(),{stop:async()=>{e=!0,r!==null&&clearTimeout(r),await n.catch(()=>{})}}}function wr(t,e,r,n,s,o,i){let a=aa(n);return t.releaseJob(e.id,"failed",a),t.raiseAttention({kind:r,severity:"error",project_id:o?.id??e.project_id,payload:JSON.stringify({job_id:e.id,team_id:i?.id??null,error:a})}),{job_id:e.id,run_id:null,status:"failed",terminal_state:null,ms:Date.now()-s}}function Wr(t){return t instanceof Error?t.message:String(t)}function aa(t){return t.length>4096?t.slice(0,4096):t}function FC(t,e){let r=Dy(t);if(r.length===0)return[];let n=new Set(e.map(s=>s.alias));return r.filter(s=>!n.has(s))}var Fy,DC,Ds=E(()=>{"use strict";Ti();Ay();Sn();oa();wu();Yu();Fy=6e5,DC=5e3});import{existsSync as UC,readFileSync as WC}from"node:fs";import{marked as BC}from"marked";function Vy(t,e){t.get("/layman",r=>r.html(je("Layman Home",HC(e.dal)))),t.get("/api/layman",r=>r.json(Zy(e.dal))),t.get("/layman/start/:workflow",r=>{let n=Gy(r);return n===null?r.notFound():r.html(je(`Start ${An(n)}`,XC(e.dal,n)))}),t.post("/layman/start/:workflow",async r=>{let n=Gy(r);return n===null?r.notFound():n==="newspaper"?Jy(r,e.dal):GC(r,e.dal,n)}),t.get("/layman/run/:id",r=>{let n=Lr(e.dal,la(r,"id"));return n===null?r.notFound():r.html(je(`Run ${n.id}`,YC(e.dal,n)))}),t.get("/api/layman/run/:id",r=>{let n=Lr(e.dal,la(r,"id"));return n===null?r.notFound():r.json(aM(e.dal,n))}),t.post("/layman/run/:id/respond",async r=>ZC(r,e.dal)),t.get("/layman/newspaper",r=>r.html(je("Newspaper Subscriptions",oM(e.dal)))),t.post("/layman/newspaper",r=>Jy(r,e.dal)),t.delete("/layman/newspaper/:id",r=>Xy(r,e.dal)),t.post("/layman/newspaper/:id/delete",r=>Xy(r,e.dal))}function HC(t){let e=Zy(t);return`<section class="layman-home">
1747
1746
  <h1>Welcome</h1>
1748
1747
  <p class="muted">Choose a workflow and answer a few plain-language prompts.</p>
1749
1748
  <div class="grid">${ca.map(qC).join("")}</div>
@@ -1771,7 +1770,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
1771
1770
  <label>Slug<input name="slug" placeholder="my-document" required></label>
1772
1771
  <label>Output directory<input name="output_dir" value="drafts"></label>
1773
1772
  <button type="submit">Start Document Wizard</button>
1774
- </form>`:zy(n,"/layman/start/newspaper")}function Ky(t){return`<label>Project<select name="project_id" required>${t.map(e=>`<option value="${S(e.id)}">${S(e.name)}</option>`).join("")}</select></label>`}async function GC(t,e,r){let n=await t.req.parseBody(),s=tw(e,n);if(s===null)return t.html(je("Start workflow",'<p class="error">Choose a valid project.</p>'),400);let o=e.getWorkflowByName(r);if(o===null)return t.html(je("Start workflow",`<p class="error">${S(An(r))} is not loaded.</p>`),400);let i=r==="info-qa"?VC(n):KC(n);if(typeof i=="string")return t.html(je("Start workflow",`<p class="error">${S(i)}</p>`),400);let a=e.enqueueJob({project_id:s.id,workflow_id_override:o.id,source:"layman",source_ref:r,dedupe_key:`layman:${r}:${Date.now()}:${Math.random()}`,payload:JSON.stringify(i)}),l=await Br({dal:e,worker_id:`layman-start-${Date.now()}`}),c=e.getJob(a.id),u=l?.job_id===a.id?l.run_id:c?.run_id??null;return u===null?t.redirect("/layman?queued=1",302):t.redirect(`/layman/run/${u}`,302)}function VC(t){let e=ze(t.question).trim();if(e.length===0)return"Enter a question.";let r=ze(t.output_path).trim();return{question:e,...r.length>0?{output_path:r}:{}}}function KC(t){let e=ze(t.task_description).trim(),r=pM(ze(t.slug).trim()),n=ze(t.output_dir).trim()||"drafts";return e.length===0?"Describe the document you want.":r.length===0?"Enter a document slug.":{task_description:e,slug:r,output_dir:n}}function YC(t,e){let r=e.workflow?.name??"unknown",n=`<h1>${S(An(r))}</h1>
1773
+ </form>`:zy(n,"/layman/start/newspaper")}function Ky(t){return`<label>Project<select name="project_id" required>${t.map(e=>`<option value="${S(e.id)}">${S(e.name)}</option>`).join("")}</select></label>`}async function GC(t,e,r){let n=await t.req.parseBody(),s=tw(e,n);if(s===null)return t.html(je("Start workflow",'<p class="error">Choose a valid project.</p>'),400);let o=e.getWorkflowByName(r);if(o===null)return t.html(je("Start workflow",`<p class="error">${S(An(r))} is not loaded.</p>`),400);let i=r==="info-qa"?VC(n):KC(n);if(typeof i=="string")return t.html(je("Start workflow",`<p class="error">${S(i)}</p>`),400);let a=e.enqueueJob({project_id:s.id,workflow_id_override:o.id,source:"layman",source_ref:r,dedupe_key:`layman:${r}:${Date.now()}:${Math.random()}`,payload:JSON.stringify(i)}),l=await Br({dal:e,worker_id:`layman-start-${Date.now()}`}),c=e.getJob(a.id),u=l?.job_id===a.id?l.run_id:c?.run_id??null;return u===null?t.redirect("/layman?queued=1",302):t.redirect(`/layman/run/${u}`,302)}function VC(t){let e=Ze(t.question).trim();if(e.length===0)return"Enter a question.";let r=Ze(t.output_path).trim();return{question:e,...r.length>0?{output_path:r}:{}}}function KC(t){let e=Ze(t.task_description).trim(),r=pM(Ze(t.slug).trim()),n=Ze(t.output_dir).trim()||"drafts";return e.length===0?"Describe the document you want.":r.length===0?"Enter a document slug.":{task_description:e,slug:r,output_dir:n}}function YC(t,e){let r=e.workflow?.name??"unknown",n=`<h1>${S(An(r))}</h1>
1775
1774
  <p><a href="/layman">Layman home</a></p>`;if(e.terminal_state!==null)return`${n}${eM(t,e,r)}`;let s=ew(t,e);return s!==null&&s.status==="waiting_operator"?`${n}${zC(e,s)}`:`${n}<section hx-get="/layman/run/${S(e.id)}" hx-trigger="every 2s" hx-swap="outerHTML">
1776
1775
  <h2>Running</h2>
1777
1776
  <p class="muted">Current stage: <strong>${S(e.current_state??"starting")}</strong></p>
@@ -1787,7 +1786,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
1787
1786
  <button type="submit" name="done" value="false">Send response</button>
1788
1787
  <button type="submit" name="done" value="true">Done with this stage</button>
1789
1788
  </form>
1790
- </section>`}async function ZC(t,e){let r=la(t,"id"),n=await t.req.parseBody(),s=Number(ze(n.step_id)),o=ze(n.input),i=ze(n.done)==="true";if(!Number.isInteger(s))return t.html(je("Interactive response",'<p class="error">Missing interactive step.</p>'),400);let a=e.resumeInteractive(s,o,i);return a.resumed?(QC(e,a.run.id),await Br({dal:e,worker_id:`layman-respond-${Date.now()}`}),t.redirect(`/layman/run/${r}`,302)):t.html(je("Interactive response",`<p class="error">Could not submit response: ${S(a.reason)}</p>`),400)}function QC(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(!Zu(s)||s.definition_schema_version!==3||!Array.isArray(s.steps))return;let o=s.steps.find(i=>Zu(i)&&i.name===r.current_state&&typeof i.id=="string");Zu(o)&&typeof o.id=="string"&&t.setRunCurrentState(r.id,o.id)}catch{return}}function eM(t,e,r){let n=dM(e.terminal_state);return`<section class="metric terminal-run">
1789
+ </section>`}async function ZC(t,e){let r=la(t,"id"),n=await t.req.parseBody(),s=Number(Ze(n.step_id)),o=Ze(n.input),i=Ze(n.done)==="true";if(!Number.isInteger(s))return t.html(je("Interactive response",'<p class="error">Missing interactive step.</p>'),400);let a=e.resumeInteractive(s,o,i);return a.resumed?(QC(e,a.run.id),await Br({dal:e,worker_id:`layman-respond-${Date.now()}`}),t.redirect(`/layman/run/${r}`,302)):t.html(je("Interactive response",`<p class="error">Could not submit response: ${S(a.reason)}</p>`),400)}function QC(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(!Zu(s)||s.definition_schema_version!==3||!Array.isArray(s.steps))return;let o=s.steps.find(i=>Zu(i)&&i.name===r.current_state&&typeof i.id=="string");Zu(o)&&typeof o.id=="string"&&t.setRunCurrentState(r.id,o.id)}catch{return}}function eM(t,e,r){let n=dM(e.terminal_state);return`<section class="metric terminal-run">
1791
1790
  <h2>${n?"Complete":"Stopped"}</h2>
1792
1791
  <p>Status: <strong>${S(e.terminal_state)}</strong></p>
1793
1792
  ${n?tM(t,e,r):nM(e)}
@@ -1810,7 +1809,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
1810
1809
  <label>Custom cron<input name="cron" placeholder="0 6 * * *"></label>
1811
1810
  <label>Output directory<input name="output_dir" value="digests"></label>
1812
1811
  <button type="submit">Create subscription</button>
1813
- </form>`}async function Jy(t,e){let r=await t.req.parseBody(),n=tw(e,r);if(n===null)return t.html(je("Newspaper",'<p class="error">Choose a valid project.</p>'),400);let s=e.getWorkflowByName("newspaper");if(s===null)return t.html(je("Newspaper",'<p class="error">The newspaper workflow is not loaded.</p>'),400);let o=ze(r.topics).split(/[\n,]/).map(a=>a.trim()).filter(a=>a.length>0);if(o.length===0)return t.html(je("Newspaper",'<p class="error">Enter at least one topic.</p>'),400);let i={topics:o,output_dir:ze(r.output_dir).trim()||"digests",schedule:cM(r)};return e.insertProjectWorkflow({project_id:n.id,workflow_id:s.id,condition:null,parameters_override:JSON.stringify(i),priority:100,enabled:!0}),t.redirect("/layman/newspaper?created=1",302)}function Xy(t,e){let r=la(t,"id");return e.removeProjectWorkflow(r)?t.redirect("/layman/newspaper?removed=1",302):t.notFound()}function iM(t){return me(["id","project","topics","status","action"],t.map(e=>{let r=hM(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 Zy(t){let e=Qy(t);return{workflows:ca,recent_runs:lM(t),newspaper_subscriptions:e.length}}function aM(t,e){let r=ew(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 lM(t){return t.query(`SELECT r.*, w.name AS workflow_name
1812
+ </form>`}async function Jy(t,e){let r=await t.req.parseBody(),n=tw(e,r);if(n===null)return t.html(je("Newspaper",'<p class="error">Choose a valid project.</p>'),400);let s=e.getWorkflowByName("newspaper");if(s===null)return t.html(je("Newspaper",'<p class="error">The newspaper workflow is not loaded.</p>'),400);let o=Ze(r.topics).split(/[\n,]/).map(a=>a.trim()).filter(a=>a.length>0);if(o.length===0)return t.html(je("Newspaper",'<p class="error">Enter at least one topic.</p>'),400);let i={topics:o,output_dir:Ze(r.output_dir).trim()||"digests",schedule:cM(r)};return e.insertProjectWorkflow({project_id:n.id,workflow_id:s.id,condition:null,parameters_override:JSON.stringify(i),priority:100,enabled:!0}),t.redirect("/layman/newspaper?created=1",302)}function Xy(t,e){let r=la(t,"id");return e.removeProjectWorkflow(r)?t.redirect("/layman/newspaper?removed=1",302):t.notFound()}function iM(t){return me(["id","project","topics","status","action"],t.map(e=>{let r=hM(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 Zy(t){let e=Qy(t);return{workflows:ca,recent_runs:lM(t),newspaper_subscriptions:e.length}}function aM(t,e){let r=ew(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 lM(t){return t.query(`SELECT r.*, w.name AS workflow_name
1814
1813
  FROM run r
1815
1814
  JOIN workflow w ON w.id = r.workflow_id
1816
1815
  WHERE w.name IN (${Qu.map(()=>"?").join(",")})
@@ -1820,21 +1819,21 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
1820
1819
  JOIN workflow w ON w.id = pw.workflow_id
1821
1820
  JOIN project p ON p.id = pw.project_id
1822
1821
  WHERE w.name = ?
1823
- ORDER BY pw.id DESC`,"newspaper")}function ew(t,e){for(let r of[...e.steps].reverse()){let n=t.getInteractiveSessionByStepId(r.id);if(n!==null)return n}return null}function tw(t,e){let r=Number(ze(e.project_id));return Number.isInteger(r)?t.getProject(r):null}function cM(t){let e=ze(t.schedule)||"daily";return e==="weekly"?{preset:e,cron:"0 6 * * 1"}:e==="custom"?{preset:e,cron:ze(t.cron).trim()||"0 6 * * *"}:{preset:"daily",cron:"0 6 * * *"}}function Gy(t){let e=t.req.param("workflow");return Qu.includes(e)?e:null}function An(t){return ca.find(e=>e.name===t)?.title??t}function uM(t){return t.split(/[_:-]/).filter(Boolean).map(e=>`${e[0]?.toUpperCase()??""}${e.slice(1)}`).join(" ")}function td(t){return BC.parse(t,{async:!1})}function dM(t){return t==="done"||t==="pr_ready"||t==="merged"}function fM(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}function mM(t,e){return t.split(`
1822
+ ORDER BY pw.id DESC`,"newspaper")}function ew(t,e){for(let r of[...e.steps].reverse()){let n=t.getInteractiveSessionByStepId(r.id);if(n!==null)return n}return null}function tw(t,e){let r=Number(Ze(e.project_id));return Number.isInteger(r)?t.getProject(r):null}function cM(t){let e=Ze(t.schedule)||"daily";return e==="weekly"?{preset:e,cron:"0 6 * * 1"}:e==="custom"?{preset:e,cron:Ze(t.cron).trim()||"0 6 * * *"}:{preset:"daily",cron:"0 6 * * *"}}function Gy(t){let e=t.req.param("workflow");return Qu.includes(e)?e:null}function An(t){return ca.find(e=>e.name===t)?.title??t}function uM(t){return t.split(/[_:-]/).filter(Boolean).map(e=>`${e[0]?.toUpperCase()??""}${e.slice(1)}`).join(" ")}function td(t){return BC.parse(t,{async:!1})}function dM(t){return t==="done"||t==="pr_ready"||t==="merged"}function fM(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}function mM(t,e){return t.split(`
1824
1823
  `).slice(0,e).join(`
1825
- `)}function pM(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function ze(t){return typeof t=="string"?t:""}function hM(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 Zu(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function la(t,e){return Number(t.req.param(e))}var ca,Qu,rw=E(()=>{"use strict";Ds();Gt();Ou();ca=[{name:"info-qa",title:"Ask a Question",description:"Get a grounded answer from multiple researchers and one consolidator."},{name:"document-creation",title:"Create a Document",description:"Draft, review, and render a polished document with an interactive wizard."},{name:"newspaper",title:"Daily Newspaper",description:"Subscribe to recurring digests for topics you care about."}],Qu=ca.map(t=>t.name)});function gM(t){return t.replace(/^\/+/,"")}function nw(t){return typeof t=="string"&&t!==""&&!t.includes("/")&&!t.includes("\\")}function $n(t){if(t.mailboxKey!==void 0&&t.mailboxKey!==null&&t.mailboxKey!==""){let e=gM(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 nw(t.userId)&&nw(t.deviceId)?`${t.userId}/${t.deviceId}/`:`${_M}/${t.identityId}/`}function wM(t){return String(Math.max(0,Math.floor(t))).padStart(yM,"0")}function rd(t,e,r){return`${t}${e}${wM(r)}.json`}function ua(t,e){return`${t}${e}`}function da(t,e,r){let n=`${e}${r}`;if(!t.startsWith(n))return;let s=t.slice(n.length).match(/^(\d+)\.json$/);if(s===null)return;let o=Number(s[1]);return Number.isSafeInteger(o)?o:void 0}var _M,yM,fa=E(()=>{"use strict";_M="mailbox";yM=12});function er(t,e){let r=Math.floor(t),n="",s=r;for(let u=0;u<12;u++)n=ma[s&15]+n,s=Math.floor(s/16);let o=Math.floor(e()*4096)&4095,i="",a=o;for(let u=0;u<3;u++)i=ma[a&15]+i,a=a>>4;let l=ma[8|Math.floor(e()*4)&3],c="";for(let u=0;u<15;u++)c+=ma[Math.floor(e()*16)&15];return n.slice(0,8)+"-"+n.slice(8,12)+"-7"+i+"-"+l+c.slice(0,3)+"-"+c.slice(3,15)}var ma,pa=E(()=>{"use strict";ma="0123456789abcdef"});function sd(t,e){return!Number.isFinite(t)||t<=0?e:t}function od(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 lw(t){return t.conversation_id===aw&&bM(t.payload)}function bM(t){return typeof t=="object"&&t!==null&&t.kind==="heartbeat"}function SM(t){let e=typeof t.hb=="string"&&t.hb!==""?t.hb:lw(t)?t.timestamp:void 0;if(e===void 0)return;let r=Date.parse(e);return Number.isFinite(r)?r:void 0}var sw,ow,iw,EM,aw,TM,nd,Hr,ha=E(()=>{"use strict";fa();pa();sw=3e3,ow=1e4,iw=12e3,EM=1e3,aw="__lmctl_heartbeat__",TM={kind:"heartbeat"},nd={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=$n({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=sd(e.readIntervalMs??e.pollIntervalMs??sw,sw),this.heartbeatIdleMs=sd(e.heartbeatIdleMs??ow,ow),this.backoffReadIntervalMs=sd(e.backoffReadIntervalMs??e.pollIntervalMs??iw,iw)}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??nd;if(this.timerHandle!==null&&(e.clearTimeout(this.timerHandle),this.timerHandle=null),this.heartbeatTimerHandle!==null&&(e.clearTimeout(this.heartbeatTimerHandle),this.heartbeatTimerHandle=null),this.bootstrapInFlight!==null)try{await this.bootstrapInFlight}catch{}if(this.tickInFlight!==null)try{await this.tickInFlight}catch{}this.running=!1}async putMessage(e){return this.putEnvelope(e.conversation_id,e.payload)}getCursor(){return this.cursor}getMailboxBasePrefix(){return this.basePrefix}setPollIntervalMs(e){if(!Number.isFinite(e)||e<=0)throw new Error(`SequentialMailboxClient.setPollIntervalMs: invalid ms=${e}`);this.readIntervalMs=e}isPeerOn(){return this.peerIsOn((this.opts.now??Date.now)())}async bootstrapThenRun(){if(await this.ensureBootstrapped(),this.stopRequested){this.running=!1;return}this.runTick(),this.writeHeartbeat()}ensureBootstrapped(){return this.bootstrapped?Promise.resolve():(this.bootstrapPromise===null&&(this.bootstrapPromise=this.runColdStart()),this.bootstrapPromise)}async runColdStart(){try{let e=await this.maxSeq(this.ownStream);this.ownSeq=e,this.cursor===void 0&&(this.cursor=await this.maxSeq(this.peerStream)),this.bootstrapped=!0}catch(e){throw this.bootstrapPromise=null,this.emitError(e,"list"),e}}async maxSeq(e){let r=ua(this.basePrefix,e),n=0,s;do{let o=await this.opts.s3.send(new this.opts.commands.ListObjectsV2Command({Bucket:this.opts.bucket,Prefix:r,MaxKeys:EM,...s!==void 0&&{ContinuationToken:s}}));this.opts.onS3Op?.("list");for(let i of o.Contents??[]){let a=da(i.Key??"",this.basePrefix,e);a!==void 0&&a>n&&(n=a)}s=o.IsTruncated===!0?o.NextContinuationToken:void 0}while(s!==void 0);return n}async putEnvelope(e,r){let n=this.writeChain.then(()=>this.doPut(e,r));return this.writeChain=n.catch(()=>{}),n}async doPut(e,r){await this.ensureBootstrapped();let n=(this.opts.now??Date.now)(),s=new Date(n).toISOString(),o={message_id:er(n,this.opts.random??Math.random),from:this.opts.selfRole,timestamp:s,hb:s,conversation_id:e,payload:r},i=(this.ownSeq??0)+1,a=rd(this.basePrefix,this.ownStream,i);return await this.opts.s3.send(new this.opts.commands.PutObjectCommand({Bucket:this.opts.bucket,Key:a,Body:JSON.stringify(o),ContentType:"application/json"})),this.opts.onS3Op?.("put"),this.ownSeq=i,this.recordWrite(n),a}scheduleNextTick(e){if(this.stopRequested)return;let r=this.opts.timers??nd;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=rd(this.basePrefix,this.peerStream,e),n;try{let o=await this.opts.s3.send(new this.opts.commands.GetObjectCommand({Bucket:this.opts.bucket,Key:r}));if(this.opts.onS3Op?.("get"),o.Body===void 0){this.emitError(new Error(`GetObject ${r}: empty body`),"get"),this.advanceCursor(e);continue}n=await o.Body.transformToString("utf-8")}catch(o){if(od(o)){this.opts.onS3Op?.("get");return}this.emitError(o,"get");return}let s;try{s=JSON.parse(n)}catch(o){this.emitError(o,"get"),this.advanceCursor(e);continue}if(this.recordPeerHeartbeat(s),lw(s)){this.advanceCursor(e);continue}try{await this.opts.onMessage(s)}catch(o){this.emitError(o,"handle");return}this.advanceCursor(e)}}advanceCursor(e){this.cursor=e,this.notifyCursorAdvance(e)}nextReadDelayMs(){return this.peerIsOn((this.opts.now??Date.now)())?this.readIntervalMs:this.backoffReadIntervalMs}peerIsOn(e){return this.lastPeerHeartbeatMs!==void 0&&e-this.lastPeerHeartbeatMs<=this.heartbeatIdleMs}recordPeerHeartbeat(e){let r=SM(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??nd;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(aw,TM)}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 kM}from"@hono/node-server/conninfo";function cw(t,e){let r=e.bucket??vM,n=e.remoteAddressOf??(o=>NM(o)),s=o=>{let i=n(o);return xM(i)?null:o.json({error:"forbidden",message:"local-mailbox is loopback-only"},403)};t.get("/local-mailbox/object",async o=>{let i=s(o);if(i!==null)return i;let a=id(o.req.query("key"));if(typeof a!="string")return o.json({error:"bad_request",message:a.error},400);try{let l=await e.s3.send(new e.commands.GetObjectCommand({Bucket:r,Key:a}));if(l.Body===void 0)return o.json({error:"empty_body"},404);let c=await l.Body.transformToString("utf-8");return o.body(c,200,{"Content-Type":"application/octet-stream"})}catch(l){return od(l)?o.json({error:"not_found"},404):o.json({error:"internal",message:ad(l)},500)}}),t.put("/local-mailbox/object",async o=>{let i=s(o);if(i!==null)return i;let a=id(o.req.query("key"));if(typeof a!="string")return o.json({error:"bad_request",message:a.error},400);let l=new Uint8Array(await o.req.arrayBuffer());try{return await e.s3.send(new e.commands.PutObjectCommand({Bucket:r,Key:a,Body:l})),o.json({ok:!0})}catch(c){return o.json({error:"internal",message:ad(c)},500)}}),t.get("/local-mailbox/list",async o=>{let i=s(o);if(i!==null)return i;let a=o.req.query("prefix")??"",l=id(a,{allowEmpty:!0});if(typeof l!="string")return o.json({error:"bad_request",message:l.error},400);let c=IM(o.req.query("maxKeys")),u=o.req.query("token");try{let d=await e.s3.send(new e.commands.ListObjectsV2Command({Bucket:r,Prefix:l,...c!==void 0?{MaxKeys:c}:{},...u!==void 0&&u!==""?{ContinuationToken:u}:{}}));return o.json({Contents:(d.Contents??[]).map(f=>({Key:f.Key,LastModified:f.LastModified instanceof Date?f.LastModified.toISOString():f.LastModified})),IsTruncated:d.IsTruncated??!1,...d.NextContinuationToken!==void 0?{NextContinuationToken:d.NextContinuationToken}:{}})}catch(d){return o.json({error:"internal",message:ad(d)},500)}})}function id(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 IM(t){if(t===void 0||t==="")return;let e=Number(t);return Number.isInteger(e)&&e>0?e:void 0}function NM(t){try{return kM(t).remote.address}catch{return}}function xM(t){return t===void 0||t===""?!1:!!(t==="127.0.0.1"||t==="::1"||t.startsWith("::ffff:127.")||t.startsWith("127."))}function ad(t){return t instanceof Error?t.message:String(t)}var vM,uw=E(()=>{"use strict";ha();vM="local"});function dw(t,e){t.get("/mailbox/workspace",r=>RM(r,e)),t.get("/mailbox/projects",r=>jM(r,e)),t.get("/mailbox/projects/:id",r=>OM(r,e)),t.post("/mailbox/projects",r=>LM(r,e)),t.patch("/mailbox/projects/:id",r=>CM(r,e)),t.delete("/mailbox/projects/:id",r=>MM(r,e)),t.post("/mailbox/projects/:project_id/prompts",r=>DM(r,e)),t.get("/mailbox/prompts/:id",r=>PM(r,e))}function RM(t,e){e.dal.ensureWorkspace({id:jn,name:ld});let r=fw(e.dal),n={id:jn,name:ld,created_at:$M,projects:r};return t.json({workspace:n})}function jM(t,e){return t.json({projects:fw(e.dal)})}function OM(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(Rn)){let s=cd(e.dal,r);return s===null||s.deleted_at!==null?t.json({project:null},404):t.json({project:ya(s)})}let n=pw(e.dal,r);return n===null?t.json({project:null},404):t.json({project:mw(n)})}async function LM(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:jn,name:ld});let s=e.dal.insertWebProject({workspace_id:jn,name:n.name,repo_path:n.repo_path,config_json:n.config_json===void 0?null:JSON.stringify(n.config_json)});return t.json({project:ya(s)},201)}async function CM(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(Rn)){let o=cd(e.dal,r);if(o===null||o.deleted_at!==null)return t.json({error:"project_not_found",message:`project not found: ${r}`},404);let i=e.dal.updateWebProject({id:o.id,name:s.name===void 0?void 0:s.name,config_json:s.config_json===void 0?void 0:JSON.stringify(s.config_json)});return i===null?t.json({error:"project_not_found",message:`project not found: ${r}`},404):t.json({project:ya(i)})}return t.json({error:"project_not_found",message:`project not found: ${r}`},404)}function MM(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(Rn)){let n=cd(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 DM(t,e){let r=t.req.param("project_id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"project_id required in path"},400);let n;try{n=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.input;if(s===void 0||typeof s!="object")return t.json({error:"bad_request",message:"input is required"},400);let o=s.project_id??r;if(typeof s.text!="string"||s.text==="")return t.json({error:"bad_request",message:"input.text is required"},400);let i=pw(e.dal,o);if(i===null)return t.json({error:"project_not_found",message:`project not found: ${o}`},404);if(e.dal.getWorkflowByName(i.workflow_name)===null)return t.json({error:"workflow_not_registered",message:`project ${i.name} has no registered workflow "${i.workflow_name}"`},400);let l=`${AM}${crypto.randomUUID()}`,c={text:s.text,context_json:s.context_json??null},u;e.enqueueProjectJob!==void 0?u=e.enqueueProjectJob({dal:e.dal,project_id:i.id,source_ref:l,payload:c}):u=await FM({dal:e.dal,project_id:i.id,source_ref:l,payload:c}),e.dal.insertPromptDispatch({prompt_id:l,project_id:i.id,job_id:u.id,text:s.text,context_json:s.context_json===void 0?null:JSON.stringify(s.context_json)});let d={id:l,project_id:`${ga}${i.id}`,text:s.text,status:"pending",created_at:new Date().toISOString(),completed_at:null};return t.json({prompt:d},201)}function PM(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=UM(e.dal,r);return t.json({result:n})}function fw(t){let e=t.listProjects().map(mw),r=t.listWebProjectsActive(jn).map(ya);return[...e,...r].sort(YM)}function mw(t){return{id:`${ga}${t.id}`,workspace_id:jn,name:t.name,repo_path:t.local_path,config_json:{workflow_name:t.workflow_name,team_id:t.team_id,durable_memory_mode:t.durable_memory_mode},last_active_at:null,created_at:t.created_at}}function ya(t){let e={};if(t.config_json!==null)try{let r=JSON.parse(t.config_json);r!==null&&typeof r=="object"&&(e=r)}catch{}return t.linked_v4_project_id!==null&&(e={...e,linked_v4_project_id:t.linked_v4_project_id}),{id:`${Rn}${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 cd(t,e){if(!e.startsWith(Rn))return null;let r=e.slice(Rn.length),n=Number.parseInt(r,10);return!Number.isFinite(n)||String(n)!==r?null:t.getWebProject(n)}function pw(t,e){if(e.startsWith(ga)){let n=e.slice(ga.length),s=Number.parseInt(n,10);if(Number.isFinite(s)&&String(s)===n)return t.getProject(s)}let r=Number.parseInt(e,10);return Number.isFinite(r)&&String(r)===e?t.getProject(r):null}async function FM(t){let{enqueueManual:e}=await Promise.resolve().then(()=>(Tu(),W_));return{id:e(t.dal,{project_id:t.project_id,source_ref:t.source_ref,payload:t.payload}).id}}function UM(t,e){let r=t.getPromptDispatch(e);if(r===null)return{prompt_id:e,data:{status:"unknown"},errors_json:{error:"prompt_not_found"},duration_ms:null};let n=t.getJob(r.job_id);if(n===null)return{prompt_id:e,data:null,errors_json:{error:"job_missing",job_id:r.job_id},duration_ms:null};let s=n.run_id===null?null:t.getRun(n.run_id),o=t.getProject(r.project_id),i=GM(t,o?.team_id??null),a=XM(s),l=VM(n,a,i.length>0),c=KM(r.created_at,s),u=o===null?{totalEstimatedMs:void 0,perStep:new Map}:WM(t,o.workflow_name),d=u.totalEstimatedMs,f=hw(r.created_at),m=o?.workflow_name,p=u.perStep.size>0?u.perStep.size:void 0,_=s===null?[]:BM(t,s.id),g=HM(s,a,_,u.perStep,i),h=qM(_,u.perStep),b=JM(g,h,d,f,m,p);return l==="error"?{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,..._a(d,f),...b},errors_json:{error:n.last_error??"job_failed",job_id:n.id,run_id:s?.id??null},duration_ms:c}:l==="done"?(r.completed_at===null&&t.setPromptDispatchCompleted(e),{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,terminal_state:s?.terminal_state??null,text:r.text,..._a(d,f),...b},errors_json:null,duration_ms:c}):l==="paused"?{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,attempt_count:n.attempt_count,paused_step:a,attention_needed:i,..._a(d,f),...b},errors_json:null,duration_ms:c}:{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,attempt_count:n.attempt_count,..._a(d,f),...b},errors_json:null,duration_ms:c}}function WM(t,e){let r={totalEstimatedMs:void 0,perStep:new Map},n=t.getWorkflowByName(e);if(n===null)return r;let s;try{s=JSON.parse(n.definition)}catch{return r}if(s===null||typeof s!="object")return r;let o=s,i=typeof o.estimated_duration_ms=="number"&&Number.isFinite(o.estimated_duration_ms)&&o.estimated_duration_ms>=0?o.estimated_duration_ms:void 0,a=new Map;if(Array.isArray(o.steps))for(let l of o.steps){if(l===null||typeof l!="object")continue;let c=l;if(typeof c.id!="string"||c.id.length===0)continue;let u=typeof c.name=="string"&&c.name.length>0?c.name:c.id,d=typeof c.estimated_duration_ms=="number"&&Number.isFinite(c.estimated_duration_ms)&&c.estimated_duration_ms>=0?c.estimated_duration_ms:void 0;a.set(c.id,d===void 0?{name:u}:{name:u,estimated_duration_ms:d})}if(o.steps===void 0&&o.states!==null&&typeof o.states=="object")for(let[l,c]of Object.entries(o.states)){if(c===null||typeof c!="object")continue;let u=c,d=typeof u.estimated_duration_ms=="number"&&Number.isFinite(u.estimated_duration_ms)&&u.estimated_duration_ms>=0?u.estimated_duration_ms:void 0;a.set(l,d===void 0?{name:l}:{name:l,estimated_duration_ms:d})}return{totalEstimatedMs:i,perStep:a}}function BM(t,e){try{return t.listStepsForRun(e)}catch{return[]}}function HM(t,e,r,n,s){if(t===null||t.terminal_state!==null)return;let o=e!==null?e:t.current_state;if(o===null||o.length===0)return;let a=[...r].reverse().find(f=>f.state_name===o&&f.ended_at===null)?.started_at??t.paused_at??t.started_at,l=n.get(o),c=l?.name??o,u=hw(a),d={id:o,name:c,started_at:a,elapsed_ms:u};return l?.estimated_duration_ms!==void 0&&(d.estimated_duration_ms=l.estimated_duration_ms),s.length>0&&(d.attention_needed=s),d}function qM(t,e){let r=[];for(let n of t){if(n.ended_at===null)continue;let s=Date.parse(n.started_at),o=Date.parse(n.ended_at),i=Number.isFinite(s)&&Number.isFinite(o)?Math.max(0,o-s):0,a=e.get(n.state_name)?.name??n.state_name,l=n.outcome==="failed"?"failed":"done";r.push({id:n.state_name,name:a,duration_ms:i,status:l})}return r}function JM(t,e,r,n,s,o){let i={completed_steps:e,total_elapsed_ms:n};return t!==void 0&&(i.current_step=t),r!==void 0&&(i.total_estimated_ms=r),s!==void 0&&s.length>0&&(i.workflow_name=s),o!==void 0&&(i.total_steps=o),i}function hw(t){let e=Date.parse(t);return Number.isNaN(e)?0:Math.max(0,Date.now()-e)}function _a(t,e){return t===void 0?{elapsed_ms:e}:{elapsed_ms:e,estimated_duration_ms:t}}function XM(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 GM(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 VM(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 KM(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 YM(t,e){let r=Date.parse(t.last_active_at??""),n=Date.parse(e.last_active_at??""),s=(Number.isNaN(n)?0:n)-(Number.isNaN(r)?0:r);return s===0?t.name.localeCompare(e.name):s}var ga,Rn,AM,jn,ld,$M,_w=E(()=>{"use strict";ga="project:",Rn="web_project:",AM="prompt:",jn="default",ld="Default workspace",$M=new Date(0).toISOString()});import{Buffer as gw}from"node:buffer";function yw(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 ww(t){return QM[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 zM,ZM,wa,QM,ud=E(()=>{"use strict";zM=1e4,ZM=256*1024,wa=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=yw(e.pushWindowMs,process.env.LMCTL_TERMINAL_PUSH_WINDOW_MS,zM),this.pushByteCap=yw(e.pushByteCap,process.env.LMCTL_TERMINAL_PUSH_BYTE_CAP,ZM),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+=gw.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=${gw.byteLength(n,"utf8")}`)}catch(o){this.opts.log?.(`[dt-2] publish failed session=${e.session_id} reason=${r}: ${o instanceof Error?o.message:String(o)}`)}}async onPtyExit(e,r){if(e.closed)return;await this.flush(e,"pty_exit");let n=`\r
1824
+ `)}function pM(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function Ze(t){return typeof t=="string"?t:""}function hM(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 Zu(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function la(t,e){return Number(t.req.param(e))}var ca,Qu,rw=E(()=>{"use strict";Ds();Gt();Ou();ca=[{name:"info-qa",title:"Ask a Question",description:"Get a grounded answer from multiple researchers and one consolidator."},{name:"document-creation",title:"Create a Document",description:"Draft, review, and render a polished document with an interactive wizard."},{name:"newspaper",title:"Daily Newspaper",description:"Subscribe to recurring digests for topics you care about."}],Qu=ca.map(t=>t.name)});function gM(t){return t.replace(/^\/+/,"")}function nw(t){return typeof t=="string"&&t!==""&&!t.includes("/")&&!t.includes("\\")}function $n(t){if(t.mailboxKey!==void 0&&t.mailboxKey!==null&&t.mailboxKey!==""){let e=gM(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 nw(t.userId)&&nw(t.deviceId)?`${t.userId}/${t.deviceId}/`:`${_M}/${t.identityId}/`}function wM(t){return String(Math.max(0,Math.floor(t))).padStart(yM,"0")}function rd(t,e,r){return`${t}${e}${wM(r)}.json`}function ua(t,e){return`${t}${e}`}function da(t,e,r){let n=`${e}${r}`;if(!t.startsWith(n))return;let s=t.slice(n.length).match(/^(\d+)\.json$/);if(s===null)return;let o=Number(s[1]);return Number.isSafeInteger(o)?o:void 0}var _M,yM,fa=E(()=>{"use strict";_M="mailbox";yM=12});function er(t,e){let r=Math.floor(t),n="",s=r;for(let u=0;u<12;u++)n=ma[s&15]+n,s=Math.floor(s/16);let o=Math.floor(e()*4096)&4095,i="",a=o;for(let u=0;u<3;u++)i=ma[a&15]+i,a=a>>4;let l=ma[8|Math.floor(e()*4)&3],c="";for(let u=0;u<15;u++)c+=ma[Math.floor(e()*16)&15];return n.slice(0,8)+"-"+n.slice(8,12)+"-7"+i+"-"+l+c.slice(0,3)+"-"+c.slice(3,15)}var ma,pa=E(()=>{"use strict";ma="0123456789abcdef"});function sd(t,e){return!Number.isFinite(t)||t<=0?e:t}function od(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 lw(t){return t.conversation_id===aw&&bM(t.payload)}function bM(t){return typeof t=="object"&&t!==null&&t.kind==="heartbeat"}function SM(t){let e=typeof t.hb=="string"&&t.hb!==""?t.hb:lw(t)?t.timestamp:void 0;if(e===void 0)return;let r=Date.parse(e);return Number.isFinite(r)?r:void 0}var sw,ow,iw,EM,aw,TM,nd,Hr,ha=E(()=>{"use strict";fa();pa();sw=3e3,ow=1e4,iw=12e3,EM=1e3,aw="__lmctl_heartbeat__",TM={kind:"heartbeat"},nd={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=$n({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=sd(e.readIntervalMs??e.pollIntervalMs??sw,sw),this.heartbeatIdleMs=sd(e.heartbeatIdleMs??ow,ow),this.backoffReadIntervalMs=sd(e.backoffReadIntervalMs??e.pollIntervalMs??iw,iw)}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??nd;if(this.timerHandle!==null&&(e.clearTimeout(this.timerHandle),this.timerHandle=null),this.heartbeatTimerHandle!==null&&(e.clearTimeout(this.heartbeatTimerHandle),this.heartbeatTimerHandle=null),this.bootstrapInFlight!==null)try{await this.bootstrapInFlight}catch{}if(this.tickInFlight!==null)try{await this.tickInFlight}catch{}this.running=!1}async putMessage(e){return this.putEnvelope(e.conversation_id,e.payload)}getCursor(){return this.cursor}getMailboxBasePrefix(){return this.basePrefix}setPollIntervalMs(e){if(!Number.isFinite(e)||e<=0)throw new Error(`SequentialMailboxClient.setPollIntervalMs: invalid ms=${e}`);this.readIntervalMs=e}isPeerOn(){return this.peerIsOn((this.opts.now??Date.now)())}async bootstrapThenRun(){if(await this.ensureBootstrapped(),this.stopRequested){this.running=!1;return}this.runTick(),this.writeHeartbeat()}ensureBootstrapped(){return this.bootstrapped?Promise.resolve():(this.bootstrapPromise===null&&(this.bootstrapPromise=this.runColdStart()),this.bootstrapPromise)}async runColdStart(){try{let e=await this.maxSeq(this.ownStream);this.ownSeq=e,this.cursor===void 0&&(this.cursor=await this.maxSeq(this.peerStream)),this.bootstrapped=!0}catch(e){throw this.bootstrapPromise=null,this.emitError(e,"list"),e}}async maxSeq(e){let r=ua(this.basePrefix,e),n=0,s;do{let o=await this.opts.s3.send(new this.opts.commands.ListObjectsV2Command({Bucket:this.opts.bucket,Prefix:r,MaxKeys:EM,...s!==void 0&&{ContinuationToken:s}}));this.opts.onS3Op?.("list");for(let i of o.Contents??[]){let a=da(i.Key??"",this.basePrefix,e);a!==void 0&&a>n&&(n=a)}s=o.IsTruncated===!0?o.NextContinuationToken:void 0}while(s!==void 0);return n}async putEnvelope(e,r){let n=this.writeChain.then(()=>this.doPut(e,r));return this.writeChain=n.catch(()=>{}),n}async doPut(e,r){await this.ensureBootstrapped();let n=(this.opts.now??Date.now)(),s=new Date(n).toISOString(),o={message_id:er(n,this.opts.random??Math.random),from:this.opts.selfRole,timestamp:s,hb:s,conversation_id:e,payload:r},i=(this.ownSeq??0)+1,a=rd(this.basePrefix,this.ownStream,i);return await this.opts.s3.send(new this.opts.commands.PutObjectCommand({Bucket:this.opts.bucket,Key:a,Body:JSON.stringify(o),ContentType:"application/json"})),this.opts.onS3Op?.("put"),this.ownSeq=i,this.recordWrite(n),a}scheduleNextTick(e){if(this.stopRequested)return;let r=this.opts.timers??nd;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=rd(this.basePrefix,this.peerStream,e),n;try{let o=await this.opts.s3.send(new this.opts.commands.GetObjectCommand({Bucket:this.opts.bucket,Key:r}));if(this.opts.onS3Op?.("get"),o.Body===void 0){this.emitError(new Error(`GetObject ${r}: empty body`),"get"),this.advanceCursor(e);continue}n=await o.Body.transformToString("utf-8")}catch(o){if(od(o)){this.opts.onS3Op?.("get");return}this.emitError(o,"get");return}let s;try{s=JSON.parse(n)}catch(o){this.emitError(o,"get"),this.advanceCursor(e);continue}if(this.recordPeerHeartbeat(s),lw(s)){this.advanceCursor(e);continue}try{await this.opts.onMessage(s)}catch(o){this.emitError(o,"handle");return}this.advanceCursor(e)}}advanceCursor(e){this.cursor=e,this.notifyCursorAdvance(e)}nextReadDelayMs(){return this.peerIsOn((this.opts.now??Date.now)())?this.readIntervalMs:this.backoffReadIntervalMs}peerIsOn(e){return this.lastPeerHeartbeatMs!==void 0&&e-this.lastPeerHeartbeatMs<=this.heartbeatIdleMs}recordPeerHeartbeat(e){let r=SM(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??nd;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(aw,TM)}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 kM}from"@hono/node-server/conninfo";function cw(t,e){let r=e.bucket??vM,n=e.remoteAddressOf??(o=>NM(o)),s=o=>{let i=n(o);return xM(i)?null:o.json({error:"forbidden",message:"local-mailbox is loopback-only"},403)};t.get("/local-mailbox/object",async o=>{let i=s(o);if(i!==null)return i;let a=id(o.req.query("key"));if(typeof a!="string")return o.json({error:"bad_request",message:a.error},400);try{let l=await e.s3.send(new e.commands.GetObjectCommand({Bucket:r,Key:a}));if(l.Body===void 0)return o.json({error:"empty_body"},404);let c=await l.Body.transformToString("utf-8");return o.body(c,200,{"Content-Type":"application/octet-stream"})}catch(l){return od(l)?o.json({error:"not_found"},404):o.json({error:"internal",message:ad(l)},500)}}),t.put("/local-mailbox/object",async o=>{let i=s(o);if(i!==null)return i;let a=id(o.req.query("key"));if(typeof a!="string")return o.json({error:"bad_request",message:a.error},400);let l=new Uint8Array(await o.req.arrayBuffer());try{return await e.s3.send(new e.commands.PutObjectCommand({Bucket:r,Key:a,Body:l})),o.json({ok:!0})}catch(c){return o.json({error:"internal",message:ad(c)},500)}}),t.get("/local-mailbox/list",async o=>{let i=s(o);if(i!==null)return i;let a=o.req.query("prefix")??"",l=id(a,{allowEmpty:!0});if(typeof l!="string")return o.json({error:"bad_request",message:l.error},400);let c=IM(o.req.query("maxKeys")),u=o.req.query("token");try{let d=await e.s3.send(new e.commands.ListObjectsV2Command({Bucket:r,Prefix:l,...c!==void 0?{MaxKeys:c}:{},...u!==void 0&&u!==""?{ContinuationToken:u}:{}}));return o.json({Contents:(d.Contents??[]).map(f=>({Key:f.Key,LastModified:f.LastModified instanceof Date?f.LastModified.toISOString():f.LastModified})),IsTruncated:d.IsTruncated??!1,...d.NextContinuationToken!==void 0?{NextContinuationToken:d.NextContinuationToken}:{}})}catch(d){return o.json({error:"internal",message:ad(d)},500)}})}function id(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 IM(t){if(t===void 0||t==="")return;let e=Number(t);return Number.isInteger(e)&&e>0?e:void 0}function NM(t){try{return kM(t).remote.address}catch{return}}function xM(t){return t===void 0||t===""?!1:!!(t==="127.0.0.1"||t==="::1"||t.startsWith("::ffff:127.")||t.startsWith("127."))}function ad(t){return t instanceof Error?t.message:String(t)}var vM,uw=E(()=>{"use strict";ha();vM="local"});function dw(t,e){t.get("/mailbox/workspace",r=>RM(r,e)),t.get("/mailbox/projects",r=>jM(r,e)),t.get("/mailbox/projects/:id",r=>OM(r,e)),t.post("/mailbox/projects",r=>LM(r,e)),t.patch("/mailbox/projects/:id",r=>CM(r,e)),t.delete("/mailbox/projects/:id",r=>MM(r,e)),t.post("/mailbox/projects/:project_id/prompts",r=>DM(r,e)),t.get("/mailbox/prompts/:id",r=>PM(r,e))}function RM(t,e){e.dal.ensureWorkspace({id:jn,name:ld});let r=fw(e.dal),n={id:jn,name:ld,created_at:$M,projects:r};return t.json({workspace:n})}function jM(t,e){return t.json({projects:fw(e.dal)})}function OM(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(Rn)){let s=cd(e.dal,r);return s===null||s.deleted_at!==null?t.json({project:null},404):t.json({project:ya(s)})}let n=pw(e.dal,r);return n===null?t.json({project:null},404):t.json({project:mw(n)})}async function LM(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:jn,name:ld});let s=e.dal.insertWebProject({workspace_id:jn,name:n.name,repo_path:n.repo_path,config_json:n.config_json===void 0?null:JSON.stringify(n.config_json)});return t.json({project:ya(s)},201)}async function CM(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(Rn)){let o=cd(e.dal,r);if(o===null||o.deleted_at!==null)return t.json({error:"project_not_found",message:`project not found: ${r}`},404);let i=e.dal.updateWebProject({id:o.id,name:s.name===void 0?void 0:s.name,config_json:s.config_json===void 0?void 0:JSON.stringify(s.config_json)});return i===null?t.json({error:"project_not_found",message:`project not found: ${r}`},404):t.json({project:ya(i)})}return t.json({error:"project_not_found",message:`project not found: ${r}`},404)}function MM(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(Rn)){let n=cd(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 DM(t,e){let r=t.req.param("project_id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"project_id required in path"},400);let n;try{n=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.input;if(s===void 0||typeof s!="object")return t.json({error:"bad_request",message:"input is required"},400);let o=s.project_id??r;if(typeof s.text!="string"||s.text==="")return t.json({error:"bad_request",message:"input.text is required"},400);let i=pw(e.dal,o);if(i===null)return t.json({error:"project_not_found",message:`project not found: ${o}`},404);if(e.dal.getWorkflowByName(i.workflow_name)===null)return t.json({error:"workflow_not_registered",message:`project ${i.name} has no registered workflow "${i.workflow_name}"`},400);let l=`${AM}${crypto.randomUUID()}`,c={text:s.text,context_json:s.context_json??null},u;e.enqueueProjectJob!==void 0?u=e.enqueueProjectJob({dal:e.dal,project_id:i.id,source_ref:l,payload:c}):u=await FM({dal:e.dal,project_id:i.id,source_ref:l,payload:c}),e.dal.insertPromptDispatch({prompt_id:l,project_id:i.id,job_id:u.id,text:s.text,context_json:s.context_json===void 0?null:JSON.stringify(s.context_json)});let d={id:l,project_id:`${ga}${i.id}`,text:s.text,status:"pending",created_at:new Date().toISOString(),completed_at:null};return t.json({prompt:d},201)}function PM(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=UM(e.dal,r);return t.json({result:n})}function fw(t){let e=t.listProjects().map(mw),r=t.listWebProjectsActive(jn).map(ya);return[...e,...r].sort(YM)}function mw(t){return{id:`${ga}${t.id}`,workspace_id:jn,name:t.name,repo_path:t.local_path,config_json:{workflow_name:t.workflow_name,team_id:t.team_id,durable_memory_mode:t.durable_memory_mode},last_active_at:null,created_at:t.created_at}}function ya(t){let e={};if(t.config_json!==null)try{let r=JSON.parse(t.config_json);r!==null&&typeof r=="object"&&(e=r)}catch{}return t.linked_v4_project_id!==null&&(e={...e,linked_v4_project_id:t.linked_v4_project_id}),{id:`${Rn}${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 cd(t,e){if(!e.startsWith(Rn))return null;let r=e.slice(Rn.length),n=Number.parseInt(r,10);return!Number.isFinite(n)||String(n)!==r?null:t.getWebProject(n)}function pw(t,e){if(e.startsWith(ga)){let n=e.slice(ga.length),s=Number.parseInt(n,10);if(Number.isFinite(s)&&String(s)===n)return t.getProject(s)}let r=Number.parseInt(e,10);return Number.isFinite(r)&&String(r)===e?t.getProject(r):null}async function FM(t){let{enqueueManual:e}=await Promise.resolve().then(()=>(Tu(),W_));return{id:e(t.dal,{project_id:t.project_id,source_ref:t.source_ref,payload:t.payload}).id}}function UM(t,e){let r=t.getPromptDispatch(e);if(r===null)return{prompt_id:e,data:{status:"unknown"},errors_json:{error:"prompt_not_found"},duration_ms:null};let n=t.getJob(r.job_id);if(n===null)return{prompt_id:e,data:null,errors_json:{error:"job_missing",job_id:r.job_id},duration_ms:null};let s=n.run_id===null?null:t.getRun(n.run_id),o=t.getProject(r.project_id),i=GM(t,o?.team_id??null),a=XM(s),l=VM(n,a,i.length>0),c=KM(r.created_at,s),u=o===null?{totalEstimatedMs:void 0,perStep:new Map}:WM(t,o.workflow_name),d=u.totalEstimatedMs,f=hw(r.created_at),m=o?.workflow_name,p=u.perStep.size>0?u.perStep.size:void 0,h=s===null?[]:BM(t,s.id),g=HM(s,a,h,u.perStep,i),_=qM(h,u.perStep),b=JM(g,_,d,f,m,p);return l==="error"?{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,..._a(d,f),...b},errors_json:{error:n.last_error??"job_failed",job_id:n.id,run_id:s?.id??null},duration_ms:c}:l==="done"?(r.completed_at===null&&t.setPromptDispatchCompleted(e),{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,terminal_state:s?.terminal_state??null,text:r.text,..._a(d,f),...b},errors_json:null,duration_ms:c}):l==="paused"?{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,attempt_count:n.attempt_count,paused_step:a,attention_needed:i,..._a(d,f),...b},errors_json:null,duration_ms:c}:{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,attempt_count:n.attempt_count,..._a(d,f),...b},errors_json:null,duration_ms:c}}function WM(t,e){let r={totalEstimatedMs:void 0,perStep:new Map},n=t.getWorkflowByName(e);if(n===null)return r;let s;try{s=JSON.parse(n.definition)}catch{return r}if(s===null||typeof s!="object")return r;let o=s,i=typeof o.estimated_duration_ms=="number"&&Number.isFinite(o.estimated_duration_ms)&&o.estimated_duration_ms>=0?o.estimated_duration_ms:void 0,a=new Map;if(Array.isArray(o.steps))for(let l of o.steps){if(l===null||typeof l!="object")continue;let c=l;if(typeof c.id!="string"||c.id.length===0)continue;let u=typeof c.name=="string"&&c.name.length>0?c.name:c.id,d=typeof c.estimated_duration_ms=="number"&&Number.isFinite(c.estimated_duration_ms)&&c.estimated_duration_ms>=0?c.estimated_duration_ms:void 0;a.set(c.id,d===void 0?{name:u}:{name:u,estimated_duration_ms:d})}if(o.steps===void 0&&o.states!==null&&typeof o.states=="object")for(let[l,c]of Object.entries(o.states)){if(c===null||typeof c!="object")continue;let u=c,d=typeof u.estimated_duration_ms=="number"&&Number.isFinite(u.estimated_duration_ms)&&u.estimated_duration_ms>=0?u.estimated_duration_ms:void 0;a.set(l,d===void 0?{name:l}:{name:l,estimated_duration_ms:d})}return{totalEstimatedMs:i,perStep:a}}function BM(t,e){try{return t.listStepsForRun(e)}catch{return[]}}function HM(t,e,r,n,s){if(t===null||t.terminal_state!==null)return;let o=e!==null?e:t.current_state;if(o===null||o.length===0)return;let a=[...r].reverse().find(f=>f.state_name===o&&f.ended_at===null)?.started_at??t.paused_at??t.started_at,l=n.get(o),c=l?.name??o,u=hw(a),d={id:o,name:c,started_at:a,elapsed_ms:u};return l?.estimated_duration_ms!==void 0&&(d.estimated_duration_ms=l.estimated_duration_ms),s.length>0&&(d.attention_needed=s),d}function qM(t,e){let r=[];for(let n of t){if(n.ended_at===null)continue;let s=Date.parse(n.started_at),o=Date.parse(n.ended_at),i=Number.isFinite(s)&&Number.isFinite(o)?Math.max(0,o-s):0,a=e.get(n.state_name)?.name??n.state_name,l=n.outcome==="failed"?"failed":"done";r.push({id:n.state_name,name:a,duration_ms:i,status:l})}return r}function JM(t,e,r,n,s,o){let i={completed_steps:e,total_elapsed_ms:n};return t!==void 0&&(i.current_step=t),r!==void 0&&(i.total_estimated_ms=r),s!==void 0&&s.length>0&&(i.workflow_name=s),o!==void 0&&(i.total_steps=o),i}function hw(t){let e=Date.parse(t);return Number.isNaN(e)?0:Math.max(0,Date.now()-e)}function _a(t,e){return t===void 0?{elapsed_ms:e}:{elapsed_ms:e,estimated_duration_ms:t}}function XM(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 GM(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 VM(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 KM(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 YM(t,e){let r=Date.parse(t.last_active_at??""),n=Date.parse(e.last_active_at??""),s=(Number.isNaN(n)?0:n)-(Number.isNaN(r)?0:r);return s===0?t.name.localeCompare(e.name):s}var ga,Rn,AM,jn,ld,$M,_w=E(()=>{"use strict";ga="project:",Rn="web_project:",AM="prompt:",jn="default",ld="Default workspace",$M=new Date(0).toISOString()});import{Buffer as gw}from"node:buffer";function yw(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 ww(t){return QM[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 zM,ZM,wa,QM,ud=E(()=>{"use strict";zM=1e4,ZM=256*1024,wa=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=yw(e.pushWindowMs,process.env.LMCTL_TERMINAL_PUSH_WINDOW_MS,zM),this.pushByteCap=yw(e.pushByteCap,process.env.LMCTL_TERMINAL_PUSH_BYTE_CAP,ZM),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+=gw.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=${gw.byteLength(n,"utf8")}`)}catch(o){this.opts.log?.(`[dt-2] publish failed session=${e.session_id} reason=${r}: ${o instanceof Error?o.message:String(o)}`)}}async onPtyExit(e,r){if(e.closed)return;await this.flush(e,"pty_exit");let n=`\r
1826
1825
  [process exited with code ${r.exitCode}${r.signal!==void 0?` signal ${r.signal}`:""}]\r
1827
1826
  `,s={kind:"terminal",session_id:e.session_id,direction:"agent_to_user",data:n,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s)}catch(o){this.opts.log?.(`[dt-2] publish (exit) failed session=${e.session_id}: ${o instanceof Error?o.message:String(o)}`)}e.closed=!0,this.sessions.delete(e.session_id)}};QM={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 bw(t,e){t.post("/mailbox/terminal/launch",r=>eD(r,e)),t.post("/mailbox/terminal/end/:session_id",r=>tD(r,e)),t.get("/mailbox/terminal/sessions",r=>rD(r,e))}async function eD(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 o=n.provider;if(typeof o!="string"||o==="")return t.json({error:"bad_request",message:"provider is required"},400);let i;if(typeof n.command_line=="string"&&n.command_line.trim()!==""){if(i=Ew(n.command_line),i===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=ww(o);if(a===void 0)return t.json({error:"no_default_for_provider",message:`no TERMINAL_LAUNCH_DEFAULTS entry for provider "${o}"`},400);i={cmd:a.cmd,args:[...a.args]}}try{let{pid:a}=r.startSession({session_id:s,command:i.cmd,args:i.args,...typeof n.cwd=="string"&&n.cwd!==""?{cwd:n.cwd}:{}});return t.json({session_id:s,pid:a,command:i.cmd,args:i.args},201)}catch(a){let l=a instanceof Error?a.message:String(a);return l.startsWith("terminal_session_already_exists")?t.json({error:"session_exists",message:l},409):t.json({error:"spawn_failed",message:l},500)}}function tD(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 rD(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,Sw=E(()=>{"use strict";ud();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 nD}from"node:buffer";function iD(t){try{return nD.byteLength(JSON.stringify(t),"utf8")}catch{return 256}}function kw(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 vw(t){return aD[t]}function Iw(t){let e=t.trim();if(e==="")return;let r=[],n=0;for(;n<e.length;){let o=e[n];if(o===" "||o===" "){n+=1;continue}if(o==='"'){let a=n+1,l="";for(;a<e.length&&e[a]!=='"';)l+=e[a],a+=1;r.push(l),n=a+1;continue}let i=n;for(;i<e.length&&e[i]!==" "&&e[i]!==" ";)i+=1;r.push(e.slice(n,i)),n=i}if(r.length===0)return;let s=r.shift();if(!(s===void 0||s===""))return{cmd:s,args:r}}var sD,oD,Ea,aD,dd=E(()=>{"use strict";sD=2e3,oD=64*1024,Ea=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=kw(e.pushWindowMs,process.env.LMCTL_PROVIDER_PUSH_WINDOW_MS,sD),this.pushByteCap=kw(e.pushByteCap,process.env.LMCTL_PROVIDER_PUSH_BYTE_CAP,oD),this.timers=e.timers??{setTimeout:(r,n)=>globalThis.setTimeout(r,n),clearTimeout:r=>globalThis.clearTimeout(r)}}async startSession(e){if(this.sessions.has(e.session_id))throw new Error(`persistent_session_already_exists: ${e.session_id}`);let r=this.opts.adapterFactory(e.provider),n={session_id:e.session_id,provider:e.provider,adapter:r,child:void 0,pendingEvents:[],pendingBytes:0,pushTimer:void 0,generation:1,turnMap:new Map,closed:!1};this.sessions.set(e.session_id,n);let s=this.makeAdapterContext(n);try{let o=await r.start(e,s);return n.child=o,this.wireChildExit(n,o),this.opts.log?.(`[dt-3] persistent session ${e.session_id} started provider=${e.provider} pid=${o.pid??"?"}`),{pid:o.pid}}catch(o){throw this.sessions.delete(e.session_id),o}}async endSession(e){let r=this.sessions.get(e);if(r!==void 0){r.generation+=1;try{await r.adapter.stop()}catch{}if(r.child!==void 0)try{r.child.kill("SIGTERM")}catch{}await this.flush(r,"session_end"),r.closed=!0,this.sessions.delete(e)}}async onInbound(e){if(e.direction!=="user_to_agent")return;let r=this.sessions.get(e.session_id);if(r===void 0){this.opts.log?.(`[dt-3] inbound provider data for unknown session ${e.session_id}; dropping`);return}if(r.closed){this.opts.log?.(`[dt-3] inbound provider data for closed session ${e.session_id}; dropping`);return}let n=e.user_input??"";if(n!=="")try{await r.adapter.sendTurn(n)}catch(s){let o=s instanceof Error?s.message:String(s);this.opts.log?.(`[dt-3] adapter.sendTurn failed session=${e.session_id}: ${o}`),this.appendEvent(r,{event_type:"error",payload:{message:`sendTurn failed: ${o}`}})}}setPublish(e){this.opts={...this.opts,publish:e}}listSessions(){return Array.from(this.sessions.values()).map(e=>({session_id:e.session_id,provider:e.provider,pid:e.child?.pid}))}pendingEventCountFor(e){return this.sessions.get(e)?.pendingEvents.length}generationFor(e){return this.sessions.get(e)?.generation}_testBumpGeneration(e){let r=this.sessions.get(e);r!==void 0&&(r.generation+=1)}async stop(){for(let e of Array.from(this.sessions.values())){e.generation+=1;try{await e.adapter.stop()}catch{}if(e.child!==void 0)try{e.child.kill("SIGTERM")}catch{}}for(let e of Array.from(this.sessions.values()))e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0)}makeAdapterContext(e){let r=e.generation,n=this;return{generation:r,currentGeneration(){return e.generation},emit(s){r===e.generation&&(e.closed||n.appendEvent(e,s))},...n.opts.log!==void 0?{log:n.opts.log}:{},turnMap:e.turnMap}}appendEvent(e,r){e.pendingEvents.push(r);let n=iD(r);if(e.pendingBytes+=n,e.pendingBytes>=this.pushByteCap){this.flush(e,"byte_cap");return}e.pushTimer===void 0&&(e.pushTimer=this.timers.setTimeout(()=>{this.flush(e,"window_idle")},this.pushWindowMs))}async flush(e,r){if(e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0),e.pendingEvents.length===0)return;let n=e.pendingEvents;e.pendingEvents=[],e.pendingBytes=0;let s={kind:"provider",session_id:e.session_id,direction:"agent_to_user",events:n,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s),this.opts.log?.(`[dt-3] flushed session=${e.session_id} reason=${r} events=${n.length}`)}catch(o){this.opts.log?.(`[dt-3] publish failed session=${e.session_id} reason=${r}: ${o instanceof Error?o.message:String(o)}`)}}wireChildExit(e,r){let n=e.generation;r.on("exit",(s,o)=>{n===e.generation&&(e.closed||(this.appendEvent(e,{event_type:"error",payload:{message:`provider child exited code=${s??"?"} signal=${o??""}; session ended. Click Reset to start a new chat.`}}),this.flush(e,"child_exit"),e.closed=!0))}),r.on("error",s=>{n===e.generation&&(e.closed||(this.appendEvent(e,{event_type:"error",payload:{message:`provider child error: ${s.message}`}}),this.flush(e,"child_exit")))})}};aD={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 xw(t,e){t.post("/mailbox/chat/launch",r=>lD(r,e)),t.post("/mailbox/chat/end/:session_id",r=>cD(r,e)),t.get("/mailbox/chat/sessions",r=>uD(r,e))}async function lD(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"||!Nw.test(s))return t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400);let o=n.provider;if(typeof o!="string"||o==="")return t.json({error:"bad_request",message:"provider is required"},400);let i;if(typeof n.command_line=="string"&&n.command_line.trim()!==""){if(i=Iw(n.command_line),i===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=vw(o);if(a===void 0)return t.json({error:"no_default_for_provider",message:`no PERSISTENT_LAUNCH_DEFAULTS entry for provider "${o}"`},400);i={cmd:a.cmd,args:[...a.args]}}try{let{pid:a}=await r.startSession({session_id:s,provider:o,command:i.cmd,args:i.args,...typeof n.cwd=="string"&&n.cwd!==""?{cwd:n.cwd}:{}});return t.json({session_id:s,provider:o,pid:a,command:i.cmd,args:i.args},201)}catch(a){let l=a instanceof Error?a.message:String(a);return l.startsWith("persistent_session_already_exists")?t.json({error:"session_exists",message:l},409):l.startsWith("no_persistent_adapter_for_provider")?t.json({error:"no_adapter",message:l},400):t.json({error:"spawn_failed",message:l},500)}}async function cD(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||!Nw.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 uD(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 Nw,Aw=E(()=>{"use strict";dd();Nw=/^[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 dD}from"node:fs";function Rw(t){let e=t.artifacts.find(r=>r.kind===`${t.state_name}_transcript`);if(e?.content!==void 0&&e.content!==null)return $w(e.content);if(e?.path===void 0||e.path===null)return[];try{let r=dD(e.path,{encoding:"utf8"});return $w(r)}catch{return[]}}function $w(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 jw=E(()=>{"use strict"});function Ow(t,e,r){let n=t.getRun(e);if(n===null)return{err:`run ${e}: not found`};if(r!==void 0){let l=t.findTeamMemberByAlias(n.team_id,r);return l===null?{err:`run ${e}: team has no member alias "${r}"`}:l.sessionid===null||l.sessionid.length===0?{err:`run ${e}: member "${l.alias}" has no sessionid yet (seed first)`}:{ok:{provider:l.provider,sessionid:l.sessionid,sessiondir:l.sessiondir,alias:l.alias,...l.model!==null&&l.model!==void 0?{model:l.model}:{}}}}let s=t.latestAgentCall(e);if(s!==null){let l=t.findTeamMemberByAlias(n.team_id,s.alias);return l===null?{err:`run ${e}: team has no member alias "${s.alias}" (latest agent_call references a member that has been removed)`}:l.sessionid===null||l.sessionid.length===0?{err:`run ${e}: member "${l.alias}" has no sessionid yet (seed first)`}:{ok:{provider:l.provider,sessionid:l.sessionid,sessiondir:l.sessiondir,alias:l.alias,...l.model!==null&&l.model!==void 0?{model:l.model}:{}}}}let i=t.listTeamMembers(n.team_id).filter(l=>l.state!=="retired"&&l.sessionid!==null&&l.sessionid.length>0);if(i.length===0)return{err:`run ${e}: cannot resolve an agent session (no agent_call yet, no seeded member)`};if(i.length>1){let l=i.map(c=>c.alias).join(", ");return{err:`run ${e}: cannot resolve an agent session (no agent_call yet; team has multiple members [${l}] \u2014 pass --alias)`}}let a=i[0];return{ok:{provider:a.provider,sessionid:a.sessionid,sessiondir:a.sessiondir,alias:a.alias,...a.model!==null&&a.model!==void 0?{model:a.model}:{}}}}function Ta(t,e){let r=t.query(`SELECT id, kind FROM attention
1828
1827
  WHERE run_id = ?
1829
1828
  AND acknowledged_at IS NULL
1830
1829
  AND requires_user = 1
1831
- ORDER BY id DESC LIMIT 1`,e);return r.length===0?null:{kind:r[0].kind,attention_id:r[0].id}}var ba=E(()=>{"use strict"});function Hw(t,e){t.all("/runtime/*",r=>fD(r.req.raw,e))}async function fD(t,e){try{return Response.json(await mD(t,e))}catch(r){if(r instanceof ie)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 mD(t,e){let r=new URL(t.url),n=ED(e),s=r.pathname.split("/").filter(Boolean).map(decodeURIComponent);if(t.method==="GET"&&r.pathname==="/runtime/workspaces")return fd(t),[{id:n.id,name:n.name}];if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="workspaces")return Sa(t,n.id,s[2]),pD(e.dal,n);if(t.method==="GET"&&s.length===5&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"){Sa(t,n.id,s[2]);let o=Cw(e.dal,s[4]);return Lw(e.dal,n,o)}if(t.method==="GET"&&r.pathname==="/runtime/lead-teams")return fd(t),e.dal.listTeams().map(o=>wD(o));if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="chat"){let o=Mw(e.dal,Dw(s[2])),i=await t.json();if(i.teamId!==`team:${o.name}`)throw new ie(400,"runtime lead chat body does not match route team");return Fw(t,n.id,i.context),Pw(o,i.context)}if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="messages"){let o=Mw(e.dal,Dw(s[2])),i=await t.json();if(i.teamId!==`team:${o.name}`)throw new ie(400,"runtime lead message body does not match route team");Fw(t,n.id,i.context);let a=i.draft?.body;if(typeof a!="string"||a.length===0)throw new ie(400,"runtime lead message requires draft.body");return Pw(o,i.context,a)}if(t.method==="POST"&&s.length===6&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"&&s[5]==="workflow-message"){Sa(t,n.id,s[2]);let o=Cw(e.dal,s[4]),i=await t.json();if(i.workspaceId!==n.id||i.projectId!==o.name)throw new ie(400,"runtime request body does not match route workspace/project");let a=i.draft?.body;if(typeof a!="string"||a.length===0)throw new ie(400,"runtime workflow message requires draft.body");return gD(e.dal,o,a),Lw(e.dal,n,o)}if(t.method==="GET"&&r.pathname==="/runtime/templates")return Ps(t,n.id),e.dal.listWorkflows().map(o=>TD(o));if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="templates"){Ps(t,n.id);let o=SD(e.dal,s[2]);return bD(o)}if(t.method==="GET"&&r.pathname==="/runtime/runs"){Ps(t,n.id);let o=r.searchParams.get("project"),i=r.searchParams.get("template");if(o!==null&&i!==null)throw new ie(400,"conflicting_filters: ?project= and ?template= are mutually exclusive");return kD(e.dal,o,i).map(l=>Ww(e.dal,l))}if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="runs"){Ps(t,n.id);let o=Uw(e.dal,s[2]);return Ww(e.dal,o)}if(t.method==="GET"&&s.length===4&&s[0]==="runtime"&&s[1]==="runs"&&s[3]==="events"){Ps(t,n.id);let o=Uw(e.dal,s[2]),i=ID(e.dal,o);return{runId:gd(o),events:i,...i.length>0?{cursor:i[i.length-1].id}:{}}}throw new ie(404,`unknown runtime request: ${t.method} ${r.pathname}`)}function pD(t,e){return{id:e.id,name:e.name,projects:t.listProjects().map(r=>qw(t,e,r))}}function Lw(t,e,r){let n=qw(t,e,r);return{...n,managedWorkflow:{...n.managedWorkflow,instance:hD(t,r),composerTarget:{kind:"workflow-initial",label:`Project Workflow: ${r.workflow_name}`,templateId:`template:${r.workflow_name}`,runId:n.managedWorkflow.runId}},workflowMessages:_D(t,r)}}function qw(t,e,r){let n=Jw(t,r.id),s=pd(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 hD(t,e){let r=Jw(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:pd(r),currentStepIds:n===null?[]:[n],...r?.started_at===void 0?{}:{createdAt:r.started_at},...r?.ended_at===null||r?.ended_at===void 0?{}:{updatedAt:r.ended_at}}}function _D(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 gD(t,e,r){let n=yD(t,e.id);if(n!==null){let s=Ta(t,n.id);if(s?.kind==="workflow_escalation"){let o=t.resumeEscalation(s.attention_id,r);if(!o.resumed)throw new ie(409,`workflow escalation resume failed: ${o.reason}`);return}if(s?.kind==="interactive_waiting_operator"){let o=Nt(t,s.attention_id);if(o?.step_id===null||o?.step_id===void 0)throw new ie(409,"interactive resume failed: missing step");let i=t.resumeInteractive(o.step_id,r,!0);if(!i.resumed)throw new ie(409,`interactive resume failed: ${i.reason}`);return}}t.enqueueJob({project_id:e.id,source:"runtime-workflow-message",payload:JSON.stringify({prompt:r}),priority:0})}function Jw(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 yD(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 pd(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 Cw(t,e){let r=t.findProjectByName(e);if(r===null)throw new ie(404,`project not found: ${e}`);return r}function Mw(t,e){let r=t.listTeams().find(n=>n.name===e);if(r===void 0)throw new ie(404,`team not found: ${e}`);return r}function Dw(t){return t.startsWith("team:")?t.slice(5):t}function wD(t){return{id:`team:${t.name}`,name:t.name,teamfile:"",hasLead:!0,kind:t.name.toLowerCase().includes("manager")?"global-manager":"custom-ai-led"}}function Pw(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??Bw}`,teamId:`team:${t.name}`,title:`${t.name} Lead`,messages:s,...e===void 0?{}:{context:e}}}function ED(t){let e=t.workspaceName??Xn()??Nr.default;return{id:e,name:e}}function fd(t){if(t.headers.get("x-lmctl-workspace-id")!==Bw)throw new ie(400,"runtime request requires global-admin workspace identity")}function Sa(t,e,r){let n=t.headers.get("x-lmctl-workspace-id");if(n===null)throw new ie(400,"runtime request requires workspace identity");if(r!==e||n!==e)throw new ie(400,"runtime workspace identity does not match route")}function Ps(t,e){let r=t.headers.get("x-lmctl-workspace-id");if(r===null)throw new ie(400,"runtime request requires workspace identity");if(r!==e)throw new ie(400,"runtime workspace identity does not match server workspace")}function Fw(t,e,r){if(r?.scope==="workspace"){if(r.workspaceId===void 0)throw new ie(400,"workspace manager context requires workspace identity");Sa(t,e,r.workspaceId);return}fd(t)}function hd(t){return`${On}${_d(t.name)}`}function _d(t){return t.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"item"}function gd(t){return`${md}${t.id}`}function TD(t){let e=ka(t.definition);return{id:hd(t),name:t.name,...e.description===null?{}:{description:e.description}}}function bD(t){let e=ka(t.definition);return{id:hd(t),name:t.name,...e.description===null?{}:{description:e.description},graph:e.graph}}function ka(t){let e;try{e=JSON.parse(t)}catch{return{description:null,graph:null,stepIds:[],nameToId:new Map}}if(e===null||typeof e!="object")return{description:null,graph:e,stepIds:[],nameToId:new Map};let r=e,n=typeof r.description=="string"?r.description:null,s=[],o=new Map;if(r.schema_version==="lmctl/v3"&&Array.isArray(r.steps)){let i=typeof r.entry_step_id=="string"?r.entry_step_id:null;for(let a of r.steps){let l=typeof a.id=="string"?a.id:null;l!==null&&(s.push(l),typeof a.name=="string"&&a.name.length>0&&o.set(a.name,l))}i!==null&&s.includes(i)&&s.sort((a,l)=>a===i?-1:l===i?1:0)}return{description:n,graph:e,stepIds:s,nameToId:o}}function SD(t,e){if(!e.startsWith(On))throw new ie(404,`template not found: ${e}`);let r=e.slice(On.length),n=t.listWorkflows().filter(s=>_d(s.name)===r);if(n.length===0)throw new ie(404,`template not found: ${e}`);if(n.length>1){let s=n.map(o=>o.name).join(", ");throw new ie(409,`template_id_ambiguous: ${e} matches multiple workflow names [${s}]; rename to ensure unique slugs`)}return n[0]}function Uw(t,e){if(!e.startsWith(md))throw new ie(404,`run not found: ${e}`);let r=e.slice(md.length);if(!/^[1-9]\d*$/.test(r))throw new ie(404,`run not found: ${e}`);let n=Number.parseInt(r,10);if(!Number.isFinite(n)||n<=0||String(n)!==r)throw new ie(404,`run not found: ${e}`);let s=t.getRun(n);if(s===null)throw new ie(404,`run not found: ${e}`);return s}function kD(t,e,r){if(r!==null){if(!r.startsWith(On))return[];let s=r.slice(On.length),o=t.listWorkflows().filter(a=>_d(a.name)===s).map(a=>a.id);if(o.length===0)return[];let i=o.map(()=>"?").join(", ");return t.query(`SELECT * FROM run WHERE workflow_id IN (${i}) ORDER BY id DESC LIMIT 200`,...o)}if(e===null)return t.query("SELECT * FROM run ORDER BY id DESC LIMIT 200");let n=t.findProjectByName(e);return n===null?[]:t.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? ORDER BY r.id DESC LIMIT 200",n.id)}function Ww(t,e){let r=t.getWorkflow(e.workflow_id),n=pd(e),s=vD(r,e);return{id:gd(e),templateId:r===null?`${On}unknown`:hd(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 vD(t,e){if(e.current_state===null)return[];let r=e.current_state.startsWith("__paused__:")?e.current_state.slice(11):e.current_state;return t===null?[r]:[ka(t.definition).nameToId.get(r)??r]}function ID(t,e){let r=t.getWorkflow(e.workflow_id),n=r===null?{stepIds:[],nameToId:new Map}:ka(r.definition),s=c=>n.nameToId.get(c)??c,o=gd(e),i=[];i.push({timestamp:e.started_at,type:"run.started",message:"Run started"});let a=t.listStepsForRun(e.id);for(let c of a){let u=s(c.state_name);if(i.push({timestamp:c.started_at,type:"step.started",stepId:u,message:`step ${c.state_name} started`}),c.ended_at!==null){let d=ND(c);i.push({timestamp:c.ended_at,type:d,stepId:u,...c.outcome===null?{}:{message:c.outcome},...c.status_detail===null?{}:{payload:{status_detail:c.status_detail}}})}else e.paused_at!==null&&c.id===a[a.length-1]?.id&&i.push({timestamp:e.paused_at,type:"step.paused",stepId:u})}let l=t.listSessionEvents(e.id);for(let c of l){let u=c.step_id===null?void 0:(()=>{let m=a.find(p=>p.id===c.step_id);return m===void 0?void 0:s(m.state_name)})(),d=new Date(c.timestamp_ms).toISOString(),f={kind:c.kind,session_event_id:c.id};if(c.payload.length>0)try{let m=JSON.parse(c.payload);m!==null&&typeof m=="object"&&!Array.isArray(m)&&(f={...f,...m})}catch{}i.push({timestamp:d,type:"message",...u===void 0?{}:{stepId:u},payload:f})}if(e.terminal_state!==null){let c=e.terminal_state==="done"||e.terminal_state==="success"?"run.completed":e.terminal_state==="cancelled"||e.terminal_state==="aborted"?"run.cancelled":"run.failed";i.push({timestamp:e.ended_at??e.started_at,type:c,message:e.terminal_state})}return i.sort((c,u)=>c.timestamp.localeCompare(u.timestamp)),i.map((c,u)=>({id:`${o}:evt:${u+1}`,runId:o,sequence:u+1,timestamp:c.timestamp,type:c.type,...c.stepId===void 0?{}:{stepId:c.stepId},...c.message===void 0?{}:{message:c.message},...c.payload===void 0?{}:{payload:c.payload}}))}function ND(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 Bw,On,md,ie,Xw=E(()=>{"use strict";Ge();ba();Gt();Bw="global-admin";On="template:",md="run:";ie=class extends Error{status;constructor(e,r){super(r),this.status=e}}});import{mkdirSync as xD,writeFileSync as AD}from"node:fs";import{randomUUID as Gw}from"node:crypto";import{dirname as $D,resolve as va,sep as Vw}from"node:path";async function Yw(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(!CD(n))return t.text("missing image file",400);if(n.size>RD)return t.text("upload too large",413);let s=Buffer.from(await n.arrayBuffer()),o=MD(s);if(o===null||!(o in Kw))return t.text("unsupported upload MIME type",415);if(n.type.length>0&&n.type!==o)return t.text("upload MIME type does not match file content",415);let i=jD(e,r.project);if(typeof i=="string")return t.text(i,404);let a=i===null?va(LD()):va(i.local_path),l=va(a,"uploads",Gw()),c=va(l,`${Gw()}${Kw[o]}`);if(!OD(c,a))return t.text("invalid upload path",400);xD(l,{recursive:!0});let u=new Uint8Array(s.buffer,s.byteOffset,s.byteLength);AD(c,u);let d={path:c,size:s.byteLength,mime:o,project:i?.name??null};return t.json(d)}function jD(t,e){return e==null||e===""?null:typeof e!="string"?"invalid project":t.findProjectByName(e)??`project not found: ${e}`}function OD(t,e){let r=e.endsWith(Vw)?e:`${e}${Vw}`;return t.startsWith(r)}function LD(){return $D(le())}function CD(t){return typeof File<"u"&&t instanceof File}function MD(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 RD,Kw,zw=E(()=>{"use strict";Ge();RD=10*1024*1024,Kw={"image/png":".png","image/jpeg":".jpg","image/webp":".webp","image/heic":".heic","application/pdf":".pdf"}});import{existsSync as Ia}from"node:fs";import{basename as DD,dirname as PD,extname as FD,isAbsolute as UD,join as WD,relative as BD}from"node:path";import{fileURLToPath as HD}from"node:url";import{Hono as qD}from"hono";import{serveStatic as $t}from"@hono/node-server/serve-static";function sE(t){let e=new qD,r=[],n=t.localWebui!==void 0?wd(t.localWebui.webuiDir):JD();if(t.localWebui!==void 0&&cw(e,{s3:t.localWebui.localMailbox.s3,commands:t.localWebui.localMailbox.commands}),n!==null){let s=XD();t.localWebui!==void 0?e.get("/config.json",s,o=>o.json({workspaceFetchMode:"local-mailbox",localMailbox:{base:"/local-mailbox",userId:"local",deviceId:"local"},mailboxPolling:{readIntervalSeconds:1,heartbeatIdleSeconds:1,backoffReadIntervalSeconds:1}})):t.webuiRuntimeConfig!==void 0&&e.get("/config.json",s,o=>o.json(t.webuiRuntimeConfig)),e.use("/dist/*",s,$t({root:n})),e.use("/vendor/*",s,$t({root:n})),e.use("/src/*",s,$t({root:n})),e.get("/",s,$t({root:n,path:"index.html"})),e.get("/admin",s,$t({root:n,path:"index.html"})),e.get("/admin/*",s,$t({root:n,path:"index.html"})),e.get("/terminal",s,$t({root:n,path:"index.html"})),e.get("/terminal/*",s,$t({root:n,path:"index.html"})),e.get("/chat",s,$t({root:n,path:"index.html"})),e.get("/chat/*",s,$t({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("*",V_()),e.get("/login",s=>s.html(je("Login",`
1830
+ ORDER BY id DESC LIMIT 1`,e);return r.length===0?null:{kind:r[0].kind,attention_id:r[0].id}}var ba=E(()=>{"use strict"});function Hw(t,e){t.all("/runtime/*",r=>fD(r.req.raw,e))}async function fD(t,e){try{return Response.json(await mD(t,e))}catch(r){if(r instanceof ie)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 mD(t,e){let r=new URL(t.url),n=ED(e),s=r.pathname.split("/").filter(Boolean).map(decodeURIComponent);if(t.method==="GET"&&r.pathname==="/runtime/workspaces")return fd(t),[{id:n.id,name:n.name}];if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="workspaces")return Sa(t,n.id,s[2]),pD(e.dal,n);if(t.method==="GET"&&s.length===5&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"){Sa(t,n.id,s[2]);let o=Cw(e.dal,s[4]);return Lw(e.dal,n,o)}if(t.method==="GET"&&r.pathname==="/runtime/lead-teams")return fd(t),e.dal.listTeams().map(o=>wD(o));if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="chat"){let o=Mw(e.dal,Dw(s[2])),i=await t.json();if(i.teamId!==`team:${o.name}`)throw new ie(400,"runtime lead chat body does not match route team");return Fw(t,n.id,i.context),Pw(o,i.context)}if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="messages"){let o=Mw(e.dal,Dw(s[2])),i=await t.json();if(i.teamId!==`team:${o.name}`)throw new ie(400,"runtime lead message body does not match route team");Fw(t,n.id,i.context);let a=i.draft?.body;if(typeof a!="string"||a.length===0)throw new ie(400,"runtime lead message requires draft.body");return Pw(o,i.context,a)}if(t.method==="POST"&&s.length===6&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"&&s[5]==="workflow-message"){Sa(t,n.id,s[2]);let o=Cw(e.dal,s[4]),i=await t.json();if(i.workspaceId!==n.id||i.projectId!==o.name)throw new ie(400,"runtime request body does not match route workspace/project");let a=i.draft?.body;if(typeof a!="string"||a.length===0)throw new ie(400,"runtime workflow message requires draft.body");return gD(e.dal,o,a),Lw(e.dal,n,o)}if(t.method==="GET"&&r.pathname==="/runtime/templates")return Ps(t,n.id),e.dal.listWorkflows().map(o=>TD(o));if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="templates"){Ps(t,n.id);let o=SD(e.dal,s[2]);return bD(o)}if(t.method==="GET"&&r.pathname==="/runtime/runs"){Ps(t,n.id);let o=r.searchParams.get("project"),i=r.searchParams.get("template");if(o!==null&&i!==null)throw new ie(400,"conflicting_filters: ?project= and ?template= are mutually exclusive");return kD(e.dal,o,i).map(l=>Ww(e.dal,l))}if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="runs"){Ps(t,n.id);let o=Uw(e.dal,s[2]);return Ww(e.dal,o)}if(t.method==="GET"&&s.length===4&&s[0]==="runtime"&&s[1]==="runs"&&s[3]==="events"){Ps(t,n.id);let o=Uw(e.dal,s[2]),i=ID(e.dal,o);return{runId:gd(o),events:i,...i.length>0?{cursor:i[i.length-1].id}:{}}}throw new ie(404,`unknown runtime request: ${t.method} ${r.pathname}`)}function pD(t,e){return{id:e.id,name:e.name,projects:t.listProjects().map(r=>qw(t,e,r))}}function Lw(t,e,r){let n=qw(t,e,r);return{...n,managedWorkflow:{...n.managedWorkflow,instance:hD(t,r),composerTarget:{kind:"workflow-initial",label:`Project Workflow: ${r.workflow_name}`,templateId:`template:${r.workflow_name}`,runId:n.managedWorkflow.runId}},workflowMessages:_D(t,r)}}function qw(t,e,r){let n=Jw(t,r.id),s=pd(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 hD(t,e){let r=Jw(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:pd(r),currentStepIds:n===null?[]:[n],...r?.started_at===void 0?{}:{createdAt:r.started_at},...r?.ended_at===null||r?.ended_at===void 0?{}:{updatedAt:r.ended_at}}}function _D(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 gD(t,e,r){let n=yD(t,e.id);if(n!==null){let s=Ta(t,n.id);if(s?.kind==="workflow_escalation"){let o=t.resumeEscalation(s.attention_id,r);if(!o.resumed)throw new ie(409,`workflow escalation resume failed: ${o.reason}`);return}if(s?.kind==="interactive_waiting_operator"){let o=Nt(t,s.attention_id);if(o?.step_id===null||o?.step_id===void 0)throw new ie(409,"interactive resume failed: missing step");let i=t.resumeInteractive(o.step_id,r,!0);if(!i.resumed)throw new ie(409,`interactive resume failed: ${i.reason}`);return}}t.enqueueJob({project_id:e.id,source:"runtime-workflow-message",payload:JSON.stringify({prompt:r}),priority:0})}function Jw(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 yD(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 pd(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 Cw(t,e){let r=t.findProjectByName(e);if(r===null)throw new ie(404,`project not found: ${e}`);return r}function Mw(t,e){let r=t.listTeams().find(n=>n.name===e);if(r===void 0)throw new ie(404,`team not found: ${e}`);return r}function Dw(t){return t.startsWith("team:")?t.slice(5):t}function wD(t){return{id:`team:${t.name}`,name:t.name,teamfile:"",hasLead:!0,kind:t.name.toLowerCase().includes("manager")?"global-manager":"custom-ai-led"}}function Pw(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??Bw}`,teamId:`team:${t.name}`,title:`${t.name} Lead`,messages:s,...e===void 0?{}:{context:e}}}function ED(t){let e=t.workspaceName??Xn()??Nr.default;return{id:e,name:e}}function fd(t){if(t.headers.get("x-lmctl-workspace-id")!==Bw)throw new ie(400,"runtime request requires global-admin workspace identity")}function Sa(t,e,r){let n=t.headers.get("x-lmctl-workspace-id");if(n===null)throw new ie(400,"runtime request requires workspace identity");if(r!==e||n!==e)throw new ie(400,"runtime workspace identity does not match route")}function Ps(t,e){let r=t.headers.get("x-lmctl-workspace-id");if(r===null)throw new ie(400,"runtime request requires workspace identity");if(r!==e)throw new ie(400,"runtime workspace identity does not match server workspace")}function Fw(t,e,r){if(r?.scope==="workspace"){if(r.workspaceId===void 0)throw new ie(400,"workspace manager context requires workspace identity");Sa(t,e,r.workspaceId);return}fd(t)}function hd(t){return`${On}${_d(t.name)}`}function _d(t){return t.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"item"}function gd(t){return`${md}${t.id}`}function TD(t){let e=ka(t.definition);return{id:hd(t),name:t.name,...e.description===null?{}:{description:e.description}}}function bD(t){let e=ka(t.definition);return{id:hd(t),name:t.name,...e.description===null?{}:{description:e.description},graph:e.graph}}function ka(t){let e;try{e=JSON.parse(t)}catch{return{description:null,graph:null,stepIds:[],nameToId:new Map}}if(e===null||typeof e!="object")return{description:null,graph:e,stepIds:[],nameToId:new Map};let r=e,n=typeof r.description=="string"?r.description:null,s=[],o=new Map;if(r.schema_version==="lmctl/v3"&&Array.isArray(r.steps)){let i=typeof r.entry_step_id=="string"?r.entry_step_id:null;for(let a of r.steps){let l=typeof a.id=="string"?a.id:null;l!==null&&(s.push(l),typeof a.name=="string"&&a.name.length>0&&o.set(a.name,l))}i!==null&&s.includes(i)&&s.sort((a,l)=>a===i?-1:l===i?1:0)}return{description:n,graph:e,stepIds:s,nameToId:o}}function SD(t,e){if(!e.startsWith(On))throw new ie(404,`template not found: ${e}`);let r=e.slice(On.length),n=t.listWorkflows().filter(s=>_d(s.name)===r);if(n.length===0)throw new ie(404,`template not found: ${e}`);if(n.length>1){let s=n.map(o=>o.name).join(", ");throw new ie(409,`template_id_ambiguous: ${e} matches multiple workflow names [${s}]; rename to ensure unique slugs`)}return n[0]}function Uw(t,e){if(!e.startsWith(md))throw new ie(404,`run not found: ${e}`);let r=e.slice(md.length);if(!/^[1-9]\d*$/.test(r))throw new ie(404,`run not found: ${e}`);let n=Number.parseInt(r,10);if(!Number.isFinite(n)||n<=0||String(n)!==r)throw new ie(404,`run not found: ${e}`);let s=t.getRun(n);if(s===null)throw new ie(404,`run not found: ${e}`);return s}function kD(t,e,r){if(r!==null){if(!r.startsWith(On))return[];let s=r.slice(On.length),o=t.listWorkflows().filter(a=>_d(a.name)===s).map(a=>a.id);if(o.length===0)return[];let i=o.map(()=>"?").join(", ");return t.query(`SELECT * FROM run WHERE workflow_id IN (${i}) ORDER BY id DESC LIMIT 200`,...o)}if(e===null)return t.query("SELECT * FROM run ORDER BY id DESC LIMIT 200");let n=t.findProjectByName(e);return n===null?[]:t.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? ORDER BY r.id DESC LIMIT 200",n.id)}function Ww(t,e){let r=t.getWorkflow(e.workflow_id),n=pd(e),s=vD(r,e);return{id:gd(e),templateId:r===null?`${On}unknown`:hd(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 vD(t,e){if(e.current_state===null)return[];let r=e.current_state.startsWith("__paused__:")?e.current_state.slice(11):e.current_state;return t===null?[r]:[ka(t.definition).nameToId.get(r)??r]}function ID(t,e){let r=t.getWorkflow(e.workflow_id),n=r===null?{stepIds:[],nameToId:new Map}:ka(r.definition),s=c=>n.nameToId.get(c)??c,o=gd(e),i=[];i.push({timestamp:e.started_at,type:"run.started",message:"Run started"});let a=t.listStepsForRun(e.id);for(let c of a){let u=s(c.state_name);if(i.push({timestamp:c.started_at,type:"step.started",stepId:u,message:`step ${c.state_name} started`}),c.ended_at!==null){let d=ND(c);i.push({timestamp:c.ended_at,type:d,stepId:u,...c.outcome===null?{}:{message:c.outcome},...c.status_detail===null?{}:{payload:{status_detail:c.status_detail}}})}else e.paused_at!==null&&c.id===a[a.length-1]?.id&&i.push({timestamp:e.paused_at,type:"step.paused",stepId:u})}let l=t.listSessionEvents(e.id);for(let c of l){let u=c.step_id===null?void 0:(()=>{let m=a.find(p=>p.id===c.step_id);return m===void 0?void 0:s(m.state_name)})(),d=new Date(c.timestamp_ms).toISOString(),f={kind:c.kind,session_event_id:c.id};if(c.payload.length>0)try{let m=JSON.parse(c.payload);m!==null&&typeof m=="object"&&!Array.isArray(m)&&(f={...f,...m})}catch{}i.push({timestamp:d,type:"message",...u===void 0?{}:{stepId:u},payload:f})}if(e.terminal_state!==null){let c=e.terminal_state==="done"||e.terminal_state==="success"?"run.completed":e.terminal_state==="cancelled"||e.terminal_state==="aborted"?"run.cancelled":"run.failed";i.push({timestamp:e.ended_at??e.started_at,type:c,message:e.terminal_state})}return i.sort((c,u)=>c.timestamp.localeCompare(u.timestamp)),i.map((c,u)=>({id:`${o}:evt:${u+1}`,runId:o,sequence:u+1,timestamp:c.timestamp,type:c.type,...c.stepId===void 0?{}:{stepId:c.stepId},...c.message===void 0?{}:{message:c.message},...c.payload===void 0?{}:{payload:c.payload}}))}function ND(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 Bw,On,md,ie,Xw=E(()=>{"use strict";Ve();ba();Gt();Bw="global-admin";On="template:",md="run:";ie=class extends Error{status;constructor(e,r){super(r),this.status=e}}});import{mkdirSync as xD,writeFileSync as AD}from"node:fs";import{randomUUID as Gw}from"node:crypto";import{dirname as $D,resolve as va,sep as Vw}from"node:path";async function Yw(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(!CD(n))return t.text("missing image file",400);if(n.size>RD)return t.text("upload too large",413);let s=Buffer.from(await n.arrayBuffer()),o=MD(s);if(o===null||!(o in Kw))return t.text("unsupported upload MIME type",415);if(n.type.length>0&&n.type!==o)return t.text("upload MIME type does not match file content",415);let i=jD(e,r.project);if(typeof i=="string")return t.text(i,404);let a=i===null?va(LD()):va(i.local_path),l=va(a,"uploads",Gw()),c=va(l,`${Gw()}${Kw[o]}`);if(!OD(c,a))return t.text("invalid upload path",400);xD(l,{recursive:!0});let u=new Uint8Array(s.buffer,s.byteOffset,s.byteLength);AD(c,u);let d={path:c,size:s.byteLength,mime:o,project:i?.name??null};return t.json(d)}function jD(t,e){return e==null||e===""?null:typeof e!="string"?"invalid project":t.findProjectByName(e)??`project not found: ${e}`}function OD(t,e){let r=e.endsWith(Vw)?e:`${e}${Vw}`;return t.startsWith(r)}function LD(){return $D(le())}function CD(t){return typeof File<"u"&&t instanceof File}function MD(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 RD,Kw,zw=E(()=>{"use strict";Ve();RD=10*1024*1024,Kw={"image/png":".png","image/jpeg":".jpg","image/webp":".webp","image/heic":".heic","application/pdf":".pdf"}});import{existsSync as Ia}from"node:fs";import{basename as DD,dirname as PD,extname as FD,isAbsolute as UD,join as WD,relative as BD}from"node:path";import{fileURLToPath as HD}from"node:url";import{Hono as qD}from"hono";import{serveStatic as $t}from"@hono/node-server/serve-static";function sE(t){let e=new qD,r=[],n=t.localWebui!==void 0?wd(t.localWebui.webuiDir):JD();if(t.localWebui!==void 0&&cw(e,{s3:t.localWebui.localMailbox.s3,commands:t.localWebui.localMailbox.commands}),n!==null){let s=XD();t.localWebui!==void 0?e.get("/config.json",s,o=>o.json({workspaceFetchMode:"local-mailbox",localMailbox:{base:"/local-mailbox",userId:"local",deviceId:"local"},mailboxPolling:{readIntervalSeconds:1,heartbeatIdleSeconds:1,backoffReadIntervalSeconds:1}})):t.webuiRuntimeConfig!==void 0&&e.get("/config.json",s,o=>o.json(t.webuiRuntimeConfig)),e.use("/dist/*",s,$t({root:n})),e.use("/vendor/*",s,$t({root:n})),e.use("/src/*",s,$t({root:n})),e.get("/",s,$t({root:n,path:"index.html"})),e.get("/admin",s,$t({root:n,path:"index.html"})),e.get("/admin/*",s,$t({root:n,path:"index.html"})),e.get("/terminal",s,$t({root:n,path:"index.html"})),e.get("/terminal/*",s,$t({root:n,path:"index.html"})),e.get("/chat",s,$t({root:n,path:"index.html"})),e.get("/chat/*",s,$t({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("*",V_()),e.get("/login",s=>s.html(je("Login",`
1832
1831
  <h1>Login</h1>
1833
1832
  <form method="post" action="/login">
1834
1833
  <label>Token <input name="token" type="password"></label>
1835
1834
  <button type="submit">Login</button>
1836
1835
  </form>
1837
- `))),e.post("/login",async s=>{let o=await s.req.parseBody(),i=typeof o.token=="string"?o.token:"";return Y_(i)?(Nu(s,i),s.redirect("/",302)):s.html(je("Login","<p>Invalid token</p>"),401)}),e.post("/logout",s=>(z_(s),s.redirect("/login",302))),Vy(e,{dal:t.dal}),Hw(e,{dal:t.dal}),dw(e,{dal:t.dal}),bw(e,{terminalSessionManager:t.terminalSessionManager}),xw(e,{persistentSessionManager:t.persistentSessionManager}),e.post("/api/teams/:team_name/refresh",async s=>{let o=ms(s.req.param("team_name")),i=t.dal.findTeamByName(o);if(i===null)return s.notFound();let a=[],c=t.dal.db.transaction(()=>{let f=t.dal.listTeamMembers(i.id),m=f.filter(p=>p.state!=="idle");if(m.length>0)return{ok:!1,nonIdle:m.map(p=>({alias:p.alias,state:p.state}))};for(let p of f)t.dal.setMemberState(p.id,"in_chat","refreshing");return a=f.map(p=>({id:p.id,alias:p.alias})),{ok:!0}})();if(!c.ok){let f=c.nonIdle.map(m=>`${m.alias}:${m.state}`).join(", ");return s.text(`refresh refused: non-idle members: ${f}`,409)}let u=[],d=[];for(let f of a)try{await jc(t.dal,o,f.alias),t.dal.setMemberState(f.id,"idle",null),u.push(f.alias)}catch(m){let p=m instanceof Error?m.message:String(m);t.dal.setMemberState(f.id,"attention_needed",`refresh failed: ${p}`),d.push({alias:f.alias,error:p})}return H(s,{team:o,seeded:u,failed:d},f=>`<p>refreshed team ${S(f.team)}: seeded [${f.seeded.map(m=>S(m)).join(", ")}]${f.failed.length>0?` failed [${f.failed.map(m=>`${S(m.alias)}: ${S(m.error)}`).join(", ")}]`:""}</p>`)}),sg(e,{dal:t.dal}),dg(e,{dal:t.dal}),e.get("/api/status",s=>H(s,Qo(t.dal),QD)),e.get("/api/projects",s=>H(s,ei(t.dal),eP)),e.get("/api/teams",s=>H(s,ph(t.dal),nP)),e.get("/api/workflows",s=>H(s,ti(t.dal),sP)),e.get("/api/workflows/verify",s=>{let o=jy();return s.req.header("accept")?.includes("text/plain")?s.text(Ly(o)):s.json(o)}),e.get("/api/jobs",s=>H(s,hh(t.dal,{status:s.req.query("status")}),oP)),e.post("/api/uploads",s=>Yw(s,t.dal)),e.get("/api/jobs/:id",s=>{let o=ri(t.dal,ne(s,"id"));return o===null?s.notFound():H(s,o,ue)}),e.post("/api/jobs",async s=>{let o;try{o=await s.req.json()}catch{return s.text("invalid JSON body",400)}let i=null;if(typeof o.project_id=="number")i=o.project_id;else if(typeof o.project=="string"){let f=t.dal.findProjectByName(o.project);if(f===null)return s.text(`project not found: ${o.project}`,404);i=f.id}else{let f=t.dal.listProjects();f.length===1&&(i=f[0].id)}if(i===null)return s.text("missing project or project_id",400);let a=typeof o.workflow_id_override=="number"?o.workflow_id_override:null;if(a===null&&typeof o.workflow=="string"){let f=t.dal.getWorkflowByName(o.workflow);if(f===null)return s.text(`workflow not found: ${o.workflow}`,404);a=f.id}let l=typeof o.source=="string"?o.source:"manual",c=o.payload,u=c==null?null:typeof c=="string"?c:JSON.stringify(c),d=t.dal.enqueueJob({project_id:i,workflow_id_override:a,source:l,source_ref:typeof o.source_ref=="string"?o.source_ref:null,payload:u,priority:typeof o.priority=="number"?o.priority:0,dedupe_key:typeof o.dedupe_key=="string"?o.dedupe_key:null});return H(s,d,ue)}),e.post("/api/jobs/:id/run",async s=>{let{runJobById:o}=await Promise.resolve().then(()=>(Ds(),qy)),i=ri(t.dal,ne(s,"id"));if(i===null)return s.notFound();let a=await o({dal:t.dal,worker_id:`api-job-run-${process.pid}-${Date.now()}`,job_id:i.id});return a.claimed?s.json({job_id:a.job_id,run_id:a.run_id,status:a.status,terminal_state:a.terminal_state,ms:a.ms}):s.json(a,409)}),e.get("/api/workflows/:name",s=>{let o=t.dal.getWorkflowByName(s.req.param("name"));return o===null?s.notFound():H(s,o,ue)}),e.get("/api/projects/:name/workflows",s=>{let o=t.dal.findProjectByName(s.req.param("name"));return o===null?s.notFound():H(s,t.dal.listProjectWorkflows(o.id),tP)}),e.post("/api/projects/:name/workflows",async s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=await Ln(s);if(typeof i=="string")return s.text(i,400);let a=typeof i.workflow=="string"?i.workflow:null,l=typeof i.workflow_id=="number"?i.workflow_id:null,c=l!==null?t.dal.getWorkflow(l):a!==null?t.dal.getWorkflowByName(a):null;if(c===null)return s.text("workflow not found",404);let u=typeof i.condition=="string"&&i.condition.length>0?i.condition:null;if(u!==null)try{pr(u)}catch{return s.text("invalid condition",400)}let d=KD(i.parameters_override??i.params);if(typeof d=="string"&&d.startsWith("error:"))return s.text(d.slice(6),400);let f=typeof i.priority=="number"&&Number.isInteger(i.priority)?i.priority:100,m=t.dal.insertProjectWorkflow({project_id:o.id,workflow_id:c.id,condition:u,parameters_override:d,priority:f});return H(s,m,ue)}),e.get("/api/projects/workflows/:id",s=>{let o=t.dal.getProjectWorkflow(ne(s,"id"));return o===null?s.notFound():H(s,o,ue)}),e.delete("/api/projects/workflows/:id",s=>t.dal.removeProjectWorkflow(ne(s,"id"))?H(s,{removed:!0},ue):s.notFound()),e.post("/api/projects/workflows/:id/enable",s=>{let o=t.dal.setProjectWorkflowEnabled(ne(s,"id"),!0);return o===null?s.notFound():H(s,o,ue)}),e.post("/api/projects/workflows/:id/disable",s=>{let o=t.dal.setProjectWorkflowEnabled(ne(s,"id"),!1);return o===null?s.notFound():H(s,o,ue)}),e.get("/api/projects/:name/issues",s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=Qw(s.req.query("status"),YD);if(typeof i=="string")return s.text(i,400);let a=Qw(s.req.query("severity"),iE);return typeof a=="string"?s.text(a,400):H(s,t.dal.listIssues(o.id,{...i!==void 0?{status:i}:{},...a!==void 0?{severity:a}:{},...s.req.query("ai_test_path")!==void 0?{ai_test_path:s.req.query("ai_test_path")}:{}}),rP)}),e.post("/api/projects/:name/issues",async s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=await Ln(s);if(typeof i=="string")return s.text(i,400);let a=typeof i.title=="string"&&i.title.trim().length>0?i.title:null,l=typeof i.body=="string"?i.body:null;if(a===null||l===null)return s.text("missing title or body",400);let c=zD(i.severity);if(typeof c=="object")return s.text(c.error,400);let u=ZD(i.labels);if(typeof u=="string"&&u.startsWith("error:"))return s.text(u.slice(6),400);let d=t.dal.createIssue({project_id:o.id,title:a,body:l,...c!==void 0?{severity:c}:{},labels:u,ai_test_path:typeof i.ai_test_path=="string"?i.ai_test_path:null,source_run_id:typeof i.source_run_id=="number"?i.source_run_id:null});return H(s,d,ue)}),e.get("/api/issues/:id",s=>{let o=t.dal.getIssue(ne(s,"id"));return o===null?s.notFound():H(s,o,ue)}),e.post("/api/issues/:id/claim",async s=>{let o=ne(s,"id"),i=t.dal.getIssue(o);if(i===null)return s.notFound();let a=await Ln(s);if(typeof a=="string")return s.json({error:a},400);let l=typeof a.assigned_run_id=="number"?a.assigned_run_id:null;if(l===null)return s.json({error:"missing assigned_run_id"},400);let c=t.dal.claimIssue(o,l);return c===null?s.json({error:`issue ${o} is not in a claimable state (status=${i.status})`},400):H(s,c,ue)}),e.post("/api/projects/:name/issues/claim-next",async s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.json({error:"project_not_found"},404);let i=await Ln(s);if(typeof i=="string")return s.json({error:i},400);let a=typeof i.assigned_run_id=="number"?i.assigned_run_id:null;if(a===null)return s.json({error:"missing assigned_run_id"},400);let l=t.dal.claimNextIssue(o.id,a);return l===null?s.json({status:"queue_empty"},404):H(s,l,ue)}),e.post("/api/issues/:id/close",async s=>{let o=t.dal.getIssue(ne(s,"id"));if(o===null)return s.notFound();let i=await Ln(s);if(typeof i=="string")return s.json({error:i},400);let a=typeof i.closed_run_id=="number"?i.closed_run_id:o.assigned_run_id;if(a===null)return s.json({error:"missing closed_run_id"},400);try{return H(s,t.dal.closeIssue(ne(s,"id"),a,typeof i.commit_hash=="string"?i.commit_hash:null),ue)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),e.post("/api/issues/:id/reopen",async s=>{let o=t.dal.getIssue(ne(s,"id"));if(o===null)return s.notFound();let i=await Ln(s);if(typeof i=="string")return s.json({error:i},400);let a=typeof i.source_run_id=="number"?i.source_run_id:o.closed_run_id??o.source_run_id;if(a===null)return s.json({error:"missing source_run_id"},400);try{return H(s,t.dal.reopenIssue(ne(s,"id"),a),ue)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),e.get("/api/projects/:name",s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=o.name.indexOf("/"),a=i>0?o.name.slice(0,i):null,l=i>0?o.name.slice(i+1):o.name;return H(s,{...o,owner:a,repo:l},ue)}),e.get("/api/runs/:run_id/artifacts",s=>{let o=ne(s,"run_id"),i=s.req.query("kind"),a=Cr(t.dal,o,i);return H(s,a,ue)}),e.get("/api/runs/:run_id/artifacts/:kind",async s=>{let o=ne(s,"run_id"),i=s.req.param("kind"),a=Cr(t.dal,o,i);if(a.length===0)return s.notFound();let l=a[a.length-1],c=s.req.query("raw")==="true";if(l.content!==null&&l.content!==void 0)return c?s.text(l.content):H(s,l,ue);if(l.path!==null&&l.path!==void 0){if(c)try{let{readFileSync:u}=await import("node:fs"),d=GD(l.path);if(VD(d)){let _=u(l.path,"utf8");return s.body(_,200,{"Content-Type":d})}let f=u(l.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength),p=DD(l.path);return s.body(m,200,{"Content-Type":d,"Content-Disposition":`attachment; filename="${p}"`})}catch(u){return s.text(`failed to read artifact path: ${u.message}`,500)}return H(s,l,ue)}return H(s,l,ue)}),e.get("/api/runs",s=>H(s,cn(t.dal,{limit:yd(s,"limit")??100}),iP)),e.get("/api/runs/:id",s=>{let o=Lr(t.dal,ne(s,"id"));return o===null?s.notFound():H(s,o,aP)}),e.get("/api/runs/:id/where",s=>{let o=un(t.dal,ne(s,"id"));return o===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(si(o)):s.json(o)}),e.get("/api/runs/:id/timeline",s=>{let o=oi(t.dal,ne(s,"id"));return o===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(ii(o)):s.json(o)}),e.post("/api/runs/:id/resume",async s=>{let o=s.req.query("outcome");if(o===void 0||o.length===0){let a=s.req.header("content-type")??"";if(a.includes("application/x-www-form-urlencoded")||a.includes("multipart/form-data")){let c=(await s.req.parseBody().catch(()=>({}))).outcome;typeof c=="string"&&c.length>0&&(o=c)}}if(o===void 0||o.length===0)return s.text("missing outcome",400);let i=t.dal.resumeRun(ne(s,"id"),o);return!i.resumed&&i.reason==="run_not_found"?s.notFound():i.resumed?(Na(t.daemon),H(s,i,eE)):H(s,i,eE,400)}),e.post("/api/interactive/:step_id/respond",async s=>{let o=ne(s,"step_id"),i,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let u=await s.req.json();typeof u.input=="string"&&(i=u.input),u.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let u=await s.req.parseBody().catch(()=>({}));typeof u.input=="string"&&(i=u.input),(u.done==="true"||u.done===!0)&&(a=!0)}if(i===void 0)return s.text("missing input",400);let c=t.dal.resumeInteractive(o,i,a);return!c.resumed&&c.reason==="not_found"?s.notFound():c.resumed?(Na(t.daemon),s.json({resumed:!0,session_status:c.session.status})):s.json({resumed:!1,reason:c.reason},400)}),e.get("/api/runs/:id/steps/:step_id",s=>Zw(s,t.dal,o=>H(s,o,cP))),e.get("/api/runs/:id/steps/:step_id/transcript",s=>{let o=wh(t.dal,ne(s,"id"),ne(s,"step_id"));return o===null?s.notFound():oE(s)?s.html(`<pre>${S(o)}</pre>`):s.req.header("accept")?.includes("text/plain")?s.text(o):s.json({transcript:o})}),e.get("/api/runs/:id/steps/:step_id/messages",s=>Zw(s,t.dal,o=>{let i=Rw(o);return H(s,i,a=>me(["role","text"],a.map(l=>[S(l.role),S(l.text)])))})),e.get("/api/external-objects",s=>H(s,Eh(t.dal,{type:s.req.query("type")}),uP)),e.get("/api/external-signals",s=>H(s,Th(t.dal,{unhandled:s.req.query("unhandled")==="true"}),dP)),e.get("/api/attentions",s=>H(s,ur(t.dal,{unacked:s.req.query("unacked")==="true"}),fP)),e.post("/api/attentions/:id/ack",s=>{let o=t.dal.acknowledgeAttention(ne(s,"id"));return o===null?s.notFound():H(s,o,i=>`<p>acknowledged attention ${S(i.id)}</p>`)}),e.get("/api/escalations",s=>{let o=s.req.query("project"),i=s.req.query("all")==="true",a=s.req.query("since"),l={all:i};o!==void 0&&(l.project=o),a!==void 0&&(l.since=a);let c=ni(t.dal,l);return H(s,c,u=>`<h1>Escalations</h1>${me(["attention_id","project","run","workflow","state","prompt"],u.map(d=>[S(d.attention_id),S(d.project),S(d.run_id),S(d.workflow_name),S(d.state_name),S((d.prompt??"").slice(0,120))]))}`)}),e.get("/api/escalations/:id",s=>{let o=Nt(t.dal,ne(s,"id"));return o===null?s.notFound():H(s,o,ue)}),e.post("/api/escalations/:id/respond",async s=>{let o=ne(s,"id"),i,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let m=await s.req.json();typeof m.input=="string"&&(i=m.input),m.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let m=await s.req.parseBody().catch(()=>({}));typeof m.input=="string"&&(i=m.input),(m.done==="true"||m.done===!0)&&(a=!0)}if(i===void 0)return s.text("missing input",400);let c=Nt(t.dal,o);if(c===null)return s.notFound();let u=ur(t.dal).find(m=>m.id===o);if(u===void 0)return s.notFound();if(u.kind==="workflow_escalation"){let m=t.dal.resumeEscalation(o,i);if(!m.resumed)return s.json({ok:!1,reason:m.reason},400);Na(t.daemon);let p=ur(t.dal).find(_=>_.id===o);return s.json({ok:!0,attention_id:o,run_id:m.run.id,decision:i,session_status:"escalation_resumed",acknowledged_at:p?.acknowledged_at??null})}if(u.kind!=="interactive_waiting_operator")return s.json({ok:!1,reason:"wrong_kind",kind:u.kind},400);if(u.acknowledged_at!==null)return s.json({ok:!1,reason:"already_acked"},400);if(c.step_id===null)return s.json({ok:!1,reason:"no_step"},400);let d=t.dal.resumeInteractive(c.step_id,i,a);if(!d.resumed)return s.json({ok:!1,reason:d.reason,step_id:c.step_id},400);let f=t.dal.acknowledgeAttention(o);return Na(t.daemon),s.json({ok:!0,attention_id:o,step_id:c.step_id,session_status:d.session.status,acknowledged_at:f?.acknowledged_at??null})}),e.get("/api/submitted-prs",s=>{let o=s.req.query("pr_url"),i=s.req.query("status"),a=_h(t.dal,{status:i,pr_url:o});return H(s,a,mP)}),e.get("/api/submitted-prs/:id",s=>{let o=ne(s,"id"),i=gh(t.dal,o);return i===null?s.notFound():H(s,i,pP)}),e.get("/api/sessions",s=>H(s,t.dal.latestSessionSizes(),tE)),e.get("/api/sessions/:team_name/:alias/history",s=>{let o=ms(s.req.param("team_name"));return H(s,t.dal.sessionSizeHistory(o,s.req.param("alias")),tE)}),e.post("/api/sessions/:team_name/:alias/compact",async s=>{let o=ms(s.req.param("team_name"));try{let i=await ah(t.dal,o,s.req.param("alias"));return H(s,i,a=>rE("compacted",a.row))}catch(i){if(i instanceof fs)return s.text(i.message,409);throw i}}),e.post("/api/sessions/:team_name/:alias/refresh",async s=>{let o=ms(s.req.param("team_name")),i=await jc(t.dal,o,s.req.param("alias"));return H(s,i,a=>rE(`refreshed ${a.sessionid}`,a.row))}),e.get("/api/intake/state",s=>H(s,r,nE)),e.post("/api/intake/scan",async s=>(r=await kn(t.dal),H(s,r,nE))),e.get("/api/stats/run-throughput",s=>H(s,kh(t.dal),hP)),e.get("/api/daemon/state",s=>H(s,t.daemon?.state??null,_P)),e.post("/api/daemon/cycle",async s=>{if(t.daemon===void 0)return H(s,{disabled:!0},ue);let o=await t.daemon.runCycle();return H(s,{state:t.daemon.state,result:o},ue)}),e.get("/metrics/:project_id",s=>{let o=ne(s,"project_id"),i=t.dal.getProject(o);if(i===null)return s.notFound();let a=Fc(t.dal,o),l=Uc(t.dal,{project_id:o});return s.html(je(`Metrics \u2014 ${i.name}`,gP(i.name,a,l)))}),e.get("/api/metrics/reviewer/:project_id",s=>{let o=ne(s,"project_id");if(t.dal.getProject(o)===null)return s.notFound();let i=yd(s,"since_days");return s.json(Fc(t.dal,o,i))}),e.get("/api/metrics/tools/:project_id",s=>{let o=ne(s,"project_id");if(t.dal.getProject(o)===null)return s.notFound();let i=yd(s,"since_days");return s.json(Uc(t.dal,{project_id:o,since_days:i}))}),e.post("/api/drift/:id/ack",s=>{let o=t.dal.acknowledgeDriftSignal(ne(s,"id"));return o===null?s.notFound():s.json({id:o.id,acknowledged_at:o.acknowledged_at})}),e}function Zw(t,e,r){let n=Pc(e,ne(t,"id"),ne(t,"step_id"));return n===null?t.notFound():r(n)}function Na(t){t!==void 0&&t.runCycle().catch(()=>{})}function H(t,e,r,n=200){return oE(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 oE(t){let e=t.req.header("accept")??"";return e.includes("text/html")&&!e.includes("application/json")}function JD(){let t=process.env.LMCTL_WEBUI_DIST;if(t!==void 0)return Ia(`${t}/index.html`)?wd(t):null;let e="src/serve/webui-dist";if(Ia(`${e}/index.html`))return e;let r="dist/serve/webui-dist";if(Ia(`${r}/index.html`))return r;let n=WD(PD(HD(import.meta.url)),"webui-dist");return Ia(`${n}/index.html`)?wd(n):null}function wd(t){if(!UD(t))return t;let e=BD(process.cwd(),t);return e.length===0?".":e}function XD(){return async(t,e)=>{await e(),t.header("Cache-Control","no-store")}}function ne(t,e){return Number(t.req.param(e))}function yd(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 GD(t){switch(FD(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 VD(t){return!!(t.startsWith("text/")||t.startsWith("application/json")||t.startsWith("application/xml"))}async function Ln(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 KD(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 Qw(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 zD(t){if(t!=null)return typeof t=="string"&&iE.includes(t)?t:{error:`invalid severity: ${String(t)}`}}function ZD(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 QD(t){return`<h1>Status</h1><div class="grid">
1836
+ `))),e.post("/login",async s=>{let o=await s.req.parseBody(),i=typeof o.token=="string"?o.token:"";return Y_(i)?(Nu(s,i),s.redirect("/",302)):s.html(je("Login","<p>Invalid token</p>"),401)}),e.post("/logout",s=>(z_(s),s.redirect("/login",302))),Vy(e,{dal:t.dal}),Hw(e,{dal:t.dal}),dw(e,{dal:t.dal}),bw(e,{terminalSessionManager:t.terminalSessionManager}),xw(e,{persistentSessionManager:t.persistentSessionManager}),e.post("/api/teams/:team_name/refresh",async s=>{let o=ms(s.req.param("team_name")),i=t.dal.findTeamByName(o);if(i===null)return s.notFound();let a=[],c=t.dal.db.transaction(()=>{let f=t.dal.listTeamMembers(i.id),m=f.filter(p=>p.state!=="idle");if(m.length>0)return{ok:!1,nonIdle:m.map(p=>({alias:p.alias,state:p.state}))};for(let p of f)t.dal.setMemberState(p.id,"in_chat","refreshing");return a=f.map(p=>({id:p.id,alias:p.alias})),{ok:!0}})();if(!c.ok){let f=c.nonIdle.map(m=>`${m.alias}:${m.state}`).join(", ");return s.text(`refresh refused: non-idle members: ${f}`,409)}let u=[],d=[];for(let f of a)try{await jc(t.dal,o,f.alias),t.dal.setMemberState(f.id,"idle",null),u.push(f.alias)}catch(m){let p=m instanceof Error?m.message:String(m);t.dal.setMemberState(f.id,"attention_needed",`refresh failed: ${p}`),d.push({alias:f.alias,error:p})}return H(s,{team:o,seeded:u,failed:d},f=>`<p>refreshed team ${S(f.team)}: seeded [${f.seeded.map(m=>S(m)).join(", ")}]${f.failed.length>0?` failed [${f.failed.map(m=>`${S(m.alias)}: ${S(m.error)}`).join(", ")}]`:""}</p>`)}),sg(e,{dal:t.dal}),dg(e,{dal:t.dal}),e.get("/api/status",s=>H(s,Qo(t.dal),QD)),e.get("/api/projects",s=>H(s,ei(t.dal),eP)),e.get("/api/teams",s=>H(s,ph(t.dal),nP)),e.get("/api/workflows",s=>H(s,ti(t.dal),sP)),e.get("/api/workflows/verify",s=>{let o=jy();return s.req.header("accept")?.includes("text/plain")?s.text(Ly(o)):s.json(o)}),e.get("/api/jobs",s=>H(s,hh(t.dal,{status:s.req.query("status")}),oP)),e.post("/api/uploads",s=>Yw(s,t.dal)),e.get("/api/jobs/:id",s=>{let o=ri(t.dal,ne(s,"id"));return o===null?s.notFound():H(s,o,ue)}),e.post("/api/jobs",async s=>{let o;try{o=await s.req.json()}catch{return s.text("invalid JSON body",400)}let i=null;if(typeof o.project_id=="number")i=o.project_id;else if(typeof o.project=="string"){let f=t.dal.findProjectByName(o.project);if(f===null)return s.text(`project not found: ${o.project}`,404);i=f.id}else{let f=t.dal.listProjects();f.length===1&&(i=f[0].id)}if(i===null)return s.text("missing project or project_id",400);let a=typeof o.workflow_id_override=="number"?o.workflow_id_override:null;if(a===null&&typeof o.workflow=="string"){let f=t.dal.getWorkflowByName(o.workflow);if(f===null)return s.text(`workflow not found: ${o.workflow}`,404);a=f.id}let l=typeof o.source=="string"?o.source:"manual",c=o.payload,u=c==null?null:typeof c=="string"?c:JSON.stringify(c),d=t.dal.enqueueJob({project_id:i,workflow_id_override:a,source:l,source_ref:typeof o.source_ref=="string"?o.source_ref:null,payload:u,priority:typeof o.priority=="number"?o.priority:0,dedupe_key:typeof o.dedupe_key=="string"?o.dedupe_key:null});return H(s,d,ue)}),e.post("/api/jobs/:id/run",async s=>{let{runJobById:o}=await Promise.resolve().then(()=>(Ds(),qy)),i=ri(t.dal,ne(s,"id"));if(i===null)return s.notFound();let a=await o({dal:t.dal,worker_id:`api-job-run-${process.pid}-${Date.now()}`,job_id:i.id});return a.claimed?s.json({job_id:a.job_id,run_id:a.run_id,status:a.status,terminal_state:a.terminal_state,ms:a.ms}):s.json(a,409)}),e.get("/api/workflows/:name",s=>{let o=t.dal.getWorkflowByName(s.req.param("name"));return o===null?s.notFound():H(s,o,ue)}),e.get("/api/projects/:name/workflows",s=>{let o=t.dal.findProjectByName(s.req.param("name"));return o===null?s.notFound():H(s,t.dal.listProjectWorkflows(o.id),tP)}),e.post("/api/projects/:name/workflows",async s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=await Ln(s);if(typeof i=="string")return s.text(i,400);let a=typeof i.workflow=="string"?i.workflow:null,l=typeof i.workflow_id=="number"?i.workflow_id:null,c=l!==null?t.dal.getWorkflow(l):a!==null?t.dal.getWorkflowByName(a):null;if(c===null)return s.text("workflow not found",404);let u=typeof i.condition=="string"&&i.condition.length>0?i.condition:null;if(u!==null)try{pr(u)}catch{return s.text("invalid condition",400)}let d=KD(i.parameters_override??i.params);if(typeof d=="string"&&d.startsWith("error:"))return s.text(d.slice(6),400);let f=typeof i.priority=="number"&&Number.isInteger(i.priority)?i.priority:100,m=t.dal.insertProjectWorkflow({project_id:o.id,workflow_id:c.id,condition:u,parameters_override:d,priority:f});return H(s,m,ue)}),e.get("/api/projects/workflows/:id",s=>{let o=t.dal.getProjectWorkflow(ne(s,"id"));return o===null?s.notFound():H(s,o,ue)}),e.delete("/api/projects/workflows/:id",s=>t.dal.removeProjectWorkflow(ne(s,"id"))?H(s,{removed:!0},ue):s.notFound()),e.post("/api/projects/workflows/:id/enable",s=>{let o=t.dal.setProjectWorkflowEnabled(ne(s,"id"),!0);return o===null?s.notFound():H(s,o,ue)}),e.post("/api/projects/workflows/:id/disable",s=>{let o=t.dal.setProjectWorkflowEnabled(ne(s,"id"),!1);return o===null?s.notFound():H(s,o,ue)}),e.get("/api/projects/:name/issues",s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=Qw(s.req.query("status"),YD);if(typeof i=="string")return s.text(i,400);let a=Qw(s.req.query("severity"),iE);return typeof a=="string"?s.text(a,400):H(s,t.dal.listIssues(o.id,{...i!==void 0?{status:i}:{},...a!==void 0?{severity:a}:{},...s.req.query("ai_test_path")!==void 0?{ai_test_path:s.req.query("ai_test_path")}:{}}),rP)}),e.post("/api/projects/:name/issues",async s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=await Ln(s);if(typeof i=="string")return s.text(i,400);let a=typeof i.title=="string"&&i.title.trim().length>0?i.title:null,l=typeof i.body=="string"?i.body:null;if(a===null||l===null)return s.text("missing title or body",400);let c=zD(i.severity);if(typeof c=="object")return s.text(c.error,400);let u=ZD(i.labels);if(typeof u=="string"&&u.startsWith("error:"))return s.text(u.slice(6),400);let d=t.dal.createIssue({project_id:o.id,title:a,body:l,...c!==void 0?{severity:c}:{},labels:u,ai_test_path:typeof i.ai_test_path=="string"?i.ai_test_path:null,source_run_id:typeof i.source_run_id=="number"?i.source_run_id:null});return H(s,d,ue)}),e.get("/api/issues/:id",s=>{let o=t.dal.getIssue(ne(s,"id"));return o===null?s.notFound():H(s,o,ue)}),e.post("/api/issues/:id/claim",async s=>{let o=ne(s,"id"),i=t.dal.getIssue(o);if(i===null)return s.notFound();let a=await Ln(s);if(typeof a=="string")return s.json({error:a},400);let l=typeof a.assigned_run_id=="number"?a.assigned_run_id:null;if(l===null)return s.json({error:"missing assigned_run_id"},400);let c=t.dal.claimIssue(o,l);return c===null?s.json({error:`issue ${o} is not in a claimable state (status=${i.status})`},400):H(s,c,ue)}),e.post("/api/projects/:name/issues/claim-next",async s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.json({error:"project_not_found"},404);let i=await Ln(s);if(typeof i=="string")return s.json({error:i},400);let a=typeof i.assigned_run_id=="number"?i.assigned_run_id:null;if(a===null)return s.json({error:"missing assigned_run_id"},400);let l=t.dal.claimNextIssue(o.id,a);return l===null?s.json({status:"queue_empty"},404):H(s,l,ue)}),e.post("/api/issues/:id/close",async s=>{let o=t.dal.getIssue(ne(s,"id"));if(o===null)return s.notFound();let i=await Ln(s);if(typeof i=="string")return s.json({error:i},400);let a=typeof i.closed_run_id=="number"?i.closed_run_id:o.assigned_run_id;if(a===null)return s.json({error:"missing closed_run_id"},400);try{return H(s,t.dal.closeIssue(ne(s,"id"),a,typeof i.commit_hash=="string"?i.commit_hash:null),ue)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),e.post("/api/issues/:id/reopen",async s=>{let o=t.dal.getIssue(ne(s,"id"));if(o===null)return s.notFound();let i=await Ln(s);if(typeof i=="string")return s.json({error:i},400);let a=typeof i.source_run_id=="number"?i.source_run_id:o.closed_run_id??o.source_run_id;if(a===null)return s.json({error:"missing source_run_id"},400);try{return H(s,t.dal.reopenIssue(ne(s,"id"),a),ue)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),e.get("/api/projects/:name",s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=o.name.indexOf("/"),a=i>0?o.name.slice(0,i):null,l=i>0?o.name.slice(i+1):o.name;return H(s,{...o,owner:a,repo:l},ue)}),e.get("/api/runs/:run_id/artifacts",s=>{let o=ne(s,"run_id"),i=s.req.query("kind"),a=Cr(t.dal,o,i);return H(s,a,ue)}),e.get("/api/runs/:run_id/artifacts/:kind",async s=>{let o=ne(s,"run_id"),i=s.req.param("kind"),a=Cr(t.dal,o,i);if(a.length===0)return s.notFound();let l=a[a.length-1],c=s.req.query("raw")==="true";if(l.content!==null&&l.content!==void 0)return c?s.text(l.content):H(s,l,ue);if(l.path!==null&&l.path!==void 0){if(c)try{let{readFileSync:u}=await import("node:fs"),d=GD(l.path);if(VD(d)){let h=u(l.path,"utf8");return s.body(h,200,{"Content-Type":d})}let f=u(l.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength),p=DD(l.path);return s.body(m,200,{"Content-Type":d,"Content-Disposition":`attachment; filename="${p}"`})}catch(u){return s.text(`failed to read artifact path: ${u.message}`,500)}return H(s,l,ue)}return H(s,l,ue)}),e.get("/api/runs",s=>H(s,cn(t.dal,{limit:yd(s,"limit")??100}),iP)),e.get("/api/runs/:id",s=>{let o=Lr(t.dal,ne(s,"id"));return o===null?s.notFound():H(s,o,aP)}),e.get("/api/runs/:id/where",s=>{let o=un(t.dal,ne(s,"id"));return o===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(si(o)):s.json(o)}),e.get("/api/runs/:id/timeline",s=>{let o=oi(t.dal,ne(s,"id"));return o===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(ii(o)):s.json(o)}),e.post("/api/runs/:id/resume",async s=>{let o=s.req.query("outcome");if(o===void 0||o.length===0){let a=s.req.header("content-type")??"";if(a.includes("application/x-www-form-urlencoded")||a.includes("multipart/form-data")){let c=(await s.req.parseBody().catch(()=>({}))).outcome;typeof c=="string"&&c.length>0&&(o=c)}}if(o===void 0||o.length===0)return s.text("missing outcome",400);let i=t.dal.resumeRun(ne(s,"id"),o);return!i.resumed&&i.reason==="run_not_found"?s.notFound():i.resumed?(Na(t.daemon),H(s,i,eE)):H(s,i,eE,400)}),e.post("/api/interactive/:step_id/respond",async s=>{let o=ne(s,"step_id"),i,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let u=await s.req.json();typeof u.input=="string"&&(i=u.input),u.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let u=await s.req.parseBody().catch(()=>({}));typeof u.input=="string"&&(i=u.input),(u.done==="true"||u.done===!0)&&(a=!0)}if(i===void 0)return s.text("missing input",400);let c=t.dal.resumeInteractive(o,i,a);return!c.resumed&&c.reason==="not_found"?s.notFound():c.resumed?(Na(t.daemon),s.json({resumed:!0,session_status:c.session.status})):s.json({resumed:!1,reason:c.reason},400)}),e.get("/api/runs/:id/steps/:step_id",s=>Zw(s,t.dal,o=>H(s,o,cP))),e.get("/api/runs/:id/steps/:step_id/transcript",s=>{let o=wh(t.dal,ne(s,"id"),ne(s,"step_id"));return o===null?s.notFound():oE(s)?s.html(`<pre>${S(o)}</pre>`):s.req.header("accept")?.includes("text/plain")?s.text(o):s.json({transcript:o})}),e.get("/api/runs/:id/steps/:step_id/messages",s=>Zw(s,t.dal,o=>{let i=Rw(o);return H(s,i,a=>me(["role","text"],a.map(l=>[S(l.role),S(l.text)])))})),e.get("/api/external-objects",s=>H(s,Eh(t.dal,{type:s.req.query("type")}),uP)),e.get("/api/external-signals",s=>H(s,Th(t.dal,{unhandled:s.req.query("unhandled")==="true"}),dP)),e.get("/api/attentions",s=>H(s,ur(t.dal,{unacked:s.req.query("unacked")==="true"}),fP)),e.post("/api/attentions/:id/ack",s=>{let o=t.dal.acknowledgeAttention(ne(s,"id"));return o===null?s.notFound():H(s,o,i=>`<p>acknowledged attention ${S(i.id)}</p>`)}),e.get("/api/escalations",s=>{let o=s.req.query("project"),i=s.req.query("all")==="true",a=s.req.query("since"),l={all:i};o!==void 0&&(l.project=o),a!==void 0&&(l.since=a);let c=ni(t.dal,l);return H(s,c,u=>`<h1>Escalations</h1>${me(["attention_id","project","run","workflow","state","prompt"],u.map(d=>[S(d.attention_id),S(d.project),S(d.run_id),S(d.workflow_name),S(d.state_name),S((d.prompt??"").slice(0,120))]))}`)}),e.get("/api/escalations/:id",s=>{let o=Nt(t.dal,ne(s,"id"));return o===null?s.notFound():H(s,o,ue)}),e.post("/api/escalations/:id/respond",async s=>{let o=ne(s,"id"),i,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let m=await s.req.json();typeof m.input=="string"&&(i=m.input),m.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let m=await s.req.parseBody().catch(()=>({}));typeof m.input=="string"&&(i=m.input),(m.done==="true"||m.done===!0)&&(a=!0)}if(i===void 0)return s.text("missing input",400);let c=Nt(t.dal,o);if(c===null)return s.notFound();let u=ur(t.dal).find(m=>m.id===o);if(u===void 0)return s.notFound();if(u.kind==="workflow_escalation"){let m=t.dal.resumeEscalation(o,i);if(!m.resumed)return s.json({ok:!1,reason:m.reason},400);Na(t.daemon);let p=ur(t.dal).find(h=>h.id===o);return s.json({ok:!0,attention_id:o,run_id:m.run.id,decision:i,session_status:"escalation_resumed",acknowledged_at:p?.acknowledged_at??null})}if(u.kind!=="interactive_waiting_operator")return s.json({ok:!1,reason:"wrong_kind",kind:u.kind},400);if(u.acknowledged_at!==null)return s.json({ok:!1,reason:"already_acked"},400);if(c.step_id===null)return s.json({ok:!1,reason:"no_step"},400);let d=t.dal.resumeInteractive(c.step_id,i,a);if(!d.resumed)return s.json({ok:!1,reason:d.reason,step_id:c.step_id},400);let f=t.dal.acknowledgeAttention(o);return Na(t.daemon),s.json({ok:!0,attention_id:o,step_id:c.step_id,session_status:d.session.status,acknowledged_at:f?.acknowledged_at??null})}),e.get("/api/submitted-prs",s=>{let o=s.req.query("pr_url"),i=s.req.query("status"),a=_h(t.dal,{status:i,pr_url:o});return H(s,a,mP)}),e.get("/api/submitted-prs/:id",s=>{let o=ne(s,"id"),i=gh(t.dal,o);return i===null?s.notFound():H(s,i,pP)}),e.get("/api/sessions",s=>H(s,t.dal.latestSessionSizes(),tE)),e.get("/api/sessions/:team_name/:alias/history",s=>{let o=ms(s.req.param("team_name"));return H(s,t.dal.sessionSizeHistory(o,s.req.param("alias")),tE)}),e.post("/api/sessions/:team_name/:alias/compact",async s=>{let o=ms(s.req.param("team_name"));try{let i=await ah(t.dal,o,s.req.param("alias"));return H(s,i,a=>rE("compacted",a.row))}catch(i){if(i instanceof fs)return s.text(i.message,409);throw i}}),e.post("/api/sessions/:team_name/:alias/refresh",async s=>{let o=ms(s.req.param("team_name")),i=await jc(t.dal,o,s.req.param("alias"));return H(s,i,a=>rE(`refreshed ${a.sessionid}`,a.row))}),e.get("/api/intake/state",s=>H(s,r,nE)),e.post("/api/intake/scan",async s=>(r=await kn(t.dal),H(s,r,nE))),e.get("/api/stats/run-throughput",s=>H(s,kh(t.dal),hP)),e.get("/api/daemon/state",s=>H(s,t.daemon?.state??null,_P)),e.post("/api/daemon/cycle",async s=>{if(t.daemon===void 0)return H(s,{disabled:!0},ue);let o=await t.daemon.runCycle();return H(s,{state:t.daemon.state,result:o},ue)}),e.get("/metrics/:project_id",s=>{let o=ne(s,"project_id"),i=t.dal.getProject(o);if(i===null)return s.notFound();let a=Fc(t.dal,o),l=Uc(t.dal,{project_id:o});return s.html(je(`Metrics \u2014 ${i.name}`,gP(i.name,a,l)))}),e.get("/api/metrics/reviewer/:project_id",s=>{let o=ne(s,"project_id");if(t.dal.getProject(o)===null)return s.notFound();let i=yd(s,"since_days");return s.json(Fc(t.dal,o,i))}),e.get("/api/metrics/tools/:project_id",s=>{let o=ne(s,"project_id");if(t.dal.getProject(o)===null)return s.notFound();let i=yd(s,"since_days");return s.json(Uc(t.dal,{project_id:o,since_days:i}))}),e.post("/api/drift/:id/ack",s=>{let o=t.dal.acknowledgeDriftSignal(ne(s,"id"));return o===null?s.notFound():s.json({id:o.id,acknowledged_at:o.acknowledged_at})}),e}function Zw(t,e,r){let n=Pc(e,ne(t,"id"),ne(t,"step_id"));return n===null?t.notFound():r(n)}function Na(t){t!==void 0&&t.runCycle().catch(()=>{})}function H(t,e,r,n=200){return oE(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 oE(t){let e=t.req.header("accept")??"";return e.includes("text/html")&&!e.includes("application/json")}function JD(){let t=process.env.LMCTL_WEBUI_DIST;if(t!==void 0)return Ia(`${t}/index.html`)?wd(t):null;let e="src/serve/webui-dist";if(Ia(`${e}/index.html`))return e;let r="dist/serve/webui-dist";if(Ia(`${r}/index.html`))return r;let n=WD(PD(HD(import.meta.url)),"webui-dist");return Ia(`${n}/index.html`)?wd(n):null}function wd(t){if(!UD(t))return t;let e=BD(process.cwd(),t);return e.length===0?".":e}function XD(){return async(t,e)=>{await e(),t.header("Cache-Control","no-store")}}function ne(t,e){return Number(t.req.param(e))}function yd(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 GD(t){switch(FD(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 VD(t){return!!(t.startsWith("text/")||t.startsWith("application/json")||t.startsWith("application/xml"))}async function Ln(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 KD(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 Qw(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 zD(t){if(t!=null)return typeof t=="string"&&iE.includes(t)?t:{error:`invalid severity: ${String(t)}`}}function ZD(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 QD(t){return`<h1>Status</h1><div class="grid">
1838
1837
  <div class="metric"><strong>${t.jobs.queued}</strong><br>queued jobs</div>
1839
1838
  <div class="metric"><strong>${t.jobs.done}</strong><br>done jobs</div>
1840
1839
  <div class="metric"><strong>${t.runs.active}</strong><br>active runs</div>
@@ -1883,11 +1882,11 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
1883
1882
  WHERE j.project_id = ?
1884
1883
  AND r.terminal_state IS NOT NULL
1885
1884
  ORDER BY r.id DESC
1886
- LIMIT ?`,r.id,3);if(n.length<3||!n.every(l=>t.query("SELECT 1 FROM step WHERE run_id = ? AND outcome = ? LIMIT 1",l.id,TP).length>0))continue;let o=n[0].team_id,i=t.listTeamMembers(o),a=i.find(l=>l.alias.toLowerCase().includes("coder"))??i[0];a!==void 0&&(t.hasUnackedDriftSignal(a.id,r.id,uE)||t.insertDriftSignal({team_member_id:a.id,project_id:r.id,signal_kind:uE,severity:"high",description:`3+ consecutive reviewer rejections (request_changes) for project ${r.name}`,detected_at:Date.now(),payload:JSON.stringify({run_ids:n.map(l=>l.id),consecutive_threshold:3})}))}}function dE(t){for(let e of SP)try{e(t)}catch{}}var TP,uE,SP,fE=E(()=>{"use strict";TP="request_changes",uE="reviewer_rejection_rate_high";SP=[bP]});function Fs(){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 mE(t){let e=t.intervalMs??Fs(),r=t.runOnceFn??Br,n={running:t.autoStart!==!1,in_flight:!1,interval_ms:e,cycles:0,jobs_processed:0,last_jobs_processed:0,last_started_at:null,last_finished_at:null,last_error:null,last_session_sizes_recorded:0,last_session_size_failures:0,last_intake_scanned:0,last_intake_new_jobs:0,last_intake_failures:0,last_session_hung_detected:0,last_session_monitor_checked_at:null,last_session_monitor_error:null},s=null,o=null,i=null,a=null,l=null;t.startRollupUpdaterFn!==!1&&(l=(t.startRollupUpdaterFn??lE)(t.dal));let c=f=>{n.running&&(s=setTimeout(()=>{d.runCycle().finally(()=>c(e))},f))},u=f=>{n.running&&(o=setTimeout(()=>{a===null&&(a=pE(t.dal,t.monitorSessionActivityFn??Oc,e,n).finally(()=>{a=null})),a.finally(()=>u(Lc(t.dal,e)))},f))},d={state:n,runCycle:async()=>(i!==null||(i=kP(t.dal,r,t.collectSessionSizesFn??ih,t.scanIntakeFn??kn,t.monitorSessionActivityFn??Oc,t.worker_id??"daemon",e,n).finally(()=>{i=null})),i),stop:async()=>{n.running=!1,s!==null&&clearTimeout(s),o!==null&&clearTimeout(o),l?.stop(),i!==null&&await i.catch(()=>{}),a!==null&&await a.catch(()=>{})}};if(n.running){let f=t.firstDelayMs??5e3;c(f),u(f)}return d}async function kP(t,e,r,n,s,o,i,a){a.in_flight=!0,a.last_started_at=new Date().toISOString(),a.last_error=null;let l=[],c=0,u=0,d=[],f=null;try{for(Py({dal:t}),dE({dal:t}),d=await n(t);;){let p=await e({dal:t,worker_id:o,lease_ms:6e5});if(p===null)break;l.push(p)}let m=await r(t);c=m.recorded,u=m.failed,f=await pE(t,s,i,a)}catch(m){a.last_error=m instanceof Error?m.message:String(m);try{t.raiseAttention({kind:"daemon_worker_failed",severity:"error",payload:JSON.stringify({error:a.last_error})})}catch{}}finally{a.in_flight=!1,a.cycles+=1,a.last_jobs_processed=l.length,a.last_session_sizes_recorded=c,a.last_session_size_failures=u,a.last_intake_scanned=d.reduce((m,p)=>m+p.scanned,0),a.last_intake_new_jobs=d.reduce((m,p)=>m+p.new_jobs,0),a.last_intake_failures=d.filter(m=>m.error!==void 0).length,a.last_session_hung_detected=f?.hung_detected??0,a.jobs_processed+=l.length,a.last_finished_at=new Date().toISOString()}return{jobs_processed:l.length,outcomes:l,session_sizes_recorded:c,session_size_failures:u,intake:d,session_monitor:f}}async function pE(t,e,r,n){let s=Lc(t,r),o=Date.now();if(n.last_session_monitor_checked_at!==null){let i=Date.parse(n.last_session_monitor_checked_at);if(Number.isFinite(i)&&o-i<s)return null}n.last_session_monitor_checked_at=new Date(o).toISOString(),n.last_session_monitor_error=null;try{return await e({dal:t,nowMs:o})}catch(i){n.last_session_monitor_error=i instanceof Error?i.message:String(i);try{t.raiseAttention({kind:"daemon_session_monitor_failed",severity:"error",payload:JSON.stringify({error:n.last_session_monitor_error})})}catch{}return null}}var Ed=E(()=>{"use strict";Bi();Ds();Yu();Ko();cE();fE();Cc()});function hE(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 _E=E(()=>{"use strict"});import{mkdirSync as vP,readFileSync as IP,readdirSync as NP,statSync as xP,writeFileSync as AP}from"node:fs";import{dirname as $P,join as yE,sep as gE}from"node:path";function xa(t){return{s3:{async send(n){let s=n;switch(s._localfsTag){case wE:return RP(t,s.input);case EE:return jP(t,s.input);case TE:return OP(t,s.input);default:throw new Error("createLocalFsS3Client: unknown command")}}},commands:{ListObjectsV2Command:Sd,GetObjectCommand:bd,PutObjectCommand:Td}}}function RP(t,e){let r=bE(t,e.Key);return vP($P(r),{recursive:!0}),AP(r,e.Body),{}}function jP(t,e){let r=bE(t,e.Key),n;try{n=IP(r)}catch(o){throw o.code==="ENOENT"?Object.assign(new Error("NoSuchKey"),{name:"NoSuchKey"}):o}let s=n.toString("utf-8");return{Body:{transformToString:async()=>s}}}function OP(t,e){let r=e.Prefix??"";SE(r);let s=LP(t).sort((u,d)=>u.key<d.key?-1:u.key>d.key?1:0).filter(u=>u.key.startsWith(r)),o=e.ContinuationToken;o!==void 0&&o!==""&&(s=s.filter(u=>u.key>o));let i=typeof e.MaxKeys=="number"&&Number.isFinite(e.MaxKeys)&&e.MaxKeys>0?Math.floor(e.MaxKeys):void 0,a=s,l=!1;i!==void 0&&s.length>i&&(a=s.slice(0,i),l=!0);let c={Contents:a.map(u=>({Key:u.key,LastModified:u.lastModified})),IsTruncated:l};return l&&(c.NextContinuationToken=a[a.length-1].key),c}function bE(t,e){return SE(e),yE(t,e)}function SE(t){if(t.split("/").includes(".."))throw new Error(`localfs-s3-client: refusing key/prefix with '..': ${t}`)}function LP(t){let e=[],r=(n,s)=>{let o;try{o=NP(n,{withFileTypes:!0})}catch(i){if(i.code==="ENOENT")return;throw i}for(let i of o){let a=s===""?i.name:`${s}/${i.name}`,l=yE(n,i.name);if(i.isDirectory())r(l,a);else if(i.isFile()){let c=gE==="/"?a:a.split(gE).join("/");e.push({key:c,lastModified:xP(l).mtime})}}};return r(t,""),e}var wE,EE,TE,Td,bd,Sd,kd=E(()=>{"use strict";wE="localfs-put",EE="localfs-get",TE="localfs-list",Td=class{input;_localfsTag=wE;constructor(e){this.input=e}},bd=class{input;_localfsTag=EE;constructor(e){this.input=e}},Sd=class{input;_localfsTag=TE;constructor(e){this.input=e}}});function kE(){return{put:0,get:0,list:0}}function vd(t,e=CP){return t.put*e.putUsd+t.get*e.getUsd+t.list*e.listUsd}function Id(t){let e=new Date(t),r=e.getUTCFullYear(),n=String(e.getUTCMonth()+1).padStart(2,"0");return`${r}-${n}`}var CP,Aa,Nd=E(()=>{"use strict";CP={putUsd:5e-6,getUsd:40000000000000003e-23,listUsd:5e-6};Aa=class{counts=kE();record(e,r=1){this.counts[e]+=r}peek(){return{...this.counts}}drain(){let e={...this.counts};return this.counts=kE(),e}estimateCostUsd(e){return vd(this.counts,e)}}});function vE(t){let e=t.now??Date.now,r=t.timers??MP,n=null,s=null;async function o(){let l=e(),c=Id(l),u=t.meter.drain();(u.put>0||u.get>0||u.list>0)&&t.store.addUsage({user_id:t.userId,device_id:t.deviceId,period:c,put:u.put,get:u.get,list:u.list,updated_at:new Date(l).toISOString()});let d=t.store.loadUsage(t.userId,t.deviceId,c),f=d?{put:d.put_count,get:d.get_count,list:d.list_count}:{put:0,get:0,list:0};if(t.publishOwnRollup!==void 0)try{await t.publishOwnRollup(c,f)}catch(_){t.log?.(`[usage] publish rollup failed: ${_ instanceof Error?_.message:String(_)}`)}let m=f;if(t.readUserTotal!==void 0)try{m=await t.readUserTotal(c)}catch(_){t.log?.(`[usage] read user total failed: ${_ instanceof Error?_.message:String(_)}`),m=f}let p=vd(m);if(n!==c&&p>=t.ceilingUsd){n=c,t.log?.(`[usage] quota exceeded period=${c} cost=$${p.toFixed(4)} >= ceiling $${t.ceilingUsd}`);try{t.onQuotaExceeded({period:c,costUsd:p,ceilingUsd:t.ceilingUsd})}catch(_){t.log?.(`[usage] onQuotaExceeded threw: ${_ instanceof Error?_.message:String(_)}`)}}}function i(){return s=(s??Promise.resolve()).then(()=>o()).catch(()=>{}),s}let a=r.setInterval(()=>{i()},t.intervalMs);return{stop(){r.clearInterval(a)},flushNow(){return i()},isOverQuota(){return n!==null&&n===Id(e())}}}var MP,IE=E(()=>{"use strict";Nd();MP={setInterval:(t,e)=>setInterval(t,e),clearInterval:t=>clearInterval(t)}});var xd=E(()=>{"use strict";fa();pa();pa()});function DP(t){if(typeof t!="object"||t===null||Array.isArray(t))return null;let e=t;if(typeof e.message_id!="string"||e.message_id==="")return null;if(typeof e.reply_to=="string"&&e.reply_to!==""){let s=e.response;if(typeof s!="object"||s===null)return null;let o=s;return typeof o.status!="number"?null:{message_id:e.message_id,reply_to:e.reply_to,response:o}}let r=e.request;if(typeof r!="object"||r===null)return null;let n=r;return typeof n.method!="string"||n.method===""||typeof n.path!="string"||n.path===""?null:{message_id:e.message_id,request:n}}function PP(t){return t.reply_to!==void 0&&t.response!==void 0}function FP(t){if(typeof t!="object"||t===null)return;let e=t.conversation_id;return typeof e=="string"?e:void 0}function NE(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 $a,Us,xE=E(()=>{"use strict";xd();$a=class extends Error{name="MailboxFetchStoppedError";code="mailbox_fetch_stopped";constructor(e="MailboxFetchClient stopped before a response arrived"){super(e)}},Us=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 $a("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=er(this.now(),this.random);if(this.pending.has(s))throw new Error(`MailboxFetchClient.fetch: duplicate message_id=${s}`);let o=r?.conversationId??s,i={message_id:s,request:e};return new Promise((a,l)=>{let c=r?.abortSignal,u;if(c!==void 0){if(c.aborted){l(NE(c));return}u=()=>{this.pending.has(s)&&(this.pending.delete(s),l(NE(c)))},c.addEventListener("abort",u,{once:!0})}this.pending.set(s,{resolve:a,reject:l,...u!==void 0?{abortListener:u}:{},...c!==void 0?{abortSignal:c}:{}}),this.client.putMessage({conversation_id:o,payload:i}).catch(d=>{let f=this.pending.get(s);f!==void 0&&(this.pending.delete(s),f.abortListener!==void 0&&f.abortSignal!==void 0&&f.abortSignal.removeEventListener("abort",f.abortListener),f.reject(d))})})}async stop(){if(this.stopped)return;this.stopped=!0;let e=Array.from(this.pending.values());this.pending.clear();let r=new $a;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=DP(e);if(n===null){this.log("MailboxFetchClient: dropping non-envelope inbound payload");return}if(PP(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??FP(e)??n.message_id,o;try{o=await this.requestHandler(n.request)}catch(l){let c=l instanceof Error?l.message:String(l),u=typeof l.code=="string"?l.code:"INTERNAL_ERROR";o={status:500,headers:{"content-type":"application/json"},body:{error:u,message:c}}}let a={message_id:er(this.now(),this.random),reply_to:n.message_id,response:o};try{await this.client.putMessage({conversation_id:s,payload:a})}catch(l){this.log(`MailboxFetchClient: response PUT failed for reply_to=${n.message_id}: ${l instanceof Error?l.message:String(l)}`)}}}});function Ad(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 AE=E(()=>{"use strict"});function $d(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 $E=E(()=>{"use strict"});function jd(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===""||typeof r.sender_teamfile!="string"||r.sender_teamfile===""||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 Rd,RE=E(()=>{"use strict";Rd="daemon:events"});function OE(t){return{kind:"prompt",prompt_id:t.prompt_id??er(t.now?.()??Date.now(),t.random??Math.random),root_teamfile:t.root_teamfile,text:t.text}}function Od(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 jE,Ld=E(()=>{"use strict";xd();jE="prompt:root"});function Ws(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(CE(e[1]));return typeof r.sub=="string"&&r.sub!==""?r.sub:null}catch{return null}}function UP(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(CE(e[1]));return typeof r.exp=="number"&&Number.isFinite(r.exp)?r.exp:null}catch{return null}}function LE(t,e=60){if(typeof t!="string"||t==="")return!0;let r=UP(t);return r===null?!0:Date.now()/1e3>=r-e}function CE(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 Cd=E(()=>{"use strict"});async function Ra(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":WP},body:JSON.stringify({AuthFlow:"REFRESH_TOKEN_AUTH",ClientId:t.clientId,AuthParameters:{REFRESH_TOKEN:t.refreshToken}})}),s=await n.text();if(!n.ok){let l=s;try{let c=JSON.parse(s);l=c.message??c.__type??s}catch{}throw new Error(`cognito_refresh_failed: ${n.status} ${l}`)}let i=JSON.parse(s).AuthenticationResult,a=i?.IdToken;if(typeof a!="string"||a==="")throw new Error("cognito_refresh_no_id_token: InitiateAuth returned no IdToken");return{idToken:a,...typeof i?.AccessToken=="string"&&i.AccessToken!==""?{accessToken:i.AccessToken}:{},...typeof i?.ExpiresIn=="number"&&Number.isFinite(i.ExpiresIn)?{expiresAt:Date.now()+i.ExpiresIn*1e3}:{}}}var WP,Md=E(()=>{"use strict";WP="AWSCognitoIdentityProviderService.InitiateAuth"});import{chmodSync as ME,mkdirSync as DE,readFileSync as PE,writeFileSync as FE}from"node:fs";import{homedir as UE}from"node:os";import{dirname as WE,join as BE}from"node:path";function Bs(){return process.env.LMCTL_DEVICE_AUTH_PATH??BE(UE(),".lmctl","device-auth.json")}function HE(){return process.env.LMCTL_TOKEN_PATH??BE(UE(),".lmctl","cli-tokens.json")}function Dd(t=Bs()){try{let e=JSON.parse(PE(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 qE(t,e=Bs()){DE(WE(e),{recursive:!0,mode:448}),FE(e,JSON.stringify(t,null,2));try{ME(e,384)}catch{}}function Pd(t,e=HE()){let r={};try{r=JSON.parse(PE(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};DE(WE(e),{recursive:!0,mode:448}),FE(e,JSON.stringify(s,null,2));try{ME(e,384)}catch{}}async function JE(t){let e=t.deviceAuthPath??Bs(),r=Dd(e);if(r===null)throw new Error("device_auth_not_found: no ~/.lmctl/device-auth.json; run `lmctl device login` first");let n=await Ra({region:t.region,clientId:t.clientId,refreshToken:r.refreshToken,...t.fetchImpl!==void 0?{fetchImpl:t.fetchImpl}:{}});return Pd({idToken:n.idToken,...n.accessToken!==void 0?{accessToken:n.accessToken}:{},refreshToken:r.refreshToken,...n.expiresAt!==void 0?{expiresAt:n.expiresAt}:{}},t.cliTokensPath??HE()),{idToken:n.idToken,userId:r.userId}}var Fd=E(()=>{"use strict";Md()});function XE(t){if(t.length===0||!t.startsWith("---"))throw new Rt("frontmatter must start at line 1 with `---` on its own line");let e=t.split(`
1887
- `);if(e[0]!=="---")throw new Rt("frontmatter must start at line 1 with `---` on its own line");let r={},n=-1;for(let i=1;i<e.length;i++){let a=e[i];if(a==="---"){n=i;break}if(a.trim()==="")continue;let l=a.match(/^([a-zA-Z][a-zA-Z0-9_-]*)\s*:\s*(.*)$/);if(!l)throw new Rt(`malformed frontmatter line ${i+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let c=l[1],u=l[2].trim();if(!BP.has(c))throw new Rt(`unknown frontmatter key "${c}" \u2014 allowed keys: ${ja.join(", ")}`);r[c]=u}if(n===-1)throw new Rt("frontmatter not closed (missing trailing `---` on its own line)");for(let i of ja)if(r[i]===void 0)throw new Rt(`missing required frontmatter key "${i}" \u2014 required: ${ja.join(", ")}`);let s=0;for(let i=0;i<=n;i++)s+=e[i].length+1;s>t.length&&(s=t.length);let o=r.members.split(",").map(i=>i.trim()).filter(Boolean);return{title:r.title,description:r.description,members:o,bodyOffset:s}}var ja,BP,Rt,GE=E(()=>{"use strict";ja=["title","description","members"],BP=new Set(ja),Rt=class extends Error{constructor(e){super(e),this.name="FrontmatterError"}}});import{readFileSync as HP,writeFileSync as p6,renameSync as h6,existsSync as KE}from"node:fs";import{basename as qP,resolve as Cn,dirname as Ud}from"node:path";function XP(t){let e={},r=/(\w+)=(?:"([^"]*)"|([\S]*))/g,n;for(;(n=r.exec(t))!==null;){let s=n[1],o=n[2]!==void 0?n[2]:n[3];e[s]=o}return e}function GP(t){return/^\s*_MEMBER_\s+\S/.test(t)}function VP(t){return/^\s*_SESSION_\s+\S/.test(t)}function KP(t){return/^\s*_SKILL_(?:\s|$)/.test(t)}function Oa(t){let e=qP(t);return e.endsWith(".lmctl")?e.slice(0,-6):e}function De(t){let e=HP(t,"utf-8"),r=Ud(Cn(t)),n=Bd(e,Oa(t),{baseDir:r,sourcePath:Cn(t)});for(let s of n.members)s.sessiondir&&!s.sessiondir.startsWith("/")&&(s.sessiondir=Cn(r,s.sessiondir));return n}function Bd(t,e,r={}){let n=[],s=[];r.sourcePath,r.baseDir;let o=t;if(o.startsWith("#teamfile:")){let l=o.indexOf(`
1885
+ LIMIT ?`,r.id,3);if(n.length<3||!n.every(l=>t.query("SELECT 1 FROM step WHERE run_id = ? AND outcome = ? LIMIT 1",l.id,TP).length>0))continue;let o=n[0].team_id,i=t.listTeamMembers(o),a=i.find(l=>l.alias.toLowerCase().includes("coder"))??i[0];a!==void 0&&(t.hasUnackedDriftSignal(a.id,r.id,uE)||t.insertDriftSignal({team_member_id:a.id,project_id:r.id,signal_kind:uE,severity:"high",description:`3+ consecutive reviewer rejections (request_changes) for project ${r.name}`,detected_at:Date.now(),payload:JSON.stringify({run_ids:n.map(l=>l.id),consecutive_threshold:3})}))}}function dE(t){for(let e of SP)try{e(t)}catch{}}var TP,uE,SP,fE=E(()=>{"use strict";TP="request_changes",uE="reviewer_rejection_rate_high";SP=[bP]});function Fs(){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 mE(t){let e=t.intervalMs??Fs(),r=t.runOnceFn??Br,n={running:t.autoStart!==!1,in_flight:!1,interval_ms:e,cycles:0,jobs_processed:0,last_jobs_processed:0,last_started_at:null,last_finished_at:null,last_error:null,last_session_sizes_recorded:0,last_session_size_failures:0,last_intake_scanned:0,last_intake_new_jobs:0,last_intake_failures:0,last_session_hung_detected:0,last_session_monitor_checked_at:null,last_session_monitor_error:null},s=null,o=null,i=null,a=null,l=null;t.startRollupUpdaterFn!==!1&&(l=(t.startRollupUpdaterFn??lE)(t.dal));let c=f=>{n.running&&(s=setTimeout(()=>{d.runCycle().finally(()=>c(e))},f))},u=f=>{n.running&&(o=setTimeout(()=>{a===null&&(a=pE(t.dal,t.monitorSessionActivityFn??Oc,e,n).finally(()=>{a=null})),a.finally(()=>u(Lc(t.dal,e)))},f))},d={state:n,runCycle:async()=>(i!==null||(i=kP(t.dal,r,t.collectSessionSizesFn??ih,t.scanIntakeFn??kn,t.monitorSessionActivityFn??Oc,t.worker_id??"daemon",e,n).finally(()=>{i=null})),i),stop:async()=>{n.running=!1,s!==null&&clearTimeout(s),o!==null&&clearTimeout(o),l?.stop(),i!==null&&await i.catch(()=>{}),a!==null&&await a.catch(()=>{})}};if(n.running){let f=t.firstDelayMs??5e3;c(f),u(f)}return d}async function kP(t,e,r,n,s,o,i,a){a.in_flight=!0,a.last_started_at=new Date().toISOString(),a.last_error=null;let l=[],c=0,u=0,d=[],f=null;try{for(Py({dal:t}),dE({dal:t}),d=await n(t);;){let p=await e({dal:t,worker_id:o,lease_ms:6e5});if(p===null)break;l.push(p)}let m=await r(t);c=m.recorded,u=m.failed,f=await pE(t,s,i,a)}catch(m){a.last_error=m instanceof Error?m.message:String(m);try{t.raiseAttention({kind:"daemon_worker_failed",severity:"error",payload:JSON.stringify({error:a.last_error})})}catch{}}finally{a.in_flight=!1,a.cycles+=1,a.last_jobs_processed=l.length,a.last_session_sizes_recorded=c,a.last_session_size_failures=u,a.last_intake_scanned=d.reduce((m,p)=>m+p.scanned,0),a.last_intake_new_jobs=d.reduce((m,p)=>m+p.new_jobs,0),a.last_intake_failures=d.filter(m=>m.error!==void 0).length,a.last_session_hung_detected=f?.hung_detected??0,a.jobs_processed+=l.length,a.last_finished_at=new Date().toISOString()}return{jobs_processed:l.length,outcomes:l,session_sizes_recorded:c,session_size_failures:u,intake:d,session_monitor:f}}async function pE(t,e,r,n){let s=Lc(t,r),o=Date.now();if(n.last_session_monitor_checked_at!==null){let i=Date.parse(n.last_session_monitor_checked_at);if(Number.isFinite(i)&&o-i<s)return null}n.last_session_monitor_checked_at=new Date(o).toISOString(),n.last_session_monitor_error=null;try{return await e({dal:t,nowMs:o})}catch(i){n.last_session_monitor_error=i instanceof Error?i.message:String(i);try{t.raiseAttention({kind:"daemon_session_monitor_failed",severity:"error",payload:JSON.stringify({error:n.last_session_monitor_error})})}catch{}return null}}var Ed=E(()=>{"use strict";Bi();Ds();Yu();Ko();cE();fE();Cc()});function hE(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 _E=E(()=>{"use strict"});import{mkdirSync as vP,readFileSync as IP,readdirSync as NP,statSync as xP,writeFileSync as AP}from"node:fs";import{dirname as $P,join as yE,sep as gE}from"node:path";function xa(t){return{s3:{async send(n){let s=n;switch(s._localfsTag){case wE:return RP(t,s.input);case EE:return jP(t,s.input);case TE:return OP(t,s.input);default:throw new Error("createLocalFsS3Client: unknown command")}}},commands:{ListObjectsV2Command:Sd,GetObjectCommand:bd,PutObjectCommand:Td}}}function RP(t,e){let r=bE(t,e.Key);return vP($P(r),{recursive:!0}),AP(r,e.Body),{}}function jP(t,e){let r=bE(t,e.Key),n;try{n=IP(r)}catch(o){throw o.code==="ENOENT"?Object.assign(new Error("NoSuchKey"),{name:"NoSuchKey"}):o}let s=n.toString("utf-8");return{Body:{transformToString:async()=>s}}}function OP(t,e){let r=e.Prefix??"";SE(r);let s=LP(t).sort((u,d)=>u.key<d.key?-1:u.key>d.key?1:0).filter(u=>u.key.startsWith(r)),o=e.ContinuationToken;o!==void 0&&o!==""&&(s=s.filter(u=>u.key>o));let i=typeof e.MaxKeys=="number"&&Number.isFinite(e.MaxKeys)&&e.MaxKeys>0?Math.floor(e.MaxKeys):void 0,a=s,l=!1;i!==void 0&&s.length>i&&(a=s.slice(0,i),l=!0);let c={Contents:a.map(u=>({Key:u.key,LastModified:u.lastModified})),IsTruncated:l};return l&&(c.NextContinuationToken=a[a.length-1].key),c}function bE(t,e){return SE(e),yE(t,e)}function SE(t){if(t.split("/").includes(".."))throw new Error(`localfs-s3-client: refusing key/prefix with '..': ${t}`)}function LP(t){let e=[],r=(n,s)=>{let o;try{o=NP(n,{withFileTypes:!0})}catch(i){if(i.code==="ENOENT")return;throw i}for(let i of o){let a=s===""?i.name:`${s}/${i.name}`,l=yE(n,i.name);if(i.isDirectory())r(l,a);else if(i.isFile()){let c=gE==="/"?a:a.split(gE).join("/");e.push({key:c,lastModified:xP(l).mtime})}}};return r(t,""),e}var wE,EE,TE,Td,bd,Sd,kd=E(()=>{"use strict";wE="localfs-put",EE="localfs-get",TE="localfs-list",Td=class{input;_localfsTag=wE;constructor(e){this.input=e}},bd=class{input;_localfsTag=EE;constructor(e){this.input=e}},Sd=class{input;_localfsTag=TE;constructor(e){this.input=e}}});function kE(){return{put:0,get:0,list:0}}function vd(t,e=CP){return t.put*e.putUsd+t.get*e.getUsd+t.list*e.listUsd}function Id(t){let e=new Date(t),r=e.getUTCFullYear(),n=String(e.getUTCMonth()+1).padStart(2,"0");return`${r}-${n}`}var CP,Aa,Nd=E(()=>{"use strict";CP={putUsd:5e-6,getUsd:40000000000000003e-23,listUsd:5e-6};Aa=class{counts=kE();record(e,r=1){this.counts[e]+=r}peek(){return{...this.counts}}drain(){let e={...this.counts};return this.counts=kE(),e}estimateCostUsd(e){return vd(this.counts,e)}}});function vE(t){let e=t.now??Date.now,r=t.timers??MP,n=null,s=null;async function o(){let l=e(),c=Id(l),u=t.meter.drain();(u.put>0||u.get>0||u.list>0)&&t.store.addUsage({user_id:t.userId,device_id:t.deviceId,period:c,put:u.put,get:u.get,list:u.list,updated_at:new Date(l).toISOString()});let d=t.store.loadUsage(t.userId,t.deviceId,c),f=d?{put:d.put_count,get:d.get_count,list:d.list_count}:{put:0,get:0,list:0};if(t.publishOwnRollup!==void 0)try{await t.publishOwnRollup(c,f)}catch(h){t.log?.(`[usage] publish rollup failed: ${h instanceof Error?h.message:String(h)}`)}let m=f;if(t.readUserTotal!==void 0)try{m=await t.readUserTotal(c)}catch(h){t.log?.(`[usage] read user total failed: ${h instanceof Error?h.message:String(h)}`),m=f}let p=vd(m);if(n!==c&&p>=t.ceilingUsd){n=c,t.log?.(`[usage] quota exceeded period=${c} cost=$${p.toFixed(4)} >= ceiling $${t.ceilingUsd}`);try{t.onQuotaExceeded({period:c,costUsd:p,ceilingUsd:t.ceilingUsd})}catch(h){t.log?.(`[usage] onQuotaExceeded threw: ${h instanceof Error?h.message:String(h)}`)}}}function i(){return s=(s??Promise.resolve()).then(()=>o()).catch(()=>{}),s}let a=r.setInterval(()=>{i()},t.intervalMs);return{stop(){r.clearInterval(a)},flushNow(){return i()},isOverQuota(){return n!==null&&n===Id(e())}}}var MP,IE=E(()=>{"use strict";Nd();MP={setInterval:(t,e)=>setInterval(t,e),clearInterval:t=>clearInterval(t)}});var xd=E(()=>{"use strict";fa();pa();pa()});function DP(t){if(typeof t!="object"||t===null||Array.isArray(t))return null;let e=t;if(typeof e.message_id!="string"||e.message_id==="")return null;if(typeof e.reply_to=="string"&&e.reply_to!==""){let s=e.response;if(typeof s!="object"||s===null)return null;let o=s;return typeof o.status!="number"?null:{message_id:e.message_id,reply_to:e.reply_to,response:o}}let r=e.request;if(typeof r!="object"||r===null)return null;let n=r;return typeof n.method!="string"||n.method===""||typeof n.path!="string"||n.path===""?null:{message_id:e.message_id,request:n}}function PP(t){return t.reply_to!==void 0&&t.response!==void 0}function FP(t){if(typeof t!="object"||t===null)return;let e=t.conversation_id;return typeof e=="string"?e:void 0}function NE(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 $a,Us,xE=E(()=>{"use strict";xd();$a=class extends Error{name="MailboxFetchStoppedError";code="mailbox_fetch_stopped";constructor(e="MailboxFetchClient stopped before a response arrived"){super(e)}},Us=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 $a("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=er(this.now(),this.random);if(this.pending.has(s))throw new Error(`MailboxFetchClient.fetch: duplicate message_id=${s}`);let o=r?.conversationId??s,i={message_id:s,request:e};return new Promise((a,l)=>{let c=r?.abortSignal,u;if(c!==void 0){if(c.aborted){l(NE(c));return}u=()=>{this.pending.has(s)&&(this.pending.delete(s),l(NE(c)))},c.addEventListener("abort",u,{once:!0})}this.pending.set(s,{resolve:a,reject:l,...u!==void 0?{abortListener:u}:{},...c!==void 0?{abortSignal:c}:{}}),this.client.putMessage({conversation_id:o,payload:i}).catch(d=>{let f=this.pending.get(s);f!==void 0&&(this.pending.delete(s),f.abortListener!==void 0&&f.abortSignal!==void 0&&f.abortSignal.removeEventListener("abort",f.abortListener),f.reject(d))})})}async stop(){if(this.stopped)return;this.stopped=!0;let e=Array.from(this.pending.values());this.pending.clear();let r=new $a;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=DP(e);if(n===null){this.log("MailboxFetchClient: dropping non-envelope inbound payload");return}if(PP(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??FP(e)??n.message_id,o;try{o=await this.requestHandler(n.request)}catch(l){let c=l instanceof Error?l.message:String(l),u=typeof l.code=="string"?l.code:"INTERNAL_ERROR";o={status:500,headers:{"content-type":"application/json"},body:{error:u,message:c}}}let a={message_id:er(this.now(),this.random),reply_to:n.message_id,response:o};try{await this.client.putMessage({conversation_id:s,payload:a})}catch(l){this.log(`MailboxFetchClient: response PUT failed for reply_to=${n.message_id}: ${l instanceof Error?l.message:String(l)}`)}}}});function Ad(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 AE=E(()=>{"use strict"});function $d(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 $E=E(()=>{"use strict"});function jd(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===""||typeof r.sender_teamfile!="string"||r.sender_teamfile===""||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 Rd,RE=E(()=>{"use strict";Rd="daemon:events"});function OE(t){return{kind:"prompt",prompt_id:t.prompt_id??er(t.now?.()??Date.now(),t.random??Math.random),root_teamfile:t.root_teamfile,text:t.text}}function Od(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 jE,Ld=E(()=>{"use strict";xd();jE="prompt:root"});function Ws(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(CE(e[1]));return typeof r.sub=="string"&&r.sub!==""?r.sub:null}catch{return null}}function UP(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(CE(e[1]));return typeof r.exp=="number"&&Number.isFinite(r.exp)?r.exp:null}catch{return null}}function LE(t,e=60){if(typeof t!="string"||t==="")return!0;let r=UP(t);return r===null?!0:Date.now()/1e3>=r-e}function CE(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 Cd=E(()=>{"use strict"});async function Ra(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":WP},body:JSON.stringify({AuthFlow:"REFRESH_TOKEN_AUTH",ClientId:t.clientId,AuthParameters:{REFRESH_TOKEN:t.refreshToken}})}),s=await n.text();if(!n.ok){let l=s;try{let c=JSON.parse(s);l=c.message??c.__type??s}catch{}throw new Error(`cognito_refresh_failed: ${n.status} ${l}`)}let i=JSON.parse(s).AuthenticationResult,a=i?.IdToken;if(typeof a!="string"||a==="")throw new Error("cognito_refresh_no_id_token: InitiateAuth returned no IdToken");return{idToken:a,...typeof i?.AccessToken=="string"&&i.AccessToken!==""?{accessToken:i.AccessToken}:{},...typeof i?.ExpiresIn=="number"&&Number.isFinite(i.ExpiresIn)?{expiresAt:Date.now()+i.ExpiresIn*1e3}:{}}}var WP,Md=E(()=>{"use strict";WP="AWSCognitoIdentityProviderService.InitiateAuth"});import{chmodSync as ME,mkdirSync as DE,readFileSync as PE,writeFileSync as FE}from"node:fs";import{homedir as UE}from"node:os";import{dirname as WE,join as BE}from"node:path";function Bs(){return process.env.LMCTL_DEVICE_AUTH_PATH??BE(UE(),".lmctl","device-auth.json")}function HE(){return process.env.LMCTL_TOKEN_PATH??BE(UE(),".lmctl","cli-tokens.json")}function Dd(t=Bs()){try{let e=JSON.parse(PE(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 qE(t,e=Bs()){DE(WE(e),{recursive:!0,mode:448}),FE(e,JSON.stringify(t,null,2));try{ME(e,384)}catch{}}function Pd(t,e=HE()){let r={};try{r=JSON.parse(PE(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};DE(WE(e),{recursive:!0,mode:448}),FE(e,JSON.stringify(s,null,2));try{ME(e,384)}catch{}}async function JE(t){let e=t.deviceAuthPath??Bs(),r=Dd(e);if(r===null)throw new Error("device_auth_not_found: no ~/.lmctl/device-auth.json; run `lmctl device login` first");let n=await Ra({region:t.region,clientId:t.clientId,refreshToken:r.refreshToken,...t.fetchImpl!==void 0?{fetchImpl:t.fetchImpl}:{}});return Pd({idToken:n.idToken,...n.accessToken!==void 0?{accessToken:n.accessToken}:{},refreshToken:r.refreshToken,...n.expiresAt!==void 0?{expiresAt:n.expiresAt}:{}},t.cliTokensPath??HE()),{idToken:n.idToken,userId:r.userId}}var Fd=E(()=>{"use strict";Md()});function XE(t){if(t.length===0||!t.startsWith("---"))throw new Rt("frontmatter must start at line 1 with `---` on its own line");let e=t.split(`
1886
+ `);if(e[0]!=="---")throw new Rt("frontmatter must start at line 1 with `---` on its own line");let r={},n=-1;for(let i=1;i<e.length;i++){let a=e[i];if(a==="---"){n=i;break}if(a.trim()==="")continue;let l=a.match(/^([a-zA-Z][a-zA-Z0-9_-]*)\s*:\s*(.*)$/);if(!l)throw new Rt(`malformed frontmatter line ${i+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let c=l[1],u=l[2].trim();if(!BP.has(c))throw new Rt(`unknown frontmatter key "${c}" \u2014 allowed keys: ${ja.join(", ")}`);r[c]=u}if(n===-1)throw new Rt("frontmatter not closed (missing trailing `---` on its own line)");for(let i of ja)if(r[i]===void 0)throw new Rt(`missing required frontmatter key "${i}" \u2014 required: ${ja.join(", ")}`);let s=0;for(let i=0;i<=n;i++)s+=e[i].length+1;s>t.length&&(s=t.length);let o=r.members.split(",").map(i=>i.trim()).filter(Boolean);return{title:r.title,description:r.description,members:o,bodyOffset:s}}var ja,BP,Rt,GE=E(()=>{"use strict";ja=["title","description","members"],BP=new Set(ja),Rt=class extends Error{constructor(e){super(e),this.name="FrontmatterError"}}});import{readFileSync as HP,writeFileSync as p6,renameSync as h6,existsSync as KE}from"node:fs";import{basename as qP,resolve as Cn,dirname as Ud}from"node:path";function XP(t){let e={},r=/(\w+)=(?:"([^"]*)"|([\S]*))/g,n;for(;(n=r.exec(t))!==null;){let s=n[1],o=n[2]!==void 0?n[2]:n[3];e[s]=o}return e}function GP(t){return/^\s*_MEMBER_\s+\S/.test(t)}function VP(t){return/^\s*_SESSION_\s+\S/.test(t)}function KP(t){return/^\s*_SKILL_(?:\s|$)/.test(t)}function Oa(t){let e=qP(t);return e.endsWith(".lmctl")?e.slice(0,-6):e}function Pe(t){let e=HP(t,"utf-8"),r=Ud(Cn(t)),n=Bd(e,Oa(t),{baseDir:r,sourcePath:Cn(t)});for(let s of n.members)s.sessiondir&&!s.sessiondir.startsWith("/")&&(s.sessiondir=Cn(r,s.sessiondir));return n}function Bd(t,e,r={}){let n=[],s=[];r.sourcePath,r.baseDir;let o=t;if(o.startsWith("#teamfile:")){let l=o.indexOf(`
1888
1887
  `);o=l>=0?o.slice(l+1):""}let i=null;if(o.startsWith("---"))try{i=XE(o)}catch(l){if(l instanceof Rt)s.push(`frontmatter: ${l.message}`);else throw l}let a=t.split(`
1889
1888
  `);for(let l=0;l<a.length;l++){let c=a[l],u=l+1;if(VP(c))throw new Error(`line ${u}: _SESSION_ is the legacy prefix. Rename to _MEMBER_. (line: ${c.trim()})`);if(KP(c)||!GP(c))continue;let d=XP(c);for(let p of Object.keys(d))if(!VE.includes(p))throw new Error(`line ${u}: unknown key "${p}" on _MEMBER_ line: ${c.trim()}
1890
- allowed keys: ${VE.join(", ")}`);if(!d.provider&&!d.teamfile){s.push(`line ${u}: member line missing provider (or teamfile): ${c.trim()}`);continue}let m={alias:d.alias||`member${n.length+1}`,provider:d.provider||"",extra:{}};d.sessionid&&(m.session=d.sessionid),Object.prototype.hasOwnProperty.call(d,"sessiondir")&&(m.sessiondir=d.sessiondir),d.teamfile&&(m.teamfile=d.teamfile),d.model&&(m.model=d.model),d.effort&&(m.effort=d.effort),n.push(m)}return{name:e,members:n,rawText:t,parseErrors:s,frontmatter:i}}function Hd(t,e){let r=[];for(let o of t.parseErrors)r.push({field:"session",message:o});let n=t.members.filter(o=>o.alias.toLowerCase()===Wd.toLowerCase());n.length>1&&r.push({field:Wd,message:`${n.length} alias=Lead found (max 1)`});let s=new Set;for(let o of t.members){let i=o.alias.toLowerCase();if(s.has(i)&&r.push({field:o.alias,message:`Duplicate alias "${o.alias}" (case-insensitive)`}),s.add(i),o.teamfile){let a=e?Cn(e,o.teamfile):Cn(o.teamfile);if(!KE(a))r.push({field:o.alias,message:`Teamfile not found: ${a}`});else{let l=De(a),c=jt(l);c?c.session||r.push({field:o.alias,message:`Team at ${o.teamfile} lead has no session ID. Run: lmctl seed`}):r.push({field:o.alias,message:`Team at ${o.teamfile} has no lead session`})}}else JP.has(o.provider)||r.push({field:o.alias,message:`Invalid provider "${o.provider}"`});o.sessiondir!==void 0&&o.sessiondir===""&&r.push({field:o.alias,message:"sessiondir is empty"})}return r}function jt(t){return t.members.find(e=>e.alias.toLowerCase()===Wd.toLowerCase())}function qd(t,e,r,n={}){let s=n.requireSession??!0;if(!t.teamfile)throw new Error(`Member "${t.alias}" is not a team reference`);let o=Cn(e,t.teamfile),i=r??new Set;if(i.has(o))throw new Error(`Circular team reference: ${t.alias} \u2192 ${o} (already visited: ${[...i].join(" \u2192 ")})`);if(i.add(o),!KE(o))throw new Error(`Teamfile not found: ${o} (referenced by alias "${t.alias}")`);let a=De(o),l=jt(a);if(!l)throw new Error(`Team at ${o} has no lead session`);if(l.teamfile)return qd(l,Ud(o),i,n);if(s&&!l.session)throw new Error(`Team at ${o} lead has no session ID. Run: lmctl seed`);return{provider:l.provider,session:l.session??"",sessiondir:l.sessiondir||Ud(o),alias:t.alias,resolvedFrom:o,model:l.model,effort:l.effort}}function Mn(t,e){return t.members.find(r=>r.alias===e)??t.members.find(r=>r.alias.toLowerCase()===e.toLowerCase())}var Wd,JP,VE,Ot=E(()=>{"use strict";GE();Wd="Lead",JP=new Set(["claude","codex","opencode","lmplayer","gemini","copilot","qwen","agy","ClaudeMock"]);VE=["alias","provider","sessionid","sessiondir","teamfile","model","effort"]});function Dn(t){if(!Number.isInteger(t)||(t??0)<=0)return!1;try{return process.kill(t,0),!0}catch(e){return(e!==null&&typeof e=="object"&&"code"in e?e.code:void 0)!=="ESRCH"}}var La=E(()=>{"use strict"});function Pn(t,e){let r=new Date().toISOString(),n=new Date(Date.now()-e.ttlMs).toISOString(),s={receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,started_at:r},o=t.getAgentInflight(e.receiver_teamfile,e.receiver_alias),i=o===null||o.holder_pid===null,a=t.tryAcquireAgentInflight(s,{...i?{stale_before:n}:{},force:e.force});if(a.acquired){let c=o===null?null:e.force===!0?"force":o.holder_pid===null&&o.started_at<n?"stale":null;return{acquired:!0,lease:a.current??s,previous:o,reclaimReason:c}}if(!YP(a.current,n))return{acquired:!1,current:a.current};let l=t.tryAcquireAgentInflight(s,a.current.holder_pid===null?{stale_before:n}:{reclaim_observed:{sender_teamfile:a.current.sender_teamfile,sender_alias:a.current.sender_alias,started_at:a.current.started_at,holder_pid:a.current.holder_pid}});return l.acquired?{acquired:!0,lease:l.current??s,previous:a.current,reclaimReason:a.current.holder_pid===null?"stale":"dead-pid"}:{acquired:!1,current:l.current}}function YP(t,e){return t.holder_pid===null?t.started_at<e:!Dn(t.holder_pid)}var Ca=E(()=>{"use strict";La()});import{existsSync as zP,realpathSync as ZP}from"node:fs";import{dirname as QP}from"node:path";function Jd(t){e1(t).catch(e=>{t.log?.(`[mailbox] prompt trigger failed: ${e instanceof Error?e.message:String(e)}`)})}async function e1(t){let e=t.payload.root_teamfile;try{e=ZP(t.payload.root_teamfile)}catch(s){let o=`prompt root missing/unreadable: ${t.payload.root_teamfile}: ${s instanceof Error?s.message:String(s)}`;return await Fn(t.store,{rootTeamfile:t.payload.root_teamfile,receiverTeamfile:t.payload.root_teamfile,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:o,log:t.log}),t.log?.(`[mailbox] ${o}`),{status:"error",response:null,error_detail:o}}if(t.store.getRootTeam(e)===null){let s=`prompt root is not registered: ${e}`;return await Fn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:s,log:t.log}),t.log?.(`[mailbox] ${s}`),{status:"error",response:null,error_detail:s}}let r=t1(e);if("error"in r)return await Fn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:r.error,log:t.log}),t.log?.(`[mailbox] ${r.error}`),{status:"error",response:null,error_detail:r.error};let n=Pn(t.store,{receiver_teamfile:e,receiver_alias:r.alias,sender_teamfile:`prompt:${t.payload.prompt_id}`,sender_alias:"operator",ttlMs:s1(t.env??process.env)});if(!n.acquired){let s=n1(r.alias,n.current);return await Fn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:null,status:"error",error_detail:s,log:t.log}),t.log?.(`[mailbox] prompt rejected: ${s}`),{status:"error",response:null,error_detail:s}}try{let o=await(t.chat??Xt)({provider:r.provider,sessionId:r.sessionid,cwd:r.sessiondir,prompt:t.payload.text,env:t.env??process.env,alias:r.alias,permissionMode:"yolo",...t.timeoutMs!==void 0?{timeoutMs:t.timeoutMs}:{}}),i=o.status==="stalled",a=!i&&o.text.trim()==="",l=i?`provider stalled${o.stalledAfterMs!==void 0?` after ${o.stalledAfterMs}ms`:""}`:a?"provider returned empty response":null,c=i||a?"error":"ok";return await Fn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:c==="error"?null:o.text,status:c,error_detail:l,log:t.log}),{status:c,response:c==="error"?null:o.text,error_detail:l}}catch(s){let o=s instanceof Error?s.message:String(s);return await Fn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:null,status:"error",error_detail:o,log:t.log}),t.log?.(`[mailbox] prompt provider error: ${o}`),{status:"error",response:null,error_detail:o}}finally{try{t.store.releaseAgentInflight(n.lease)}catch(s){t.log?.(`[mailbox] failed to release prompt in-flight slot: ${s instanceof Error?s.message:String(s)}`)}}}function t1(t){if(!zP(t))return{error:`prompt root missing/unreadable: ${t}`};let e=De(t);if(e.parseErrors.length>0)return{error:`prompt root parse error: ${e.parseErrors.join("; ")}`};let r=jt(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??QP(t)}}async function Fn(t,e){let r=ZE(e.message),n=e.response===null?null:ZE(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,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 ZE(t){return t.length<=YE?{text:t,truncated:!1}:{text:t.slice(0,YE),truncated:!0}}function r1(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}function n1(t,e){return e.sender_teamfile.startsWith("prompt:")?`${t} is busy servicing another prompt since ${e.started_at}`:r1(t,e)}function s1(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return zE;let r=Number(e);return!Number.isFinite(r)||r<=0?zE:r}var YE,zE,QE=E(()=>{"use strict";It();Ot();Ca();YE=256*1024,zE=30*60*1e3});import{chmodSync as oT,existsSync as o1,mkdirSync as iT,readFileSync as Fa,writeFileSync as aT}from"node:fs";import{dirname as Xd,resolve as Ma,join as lT}from"node:path";import{fileURLToPath as i1}from"node:url";import{homedir as cT}from"node:os";import{CognitoIdentityClient as a1,GetIdCommand as l1}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as eT}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as c1,ListObjectsV2Command as u1,PutObjectCommand as d1,S3Client as tT}from"@aws-sdk/client-s3";function qs(t={}){let e=t.env??process.env,r=t.tfstatePath!==void 0?[t.tfstatePath]:_1(t.selfUrl),n={},s;for(let N of r)if(o1(N)){n=h1(N),s=N;break}let o=(...N)=>{for(let v of N)if(typeof v=="string"&&v!=="")return v},i=o(e.LMCTL_NEXT_IDENTITY_POOL_ID,n.LMCTL_NEXT_IDENTITY_POOL_ID)??f1,a=o(e.LMCTL_NEXT_COGNITO_USER_POOL_ID,n.LMCTL_NEXT_COGNITO_USER_POOL_ID)??m1,l=o(e.LMCTL_NEXT_MAILBOX_BUCKET,e.LMCTL_NEXT_POLICY_BUCKET,n.LMCTL_NEXT_MAILBOX_BUCKET,n.LMCTL_NEXT_POLICY_BUCKET)??p1,c=o(e.AWS_REGION,e.AWS_DEFAULT_REGION)??"us-east-1",u=o(e.LMCTL_NEXT_COGNITO_CLIENT_ID,n.LMCTL_NEXT_COGNITO_CLIENT_ID)??Ua,d=[];i===void 0&&d.push("LMCTL_NEXT_IDENTITY_POOL_ID"),a===void 0&&d.push("LMCTL_NEXT_COGNITO_USER_POOL_ID"),l===void 0&&d.push("LMCTL_NEXT_MAILBOX_BUCKET");let f={missing:d,tfstateCandidatesChecked:r,...s!==void 0?{tfstatePathUsed:s}:{}};if(d.length>0)return f;let m=e.LMCTL_MAILBOX_POLL_MS,p=m!==void 0&&m.length>0?Number(m):void 0,_=Pa(e.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),g=Pa(e.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),h=Pa(e.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),b=Pa(e.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),w=o(e.LMCTL_MAILBOX_KEY),k=o(e.LMCTL_TOKEN_PATH);return f.config={identityPoolId:i,cognitoUserPoolId:a,cognitoClientId:u,region:c,mailboxBucket:l,...typeof p=="number"&&Number.isFinite(p)&&p>=100?{pollIntervalMs:p}:{},..._!==void 0?{readIntervalMs:_}:{},...g!==void 0?{heartbeatIdleMs:g}:{},...h!==void 0?{backoffReadIntervalMs:h}:{},...b!==void 0?{chatLogPollIntervalMs:b}:{},...w!==void 0?{mailboxKey:w}:{},...k!==void 0?{tokenPath:k}:{}},f}function h1(t){try{let e=Fa(t,"utf8"),n=JSON.parse(e).outputs??{},s={};for(let[o,i]of Object.entries(n))i!==null&&typeof i=="object"&&typeof i.value=="string"&&(s[o]=i.value);return s}catch{return{}}}function _1(t){let e=Xd(i1(t??import.meta.url));return[Ma(e,"..","..","..","..","infra","terraform","terraform.tfstate"),Ma(e,"..","..","..","..","..","infra","terraform","terraform.tfstate"),Ma(e,"..","..","..","infra","terraform","terraform.tfstate"),Ma(e,"..","..","infra","terraform","terraform.tfstate")]}function Pa(t){if(t===void 0||t==="")return;let e=Number(t);if(!(!Number.isFinite(e)||e<=0))return e*1e3}function g1(t){let e=y1(t.intervalMs)??uT,r=Math.max(1,Math.trunc(t.limit??500)),n=t.now??Date.now,s=t.cursorKey!==void 0&&t.store.loadTeamChatLogCursor!==void 0&&t.store.saveTeamChatLogCursor!==void 0?{key:t.cursorKey,load:t.store.loadTeamChatLogCursor.bind(t.store),save:t.store.saveTeamChatLogCursor.bind(t.store)}:null,o,i=!1,a=!1,l=()=>{try{if(s!==null){let d=s.load(s.key);if(d!==null)return o=d.last_pushed_id,!0}return o=t.store.getMaxTeamChatLogId(),s!==null&&s.save({cursor_key:s.key,last_pushed_id:o,updated_at:new Date(n()).toISOString()}),!0}catch(d){return t.log?.(`[mailbox] daemon_event chat_log seed failed: ${d instanceof Error?d.message:String(d)}`),!1}};l();let c=async()=>{if(!(a||i)){i=!0;try{if(o===void 0&&!l())return;let d=t.store.listTeamChatLogSinceId(o,r);for(let f of d){let m={kind:"daemon_event",event:"chat_log",ts:n(),entry:{id:f.id,root_teamfile:f.root_teamfile,sender_teamfile:f.sender_teamfile,sender_alias:f.sender_alias,receiver_teamfile:f.receiver_teamfile,receiver_alias:f.receiver_alias,message:f.message,response:f.response,status:f.status,created_at:f.created_at}};await t.publishDaemonEvent(m),s!==null&&s.save({cursor_key:s.key,last_pushed_id:f.id,updated_at:new Date(n()).toISOString()}),o=Math.max(o,f.id)}}catch(d){t.log?.(`[mailbox] daemon_event chat_log tail failed: ${d instanceof Error?d.message:String(d)}`)}finally{i=!1}}},u=setInterval(()=>{c()},e);return typeof u.unref=="function"&&u.unref(),{pollNow:c,stop(){a=!0,clearInterval(u)}}}function y1(t){return typeof t=="number"&&Number.isFinite(t)&&t>0?t:void 0}async function dT(t){let e=t.tokenPath??lT(cT(),".lmctl","cli-tokens.json"),r=nT(t.tokenPath);if(LE(r.cognito?.idToken)&&Dd()!==null)try{await JE({region:t.region,clientId:t.cognitoClientId??Ua,cliTokensPath:e}),r=nT(t.tokenPath),t.log?.("[mx-mailbox] refreshed IdToken from device-auth refresh token")}catch($){let Z=$ instanceof Error?$.message:String($);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}`,o=r.cognito.identityId,i=!1;o===void 0||o===""?o=await sT({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}):(i=!0,t.log?.(`[mx-mailbox] using cached identityId from cli-tokens (skipping GetId) for ${o}`));let a=eT({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new tT({region:t.region,credentials:a}),c={ListObjectsV2Command:u1,GetObjectCommand:c1,PutObjectCommand:d1},u=Ws(n),d=u??o,f=t.deviceId,m=$n({identityId:o,userId:u,deviceId:f,mailboxKey:t.mailboxKey}),p=t.cursorStore,_;if(p!==void 0){let $=p.loadMailboxCursor(d,m);if($!==null)_=$.last_processed_seq??void 0,t.log?.(`[mx-mailbox] resumed seq cursor=${_??"(sentinel)"} for user_id=${d}`);else{let Z=!1,J=0;for(;!Z&&J<2;){J+=1;try{let I=ua(m,"web"),x=0,C;do{let q=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:I,MaxKeys:1e3,...C!==void 0?{ContinuationToken:C}:{}}));for(let B of q.Contents??[]){let U=da(B.Key??"",m,"web");U!==void 0&&U>x&&(x=U)}C=q.IsTruncated===!0?q.NextContinuationToken:void 0}while(C!==void 0);_=x,t.log?.(`[mx-mailbox] cold start: seeded seq cursor=${x} for user_id=${d}`),Z=!0}catch(I){let x=I instanceof Error?I.message:String(I);if(i&&J===1&&T1(I)){t.log?.(`[mx-mailbox] cached identityId rejected by cognito (${x}); clearing + refreshing`),E1(e),i=!1,o=await sT({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}),a=eT({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new tT({region:t.region,credentials:a}),m=$n({identityId:o,userId:u,deviceId:f,mailboxKey:t.mailboxKey});continue}t.log?.(`[mx-mailbox] cold start seq probe failed: ${x}`);break}}p.saveMailboxCursor({user_id:d,mailbox_key:m,last_processed_version_id:null,last_processed_seq:_??null,last_processed_at:new Date().toISOString()})}}let g=null,h=t.terminalSessionManager,b=t.persistentSessionManager,w=t.promptTriggerStore,k=new Aa,N=new Hr({bucket:t.mailboxBucket,identityId:o,...u!==null?{userId:u}:{},...f!==void 0?{deviceId:f}:{},...t.mailboxKey!==void 0?{mailboxKey:t.mailboxKey}:{},s3:l,commands:c,selfRole:"agent",onS3Op:$=>k.record($),onMessage:async $=>{if(h!==void 0&&Ad($.payload)){h.onInbound($.payload);return}if(b!==void 0&&$d($.payload)){await b.onInbound($.payload);return}if(!jd($.payload)){if(w!==void 0&&Od($.payload)){Jd({store:w,payload:$.payload,log:t.log});return}g!==null&&await g.handleIncoming($.payload,$)}},...p!==void 0?{onCursorAdvance:$=>{p.saveMailboxCursor({user_id:d,mailbox_key:m,last_processed_version_id:null,last_processed_seq:$,last_processed_at:new Date().toISOString()})}}:{},..._!==void 0?{cursor:_}:{},...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 Us({client:N,...t.log!==void 0?{log:t.log}:{}}),h!==void 0&&h.setPublish(async $=>N.putMessage({conversation_id:`terminal:${$.session_id}`,payload:$})),b!==void 0&&b.setPublish(async $=>N.putMessage({conversation_id:`provider:${$.session_id}`,payload:$}));let v=$=>N.putMessage({conversation_id:Rd,payload:$});N.start();let R=t.chatLogTailStore===void 0?void 0:g1({store:t.chatLogTailStore,publishDaemonEvent:v,cursorKey:m,intervalMs:t.chatLogPollIntervalMs??t.readIntervalMs??t.pollIntervalMs??uT,log:t.log});t.log?.(`[mx-mailbox] agent polling ${m} (bucket=${t.mailboxBucket})`);let G=t.deviceId??o,M=`${d}/usage/`,L;return L=t.usageStore===void 0?void 0:vE({meter:k,store:t.usageStore,userId:d,deviceId:G,ceilingUsd:t.usageQuotaUsd??1/0,onQuotaExceeded:({period:$,costUsd:Z,ceilingUsd:J})=>{t.log?.(`[usage] month ${$} cost $${Z.toFixed(4)} >= ceiling $${J} \u2014 blocking mailbox`),N.stop().catch(()=>{}),L?.stop()},publishOwnRollup:async($,Z)=>{await l.send(new c.PutObjectCommand({Bucket:t.mailboxBucket,Key:`${M}${G}-${$}.json`,Body:JSON.stringify({...Z,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async $=>{let Z={put:0,get:0,list:0},J;do{let I=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:M,MaxKeys:1e3,...J!==void 0?{ContinuationToken:J}:{}}));for(let x of I.Contents??[]){let C=x.Key??"";if(C.endsWith(`-${$}.json`))try{let q=await l.send(new c.GetObjectCommand({Bucket:t.mailboxBucket,Key:C}));if(q.Body===void 0)continue;let B=JSON.parse(await q.Body.transformToString("utf-8"));Z.put+=B.put??0,Z.get+=B.get??0,Z.list+=B.list??0}catch{}}J=I.IsTruncated===!0?I.NextContinuationToken:void 0}while(J!==void 0);return Z},intervalMs:t.usageFlushIntervalMs??36e5,...t.log!==void 0?{log:t.log}:{}}),{identityId:o,mailbox:N,fetchClient:g,publishDaemonEvent:v,async stop(){R?.stop(),L!==void 0&&(await L.flushNow().catch(()=>{}),L.stop()),await g.stop().catch(()=>{}),await N.stop().catch(()=>{})}}}async function fT(t){let e=t.s3!==void 0&&t.commands!==void 0?{s3:t.s3,commands:t.commands}:xa(t.rootDir),r=$n({identityId:Hs,userId:Hs,deviceId:rT}),n=null,s=t.terminalSessionManager,o=t.persistentSessionManager,i=t.promptTriggerStore,a=new Hr({bucket:"local",identityId:Hs,userId:Hs,deviceId:rT,s3:e.s3,commands:e.commands,selfRole:"agent",onMessage:async c=>{if(s!==void 0&&Ad(c.payload)){s.onInbound(c.payload);return}if(o!==void 0&&$d(c.payload)){await o.onInbound(c.payload);return}if(!jd(c.payload)){if(i!==void 0&&Od(c.payload)){Jd({store:i,payload:c.payload,log:t.log});return}n!==null&&await n.handleIncoming(c.payload,c)}},pollIntervalMs:t.pollIntervalMs??Da,readIntervalMs:t.readIntervalMs??Da,heartbeatIdleMs:t.heartbeatIdleMs??Da,backoffReadIntervalMs:t.backoffReadIntervalMs??Da});n=new Us({client:a,...t.log!==void 0?{log:t.log}:{}}),s!==void 0&&s.setPublish(async c=>a.putMessage({conversation_id:`terminal:${c.session_id}`,payload:c})),o!==void 0&&o.setPublish(async c=>a.putMessage({conversation_id:`provider:${c.session_id}`,payload:c}));let l=c=>a.putMessage({conversation_id:Rd,payload:c});return a.start(),t.log?.(`[local-webui] agent polling ${r} (local-fs ${t.rootDir})`),{identityId:Hs,mailbox:a,fetchClient:n,publishDaemonEvent:l,async stop(){await n.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function nT(t){let e=t??lT(cT(),".lmctl","cli-tokens.json");try{let r=Fa(e,"utf8");return JSON.parse(r)}catch{return{}}}function w1(t,e){if(e===void 0||e==="")return;let r={};try{let s=Fa(t,"utf8");r=JSON.parse(s)}catch{}if(r.cognito===void 0)return;let n={...r,cognito:{...r.cognito,identityId:e}};iT(Xd(t),{recursive:!0,mode:448}),aT(t,JSON.stringify(n,null,2));try{oT(t,384)}catch{}}function E1(t){let e={};try{let n=Fa(t,"utf8");e=JSON.parse(n)}catch{return}if(e.cognito===void 0)return;let r={...e,cognito:{...e.cognito}};delete r.cognito.identityId,iT(Xd(t),{recursive:!0,mode:448}),aT(t,JSON.stringify(r,null,2));try{oT(t,384)}catch{}}async function sT(t){t.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let r=await new a1({region:t.region}).send(new l1({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(r.IdentityId===void 0||r.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{w1(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 T1(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 uT,Da,Ua,f1,m1,p1,Hs,rT,Gd=E(()=>{"use strict";ha();kd();Nd();IE();xE();AE();$E();RE();Ld();fa();Cd();Fd();QE();uT=3e3,Da=1e3,Ua="79u5jhkk46qofog661c9i0bdcs",f1="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",m1="us-east-1_4iUdFggDn",p1="lmctl-next-preview-mailbox-254332045686";Hs="local",rT="local"});import{spawn as zd}from"node:child_process";import{createInterface as mT}from"node:readline";var Vd,Kd,Yd,pT,hT=E(()=>{"use strict";$o();Ne();Vd=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=zd(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=n,this.rl=mT({input:n.stdout}),this.rl.on("line",s=>{r.generation===r.currentGeneration()&&this.handleLine(s)}),n.stderr?.on("data",s=>{if(r.generation!==r.currentGeneration())return;let o=s instanceof Buffer?s.toString("utf8"):String(s);r.emit({event_type:"notification",payload:{source:"stderr",text:o}})}),await this.rpc("initialize",{clientInfo:{name:"lmctl-dt3",title:"lmctl DT-3",version:"0.1.0"},capabilities:{experimentalApi:!1}}),this.notify("initialized",{}),this.threadId!==void 0&&this.threadId!=="")try{await this.rpc("thread/resume",{threadId:this.threadId,approvalPolicy:"never",sandbox:"danger-full-access"}),r.emit({event_type:"thread_started",payload:{thread_id:this.threadId,resumed:!0}})}catch{let o=(await this.rpc("thread/start",{cwd:e.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,i=typeof o?.id=="string"?o.id:void 0;this.threadId=i,r.emit({event_type:"thread_started",payload:{thread_id:i,resumed:!1}})}else{let o=(await this.rpc("thread/start",{cwd:e.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,i=typeof o?.id=="string"?o.id:void 0;this.threadId=i,r.emit({event_type:"thread_started",payload:{thread_id:i,resumed:!1}})}return n}async sendTurn(e){if(this.closed)throw new Error("codex_session_closed");if(this.threadId===void 0||this.threadId==="")throw new Error("codex_no_thread_id");let r=`local-${this.nextLocalTurnId++}`;this.ctx?.turnMap.set(r,{startedAt:Date.now()});try{let s=(await this.rpc("turn/start",{threadId:this.threadId,input:[{type:"text",text:e}]})).result?.turn,o=typeof s?.id=="string"?s.id:void 0;if(o!==void 0){let i=this.ctx?.turnMap.get(r);this.ctx?.turnMap.delete(r),i!==void 0&&this.ctx?.turnMap.set(o,i)}}catch(n){throw this.ctx?.turnMap.delete(r),n}}async stop(){if(this.closed=!0,this.rl!==void 0&&(this.rl.close(),this.rl=void 0),this.child?.stdin!==null&&this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}for(let e of this.pending.values())e.reject(new Error("codex_session_stopping"));this.pending.clear()}async rpc(e,r){if(this.child?.stdin===null||this.child===void 0)throw new Error("codex_child_unavailable");return new Promise((n,s)=>{let o=this.nextRpcId++;this.pending.set(o,{resolve:n,reject:s});let i=JSON.stringify({jsonrpc:"2.0",id:o,method:e,params:r});try{this.child.stdin.write(i+`
1889
+ allowed keys: ${VE.join(", ")}`);if(!d.provider&&!d.teamfile){s.push(`line ${u}: member line missing provider (or teamfile): ${c.trim()}`);continue}let m={alias:d.alias||`member${n.length+1}`,provider:d.provider||"",extra:{}};d.sessionid&&(m.session=d.sessionid),Object.prototype.hasOwnProperty.call(d,"sessiondir")&&(m.sessiondir=d.sessiondir),d.teamfile&&(m.teamfile=d.teamfile),d.model&&(m.model=d.model),d.effort&&(m.effort=d.effort),n.push(m)}return{name:e,members:n,rawText:t,parseErrors:s,frontmatter:i}}function Hd(t,e){let r=[];for(let o of t.parseErrors)r.push({field:"session",message:o});let n=t.members.filter(o=>o.alias.toLowerCase()===Wd.toLowerCase());n.length>1&&r.push({field:Wd,message:`${n.length} alias=Lead found (max 1)`});let s=new Set;for(let o of t.members){let i=o.alias.toLowerCase();if(s.has(i)&&r.push({field:o.alias,message:`Duplicate alias "${o.alias}" (case-insensitive)`}),s.add(i),o.teamfile){let a=e?Cn(e,o.teamfile):Cn(o.teamfile);if(!KE(a))r.push({field:o.alias,message:`Teamfile not found: ${a}`});else{let l=Pe(a),c=jt(l);c?c.session||r.push({field:o.alias,message:`Team at ${o.teamfile} lead has no session ID. Run: lmctl seed`}):r.push({field:o.alias,message:`Team at ${o.teamfile} has no lead session`})}}else JP.has(o.provider)||r.push({field:o.alias,message:`Invalid provider "${o.provider}"`});o.sessiondir!==void 0&&o.sessiondir===""&&r.push({field:o.alias,message:"sessiondir is empty"})}return r}function jt(t){return t.members.find(e=>e.alias.toLowerCase()===Wd.toLowerCase())}function qd(t,e,r,n={}){let s=n.requireSession??!0;if(!t.teamfile)throw new Error(`Member "${t.alias}" is not a team reference`);let o=Cn(e,t.teamfile),i=r??new Set;if(i.has(o))throw new Error(`Circular team reference: ${t.alias} \u2192 ${o} (already visited: ${[...i].join(" \u2192 ")})`);if(i.add(o),!KE(o))throw new Error(`Teamfile not found: ${o} (referenced by alias "${t.alias}")`);let a=Pe(o),l=jt(a);if(!l)throw new Error(`Team at ${o} has no lead session`);if(l.teamfile)return qd(l,Ud(o),i,n);if(s&&!l.session)throw new Error(`Team at ${o} lead has no session ID. Run: lmctl seed`);return{provider:l.provider,session:l.session??"",sessiondir:l.sessiondir||Ud(o),alias:t.alias,resolvedFrom:o,model:l.model,effort:l.effort}}function Mn(t,e){return t.members.find(r=>r.alias===e)??t.members.find(r=>r.alias.toLowerCase()===e.toLowerCase())}var Wd,JP,VE,Ot=E(()=>{"use strict";GE();Wd="Lead",JP=new Set(["claude","codex","opencode","lmplayer","gemini","copilot","qwen","agy","ClaudeMock"]);VE=["alias","provider","sessionid","sessiondir","teamfile","model","effort"]});function Dn(t){if(!Number.isInteger(t)||(t??0)<=0)return!1;try{return process.kill(t,0),!0}catch(e){return(e!==null&&typeof e=="object"&&"code"in e?e.code:void 0)!=="ESRCH"}}var La=E(()=>{"use strict"});function Pn(t,e){let r=new Date().toISOString(),n=new Date(Date.now()-e.ttlMs).toISOString(),s={receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,started_at:r},o=t.getAgentInflight(e.receiver_teamfile,e.receiver_alias),i=o===null||o.holder_pid===null,a=t.tryAcquireAgentInflight(s,{...i?{stale_before:n}:{},force:e.force});if(a.acquired){let c=o===null?null:e.force===!0?"force":o.holder_pid===null&&o.started_at<n?"stale":null;return{acquired:!0,lease:a.current??s,previous:o,reclaimReason:c}}if(!YP(a.current,n))return{acquired:!1,current:a.current};let l=t.tryAcquireAgentInflight(s,a.current.holder_pid===null?{stale_before:n}:{reclaim_observed:{sender_teamfile:a.current.sender_teamfile,sender_alias:a.current.sender_alias,started_at:a.current.started_at,holder_pid:a.current.holder_pid}});return l.acquired?{acquired:!0,lease:l.current??s,previous:a.current,reclaimReason:a.current.holder_pid===null?"stale":"dead-pid"}:{acquired:!1,current:l.current}}function YP(t,e){return t.holder_pid===null?t.started_at<e:!Dn(t.holder_pid)}var Ca=E(()=>{"use strict";La()});import{existsSync as zP,realpathSync as ZP}from"node:fs";import{dirname as QP}from"node:path";function Jd(t){e1(t).catch(e=>{t.log?.(`[mailbox] prompt trigger failed: ${e instanceof Error?e.message:String(e)}`)})}async function e1(t){let e=t.payload.root_teamfile;try{e=ZP(t.payload.root_teamfile)}catch(s){let o=`prompt root missing/unreadable: ${t.payload.root_teamfile}: ${s instanceof Error?s.message:String(s)}`;return await Fn(t.store,{rootTeamfile:t.payload.root_teamfile,receiverTeamfile:t.payload.root_teamfile,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:o,log:t.log}),t.log?.(`[mailbox] ${o}`),{status:"error",response:null,error_detail:o}}if(t.store.getRootTeam(e)===null){let s=`prompt root is not registered: ${e}`;return await Fn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:s,log:t.log}),t.log?.(`[mailbox] ${s}`),{status:"error",response:null,error_detail:s}}let r=t1(e);if("error"in r)return await Fn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:r.error,log:t.log}),t.log?.(`[mailbox] ${r.error}`),{status:"error",response:null,error_detail:r.error};let n=Pn(t.store,{receiver_teamfile:e,receiver_alias:r.alias,sender_teamfile:`prompt:${t.payload.prompt_id}`,sender_alias:"operator",ttlMs:s1(t.env??process.env)});if(!n.acquired){let s=n1(r.alias,n.current);return await Fn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:null,status:"error",error_detail:s,log:t.log}),t.log?.(`[mailbox] prompt rejected: ${s}`),{status:"error",response:null,error_detail:s}}try{let o=await(t.chat??Xt)({provider:r.provider,sessionId:r.sessionid,cwd:r.sessiondir,prompt:t.payload.text,env:t.env??process.env,alias:r.alias,permissionMode:"yolo",...t.timeoutMs!==void 0?{timeoutMs:t.timeoutMs}:{}}),i=o.status==="stalled",a=!i&&o.text.trim()==="",l=i?`provider stalled${o.stalledAfterMs!==void 0?` after ${o.stalledAfterMs}ms`:""}`:a?"provider returned empty response":null,c=i||a?"error":"ok";return await Fn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:c==="error"?null:o.text,status:c,error_detail:l,log:t.log}),{status:c,response:c==="error"?null:o.text,error_detail:l}}catch(s){let o=s instanceof Error?s.message:String(s);return await Fn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:null,status:"error",error_detail:o,log:t.log}),t.log?.(`[mailbox] prompt provider error: ${o}`),{status:"error",response:null,error_detail:o}}finally{try{t.store.releaseAgentInflight(n.lease)}catch(s){t.log?.(`[mailbox] failed to release prompt in-flight slot: ${s instanceof Error?s.message:String(s)}`)}}}function t1(t){if(!zP(t))return{error:`prompt root missing/unreadable: ${t}`};let e=Pe(t);if(e.parseErrors.length>0)return{error:`prompt root parse error: ${e.parseErrors.join("; ")}`};let r=jt(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??QP(t)}}async function Fn(t,e){let r=ZE(e.message),n=e.response===null?null:ZE(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,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 ZE(t){return t.length<=YE?{text:t,truncated:!1}:{text:t.slice(0,YE),truncated:!0}}function r1(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}function n1(t,e){return e.sender_teamfile.startsWith("prompt:")?`${t} is busy servicing another prompt since ${e.started_at}`:r1(t,e)}function s1(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return zE;let r=Number(e);return!Number.isFinite(r)||r<=0?zE:r}var YE,zE,QE=E(()=>{"use strict";It();Ot();Ca();YE=256*1024,zE=30*60*1e3});import{chmodSync as oT,existsSync as o1,mkdirSync as iT,readFileSync as Fa,writeFileSync as aT}from"node:fs";import{dirname as Xd,resolve as Ma,join as lT}from"node:path";import{fileURLToPath as i1}from"node:url";import{homedir as cT}from"node:os";import{CognitoIdentityClient as a1,GetIdCommand as l1}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as eT}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as c1,ListObjectsV2Command as u1,PutObjectCommand as d1,S3Client as tT}from"@aws-sdk/client-s3";function qs(t={}){let e=t.env??process.env,r=t.tfstatePath!==void 0?[t.tfstatePath]:_1(t.selfUrl),n={},s;for(let N of r)if(o1(N)){n=h1(N),s=N;break}let o=(...N)=>{for(let v of N)if(typeof v=="string"&&v!=="")return v},i=o(e.LMCTL_NEXT_IDENTITY_POOL_ID,n.LMCTL_NEXT_IDENTITY_POOL_ID)??f1,a=o(e.LMCTL_NEXT_COGNITO_USER_POOL_ID,n.LMCTL_NEXT_COGNITO_USER_POOL_ID)??m1,l=o(e.LMCTL_NEXT_MAILBOX_BUCKET,e.LMCTL_NEXT_POLICY_BUCKET,n.LMCTL_NEXT_MAILBOX_BUCKET,n.LMCTL_NEXT_POLICY_BUCKET)??p1,c=o(e.AWS_REGION,e.AWS_DEFAULT_REGION)??"us-east-1",u=o(e.LMCTL_NEXT_COGNITO_CLIENT_ID,n.LMCTL_NEXT_COGNITO_CLIENT_ID)??Ua,d=[];i===void 0&&d.push("LMCTL_NEXT_IDENTITY_POOL_ID"),a===void 0&&d.push("LMCTL_NEXT_COGNITO_USER_POOL_ID"),l===void 0&&d.push("LMCTL_NEXT_MAILBOX_BUCKET");let f={missing:d,tfstateCandidatesChecked:r,...s!==void 0?{tfstatePathUsed:s}:{}};if(d.length>0)return f;let m=e.LMCTL_MAILBOX_POLL_MS,p=m!==void 0&&m.length>0?Number(m):void 0,h=Pa(e.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),g=Pa(e.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),_=Pa(e.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),b=Pa(e.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),w=o(e.LMCTL_MAILBOX_KEY),k=o(e.LMCTL_TOKEN_PATH);return f.config={identityPoolId:i,cognitoUserPoolId:a,cognitoClientId:u,region:c,mailboxBucket:l,...typeof p=="number"&&Number.isFinite(p)&&p>=100?{pollIntervalMs:p}:{},...h!==void 0?{readIntervalMs:h}:{},...g!==void 0?{heartbeatIdleMs:g}:{},..._!==void 0?{backoffReadIntervalMs:_}:{},...b!==void 0?{chatLogPollIntervalMs:b}:{},...w!==void 0?{mailboxKey:w}:{},...k!==void 0?{tokenPath:k}:{}},f}function h1(t){try{let e=Fa(t,"utf8"),n=JSON.parse(e).outputs??{},s={};for(let[o,i]of Object.entries(n))i!==null&&typeof i=="object"&&typeof i.value=="string"&&(s[o]=i.value);return s}catch{return{}}}function _1(t){let e=Xd(i1(t??import.meta.url));return[Ma(e,"..","..","..","..","infra","terraform","terraform.tfstate"),Ma(e,"..","..","..","..","..","infra","terraform","terraform.tfstate"),Ma(e,"..","..","..","infra","terraform","terraform.tfstate"),Ma(e,"..","..","infra","terraform","terraform.tfstate")]}function Pa(t){if(t===void 0||t==="")return;let e=Number(t);if(!(!Number.isFinite(e)||e<=0))return e*1e3}function g1(t){let e=y1(t.intervalMs)??uT,r=Math.max(1,Math.trunc(t.limit??500)),n=t.now??Date.now,s=t.cursorKey!==void 0&&t.store.loadTeamChatLogCursor!==void 0&&t.store.saveTeamChatLogCursor!==void 0?{key:t.cursorKey,load:t.store.loadTeamChatLogCursor.bind(t.store),save:t.store.saveTeamChatLogCursor.bind(t.store)}:null,o,i=!1,a=!1,l=()=>{try{if(s!==null){let d=s.load(s.key);if(d!==null)return o=d.last_pushed_id,!0}return o=t.store.getMaxTeamChatLogId(),s!==null&&s.save({cursor_key:s.key,last_pushed_id:o,updated_at:new Date(n()).toISOString()}),!0}catch(d){return t.log?.(`[mailbox] daemon_event chat_log seed failed: ${d instanceof Error?d.message:String(d)}`),!1}};l();let c=async()=>{if(!(a||i)){i=!0;try{if(o===void 0&&!l())return;let d=t.store.listTeamChatLogSinceId(o,r);for(let f of d){let m={kind:"daemon_event",event:"chat_log",ts:n(),entry:{id:f.id,root_teamfile:f.root_teamfile,sender_teamfile:f.sender_teamfile,sender_alias:f.sender_alias,receiver_teamfile:f.receiver_teamfile,receiver_alias:f.receiver_alias,message:f.message,response:f.response,status:f.status,created_at:f.created_at}};await t.publishDaemonEvent(m),s!==null&&s.save({cursor_key:s.key,last_pushed_id:f.id,updated_at:new Date(n()).toISOString()}),o=Math.max(o,f.id)}}catch(d){t.log?.(`[mailbox] daemon_event chat_log tail failed: ${d instanceof Error?d.message:String(d)}`)}finally{i=!1}}},u=setInterval(()=>{c()},e);return typeof u.unref=="function"&&u.unref(),{pollNow:c,stop(){a=!0,clearInterval(u)}}}function y1(t){return typeof t=="number"&&Number.isFinite(t)&&t>0?t:void 0}async function dT(t){let e=t.tokenPath??lT(cT(),".lmctl","cli-tokens.json"),r=nT(t.tokenPath);if(LE(r.cognito?.idToken)&&Dd()!==null)try{await JE({region:t.region,clientId:t.cognitoClientId??Ua,cliTokensPath:e}),r=nT(t.tokenPath),t.log?.("[mx-mailbox] refreshed IdToken from device-auth refresh token")}catch($){let Z=$ instanceof Error?$.message:String($);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}`,o=r.cognito.identityId,i=!1;o===void 0||o===""?o=await sT({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}):(i=!0,t.log?.(`[mx-mailbox] using cached identityId from cli-tokens (skipping GetId) for ${o}`));let a=eT({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new tT({region:t.region,credentials:a}),c={ListObjectsV2Command:u1,GetObjectCommand:c1,PutObjectCommand:d1},u=Ws(n),d=u??o,f=t.deviceId,m=$n({identityId:o,userId:u,deviceId:f,mailboxKey:t.mailboxKey}),p=t.cursorStore,h;if(p!==void 0){let $=p.loadMailboxCursor(d,m);if($!==null)h=$.last_processed_seq??void 0,t.log?.(`[mx-mailbox] resumed seq cursor=${h??"(sentinel)"} for user_id=${d}`);else{let Z=!1,J=0;for(;!Z&&J<2;){J+=1;try{let I=ua(m,"web"),x=0,C;do{let q=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:I,MaxKeys:1e3,...C!==void 0?{ContinuationToken:C}:{}}));for(let B of q.Contents??[]){let U=da(B.Key??"",m,"web");U!==void 0&&U>x&&(x=U)}C=q.IsTruncated===!0?q.NextContinuationToken:void 0}while(C!==void 0);h=x,t.log?.(`[mx-mailbox] cold start: seeded seq cursor=${x} for user_id=${d}`),Z=!0}catch(I){let x=I instanceof Error?I.message:String(I);if(i&&J===1&&T1(I)){t.log?.(`[mx-mailbox] cached identityId rejected by cognito (${x}); clearing + refreshing`),E1(e),i=!1,o=await sT({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}),a=eT({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new tT({region:t.region,credentials:a}),m=$n({identityId:o,userId:u,deviceId:f,mailboxKey:t.mailboxKey});continue}t.log?.(`[mx-mailbox] cold start seq probe failed: ${x}`);break}}p.saveMailboxCursor({user_id:d,mailbox_key:m,last_processed_version_id:null,last_processed_seq:h??null,last_processed_at:new Date().toISOString()})}}let g=null,_=t.terminalSessionManager,b=t.persistentSessionManager,w=t.promptTriggerStore,k=new Aa,N=new Hr({bucket:t.mailboxBucket,identityId:o,...u!==null?{userId:u}:{},...f!==void 0?{deviceId:f}:{},...t.mailboxKey!==void 0?{mailboxKey:t.mailboxKey}:{},s3:l,commands:c,selfRole:"agent",onS3Op:$=>k.record($),onMessage:async $=>{if(_!==void 0&&Ad($.payload)){_.onInbound($.payload);return}if(b!==void 0&&$d($.payload)){await b.onInbound($.payload);return}if(!jd($.payload)){if(w!==void 0&&Od($.payload)){Jd({store:w,payload:$.payload,log:t.log});return}g!==null&&await g.handleIncoming($.payload,$)}},...p!==void 0?{onCursorAdvance:$=>{p.saveMailboxCursor({user_id:d,mailbox_key:m,last_processed_version_id:null,last_processed_seq:$,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 Us({client:N,...t.log!==void 0?{log:t.log}:{}}),_!==void 0&&_.setPublish(async $=>N.putMessage({conversation_id:`terminal:${$.session_id}`,payload:$})),b!==void 0&&b.setPublish(async $=>N.putMessage({conversation_id:`provider:${$.session_id}`,payload:$}));let v=$=>N.putMessage({conversation_id:Rd,payload:$});N.start();let R=t.chatLogTailStore===void 0?void 0:g1({store:t.chatLogTailStore,publishDaemonEvent:v,cursorKey:m,intervalMs:t.chatLogPollIntervalMs??t.readIntervalMs??t.pollIntervalMs??uT,log:t.log});t.log?.(`[mx-mailbox] agent polling ${m} (bucket=${t.mailboxBucket})`);let G=t.deviceId??o,M=`${d}/usage/`,L;return L=t.usageStore===void 0?void 0:vE({meter:k,store:t.usageStore,userId:d,deviceId:G,ceilingUsd:t.usageQuotaUsd??1/0,onQuotaExceeded:({period:$,costUsd:Z,ceilingUsd:J})=>{t.log?.(`[usage] month ${$} cost $${Z.toFixed(4)} >= ceiling $${J} \u2014 blocking mailbox`),N.stop().catch(()=>{}),L?.stop()},publishOwnRollup:async($,Z)=>{await l.send(new c.PutObjectCommand({Bucket:t.mailboxBucket,Key:`${M}${G}-${$}.json`,Body:JSON.stringify({...Z,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async $=>{let Z={put:0,get:0,list:0},J;do{let I=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:M,MaxKeys:1e3,...J!==void 0?{ContinuationToken:J}:{}}));for(let x of I.Contents??[]){let C=x.Key??"";if(C.endsWith(`-${$}.json`))try{let q=await l.send(new c.GetObjectCommand({Bucket:t.mailboxBucket,Key:C}));if(q.Body===void 0)continue;let B=JSON.parse(await q.Body.transformToString("utf-8"));Z.put+=B.put??0,Z.get+=B.get??0,Z.list+=B.list??0}catch{}}J=I.IsTruncated===!0?I.NextContinuationToken:void 0}while(J!==void 0);return Z},intervalMs:t.usageFlushIntervalMs??36e5,...t.log!==void 0?{log:t.log}:{}}),{identityId:o,mailbox:N,fetchClient:g,publishDaemonEvent:v,async stop(){R?.stop(),L!==void 0&&(await L.flushNow().catch(()=>{}),L.stop()),await g.stop().catch(()=>{}),await N.stop().catch(()=>{})}}}async function fT(t){let e=t.s3!==void 0&&t.commands!==void 0?{s3:t.s3,commands:t.commands}:xa(t.rootDir),r=$n({identityId:Hs,userId:Hs,deviceId:rT}),n=null,s=t.terminalSessionManager,o=t.persistentSessionManager,i=t.promptTriggerStore,a=new Hr({bucket:"local",identityId:Hs,userId:Hs,deviceId:rT,s3:e.s3,commands:e.commands,selfRole:"agent",onMessage:async c=>{if(s!==void 0&&Ad(c.payload)){s.onInbound(c.payload);return}if(o!==void 0&&$d(c.payload)){await o.onInbound(c.payload);return}if(!jd(c.payload)){if(i!==void 0&&Od(c.payload)){Jd({store:i,payload:c.payload,log:t.log});return}n!==null&&await n.handleIncoming(c.payload,c)}},pollIntervalMs:t.pollIntervalMs??Da,readIntervalMs:t.readIntervalMs??Da,heartbeatIdleMs:t.heartbeatIdleMs??Da,backoffReadIntervalMs:t.backoffReadIntervalMs??Da});n=new Us({client:a,...t.log!==void 0?{log:t.log}:{}}),s!==void 0&&s.setPublish(async c=>a.putMessage({conversation_id:`terminal:${c.session_id}`,payload:c})),o!==void 0&&o.setPublish(async c=>a.putMessage({conversation_id:`provider:${c.session_id}`,payload:c}));let l=c=>a.putMessage({conversation_id:Rd,payload:c});return a.start(),t.log?.(`[local-webui] agent polling ${r} (local-fs ${t.rootDir})`),{identityId:Hs,mailbox:a,fetchClient:n,publishDaemonEvent:l,async stop(){await n.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function nT(t){let e=t??lT(cT(),".lmctl","cli-tokens.json");try{let r=Fa(e,"utf8");return JSON.parse(r)}catch{return{}}}function w1(t,e){if(e===void 0||e==="")return;let r={};try{let s=Fa(t,"utf8");r=JSON.parse(s)}catch{}if(r.cognito===void 0)return;let n={...r,cognito:{...r.cognito,identityId:e}};iT(Xd(t),{recursive:!0,mode:448}),aT(t,JSON.stringify(n,null,2));try{oT(t,384)}catch{}}function E1(t){let e={};try{let n=Fa(t,"utf8");e=JSON.parse(n)}catch{return}if(e.cognito===void 0)return;let r={...e,cognito:{...e.cognito}};delete r.cognito.identityId,iT(Xd(t),{recursive:!0,mode:448}),aT(t,JSON.stringify(r,null,2));try{oT(t,384)}catch{}}async function sT(t){t.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let r=await new a1({region:t.region}).send(new l1({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(r.IdentityId===void 0||r.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{w1(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 T1(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 uT,Da,Ua,f1,m1,p1,Hs,rT,Gd=E(()=>{"use strict";ha();kd();Nd();IE();xE();AE();$E();RE();Ld();fa();Cd();Fd();QE();uT=3e3,Da=1e3,Ua="79u5jhkk46qofog661c9i0bdcs",f1="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",m1="us-east-1_4iUdFggDn",p1="lmctl-next-preview-mailbox-254332045686";Hs="local",rT="local"});import{spawn as zd}from"node:child_process";import{createInterface as mT}from"node:readline";var Vd,Kd,Yd,pT,hT=E(()=>{"use strict";$o();Ne();Vd=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=zd(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=n,this.rl=mT({input:n.stdout}),this.rl.on("line",s=>{r.generation===r.currentGeneration()&&this.handleLine(s)}),n.stderr?.on("data",s=>{if(r.generation!==r.currentGeneration())return;let o=s instanceof Buffer?s.toString("utf8"):String(s);r.emit({event_type:"notification",payload:{source:"stderr",text:o}})}),await this.rpc("initialize",{clientInfo:{name:"lmctl-dt3",title:"lmctl DT-3",version:"0.1.0"},capabilities:{experimentalApi:!1}}),this.notify("initialized",{}),this.threadId!==void 0&&this.threadId!=="")try{await this.rpc("thread/resume",{threadId:this.threadId,approvalPolicy:"never",sandbox:"danger-full-access"}),r.emit({event_type:"thread_started",payload:{thread_id:this.threadId,resumed:!0}})}catch{let o=(await this.rpc("thread/start",{cwd:e.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,i=typeof o?.id=="string"?o.id:void 0;this.threadId=i,r.emit({event_type:"thread_started",payload:{thread_id:i,resumed:!1}})}else{let o=(await this.rpc("thread/start",{cwd:e.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,i=typeof o?.id=="string"?o.id:void 0;this.threadId=i,r.emit({event_type:"thread_started",payload:{thread_id:i,resumed:!1}})}return n}async sendTurn(e){if(this.closed)throw new Error("codex_session_closed");if(this.threadId===void 0||this.threadId==="")throw new Error("codex_no_thread_id");let r=`local-${this.nextLocalTurnId++}`;this.ctx?.turnMap.set(r,{startedAt:Date.now()});try{let s=(await this.rpc("turn/start",{threadId:this.threadId,input:[{type:"text",text:e}]})).result?.turn,o=typeof s?.id=="string"?s.id:void 0;if(o!==void 0){let i=this.ctx?.turnMap.get(r);this.ctx?.turnMap.delete(r),i!==void 0&&this.ctx?.turnMap.set(o,i)}}catch(n){throw this.ctx?.turnMap.delete(r),n}}async stop(){if(this.closed=!0,this.rl!==void 0&&(this.rl.close(),this.rl=void 0),this.child?.stdin!==null&&this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}for(let e of this.pending.values())e.reject(new Error("codex_session_stopping"));this.pending.clear()}async rpc(e,r){if(this.child?.stdin===null||this.child===void 0)throw new Error("codex_child_unavailable");return new Promise((n,s)=>{let o=this.nextRpcId++;this.pending.set(o,{resolve:n,reject:s});let i=JSON.stringify({jsonrpc:"2.0",id:o,method:e,params:r});try{this.child.stdin.write(i+`
1891
1890
  `)}catch(a){this.pending.delete(o),s(a instanceof Error?a:new Error(String(a)))}})}notify(e,r){if(this.child?.stdin===null||this.child===void 0)return;let n=JSON.stringify({jsonrpc:"2.0",method:e,params:r});try{this.child.stdin.write(n+`
1892
1891
  `)}catch{}}handleLine(e){if(e.trim()==="")return;let r;try{r=JSON.parse(e)}catch{return}if(typeof r.id=="number"&&this.pending.has(r.id)){let i=this.pending.get(r.id);if(this.pending.delete(r.id),r.error!==void 0){let a=r.error,l=typeof a?.message=="string"&&a.message!==""?a.message:JSON.stringify(r.error);i.reject(new Error(`codex_rpc_error: ${l}`))}else i.resolve(r);return}let n=typeof r.method=="string"?r.method:void 0;if(n===void 0)return;let s=r.params??{},o=this.normalizeNotification(n,s);o!==void 0&&this.ctx?.emit(o)}normalizeNotification(e,r){if(e==="thread/started"){let n=r.thread;return typeof n?.id=="string"&&(this.threadId=n.id),{event_type:"thread_started",payload:{thread_id:this.threadId,raw:r}}}if(e==="turn/started")return{event_type:"turn_started",payload:{turn_id:r.turn?.id,thread_id:this.threadId}};if(e==="item/agentMessage/delta")return{event_type:"assistant_message_delta",payload:{text:typeof r.delta=="string"?r.delta:""}};if(e==="item/started"||e==="item/completed"){let n=r.item;return n?.type!==void 0&&n.type!=="agentMessage"&&n.type!=="userMessage"?{event_type:"tool_call",payload:{name:n.name??n.type,status:e==="item/started"?"started":"completed",item:n}}:{event_type:"notification",payload:{method:e,params:r}}}if(e==="turn/completed"){let n=r.turn;return typeof n?.id=="string"&&this.ctx?.turnMap.delete(n.id),{event_type:"turn_complete",payload:r}}if(e==="error"){let n=r.error;return{event_type:"error",payload:{message:typeof n?.message=="string"?n.message:JSON.stringify(r),raw:r}}}return{event_type:"notification",payload:{method:e,params:r}}}},Kd=class{child;ctx;buffer="";sessionIdSeen;closed=!1;async start(e,r){this.ctx=r;let n=zd(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});return this.child=n,n.stdout.on("data",s=>{if(r.generation!==r.currentGeneration())return;let o=s instanceof Buffer?s.toString("utf8"):String(s);this.buffer+=o;let i=this.buffer.split(`
1893
1892
  `);this.buffer=i.pop()??"";for(let a of i)this.handleLine(a)}),n.stderr?.on("data",s=>{if(r.generation!==r.currentGeneration())return;let o=s instanceof Buffer?s.toString("utf8"):String(s);r.emit({event_type:"notification",payload:{source:"stderr",text:o}})}),n}async sendTurn(e){if(this.closed)throw new Error("claude_session_closed");if(this.child===void 0||this.child.stdin===null)throw new Error("claude_child_unavailable");let r=`claude-${Date.now()}`;this.ctx?.turnMap.set(r,{startedAt:Date.now()});let n=JSON.stringify({type:"user",message:{role:"user",content:e}});try{this.child.stdin.write(n+`
@@ -1901,7 +1900,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
1901
1900
  `)}let a=r.noDaemon?void 0:mE({dal:n,intervalMs:Fs()}),l=i!==void 0?{missing:[],tfstateCandidatesChecked:[]}:qs({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)`)+`
1902
1901
  `);let c=await F1({log:w=>e.stderr.write(`${w}
1903
1902
  `)}),u=new Ea({adapterFactory:pT,publish:async()=>{throw new Error("persistent_publish_not_wired: mailbox runtime has not bound the publish hook yet")},log:w=>e.stderr.write(`${w}
1904
- `)}),d=qr()?.device_id,f=sE({dal:n,daemon:a,...l.config!==void 0?{webuiRuntimeConfig:D1(l.config,d)}:{},...c!==void 0?{terminalSessionManager:c}:{},persistentSessionManager:u,...i!==void 0?{localWebui:{webuiDir:i.webuiDir,localMailbox:{s3:i.s3,commands:i.commands}}}:{}}),m=process.env.LMCTL_USAGE_QUOTA_USD,p=m!==void 0&&m!==""?Number(m):NaN,_=Number.isFinite(p)&&p>0?p:void 0,g=await TT({dal:n,app:f,io:e,mailbox:l.config===void 0?void 0:{...l.config,cursorStore:n,chatLogTailStore:n,promptTriggerStore:n,usageStore:n,..._!==void 0?{usageQuotaUsd:_}:{},...d!==void 0?{deviceId:d}:{}},...i!==void 0?{localMailbox:{rootDir:i.rootDir,s3:i.s3,commands:i.commands,promptTriggerStore:n}}:{},...c!==void 0?{terminalSessionManager:c}:{},persistentSessionManager:u});await ET({dal:n,mailbox:g.mailbox,io:e});let{serve:h}=await import("@hono/node-server"),b=h({fetch:f.fetch,port:o.port,hostname:r.bind});return e.stdout.write(`listening on ${r.bind}:${o.port}
1903
+ `)}),d=qr()?.device_id,f=sE({dal:n,daemon:a,...l.config!==void 0?{webuiRuntimeConfig:D1(l.config,d)}:{},...c!==void 0?{terminalSessionManager:c}:{},persistentSessionManager:u,...i!==void 0?{localWebui:{webuiDir:i.webuiDir,localMailbox:{s3:i.s3,commands:i.commands}}}:{}}),m=process.env.LMCTL_USAGE_QUOTA_USD,p=m!==void 0&&m!==""?Number(m):NaN,h=Number.isFinite(p)&&p>0?p:void 0,g=await TT({dal:n,app:f,io:e,mailbox:l.config===void 0?void 0:{...l.config,cursorStore:n,chatLogTailStore:n,promptTriggerStore:n,usageStore:n,...h!==void 0?{usageQuotaUsd:h}:{},...d!==void 0?{deviceId:d}:{}},...i!==void 0?{localMailbox:{rootDir:i.rootDir,s3:i.s3,commands:i.commands,promptTriggerStore:n}}:{},...c!==void 0?{terminalSessionManager:c}:{},persistentSessionManager:u});await ET({dal:n,mailbox:g.mailbox,io:e});let{serve:_}=await import("@hono/node-server"),b=_({fetch:f.fetch,port:o.port,hostname:r.bind});return e.stdout.write(`listening on ${r.bind}:${o.port}
1905
1904
  `),await new Promise(w=>{let k=()=>{(async()=>(a!==void 0&&await a.stop(),b.close(),await g.stop(),c!==void 0&&await c.stop(),await u.stop(),n.close(),w()))()};process.once("SIGTERM",k),process.once("SIGINT",k)}),0}function D1(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 ET(t){if(t.mailbox===void 0)return;let e={kind:"daemon_event",event:"workflows",ts:Date.now(),workflows:t.dal.listRootTeams().map(r=>({teamfile_path:r.teamfile_path,name:r.name,registered_at:r.registered_at,last_seeded_at:r.last_seeded_at}))};try{await t.mailbox.publishDaemonEvent(e)}catch(r){t.io?.stderr.write(`[mailbox] daemon_event workflows push failed: ${r instanceof Error?r.message:String(r)}
1906
1905
  `)}}async function TT(t){let e;if(t.mailbox!==void 0||t.localMailbox!==void 0)try{e=t.localMailbox!==void 0?await fT({...t.localMailbox,log:r=>t.io?.stderr.write(`${r}
1907
1906
  `),...t.terminalSessionManager!==void 0?{terminalSessionManager:t.terminalSessionManager}:{},...t.persistentSessionManager!==void 0?{persistentSessionManager:t.persistentSessionManager}:{}}):await dT({...t.mailbox,log:r=>t.io?.stderr.write(`${r}
@@ -1912,7 +1911,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
1912
1911
  `);return{port:a,apiUrl:d,apiToken:c}}function P1(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 F1(t){let e;try{e=await import("node-pty")}catch(r){let n=r instanceof Error?r.message:String(r);t.log(`[dt-2] node-pty not available; terminal routes will return 503 (${n})`);return}return new wa({pty:{spawn:e.spawn.bind(e)},publish:async()=>{throw new Error("terminal_publish_not_wired: mailbox runtime has not bound the publish hook yet")},log:t.log})}function U1(t){ST=t??ef}function kT(t){let e=Object.keys(Ba),r=ST(e),n=r.filter(o=>!o.found);if(n.length>0){for(let o of n)t.stderr.write(`error: ${gT(o)}
1913
1912
  `);throw t.stderr.write(`error: agent refusing to start; ensure missing provider CLIs are on PATH
1914
1913
  `),new Ha(n)}let s=r.map(o=>o.provider).join(", ");t.stdout.write(`providers ready: ${s}
1915
- `)}function vT(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=wT(r)?r:tf(process.cwd(),r);return O1(`${n}/index.html`)?n:null}function IT(t){let e=t.LMCTL_LOCAL_MAILBOX_DIR;return e!==void 0&&e!==""?wT(e)?e:tf(process.cwd(),e):tf(L1(),".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 NT(t,e=process.env){let r=B1(t);return typeof r=="string"?r:r.bind==="0.0.0.0"&&!r.insecureNoAuth&&!e.LMCTL_API_TOKEN?"auth required for --bind 0.0.0.0; set LMCTL_API_TOKEN, persist a token via `lmctl api config set api.token ...`, or pass --insecure-no-auth":r}function B1(t){let e={port:8787,bind:"127.0.0.1",noDaemon:!1,insecureNoAuth:!1};for(let r=0;r<t.length;r+=1){let n=t[r];if(n==="--port"){let s=t[++r];if(s===void 0||s.startsWith("--"))return"missing value for --port";let o=Number(s);if(!Number.isInteger(o)||o<=0||o>65535)return`invalid --port: ${s}`;e.port=o;continue}if(n==="--bind"){let s=t[++r];if(s===void 0||s.startsWith("--"))return"missing value for --bind";e.bind=s;continue}if(n==="--no-daemon"){e.noDaemon=!0;continue}if(n==="--insecure-no-auth"){e.insecureNoAuth=!0;continue}if(n==="--webui"){let s=t[r+1];s!==void 0&&!s.startsWith("--")?(e.localWebui={dir:s},r+=1):e.localWebui={dir:void 0};continue}return`unknown argument: ${n}`}return e}var C1,Ha,ST,AT=E(()=>{"use strict";Ue();aE();Ed();_E();vu();Gd();kd();ud();dd();hT();Qd();yT();Ge();C1=`usage: lmctl serve [--port N] [--bind HOST] [--no-daemon] [--insecure-no-auth] [--webui [DIR]]
1914
+ `)}function vT(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=wT(r)?r:tf(process.cwd(),r);return O1(`${n}/index.html`)?n:null}function IT(t){let e=t.LMCTL_LOCAL_MAILBOX_DIR;return e!==void 0&&e!==""?wT(e)?e:tf(process.cwd(),e):tf(L1(),".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 NT(t,e=process.env){let r=B1(t);return typeof r=="string"?r:r.bind==="0.0.0.0"&&!r.insecureNoAuth&&!e.LMCTL_API_TOKEN?"auth required for --bind 0.0.0.0; set LMCTL_API_TOKEN, persist a token via `lmctl api config set api.token ...`, or pass --insecure-no-auth":r}function B1(t){let e={port:8787,bind:"127.0.0.1",noDaemon:!1,insecureNoAuth:!1};for(let r=0;r<t.length;r+=1){let n=t[r];if(n==="--port"){let s=t[++r];if(s===void 0||s.startsWith("--"))return"missing value for --port";let o=Number(s);if(!Number.isInteger(o)||o<=0||o>65535)return`invalid --port: ${s}`;e.port=o;continue}if(n==="--bind"){let s=t[++r];if(s===void 0||s.startsWith("--"))return"missing value for --bind";e.bind=s;continue}if(n==="--no-daemon"){e.noDaemon=!0;continue}if(n==="--insecure-no-auth"){e.insecureNoAuth=!0;continue}if(n==="--webui"){let s=t[r+1];s!==void 0&&!s.startsWith("--")?(e.localWebui={dir:s},r+=1):e.localWebui={dir:void 0};continue}return`unknown argument: ${n}`}return e}var C1,Ha,ST,AT=E(()=>{"use strict";We();aE();Ed();_E();vu();Gd();kd();ud();dd();hT();Qd();yT();Ve();C1=`usage: lmctl serve [--port N] [--bind HOST] [--no-daemon] [--insecure-no-auth] [--webui [DIR]]
1916
1915
 
1917
1916
  Start the local HTTP API, web UI, queue daemon, terminal manager, and agent
1918
1917
  services. Help exits before any port binding or daemon startup.
@@ -1929,62 +1928,61 @@ services. Help exits before any port binding or daemon startup.
1929
1928
  Scan configured project GitHub issues into lmctl, or update per-project
1930
1929
  intake settings such as enabled state, labels, and issue state filters.
1931
1930
  scan writes JSON output; --project limits the scan to one project.
1932
- `});import{createHash as G1}from"node:crypto";import{existsSync as Js,mkdirSync as V1,readFileSync as LT,realpathSync as K1,writeFileSync as Y1}from"node:fs";import{basename as jT,dirname as CT,resolve as MT}from"node:path";function pe(t,e){let r=MT(t);if(Js(r))return K1(r);if(e!==void 0){let n=Q1(t,r,e);if(n!==null)return n}return r}function OT(t,e){let r=CT(e),n=Bd(t,Oa(e),{baseDir:r});for(let s of n.members)s.sessiondir!==void 0&&!s.sessiondir.startsWith("/")&&(s.sessiondir=MT(r,s.sessiondir));return n}function Ze(t,e){let r=pe(t,Z1(e)?e:void 0);if(e!==void 0){let n=e.getRootTeam(r);if(n!==null)return!Js(r)&&"upsertRootTeam"in e&&(V1(CT(r),{recursive:!0}),Y1(r,n.raw_text,"utf8")),OT(n.raw_text,r);if(Js(r)){let s=LT(r,"utf8"),o=OT(s,r);return"upsertRootTeam"in e&&eF(o)&&tF(e,r,o,s),o}throw new Error(`teamfile not found: ${t}`)}if(!Js(r))throw new Error(`teamfile not found: ${t}`);return De(r)}function DT(t,e,r){let n=pe(t,e),s=e.getRootTeam(n);s===null||!Js(n)||LT(n,"utf8")===s.raw_text||r(`warning: ${n} differs from the last seeded DB snapshot; runtime is using the seeded snapshot. Run: lmctl seed ${n}`)}function Z1(t){return typeof t=="object"&&t!==null&&"getRootTeam"in t&&"listRootTeams"in t}function Q1(t,e,r){let n=r.getRootTeam(t)??r.getRootTeam(e);if(n!==null)return n.teamfile_path;let s=jT(t),o=Oa(t),i=r.listRootTeams().filter(l=>jT(l.teamfile_path)===s||l.name===o);if(i.length===0)return null;if(i.length===1)return i[0].teamfile_path;let a=i.map(l=>l.teamfile_path).join(", ");throw new Error(`ambiguous teamfile "${t}" in root-team registry: ${a}; pass an absolute path`)}function eF(t){return t.parseErrors.length>0?!1:t.members.every(e=>e.teamfile!==void 0?!0:e.session!==void 0&&e.session.length>=z1)}function tF(t,e,r,n){let s=new Date().toISOString(),o={teamfile_path:e,name:r.name,raw_text:n,raw_sha256:G1("sha256").update(n).digest("hex"),registered_at:s,last_seeded_at:s};t.upsertRootTeam(o)}var z1,wt=E(()=>{"use strict";Ot();z1=5});import{existsSync as rF}from"node:fs";import{dirname as PT}from"node:path";function oF(t){return nF.test(t)||sF.test(t)}function FT(t){return qa.test(t)}function Et(t){if(!t.includes(":"))return null;let e=t.lastIndexOf(":"),r=t.slice(0,e),n=t.slice(e+1);return!r.endsWith(".lmctl")||!qa.test(n)?null:{teamfile:r,alias:n}}function Je(t,e,r){if(!t.endsWith(".lmctl"))throw new Te(`lmctl: "${t}" doesn't look like a teamfile (expected .lmctl extension).`);if(!FT(e))throw new Te(`lmctl: "${e}" is not a valid alias (must match ${qa.source}).`);let n=pe(t,r);if(r===void 0&&!rF(n))throw new Te(`lmctl: teamfile not found: ${t}`);let s;try{s=Ze(n,r)}catch(i){throw new Te(`lmctl: ${t}: ${i instanceof Error?i.message:String(i)}`)}if(s.parseErrors.length>0)throw new Te(`lmctl: ${t}: ${s.parseErrors.join("; ")}`);let o=Mn(s,e);if(o===void 0){let i=s.members.map(a=>a.alias).join(", ")||"(none)";throw new Te(`lmctl: alias "${e}" not found in ${t}.
1931
+ `});import{createHash as G1}from"node:crypto";import{existsSync as Js,mkdirSync as V1,readFileSync as LT,realpathSync as K1,writeFileSync as Y1}from"node:fs";import{basename as jT,dirname as CT,resolve as MT}from"node:path";function pe(t,e){let r=MT(t);if(Js(r))return K1(r);if(e!==void 0){let n=Q1(t,r,e);if(n!==null)return n}return r}function OT(t,e){let r=CT(e),n=Bd(t,Oa(e),{baseDir:r});for(let s of n.members)s.sessiondir!==void 0&&!s.sessiondir.startsWith("/")&&(s.sessiondir=MT(r,s.sessiondir));return n}function Qe(t,e){let r=pe(t,Z1(e)?e:void 0);if(e!==void 0){let n=e.getRootTeam(r);if(n!==null)return!Js(r)&&"upsertRootTeam"in e&&(V1(CT(r),{recursive:!0}),Y1(r,n.raw_text,"utf8")),OT(n.raw_text,r);if(Js(r)){let s=LT(r,"utf8"),o=OT(s,r);return"upsertRootTeam"in e&&eF(o)&&tF(e,r,o,s),o}throw new Error(`teamfile not found: ${t}`)}if(!Js(r))throw new Error(`teamfile not found: ${t}`);return Pe(r)}function DT(t,e,r){let n=pe(t,e),s=e.getRootTeam(n);s===null||!Js(n)||LT(n,"utf8")===s.raw_text||r(`warning: ${n} differs from the last seeded DB snapshot; runtime is using the seeded snapshot. Run: lmctl seed ${n}`)}function Z1(t){return typeof t=="object"&&t!==null&&"getRootTeam"in t&&"listRootTeams"in t}function Q1(t,e,r){let n=r.getRootTeam(t)??r.getRootTeam(e);if(n!==null)return n.teamfile_path;let s=jT(t),o=Oa(t),i=r.listRootTeams().filter(l=>jT(l.teamfile_path)===s||l.name===o);if(i.length===0)return null;if(i.length===1)return i[0].teamfile_path;let a=i.map(l=>l.teamfile_path).join(", ");throw new Error(`ambiguous teamfile "${t}" in root-team registry: ${a}; pass an absolute path`)}function eF(t){return t.parseErrors.length>0?!1:t.members.every(e=>e.teamfile!==void 0?!0:e.session!==void 0&&e.session.length>=z1)}function tF(t,e,r,n){let s=new Date().toISOString(),o={teamfile_path:e,name:r.name,raw_text:n,raw_sha256:G1("sha256").update(n).digest("hex"),registered_at:s,last_seeded_at:s};t.upsertRootTeam(o)}var z1,wt=E(()=>{"use strict";Ot();z1=5});import{existsSync as rF}from"node:fs";import{dirname as PT}from"node:path";function oF(t){return nF.test(t)||sF.test(t)}function FT(t){return qa.test(t)}function Et(t){if(!t.includes(":"))return null;let e=t.lastIndexOf(":"),r=t.slice(0,e),n=t.slice(e+1);return!r.endsWith(".lmctl")||!qa.test(n)?null:{teamfile:r,alias:n}}function Xe(t,e,r){if(!t.endsWith(".lmctl"))throw new Te(`lmctl: "${t}" doesn't look like a teamfile (expected .lmctl extension).`);if(!FT(e))throw new Te(`lmctl: "${e}" is not a valid alias (must match ${qa.source}).`);let n=pe(t,r);if(r===void 0&&!rF(n))throw new Te(`lmctl: teamfile not found: ${t}`);let s;try{s=Qe(n,r)}catch(i){throw new Te(`lmctl: ${t}: ${i instanceof Error?i.message:String(i)}`)}if(s.parseErrors.length>0)throw new Te(`lmctl: ${t}: ${s.parseErrors.join("; ")}`);let o=Mn(s,e);if(o===void 0){let i=s.members.map(a=>a.alias).join(", ")||"(none)";throw new Te(`lmctl: alias "${e}" not found in ${t}.
1933
1932
  Known aliases: ${i}`)}if(o.teamfile!==void 0){let i=qd(o,PT(n));return{teamfile:n,alias:o.alias,provider:i.provider,sessionid:i.session,sessiondir:i.sessiondir,isLead:!0,...i.model??o.model?{model:i.model??o.model}:{},...i.effort??o.effort?{effort:i.effort??o.effort}:{}}}if(o.session===void 0)throw new Te(`lmctl: alias "${o.alias}" in ${t} has no session ID yet.
1934
1933
  Run: lmctl seed ${t}`);return{teamfile:n,alias:o.alias,provider:o.provider,sessionid:o.session,sessiondir:o.sessiondir??PT(n),isLead:jt(s)?.alias===o.alias,...o.model!==void 0?{model:o.model}:{},...o.effort!==void 0?{effort:o.effort}:{}}}function Er(t,e){let{target:r,alias:n,flags:s}=e;if(s.run!==void 0||s.project!==void 0||s.workflow!==void 0){if(r!==void 0)return{mode:"error",message:`lmctl ${t.name}: --run/--project/--workflow (managed mode) are mutually exclusive with a positional target "${r}" \u2014 pick one form.`};let i={mode:"managed"};return s.run!==void 0&&(i.run=s.run),s.project!==void 0&&(i.project=s.project),s.workflow!==void 0&&(i.workflow=s.workflow),i}if(r!==void 0){let i=Et(r);if(i!==null)return n!==void 0&&n!==i.alias?{mode:"error",message:`lmctl ${t.name}: got "${r}" AND second positional "${n}" \u2014 pick one form.`}:{mode:"ai-team",teamfile:i.teamfile,alias:i.alias};if(r.endsWith(".lmctl"))return n!==void 0?FT(n)?{mode:"ai-team",teamfile:r,alias:n}:{mode:"error",message:`lmctl ${t.name}: "${n}" is not a valid alias (must match ${qa.source}).`}:t.allowsBareTeamfile?{mode:"ai-team",teamfile:r}:{mode:"error",message:`lmctl ${t.name}: alias required.
1935
1934
  Use: lmctl ${t.name} ${r}:<alias> or lmctl ${t.name} ${r} <alias>`};if(oF(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.
1936
1935
  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}".
1937
1936
  Expected one of: <path>.lmctl, <path>.lmctl:<alias>, <sessionid>.`}}if(s.session!==void 0){if(!t.supportsRaw)return{mode:"error",message:`lmctl ${t.name}: --session (raw mode) is not supported by ${t.name}.`};let i={mode:"ai-team-raw",sessionid:s.session};return s.provider!==void 0&&(i.provider=s.provider),i}return{mode:"error",message:`lmctl ${t.name}: a target is required.
1938
- Use: <path>.lmctl[:<alias>] | <path>.lmctl <alias> | <sessionid> | --run <id>`}}var Te,nF,sF,qa,ot=E(()=>{"use strict";Ot();wt();Te=class extends Error{constructor(e){super(e),this.name="ChatTargetError"}},nF=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,sF=/^ses_[A-Za-z0-9_-]+$/,qa=/^[A-Za-z][A-Za-z0-9_-]*$/});function BT(t){let e=UT(t.registry,t.fromTeamfile);if(e===void 0)return Un(`sender team is not registered in policy graph: ${t.fromTeamfile}`);if(!WT(e,t.fromAlias))return Un(`sender alias "${t.fromAlias}" not found in ${t.fromTeamfile}`);let r=UT(t.registry,t.toTeamfile);return r===void 0?Un(`target team is not registered in policy graph: ${t.toTeamfile}`):WT(r,t.toAlias)?t.toTeamfile===t.fromTeamfile?{allowed:!0,outOfPolicy:!1,reason:"same team"}:e.leadAlias===null?Un(`sender team has no Lead: ${t.fromTeamfile}`):t.fromAlias!==e.leadAlias?Un(`cross-team sends may only originate from Lead; got "${t.fromAlias}" in ${t.fromTeamfile}`):{allowed:!0,outOfPolicy:!1,reason:"cross-team send from Lead"}:Un(`target alias "${t.toAlias}" not found in ${t.toTeamfile}`)}function UT(t,e){return t.teams.find(r=>r.teamfile===e)}function WT(t,e){return t.aliases.some(r=>r===e)}function Un(t){return{allowed:!1,outOfPolicy:!0,reason:t}}var HT=E(()=>{"use strict"});import{basename as iF}from"node:path";function XT(t,e){let r=new Date(e.now.getTime()-Wn()).toISOString(),n=KT(t,r).filter(f=>!f.sender.teamfile.startsWith("prompt:")),s=cF(e.sender,n),o=uF(e.sender,n);o!==null&&o.teamfile===e.root&&!JT(s[0],o)&&s.unshift({...o,at:null});let i={teamfile:e.receiverTeamfile,alias:e.receiverAlias,at:e.now.getTime()},a=[...s,i],l=s.filter(f=>JT(f,i)),c=l.map(f=>f.at).filter(f=>f!==null).sort((f,m)=>m-f)[0]??null,u=c!==null&&e.now.getTime()-c<aF;return{stop:l.length>=1&&u,chain:dF(a)}}function GT(t,e){let r=new Date(e.now.getTime()-Wn()).toISOString(),n=KT(t,r),s=YT(e.sender,n);if(s.length===0)return null;let o=s[0];return o.sender.teamfile.startsWith("prompt:")?o.receiver.teamfile:o.sender.teamfile}function Wn(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return qT;let r=Number(e);return!Number.isFinite(r)||r<=0?qT:r}function VT(t){return`cross-team cycle detected (${t}); stopping to prevent a runaway loop.`}function lF(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 KT(t,e){return t.clearAgentInflightOlderThan(e),t.listAgentInflight().map(lF).filter(r=>Number.isFinite(r.at)&&new Date(r.at).toISOString()>=e).sort((r,n)=>r.at-n.at)}function cF(t,e,r={}){let n=new Map;for(let a of e)n.set(Jr(a.receiver),a);let s=[{...t,at:null}],o=t,i=new Set([Jr(t)]);for(let a=0;a<64;a+=1){let l=n.get(Jr(o));if(l===void 0)break;s[0]={...s[0],at:s[0].at??l.at};let c={...l.sender,at:l.at};if(l.sender.teamfile.startsWith("prompt:")&&r.includePromptSender!==!0)break;let u=Jr(l.sender);if(i.has(u))break;s.unshift(c),i.add(u),o=l.sender}return s}function YT(t,e){let r=Jr(t),n=new Set([r]),s=[r],o=[];for(let i=0;s.length>0&&i<128;i+=1){let a=s.shift();for(let l of e){let c=Jr(l.sender),u=Jr(l.receiver);c!==a&&u!==a||(o.includes(l)||o.push(l),n.has(c)||(n.add(c),s.push(c)),n.has(u)||(n.add(u),s.push(u)))}}return o.sort((i,a)=>i.at-a.at)}function uF(t,e){let r=YT(t,e);if(r.length===0)return null;let n=r[0];return n.sender.teamfile.startsWith("prompt:")?n.receiver:n.sender}function JT(t,e){return t.teamfile===e.teamfile&&t.alias===e.alias}function Jr(t){return`${t.teamfile}\0${t.alias}`}function dF(t){return t.map(e=>`${iF(e.teamfile)}:${e.alias}`).join(" \u2192 ")}var aF,qT,rf=E(()=>{"use strict";aF=6e4,qT=8*60*60*1e3});import{randomUUID as fF}from"node:crypto";import{hostname as zT,networkInterfaces as mF}from"node:os";function ZT(t){let e=(t.now??new Date).toISOString();return{lock_id:fF(),teamfile:t.teamfile,alias:t.alias,holder_pid:t.pid??process.pid,holder_host:t.host??zT(),holder_ips:t.ips??yF(),started_at:e,last_heartbeat:e}}function QT(t=process.env){return tb(t.LMCTL_TERMINAL_LOCK_HEARTBEAT_MS,pF)}function _F(t=process.env){return tb(t.LMCTL_TERMINAL_LOCK_STALE_MS,hF)}function nf(t,e={}){let r=e.now??new Date,n=e.localHost??zT(),s=e.staleMs??_F();if(t.holder_host===n)return(e.isProcessAlive??gF)(t.holder_pid)?{live:!0,reason:"local-pid-alive"}:{live:!1,reason:"dead-pid"};let o=Date.parse(t.last_heartbeat);return Number.isFinite(o)?r.getTime()-o<=s?{live:!0,reason:"remote-heartbeat-fresh"}:{live:!1,reason:"stale-heartbeat"}:{live:!1,reason:"stale-heartbeat"}}function eb(t){return`${t.alias} is held by a terminal on ${t.holder_host} since ${t.started_at}; retry or --force`}function tb(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 gF(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 yF(){let t=new Set;for(let e of Object.values(mF()))for(let r of e??[])r.internal||t.add(r.address);return[...t].sort()}var pF,hF,sf=E(()=>{"use strict";pF=15e3,hF=12e4});function Lt(t){let e=[],r;for(let n of t){if(n==="--from"||n.startsWith("--from="))return{args:t,error:"unknown option --from (use I_am=<teamfile:alias>)"};if(n.startsWith("I_am=")){let s=n.slice(5);if(s.length===0)return{args:t,error:"I_am must be <teamfile.lmctl>:<alias>"};if(r!==void 0)return{args:t,error:"I_am may only be specified once"};r=s;continue}e.push(n)}return r===void 0?{args:e}:{args:e,identity:r}}function rb(t,e){let r=Et(t);if(r===null)throw new Error(`I_am must be <teamfile.lmctl>:<alias>, got '${t}'`);let n=pe(r.teamfile,e),s=Ze(n,e);if(s.parseErrors.length>0)throw new Error(`I_am ${r.teamfile}: ${s.parseErrors.join("; ")}`);let o=Mn(s,r.alias);if(o===void 0)throw new Error(`I_am alias "${r.alias}" not found in ${r.teamfile}`);return`${n}:${o.alias}`}function Ct(t,e,r){let n=of(e,r);if(n.ok){if(t!==void 0){let s=rb(t,r);if(s!==n.identity)throw new Error(`I_am=${s} conflicts with your session identity ${n.identity}; you cannot act as another member`)}return{ok:!0,identity:n.identity,source:"session"}}return t!==void 0?{ok:!0,identity:rb(t,r),source:"asserted"}:n}function of(t,e){let r=t[ss];if(r===void 0||r.length===0)return{ok:!1,reason:"unset"};let n=[];for(let o of e.listRootTeams()){let i=Ze(o.teamfile_path,e);for(let a of i.members)a.teamfile===void 0&&a.session===r&&n.push(`${o.teamfile_path}:${a.alias}`)}let s=[...new Set(n)];if(s.length===0)return{ok:!1,reason:"not-found"};if(s.length>1)throw new Error("LMCTL_SELF_SESSIONID matches multiple team members; pass I_am=<teamfile:alias> explicitly");return{ok:!0,identity:s[0]}}var Tr=E(()=>{"use strict";ut();Ot();ot();wt()});function Xr(t){let e=Et(t);if(e===null)throw new Error(`invalid agent identity: ${t}`);return{teamfile:e.teamfile,alias:e.alias,value:t}}function nb(t,e,r){let n=Ct(t,e,r);if(n.ok)return Xr(n.identity);throw n.reason==="unset"?new Error("lmctl send could not infer caller: LMCTL_SELF_SESSIONID is not set; pass I_am=<teamfile:alias>"):new Error("lmctl send could not infer caller from LMCTL_SELF_SESSIONID; pass I_am=<teamfile:alias>")}function sb(t,e,r){let n=Ct(t,e,r);if(n.ok)return Xr(n.identity);throw n.reason==="unset"?new Error("lmctl recv could not infer caller: LMCTL_SELF_SESSIONID is not set; pass I_am=<teamfile:alias>"):new Error("lmctl recv could not infer caller from LMCTL_SELF_SESSIONID; pass I_am=<teamfile:alias>")}function Xs(t){return t.sender_teamfile===null||t.sender_alias===null?"operator":`${t.sender_teamfile}:${t.sender_alias}`}var Gs=E(()=>{"use strict";ot();Tr()});async function br(t){let e=t.onEvent??(()=>{}),r=EF(t.io,e),n=null,s=null,o=null,i,a=null;try{let l=await O(r,M=>Je(t.teamfile,t.alias,M)),c=l.teamfile,u=await O(r,M=>NF(t.selfIdentity,M,t.env??process.env)),d=u.sender,f=await xF(r,{explicitRoot:t.rootFlag,sender:d,receiverTeamfile:c,operatorOrigin:u.origin==="operator"});o=await bF(r,{receiverTeamfile:c,receiverAlias:l.alias,sender:d,rootTeamfile:f,provider:l.provider,model:l.model,sessionId:l.sessionid,cwd:l.sessiondir,prompt:t.prompt,origin:u.origin}),i=kF(r,o);let m=u.origin==="operator"?null:await AF(r,{rootTeamfile:f,sender:d,receiverTeamfile:c,receiverAlias:l.alias});m!==null&&!m.allowed&&e({kind:"warning",message:`warning: out-of-policy chat send: ${m.reason}
1939
- `});try{Si(r,De(c),c)}catch{}n={root_teamfile:f,sender_teamfile:d.teamfile,sender_alias:d.alias,receiver_teamfile:c,receiver_alias:l.alias,policy:m};let p=await OF(r,c,l.alias,t.force===!0);if(p!==null){let M=eb(p),L=await Vs(r,{...n,message:t.prompt,response:null,status:"error",error_detail:M});return a=ib(M,L),{status:"busy",message:M,teamChatLogId:L}}if(u.origin==="agent"&&d.teamfile!==c){let M=await O(r,L=>XT(L,{root:f,sender:d,receiverTeamfile:c,receiverAlias:l.alias,now:new Date}));if(M.stop){let L=VT(M.chain),$=await Vs(r,{...n,message:t.prompt,response:null,status:"error",error_detail:L});return a=Ja(L,$),{status:"error",errorKind:"cycle",message:L,teamChatLogId:$}}}let _=await jF(r,{receiver_teamfile:c,receiver_alias:l.alias,sender_teamfile:d.teamfile,sender_alias:d.alias,force:t.force===!0});if(!_.acquired){let M=CF(c,l.alias,_.current),L=await Vs(r,{...n,message:t.prompt,response:null,status:"error",error_detail:M});return a=ib(M,L),{status:"busy",message:M,teamChatLogId:L}}s=_.lease;let g=!1,h=he(),b=0,w=0,k=0,N={provider:l.provider,sessionId:l.sessionid,cwd:l.sessiondir,prompt:t.prompt,permissionMode:t.permissionMode,env:t.env??process.env,onDelta:M=>{g=!0,h&&(b+=1,k=Buffer.byteLength(M,"utf8"),w+=k),e({kind:"delta",chunk:M})},onProgress:M=>e({kind:"progress",alias:l.alias,event:M})};l.model!==void 0&&(N.model=l.model),l.effort!==void 0&&(N.effort=l.effort),N.alias=l.alias,N.isLead=l.isLead,t.idleTimeoutMs!==void 0&&(N.timeoutMs=t.idleTimeoutMs);let v=await Xt(N);h&&Fe(JSON.stringify({event:"chat_return",alias:l.alias,provider:l.provider,streamed:g,blockCount:b,streamedBytes:w,resultTextBytes:Buffer.byteLength(v.text,"utf8"),lastChunkBytes:k,tailPreview:TF(v.text,200)}));let R=v.status==="stalled",G=await Vs(r,{...n,message:t.prompt,response:R?null:v.text,status:n.policy?.outOfPolicy===!0?"out_of_policy":R?"error":"ok",error_detail:n.policy?.outOfPolicy===!0?n.policy.reason:R?`provider stalled${v.stalledAfterMs!==void 0?` after ${v.stalledAfterMs}ms`:""}`:null});return a=R?Ja(`provider stalled${v.stalledAfterMs!==void 0?` after ${v.stalledAfterMs}ms`:""}`,G,v.text):vF(v.text,G),{status:R?"stalled":"ok",replyText:v.text,wroteDelta:g,teamChatLogId:G,durationMs:v.durationMs}}catch(l){let c=l instanceof Error?l.message:String(l),u=n===null?null:await Vs(r,{...n,message:t.prompt,response:null,status:n.policy?.outOfPolicy===!0?"out_of_policy":"error",error_detail:n.policy?.outOfPolicy===!0?`${n.policy.reason}; provider error: ${c}`:c});return a=Ja(c,u),{status:"error",errorKind:l instanceof Te?"target":"provider",message:c,teamChatLogId:u}}finally{i!==void 0&&clearInterval(i),s!==null&&await LF(r,s),o!==null&&await SF(r,o,a??Ja("chat turn exited without a terminal outcome",null))}}function EF(t,e){return{...t,stdout:{write:()=>{}},stderr:{write:r=>{e({kind:"warning",message:r})}}}}function TF(t,e){return t.slice(-e)}async function bF(t,e){try{return(await O(t,n=>n.startTrackedInvocation({kind:"chat",origin:e.origin,scope_teamfile:e.receiverTeamfile,from_identity:`${e.sender.teamfile}:${e.sender.alias}`,target_teamfile:e.receiverTeamfile,target_alias:e.receiverAlias,root_teamfile:e.rootTeamfile,cwd:e.cwd??null,command:IF(e.receiverTeamfile,e.receiverAlias,e.prompt),holder_pid:process.pid,meta:JSON.stringify({provider:e.provider,model:e.model??null,sessionid:e.sessionId??null})}))).id}catch(r){return he()&&Fe(JSON.stringify({event:"tracked_invocation_start_error",error:r instanceof Error?r.message:String(r)})),null}}async function SF(t,e,r){try{await O(t,n=>{n.finishTrackedInvocation(e,r)})}catch(n){he()&&Fe(JSON.stringify({event:"tracked_invocation_finish_error",id:e,error:n instanceof Error?n.message:String(n)}))}}function kF(t,e){if(e===null)return;let r=setInterval(()=>{O(t,n=>n.heartbeatTrackedInvocation(e)).catch(n=>{he()&&Fe(JSON.stringify({event:"tracked_invocation_heartbeat_error",id:e,error:n instanceof Error?n.message:String(n)}))})},wF);return r.unref?.(),r}function vF(t,e){return{status:"done",result_summary:Xa(t),error:null,team_chat_log_id:e}}function ib(t,e){return{status:"busy",result_summary:Xa(t),error:t,team_chat_log_id:e}}function Ja(t,e,r){return{status:"error",result_summary:Xa(r===void 0?t:r),error:t,team_chat_log_id:e}}function Xa(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=500?e:`${e.slice(0,497)}...`}function IF(t,e,r){return`lmctl chat ${JSON.stringify(t)} ${e} ${JSON.stringify(r)}`}function NF(t,e,r){let n=Ct(t,r,e);if(n.ok)return{sender:Xr(n.identity),origin:"agent"};throw n.reason==="unset"?new Error("lmctl chat could not infer caller: LMCTL_SELF_SESSIONID is not set; pass I_am=<teamfile:alias>"):new Error("lmctl chat could not infer caller from LMCTL_SELF_SESSIONID; pass I_am=<teamfile:alias>")}async function xF(t,e){return e.explicitRoot!==void 0?await O(t,r=>pe(e.explicitRoot,r)):e.operatorOrigin?e.receiverTeamfile:await O(t,r=>GT(r,{sender:e.sender,now:new Date})??e.receiverTeamfile)}async function AF(t,e){return await O(t,r=>BT({rootTeamfile:e.rootTeamfile,fromTeamfile:e.sender.teamfile,fromAlias:e.sender.alias,toTeamfile:e.receiverTeamfile,toAlias:e.receiverAlias,registry:$F(r,e.sender.teamfile,e.receiverTeamfile)}))}function $F(t,e,r){return{teams:[e,r].map(s=>RF(s,t))}}function RF(t,e){let r=Ze(t,e),n=jt(r);return{teamfile:t,aliases:r.members.map(s=>s.alias),leadAlias:n?.alias??null}}async function jF(t,e){return await O(t,r=>{let n=he(),s=Pn(r,{receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,force:e.force,ttlMs:Wn()});return s.acquired?(n&&Fe(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:ab(s.previous)}})),{acquired:!0,lease:s.lease}):(n&&Fe(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:ab(s.current)})),{acquired:!1,current:s.current})})}async function OF(t,e,r,n){return await O(t,s=>{for(let i=0;i<2;i+=1){let a=s.getTerminalLock(e,r);if(a===null)return null;if(!n&&nf(a).live)return a;let l=s.getAgentInflight(e,r);if(s.clearTerminalLock(e,r,a.lock_id))return l!==null&&l.sender_teamfile===e&&l.sender_alias==="terminal"&&s.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 o=s.getTerminalLock(e,r);return o===null||n?null:nf(o).live?o:null})}function ab(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 LF(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)}
1937
+ Use: <path>.lmctl[:<alias>] | <path>.lmctl <alias> | <sessionid> | --run <id>`}}var Te,nF,sF,qa,it=E(()=>{"use strict";Ot();wt();Te=class extends Error{constructor(e){super(e),this.name="ChatTargetError"}},nF=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,sF=/^ses_[A-Za-z0-9_-]+$/,qa=/^[A-Za-z][A-Za-z0-9_-]*$/});function BT(t){let e=UT(t.registry,t.fromTeamfile);if(e===void 0)return Un(`sender team is not registered in policy graph: ${t.fromTeamfile}`);if(!WT(e,t.fromAlias))return Un(`sender alias "${t.fromAlias}" not found in ${t.fromTeamfile}`);let r=UT(t.registry,t.toTeamfile);return r===void 0?Un(`target team is not registered in policy graph: ${t.toTeamfile}`):WT(r,t.toAlias)?t.toTeamfile===t.fromTeamfile?{allowed:!0,outOfPolicy:!1,reason:"same team"}:e.leadAlias===null?Un(`sender team has no Lead: ${t.fromTeamfile}`):t.fromAlias!==e.leadAlias?Un(`cross-team sends may only originate from Lead; got "${t.fromAlias}" in ${t.fromTeamfile}`):{allowed:!0,outOfPolicy:!1,reason:"cross-team send from Lead"}:Un(`target alias "${t.toAlias}" not found in ${t.toTeamfile}`)}function UT(t,e){return t.teams.find(r=>r.teamfile===e)}function WT(t,e){return t.aliases.some(r=>r===e)}function Un(t){return{allowed:!1,outOfPolicy:!0,reason:t}}var HT=E(()=>{"use strict"});import{basename as iF}from"node:path";function XT(t,e){let r=new Date(e.now.getTime()-Wn()).toISOString(),n=KT(t,r).filter(f=>!f.sender.teamfile.startsWith("prompt:")),s=cF(e.sender,n),o=uF(e.sender,n);o!==null&&o.teamfile===e.root&&!JT(s[0],o)&&s.unshift({...o,at:null});let i={teamfile:e.receiverTeamfile,alias:e.receiverAlias,at:e.now.getTime()},a=[...s,i],l=s.filter(f=>JT(f,i)),c=l.map(f=>f.at).filter(f=>f!==null).sort((f,m)=>m-f)[0]??null,u=c!==null&&e.now.getTime()-c<aF;return{stop:l.length>=1&&u,chain:dF(a)}}function GT(t,e){let r=new Date(e.now.getTime()-Wn()).toISOString(),n=KT(t,r),s=YT(e.sender,n);if(s.length===0)return null;let o=s[0];return o.sender.teamfile.startsWith("prompt:")?o.receiver.teamfile:o.sender.teamfile}function Wn(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return qT;let r=Number(e);return!Number.isFinite(r)||r<=0?qT:r}function VT(t){return`cross-team cycle detected (${t}); stopping to prevent a runaway loop.`}function lF(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 KT(t,e){return t.clearAgentInflightOlderThan(e),t.listAgentInflight().map(lF).filter(r=>Number.isFinite(r.at)&&new Date(r.at).toISOString()>=e).sort((r,n)=>r.at-n.at)}function cF(t,e,r={}){let n=new Map;for(let a of e)n.set(Jr(a.receiver),a);let s=[{...t,at:null}],o=t,i=new Set([Jr(t)]);for(let a=0;a<64;a+=1){let l=n.get(Jr(o));if(l===void 0)break;s[0]={...s[0],at:s[0].at??l.at};let c={...l.sender,at:l.at};if(l.sender.teamfile.startsWith("prompt:")&&r.includePromptSender!==!0)break;let u=Jr(l.sender);if(i.has(u))break;s.unshift(c),i.add(u),o=l.sender}return s}function YT(t,e){let r=Jr(t),n=new Set([r]),s=[r],o=[];for(let i=0;s.length>0&&i<128;i+=1){let a=s.shift();for(let l of e){let c=Jr(l.sender),u=Jr(l.receiver);c!==a&&u!==a||(o.includes(l)||o.push(l),n.has(c)||(n.add(c),s.push(c)),n.has(u)||(n.add(u),s.push(u)))}}return o.sort((i,a)=>i.at-a.at)}function uF(t,e){let r=YT(t,e);if(r.length===0)return null;let n=r[0];return n.sender.teamfile.startsWith("prompt:")?n.receiver:n.sender}function JT(t,e){return t.teamfile===e.teamfile&&t.alias===e.alias}function Jr(t){return`${t.teamfile}\0${t.alias}`}function dF(t){return t.map(e=>`${iF(e.teamfile)}:${e.alias}`).join(" \u2192 ")}var aF,qT,rf=E(()=>{"use strict";aF=6e4,qT=8*60*60*1e3});import{randomUUID as fF}from"node:crypto";import{hostname as zT,networkInterfaces as mF}from"node:os";function ZT(t){let e=(t.now??new Date).toISOString();return{lock_id:fF(),teamfile:t.teamfile,alias:t.alias,holder_pid:t.pid??process.pid,holder_host:t.host??zT(),holder_ips:t.ips??yF(),started_at:e,last_heartbeat:e}}function QT(t=process.env){return tb(t.LMCTL_TERMINAL_LOCK_HEARTBEAT_MS,pF)}function _F(t=process.env){return tb(t.LMCTL_TERMINAL_LOCK_STALE_MS,hF)}function nf(t,e={}){let r=e.now??new Date,n=e.localHost??zT(),s=e.staleMs??_F();if(t.holder_host===n)return(e.isProcessAlive??gF)(t.holder_pid)?{live:!0,reason:"local-pid-alive"}:{live:!1,reason:"dead-pid"};let o=Date.parse(t.last_heartbeat);return Number.isFinite(o)?r.getTime()-o<=s?{live:!0,reason:"remote-heartbeat-fresh"}:{live:!1,reason:"stale-heartbeat"}:{live:!1,reason:"stale-heartbeat"}}function eb(t){return`${t.alias} is held by a terminal on ${t.holder_host} since ${t.started_at}; retry later or use lmctl send`}function tb(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 gF(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 yF(){let t=new Set;for(let e of Object.values(mF()))for(let r of e??[])r.internal||t.add(r.address);return[...t].sort()}var pF,hF,sf=E(()=>{"use strict";pF=15e3,hF=12e4});function Lt(t){let e=[],r;for(let n of t){if(n==="--from"||n.startsWith("--from="))return{args:t,error:"unknown option --from (use I_am=<teamfile:alias>)"};if(n.startsWith("I_am=")){let s=n.slice(5);if(s.length===0)return{args:t,error:"I_am must be <teamfile.lmctl>:<alias>"};if(r!==void 0)return{args:t,error:"I_am may only be specified once"};r=s;continue}e.push(n)}return r===void 0?{args:e}:{args:e,identity:r}}function rb(t,e){let r=Et(t);if(r===null)throw new Error(`I_am must be <teamfile.lmctl>:<alias>, got '${t}'`);let n=pe(r.teamfile,e),s=Qe(n,e);if(s.parseErrors.length>0)throw new Error(`I_am ${r.teamfile}: ${s.parseErrors.join("; ")}`);let o=Mn(s,r.alias);if(o===void 0)throw new Error(`I_am alias "${r.alias}" not found in ${r.teamfile}`);return`${n}:${o.alias}`}function Ct(t,e,r){let n=of(e,r);if(n.ok){if(t!==void 0){let s=rb(t,r);if(s!==n.identity)throw new Error(`I_am=${s} conflicts with your session identity ${n.identity}; you cannot act as another member`)}return{ok:!0,identity:n.identity,source:"session"}}return t!==void 0?{ok:!0,identity:rb(t,r),source:"asserted"}:n}function of(t,e){let r=t[ss];if(r===void 0||r.length===0)return{ok:!1,reason:"unset"};let n=[];for(let o of e.listRootTeams()){let i=Qe(o.teamfile_path,e);for(let a of i.members)a.teamfile===void 0&&a.session===r&&n.push(`${o.teamfile_path}:${a.alias}`)}let s=[...new Set(n)];if(s.length===0)return{ok:!1,reason:"not-found"};if(s.length>1)throw new Error("LMCTL_SELF_SESSIONID matches multiple team members; pass I_am=<teamfile:alias> explicitly");return{ok:!0,identity:s[0]}}var Tr=E(()=>{"use strict";ut();Ot();it();wt()});function Xr(t){let e=Et(t);if(e===null)throw new Error(`invalid agent identity: ${t}`);return{teamfile:e.teamfile,alias:e.alias,value:t}}function nb(t,e,r){let n=Ct(t,e,r);if(n.ok)return Xr(n.identity);throw n.reason==="unset"?new Error("lmctl send could not infer caller: LMCTL_SELF_SESSIONID is not set; pass I_am=<teamfile:alias>"):new Error("lmctl send could not infer caller from LMCTL_SELF_SESSIONID; pass I_am=<teamfile:alias>")}function sb(t,e,r){let n=Ct(t,e,r);if(n.ok)return Xr(n.identity);throw n.reason==="unset"?new Error("lmctl recv could not infer caller: LMCTL_SELF_SESSIONID is not set; pass I_am=<teamfile:alias>"):new Error("lmctl recv could not infer caller from LMCTL_SELF_SESSIONID; pass I_am=<teamfile:alias>")}function Xs(t){return t.sender_teamfile===null||t.sender_alias===null?"operator":`${t.sender_teamfile}:${t.sender_alias}`}var Gs=E(()=>{"use strict";it();Tr()});async function br(t){let e=t.onEvent??(()=>{}),r=EF(t.io,e),n=null,s=null,o=null,i,a=null;try{let l=await O(r,M=>Xe(t.teamfile,t.alias,M)),c=l.teamfile,u=await O(r,M=>NF(t.selfIdentity,M,t.env??process.env)),d=u.sender,f=await xF(r,{explicitRoot:t.rootFlag,sender:d,receiverTeamfile:c,operatorOrigin:u.origin==="operator"});o=await bF(r,{receiverTeamfile:c,receiverAlias:l.alias,sender:d,rootTeamfile:f,provider:l.provider,model:l.model,sessionId:l.sessionid,cwd:l.sessiondir,prompt:t.prompt,origin:u.origin}),i=kF(r,o);let m=u.origin==="operator"?null:await AF(r,{rootTeamfile:f,sender:d,receiverTeamfile:c,receiverAlias:l.alias});m!==null&&!m.allowed&&e({kind:"warning",message:`warning: out-of-policy chat send: ${m.reason}
1938
+ `});try{Si(r,Pe(c),c)}catch{}n={root_teamfile:f,sender_teamfile:d.teamfile,sender_alias:d.alias,receiver_teamfile:c,receiver_alias:l.alias,policy:m};let p=await OF(r,c,l.alias);if(p!==null){let M=eb(p),L=await Vs(r,{...n,message:t.prompt,response:null,status:"error",error_detail:M});return a=ib(M,L),{status:"busy",message:M,teamChatLogId:L}}if(u.origin==="agent"&&d.teamfile!==c){let M=await O(r,L=>XT(L,{root:f,sender:d,receiverTeamfile:c,receiverAlias:l.alias,now:new Date}));if(M.stop){let L=VT(M.chain),$=await Vs(r,{...n,message:t.prompt,response:null,status:"error",error_detail:L});return a=Ja(L,$),{status:"error",errorKind:"cycle",message:L,teamChatLogId:$}}}let h=await jF(r,{receiver_teamfile:c,receiver_alias:l.alias,sender_teamfile:d.teamfile,sender_alias:d.alias});if(!h.acquired){let M=CF(c,l.alias,h.current),L=await Vs(r,{...n,message:t.prompt,response:null,status:"error",error_detail:M});return a=ib(M,L),{status:"busy",message:M,teamChatLogId:L}}s=h.lease;let g=!1,_=he(),b=0,w=0,k=0,N={provider:l.provider,sessionId:l.sessionid,cwd:l.sessiondir,prompt:t.prompt,permissionMode:t.permissionMode,env:t.env??process.env,onDelta:M=>{g=!0,_&&(b+=1,k=Buffer.byteLength(M,"utf8"),w+=k),e({kind:"delta",chunk:M})},onProgress:M=>e({kind:"progress",alias:l.alias,event:M})};l.model!==void 0&&(N.model=l.model),l.effort!==void 0&&(N.effort=l.effort),N.alias=l.alias,N.isLead=l.isLead,t.idleTimeoutMs!==void 0&&(N.timeoutMs=t.idleTimeoutMs);let v=await Xt(N);_&&Ue(JSON.stringify({event:"chat_return",alias:l.alias,provider:l.provider,streamed:g,blockCount:b,streamedBytes:w,resultTextBytes:Buffer.byteLength(v.text,"utf8"),lastChunkBytes:k,tailPreview:TF(v.text,200)}));let R=v.status==="stalled",G=await Vs(r,{...n,message:t.prompt,response:R?null:v.text,status:n.policy?.outOfPolicy===!0?"out_of_policy":R?"error":"ok",error_detail:n.policy?.outOfPolicy===!0?n.policy.reason:R?`provider stalled${v.stalledAfterMs!==void 0?` after ${v.stalledAfterMs}ms`:""}`:null});return a=R?Ja(`provider stalled${v.stalledAfterMs!==void 0?` after ${v.stalledAfterMs}ms`:""}`,G,v.text):vF(v.text,G),{status:R?"stalled":"ok",replyText:v.text,wroteDelta:g,teamChatLogId:G,durationMs:v.durationMs}}catch(l){let c=l instanceof Error?l.message:String(l),u=n===null?null:await Vs(r,{...n,message:t.prompt,response:null,status:n.policy?.outOfPolicy===!0?"out_of_policy":"error",error_detail:n.policy?.outOfPolicy===!0?`${n.policy.reason}; provider error: ${c}`:c});return a=Ja(c,u),{status:"error",errorKind:l instanceof Te?"target":"provider",message:c,teamChatLogId:u}}finally{i!==void 0&&clearInterval(i),s!==null&&await LF(r,s),o!==null&&await SF(r,o,a??Ja("chat turn exited without a terminal outcome",null))}}function EF(t,e){return{...t,stdout:{write:()=>{}},stderr:{write:r=>{e({kind:"warning",message:r})}}}}function TF(t,e){return t.slice(-e)}async function bF(t,e){try{return(await O(t,n=>n.startTrackedInvocation({kind:"chat",origin:e.origin,scope_teamfile:e.receiverTeamfile,from_identity:`${e.sender.teamfile}:${e.sender.alias}`,target_teamfile:e.receiverTeamfile,target_alias:e.receiverAlias,root_teamfile:e.rootTeamfile,cwd:e.cwd??null,command:IF(e.receiverTeamfile,e.receiverAlias,e.prompt),holder_pid:process.pid,meta:JSON.stringify({provider:e.provider,model:e.model??null,sessionid:e.sessionId??null})}))).id}catch(r){return he()&&Ue(JSON.stringify({event:"tracked_invocation_start_error",error:r instanceof Error?r.message:String(r)})),null}}async function SF(t,e,r){try{await O(t,n=>{n.finishTrackedInvocation(e,r)})}catch(n){he()&&Ue(JSON.stringify({event:"tracked_invocation_finish_error",id:e,error:n instanceof Error?n.message:String(n)}))}}function kF(t,e){if(e===null)return;let r=setInterval(()=>{O(t,n=>n.heartbeatTrackedInvocation(e)).catch(n=>{he()&&Ue(JSON.stringify({event:"tracked_invocation_heartbeat_error",id:e,error:n instanceof Error?n.message:String(n)}))})},wF);return r.unref?.(),r}function vF(t,e){return{status:"done",result_summary:Xa(t),error:null,team_chat_log_id:e}}function ib(t,e){return{status:"busy",result_summary:Xa(t),error:t,team_chat_log_id:e}}function Ja(t,e,r){return{status:"error",result_summary:Xa(r===void 0?t:r),error:t,team_chat_log_id:e}}function Xa(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=500?e:`${e.slice(0,497)}...`}function IF(t,e,r){return`lmctl chat ${JSON.stringify(t)} ${e} ${JSON.stringify(r)}`}function NF(t,e,r){let n=Ct(t,r,e);if(n.ok)return{sender:Xr(n.identity),origin:"agent"};throw n.reason==="unset"?new Error("lmctl chat could not infer caller: LMCTL_SELF_SESSIONID is not set; pass I_am=<teamfile:alias>"):new Error("lmctl chat could not infer caller from LMCTL_SELF_SESSIONID; pass I_am=<teamfile:alias>")}async function xF(t,e){return e.explicitRoot!==void 0?await O(t,r=>pe(e.explicitRoot,r)):e.operatorOrigin?e.receiverTeamfile:await O(t,r=>GT(r,{sender:e.sender,now:new Date})??e.receiverTeamfile)}async function AF(t,e){return await O(t,r=>BT({rootTeamfile:e.rootTeamfile,fromTeamfile:e.sender.teamfile,fromAlias:e.sender.alias,toTeamfile:e.receiverTeamfile,toAlias:e.receiverAlias,registry:$F(r,e.sender.teamfile,e.receiverTeamfile)}))}function $F(t,e,r){return{teams:[e,r].map(s=>RF(s,t))}}function RF(t,e){let r=Qe(t,e),n=jt(r);return{teamfile:t,aliases:r.members.map(s=>s.alias),leadAlias:n?.alias??null}}async function jF(t,e){return await O(t,r=>{let n=he(),s=Pn(r,{receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,ttlMs:Wn()});return s.acquired?(n&&Ue(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:ab(s.previous)}})),{acquired:!0,lease:s.lease}):(n&&Ue(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:ab(s.current)})),{acquired:!1,current:s.current})})}async function OF(t,e,r){return await O(t,n=>{for(let o=0;o<2;o+=1){let i=n.getTerminalLock(e,r);if(i===null)return null;if(nf(i).live)return i;let l=n.getAgentInflight(e,r);if(n.clearTerminalLock(e,r,i.lock_id))return l!==null&&l.sender_teamfile===e&&l.sender_alias==="terminal"&&n.clearObservedTerminalAgentInflight(e,r,{sender_teamfile:l.sender_teamfile,sender_alias:l.sender_alias,started_at:l.started_at,holder_pid:l.holder_pid}),null}let s=n.getTerminalLock(e,r);return s===null?null:nf(s).live?s:null})}function ab(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 LF(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)}
1940
1939
  `)}}function CF(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 Vs(t,e){let r=lb(e.message),n=e.response===null?null:lb(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,message:r.text,response:n?.text??null,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)}
1941
- `),null}}function lb(t){return t.length<=ob?{text:t,truncated:!1}:{text:t.slice(0,ob),truncated:!0}}var ob,wF,Ks=E(()=>{"use strict";It();ot();Ot();ki();HT();wt();rf();Ne();fe();Ca();sf();Tr();Gs();ob=256*1024,wF=3e4});var fb={};re(fb,{parseIdleTimeoutMs:()=>ub,runChat:()=>DF});async function DF(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(`${cb}
1940
+ `),null}}function lb(t){return t.length<=ob?{text:t,truncated:!1}:{text:t.slice(0,ob),truncated:!0}}var ob,wF,Ks=E(()=>{"use strict";It();it();Ot();ki();HT();wt();rf();Ne();fe();Ca();sf();Tr();Gs();ob=256*1024,wF=3e4});var fb={};re(fb,{parseIdleTimeoutMs:()=>ub,runChat:()=>DF});async function DF(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(`${cb}
1942
1941
  `),t.length===0?2:0;let n=PF(t);if(typeof n=="string")return e.stderr.write(`error: ${n}
1943
1942
  ${cb}
1944
1943
  `),2;if(n.runFlag!==void 0){let d=Number.parseInt(n.runFlag,10);return!Number.isFinite(d)||d<=0||String(d)!==n.runFlag?(e.stderr.write(`error: invalid --run "${n.runFlag}" (expected a positive integer run id)
1945
1944
  `),2):await O(e,async f=>{let m=f.getRun(d);if(m===null)return e.stderr.write(`error: run ${d}: not found
1946
1945
  `),1;if(m.terminal_state!==null&&m.terminal_state.length>0)return y(e,`run ${d}: already terminal (${m.terminal_state}); chat --run cannot resume a terminated run`);let p=Ta(f,d);if(p===null)return e.stderr.write(`error: run ${d}: no pending operator-answerable attention (chat --run only resumes paused runs)
1947
1946
  `),1;if(p.kind==="workflow_escalation"){if(n.done)return e.stderr.write(`error: --done is not valid for workflow_escalation (the decision itself is terminal)
1948
- `),2;let _=f.resumeEscalation(p.attention_id,n.prompt);return _.resumed===!0?(e.stdout.write(`run ${d}: escalation resumed (decision: ${n.prompt})
1949
- `),0):(e.stderr.write(`error: run ${d}: resumeEscalation failed (${_.reason})
1950
- `),1)}if(p.kind==="interactive_waiting_operator"){let _=Nt(f,p.attention_id);if(_===null||_.step_id===null)return e.stderr.write(`error: run ${d}: pending interactive_waiting_operator attention has no associated interactive step
1951
- `),1;let g=f.resumeInteractive(_.step_id,n.prompt,n.done===!0);return g.resumed===!0?(e.stdout.write(`run ${d}: interactive resumed (step ${_.step_id}${n.done===!0?", done":""})
1947
+ `),2;let h=f.resumeEscalation(p.attention_id,n.prompt);return h.resumed===!0?(e.stdout.write(`run ${d}: escalation resumed (decision: ${n.prompt})
1948
+ `),0):(e.stderr.write(`error: run ${d}: resumeEscalation failed (${h.reason})
1949
+ `),1)}if(p.kind==="interactive_waiting_operator"){let h=Nt(f,p.attention_id);if(h===null||h.step_id===null)return e.stderr.write(`error: run ${d}: pending interactive_waiting_operator attention has no associated interactive step
1950
+ `),1;let g=f.resumeInteractive(h.step_id,n.prompt,n.done===!0);return g.resumed===!0?(e.stdout.write(`run ${d}: interactive resumed (step ${h.step_id}${n.done===!0?", done":""})
1952
1951
  `),0):(e.stderr.write(`error: run ${d}: resumeInteractive failed (${g.reason})
1953
1952
  `),1)}return e.stderr.write(`error: run ${d}: pending attention kind "${p.kind}" is not operator-answerable
1954
1953
  `),1})}let s=Er(MF,{target:n.target,alias:n.alias,flags:{session:n.sessionFlag,provider:n.providerFlag}});if(s.mode==="error")return e.stderr.write(`error: ${s.message}
1955
1954
  `),2;if(s.mode==="managed")return e.stderr.write(`error: chat managed mode requires --run <id>
1956
1955
  `),2;let o;if(s.mode==="ai-team"){if(s.alias===void 0)return e.stderr.write(`error: chat: alias required (internal)
1957
- `),2;let d=await br({teamfile:s.teamfile,alias:s.alias,prompt:n.prompt,permissionMode:n.permissionMode,...n.idleTimeoutMs!==void 0?{idleTimeoutMs:n.idleTimeoutMs}:{},...n.selfIdentity!==void 0?{selfIdentity:n.selfIdentity}:{},...n.rootFlag!==void 0?{rootFlag:n.rootFlag}:{},force:n.force===!0,env:r,io:e,onEvent:f=>UF(e,f)});return d.status==="busy"?(e.stderr.write(`error: ${d.message}
1956
+ `),2;let d=await br({teamfile:s.teamfile,alias:s.alias,prompt:n.prompt,permissionMode:n.permissionMode,...n.idleTimeoutMs!==void 0?{idleTimeoutMs:n.idleTimeoutMs}:{},...n.selfIdentity!==void 0?{selfIdentity:n.selfIdentity}:{},...n.rootFlag!==void 0?{rootFlag:n.rootFlag}:{},env:r,io:e,onEvent:f=>UF(e,f)});return d.status==="busy"?(e.stderr.write(`error: ${d.message}
1958
1957
  `),1):d.status==="error"?(d.errorKind==="cycle"?e.stderr.write(`${d.message}
1959
1958
  `):e.stderr.write(`error: ${d.message}
1960
1959
  `),1):(d.wroteDelta?d.replyText.endsWith(`
1961
1960
  `)||e.stdout.write(`
1962
1961
  `):e.stdout.write(`${d.replyText}${d.replyText.endsWith(`
1963
1962
  `)?"":`
1964
- `}`),d.status==="stalled"?1:0)}else{if(n.force===!0)return e.stderr.write(`error: --force is only valid for AI-team chat
1965
- `),2;if(s.provider===void 0)return e.stderr.write(`error: chat raw mode (bare sessionid / --session) requires --provider <name>
1966
- `),2;o={provider:s.provider,sessionId:s.sessionid,cwd:process.cwd()}}let i=!1,a=he(),l=0,c=0,u=0;try{let d={provider:o.provider,sessionId:o.sessionId,cwd:o.cwd,prompt:n.prompt,permissionMode:n.permissionMode,env:r,onDelta:p=>{i=!0,a&&(l+=1,u=Buffer.byteLength(p,"utf8"),c+=u),e.stdout.write(p)},onProgress:p=>db(e,o.alias??"(raw)",p)};o.model!==void 0&&(d.model=o.model),o.effort!==void 0&&(d.effort=o.effort),o.alias!==void 0&&(d.alias=o.alias),o.isLead!==void 0&&(d.isLead=o.isLead),n.idleTimeoutMs!==void 0&&(d.timeoutMs=n.idleTimeoutMs);let f=await Xt(d);a&&Fe(JSON.stringify({event:"chat_return",alias:o.alias??"(raw)",provider:o.provider,streamed:i,blockCount:l,streamedBytes:c,resultTextBytes:Buffer.byteLength(f.text,"utf8"),lastChunkBytes:u,tailPreview:FF(f.text,200)}));let m=f.status==="stalled";return i?f.text.endsWith(`
1963
+ `}`),d.status==="stalled"?1:0)}else{if(s.provider===void 0)return e.stderr.write(`error: chat raw mode (bare sessionid / --session) requires --provider <name>
1964
+ `),2;o={provider:s.provider,sessionId:s.sessionid,cwd:process.cwd()}}let i=!1,a=he(),l=0,c=0,u=0;try{let d={provider:o.provider,sessionId:o.sessionId,cwd:o.cwd,prompt:n.prompt,permissionMode:n.permissionMode,env:r,onDelta:p=>{i=!0,a&&(l+=1,u=Buffer.byteLength(p,"utf8"),c+=u),e.stdout.write(p)},onProgress:p=>db(e,o.alias??"(raw)",p)};o.model!==void 0&&(d.model=o.model),o.effort!==void 0&&(d.effort=o.effort),o.alias!==void 0&&(d.alias=o.alias),o.isLead!==void 0&&(d.isLead=o.isLead),n.idleTimeoutMs!==void 0&&(d.timeoutMs=n.idleTimeoutMs);let f=await Xt(d);a&&Ue(JSON.stringify({event:"chat_return",alias:o.alias??"(raw)",provider:o.provider,streamed:i,blockCount:l,streamedBytes:c,resultTextBytes:Buffer.byteLength(f.text,"utf8"),lastChunkBytes:u,tailPreview:FF(f.text,200)}));let m=f.status==="stalled";return i?f.text.endsWith(`
1967
1965
  `)||e.stdout.write(`
1968
1966
  `):e.stdout.write(`${f.text}${f.text.endsWith(`
1969
1967
  `)?"":`
1970
1968
  `}`),f.status==="stalled"?1:0}catch(d){let f=d instanceof Error?d.message:String(d);return e.stderr.write(`error: ${f}
1971
- `),1}}function PF(t){let e=[],r="yolo",n,s,o,i,a,l=!1,c,u=!1;for(let _=0;_<t.length;_+=1){let g=t[_];if(g==="--permission-mode"){let h=t[++_];if(h===void 0||h.startsWith("--"))return"missing value for --permission-mode";if(h!=="plan"&&h!=="yolo")return`--permission-mode must be one of plan|yolo (got "${h}")`;r=h;continue}if(g==="--idle-timeout"){let h=t[++_];if(h===void 0||h.startsWith("--"))return"missing value for --idle-timeout";let b=ub(h);if(typeof b=="string")return b;n=b;continue}if(g==="--session"){let h=t[++_];if(h===void 0||h.startsWith("--"))return"missing value for --session";s=h;continue}if(g==="--provider"){let h=t[++_];if(h===void 0||h.startsWith("--"))return"missing value for --provider";o=h;continue}if(g==="--from"||g.startsWith("--from="))return"unknown option --from (use I_am=<teamfile:alias>)";if(g.startsWith("I_am=")){let h=g.slice(5);if(h.length===0)return"I_am must be <teamfile.lmctl>:<alias>";if(i!==void 0)return"I_am may only be specified once";i=h;continue}if(g==="--root"){let h=t[++_];if(h===void 0||h.startsWith("--"))return"missing value for --root";a=h;continue}if(g==="--force"){l=!0;continue}if(g==="--run"){let h=t[++_];if(h===void 0||h.startsWith("--"))return"missing value for --run";c=h;continue}if(g==="--done"){u=!0;continue}if(g.startsWith("--"))return`unknown flag: ${g}`;e.push(g)}if(c!==void 0)return s!==void 0?"--run is mutually exclusive with --session":o!==void 0?"--run is mutually exclusive with --provider":i!==void 0?"--run is mutually exclusive with I_am=":a!==void 0?"--run is mutually exclusive with --root":l?"--run is mutually exclusive with --force":e.length===0?"a prompt (answer) is required with --run":e.length>1?`--run takes exactly one positional (the answer); got ${e.length}`:{prompt:e[0],permissionMode:r,runFlag:c,done:u};let d,f,m;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>"';m=e[0]}else if(e.length===2)d=e[0],m=e[1];else if(e.length===3)d=e[0],f=e[1],m=e[2];else return`too many positionals (${e.length}); expected at most <teamfile> <alias> <prompt>`;if(u)return"--done requires --run";let p={prompt:m,permissionMode:r};return d!==void 0&&(p.target=d),f!==void 0&&(p.alias=f),n!==void 0&&(p.idleTimeoutMs=n),s!==void 0&&(p.sessionFlag=s),o!==void 0&&(p.providerFlag=o),i!==void 0&&(p.selfIdentity=i),a!==void 0&&(p.rootFlag=a),l&&(p.force=!0),p}function ub(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 db(t,e,r){r.kind==="tool_use"?t.stderr.write(`[${e}] tool_use ${r.tool??"tool"}${r.summary?`: ${r.summary}`:""}
1969
+ `),1}}function PF(t){let e=[],r="yolo",n,s,o,i,a,l,c=!1;for(let p=0;p<t.length;p+=1){let h=t[p];if(h==="--permission-mode"){let g=t[++p];if(g===void 0||g.startsWith("--"))return"missing value for --permission-mode";if(g!=="plan"&&g!=="yolo")return`--permission-mode must be one of plan|yolo (got "${g}")`;r=g;continue}if(h==="--idle-timeout"){let g=t[++p];if(g===void 0||g.startsWith("--"))return"missing value for --idle-timeout";let _=ub(g);if(typeof _=="string")return _;n=_;continue}if(h==="--session"){let g=t[++p];if(g===void 0||g.startsWith("--"))return"missing value for --session";s=g;continue}if(h==="--provider"){let g=t[++p];if(g===void 0||g.startsWith("--"))return"missing value for --provider";o=g;continue}if(h==="--from"||h.startsWith("--from="))return"unknown option --from (use I_am=<teamfile:alias>)";if(h.startsWith("I_am=")){let g=h.slice(5);if(g.length===0)return"I_am must be <teamfile.lmctl>:<alias>";if(i!==void 0)return"I_am may only be specified once";i=g;continue}if(h==="--root"){let g=t[++p];if(g===void 0||g.startsWith("--"))return"missing value for --root";a=g;continue}if(h==="--force"||h.startsWith("--force="))return"unknown option --force (a dead holder auto-reclaims; for a live holder use lmctl send)";if(h==="--run"){let g=t[++p];if(g===void 0||g.startsWith("--"))return"missing value for --run";l=g;continue}if(h==="--done"){c=!0;continue}if(h.startsWith("--"))return`unknown flag: ${h}`;e.push(h)}if(l!==void 0)return s!==void 0?"--run is mutually exclusive with --session":o!==void 0?"--run is mutually exclusive with --provider":i!==void 0?"--run is mutually exclusive with I_am=":a!==void 0?"--run is mutually exclusive with --root":e.length===0?"a prompt (answer) is required with --run":e.length>1?`--run takes exactly one positional (the answer); got ${e.length}`:{prompt:e[0],permissionMode:r,runFlag:l,done:c};let u,d,f;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],d=e[1],f=e[2];else return`too many positionals (${e.length}); expected at most <teamfile> <alias> <prompt>`;if(c)return"--done requires --run";let m={prompt:f,permissionMode:r};return u!==void 0&&(m.target=u),d!==void 0&&(m.alias=d),n!==void 0&&(m.idleTimeoutMs=n),s!==void 0&&(m.sessionFlag=s),o!==void 0&&(m.providerFlag=o),i!==void 0&&(m.selfIdentity=i),a!==void 0&&(m.rootFlag=a),m}function ub(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 db(t,e,r){r.kind==="tool_use"?t.stderr.write(`[${e}] tool_use ${r.tool??"tool"}${r.summary?`: ${r.summary}`:""}
1972
1970
  `):r.kind==="tool_result"?t.stderr.write(`[${e}] tool_result${r.status?` ${r.status}`:""}${r.summary?`: ${r.summary}`:""}
1973
1971
  `):r.kind==="api_retry"&&t.stderr.write(`[${e}] api_retry${r.summary?`: ${r.summary}`:""}
1974
- `)}function FF(t,e){return t.slice(-e)}function UF(t,e){e.kind==="delta"?t.stdout.write(e.chunk):e.kind==="progress"?db(t,e.alias,e.event):t.stderr.write(e.message)}var MF,cb,mb=E(()=>{"use strict";It();fe();ot();Ks();Ne();ba();Gt();MF={name:"chat",allowsBareTeamfile:!1,supportsRaw:!0},cb=`usage: lmctl chat <teamfile>:<alias> "<prompt>"
1972
+ `)}function FF(t,e){return t.slice(-e)}function UF(t,e){e.kind==="delta"?t.stdout.write(e.chunk):e.kind==="progress"?db(t,e.alias,e.event):t.stderr.write(e.message)}var MF,cb,mb=E(()=>{"use strict";It();fe();it();Ks();Ne();ba();Gt();MF={name:"chat",allowsBareTeamfile:!1,supportsRaw:!0},cb=`usage: lmctl chat <teamfile>:<alias> "<prompt>"
1975
1973
  lmctl chat <teamfile> <alias> "<prompt>"
1976
1974
  lmctl chat <sessionid> "<prompt>" --provider <name>
1977
1975
  lmctl chat --provider <name> --session <id> "<prompt>"
1978
1976
  lmctl chat --run <id> "<answer>" [--done]
1979
1977
  [--permission-mode plan|yolo] [--idle-timeout <duration>]
1980
- [I_am=<teamfile>:<alias>] [--root <teamfile>] [--force]
1978
+ [I_am=<teamfile>:<alias>] [--root <teamfile>]
1981
1979
 
1982
- Send a prompt to a team member or raw provider session, or answer a paused run.`});var pb={};re(pb,{runSend:()=>HF});import{hostname as WF}from"node:os";async function HF(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(BF),0;let r=Lt(t);if(r.error!==void 0)return y(e,r.error);let n=P(r.args,[],["--json"]);if(n.error!==void 0)return y(e,n.error);if(n.positionals.length!==3)return y(e,'usage: lmctl send <teamfile> <alias> [I_am=<teamfile:alias>] "<message>" [--json]');let[s,o,i]=n.positionals,a=e.env??process.env,l=D(n,"--json");try{let c=await O(e,d=>{let f=Je(s,o,d),m=nb(r.identity,a,d),p=qF(d,f.teamfile,f.alias);return{receiver:f,sender:m,carrier:p}});if(c.carrier==="up-local"||c.carrier==="cross-host"){let d=await O(e,f=>f.sendMailboxMessage({receiver_teamfile:c.receiver.teamfile,receiver_alias:c.receiver.alias,sender_teamfile:c.sender.teamfile,sender_alias:c.sender.alias,root_teamfile:c.sender.teamfile,payload:i}));return l?W(e,{path:"enqueued",id:d.id,receiver:{teamfile:d.receiver_teamfile,alias:d.receiver_alias},carrier:c.carrier}):e.stdout.write(`mailbox message ${d.id} enqueued to ${d.receiver_teamfile}:${d.receiver_alias} (path: enqueued, carrier: ${c.carrier})
1980
+ Send a prompt to a team member or raw provider session, or answer a paused run.`});var pb={};re(pb,{runSend:()=>HF});import{hostname as WF}from"node:os";async function HF(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(BF),0;let r=Lt(t);if(r.error!==void 0)return y(e,r.error);let n=P(r.args,[],["--json"]);if(n.error!==void 0)return y(e,n.error);if(n.positionals.length!==3)return y(e,'usage: lmctl send <teamfile> <alias> [I_am=<teamfile:alias>] "<message>" [--json]');let[s,o,i]=n.positionals,a=e.env??process.env,l=D(n,"--json");try{let c=await O(e,d=>{let f=Xe(s,o,d),m=nb(r.identity,a,d),p=qF(d,f.teamfile,f.alias);return{receiver:f,sender:m,carrier:p}});if(c.carrier==="up-local"||c.carrier==="cross-host"){let d=await O(e,f=>f.sendMailboxMessage({receiver_teamfile:c.receiver.teamfile,receiver_alias:c.receiver.alias,sender_teamfile:c.sender.teamfile,sender_alias:c.sender.alias,root_teamfile:c.sender.teamfile,payload:i}));return l?W(e,{path:"enqueued",id:d.id,receiver:{teamfile:d.receiver_teamfile,alias:d.receiver_alias},carrier:c.carrier}):e.stdout.write(`mailbox message ${d.id} enqueued to ${d.receiver_teamfile}:${d.receiver_alias} (path: enqueued, carrier: ${c.carrier})
1983
1981
  `),0}let u=await br({teamfile:c.receiver.teamfile,alias:c.receiver.alias,prompt:i,permissionMode:"yolo",selfIdentity:c.sender.value,rootFlag:c.sender.teamfile,env:a,io:e});if(u.status==="busy"||u.status==="error"||u.status==="stalled"){let d=u.status==="stalled"?"provider stalled during chat delivery":u.message;return l?W(e,{path:"rejected",status:u.status,receiver:{teamfile:c.receiver.teamfile,alias:c.receiver.alias},message:d,teamChatLogId:u.teamChatLogId,...u.status==="stalled"?{replyText:u.replyText}:{}}):e.stderr.write(`error: message rejected by chat delivery: ${d}
1984
1982
  `),1}return l?W(e,{path:"chat-delivered",status:u.status,receiver:{teamfile:c.receiver.teamfile,alias:c.receiver.alias},replyText:u.replyText,teamChatLogId:u.teamChatLogId}):(e.stdout.write(`message delivered to ${c.receiver.teamfile}:${c.receiver.alias} via chat (path: chat-delivered)
1985
1983
  `),u.replyText.length>0&&e.stdout.write(`${u.replyText}${u.replyText.endsWith(`
1986
1984
  `)?"":`
1987
- `}`)),0}catch(c){return y(e,VF(c))}}function qF(t,e,r){let n=[JF(t.getTerminalLock(e,r)),XF(t.getAgentInflight(e,r))].filter(o=>o!==null),s=WF();return n.some(o=>(o.host===s||o.host===null)&&GF(o.pid))?"up-local":n.some(o=>o.host!==null&&o.host!==s)?"cross-host":"down-local"}function JF(t){return t===null?null:{host:t.holder_host,pid:t.holder_pid}}function XF(t){return t===null?null:{host:null,pid:t.holder_pid}}function GF(t){return t!==null&&Dn(t)}function VF(t){return t instanceof Error?t.message:String(t)}var BF,hb=E(()=>{"use strict";La();Ks();fe();ot();Gs();Tr();BF=`usage: lmctl send <teamfile> <alias> [I_am=<teamfile:alias>] "<message>" [--json]
1985
+ `}`)),0}catch(c){return y(e,VF(c))}}function qF(t,e,r){let n=[JF(t.getTerminalLock(e,r)),XF(t.getAgentInflight(e,r))].filter(o=>o!==null),s=WF();return n.some(o=>(o.host===s||o.host===null)&&GF(o.pid))?"up-local":n.some(o=>o.host!==null&&o.host!==s)?"cross-host":"down-local"}function JF(t){return t===null?null:{host:t.holder_host,pid:t.holder_pid}}function XF(t){return t===null?null:{host:null,pid:t.holder_pid}}function GF(t){return t!==null&&Dn(t)}function VF(t){return t instanceof Error?t.message:String(t)}var BF,hb=E(()=>{"use strict";La();Ks();fe();it();Gs();Tr();BF=`usage: lmctl send <teamfile> <alias> [I_am=<teamfile:alias>] "<message>" [--json]
1988
1986
 
1989
1987
  Send one message to a team member. If the target has a live same-host carrier,
1990
1988
  send enqueues mailbox mail and returns immediately. If no same-host carrier is
@@ -2023,8 +2021,8 @@ ${Va}`);let i=eU(A(s,"--max-iterations"));if(typeof i=="string")return y(e,i);le
2023
2021
  `),4}function QF(t){if(t.length===1){let e=Et(t[0]);return e===null?{error:"loop requires <teamfile>:<alias> or <teamfile> <alias>"}:e}return t.length===2?{teamfile:t[0],alias:t[1]}:t.length===0?{error:"loop requires <teamfile>:<alias> or <teamfile> <alias>"}:{error:`unexpected argument: ${t[2]}`}}function eU(t){if(t===void 0)return 50;if(!/^\d+$/u.test(t))return`invalid --max-iterations "${t}"`;let e=Number(t);return!Number.isSafeInteger(e)||e<1?`invalid --max-iterations "${t}"`:e}function tU(t){let e=t.split(/\r?\n/u);for(let r=e.length-1;r>=0;r-=1){let n=e[r].trim();if(n.length>0)return n}return""}function rU(t,e){if(e.kind==="delta"){t.stdout.write(e.chunk);return}if(e.kind==="warning"){t.stderr.write(e.message);return}let r=e.event;r.kind==="tool_use"?t.stderr.write(`[${e.alias}] tool_use ${r.tool??"tool"}${r.summary?`: ${r.summary}`:""}
2024
2022
  `):r.kind==="tool_result"?t.stderr.write(`[${e.alias}] tool_result${r.status?` ${r.status}`:""}${r.summary?`: ${r.summary}`:""}
2025
2023
  `):r.kind==="api_retry"&&t.stderr.write(`[${e.alias}] api_retry${r.summary?`: ${r.summary}`:""}
2026
- `)}var zF,Va,wb=E(()=>{"use strict";Ks();ot();fe();Tr();zF="Continue autopiloting. If nothing further can be done, end your reply with a final line exactly: ALL DONE. If you hit a challenge or blocker that needs the operator, end your reply with a final line exactly: OPERATOR ESCALATION.",Va=["usage: lmctl loop <teamfile>:<alias> [--max-iterations N] [--prompt TEXT] [I_am=<teamfile>:<alias>] [--root <teamfile>]"," lmctl loop <teamfile> <alias> [--max-iterations N] [--prompt TEXT] [I_am=<teamfile>:<alias>] [--root <teamfile>]","","Drive one AI-team member with a repeated autopilot prompt until it ends","with ALL DONE or OPERATOR ESCALATION."].join(`
2027
- `)});var Rb={};re(Rb,{runWait:()=>uU});import{hostname as nU}from"node:os";async function uU(t,e={stdout:process.stdout,stderr:process.stderr},r={}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(sU),0;let n=Lt(t);if(n.error!==void 0)return Gr(e,n.error);let s=P(n.args,["--interval","--timeout"],["--json"]);if(s.error!==void 0)return Gr(e,s.error);if(s.positionals.length>1)return Gr(e,`unexpected positional: ${s.positionals[1]}`);let o=vb(A(s,"--interval"),"--interval",oU);if(typeof o=="string")return Gr(e,o);let i=vb(A(s,"--timeout"),"--timeout",iU);if(typeof i=="string")return Gr(e,i);if([n.identity!==void 0,s.positionals.length===1].filter(Boolean).length>1)return Gr(e,"I_am and teamfile positional are mutually exclusive");let l,c;try{l=await dU(e,{selfIdentity:n.identity,teamfile:s.positionals[0]}),c=await fU(e,l)}catch(N){return Gr(e,N instanceof Error?N.message:String(N))}let u=D(s,"--json"),d=r.sleep??(N=>new Promise(v=>setTimeout(v,N))),f=r.now??(()=>Date.now()),m=r.appearanceGraceMs??NU(),p=r.reclaimStaleMs??IU("LMCTL_WAIT_RECLAIM_STALE_MS",lU),_=f(),g=_+i,h=_+m,b=new Set,w=await O(e,N=>_U(N,f(),p).filter(v=>EU(v,l)).sort((v,R)=>v.id-R.id)),k=await O(e,N=>hU(N,l));if(ct({event:"wait_start",scope:l,initialMaxId:k,intervalMs:o,timeoutMs:i,appearanceGraceMs:m,reclaimStaleMs:p,dbPath:le()}),w.length>0){let N=await O(e,v=>({running:xb(v,l),mail:Nb(v,c)}));return Ys(e,{status:"completed",finished:[bb(w[0])],in_flight:af(N.running),mail:N.mail.map(Sb)},u),0}for(;;){let N=await O(e,v=>mU(v,{scope:l,snapshotIds:b,nowMs:f(),initialMaxId:k,reclaimStaleMs:p,mailboxReceiver:c}));if(N.finished!==null||N.mail.length>0)return Ys(e,{status:"completed",finished:N.finished===null?[]:[bb(N.finished)],in_flight:af(N.running),mail:N.mail.map(Sb)},u),0;if(b.size>0){if(f()>=g)return Ys(e,{status:"timeout",finished:[],in_flight:af(N.running),mail:[]},u),1;await d(Ib(f(),o,g));continue}if(f()>=g)return Ys(e,{status:"timeout",finished:[],in_flight:[],mail:[]},u),1;if(f()>=h)return Ys(e,{status:"idle",finished:[],in_flight:[],mail:[]},u),0;await d(Ib(f(),o,h,g))}}function Gr(t,e){return t.stderr.write(`error: ${e}
2024
+ `)}var zF,Va,wb=E(()=>{"use strict";Ks();it();fe();Tr();zF="Continue autopiloting. If nothing further can be done, end your reply with a final line exactly: ALL DONE. If you hit a challenge or blocker that needs the operator, end your reply with a final line exactly: OPERATOR ESCALATION.",Va=["usage: lmctl loop <teamfile>:<alias> [--max-iterations N] [--prompt TEXT] [I_am=<teamfile>:<alias>] [--root <teamfile>]"," lmctl loop <teamfile> <alias> [--max-iterations N] [--prompt TEXT] [I_am=<teamfile>:<alias>] [--root <teamfile>]","","Drive one AI-team member with a repeated autopilot prompt until it ends","with ALL DONE or OPERATOR ESCALATION."].join(`
2025
+ `)});var Rb={};re(Rb,{runWait:()=>uU});import{hostname as nU}from"node:os";async function uU(t,e={stdout:process.stdout,stderr:process.stderr},r={}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(sU),0;let n=Lt(t);if(n.error!==void 0)return Gr(e,n.error);let s=P(n.args,["--interval","--timeout"],["--json"]);if(s.error!==void 0)return Gr(e,s.error);if(s.positionals.length>1)return Gr(e,`unexpected positional: ${s.positionals[1]}`);let o=vb(A(s,"--interval"),"--interval",oU);if(typeof o=="string")return Gr(e,o);let i=vb(A(s,"--timeout"),"--timeout",iU);if(typeof i=="string")return Gr(e,i);if([n.identity!==void 0,s.positionals.length===1].filter(Boolean).length>1)return Gr(e,"I_am and teamfile positional are mutually exclusive");let l,c;try{l=await dU(e,{selfIdentity:n.identity,teamfile:s.positionals[0]}),c=await fU(e,l)}catch(N){return Gr(e,N instanceof Error?N.message:String(N))}let u=D(s,"--json"),d=r.sleep??(N=>new Promise(v=>setTimeout(v,N))),f=r.now??(()=>Date.now()),m=r.appearanceGraceMs??NU(),p=r.reclaimStaleMs??IU("LMCTL_WAIT_RECLAIM_STALE_MS",lU),h=f(),g=h+i,_=h+m,b=new Set,w=await O(e,N=>_U(N,f(),p).filter(v=>EU(v,l)).sort((v,R)=>v.id-R.id)),k=await O(e,N=>hU(N,l));if(Le({event:"wait_start",scope:l,initialMaxId:k,intervalMs:o,timeoutMs:i,appearanceGraceMs:m,reclaimStaleMs:p,dbPath:le()}),w.length>0){let N=await O(e,v=>({running:xb(v,l),mail:Nb(v,c)}));return Ys(e,{status:"completed",finished:[bb(w[0])],in_flight:af(N.running),mail:N.mail.map(Sb)},u),0}for(;;){let N=await O(e,v=>mU(v,{scope:l,snapshotIds:b,nowMs:f(),initialMaxId:k,reclaimStaleMs:p,mailboxReceiver:c}));if(N.finished!==null||N.mail.length>0)return Ys(e,{status:"completed",finished:N.finished===null?[]:[bb(N.finished)],in_flight:af(N.running),mail:N.mail.map(Sb)},u),0;if(b.size>0){if(f()>=g)return Ys(e,{status:"timeout",finished:[],in_flight:af(N.running),mail:[]},u),1;await d(Ib(f(),o,g));continue}if(f()>=g)return Ys(e,{status:"timeout",finished:[],in_flight:[],mail:[]},u),1;if(f()>=_)return Ys(e,{status:"idle",finished:[],in_flight:[],mail:[]},u),0;await d(Ib(f(),o,_,g))}}function Gr(t,e){return t.stderr.write(`error: ${e}
2028
2026
  `),2}async function dU(t,e){if(e.selfIdentity!==void 0){let n=t.env??process.env;return await O(t,s=>{let o=Ct(e.selfIdentity,n,s);if(o.ok)return{kind:"from",from:o.identity};throw new Error("lmctl wait could not infer caller: pass I_am=<teamfile:alias> or a teamfile")})}if(e.teamfile!==void 0)return await O(t,n=>({kind:"team",teamfile:pe(e.teamfile,n)}));let r=t.env??process.env;return await O(t,n=>{let s=Ct(void 0,r,n);if(s.ok)return{kind:"from",from:s.identity};throw s.reason==="unset"?new Error("lmctl wait could not infer caller: LMCTL_SELF_SESSIONID is not set; pass I_am=<teamfile:alias> or a teamfile"):new Error("lmctl wait could not infer caller from LMCTL_SELF_SESSIONID; pass I_am=<teamfile:alias> or a teamfile")})}async function fU(t,e){if(e.kind==="from")return Xr(e.from);let r=t.env??process.env;return await O(t,n=>{try{let s=of(r,n);return s.ok?Xr(s.identity):null}catch{return null}})}function mU(t,e){let r=Nb(t,e.mailboxReceiver);if(e.snapshotIds.size===0){let o=wU(pU(t,e.scope),e.initialMaxId);if(o!==null)return{finished:o,running:[],mail:r};for(let i of xb(t,e.scope))e.snapshotIds.add(i.id)}let n=[...e.snapshotIds].map(o=>gU(t,o,e.nowMs,e.reclaimStaleMs)).filter(o=>o!==null);return{finished:n.filter(lf).sort((o,i)=>o.id-i.id)[0]??null,running:n.filter(bU).sort((o,i)=>o.id-i.id),mail:r}}function Nb(t,e){return e===null?[]:t.peekMailboxMessages({receiver_teamfile:e.teamfile,receiver_alias:e.alias})}function pU(t,e){return e.kind==="team"?t.listTrackedInvocations({scope_teamfile:e.teamfile,limit:1e3}):t.listTrackedInvocations({from:e.from,limit:1e3})}function xb(t,e){return e.kind==="team"?t.listRunningTrackedInvocations({scope_teamfile:e.teamfile,limit:1e3}):t.listRunningTrackedInvocations({from:e.from,limit:1e3})}function hU(t,e){return e.kind==="team"?t.maxTrackedInvocationId({scope_teamfile:e.teamfile}):t.maxTrackedInvocationId({from:e.from})}function _U(t,e,r){let n=[];for(let s of t.listAllRunningTrackedInvocations()){if(!$b(s,e,r))continue;let o=Ab(t,s);o!==null&&lf(o)&&n.push(o)}return n}function gU(t,e,r,n){let s=t.getTrackedInvocation(e);return s===null||s.status!=="running"||!$b(s,r,n)?s:Ab(t,s)??t.getTrackedInvocation(s.id)}function Ab(t,e){return t.reclaimTrackedInvocationIfUnchanged(e.id,{holder_pid:e.holder_pid,holder_host:e.holder_host,started_at:e.started_at,last_heartbeat_at:e.last_heartbeat_at},{status:"error",error:Tb,result_summary:Tb})}function $b(t,e,r){return t.holder_host===nU()&&TU(t.holder_pid)?!Dn(t.holder_pid):yU(t,e,r)}function yU(t,e,r){let n=Date.parse(t.last_heartbeat_at??t.started_at);return Number.isFinite(n)&&e-n>r}function wU(t,e){return t.filter(n=>n.id>e&&lf(n)).sort((n,s)=>n.id-s.id)[0]??null}function EU(t,e){return e.kind==="team"?t.scope_teamfile===e.teamfile:t.from_identity===e.from}function TU(t){return Number.isInteger(t)&&(t??0)>0}function bU(t){return t.status==="running"}function lf(t){return cU.has(t.status)}function bb(t){return{id:t.id,kind:t.kind,status:t.status,from_identity:t.from_identity,scope_teamfile:t.scope_teamfile,target_teamfile:t.target_teamfile,target_alias:t.target_alias,result_summary:kU(t)}}function af(t){return t.sort((e,r)=>e.id-r.id).map(e=>({id:e.id,kind:e.kind,status:"running",from_identity:e.from_identity,target_alias:e.target_alias}))}function Sb(t){return{id:t.id,sender:Xs(t),created_at:t.created_at,preview:SU(t.payload)}}function SU(t){let e=t.replace(/\s+/g," ").trim();return e.length===0?"(empty)":e.length<=200?e:`${e.slice(0,199)}\u2026`}function kU(t){let r=(t.result_summary??t.error??t.status).replace(/\s+/g," ").trim();return r.length===0?"(empty)":r.length<=240?r:`${r.slice(0,239)}\u2026`}function Ys(t,e,r){if(r){W(t,e);return}if(e.status==="idle"){t.stdout.write(`wait: idle (no running tracked invocations or mailbox messages)
2029
2027
  `);return}if(e.status==="timeout"){t.stdout.write(`wait: timeout; ${e.in_flight.length} invocation(s) still running
2030
2028
  `),kb(t,e.in_flight);return}if(e.mail.length>0){t.stdout.write(`wait: mailbox has ${e.mail.length} message(s)
@@ -2034,7 +2032,7 @@ ${Va}`);let i=eU(A(s,"--max-iterations"));if(typeof i=="string")return y(e,i);le
2034
2032
  `)}kb(t,e.in_flight)}function kb(t,e){if(e.length===0){t.stdout.write(`in flight: none
2035
2033
  `);return}t.stdout.write(`in flight:
2036
2034
  `);for(let r of e)t.stdout.write(` ${r.id} ${r.status} ${r.kind} \u2192 ${r.target_alias??"(unknown)"}
2037
- `)}function vb(t,e,r){return t===void 0?r:vU(t,e)}function vU(t,e){let r=Number(t);return!Number.isFinite(r)||r<=0?`${e} must be a positive number of seconds`:Math.max(1,Math.ceil(r*1e3))}function IU(t,e){let r=process.env[t];if(r===void 0||r.trim()==="")return e;let n=Number(r);return!Number.isFinite(n)||n<=0?e:Math.max(1,Math.ceil(n))}function NU(){let t=process.env.LMCTL_WAIT_APPEARANCE_GRACE_MS;if(t===void 0||t.trim()==="")return Eb;let e=Number(t);return Number.isFinite(e)?Math.min(aU,Math.max(0,Math.ceil(e))):Eb}function Ib(t,e,...r){let n=Math.min(...r);return Math.min(e,Math.max(1,n-t))}var sU,oU,iU,Eb,aU,lU,cU,Tb,jb=E(()=>{"use strict";La();fe();Ge();wt();Tr();Gs();Ne();sU=`usage: lmctl wait [teamfile] [I_am=<teamfile:alias>] [--interval <seconds>] [--timeout <seconds>] [--json]
2035
+ `)}function vb(t,e,r){return t===void 0?r:vU(t,e)}function vU(t,e){let r=Number(t);return!Number.isFinite(r)||r<=0?`${e} must be a positive number of seconds`:Math.max(1,Math.ceil(r*1e3))}function IU(t,e){let r=process.env[t];if(r===void 0||r.trim()==="")return e;let n=Number(r);return!Number.isFinite(n)||n<=0?e:Math.max(1,Math.ceil(n))}function NU(){let t=process.env.LMCTL_WAIT_APPEARANCE_GRACE_MS;if(t===void 0||t.trim()==="")return Eb;let e=Number(t);return Number.isFinite(e)?Math.min(aU,Math.max(0,Math.ceil(e))):Eb}function Ib(t,e,...r){let n=Math.min(...r);return Math.min(e,Math.max(1,n-t))}var sU,oU,iU,Eb,aU,lU,cU,Tb,jb=E(()=>{"use strict";La();fe();Ve();wt();Tr();Gs();Ne();sU=`usage: lmctl wait [teamfile] [I_am=<teamfile:alias>] [--interval <seconds>] [--timeout <seconds>] [--json]
2038
2036
 
2039
2037
  Wait for the first tracked invocation in scope to finish or for mailbox
2040
2038
  messages to arrive for the calling member.
@@ -2064,15 +2062,15 @@ Use "lmctl exec -- sh -lc '<command>'" when shell expansion is desired.
2064
2062
  ${uf}`);if(n.positionals.length===0)return y(e,`recover requires a <teamfile>
2065
2063
 
2066
2064
  ${uf}`);if(n.positionals.length>2)return y(e,`unexpected argument: ${n.positionals[2]}`);let s=n.positionals[0],o=Et(s),i=o?.teamfile??s,a=n.positionals[1],l=o?.alias??a;if(o!==null&&a!==void 0)return y(e,"recover alias was provided twice; use either <teamfile>:<alias> or <teamfile> <alias>");if(D(n,"--all")&&l!==void 0)return y(e,"recover --all is mutually exclusive with <alias>");let c;try{c=await tW(e,i,l)}catch(p){if(p instanceof Te)return y(e,p.message);throw p}let u=r.now??new Date,d=D(n,"--dry-run"),f=[];for(let p of c)f.push(await rW(e,p,{now:u,dryRun:d}));let m={checked:f.length,recovered:f.filter(p=>p.action==="recovered").length,wouldRecover:f.filter(p=>p.action==="would_recover").length,skipped:f.filter(p=>p.action!=="recovered"&&p.action!=="would_recover").length,errors:f.filter(p=>p.action==="load_error"||p.action==="send_error").length};if(D(n,"--json"))W(e,{dryRun:d,now:u.toISOString(),summary:m,members:f});else{for(let p of f)e.stdout.write(nW(p));e.stdout.write(`Recover checked ${m.checked}: ${d?`${m.wouldRecover} would recover`:`${m.recovered} recovered`}, ${m.skipped} skipped, ${m.errors} error(s).
2067
- `)}return m.errors>0?1:0}async function tW(t,e,r){return await O(t,n=>{let s=pe(e,n);if(r!==void 0){let o=Ze(s,n);if(o.parseErrors.length>0)throw new Te(`lmctl: ${e}: ${o.parseErrors.join("; ")}`);let i=Mn(o,r);return i?.teamfile!==void 0?df(Fb(Pb(s),i.teamfile),n,new Set):[Je(e,r,n)]}return df(s,n,new Set)})}function df(t,e,r){let n=pe(t,e);if(r.has(n))return[];r.add(n);let s=Ze(n,e);if(s.parseErrors.length>0)throw new Te(`lmctl: ${n}: ${s.parseErrors.join("; ")}`);let o=[];for(let i of s.members){if(i.teamfile!==void 0){o.push(...df(Fb(Pb(n),i.teamfile),e,r));continue}i.session!==void 0&&o.push(Je(n,i.alias,e))}return o}async function rW(t,e,r){let n;try{let a=await Vt(e.sessionid,e.provider);if(a===null)return Mt(e,"session_not_found",null,"session detail not found");n=zs(a.messages)}catch(a){return Mt(e,"load_error",null,a instanceof Error?a.message:String(a))}if(n===null)return Mt(e,"not_limited",null,"no current session-limit marker");if(n.resets_at===null)return Mt(e,"unknown_reset",n,"reset time could not be parsed");let s=Date.parse(n.resets_at);if(!Number.isFinite(s))return Mt(e,"unknown_reset",n,"reset time could not be parsed");if(s>r.now.getTime())return Mt(e,"not_due",n,`resets_at ${n.resets_at} is in the future`);let o=await O(t,a=>a.getAgentInflight(e.teamfile,e.alias));if(o!==null)return Mt(e,"busy",n,`in-flight since ${o.started_at}`);if(r.dryRun)return Mt(e,"would_recover",n,null);let i=await br({teamfile:e.teamfile,alias:e.alias,prompt:QU,selfIdentity:`${e.teamfile}:${e.alias}`,permissionMode:"yolo",io:t,env:process.env});return i.status==="ok"||i.status==="stalled"?Mt(e,"recovered",n,null):Mt(e,i.status==="busy"?"busy":"send_error",n,i.message)}function Mt(t,e,r,n){return{alias:t.alias,teamfile:t.teamfile,provider:t.provider,sessionid:t.sessionid,action:e,sessionLimit:r,reason:n}}function nW(t){let e=t.sessionLimit?.resets_at??"unknown",r=t.reason===null?"":` (${t.reason})`;return`${t.alias}: ${t.action} resets_at=${e}${r}
2068
- `}var QU,uf,Wb=E(()=>{"use strict";cf();Dr();Ot();wt();ot();Ks();fe();QU="Your session limit reset time has passed. Continue your work from the last actionable point.",uf=["usage: lmctl recover <teamfile> [--all|<alias>] [--dry-run] [--json]","","Wake team members whose latest provider output is a session-limit message","and whose resets_at time has passed. Defaults to the full teamfile report","subtree. A busy/in-flight member is skipped."].join(`
2069
- `)});var Zs,e7,ff=E(()=>{"use strict";Zs=[{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 batch or long-running shell work, launch it through `lmctl exec -- <command> &` and wait for completion with `lmctl wait`.",inputSchema:{type:"object",properties:{team:{type:"string",description:"Path to .lmctl teamfile"},alias:{type:"string",description:"Target alias; omitted means Lead"},from:{type:"string",description:"Optional self-asserted sender identity: <teamfile.lmctl>:<alias>"},prompt:{type:"string",description:"Prompt text to send"}},required:["team","prompt"]},local:!0}],e7=Zs.length});import{spawn as sW}from"node:child_process";async function Hb(t,e,r){let n=iW.get(t);if(n===void 0)return{status:"error",code:404,message:`unknown tool: ${t}`};let s=e!==null&&typeof e=="object"&&!Array.isArray(e)?e:{};for(let o of n.inputSchema.required??[])if(s[o]===void 0)return{status:"error",code:400,message:`missing required parameter: ${o}`};return aW(n.name,s)}function aW(t,e){return t==="lmctl_chat"?lW(e):{status:"error",code:404,message:`unknown local tool: ${t}`}}function lW(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=typeof t.from=="string"&&t.from.length>0?t.from:void 0,o=["chat",r,n,e];return s!==void 0&&o.push(`I_am=${s}`),he()&&Fe(JSON.stringify({event:"mcp_chat_spawn",team:r,alias:n,from:s??null})),cW(o,process.cwd())}function cW(t,e){return new Promise(r=>{let n=!1,s,o=u=>{n||(n=!0,s!==void 0&&clearTimeout(s),r(u))},i=sW("lmctl",t,{cwd:e,env:process.env,stdio:["ignore","pipe","pipe"]}),a=uW(process.env);s=setTimeout(()=>{try{i.kill("SIGTERM")}catch{}o({status:"error",code:124,message:`lmctl chat timed out after ${a}ms`})},a),s.unref?.();let l="",c="";i.stdout?.on("data",u=>{l+=u.toString("utf8")}),i.stderr?.on("data",u=>{c+=u.toString("utf8")}),i.on("error",u=>{o({status:"error",code:1,message:`failed to spawn lmctl chat: ${u.message}`})}),i.on("exit",u=>{if(u===0){he()&&Fe(JSON.stringify({event:"mcp_chat_payload",bytes:Buffer.byteLength(l,"utf8"),lines:l.split(`
2065
+ `)}return m.errors>0?1:0}async function tW(t,e,r){return await O(t,n=>{let s=pe(e,n);if(r!==void 0){let o=Qe(s,n);if(o.parseErrors.length>0)throw new Te(`lmctl: ${e}: ${o.parseErrors.join("; ")}`);let i=Mn(o,r);return i?.teamfile!==void 0?df(Fb(Pb(s),i.teamfile),n,new Set):[Xe(e,r,n)]}return df(s,n,new Set)})}function df(t,e,r){let n=pe(t,e);if(r.has(n))return[];r.add(n);let s=Qe(n,e);if(s.parseErrors.length>0)throw new Te(`lmctl: ${n}: ${s.parseErrors.join("; ")}`);let o=[];for(let i of s.members){if(i.teamfile!==void 0){o.push(...df(Fb(Pb(n),i.teamfile),e,r));continue}i.session!==void 0&&o.push(Xe(n,i.alias,e))}return o}async function rW(t,e,r){let n;try{let a=await Vt(e.sessionid,e.provider);if(a===null)return Mt(e,"session_not_found",null,"session detail not found");n=zs(a.messages)}catch(a){return Mt(e,"load_error",null,a instanceof Error?a.message:String(a))}if(n===null)return Mt(e,"not_limited",null,"no current session-limit marker");if(n.resets_at===null)return Mt(e,"unknown_reset",n,"reset time could not be parsed");let s=Date.parse(n.resets_at);if(!Number.isFinite(s))return Mt(e,"unknown_reset",n,"reset time could not be parsed");if(s>r.now.getTime())return Mt(e,"not_due",n,`resets_at ${n.resets_at} is in the future`);let o=await O(t,a=>a.getAgentInflight(e.teamfile,e.alias));if(o!==null)return Mt(e,"busy",n,`in-flight since ${o.started_at}`);if(r.dryRun)return Mt(e,"would_recover",n,null);let i=await br({teamfile:e.teamfile,alias:e.alias,prompt:QU,selfIdentity:`${e.teamfile}:${e.alias}`,permissionMode:"yolo",io:t,env:process.env});return i.status==="ok"||i.status==="stalled"?Mt(e,"recovered",n,null):Mt(e,i.status==="busy"?"busy":"send_error",n,i.message)}function Mt(t,e,r,n){return{alias:t.alias,teamfile:t.teamfile,provider:t.provider,sessionid:t.sessionid,action:e,sessionLimit:r,reason:n}}function nW(t){let e=t.sessionLimit?.resets_at??"unknown",r=t.reason===null?"":` (${t.reason})`;return`${t.alias}: ${t.action} resets_at=${e}${r}
2066
+ `}var QU,uf,Wb=E(()=>{"use strict";cf();Dr();Ot();wt();it();Ks();fe();QU="Your session limit reset time has passed. Continue your work from the last actionable point.",uf=["usage: lmctl recover <teamfile> [--all|<alias>] [--dry-run] [--json]","","Wake team members whose latest provider output is a session-limit message","and whose resets_at time has passed. Defaults to the full teamfile report","subtree. A busy/in-flight member is skipped."].join(`
2067
+ `)});var Zs,e7,ff=E(()=>{"use strict";Zs=[{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 batch or long-running shell work, launch it through `lmctl exec -- <command> &` and wait for completion with `lmctl wait`.",inputSchema:{type:"object",properties:{team:{type:"string",description:"Path to .lmctl teamfile"},alias:{type:"string",description:"Target alias; omitted means Lead"},from:{type:"string",description:"Optional self-asserted sender identity: <teamfile.lmctl>:<alias>"},prompt:{type:"string",description:"Prompt text to send"}},required:["team","prompt"]},local:!0}],e7=Zs.length});import{spawn as sW}from"node:child_process";async function Hb(t,e,r){let n=iW.get(t);if(n===void 0)return{status:"error",code:404,message:`unknown tool: ${t}`};let s=e!==null&&typeof e=="object"&&!Array.isArray(e)?e:{};for(let o of n.inputSchema.required??[])if(s[o]===void 0)return{status:"error",code:400,message:`missing required parameter: ${o}`};return aW(n.name,s)}function aW(t,e){return t==="lmctl_chat"?lW(e):{status:"error",code:404,message:`unknown local tool: ${t}`}}function lW(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=typeof t.from=="string"&&t.from.length>0?t.from:void 0,o=["chat",r,n,e];return s!==void 0&&o.push(`I_am=${s}`),he()&&Ue(JSON.stringify({event:"mcp_chat_spawn",team:r,alias:n,from:s??null})),cW(o,process.cwd())}function cW(t,e){return new Promise(r=>{let n=!1,s,o=u=>{n||(n=!0,s!==void 0&&clearTimeout(s),r(u))},i=sW("lmctl",t,{cwd:e,env:process.env,stdio:["ignore","pipe","pipe"]}),a=uW(process.env);s=setTimeout(()=>{try{i.kill("SIGTERM")}catch{}o({status:"error",code:124,message:`lmctl chat timed out after ${a}ms`})},a),s.unref?.();let l="",c="";i.stdout?.on("data",u=>{l+=u.toString("utf8")}),i.stderr?.on("data",u=>{c+=u.toString("utf8")}),i.on("error",u=>{o({status:"error",code:1,message:`failed to spawn lmctl chat: ${u.message}`})}),i.on("exit",u=>{if(u===0){he()&&Ue(JSON.stringify({event:"mcp_chat_payload",bytes:Buffer.byteLength(l,"utf8"),lines:l.split(`
2070
2068
  `).length})),o({status:"ok",data:{text:l.trim()||"(empty response)"}});return}o({status:"error",code:u??1,message:c.trim()||`lmctl chat exited with code ${u}`})})})}function uW(t){let e=t.LMCTL_MCP_CHAT_TIMEOUT_MS;if(e===void 0||e.trim().length===0)return Bb;let r=Number(e);return!Number.isFinite(r)||r<=0?Bb:r}function mf(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:oW),o=t.getConfig("api.token")??(e.LMCTL_API_TOKEN!==void 0&&e.LMCTL_API_TOKEN.length>0?e.LMCTL_API_TOKEN:null);return{baseUrl:n,token:o}}var oW,Bb,iW,pf=E(()=>{"use strict";ff();Ne();oW="http://127.0.0.1:8787",Bb=30*60*1e3,iW=new Map(Zs.map(t=>[t.name,t]))});async function pW(t,e){let r=t.id===void 0,n=t.id??null;if(t.method==="exit")return r||e.io.write(hf({jsonrpc:"2.0",id:n,result:null})),{kind:"exit"};if(t.method==="initialize")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{protocolVersion:dW,capabilities:{tools:{listChanged:!1}},serverInfo:{name:fW,version:mW}}}};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:Zs.map(s=>({name:s.name,description:s.description,inputSchema:s.inputSchema}))}}};if(t.method==="tools/call"){let s=t.params!==null&&typeof t.params=="object"?t.params:{},o=typeof s.name=="string"?s.name:"",i=s.arguments,a=await Hb(o,i,e.dispatch),l=o==="lmctl_chat"&&a.status==="ok"&&a.data!==null&&typeof a.data=="object"&&typeof a.data.text=="string"?a.data.text:JSON.stringify(a);return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{isError:a.status==="error",content:[{type:"text",text:l}]}}}}return r?{kind:"notification"}:{kind:"response",message:{jsonrpc:"2.0",id:n,error:{code:-32601,message:`method not found: ${t.method}`}}}}function hf(t){return`${JSON.stringify(t)}
2071
2069
  `}async function qb(t,e){let r=!1,n="",s=!1,o=async i=>{let a=i.trim();if(a.length===0)return;let l;try{l=JSON.parse(a)}catch(u){t.io.write(hf({jsonrpc:"2.0",id:null,error:{code:-32700,message:`parse error: ${u instanceof Error?u.message:String(u)}`}}));return}l.method==="shutdown"&&(r=!0);let c=await pW(l,t);c.kind==="response"?t.io.write(hf(c.message)):c.kind==="exit"&&(s=!0)};return new Promise(i=>{let a=Promise.resolve(),l=!1,c=d=>{l||(l=!0,i(d))},u=()=>{let d=n.indexOf(`
2072
2070
  `);for(;d!==-1;){let f=n.slice(0,d);n=n.slice(d+1),a=a.then(()=>o(f)).then(()=>{s&&c(0)}),d=n.indexOf(`
2073
2071
  `)}};e.setEncoding("utf8"),e.on("data",d=>{n+=d,u()}),e.on("end",()=>{n.trim().length>0&&(a=a.then(()=>o(n))),a.finally(()=>c(0))}),e.on("error",d=>{t.io.log?.(`mcp: stdin error: ${d.message}
2074
2072
  `),a.finally(()=>c(1))})})}var dW,fW,mW,Jb=E(()=>{"use strict";ff();pf();dW="2025-06-18",fW="lmctl",mW="0.0.1"});var Gb={};re(Gb,{runMcp:()=>_W});async function _W(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(hW),0;if(t.length>0)return e.stderr.write(`usage: lmctl mcp
2075
- `),2;z({event:"mcp_bridge_start",pid:process.pid});let n=e.dal===void 0,s=e.dal??gW(),o=1;try{let i=s===void 0?mf({getConfig:()=>null},process.env):mf(s,process.env);return o=await qb({io:{write:l=>e.stdout.write(l),log:l=>e.stderr.write(l)},dispatch:{config:i,...s!==void 0?{dal:s}:{}}},r),o}finally{z({event:"mcp_bridge_exit",pid:process.pid,exit_code:o}),n&&s!==void 0&&s.close()}}function gW(){let t=le(),e=3;for(let r=1;r<=e;r+=1)try{return ge({path:t})}catch(n){let s=n instanceof Error?n.message:String(n);if(z({event:"mcp_bridge_db_open_failed",pid:process.pid,attempt:r,db_path:t,error_message:s}),r<e&&Xb(s))yW(50*r);else if(!Xb(s))break}}function Xb(t){return/SQLITE_BUSY|database is locked|database is busy/i.test(t)}function yW(t){let e=new Int32Array(new SharedArrayBuffer(4));Atomics.wait(e,0,0,t)}var hW,Vb=E(()=>{"use strict";Ue();pf();Jb();Ne();Ge();hW=`usage: lmctl mcp
2073
+ `),2;z({event:"mcp_bridge_start",pid:process.pid});let n=e.dal===void 0,s=e.dal??gW(),o=1;try{let i=s===void 0?mf({getConfig:()=>null},process.env):mf(s,process.env);return o=await qb({io:{write:l=>e.stdout.write(l),log:l=>e.stderr.write(l)},dispatch:{config:i,...s!==void 0?{dal:s}:{}}},r),o}finally{z({event:"mcp_bridge_exit",pid:process.pid,exit_code:o}),n&&s!==void 0&&s.close()}}function gW(){let t=le(),e=3;for(let r=1;r<=e;r+=1)try{return ge({path:t})}catch(n){let s=n instanceof Error?n.message:String(n);if(z({event:"mcp_bridge_db_open_failed",pid:process.pid,attempt:r,db_path:t,error_message:s}),r<e&&Xb(s))yW(50*r);else if(!Xb(s))break}}function Xb(t){return/SQLITE_BUSY|database is locked|database is busy/i.test(t)}function yW(t){let e=new Int32Array(new SharedArrayBuffer(4));Atomics.wait(e,0,0,t)}var hW,Vb=E(()=>{"use strict";We();pf();Jb();Ne();Ve();hW=`usage: lmctl mcp
2076
2074
 
2077
2075
  Start the stdio MCP bridge. The bridge resolves api.url and api.token from
2078
2076
  local config, then uses stdin/stdout for JSON-RPC frames.
@@ -2165,14 +2163,14 @@ token). The access key is stored in ~/.lmctl/device-auth.json (chmod 600).
2165
2163
  `:""}`),0}function QW(t,e,r){let n=P(t,[]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0)return y(e,"usage: team show <name> [--json]");let o=r.findTeamByName(s);if(o===null)return y(e,`team not found: ${s}`);let i=r.listTeamMembers(o.id);if(D(n,"--json"))W(e,{team:o,members:i});else{e.stdout.write(`team ${o.name}
2166
2164
  `);for(let a of i)e.stdout.write(`- ${a.alias} ${Ae(a)} ${a.sessionid??"(unseeded)"}
2167
2165
  `)}return 0}function eB(t,e,r){let n=P(t,["--alias","--provider","--model","--role","--sessiondir"]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0)return y(e,"usage: team add-member <team-name> --alias A --provider P [--model M] [--role R] [--sessiondir D]");let o=r.findTeamByName(s);if(o===null)return y(e,`team not found: ${s}`);let i=A(n,"--alias"),a=A(n,"--provider");if(i===void 0||a===void 0)return y(e,"team add-member requires --alias and --provider");let l=r.insertTeamMember({team_id:o.id,alias:i,provider:a,model:A(n,"--model")??null,role:A(n,"--role")??"agent",sessiondir:A(n,"--sessiondir")??GW(vr(),"sessions",o.name,i)});return D(n,"--json")?W(e,l):e.stdout.write(`added member ${l.alias} to ${o.name}
2168
- `),0}async function oS(t,e,r,n){let s=P(t,["--alias"]);if(s.error!==void 0)return y(e,s.error);let[o]=s.positionals;if(o===void 0)return y(e,n?"usage: team refresh <team-name> --alias A":"usage: team seed <team-name> [--alias A]");let i=r.findTeamByName(o);if(i===null)return y(e,`team not found: ${o}`);let a=A(s,"--alias");if(n&&a===void 0)return y(e,"team refresh requires --alias");if(n&&a!==void 0&&a.trim().toLowerCase()==="lead")return y(e,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let l=tB(r.listTeamMembers(i.id),a,n);if(a!==void 0&&l.length===0)return y(e,`member not found or already seeded: ${a}`);if(n&&l.some(f=>f.alias.toLowerCase()==="lead"||f.role==="lead"))return y(e,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let c=new Set;for(let f of r.listProjects().filter(m=>m.team_id===i.id)){if(c.has(f.workflow_name))continue;c.add(f.workflow_name);let m=r.getWorkflowByName(f.workflow_name);if(m===null)continue;let p=Oy(f.workflow_name,m.definition);if(p.status==="FAIL")return y(e,`cannot seed team \`${i.name}\`: workflow \`${f.workflow_name}\` failed verify-at-seed \u2014 ${p.note}. Fix the workflow and retry; NO members were seeded (no side-effects).`)}for(let f of r.listProjects().filter(m=>m.team_id===i.id))di(f,r),mi(f);let u=[],d=!1;for(let f of l){let m=await ln({member:f,dal:r}),p=r.updateTeamMemberSession(f.id,m.sessionid);if(p!==null){let _=p.role_prompt??"",g=_.length>0?`${_}
2166
+ `),0}async function oS(t,e,r,n){let s=P(t,["--alias"]);if(s.error!==void 0)return y(e,s.error);let[o]=s.positionals;if(o===void 0)return y(e,n?"usage: team refresh <team-name> --alias A":"usage: team seed <team-name> [--alias A]");let i=r.findTeamByName(o);if(i===null)return y(e,`team not found: ${o}`);let a=A(s,"--alias");if(n&&a===void 0)return y(e,"team refresh requires --alias");if(n&&a!==void 0&&a.trim().toLowerCase()==="lead")return y(e,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let l=tB(r.listTeamMembers(i.id),a,n);if(a!==void 0&&l.length===0)return y(e,`member not found or already seeded: ${a}`);if(n&&l.some(f=>f.alias.toLowerCase()==="lead"||f.role==="lead"))return y(e,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let c=new Set;for(let f of r.listProjects().filter(m=>m.team_id===i.id)){if(c.has(f.workflow_name))continue;c.add(f.workflow_name);let m=r.getWorkflowByName(f.workflow_name);if(m===null)continue;let p=Oy(f.workflow_name,m.definition);if(p.status==="FAIL")return y(e,`cannot seed team \`${i.name}\`: workflow \`${f.workflow_name}\` failed verify-at-seed \u2014 ${p.note}. Fix the workflow and retry; NO members were seeded (no side-effects).`)}for(let f of r.listProjects().filter(m=>m.team_id===i.id))di(f,r),mi(f);let u=[],d=!1;for(let f of l){let m=await ln({member:f,dal:r}),p=r.updateTeamMemberSession(f.id,m.sessionid);if(p!==null){let h=p.role_prompt??"",g=h.length>0?`${h}
2169
2167
 
2170
- ${fn}`:fn;r.setMemberPromptSnapshot(f.id,g),u.push(p);let h=mn(Ae(p),m.sessionid);h!==null&&e.stderr.write(`[seeded ${p.alias}] customize/compact in its native TUI:
2171
- ${h}
2168
+ ${fn}`:fn;r.setMemberPromptSnapshot(f.id,g),u.push(p);let _=mn(Ae(p),m.sessionid);_!==null&&e.stderr.write(`[seeded ${p.alias}] customize/compact in its native TUI:
2169
+ ${_}
2172
2170
  `);try{await Ni({dal:r,member:p,stderr:e.stderr})}catch(b){d=!0,e.stderr.write(`error: ${b instanceof Error?b.message:String(b)}
2173
2171
  `)}}}return D(s,"--json")?W(e,u):e.stdout.write(`seeded ${u.length} member(s)
2174
2172
  `),d?1:0}function tB(t,e,r){return t.filter(n=>e!==void 0&&n.alias!==e?!1:r||n.sessionid===null)}function rB(t,e,r){let n=P(t,["--interpreter","--of"]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0)return y(e,"usage: team companion <team-name> --interpreter A --of B[,C]");let o=r.findTeamByName(s);if(o===null)return y(e,`team not found: ${s}`);let i=A(n,"--interpreter"),a=A(n,"--of")?.split(",").map(c=>c.trim()).filter(Boolean);if(i===void 0||a===void 0||a.length===0)return y(e,"team companion requires --interpreter and --of");let l=r.findTeamMemberByAlias(o.id,i);if(l===null)return y(e,`member not found: ${i}`);for(let c of a){let u=r.findTeamMemberByAlias(o.id,c);if(u===null)return y(e,`member not found: ${c}`);r.insertTeamMemberCompanion({interpreter_id:l.id,companion_id:u.id})}return e.stdout.write(`recorded ${a.length} companion link(s)
2175
- `),0}var VW,aS=E(()=>{"use strict";Ge();Go();gs();qc();Ue();Dr();su();oa();fe();Jc();VW=`usage: lmctl team create <name>
2173
+ `),0}var VW,aS=E(()=>{"use strict";Ve();Go();gs();qc();We();Dr();su();oa();fe();Jc();VW=`usage: lmctl team create <name>
2176
2174
  lmctl team list [--json]
2177
2175
  lmctl team show <name> [--json]
2178
2176
  lmctl team add-member <team-name> --alias A --provider P [--model M] [--role R] [--sessiondir D] [--json]
@@ -2184,8 +2182,8 @@ ${fn}`:fn;r.setMemberPromptSnapshot(f.id,g),u.push(p);let h=mn(Ae(p),m.sessionid
2184
2182
  Manage DB-backed teams, members, and provider session lifecycle. Use seed or
2185
2183
  refresh to create/update native provider sessions for team members.
2186
2184
  `});var pS={};re(pS,{applyMaxBytes:()=>Ya,renderMessage:()=>fS,runTail:()=>aB});async function aB(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${iB}
2187
- `),0;let r=P(t,["--lines","--max-bytes","--watch-interval","--provider","--session","--run"],["--watch","--help"]);if(r.error!==void 0)return y(e,r.error);let n=A(r,"--lines"),s=A(r,"--max-bytes");if(n!==void 0&&s!==void 0)return y(e,"--lines and --max-bytes are mutually exclusive (choose one)");let o;if(n!==void 0){let m=Number.parseInt(n,10);if(!Number.isFinite(m)||m<1||String(m)!==n)return y(e,`invalid --lines "${n}" (expected a positive integer)`);o={kind:"lines",lines:m}}else{let m=s===void 0?sB:Number.parseInt(s,10);if(!Number.isFinite(m)||m<0||s!==void 0&&String(m)!==s)return y(e,`invalid --max-bytes "${s}" (expected a non-negative integer)`);o={kind:"bytes",maxBytes:m}}let i=D(r,"--watch"),a=A(r,"--watch-interval"),l=a===void 0?oB:Number.parseInt(a.replace(/s$/,""),10);if(!Number.isFinite(l)||l<1)return y(e,`invalid --watch-interval "${a}" (expected <N>s, N\u22651)`);if(r.positionals.length>2)return y(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let c=A(r,"--run");if(c!==void 0){if(r.positionals.length>0)return y(e,"--run is mutually exclusive with positional [target] [alias]");if(A(r,"--session")!==void 0)return y(e,"--run is mutually exclusive with --session");if(A(r,"--provider")!==void 0)return y(e,"--run is mutually exclusive with --provider");let m=Number.parseInt(c,10);if(!Number.isFinite(m)||m<=0||String(m)!==c)return y(e,`invalid --run "${c}" (expected a positive integer run id)`);try{return await O(e,async p=>lB(e,p,m,o,i,l))}catch(p){return _e(e,p)}}let u=Er(nB,{target:r.positionals[0],alias:r.positionals[1],flags:{session:A(r,"--session"),provider:A(r,"--provider")}});if(u.mode==="error")return y(e,u.message);if(u.mode==="managed")return y(e,"tail managed mode requires --run <id>");let d;if(u.mode==="ai-team")if(u.alias===void 0){let m;try{m=await O(e,g=>pe(u.teamfile,g))}catch(g){return y(e,`tail: ${g instanceof Error?g.message:String(g)}`)}let p;try{p=De(m)}catch(g){return y(e,`tail: ${g instanceof Error?g.message:String(g)}`)}let _=jt(p);if(_===void 0)return y(e,`tail: ${u.teamfile} has no Lead member; pass <tf>:<alias>`);try{let g=await O(e,h=>Je(u.teamfile,_.alias,h));d={provider:g.provider,sessionId:g.sessionid,cwd:g.sessiondir}}catch(g){return g instanceof Te?y(e,g.message):_e(e,g)}}else try{let m=await O(e,p=>Je(u.teamfile,u.alias,p));d={provider:m.provider,sessionId:m.sessionid,cwd:m.sessiondir}}catch(m){return m instanceof Te?y(e,m.message):_e(e,m)}else{let m=u.sessionid,p=u.provider;if(p===void 0){let _=await hi(m);if(_.length===0)return y(e,`tail: session "${m}" not found in any provider store`);if(_.length>1)return y(e,`tail: session "${m}" matches multiple providers (${_.join(", ")}); pass --provider`);p=_[0]}d={provider:p,sessionId:m}}let f=await lS(e,d.provider,d.sessionId,o,-1);return f<0?1:i?await new Promise(m=>{let p=async()=>{try{let h=await lS(e,d.provider,d.sessionId,o,f);h>=0&&(f=h)}catch(h){e.stderr.write(`tail: ${h instanceof Error?h.message:String(h)}
2188
- `)}},_=setInterval(()=>{p()},l*1e3),g=()=>{clearInterval(_),m(0)};process.once("SIGINT",g),process.once("SIGTERM",g)}):0}async function lS(t,e,r,n,s){let o;try{o=await Vt(r,e)}catch(c){return t.stderr.write(`tail: failed to load session: ${c instanceof Error?c.message:String(c)}
2185
+ `),0;let r=P(t,["--lines","--max-bytes","--watch-interval","--provider","--session","--run"],["--watch","--help"]);if(r.error!==void 0)return y(e,r.error);let n=A(r,"--lines"),s=A(r,"--max-bytes");if(n!==void 0&&s!==void 0)return y(e,"--lines and --max-bytes are mutually exclusive (choose one)");let o;if(n!==void 0){let m=Number.parseInt(n,10);if(!Number.isFinite(m)||m<1||String(m)!==n)return y(e,`invalid --lines "${n}" (expected a positive integer)`);o={kind:"lines",lines:m}}else{let m=s===void 0?sB:Number.parseInt(s,10);if(!Number.isFinite(m)||m<0||s!==void 0&&String(m)!==s)return y(e,`invalid --max-bytes "${s}" (expected a non-negative integer)`);o={kind:"bytes",maxBytes:m}}let i=D(r,"--watch"),a=A(r,"--watch-interval"),l=a===void 0?oB:Number.parseInt(a.replace(/s$/,""),10);if(!Number.isFinite(l)||l<1)return y(e,`invalid --watch-interval "${a}" (expected <N>s, N\u22651)`);if(r.positionals.length>2)return y(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let c=A(r,"--run");if(c!==void 0){if(r.positionals.length>0)return y(e,"--run is mutually exclusive with positional [target] [alias]");if(A(r,"--session")!==void 0)return y(e,"--run is mutually exclusive with --session");if(A(r,"--provider")!==void 0)return y(e,"--run is mutually exclusive with --provider");let m=Number.parseInt(c,10);if(!Number.isFinite(m)||m<=0||String(m)!==c)return y(e,`invalid --run "${c}" (expected a positive integer run id)`);try{return await O(e,async p=>lB(e,p,m,o,i,l))}catch(p){return _e(e,p)}}let u=Er(nB,{target:r.positionals[0],alias:r.positionals[1],flags:{session:A(r,"--session"),provider:A(r,"--provider")}});if(u.mode==="error")return y(e,u.message);if(u.mode==="managed")return y(e,"tail managed mode requires --run <id>");let d;if(u.mode==="ai-team")if(u.alias===void 0){let m;try{m=await O(e,g=>pe(u.teamfile,g))}catch(g){return y(e,`tail: ${g instanceof Error?g.message:String(g)}`)}let p;try{p=Pe(m)}catch(g){return y(e,`tail: ${g instanceof Error?g.message:String(g)}`)}let h=jt(p);if(h===void 0)return y(e,`tail: ${u.teamfile} has no Lead member; pass <tf>:<alias>`);try{let g=await O(e,_=>Xe(u.teamfile,h.alias,_));d={provider:g.provider,sessionId:g.sessionid,cwd:g.sessiondir}}catch(g){return g instanceof Te?y(e,g.message):_e(e,g)}}else try{let m=await O(e,p=>Xe(u.teamfile,u.alias,p));d={provider:m.provider,sessionId:m.sessionid,cwd:m.sessiondir}}catch(m){return m instanceof Te?y(e,m.message):_e(e,m)}else{let m=u.sessionid,p=u.provider;if(p===void 0){let h=await hi(m);if(h.length===0)return y(e,`tail: session "${m}" not found in any provider store`);if(h.length>1)return y(e,`tail: session "${m}" matches multiple providers (${h.join(", ")}); pass --provider`);p=h[0]}d={provider:p,sessionId:m}}let f=await lS(e,d.provider,d.sessionId,o,-1);return f<0?1:i?await new Promise(m=>{let p=async()=>{try{let _=await lS(e,d.provider,d.sessionId,o,f);_>=0&&(f=_)}catch(_){e.stderr.write(`tail: ${_ instanceof Error?_.message:String(_)}
2186
+ `)}},h=setInterval(()=>{p()},l*1e3),g=()=>{clearInterval(h),m(0)};process.once("SIGINT",g),process.once("SIGTERM",g)}):0}async function lS(t,e,r,n,s){let o;try{o=await Vt(r,e)}catch(c){return t.stderr.write(`tail: failed to load session: ${c instanceof Error?c.message:String(c)}
2189
2187
  `),-1}if(o===null)return t.stderr.write(`tail: session not found: ${r} (provider=${e})
2190
2188
  `),-1;let i=o.messages??[],a=s<0&&n.kind==="lines"?Math.max(0,i.length-n.lines):s+1;if(a>=i.length)return i.length-1;let l="";for(let c=a;c<i.length;c+=1)l+=`${fS(i[c])}
2191
2189
  `;return t.stdout.write(n.kind==="bytes"?Ya(l,n.maxBytes):l),i.length-1}function fS(t){let e=mS(t.timestamp),r=e?`${e} ${t.role}`:t.role,s=(t.content??"").replace(/\r\n/g,`
@@ -2194,9 +2192,9 @@ refresh to create/update native provider sessions for team members.
2194
2192
  `),o=s[0]??"",i=s.slice(1);return i.length===0?`${r}: ${o}`:`${r}: ${o}
2195
2193
  ${i.map(a=>` ${a}`).join(`
2196
2194
  `)}`}async function lB(t,e,r,n,s,o){if(e.getRun(r)===null)return y(t,`tail: run ${r}: not found`);let a=e.listSessionEvents(r),c=(n.kind==="lines"?a.slice(Math.max(0,a.length-n.lines)):a).map(d=>`${dS(d)}
2197
- `).join("");t.stdout.write(n.kind==="bytes"?Ya(c,n.maxBytes):c);let u=a.length>0?a[a.length-1].id:0;return s?await new Promise(d=>{let m=setInterval(()=>{try{let _=e.listSessionEvents(r,u),g="";for(let h of _)g+=`${dS(h)}
2198
- `,u=h.id;g.length>0&&t.stdout.write(n.kind==="bytes"?Ya(g,n.maxBytes):g)}catch(_){t.stderr.write(`tail: ${_ instanceof Error?_.message:String(_)}
2199
- `)}},o*1e3),p=()=>{clearInterval(m),d(0)};process.once("SIGINT",p),process.once("SIGTERM",p)}):0}function Ya(t,e){if(e===0||Buffer.byteLength(t,"utf8")<=e)return t;let n=Buffer.byteLength(cS,"utf8");if(n>=e)return uS(t,e);let s=e-n,o=uS(t,s);return`${cS}${o}`}function uS(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 dS(t){let e=mS(new Date(t.timestamp_ms))??"",r="";try{let o=JSON.parse(t.payload);typeof o.alias=="string"&&(r=`alias=${o.alias}`),typeof o.provider=="string"&&(r+=`${r?" ":""}provider=${o.provider}`),typeof o.tool=="string"&&(r+=`${r?" ":""}tool=${o.tool}`),typeof o.status=="string"&&(r+=`${r?" ":""}status=${o.status}`),(typeof o.tokens_in=="number"||typeof o.tokens_out=="number")&&(r+=`${r?" ":""}tokens=${o.tokens_in??0}/${o.tokens_out??0}`)}catch{}let n=r!==""?r:t.payload.slice(0,200),s=t.step_id===null?"":` step=${t.step_id}`;return`${e} ${t.kind}${s}: ${n}`}function mS(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 nB,sB,oB,iB,cS,hS=E(()=>{"use strict";Dr();fe();ot();Ot();wt();nB={name:"tail",allowsBareTeamfile:!0,supportsRaw:!0},sB=4096,oB=2,iB=`usage: lmctl tail [target] [alias]
2195
+ `).join("");t.stdout.write(n.kind==="bytes"?Ya(c,n.maxBytes):c);let u=a.length>0?a[a.length-1].id:0;return s?await new Promise(d=>{let m=setInterval(()=>{try{let h=e.listSessionEvents(r,u),g="";for(let _ of h)g+=`${dS(_)}
2196
+ `,u=_.id;g.length>0&&t.stdout.write(n.kind==="bytes"?Ya(g,n.maxBytes):g)}catch(h){t.stderr.write(`tail: ${h instanceof Error?h.message:String(h)}
2197
+ `)}},o*1e3),p=()=>{clearInterval(m),d(0)};process.once("SIGINT",p),process.once("SIGTERM",p)}):0}function Ya(t,e){if(e===0||Buffer.byteLength(t,"utf8")<=e)return t;let n=Buffer.byteLength(cS,"utf8");if(n>=e)return uS(t,e);let s=e-n,o=uS(t,s);return`${cS}${o}`}function uS(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 dS(t){let e=mS(new Date(t.timestamp_ms))??"",r="";try{let o=JSON.parse(t.payload);typeof o.alias=="string"&&(r=`alias=${o.alias}`),typeof o.provider=="string"&&(r+=`${r?" ":""}provider=${o.provider}`),typeof o.tool=="string"&&(r+=`${r?" ":""}tool=${o.tool}`),typeof o.status=="string"&&(r+=`${r?" ":""}status=${o.status}`),(typeof o.tokens_in=="number"||typeof o.tokens_out=="number")&&(r+=`${r?" ":""}tokens=${o.tokens_in??0}/${o.tokens_out??0}`)}catch{}let n=r!==""?r:t.payload.slice(0,200),s=t.step_id===null?"":` step=${t.step_id}`;return`${e} ${t.kind}${s}: ${n}`}function mS(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 nB,sB,oB,iB,cS,hS=E(()=>{"use strict";Dr();fe();it();Ot();wt();nB={name:"tail",allowsBareTeamfile:!0,supportsRaw:!0},sB=4096,oB=2,iB=`usage: lmctl tail [target] [alias]
2200
2198
  lmctl tail --session <id> [--provider <name>]
2201
2199
  lmctl tail --run <id>
2202
2200
  [--lines N | --max-bytes N] [--watch] [--watch-interval Ns] [--provider <name>]
@@ -2204,7 +2202,7 @@ ${i.map(a=>` ${a}`).join(`
2204
2202
  Print or watch provider session messages, or follow a managed run timeline.
2205
2203
  --lines and --max-bytes are mutually exclusive. Default: --max-bytes 4096.`;cS=`\u2026 [truncated older output \u2014 raise with --max-bytes]
2206
2204
  `});var bS={};re(bS,{runInfo:()=>mB});import{execFileSync as gf}from"node:child_process";import{dirname as gS,resolve as cB}from"node:path";function fB(t){return t>=1e6?`${(t/1e6).toFixed(1)}M`:t>=1e3?`${Math.round(t/1e3)}K`:String(t)}async function mB(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${dB}
2207
- `),0;let r=P(t,["--provider","--run"],["--json","--help"]);if(r.error!==void 0)return y(e,r.error);if(r.positionals.length>2)return y(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let n=D(r,"--json"),s=A(r,"--run");if(s!==void 0){if(r.positionals.length>0)return y(e,"--run is mutually exclusive with positional [target] [alias]");if(A(r,"--provider")!==void 0)return y(e,"--run is mutually exclusive with --provider");let c=Number.parseInt(s,10);if(!Number.isFinite(c)||c<=0||String(c)!==s)return y(e,`invalid --run "${s}" (expected a positive integer run id)`);try{return await O(e,async u=>hB(e,u,c,n))}catch(u){return _e(e,u)}}let o=Er(uB,{target:r.positionals[0],alias:r.positionals[1],flags:{provider:A(r,"--provider")}});if(o.mode==="error")return y(e,o.message);if(o.mode==="managed")return y(e,"health managed mode requires --run <id>");if(o.mode==="ai-team"&&o.alias===void 0){let c;try{c=await O(e,u=>pe(o.teamfile,u))}catch(u){return y(e,`health: ${u instanceof Error?u.message:String(u)}`)}return _B(e,c,n)}let i,a,l;if(o.mode==="ai-team")try{let c=await O(e,u=>Je(o.teamfile,o.alias,u));i=c.provider,a=c.sessionid,l=c.alias}catch(c){return c instanceof Te?y(e,c.message):_e(e,c)}else if(a=o.sessionid,o.provider!==void 0)i=o.provider;else{let c=await hi(a);if(c.length===0)return y(e,`health: session "${a}" not found in any provider store`);if(c.length>1)return y(e,`health: session "${a}" matches multiple providers (${c.join(", ")}); pass --provider`);i=c[0]}return pB(e,i,a,l,n)}async function pB(t,e,r,n,s){let o;try{o=await Vt(r,e)}catch(l){return y(t,`health: failed to load session: ${l instanceof Error?l.message:String(l)}`)}if(o===null)return y(t,`health: session not found: ${r} (provider=${e})`);let i=zs(o.messages),a={provider:o.provider,sessionId:o.sessionId,cwd:o.cwd,messageCount:o.messageCount??null,...o.model!==void 0?{model:o.model}:{},...n!==void 0?{alias:n}:{},totalInputTokens:o.totalInputTokens??null,totalOutputTokens:o.totalOutputTokens??null,...o.totalCachedInputTokens!==void 0?{totalCachedInputTokens:o.totalCachedInputTokens}:{},sessionLimit:i,createdAt:o.createdAt.toISOString(),modifiedAt:o.modifiedAt.toISOString()};return s?(W(t,a),0):(t.stdout.write(`Session: ${o.sessionId}
2205
+ `),0;let r=P(t,["--provider","--run"],["--json","--help"]);if(r.error!==void 0)return y(e,r.error);if(r.positionals.length>2)return y(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let n=D(r,"--json"),s=A(r,"--run");if(s!==void 0){if(r.positionals.length>0)return y(e,"--run is mutually exclusive with positional [target] [alias]");if(A(r,"--provider")!==void 0)return y(e,"--run is mutually exclusive with --provider");let c=Number.parseInt(s,10);if(!Number.isFinite(c)||c<=0||String(c)!==s)return y(e,`invalid --run "${s}" (expected a positive integer run id)`);try{return await O(e,async u=>hB(e,u,c,n))}catch(u){return _e(e,u)}}let o=Er(uB,{target:r.positionals[0],alias:r.positionals[1],flags:{provider:A(r,"--provider")}});if(o.mode==="error")return y(e,o.message);if(o.mode==="managed")return y(e,"health managed mode requires --run <id>");if(o.mode==="ai-team"&&o.alias===void 0){let c;try{c=await O(e,u=>pe(o.teamfile,u))}catch(u){return y(e,`health: ${u instanceof Error?u.message:String(u)}`)}return _B(e,c,n)}let i,a,l;if(o.mode==="ai-team")try{let c=await O(e,u=>Xe(o.teamfile,o.alias,u));i=c.provider,a=c.sessionid,l=c.alias}catch(c){return c instanceof Te?y(e,c.message):_e(e,c)}else if(a=o.sessionid,o.provider!==void 0)i=o.provider;else{let c=await hi(a);if(c.length===0)return y(e,`health: session "${a}" not found in any provider store`);if(c.length>1)return y(e,`health: session "${a}" matches multiple providers (${c.join(", ")}); pass --provider`);i=c[0]}return pB(e,i,a,l,n)}async function pB(t,e,r,n,s){let o;try{o=await Vt(r,e)}catch(l){return y(t,`health: failed to load session: ${l instanceof Error?l.message:String(l)}`)}if(o===null)return y(t,`health: session not found: ${r} (provider=${e})`);let i=zs(o.messages),a={provider:o.provider,sessionId:o.sessionId,cwd:o.cwd,messageCount:o.messageCount??null,...o.model!==void 0?{model:o.model}:{},...n!==void 0?{alias:n}:{},totalInputTokens:o.totalInputTokens??null,totalOutputTokens:o.totalOutputTokens??null,...o.totalCachedInputTokens!==void 0?{totalCachedInputTokens:o.totalCachedInputTokens}:{},sessionLimit:i,createdAt:o.createdAt.toISOString(),modifiedAt:o.modifiedAt.toISOString()};return s?(W(t,a),0):(t.stdout.write(`Session: ${o.sessionId}
2208
2206
  `),t.stdout.write(` Provider: ${o.provider}
2209
2207
  `),n!==void 0&&t.stdout.write(` Alias: ${n}
2210
2208
  `),t.stdout.write(` CWD: ${o.cwd}
@@ -2225,29 +2223,29 @@ Print or watch provider session messages, or follow a managed run timeline.
2225
2223
  `),t.stdout.write(` Steps: ${s.steps.length}
2226
2224
  `),t.stdout.write(` AgentCalls: ${i.agentCallCount}
2227
2225
  `),t.stdout.write(` Tokens: ${i.totalInputTokens} in / ${i.totalOutputTokens} out
2228
- `),0)}async function _B(t,e,r){let n,s;try{let w=await O(t,k=>{let N=Ze(e,k);if(N.parseErrors.length>0)throw new Error(N.parseErrors.join("; "));return{teamName:N.name,targets:yS(e,k,new Set,[])}});s=w.teamName,n=w.targets}catch(w){return y(t,`health: ${w instanceof Error?w.message:String(w)}`)}let o=TB(e),i=o.kind==="repo"?o:null,a=await gB(t,n),l=[],c=0,u=i===null?void 0:0,d=i===null?void 0:0;for(let w of n){let k=null;try{k=await Vt(w.sessionid,w.provider)}catch(M){t.stderr.write(`warning: failed to load session "${w.sessionid}" for ${w.reportPath} (${w.provider}): ${M instanceof Error?M.message:String(M)}
2229
- `)}let N=k?.messageCount,v=i===null?void 0:k===null?null:SB(k,i.since),R=i===null?void 0:k===null?null:kB(k)??"n/a",G=i===null?void 0:{messageCount:v??null,tokens:null};l.push({alias:w.alias,reportPath:w.reportPath,teamfile:w.teamfile,provider:w.provider,sessionid:w.sessionid,messageCount:N??null,model:k?.model??"(unknown)",lastContext:k?.lastInputTokens,detailLoaded:k!==null,liveness:a.get(wS(w.teamfile,w.alias))??ES(),sessionLimit:k===null?null:zs(k.messages),...i!==null?{activitySinceLastCommit:G,cumulativeTokens:R}:{}}),N===void 0?c=void 0:c!==void 0&&(c+=N),i!==null&&(v==null?u=void 0:u!==void 0&&(u+=v),R==null||R==="n/a"?d=void 0:d!==void 0&&(d+=R))}if(r)return W(t,{team:s,git:i===null?null:{teamDir:i.teamDir,commits:i.commits.map(w=>({ref:w.ref,timestamp:w.timestamp.toISOString()})),since:i.since.toISOString(),working:i.working},members:l.map(({detailLoaded:w,cumulativeTokens:k,...N})=>({...N,lastContext:N.lastContext??null,...k!==void 0?{cumulativeTokens:k==="n/a"?null:k}:{}})),total:{messageCount:c??null}}),0;let f=Math.max(7,...l.map(w=>w.sessionid.length)),m=Math.max(5,...l.map(w=>w.reportPath.length))+1,p=Math.max(8,...l.map(w=>w.provider.length))+1,_=Math.max(5,...l.map(w=>w.model.length))+1,g=Math.max(4,...l.map(w=>_S(w.liveness).length))+1;if(t.stdout.write(`TEAM: ${s}
2226
+ `),0)}async function _B(t,e,r){let n,s;try{let w=await O(t,k=>{let N=Qe(e,k);if(N.parseErrors.length>0)throw new Error(N.parseErrors.join("; "));return{teamName:N.name,targets:yS(e,k,new Set,[])}});s=w.teamName,n=w.targets}catch(w){return y(t,`health: ${w instanceof Error?w.message:String(w)}`)}let o=TB(e),i=o.kind==="repo"?o:null,a=await gB(t,n),l=[],c=0,u=i===null?void 0:0,d=i===null?void 0:0;for(let w of n){let k=null;try{k=await Vt(w.sessionid,w.provider)}catch(M){t.stderr.write(`warning: failed to load session "${w.sessionid}" for ${w.reportPath} (${w.provider}): ${M instanceof Error?M.message:String(M)}
2227
+ `)}let N=k?.messageCount,v=i===null?void 0:k===null?null:SB(k,i.since),R=i===null?void 0:k===null?null:kB(k)??"n/a",G=i===null?void 0:{messageCount:v??null,tokens:null};l.push({alias:w.alias,reportPath:w.reportPath,teamfile:w.teamfile,provider:w.provider,sessionid:w.sessionid,messageCount:N??null,model:k?.model??"(unknown)",lastContext:k?.lastInputTokens,detailLoaded:k!==null,liveness:a.get(wS(w.teamfile,w.alias))??ES(),sessionLimit:k===null?null:zs(k.messages),...i!==null?{activitySinceLastCommit:G,cumulativeTokens:R}:{}}),N===void 0?c=void 0:c!==void 0&&(c+=N),i!==null&&(v==null?u=void 0:u!==void 0&&(u+=v),R==null||R==="n/a"?d=void 0:d!==void 0&&(d+=R))}if(r)return W(t,{team:s,git:i===null?null:{teamDir:i.teamDir,commits:i.commits.map(w=>({ref:w.ref,timestamp:w.timestamp.toISOString()})),since:i.since.toISOString(),working:i.working},members:l.map(({detailLoaded:w,cumulativeTokens:k,...N})=>({...N,lastContext:N.lastContext??null,...k!==void 0?{cumulativeTokens:k==="n/a"?null:k}:{}})),total:{messageCount:c??null}}),0;let f=Math.max(7,...l.map(w=>w.sessionid.length)),m=Math.max(5,...l.map(w=>w.reportPath.length))+1,p=Math.max(8,...l.map(w=>w.provider.length))+1,h=Math.max(5,...l.map(w=>w.model.length))+1,g=Math.max(4,...l.map(w=>_S(w.liveness).length))+1;if(t.stdout.write(`TEAM: ${s}
2230
2228
  `),o.kind==="repo"){t.stdout.write(`Git progress:
2231
2229
  `);for(let w of o.commits)t.stdout.write(` ${w.ref}: ${w.timestamp.toISOString()}
2232
2230
  `);t.stdout.write(` Uncommitted: ${Tt(o.working.uncommittedTracked)} changed (tracked), ${Tt(o.working.untracked)} untracked
2233
2231
  `)}else o.reason==="no-commits"?t.stdout.write(`Git progress: git repository in ${o.teamDir} has no commits (no commit-based progress to report)
2234
2232
  `):t.stdout.write(`Git progress: no git repository in ${o.teamDir} (no commit-based progress to report)
2235
- `);t.stdout.write(` ${"SESSION".padEnd(f)} ${"ALIAS".padEnd(m)}${"PROVIDER".padEnd(p)}${"MODEL".padEnd(_)}${"LIVE".padEnd(g)}${"MSGS".padStart(6)} ${"LAST CONTEXT".padStart(12)}`+(i!==null?` ${"MSGS SINCE COMMIT".padStart(17)} ${"TOKENS SINCE COMMIT".padStart(19)} ${"TOKENS (cumulative)".padStart(19)}`:"")+`
2236
- `);let h=!1,b=l.filter(w=>w.sessionLimit!==null);for(let w of l){let k=EB(w.lastContext,w.detailLoaded,fB);(k==="n/a"||w.cumulativeTokens==="n/a")&&(h=!0),t.stdout.write(` ${w.sessionid.padEnd(f)} ${w.reportPath.padEnd(m)}${w.provider.padEnd(p)}${w.model.padEnd(_)}${_S(w.liveness).padEnd(g)}${Tt(w.messageCount).padStart(6)} ${k.padStart(12)}`+(i!==null?` ${Tt(w.activitySinceLastCommit?.messageCount).padStart(17)} ${Tt(w.activitySinceLastCommit?.tokens).padStart(19)} ${wB(w.cumulativeTokens).padStart(19)}`:"")+`
2237
- `)}if(t.stdout.write(` ${"TOTAL".padEnd(f)} ${"".padEnd(m)}${"".padEnd(p)}${"".padEnd(_)}${"".padEnd(g)}${Tt(c).padStart(6)}`+(i!==null?` ${"".padStart(12)} ${Tt(u).padStart(17)} ${Tt(null).padStart(19)} ${Tt(d).padStart(19)}`:"")+`
2238
- `),h&&t.stdout.write(`n/a = this provider does not expose a context/token total; absence is not a health signal.
2233
+ `);t.stdout.write(` ${"SESSION".padEnd(f)} ${"ALIAS".padEnd(m)}${"PROVIDER".padEnd(p)}${"MODEL".padEnd(h)}${"LIVE".padEnd(g)}${"MSGS".padStart(6)} ${"LAST CONTEXT".padStart(12)}`+(i!==null?` ${"MSGS SINCE COMMIT".padStart(17)} ${"TOKENS SINCE COMMIT".padStart(19)} ${"TOKENS (cumulative)".padStart(19)}`:"")+`
2234
+ `);let _=!1,b=l.filter(w=>w.sessionLimit!==null);for(let w of l){let k=EB(w.lastContext,w.detailLoaded,fB);(k==="n/a"||w.cumulativeTokens==="n/a")&&(_=!0),t.stdout.write(` ${w.sessionid.padEnd(f)} ${w.reportPath.padEnd(m)}${w.provider.padEnd(p)}${w.model.padEnd(h)}${_S(w.liveness).padEnd(g)}${Tt(w.messageCount).padStart(6)} ${k.padStart(12)}`+(i!==null?` ${Tt(w.activitySinceLastCommit?.messageCount).padStart(17)} ${Tt(w.activitySinceLastCommit?.tokens).padStart(19)} ${wB(w.cumulativeTokens).padStart(19)}`:"")+`
2235
+ `)}if(t.stdout.write(` ${"TOTAL".padEnd(f)} ${"".padEnd(m)}${"".padEnd(p)}${"".padEnd(h)}${"".padEnd(g)}${Tt(c).padStart(6)}`+(i!==null?` ${"".padStart(12)} ${Tt(u).padStart(17)} ${Tt(null).padStart(19)} ${Tt(d).padStart(19)}`:"")+`
2236
+ `),_&&t.stdout.write(`n/a = this provider does not expose a context/token total; absence is not a health signal.
2239
2237
  `),b.length>0){t.stdout.write(`Session limits:
2240
2238
  `);for(let w of b)t.stdout.write(` ${w.reportPath}: LIMITED resets_at=${TS(w.sessionLimit)}
2241
- `)}return 0}function yS(t,e,r,n){let s=pe(t,e);if(r.has(s))return[];r.add(s);let o=Ze(s,e);if(o.parseErrors.length>0)throw new Error(`${s}: ${o.parseErrors.join("; ")}`);let i=[];for(let a of o.members){if(a.teamfile!==void 0){i.push(...yS(cB(gS(s),a.teamfile),e,r,[...n,a.alias]));continue}a.session===void 0||a.session.length===0||i.push({teamfile:s,alias:a.alias,reportPath:[...n,a.alias].join("/"),provider:a.provider,sessionid:a.session})}return i}async function gB(t,e){try{let r=await O(t,n=>e.map(s=>{let o=n.getAgentInflight(s.teamfile,s.alias);return[wS(s.teamfile,s.alias),yB(o)]}));return new Map(r)}catch{return new Map}}function wS(t,e){return`${t}\0${e.toLowerCase()}`}function yB(t){return t===null?ES():{state:"in_flight",inFlight:{senderTeamfile:t.sender_teamfile,senderAlias:t.sender_alias,startedAt:t.started_at,activeCount:t.active_count,holderPid:t.holder_pid}}}function ES(){return{state:"idle",inFlight:null}}function _S(t){return t.state}function TS(t){return t.resets_at!==null?t.resets_at:t.timezone!==null?`${t.reset_time} (${t.timezone})`:t.reset_time}function Tt(t){return t==null?"unknown":String(t)}function wB(t){return t==="n/a"?t:Tt(t)}function EB(t,e,r=String){return t!==void 0?r(t):e?"n/a":"unknown"}function TB(t){let e=gS(t),r;try{gf("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=gf("git",["-C",e,"log","-2","--format=%ct"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{kind:"unavailable",reason:"no-commits",teamDir:e}}let n=r.split(/\r?\n/).map(o=>Number.parseInt(o.trim(),10)).filter(o=>Number.isFinite(o)&&o>0);if(n.length===0)return{kind:"unavailable",reason:"no-commits",teamDir:e};let s=n.slice(0,2).map((o,i)=>({ref:i===0?"HEAD":`HEAD~${i}`,timestamp:new Date(o*1e3)}));return{kind:"repo",teamDir:e,since:s[0].timestamp,commits:s,working:bB(e)}}function bB(t){let e;try{e=gf("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 SB(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 kB(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 uB,dB,SS=E(()=>{"use strict";Dr();fe();ot();wt();Gt();cf();uB={name:"health",allowsBareTeamfile:!0,supportsRaw:!0},dB=`usage: lmctl health [target] [alias]
2239
+ `)}return 0}function yS(t,e,r,n){let s=pe(t,e);if(r.has(s))return[];r.add(s);let o=Qe(s,e);if(o.parseErrors.length>0)throw new Error(`${s}: ${o.parseErrors.join("; ")}`);let i=[];for(let a of o.members){if(a.teamfile!==void 0){i.push(...yS(cB(gS(s),a.teamfile),e,r,[...n,a.alias]));continue}a.session===void 0||a.session.length===0||i.push({teamfile:s,alias:a.alias,reportPath:[...n,a.alias].join("/"),provider:a.provider,sessionid:a.session})}return i}async function gB(t,e){try{let r=await O(t,n=>e.map(s=>{let o=n.getAgentInflight(s.teamfile,s.alias);return[wS(s.teamfile,s.alias),yB(o)]}));return new Map(r)}catch{return new Map}}function wS(t,e){return`${t}\0${e.toLowerCase()}`}function yB(t){return t===null?ES():{state:"in_flight",inFlight:{senderTeamfile:t.sender_teamfile,senderAlias:t.sender_alias,startedAt:t.started_at,activeCount:t.active_count,holderPid:t.holder_pid}}}function ES(){return{state:"idle",inFlight:null}}function _S(t){return t.state}function TS(t){return t.resets_at!==null?t.resets_at:t.timezone!==null?`${t.reset_time} (${t.timezone})`:t.reset_time}function Tt(t){return t==null?"unknown":String(t)}function wB(t){return t==="n/a"?t:Tt(t)}function EB(t,e,r=String){return t!==void 0?r(t):e?"n/a":"unknown"}function TB(t){let e=gS(t),r;try{gf("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=gf("git",["-C",e,"log","-2","--format=%ct"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{kind:"unavailable",reason:"no-commits",teamDir:e}}let n=r.split(/\r?\n/).map(o=>Number.parseInt(o.trim(),10)).filter(o=>Number.isFinite(o)&&o>0);if(n.length===0)return{kind:"unavailable",reason:"no-commits",teamDir:e};let s=n.slice(0,2).map((o,i)=>({ref:i===0?"HEAD":`HEAD~${i}`,timestamp:new Date(o*1e3)}));return{kind:"repo",teamDir:e,since:s[0].timestamp,commits:s,working:bB(e)}}function bB(t){let e;try{e=gf("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 SB(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 kB(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 uB,dB,SS=E(()=>{"use strict";Dr();fe();it();wt();Gt();cf();uB={name:"health",allowsBareTeamfile:!0,supportsRaw:!0},dB=`usage: lmctl health [target] [alias]
2242
2240
  lmctl health <teamfile> # team rollup
2243
2241
  lmctl health <sessionid> [--provider <name>]
2244
2242
  [--json]
2245
2243
 
2246
2244
  Show provider session details, team rollups, or managed run state/token totals.`});var vS={};re(vS,{runLs:()=>xB});import{resolve as yf}from"node:path";function NB(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 xB(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${vB}
2247
- `),0;let r=P(t,["--provider","--sessiondir","--format","--limit"],["--recursive","--all","--json","--runs","--help"]);if(r.error!==void 0)return y(e,r.error);if(r.positionals.length>0)return y(e,"ls does not accept positional targets (use --provider/--sessiondir/--all to filter)");let n=A(r,"--format"),s=D(r,"--json");if(D(r,"--runs")){for(let h of["--provider","--sessiondir"])if(A(r,h)!==void 0)return y(e,`--runs is mutually exclusive with ${h}`);for(let h of["--recursive","--all"])if(D(r,h))return y(e,`--runs is mutually exclusive with ${h}`);if(n==="teamfile")return y(e,"--runs is mutually exclusive with --format teamfile (runs are not teamfile members)");let p=A(r,"--limit"),_=IB;if(p!==void 0){let h=Number.parseInt(p,10);if(!Number.isFinite(h)||h<1||String(h)!==p)return y(e,`invalid --limit "${p}" (expected a positive integer)`);if(h>kS)return y(e,`--limit ${h} exceeds maximum (${kS})`);_=h}let g=n==="json"||s===!0?"json":"table";try{return await O(e,async h=>AB(e,h,_,g))}catch(h){return _e(e,h)}}let i=$B(n,s);if("error"in i)return y(e,i.error);let a=i.format,l=A(r,"--provider"),c=A(r,"--sessiondir"),u=D(r,"--recursive"),d=D(r,"--all"),f;try{f=await kc(l?{provider:l}:{})}catch(p){return y(e,`ls: discovery failed: ${p instanceof Error?p.message:String(p)}`)}if(!d){let p=c!==void 0?yf(c):yf(process.cwd());f=f.filter(_=>{let g=yf(_.cwd);return u?g===p||g.startsWith(`${p}/`):g===p})}if(f=NB(f),a==="json")return W(e,f.map(p=>({provider:p.provider,sessionId:p.sessionId,cwd:p.cwd,messageCount:p.messageCount,modifiedAt:p.modifiedAt.toISOString(),...p.model!==void 0?{model:p.model}:{}}))),0;if(f.length===0){if(a==="table"){let p=d?"(all)":c??process.cwd(),_=u?"under":"in";e.stdout.write(`No native sessions found ${_} ${p}.
2245
+ `),0;let r=P(t,["--provider","--sessiondir","--format","--limit"],["--recursive","--all","--json","--runs","--help"]);if(r.error!==void 0)return y(e,r.error);if(r.positionals.length>0)return y(e,"ls does not accept positional targets (use --provider/--sessiondir/--all to filter)");let n=A(r,"--format"),s=D(r,"--json");if(D(r,"--runs")){for(let _ of["--provider","--sessiondir"])if(A(r,_)!==void 0)return y(e,`--runs is mutually exclusive with ${_}`);for(let _ of["--recursive","--all"])if(D(r,_))return y(e,`--runs is mutually exclusive with ${_}`);if(n==="teamfile")return y(e,"--runs is mutually exclusive with --format teamfile (runs are not teamfile members)");let p=A(r,"--limit"),h=IB;if(p!==void 0){let _=Number.parseInt(p,10);if(!Number.isFinite(_)||_<1||String(_)!==p)return y(e,`invalid --limit "${p}" (expected a positive integer)`);if(_>kS)return y(e,`--limit ${_} exceeds maximum (${kS})`);h=_}let g=n==="json"||s===!0?"json":"table";try{return await O(e,async _=>AB(e,_,h,g))}catch(_){return _e(e,_)}}let i=$B(n,s);if("error"in i)return y(e,i.error);let a=i.format,l=A(r,"--provider"),c=A(r,"--sessiondir"),u=D(r,"--recursive"),d=D(r,"--all"),f;try{f=await kc(l?{provider:l}:{})}catch(p){return y(e,`ls: discovery failed: ${p instanceof Error?p.message:String(p)}`)}if(!d){let p=c!==void 0?yf(c):yf(process.cwd());f=f.filter(h=>{let g=yf(h.cwd);return u?g===p||g.startsWith(`${p}/`):g===p})}if(f=NB(f),a==="json")return W(e,f.map(p=>({provider:p.provider,sessionId:p.sessionId,cwd:p.cwd,messageCount:p.messageCount,modifiedAt:p.modifiedAt.toISOString(),...p.model!==void 0?{model:p.model}:{}}))),0;if(f.length===0){if(a==="table"){let p=d?"(all)":c??process.cwd(),h=u?"under":"in";e.stdout.write(`No native sessions found ${h} ${p}.
2248
2246
  `)}return 0}if(a==="teamfile"){for(let p of f)e.stdout.write(`_MEMBER_ alias=- provider=${p.provider} sessionid=${p.sessionId} sessiondir=${p.cwd}
2249
2247
  `);return 0}let m=Math.max(14,...f.map(p=>p.sessionId.length));e.stdout.write(`${"SESSION".padEnd(m)} ${"PROVIDER".padEnd(10)} ${"SESSIONDIR".padEnd(36)} MODIFIED
2250
- `);for(let p of f){let _=p.cwd.length>36?`\u2026${p.cwd.slice(-35)}`:p.cwd;e.stdout.write(`${p.sessionId.padEnd(m)} ${p.provider.padEnd(10)} ${_.padEnd(36)} ${p.modifiedAt.toISOString()}
2248
+ `);for(let p of f){let h=p.cwd.length>36?`\u2026${p.cwd.slice(-35)}`:p.cwd;e.stdout.write(`${p.sessionId.padEnd(m)} ${p.provider.padEnd(10)} ${h.padEnd(36)} ${p.modifiedAt.toISOString()}
2251
2249
  `)}return 0}async function AB(t,e,r,n){let s=cn(e,{limit:r});if(n==="json")return W(t,s.map(o=>({id:o.id,job_id:o.job_id,workflow_id:o.workflow_id,team_id:o.team_id,current_state:o.current_state,terminal_state:o.terminal_state,started_at:o.started_at,ended_at:o.ended_at,paused_at:o.paused_at}))),0;if(s.length===0)return t.stdout.write(`No runs found.
2252
2250
  `),0;t.stdout.write(`${"RUN_ID".padEnd(8)} ${"WORKFLOW".padEnd(8)} ${"TEAM".padEnd(8)} ${"STATE".padEnd(20)} ${"TERMINAL".padEnd(20)} STARTED
2253
2251
  `);for(let o of s){let i=(o.current_state??"").padEnd(20),a=(o.terminal_state??"").padEnd(20);t.stdout.write(`${String(o.id).padEnd(8)} ${String(o.workflow_id).padEnd(8)} ${String(o.team_id).padEnd(8)} ${i} ${a} ${o.started_at}
@@ -2256,25 +2254,25 @@ Show provider session details, team rollups, or managed run state/token totals.`
2256
2254
  lmctl ls --runs [--limit N] [--format table|json] [--json]
2257
2255
 
2258
2256
  List native provider sessions in scope, or list recent managed runs with --runs.`,IB=50,kS=500});import{existsSync as no,readFileSync as NS}from"node:fs";import{homedir as RB}from"node:os";import{dirname as xS,resolve as Bn}from"node:path";import{fileURLToPath as jB}from"node:url";function Tf(t,e={}){let r=[],n=CB(e.modelSelectionDocPath);for(let s of t){let o=s.provider.trim().toLowerCase();if(s.effort&&o!=="opencode"&&o!=="lmplayer"&&o!=="qwen"&&r.push(`[${s.alias}] effort="${s.effort}" is ignored: effort selection is only supported for opencode and lmplayer.`),o==="qwen"&&s.effort&&r.push(`[${s.alias}] effort="${s.effort}" is not a qwen CLI flag: Qwen Code does not expose reasoning-effort selection. Use a thinking/effort model id in model= instead.`),o==="copilot"){if(!s.model)continue;r.push(`[${s.alias}] model="${s.model}" is ignored: copilot does not support lmctl model selection.`);continue}if(o==="lmplayer"&&!s.model){r.push(`[${s.alias}] provider=lmplayer has no model= \u2014 lmplayer will choose its own default model, which may not be visible in the teamfile. Set model= explicitly (e.g. github-copilot/gpt-5.4).`);continue}if(o==="lmplayer")continue;if(o==="opencode"){if(s.effort&&!s.model&&r.push(`[${s.alias}] effort="${s.effort}" has no effect without model= on an opencode member.`),!s.model){r.push(`[${s.alias}] provider=opencode has no model= \u2014 opencode will choose its own default model, which may not be servable and isn't visible in the teamfile. Set model= explicitly (e.g. github-copilot/gpt-5.4).`);continue}let a=WB(e.opencodeConfigPath);if(!a.available){r.push(`[${s.alias}] model="${s.model}" cannot be verified for opencode: ${a.reason}.`);continue}if(a.models.includes(s.model)||/^github-copilot\/(gpt|gemini|o[0-9])/.test(s.model))continue;if(!s.model.includes("/")){let l=a.models.filter(c=>c.endsWith(`/${s.model}`));r.push(l.length>0?`[${s.alias}] model="${s.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model>. Your opencode.json declares it as ${l.join(" / ")}; set model=${l[0]}.`:`[${s.alias}] model="${s.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model> (e.g. github-copilot/${s.model}). Declare it in ~/.config/opencode/opencode.json (see https://lmctl.com/examples/opencode.json).`);continue}r.push(`[${s.alias}] model="${s.model}" is not declared in your opencode.json. opencode resolves github-copilot GPT/Gemini config-free, but copilot Claude and custom providers must be declared \u2014 copy https://lmctl.com/examples/opencode.json to ~/.config/opencode/opencode.json and adjust for your account.`);continue}if(!s.model)continue;let i=n.get(o);if(!i){r.push(`[${s.alias}] model="${s.model}" cannot be verified for provider "${o}": `+(Za??"no tested models found in durable-memory/model_selection.md"));continue}i.includes(s.model)||r.push(`[${s.alias}] model="${s.model}" is not in the tested model list for provider "${o}". Valid tested models: ${HB(i)}`)}return r}function CB(t){if(!t&&ro)return ro;let e=new Map,r,n=t??MB();if(!no(n))return r=`${n} not found`,t||wf(e),t||(ro=e),t||(Za=r),e;let s;try{s=NS(n,"utf-8")}catch(o){return r=`${n} could not be read: ${o instanceof Error?o.message:String(o)}`,t||wf(e),t||(ro=e),t||(Za=r),e}for(let[o,i]of Object.entries(OB)){let a=FB(s,i),l=UB(a);l.length>0&&e.set(o,l)}return e.size===0&&(r=`${n} has no tested model rows`),!t&&e.size===0&&wf(e),t||(ro=e),t||(Za=r),e}function MB(){return DB(xS(jB(import.meta.url)))}function DB(t){let e=PB(t);if(e){let n=Bn(e,"durable-memory","model_selection.md");if(no(n))return n}let r=[Bn(t,"..","..","durable-memory","model_selection.md"),Bn(t,"..","..","..","durable-memory","model_selection.md")];for(let n of r)if(no(n))return n;return r[r.length-1]}function PB(t){let e=Bn(t);for(;;){if(no(Bn(e,"package.json")))return e;let r=xS(e);if(r===e)return null;e=r}}function wf(t){for(let[e,r]of Object.entries(LB))t.set(e,r)}function FB(t,e){let n=new RegExp(`^## ${qB(e)}\\s*$`,"m").exec(t);if(!n)return"";let s=n.index+n[0].length,o=t.slice(s),i=/^##\s+/m.exec(o);return i?o.slice(0,i.index):o}function UB(t){let e=new Set;for(let r of t.split(/\r?\n/)){let n=r.trim();if(!n.startsWith("| `"))continue;let s=/^\|\s*`([^`]+)`\s*\|/.exec(n);if(!s)continue;let o=s[1].trim();o&&o!=="Configured `model="&&e.add(o)}return[...e]}function WB(t){let e=t??Bn(RB(),".config","opencode","opencode.json");if(!no(e))return{available:!0,models:[]};let r;try{r=JSON.parse(NS(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:BB(r)}}function BB(t){if(!Ef(t))return[];let e=za(t.provider)??za(t.providers);if(!e)return[];let r=new Set;for(let[n,s]of Object.entries(e)){if(!Ef(s))continue;let o=za(s.models)??za(s.model);if(o)for(let i of Object.keys(o))r.add(i.startsWith(`${n}/`)?i:`${n}/${i}`)}return[...r].sort()}function za(t){return Ef(t)?t:null}function Ef(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function HB(t){return t.length>0?t.join(", "):"(none)"}function qB(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var OB,LB,ro,Za,AS=E(()=>{"use strict";OB={claude:"Claude",codex:"Codex",gemini:"Gemini",qwen:"Qwen",agy:"Antigravity"},LB={claude:["claude-opus-4-6","claude-opus-4-7","claude-opus-4-8","claude-sonnet-4-6","claude-sonnet-5","claude-haiku-4-5","claude-fable-5"],codex:["gpt-5.2","gpt-5.4","gpt-5.5","gpt-5.4-mini","gpt-5.3-codex","gpt-5.3-codex-spark"],gemini:["gemini-3.1-pro-preview","gemini-3-flash-preview","gemini-3.1-flash-lite-preview","gemini-2.5-flash","gemini-2.5-flash-lite"],qwen:["qwen3.5-plus","qwen3.6-plus"],agy:["gemini-1.5-flash","gemini-1.5-pro","gemini-3.5-flash","gemini-3.1-pro","gpt-oss-120b","gpt-4-turbo","gpt-4","gpt-3.5-turbo","claude-3-opus","claude-3-sonnet","claude-3-haiku"]},ro=null});import{homedir as JB}from"node:os";import{basename as XB}from"node:path";function Qa(t,e){let r=new Set;return{text:t.replace(VB,(s,o)=>{let i=o.trim(),a=GB[i];return a===void 0?(r.add(i),s):a(e)}),unknownNames:[...r].sort()}}function el(t){return{workdir:t.workdir,teamfile:t.teamfile,date:KB(t.date)}}function KB(t){return t.toISOString().slice(0,10)}var GB,VB,bf=E(()=>{"use strict";GB={workdir:t=>t.workdir,teamfile:t=>t.teamfile,teamname:t=>{let e=XB(t.teamfile);return e.endsWith(".lmctl")?e.slice(0,-6):e},home:()=>JB(),date:t=>t.date},VB=/{{\s*([A-Za-z0-9_-]+)\s*}}/g});var io={};re(io,{GEMINI_PROVIDER_NOTICE:()=>OS,_setLintSessiondirFsOpsForTests:()=>n2,_setTeamfileSeedForTests:()=>r2,buildRootTeamRegistrationRow:()=>PS,registerRootTeam:()=>FS,runHire:()=>d2,runLint:()=>u2,runRefresh:()=>f2,runSeed:()=>MS,sha256Text:()=>DS});import{createHash as YB}from"node:crypto";import{accessSync as zB,constants as $S,existsSync as ZB,readFileSync as nl,realpathSync as vf,statSync as QB,writeFileSync as rl}from"node:fs";import{dirname as Kr,resolve as jS}from"node:path";function r2(t){LS=t??(async e=>{let{seed:r}=await Promise.resolve().then(()=>(It(),Ic)),n=await r(e);return n.success?{sessionId:n.sessionId}:{error:n.error??"provider seed failed"}})}function n2(t){Vr=t===null?If:{...If,...t}}function s2(t,e){let r=Kr(e),n=new Set,s=[];for(let o of t){if(o.teamfile!==void 0)continue;let i=o.sessiondir??r,a=jS(i);if(n.has(a))continue;let l=o2(a);l!==void 0&&(n.add(a),s.push(`${o.alias}: sessiondir ${a} is not writable (seed would fail: ${l}) \u2014 fix permissions or set a writable sessiondir`))}return s}function o2(t){try{if(Vr.existsSync(t)){if(!Vr.statSync(t).isDirectory())return"ENOTDIR";Vr.accessSync(t,$S.W_OK);return}let e=l2(t);if(e===void 0)return;if(!Vr.statSync(e).isDirectory())return"ENOTDIR";Vr.accessSync(e,$S.W_OK);return}catch(e){return c2(e)??"permission check failed"}}function i2(t,e){let r=[];for(let n of t)n.teamfile!==void 0||n.sessiondir===void 0||CS(n.sessiondir,e)&&r.push(`${n.alias}: sessiondir equals the teamfile directory and is redundant; lmctl seed will remove it`);return r}function a2(t,e,r,n){let s=!1;for(let o of t){if(o.teamfile!==void 0||o.sessiondir===void 0||!CS(o.sessiondir,n))continue;let i=r.get(o.alias.toLowerCase());if(i===void 0)continue;let a=US(e[i],"sessiondir");a!==e[i]&&(e[i]=a,s=!0),o.sessiondir=void 0}return s}function CS(t,e){return RS(t)===RS(e)}function RS(t){let e=jS(t);try{return vf(e)}catch{return e}}function l2(t){let e=t;for(;;){try{if(Vr.existsSync(e))return e}catch{return}let r=Kr(e);if(r===e)return;e=r}}function c2(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 u2(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(e2),0;if(t.length!==1)return e.stderr.write(`usage: lmctl lint <teamfile.lmctl>
2259
- `),2;let r=t[0],n;try{n=await O(e,c=>pe(r,c))}catch(c){return Oe(e,`${r}: ${c instanceof Error?c.message:String(c)}`)}let s;try{s=De(n)}catch(c){return Oe(e,`${r}: ${c instanceof Error?c.message:String(c)}`)}let o=Hd(s,Kr(n)),i=Tf(s.members),a=nl(n,"utf8"),l=Qa(a,el({workdir:Kr(n),teamfile:n,date:new Date})).unknownNames;l.length>0&&i.push(`unknown template placeholder${l.length===1?"":"s"}: ${l.map(c=>`{{${c}}}`).join(", ")}`),i.push(...Hl(s.members,Kr(n))),i.push(...s2(s.members,n)),i.push(...i2(s.members,Kr(n)));for(let c of o)e.stderr.write(`error: ${c.field}: ${c.message}
2257
+ `),2;let r=t[0],n;try{n=await O(e,c=>pe(r,c))}catch(c){return Oe(e,`${r}: ${c instanceof Error?c.message:String(c)}`)}let s;try{s=Pe(n)}catch(c){return Oe(e,`${r}: ${c instanceof Error?c.message:String(c)}`)}let o=Hd(s,Kr(n)),i=Tf(s.members),a=nl(n,"utf8"),l=Qa(a,el({workdir:Kr(n),teamfile:n,date:new Date})).unknownNames;l.length>0&&i.push(`unknown template placeholder${l.length===1?"":"s"}: ${l.map(c=>`{{${c}}}`).join(", ")}`),i.push(...Hl(s.members,Kr(n))),i.push(...s2(s.members,n)),i.push(...i2(s.members,Kr(n)));for(let c of o)e.stderr.write(`error: ${c.field}: ${c.message}
2260
2258
  `);for(let c of s.members)xf([c],e),c.session!==void 0&&c.session.length<so&&i.push(`${c.alias}: sessionid is shorter than ${so} chars; run lmctl seed to refresh it`);for(let c of i)e.stderr.write(`warning: ${c}
2261
2259
  `);return await O(e,c=>{DT(n,c,u=>e.stderr.write(`${u}
2262
2260
  `))}),o.length>0?1:(e.stdout.write(`ok
2263
2261
  `),0)}async function MS(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(t2),0;if(t.length!==1)return e.stderr.write(`usage: lmctl seed <teamfile.lmctl>
2264
- `),2;let r=t[0],n;try{n=await O(e,h=>pe(r,h))}catch(h){return Oe(e,`${r}: ${h instanceof Error?h.message:String(h)}`)}let s;try{s=vf(n)}catch(h){return Oe(e,`${r}: ${h instanceof Error?h.message:String(h)}`)}let o=Kr(n),i;try{i=De(n)}catch(h){return Oe(e,`${r}: ${h instanceof Error?h.message:String(h)}`)}let l=nl(n,"utf8").split(`
2265
- `),c=h2(l),u=a2(i.members,l,c,o),d=Hd(i,o);if(d.length>0){xf(i.members,e);for(let h of d)e.stderr.write(`error: ${h.field}: ${h.message}
2266
- `);return 1}xf(i.members,e);for(let h of Tf(i.members))e.stderr.write(`warning: ${h}
2267
- `);for(let h of Hl(i.members,o))e.stderr.write(`warning: ${h}
2268
- `);let f=0,m=i.members.filter(h=>h.teamfile!==void 0?!1:h.session===void 0||h.session.length<so);for(let h of m)if(!WS(h.provider))return e.stderr.write(`error: ${h.alias}: invalid provider "${h.provider}"
2269
- `),1;for(let h of i.members){if(h.teamfile!==void 0)continue;if(h.session!==void 0&&h.session.length>=so){e.stderr.write(`warning: ${h.alias}: existing sessionid preserved; skipping
2270
- `);continue}let b=h.sessiondir??o,w=await LS({provider:h.provider,cwd:b,...h.model!==void 0?{model:h.model}:{},...h.effort!==void 0?{effort:h.effort}:{},...h.alias.toLowerCase()==="lead"?{prompt:m2(n,l.join(`
2271
- `),i.members)}:{}});if(w.error!==void 0||w.sessionId===void 0||w.sessionId.length<so){let v=`provider did not report a sessionid; no new session was found for ${b} (possible provider workspace/cwd mismatch)`;return e.stderr.write(`error: ${h.alias}: seed failed${w.error!==void 0?`: ${w.error}`:`; ${v}`}
2272
- `),1}let k=c.get(h.alias.toLowerCase());if(k===void 0)return e.stderr.write(`error: ${h.alias}: could not find matching _MEMBER_ line to update
2262
+ `),2;let r=t[0],n;try{n=await O(e,_=>pe(r,_))}catch(_){return Oe(e,`${r}: ${_ instanceof Error?_.message:String(_)}`)}let s;try{s=vf(n)}catch(_){return Oe(e,`${r}: ${_ instanceof Error?_.message:String(_)}`)}let o=Kr(n),i;try{i=Pe(n)}catch(_){return Oe(e,`${r}: ${_ instanceof Error?_.message:String(_)}`)}let l=nl(n,"utf8").split(`
2263
+ `),c=h2(l),u=a2(i.members,l,c,o),d=Hd(i,o);if(d.length>0){xf(i.members,e);for(let _ of d)e.stderr.write(`error: ${_.field}: ${_.message}
2264
+ `);return 1}xf(i.members,e);for(let _ of Tf(i.members))e.stderr.write(`warning: ${_}
2265
+ `);for(let _ of Hl(i.members,o))e.stderr.write(`warning: ${_}
2266
+ `);let f=0,m=i.members.filter(_=>_.teamfile!==void 0?!1:_.session===void 0||_.session.length<so);for(let _ of m)if(!WS(_.provider))return e.stderr.write(`error: ${_.alias}: invalid provider "${_.provider}"
2267
+ `),1;for(let _ of i.members){if(_.teamfile!==void 0)continue;if(_.session!==void 0&&_.session.length>=so){e.stderr.write(`warning: ${_.alias}: existing sessionid preserved; skipping
2268
+ `);continue}let b=_.sessiondir??o,w=await LS({provider:_.provider,cwd:b,..._.model!==void 0?{model:_.model}:{},..._.effort!==void 0?{effort:_.effort}:{},..._.alias.toLowerCase()==="lead"?{prompt:m2(n,l.join(`
2269
+ `),i.members)}:{}});if(w.error!==void 0||w.sessionId===void 0||w.sessionId.length<so){let v=`provider did not report a sessionid; no new session was found for ${b} (possible provider workspace/cwd mismatch)`;return e.stderr.write(`error: ${_.alias}: seed failed${w.error!==void 0?`: ${w.error}`:`; ${v}`}
2270
+ `),1}let k=c.get(_.alias.toLowerCase());if(k===void 0)return e.stderr.write(`error: ${_.alias}: could not find matching _MEMBER_ line to update
2273
2271
  `),1;let N=w2(l[k],"sessionid",w.sessionId);l[k]=N,f+=1,rl(n,l.join(`
2274
- `),"utf8"),e.stdout.write(`${h.alias}: seeded ${w.sessionId}
2272
+ `),"utf8"),e.stdout.write(`${_.alias}: seeded ${w.sessionId}
2275
2273
  `)}let p=l.join(`
2276
- `),_=T2(p,vf(n));(_!==p||u)&&rl(n,_,"utf8"),f===0&&e.stdout.write(`no members needed seeding
2277
- `);let g=new Date().toISOString();return await O(e,h=>{FS(h,{teamfilePath:s,name:i.name,rawText:_,now:g})}),0}async function d2(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(tl),0;let r=P(t,["--provider","--sessiondir"],[]);if(r.error!==void 0)return kf(e,r.error,tl);if(r.positionals.length!==2)return kf(e,"expected <teamfile.lmctl> and <alias>",tl);let[n,s]=r.positionals;if(!y2(s))return Oe(e,`invalid alias "${s}"`);if(s.toLowerCase()==="lead")return Oe(e,"hire only applies to non-Lead members");let o=A(r,"--provider");if(o===void 0)return kf(e,"missing value for --provider",tl);if(!WS(o))return Oe(e,`invalid provider "${o}"`);let i;try{i=await O(e,d=>pe(n,d))}catch(d){return Oe(e,`${n}: ${d instanceof Error?d.message:String(d)}`)}let a;try{a=nl(i,"utf8")}catch(d){return Oe(e,`${n}: ${d instanceof Error?d.message:String(d)}`)}if(g2(a,s))return Oe(e,`${s}: alias already exists in ${i}`);let l=A(r,"--sessiondir"),c=[`_MEMBER_ alias=${Nf(s)} provider=${o}`,...l===void 0?[]:[`sessiondir=${Nf(l)}`]].join(" "),u=E2(a,c);return rl(i,u,"utf8"),e.stdout.write(`Hired ${s} (${o}) -> ${i}
2274
+ `),h=T2(p,vf(n));(h!==p||u)&&rl(n,h,"utf8"),f===0&&e.stdout.write(`no members needed seeding
2275
+ `);let g=new Date().toISOString();return await O(e,_=>{FS(_,{teamfilePath:s,name:i.name,rawText:h,now:g})}),0}async function d2(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(tl),0;let r=P(t,["--provider","--sessiondir"],[]);if(r.error!==void 0)return kf(e,r.error,tl);if(r.positionals.length!==2)return kf(e,"expected <teamfile.lmctl> and <alias>",tl);let[n,s]=r.positionals;if(!y2(s))return Oe(e,`invalid alias "${s}"`);if(s.toLowerCase()==="lead")return Oe(e,"hire only applies to non-Lead members");let o=A(r,"--provider");if(o===void 0)return kf(e,"missing value for --provider",tl);if(!WS(o))return Oe(e,`invalid provider "${o}"`);let i;try{i=await O(e,d=>pe(n,d))}catch(d){return Oe(e,`${n}: ${d instanceof Error?d.message:String(d)}`)}let a;try{a=nl(i,"utf8")}catch(d){return Oe(e,`${n}: ${d instanceof Error?d.message:String(d)}`)}if(g2(a,s))return Oe(e,`${s}: alias already exists in ${i}`);let l=A(r,"--sessiondir"),c=[`_MEMBER_ alias=${Nf(s)} provider=${o}`,...l===void 0?[]:[`sessiondir=${Nf(l)}`]].join(" "),u=E2(a,c);return rl(i,u,"utf8"),e.stdout.write(`Hired ${s} (${o}) -> ${i}
2278
2276
  `),e.stdout.write(`Run: lmctl seed ${i}
2279
2277
  `),0}async function f2(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(Sf),0;let r,n;if(t.length===1){let d=Et(t[0]);if(d===null)return e.stderr.write(Sf),2;r=d.teamfile,n=d.alias}else if(t.length===2)[r,n]=t;else return e.stderr.write(Sf),2;let s;try{s=await O(e,d=>pe(r,d))}catch(d){return Oe(e,`${r}: ${d instanceof Error?d.message:String(d)}`)}let o;try{o=nl(s,"utf8")}catch(d){return Oe(e,`${r}: ${d instanceof Error?d.message:String(d)}`)}let i=o.split(`
2280
2278
  `),a=_2(i,n);if(a===void 0)return Oe(e,`${n}: no active _MEMBER_ entry found`);let l=i[a];if(oo(l,"teamfile")!==void 0)return Oe(e,`${n}: refresh only applies to provider-backed members, not teamfile= members`);let c=(e.env??process.env)[ss],u=oo(l,"sessionid");return c!==void 0&&c.length>0&&u===c?Oe(e,`${n}: cannot refresh its own running session \u2014 a meta-Lead or the operator must run this refresh.`):(i[a]=US(l,"sessionid"),a>0&&/^\s*#CreationTime:/u.test(i[a-1])&&i.splice(a-1,1),rl(s,i.join(`
@@ -2298,7 +2296,7 @@ ${t}`:`${r}
2298
2296
  `),1}function kf(t,e,r){return t.stderr.write(`error: ${e}
2299
2297
  ${r}`),2}function xf(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_
2300
2298
  `),r.provider==="gemini"&&e.stderr.write(`${OS.replace("%s",r.alias)}
2301
- `)}var so,e2,t2,tl,Sf,OS,If,LS,Vr,ao=E(()=>{"use strict";Ot();AS();$o();ut();fe();wt();ot();wt();bf();so=5,e2=`usage: lmctl lint <teamfile.lmctl>
2299
+ `)}var so,e2,t2,tl,Sf,OS,If,LS,Vr,ao=E(()=>{"use strict";Ot();AS();$o();ut();fe();wt();it();wt();bf();so=5,e2=`usage: lmctl lint <teamfile.lmctl>
2302
2300
 
2303
2301
  Validate an lmctl teamfile and warn about stale or placeholder session ids.
2304
2302
  `,t2=`usage: lmctl seed <teamfile.lmctl>
@@ -2370,7 +2368,7 @@ Examples:
2370
2368
 
2371
2369
  # Same shape, codex for the Lead and Reviewer2
2372
2370
  lmctl plan ./backend --provider codex
2373
- `});var ek={};re(ek,{SIZE_WARN_EST_TOKENS:()=>lo,estimateTokens:()=>QS,runTerminal:()=>G2});import{spawn as q2}from"node:child_process";import{statSync as J2}from"node:fs";async function G2(t,e){if(t.includes("--help")||t.includes("-h"))return Z2(e);let r=P(t,["--project","--team","--alias","--run"],["--size","--json","--help"]);if(r.error!==void 0)return y(e,r.error);let n=A(r,"--run");if(n!==void 0){let s=Number.parseInt(n,10);if(!Number.isFinite(s)||s<=0||String(s)!==n)return y(e,`invalid --run "${n}" (expected a positive integer run id)`);if(r.positionals.length>0)return y(e,"--run is mutually exclusive with positional <teamfile>[:alias]");let o=["--team","--project","--size","--json"];for(let i of o)if(i==="--size"||i==="--json"?D(r,i):A(r,i)!==void 0)return y(e,`--run is mutually exclusive with ${i}`);try{return await O(e,async i=>{let a=A(r,"--alias"),l=Ow(i,s,a);return"err"in l?y(e,l.err):$f(e,{provider:l.ok.provider,sessionid:l.ok.sessionid,sessiondir:l.ok.sessiondir})})}catch(i){return _e(e,i)}}if(r.positionals.length>0){let s=["--team","--project","--size","--alias","--json"];for(let l of s)if(l==="--size"||l==="--json"?D(r,l):A(r,l)!==void 0)return y(e,`positional <teamfile>[:alias] is mutually exclusive with ${l} (alias is the SECOND POSITIONAL: \`terminal <teamfile> <alias>\`).`);if(r.positionals.length>2)return y(e,`too many positionals (${r.positionals.length}); expected <teamfile>[:alias] [alias]`);let o=r.positionals[0],i=r.positionals[1],a=Er(X2,{target:o,alias:i,flags:{}});return a.mode==="error"?y(e,a.message):a.mode!=="ai-team"?y(e,`internal: terminal positional yielded unexpected mode "${a.mode}"`):a.alias===void 0?y(e,"terminal: alias required for the teamfile target"):await O(e,l=>V2(e,a.teamfile,a.alias,l))}try{return await O(e,async s=>{let o=K2(e,s,r);if(typeof o=="number")return o;let i=A(r,"--alias");return D(r,"--size")?z2(e,s,o,i,D(r,"--json")):Y2(e,s,o,i)})}catch(s){return _e(e,s)}}async function V2(t,e,r,n){let s;try{s=Je(e,r,n)}catch(l){return l instanceof Te?y(t,l.message):_e(t,l)}let o=Pn(n,{receiver_teamfile:s.teamfile,receiver_alias:s.alias,sender_teamfile:s.teamfile,sender_alias:"terminal",ttlMs:Wn()});if(!o.acquired)return y(t,`${s.alias} is busy/held by ${o.current.sender_alias} (${o.current.sender_teamfile}) since ${o.current.started_at}`);let i=ZT({teamfile:s.teamfile,alias:s.alias}),a=null;try{n.setTerminalLock(i),a=setInterval(()=>{try{!n.heartbeatTerminalLock(i.teamfile,i.alias,i.lock_id,new Date().toISOString())&&a!==null&&(clearInterval(a),a=null)}catch{}},QT()),a.unref?.();try{Si(t,De(s.teamfile),s.teamfile)}catch{}return await $f(t,{provider:s.provider,sessionid:s.sessionid,sessiondir:s.sessiondir,isLead:s.isLead})}finally{a!==null&&clearInterval(a),n.clearTerminalLock(i.teamfile,i.alias,i.lock_id),n.releaseAgentInflight(o.lease)}}async function $f(t,e){let{provider:r,sessionid:n,sessiondir:s}=e;if(!pi(r))return y(t,`no resume incantation for provider "${r}"`);if(!Gh.test(n))return y(t,"refusing to resume: malformed sessionid");let o=Vc(r,n,{isLead:e.isLead});if(o===null||o.length===0)return y(t,`no resume incantation for provider "${r}"`);let[i,...a]=o;return await new Promise(l=>{let c=q2(i,a,{stdio:"inherit",cwd:s,env:Be(process.env,s,n)});c.on("error",u=>{l(y(t,`failed to launch ${i}: ${u.message}`))}),c.on("exit",u=>l(u??0))})}function K2(t,e,r){let n=A(r,"--team");if(n!==void 0){let i=e.findTeamByName(n);return i===null?y(t,`team not found: ${n}`):i}let s=xi(t,e,A(r,"--project"));return typeof s=="number"?s:Ai(t,e,s,void 0)}async function Y2(t,e,r,n){let s=$i(t,e,r,n);if(typeof s=="number")return s;let o=s.sessionid;return o===null||o.trim().length===0?y(t,`member ${s.alias} has no session yet \u2014 run \`lmctl team seed ${r.name}\` first`):$f(t,{provider:Ae(s),sessionid:o,sessiondir:s.sessiondir})}function QS(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=J2(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 z2(t,e,r,n,s){let o;if(n!==void 0){let a=e.findTeamMemberByAlias(r.id,n);if(a===null||a.state==="retired")return y(t,`member not found: ${n}`);o=[a]}else o=e.listTeamMembers(r.id).filter(a=>a.state!=="retired"&&a.sessionid!==null);let i=[];for(let a of o){let l=a.sessionid;if(l===null)continue;let c=Ae(a),u=null;pi(c)&&(u=await Vt(l,c));let d=QS(u),f=d.est>lo;i.push({alias:a.alias,provider:c,sessionid:l,messages:d.messages,bytes:d.bytes,est_tokens:d.est,estimate:!0,over_guide:f,resume_incantation:f?mn(c,l):null})}if(s)return W(t,{estimate:!0,legend:ZS,guide_tokens:lo,members:i}),0;t.stdout.write(`session size \u2014 ESTIMATE only (nothing is changed automatically)
2371
+ `});var ek={};re(ek,{SIZE_WARN_EST_TOKENS:()=>lo,estimateTokens:()=>QS,runTerminal:()=>G2});import{spawn as q2}from"node:child_process";import{statSync as J2}from"node:fs";async function G2(t,e){if(t.includes("--help")||t.includes("-h"))return Z2(e);let r=P(t,["--project","--team","--alias","--run"],["--size","--json","--help"]);if(r.error!==void 0)return y(e,r.error);let n=A(r,"--run");if(n!==void 0){let s=Number.parseInt(n,10);if(!Number.isFinite(s)||s<=0||String(s)!==n)return y(e,`invalid --run "${n}" (expected a positive integer run id)`);if(r.positionals.length>0)return y(e,"--run is mutually exclusive with positional <teamfile>[:alias]");let o=["--team","--project","--size","--json"];for(let i of o)if(i==="--size"||i==="--json"?D(r,i):A(r,i)!==void 0)return y(e,`--run is mutually exclusive with ${i}`);try{return await O(e,async i=>{let a=A(r,"--alias"),l=Ow(i,s,a);return"err"in l?y(e,l.err):$f(e,{provider:l.ok.provider,sessionid:l.ok.sessionid,sessiondir:l.ok.sessiondir})})}catch(i){return _e(e,i)}}if(r.positionals.length>0){let s=["--team","--project","--size","--alias","--json"];for(let l of s)if(l==="--size"||l==="--json"?D(r,l):A(r,l)!==void 0)return y(e,`positional <teamfile>[:alias] is mutually exclusive with ${l} (alias is the SECOND POSITIONAL: \`terminal <teamfile> <alias>\`).`);if(r.positionals.length>2)return y(e,`too many positionals (${r.positionals.length}); expected <teamfile>[:alias] [alias]`);let o=r.positionals[0],i=r.positionals[1],a=Er(X2,{target:o,alias:i,flags:{}});return a.mode==="error"?y(e,a.message):a.mode!=="ai-team"?y(e,`internal: terminal positional yielded unexpected mode "${a.mode}"`):a.alias===void 0?y(e,"terminal: alias required for the teamfile target"):await O(e,l=>V2(e,a.teamfile,a.alias,l))}try{return await O(e,async s=>{let o=K2(e,s,r);if(typeof o=="number")return o;let i=A(r,"--alias");return D(r,"--size")?z2(e,s,o,i,D(r,"--json")):Y2(e,s,o,i)})}catch(s){return _e(e,s)}}async function V2(t,e,r,n){let s;try{s=Xe(e,r,n)}catch(l){return l instanceof Te?y(t,l.message):_e(t,l)}let o=Pn(n,{receiver_teamfile:s.teamfile,receiver_alias:s.alias,sender_teamfile:s.teamfile,sender_alias:"terminal",ttlMs:Wn()});if(!o.acquired)return y(t,`${s.alias} is busy/held by ${o.current.sender_alias} (${o.current.sender_teamfile}) since ${o.current.started_at}`);let i=ZT({teamfile:s.teamfile,alias:s.alias}),a=null;try{n.setTerminalLock(i),a=setInterval(()=>{try{!n.heartbeatTerminalLock(i.teamfile,i.alias,i.lock_id,new Date().toISOString())&&a!==null&&(clearInterval(a),a=null)}catch{}},QT()),a.unref?.();try{Si(t,Pe(s.teamfile),s.teamfile)}catch{}return await $f(t,{provider:s.provider,sessionid:s.sessionid,sessiondir:s.sessiondir,isLead:s.isLead})}finally{a!==null&&clearInterval(a),n.clearTerminalLock(i.teamfile,i.alias,i.lock_id),n.releaseAgentInflight(o.lease)}}async function $f(t,e){let{provider:r,sessionid:n,sessiondir:s}=e;if(!pi(r))return y(t,`no resume incantation for provider "${r}"`);if(!Gh.test(n))return y(t,"refusing to resume: malformed sessionid");let o=Vc(r,n,{isLead:e.isLead});if(o===null||o.length===0)return y(t,`no resume incantation for provider "${r}"`);let[i,...a]=o;return await new Promise(l=>{let c=q2(i,a,{stdio:"inherit",cwd:s,env:He(process.env,s,n)});c.on("error",u=>{l(y(t,`failed to launch ${i}: ${u.message}`))}),c.on("exit",u=>l(u??0))})}function K2(t,e,r){let n=A(r,"--team");if(n!==void 0){let i=e.findTeamByName(n);return i===null?y(t,`team not found: ${n}`):i}let s=xi(t,e,A(r,"--project"));return typeof s=="number"?s:Ai(t,e,s,void 0)}async function Y2(t,e,r,n){let s=$i(t,e,r,n);if(typeof s=="number")return s;let o=s.sessionid;return o===null||o.trim().length===0?y(t,`member ${s.alias} has no session yet \u2014 run \`lmctl team seed ${r.name}\` first`):$f(t,{provider:Ae(s),sessionid:o,sessiondir:s.sessiondir})}function QS(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=J2(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 z2(t,e,r,n,s){let o;if(n!==void 0){let a=e.findTeamMemberByAlias(r.id,n);if(a===null||a.state==="retired")return y(t,`member not found: ${n}`);o=[a]}else o=e.listTeamMembers(r.id).filter(a=>a.state!=="retired"&&a.sessionid!==null);let i=[];for(let a of o){let l=a.sessionid;if(l===null)continue;let c=Ae(a),u=null;pi(c)&&(u=await Vt(l,c));let d=QS(u),f=d.est>lo;i.push({alias:a.alias,provider:c,sessionid:l,messages:d.messages,bytes:d.bytes,est_tokens:d.est,estimate:!0,over_guide:f,resume_incantation:f?mn(c,l):null})}if(s)return W(t,{estimate:!0,legend:ZS,guide_tokens:lo,members:i}),0;t.stdout.write(`session size \u2014 ESTIMATE only (nothing is changed automatically)
2374
2372
  `),t.stdout.write(`${ZS}
2375
2373
  `);for(let a of i){let l=a.messages===null?"?":String(a.messages),c=a.bytes===null?"?":String(a.bytes);t.stdout.write(`${a.alias} ${a.provider} msgs=${l} bytes=${c} ~${a.est_tokens} tok (rough estimate)
2376
2374
  `),a.over_guide&&t.stdout.write(` \u26A0 ${a.alias}: estimated ~${a.est_tokens} tokens \u2014 ESTIMATE only, exceeds the 200K guide.
@@ -2409,11 +2407,11 @@ Examples:
2409
2407
  tokens it surfaces the resume incantation so YOU can
2410
2408
  open & self-compact. Nothing is ever changed
2411
2409
  automatically; ${lo} is a guide, not a gate.
2412
- `),0}var X2,lo,ZS,tk=E(()=>{"use strict";Ue();Dr();fe();au();ot();Ot();ut();ki();Ca();rf();sf();ba();X2={name:"terminal",allowsBareTeamfile:!1,supportsRaw:!1},lo=2e5,ZS="est = rough local heuristic (~4 chars/token), NOT an exact provider token count \u2014 open the session to verify before acting."});import{resolve as Rf,dirname as ok}from"node:path";function jf(t,e){let r=Rf(t);for(;;){let n=Q2(e,r);if(n!==null)return n;let s=ok(r);if(s===r)return null;r=s}}function Q2(t,e){return t.db.prepare("SELECT * FROM project WHERE local_path = ? LIMIT 1").get(e)??null}function sl(){return process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0}function ol(){return process.env.LMCTL_WORKSPACE!==void 0&&process.env.LMCTL_WORKSPACE.length>0}function Of(t){if(t.io.dal!==void 0){let o=rk(t.io.dal,t.cwd,t.projectName);if(o===null)throw new it(nk(t.projectName));return{dal:t.io.dal,ownsDal:!1,dbPath:":injected:",workspaceName:null,project:o,matchedLocalPath:t.projectName===void 0?o.local_path:null,resolverMode:"injected"}}if(sl()||ol()){let o=le(),i=ge({path:o}),a=rk(i,t.cwd,t.projectName);if(a===null)throw i.close(),new it(nk(t.projectName));return{dal:i,ownsDal:!0,dbPath:o,workspaceName:ol()?process.env.LMCTL_WORKSPACE??null:null,project:a,matchedLocalPath:t.projectName===void 0?a.local_path:null,resolverMode:sl()?"explicit-db":"explicit-workspace"}}let e=t.projectName===void 0?ak(t.cwd):eH(t.projectName),r=lk(e,t.projectName===void 0?"cwd":"project"),n=ge({path:r.candidate.db_path}),s=n.getProject(r.project.id);if(s===null)throw n.close(),new it(`resolved project disappeared from workspace DB: ${r.project.name}`);return{dal:n,ownsDal:!0,dbPath:r.candidate.db_path,workspaceName:r.candidate.workspace_name,project:s,matchedLocalPath:r.matched_local_path,resolverMode:t.projectName===void 0?"cwd-scan":"project-scan"}}function ik(t){if(t.io.dal!==void 0)return{dal:t.io.dal,ownsDal:!1,dbPath:":injected:",workspaceName:null,resolverMode:"injected"};if(sl()||ol()){let n=le();return{dal:ge({path:n}),ownsDal:!0,dbPath:n,workspaceName:ol()?process.env.LMCTL_WORKSPACE??null:null,resolverMode:sl()?"explicit-db":"explicit-workspace"}}let e;try{e=ak(t.cwd)}catch{throw new it("job ids are workspace-local and cwd does not resolve to a workspace DB; use --workspace <name> or --db <path>")}let r=lk(e,"job-cwd");return{dal:ge({path:r.candidate.db_path}),ownsDal:!0,dbPath:r.candidate.db_path,workspaceName:r.candidate.workspace_name,resolverMode:"cwd-scan"}}function rk(t,e,r){return r!==void 0?t.findProjectByName(r):jf(e,t)}function nk(t){return t!==void 0?`project not found: ${t}`:"no lmctl project found for cwd; pass --project or run from inside a registered project"}function eH(t){let e=[];for(let r of ml())for(let n of ck(r))n.name===t&&e.push({candidate:r,project:n,matched_local_path:null,match_depth:0});if(e.length===0)throw new it(`project not found in any workspace DB: ${t}`);return e}function ak(t){let e=tH(t),r=new Map;e.forEach((s,o)=>{r.set(s,e.length-o)});let n=[];for(let s of ml())for(let o of ck(s)){let i=Rf(o.local_path),a=r.get(i);a!==void 0&&n.push({candidate:s,project:o,matched_local_path:i,match_depth:a})}if(n.length===0)throw new it("no lmctl project found for cwd in workspace DBs; pass --workspace and --project");return n}function lk(t,e){let r=Math.max(...t.map(s=>s.match_depth)),n=t.filter(s=>s.match_depth===r);if(n.length===1)return n[0];throw e==="job-cwd"?new it(`job ids are workspace-local and cwd resolves ambiguously; use --workspace <name> or --db <path>
2413
- ${sk(n)}`):new it(`ambiguous lmctl ${e} match; use --workspace <name> --project <name>
2410
+ `),0}var X2,lo,ZS,tk=E(()=>{"use strict";We();Dr();fe();au();it();Ot();ut();ki();Ca();rf();sf();ba();X2={name:"terminal",allowsBareTeamfile:!1,supportsRaw:!1},lo=2e5,ZS="est = rough local heuristic (~4 chars/token), NOT an exact provider token count \u2014 open the session to verify before acting."});import{resolve as Rf,dirname as ok}from"node:path";function jf(t,e){let r=Rf(t);for(;;){let n=Q2(e,r);if(n!==null)return n;let s=ok(r);if(s===r)return null;r=s}}function Q2(t,e){return t.db.prepare("SELECT * FROM project WHERE local_path = ? LIMIT 1").get(e)??null}function sl(){return process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0}function ol(){return process.env.LMCTL_WORKSPACE!==void 0&&process.env.LMCTL_WORKSPACE.length>0}function Of(t){if(t.io.dal!==void 0){let o=rk(t.io.dal,t.cwd,t.projectName);if(o===null)throw new at(nk(t.projectName));return{dal:t.io.dal,ownsDal:!1,dbPath:":injected:",workspaceName:null,project:o,matchedLocalPath:t.projectName===void 0?o.local_path:null,resolverMode:"injected"}}if(sl()||ol()){let o=le(),i=ge({path:o}),a=rk(i,t.cwd,t.projectName);if(a===null)throw i.close(),new at(nk(t.projectName));return{dal:i,ownsDal:!0,dbPath:o,workspaceName:ol()?process.env.LMCTL_WORKSPACE??null:null,project:a,matchedLocalPath:t.projectName===void 0?a.local_path:null,resolverMode:sl()?"explicit-db":"explicit-workspace"}}let e=t.projectName===void 0?ak(t.cwd):eH(t.projectName),r=lk(e,t.projectName===void 0?"cwd":"project"),n=ge({path:r.candidate.db_path}),s=n.getProject(r.project.id);if(s===null)throw n.close(),new at(`resolved project disappeared from workspace DB: ${r.project.name}`);return{dal:n,ownsDal:!0,dbPath:r.candidate.db_path,workspaceName:r.candidate.workspace_name,project:s,matchedLocalPath:r.matched_local_path,resolverMode:t.projectName===void 0?"cwd-scan":"project-scan"}}function ik(t){if(t.io.dal!==void 0)return{dal:t.io.dal,ownsDal:!1,dbPath:":injected:",workspaceName:null,resolverMode:"injected"};if(sl()||ol()){let n=le();return{dal:ge({path:n}),ownsDal:!0,dbPath:n,workspaceName:ol()?process.env.LMCTL_WORKSPACE??null:null,resolverMode:sl()?"explicit-db":"explicit-workspace"}}let e;try{e=ak(t.cwd)}catch{throw new at("job ids are workspace-local and cwd does not resolve to a workspace DB; use --workspace <name> or --db <path>")}let r=lk(e,"job-cwd");return{dal:ge({path:r.candidate.db_path}),ownsDal:!0,dbPath:r.candidate.db_path,workspaceName:r.candidate.workspace_name,resolverMode:"cwd-scan"}}function rk(t,e,r){return r!==void 0?t.findProjectByName(r):jf(e,t)}function nk(t){return t!==void 0?`project not found: ${t}`:"no lmctl project found for cwd; pass --project or run from inside a registered project"}function eH(t){let e=[];for(let r of ml())for(let n of ck(r))n.name===t&&e.push({candidate:r,project:n,matched_local_path:null,match_depth:0});if(e.length===0)throw new at(`project not found in any workspace DB: ${t}`);return e}function ak(t){let e=tH(t),r=new Map;e.forEach((s,o)=>{r.set(s,e.length-o)});let n=[];for(let s of ml())for(let o of ck(s)){let i=Rf(o.local_path),a=r.get(i);a!==void 0&&n.push({candidate:s,project:o,matched_local_path:i,match_depth:a})}if(n.length===0)throw new at("no lmctl project found for cwd in workspace DBs; pass --workspace and --project");return n}function lk(t,e){let r=Math.max(...t.map(s=>s.match_depth)),n=t.filter(s=>s.match_depth===r);if(n.length===1)return n[0];throw e==="job-cwd"?new at(`job ids are workspace-local and cwd resolves ambiguously; use --workspace <name> or --db <path>
2411
+ ${sk(n)}`):new at(`ambiguous lmctl ${e} match; use --workspace <name> --project <name>
2414
2412
  ${sk(n)}`)}function sk(t){return t.map(e=>` workspace ${e.candidate.workspace_name??"(legacy)"} project ${e.project.name} ${e.project.local_path}`).join(`
2415
- `)}function tH(t){let e=[],r=Rf(t);for(;;){e.push(r);let n=ok(r);if(n===r)return e;r=n}}function ck(t){let e=null;try{e=new yo(t.db_path,{readonly:!0,fileMustExist:!0});let r=Number(e.pragma("user_version",{simple:!0})??0);if(!Number.isInteger(r)||r<=0||r>$l)return[];let n=e.prepare("PRAGMA table_info(project)").all(),s=new Set(n.map(o=>o.name));return!s.has("id")||!s.has("name")||!s.has("local_path")?[]:e.prepare("SELECT id, name, local_path FROM project").all()}catch{return[]}finally{e?.close()}}var it,Lf=E(()=>{"use strict";Al();jl();Ue();Ge();it=class extends Error{constructor(e){super(e),this.name="CliContextError"}}});var Uf={};re(Uf,{assertNoCrossWorkflowSubflowCycle:()=>_k,firstUnregisteredArchetype:()=>Ff,runWorkflow:()=>hH});import{createHash as Df,randomUUID as rH}from"node:crypto";import{existsSync as nH,readFileSync as ll,readdirSync as sH,writeFileSync as oH}from"node:fs";import{basename as iH,join as aH,resolve as lH}from"node:path";import{pathToFileURL as cH}from"node:url";function Pf(t,e){return{source_uri:cH(lH(t)).href,source_sha256:Df("sha256").update(e).digest("hex")}}function fk(t){return Df("sha256").update(t).digest("hex")}async function mH(t){let e=await go(t,{description:"remote workflow URL"});return{definition:e.toString("utf8"),source_uri:t,source_sha256:fk(e),remote:!0}}async function al(t){if(fr(t)){let n=await Es(t),s=ll(n,"utf8");return{definition:s,source_uri:t,source_sha256:fk(s),remote:!1}}let e=zn(t,"remote workflow URLs");if(e!==null)throw new Error(e);if(Yn(t))return mH(t);let r=ll(t,"utf8");return{definition:r,...Pf(t,r),remote:!1}}function mk(t){return Ce(t.definition)}function pk(t){if(t.definition_schema_version!==3)return null;let e=Ff(t);return e!==null?`unknown archetype \`${e.type}\` (step \`${e.id}\`) \u2014 not in the live archetype registry`:null}function pH(t){let e=new Set;if(t.definition_schema_version===3)for(let r of t.steps)e.add(r.type);else for(let r of Object.values(t.states))e.add(r.type);return Array.from(e).sort()}async function hH(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(fH),0;try{return r==="run"?await _H(n,e):await O(e,s=>{switch(r){case"load":return EH(n,e,s);case"author":return TH(n,e,s);case"list":return bH(n,e,s);case"sync":return SH(n,e,s);case"export":return kH(n,e,s);default:return y(e,"usage: lmctl workflow <load|author|list|sync|export|run>")}})}catch(s){return s instanceof it?y(e,s.message):_e(e,s)}}async function _H(t,e){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(`${il}
2416
- `),0;let r=P(t,["--workflow","--project","--inputs","--job"],["--json","--verbose","--yes","--no-prompt"]);if(r.error!==void 0)return Sr(e,r.error);if(r.positionals.length>1)return Sr(e,il);let n=D(r,"--json"),s=A(r,"--workflow"),o=A(r,"--project"),i=A(r,"--job"),a=A(r,"--inputs"),l=D(r,"--verbose"),c=r.positionals[0],u=D(r,"--yes")||D(r,"--no-prompt");if(c!==void 0){if(s!==void 0||i!==void 0)return Sr(e,"remote workflow URL cannot be combined with --workflow or --job");if(!Tl(c))return Sr(e,il);if(fr(c))return uk(c,{io:e,json:n,projectName:o,inputsValue:a,verbose:l,yes:u});let m=zn(c,"remote workflow URLs");return m!==null?y(e,m):uk(c,{io:e,json:n,projectName:o,inputsValue:a,verbose:l,yes:u})}if(s!==void 0&&i!==void 0)return Sr(e,"--workflow and --job are mutually exclusive");if(s===void 0&&i===void 0)return Sr(e,il);if(i!==void 0&&(o!==void 0||a!==void 0))return Sr(e,"--job cannot be combined with --project or --inputs");if(i!==void 0){let m=gH(i);if(m===null)return Sr(e,`invalid --job: ${i}`);let p=ik({cwd:process.cwd(),io:e});try{let _=await Ms({dal:p.dal,job_id:m,worker_id:Cf()});return Mf(e,_,{json:n,workflowName:null,projectName:null,workspaceName:p.workspaceName,dbPath:p.dbPath,verbose:l})}finally{p.ownsDal&&p.dal.close()}}let d=hk(a,e);if(d===cl)return 2;let f=Of({cwd:process.cwd(),io:e,projectName:o});try{let m=f.dal.getWorkflowByName(s);if(m===null)return y(e,`workflow not found: ${s}`);let p=f.dal.enqueueJob({project_id:f.project.id,workflow_id_override:m.id,source:"cli-workflow-run",payload:JSON.stringify(d),priority:0}),_=await Ms({dal:f.dal,job_id:p.id,worker_id:Cf()});return Mf(e,_,{json:n,workflowName:s,projectName:f.project.name,workspaceName:f.workspaceName,dbPath:f.dbPath,verbose:l})}finally{f.ownsDal&&f.dal.close()}}async function uk(t,e){let{io:r,json:n,projectName:s,inputsValue:o,verbose:i,yes:a}=e,l=hk(o,r);if(l===cl)return 2;let c,u;try{c=await al(t),u=mk(c)}catch(m){return y(r,m instanceof Error?m.message:String(m))}let d=pk(u);if(d!==null)return y(r,d);if(c.remote&&!await yH(r,c,u,a))return 1;let f=Of({cwd:process.cwd(),io:r,projectName:s});try{let m=f.dal.upsertWorkflow({name:u.name,definition_schema_version:u.definition_schema_version,definition:c.definition,source_uri:c.source_uri,source_sha256:c.source_sha256}),p=f.dal.enqueueJob({project_id:f.project.id,workflow_id_override:m.id,source:"cli-workflow-run",payload:JSON.stringify(l),priority:0}),_=await Ms({dal:f.dal,job_id:p.id,worker_id:Cf()});return Mf(r,_,{json:n,workflowName:m.name,projectName:f.project.name,workspaceName:f.workspaceName,dbPath:f.dbPath,verbose:i})}finally{f.ownsDal&&f.dal.close()}}function Sr(t,e){return t.stderr.write(`error: ${e}
2413
+ `)}function tH(t){let e=[],r=Rf(t);for(;;){e.push(r);let n=ok(r);if(n===r)return e;r=n}}function ck(t){let e=null;try{e=new yo(t.db_path,{readonly:!0,fileMustExist:!0});let r=Number(e.pragma("user_version",{simple:!0})??0);if(!Number.isInteger(r)||r<=0||r>$l)return[];let n=e.prepare("PRAGMA table_info(project)").all(),s=new Set(n.map(o=>o.name));return!s.has("id")||!s.has("name")||!s.has("local_path")?[]:e.prepare("SELECT id, name, local_path FROM project").all()}catch{return[]}finally{e?.close()}}var at,Lf=E(()=>{"use strict";Al();jl();We();Ve();at=class extends Error{constructor(e){super(e),this.name="CliContextError"}}});var Uf={};re(Uf,{assertNoCrossWorkflowSubflowCycle:()=>_k,firstUnregisteredArchetype:()=>Ff,runWorkflow:()=>hH});import{createHash as Df,randomUUID as rH}from"node:crypto";import{existsSync as nH,readFileSync as ll,readdirSync as sH,writeFileSync as oH}from"node:fs";import{basename as iH,join as aH,resolve as lH}from"node:path";import{pathToFileURL as cH}from"node:url";function Pf(t,e){return{source_uri:cH(lH(t)).href,source_sha256:Df("sha256").update(e).digest("hex")}}function fk(t){return Df("sha256").update(t).digest("hex")}async function mH(t){let e=await go(t,{description:"remote workflow URL"});return{definition:e.toString("utf8"),source_uri:t,source_sha256:fk(e),remote:!0}}async function al(t){if(fr(t)){let n=await Es(t),s=ll(n,"utf8");return{definition:s,source_uri:t,source_sha256:fk(s),remote:!1}}let e=zn(t,"remote workflow URLs");if(e!==null)throw new Error(e);if(Yn(t))return mH(t);let r=ll(t,"utf8");return{definition:r,...Pf(t,r),remote:!1}}function mk(t){return Me(t.definition)}function pk(t){if(t.definition_schema_version!==3)return null;let e=Ff(t);return e!==null?`unknown archetype \`${e.type}\` (step \`${e.id}\`) \u2014 not in the live archetype registry`:null}function pH(t){let e=new Set;if(t.definition_schema_version===3)for(let r of t.steps)e.add(r.type);else for(let r of Object.values(t.states))e.add(r.type);return Array.from(e).sort()}async function hH(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(fH),0;try{return r==="run"?await _H(n,e):await O(e,s=>{switch(r){case"load":return EH(n,e,s);case"author":return TH(n,e,s);case"list":return bH(n,e,s);case"sync":return SH(n,e,s);case"export":return kH(n,e,s);default:return y(e,"usage: lmctl workflow <load|author|list|sync|export|run>")}})}catch(s){return s instanceof at?y(e,s.message):_e(e,s)}}async function _H(t,e){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(`${il}
2414
+ `),0;let r=P(t,["--workflow","--project","--inputs","--job"],["--json","--verbose","--yes","--no-prompt"]);if(r.error!==void 0)return Sr(e,r.error);if(r.positionals.length>1)return Sr(e,il);let n=D(r,"--json"),s=A(r,"--workflow"),o=A(r,"--project"),i=A(r,"--job"),a=A(r,"--inputs"),l=D(r,"--verbose"),c=r.positionals[0],u=D(r,"--yes")||D(r,"--no-prompt");if(c!==void 0){if(s!==void 0||i!==void 0)return Sr(e,"remote workflow URL cannot be combined with --workflow or --job");if(!Tl(c))return Sr(e,il);if(fr(c))return uk(c,{io:e,json:n,projectName:o,inputsValue:a,verbose:l,yes:u});let m=zn(c,"remote workflow URLs");return m!==null?y(e,m):uk(c,{io:e,json:n,projectName:o,inputsValue:a,verbose:l,yes:u})}if(s!==void 0&&i!==void 0)return Sr(e,"--workflow and --job are mutually exclusive");if(s===void 0&&i===void 0)return Sr(e,il);if(i!==void 0&&(o!==void 0||a!==void 0))return Sr(e,"--job cannot be combined with --project or --inputs");if(i!==void 0){let m=gH(i);if(m===null)return Sr(e,`invalid --job: ${i}`);let p=ik({cwd:process.cwd(),io:e});try{let h=await Ms({dal:p.dal,job_id:m,worker_id:Cf()});return Mf(e,h,{json:n,workflowName:null,projectName:null,workspaceName:p.workspaceName,dbPath:p.dbPath,verbose:l})}finally{p.ownsDal&&p.dal.close()}}let d=hk(a,e);if(d===cl)return 2;let f=Of({cwd:process.cwd(),io:e,projectName:o});try{let m=f.dal.getWorkflowByName(s);if(m===null)return y(e,`workflow not found: ${s}`);let p=f.dal.enqueueJob({project_id:f.project.id,workflow_id_override:m.id,source:"cli-workflow-run",payload:JSON.stringify(d),priority:0}),h=await Ms({dal:f.dal,job_id:p.id,worker_id:Cf()});return Mf(e,h,{json:n,workflowName:s,projectName:f.project.name,workspaceName:f.workspaceName,dbPath:f.dbPath,verbose:l})}finally{f.ownsDal&&f.dal.close()}}async function uk(t,e){let{io:r,json:n,projectName:s,inputsValue:o,verbose:i,yes:a}=e,l=hk(o,r);if(l===cl)return 2;let c,u;try{c=await al(t),u=mk(c)}catch(m){return y(r,m instanceof Error?m.message:String(m))}let d=pk(u);if(d!==null)return y(r,d);if(c.remote&&!await yH(r,c,u,a))return 1;let f=Of({cwd:process.cwd(),io:r,projectName:s});try{let m=f.dal.upsertWorkflow({name:u.name,definition_schema_version:u.definition_schema_version,definition:c.definition,source_uri:c.source_uri,source_sha256:c.source_sha256}),p=f.dal.enqueueJob({project_id:f.project.id,workflow_id_override:m.id,source:"cli-workflow-run",payload:JSON.stringify(l),priority:0}),h=await Ms({dal:f.dal,job_id:p.id,worker_id:Cf()});return Mf(r,h,{json:n,workflowName:m.name,projectName:f.project.name,workspaceName:f.workspaceName,dbPath:f.dbPath,verbose:i})}finally{f.ownsDal&&f.dal.close()}}function Sr(t,e){return t.stderr.write(`error: ${e}
2417
2415
  `),2}function hk(t,e){if(t===void 0)return{};let r;try{r=JSON.parse(t)}catch(n){return e.stderr.write(`error: invalid --inputs JSON: ${n instanceof Error?n.message:String(n)}
2418
2416
  `),cl}return r===null||typeof r!="object"||Array.isArray(r)?(e.stderr.write(`error: --inputs must be a JSON object
2419
2417
  `),cl):r}function gH(t){if(!/^[1-9][0-9]*$/.test(t))return null;let e=Number(t);return Number.isSafeInteger(e)?e:null}function Cf(){return`cli-${process.pid}-${rH().slice(0,8)}`}function Mf(t,e,r){if(!e.claimed){let s={ok:!1,job_id:e.job_id,status:"not_claimed",reason:e.reason,job_status:e.status,locked_by:e.locked_by,locked_until:e.locked_until,...r.verbose?{db_path:r.dbPath,workspace:r.workspaceName}:{}};return r.json?W(t,s):t.stderr.write(`error: job ${e.job_id} not claimable: ${e.reason}${e.locked_by?` (locked_by=${e.locked_by})`:""}
@@ -2427,10 +2425,10 @@ ${sk(n)}`)}function sk(t){return t.map(e=>` workspace ${e.candidate.workspace_n
2427
2425
  `),a}function wH(t){return new Promise(e=>{t.setEncoding?.("utf8"),t.resume?.(),t.once("data",r=>{t.pause?.(),e(typeof r=="string"?r:r.toString("utf8"))})})}async function EH(t,e,r){let[n,s]=t;if(n===void 0||s===void 0)return y(e,"usage: workflow load <name> <path-to-json | lmctl://workflow/<name> | https://...>");let o;if(fr(s))try{o=await al(s)}catch(c){return y(e,c instanceof Error?c.message:String(c))}else if(Yn(s))try{o=await al(s)}catch(c){return y(e,c instanceof Error?c.message:String(c))}else{let c=zn(s,"remote workflow URLs");if(c!==null)return y(e,c);o=await al(s)}let i;try{i=mk(o)}catch(c){if(o.remote)return y(e,c instanceof Error?c.message:String(c));throw c}let a=o.remote?pk(i):null;if(a!==null)return y(e,a);let l=r.upsertWorkflow({name:n,definition_schema_version:i.definition_schema_version,definition:o.definition,source_uri:o.source_uri,source_sha256:o.source_sha256});return e.stdout.write(`loaded workflow ${l.name}@${l.version}
2428
2426
  `),o.remote&&e.stdout.write(`source: ${o.source_uri}
2429
2427
  sha256: ${o.source_sha256}
2430
- `),0}function Ff(t){let e=ra();for(let r of t.steps)if(e.get(r.type)===void 0)return{id:r.id,type:r.type};return null}function dk(t){if(t===null||typeof t!="object")return[];let e=t,r=[],n=e.steps;if(Array.isArray(n))for(let o of n){if(o===null||typeof o!="object")continue;let i=o;if(i.type!=="lmctl/subflow"&&i.type!=="Subflow")continue;let a=i.parameters&&typeof i.parameters=="object"?i.parameters:{};typeof a.workflow_name=="string"&&a.workflow_name.length>0&&r.push(a.workflow_name)}let s=e.states;if(s!==null&&typeof s=="object")for(let o of Object.values(s)){if(o===null||typeof o!="object")continue;let i=o;i.type==="Subflow"&&typeof i.workflow_name=="string"&&i.workflow_name.length>0&&r.push(i.workflow_name)}return r}function _k(t,e,r){let n=[],s=new Set,o=(i,a)=>{let l=n.indexOf(i);if(l>=0)throw new Error(`cross-workflow subflow cycle: ${[...n.slice(l),i].join(" -> ")}`);if(!s.has(i)){n.push(i);try{for(let c of a){let u=c===t?e:r(c);u!==null&&o(c,u)}}finally{n.pop()}s.add(i)}};o(t,e)}function TH(t,e,r){let n=process.env.LMCTL_DSL;if(n!==void 0&&["0","false","off"].includes(n.trim().toLowerCase()))return y(e,"workflow author is disabled by the LMCTL_DSL kill-switch (unset it to use the GA DSL path; durable-memory/composition-language-design.md \xA710)");let[s,o]=t;if(s===void 0)return y(e,"usage: lmctl workflow author <file.dsl> [name]");let i=ll(s,"utf8"),a;try{a=Ce(i)}catch(m){return y(e,`compile failed: ${m instanceof Error?m.message:String(m)}`)}if(a.definition_schema_version!==3)return _e(e,new Error("composition DSL must compile to a v3 graph workflow"));let l=a,c=Ff(l);if(c!==null)return y(e,`unknown archetype \`${c.type}\` (step \`${c.id}\`) \u2014 not in the live archetype registry`);let u=o??l.name,d=JSON.stringify(l);try{_k(u,dk(l),m=>{let p=r.getWorkflowByName(m);if(p===null)return null;try{return dk(JSON.parse(p.definition))}catch{return null}})}catch(m){return y(e,`${m instanceof Error?m.message:String(m)}`)}let f;try{f=r.upsertWorkflow({name:u,definition_schema_version:3,definition:d,...Pf(s,i)})}catch(m){return y(e,`${m instanceof Error?m.message:String(m)}`)}return r.insertCompositionUnit({name:u,version:f.version,lang:"lmctl/dsl@1",source:i,source_sha:Df("sha256").update(i).digest("hex"),compiled_workflow_version_id:f.active_version_id}),e.stdout.write(`authored workflow ${f.name}@${f.version} (composition_unit lang=lmctl/dsl@1)
2428
+ `),0}function Ff(t){let e=ra();for(let r of t.steps)if(e.get(r.type)===void 0)return{id:r.id,type:r.type};return null}function dk(t){if(t===null||typeof t!="object")return[];let e=t,r=[],n=e.steps;if(Array.isArray(n))for(let o of n){if(o===null||typeof o!="object")continue;let i=o;if(i.type!=="lmctl/subflow"&&i.type!=="Subflow")continue;let a=i.parameters&&typeof i.parameters=="object"?i.parameters:{};typeof a.workflow_name=="string"&&a.workflow_name.length>0&&r.push(a.workflow_name)}let s=e.states;if(s!==null&&typeof s=="object")for(let o of Object.values(s)){if(o===null||typeof o!="object")continue;let i=o;i.type==="Subflow"&&typeof i.workflow_name=="string"&&i.workflow_name.length>0&&r.push(i.workflow_name)}return r}function _k(t,e,r){let n=[],s=new Set,o=(i,a)=>{let l=n.indexOf(i);if(l>=0)throw new Error(`cross-workflow subflow cycle: ${[...n.slice(l),i].join(" -> ")}`);if(!s.has(i)){n.push(i);try{for(let c of a){let u=c===t?e:r(c);u!==null&&o(c,u)}}finally{n.pop()}s.add(i)}};o(t,e)}function TH(t,e,r){let n=process.env.LMCTL_DSL;if(n!==void 0&&["0","false","off"].includes(n.trim().toLowerCase()))return y(e,"workflow author is disabled by the LMCTL_DSL kill-switch (unset it to use the GA DSL path; durable-memory/composition-language-design.md \xA710)");let[s,o]=t;if(s===void 0)return y(e,"usage: lmctl workflow author <file.dsl> [name]");let i=ll(s,"utf8"),a;try{a=Me(i)}catch(m){return y(e,`compile failed: ${m instanceof Error?m.message:String(m)}`)}if(a.definition_schema_version!==3)return _e(e,new Error("composition DSL must compile to a v3 graph workflow"));let l=a,c=Ff(l);if(c!==null)return y(e,`unknown archetype \`${c.type}\` (step \`${c.id}\`) \u2014 not in the live archetype registry`);let u=o??l.name,d=JSON.stringify(l);try{_k(u,dk(l),m=>{let p=r.getWorkflowByName(m);if(p===null)return null;try{return dk(JSON.parse(p.definition))}catch{return null}})}catch(m){return y(e,`${m instanceof Error?m.message:String(m)}`)}let f;try{f=r.upsertWorkflow({name:u,definition_schema_version:3,definition:d,...Pf(s,i)})}catch(m){return y(e,`${m instanceof Error?m.message:String(m)}`)}return r.insertCompositionUnit({name:u,version:f.version,lang:"lmctl/dsl@1",source:i,source_sha:Df("sha256").update(i).digest("hex"),compiled_workflow_version_id:f.active_version_id}),e.stdout.write(`authored workflow ${f.name}@${f.version} (composition_unit lang=lmctl/dsl@1)
2431
2429
  `),0}function bH(t,e,r){let n=P(t,[]);if(n.error!==void 0)return y(e,n.error);let s=r.listWorkflows();return D(n,"--json")?W(e,s):e.stdout.write(`${s.map(o=>`${o.name}@${o.version}`).join(`
2432
2430
  `)}${s.length>0?`
2433
- `:""}`),0}function SH(t,e,r){let n=P(t,[]);if(n.error!==void 0)return y(e,n.error);wi({swallow:!0});let s=Zh(),o=[];try{o=nH(s)?sH(s).filter(c=>uH.some(u=>c.endsWith(u))):[]}catch{o=[]}let i=0,a=0,l=0;for(let c of[...o].sort()){let u=aH(s,c),d=ll(u,"utf8"),f;try{f=Ce(d)}catch(N){return y(e,`compile failed for ${c}: ${N instanceof Error?N.message:String(N)}`)}let m=f.name,p=typeof m=="string"&&m.length>0?m:iH(c).replace(/\.(compound\.json|lmctl)$/i,""),_=c.endsWith(".lmctl"),g=_?JSON.stringify(f):d,h=_?3:f.definition_schema_version,b=Pf(u,d),w=r.getWorkflowByName(p);if(w!==null&&w.source_sha256===b.source_sha256){l+=1;continue}let k=w===null;r.upsertWorkflow({name:p,definition_schema_version:h,definition:g,...b}),k?i+=1:a+=1}return D(n,"--json")?W(e,{total:o.length,created:i,updated:a,unchanged:l}):e.stdout.write(`synced ${o.length} template(s): ${i} created, ${a} updated, ${l} unchanged
2431
+ `:""}`),0}function SH(t,e,r){let n=P(t,[]);if(n.error!==void 0)return y(e,n.error);wi({swallow:!0});let s=Zh(),o=[];try{o=nH(s)?sH(s).filter(c=>uH.some(u=>c.endsWith(u))):[]}catch{o=[]}let i=0,a=0,l=0;for(let c of[...o].sort()){let u=aH(s,c),d=ll(u,"utf8"),f;try{f=Me(d)}catch(N){return y(e,`compile failed for ${c}: ${N instanceof Error?N.message:String(N)}`)}let m=f.name,p=typeof m=="string"&&m.length>0?m:iH(c).replace(/\.(compound\.json|lmctl)$/i,""),h=c.endsWith(".lmctl"),g=h?JSON.stringify(f):d,_=h?3:f.definition_schema_version,b=Pf(u,d),w=r.getWorkflowByName(p);if(w!==null&&w.source_sha256===b.source_sha256){l+=1;continue}let k=w===null;r.upsertWorkflow({name:p,definition_schema_version:_,definition:g,...b}),k?i+=1:a+=1}return D(n,"--json")?W(e,{total:o.length,created:i,updated:a,unchanged:l}):e.stdout.write(`synced ${o.length} template(s): ${i} created, ${a} updated, ${l} unchanged
2434
2432
  `),0}function kH(t,e,r){let n=P(t,["--out"]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0)return y(e,"usage: lmctl workflow export <name> [--out <file>] [--json]");let o=r.getWorkflowByName(s);if(o===null)return y(e,`workflow not found: ${s}`);let i;try{i=JSON.parse(o.definition)}catch{i=o.definition}let a={_lmctl_export:dH,inspection:{name:o.name,version:o.version,definition_schema_version:o.definition_schema_version,source_uri:o.source_uri,source_sha256:o.source_sha256,definition:i}},l=`${JSON.stringify(a,null,2)}
2435
2433
  `,c=A(n,"--out");return c!==void 0?(oH(c,l),e.stdout.write(`exported ${o.name}@${o.version} \u2192 ${c} (inspection-only; NOT re-importable)
2436
2434
  `)):e.stdout.write(l),0}var uH,dH,fH,il,cl,Wf=E(()=>{"use strict";Xu();Sn();Ti();Zc();fe();Lf();bl();Ds();uH=[".compound.json",".lmctl"],dH="INSPECTION ONLY \u2014 NOT a re-importable workflow source. Edit the basedir template then `lmctl workflow sync`; do NOT `workflow load` this file.",fH=`usage: lmctl workflow <load|author|list|sync|export|run>
@@ -2439,27 +2437,27 @@ Load, author, list, synchronize, inspect, or run workflow definitions. The
2439
2437
  load subcommand accepts local JSON, lmctl:// workflow URIs, and https:// JSON
2440
2438
  URLs. The run subcommand executes a loaded workflow/job, or one-shot runs a
2441
2439
  remote https:// workflow after a trust prompt.
2442
- `,il="usage: workflow run (<https-url | lmctl://workflow/<name>> [--project <name>] [--inputs <json-object>] [--yes|--no-prompt] [--verbose] | --workflow <name> [--project <name>] [--inputs <json-object>] [--verbose] | --job <id>) [--json]";cl=Symbol("inputs-error")});function Bf(t,e){let r=vH[t],n=e("which",[t]);return n.status===0&&(n.stdout??"").toString().trim()!==""?e(t,["--version"]).status===0?{provider:t,status:"ok",detail:"installed, --version OK"}:{provider:t,status:"unverified",detail:"installed, session unverified (auth may be required)"}:r.optional?{provider:t,status:"skipped",detail:"not installed"}:{provider:t,status:"missing",detail:`not installed (install: ${r.install_hint})`,remediation:r.install_remediation}}var vH,gk=E(()=>{"use strict";vH={claude:{install_hint:"https://docs.claude.com/en/docs/claude-code",optional:!1,install_remediation:"see https://docs.claude.com/en/docs/claude-code"},codex:{install_hint:"https://github.com/openai/codex",optional:!1,install_remediation:"see https://github.com/openai/codex"},gemini:{install_hint:"https://github.com/google/generative-ai-cli",optional:!1,install_remediation:"npm i -g @google/gemini-cli"},opencode:{install_hint:"https://opencode.ai",optional:!0,install_remediation:"see https://opencode.ai"},lmplayer:{install_hint:"Install lmplayer and ensure the lmplayer binary is on PATH.",optional:!0,install_remediation:"install lmplayer and ensure the lmplayer binary is on PATH"},qwen:{install_hint:"https://github.com/QwenLM/qwen-code",optional:!0,install_remediation:"npm i -g @qwen-code/qwen-code"},copilot:{install_hint:"https://docs.github.com/copilot/cli",optional:!0,install_remediation:"see https://docs.github.com/copilot/cli"},agy:{install_hint:"https://antigravity.google",optional:!0,install_remediation:"see https://antigravity.google"}}});var kk={};re(kk,{initWorkspace:()=>bk,runWorkspace:()=>jH,setWorkspaceProvider:()=>Sk});import{copyFileSync as IH,cpSync as NH,existsSync as Pe,mkdirSync as kr,readdirSync as qf,renameSync as xH,rmSync as ul,statSync as dl,writeFileSync as AH}from"node:fs";import{spawnSync as $H}from"node:child_process";import{homedir as yk}from"node:os";import{dirname as Jf,join as co}from"node:path";async function jH(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(RH),0;switch(r){case"list":return OH(n,e);case"create":return LH(n,e);case"use":return CH(n,e);case"show":return MH(n,e);case"delete":return DH(n,e);case"migrate":return PH(n,e);case"init":return bk(n,e);case"set-provider":return Sk(n,e);default:return y(e,"usage: lmctl workspace <list|create|use|show|delete|migrate|init|set-provider>")}}function Ek(){let t=fo(),e=[],r=new Set,n=Nr.default,s=Pe(Jn()),o=Pe(Ft(n));if((s||o||t===null||t===n)&&(e.push({name:n,db_path:o?rr(n):Jn(),active:t===null||t===n,legacy:!o&&s}),r.add(n)),Pe(Ir())){let i;try{i=qf(Ir())}catch{i=[]}for(let a of i.sort()){if(r.has(a)||!Xe(a))continue;let l=!1;try{l=dl(Ft(a)).isDirectory()}catch{l=!1}l&&(e.push({name:a,db_path:rr(a),active:t===a,legacy:!1}),r.add(a))}}return e}function OH(t,e){let r=P(t,[]);if(r.error!==void 0)return y(e,r.error);if(r.positionals.length!==0)return y(e,"usage: lmctl workspace list");let n=Ek();if(D(r,"--json"))return W(e,n),0;for(let s of n){let o=s.active?"*":" ",i=s.legacy?" (legacy)":"";e.stdout.write(`${o} ${s.name} ${s.db_path}${i}
2443
- `)}return 0}function LH(t,e){let r=P(t,["--docroot"]);if(r.error!==void 0)return y(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return y(e,"usage: lmctl workspace create <name> [--docroot PATH]");if(!Xe(n))return y(e,`invalid workspace name: ${n} (allowed: letters, digits, '.', '-', '_'; must start with alnum; \u226464 chars)`);let s=Ft(n);if(Pe(s))return y(e,`workspace already exists: ${n} (${s})`);let o=A(r,"--docroot")??pl(n);kr(s,{recursive:!0}),kr(o,{recursive:!0});let i=rr(n);kr(Jf(i),{recursive:!0});let a=ge({path:i});try{a.setConfig("project.docroot",o)}finally{a.close()}let l={name:n,dir:s,db_path:i,docroot:o};return D(r,"--json")?W(e,l):e.stdout.write(`created workspace ${n} at ${s}
2444
- `),0}function CH(t,e){let r=P(t,[]);if(r.error!==void 0)return y(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return y(e,"usage: lmctl workspace use <name>");if(!Xe(n))return y(e,`invalid workspace name: ${n}`);if(n!==Nr.default&&!Pe(Ft(n)))return y(e,`workspace not found: ${n} (run \`lmctl workspace create ${n}\` first)`);let s=uo();return kr(Jf(s),{recursive:!0}),AH(s,`${n}
2440
+ `,il="usage: workflow run (<https-url | lmctl://workflow/<name>> [--project <name>] [--inputs <json-object>] [--yes|--no-prompt] [--verbose] | --workflow <name> [--project <name>] [--inputs <json-object>] [--verbose] | --job <id>) [--json]";cl=Symbol("inputs-error")});function Bf(t,e){let r=vH[t],n=e("which",[t]);return n.status===0&&(n.stdout??"").toString().trim()!==""?e(t,["--version"]).status===0?{provider:t,status:"ok",detail:"installed, --version OK"}:{provider:t,status:"unverified",detail:"installed, session unverified (auth may be required)"}:r.optional?{provider:t,status:"skipped",detail:"not installed"}:{provider:t,status:"missing",detail:`not installed (install: ${r.install_hint})`,remediation:r.install_remediation}}var vH,gk=E(()=>{"use strict";vH={claude:{install_hint:"https://docs.claude.com/en/docs/claude-code",optional:!1,install_remediation:"see https://docs.claude.com/en/docs/claude-code"},codex:{install_hint:"https://github.com/openai/codex",optional:!1,install_remediation:"see https://github.com/openai/codex"},gemini:{install_hint:"https://github.com/google/generative-ai-cli",optional:!1,install_remediation:"npm i -g @google/gemini-cli"},opencode:{install_hint:"https://opencode.ai",optional:!0,install_remediation:"see https://opencode.ai"},lmplayer:{install_hint:"Install lmplayer and ensure the lmplayer binary is on PATH.",optional:!0,install_remediation:"install lmplayer and ensure the lmplayer binary is on PATH"},qwen:{install_hint:"https://github.com/QwenLM/qwen-code",optional:!0,install_remediation:"npm i -g @qwen-code/qwen-code"},copilot:{install_hint:"https://docs.github.com/copilot/cli",optional:!0,install_remediation:"see https://docs.github.com/copilot/cli"},agy:{install_hint:"https://antigravity.google",optional:!0,install_remediation:"see https://antigravity.google"}}});var kk={};re(kk,{initWorkspace:()=>bk,runWorkspace:()=>jH,setWorkspaceProvider:()=>Sk});import{copyFileSync as IH,cpSync as NH,existsSync as Fe,mkdirSync as kr,readdirSync as qf,renameSync as xH,rmSync as ul,statSync as dl,writeFileSync as AH}from"node:fs";import{spawnSync as $H}from"node:child_process";import{homedir as yk}from"node:os";import{dirname as Jf,join as co}from"node:path";async function jH(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(RH),0;switch(r){case"list":return OH(n,e);case"create":return LH(n,e);case"use":return CH(n,e);case"show":return MH(n,e);case"delete":return DH(n,e);case"migrate":return PH(n,e);case"init":return bk(n,e);case"set-provider":return Sk(n,e);default:return y(e,"usage: lmctl workspace <list|create|use|show|delete|migrate|init|set-provider>")}}function Ek(){let t=fo(),e=[],r=new Set,n=Nr.default,s=Fe(Jn()),o=Fe(Ft(n));if((s||o||t===null||t===n)&&(e.push({name:n,db_path:o?rr(n):Jn(),active:t===null||t===n,legacy:!o&&s}),r.add(n)),Fe(Ir())){let i;try{i=qf(Ir())}catch{i=[]}for(let a of i.sort()){if(r.has(a)||!Ge(a))continue;let l=!1;try{l=dl(Ft(a)).isDirectory()}catch{l=!1}l&&(e.push({name:a,db_path:rr(a),active:t===a,legacy:!1}),r.add(a))}}return e}function OH(t,e){let r=P(t,[]);if(r.error!==void 0)return y(e,r.error);if(r.positionals.length!==0)return y(e,"usage: lmctl workspace list");let n=Ek();if(D(r,"--json"))return W(e,n),0;for(let s of n){let o=s.active?"*":" ",i=s.legacy?" (legacy)":"";e.stdout.write(`${o} ${s.name} ${s.db_path}${i}
2441
+ `)}return 0}function LH(t,e){let r=P(t,["--docroot"]);if(r.error!==void 0)return y(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return y(e,"usage: lmctl workspace create <name> [--docroot PATH]");if(!Ge(n))return y(e,`invalid workspace name: ${n} (allowed: letters, digits, '.', '-', '_'; must start with alnum; \u226464 chars)`);let s=Ft(n);if(Fe(s))return y(e,`workspace already exists: ${n} (${s})`);let o=A(r,"--docroot")??pl(n);kr(s,{recursive:!0}),kr(o,{recursive:!0});let i=rr(n);kr(Jf(i),{recursive:!0});let a=ge({path:i});try{a.setConfig("project.docroot",o)}finally{a.close()}let l={name:n,dir:s,db_path:i,docroot:o};return D(r,"--json")?W(e,l):e.stdout.write(`created workspace ${n} at ${s}
2442
+ `),0}function CH(t,e){let r=P(t,[]);if(r.error!==void 0)return y(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return y(e,"usage: lmctl workspace use <name>");if(!Ge(n))return y(e,`invalid workspace name: ${n}`);if(n!==Nr.default&&!Fe(Ft(n)))return y(e,`workspace not found: ${n} (run \`lmctl workspace create ${n}\` first)`);let s=uo();return kr(Jf(s),{recursive:!0}),AH(s,`${n}
2445
2443
  `),D(r,"--json")?W(e,{active:n,path:s}):e.stdout.write(`active workspace set to ${n}
2446
- `),0}function MH(t,e){let r=P(t,[]);if(r.error!==void 0)return y(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return y(e,"usage: lmctl workspace show <name>");if(!Xe(n))return y(e,`invalid workspace name: ${n}`);let s=Ek().find(u=>u.name===n);if(s===void 0)return y(e,`workspace not found: ${n}`);let o=0;try{o=Pe(s.db_path)?dl(s.db_path).size:0}catch{o=0}let i=0,a=null,l={};if(Pe(s.db_path)){let u=ge({path:s.db_path});try{i=u.listProjects().length,l=u.getConfigAll(),a=l["project.docroot"]??null}finally{u.close()}}let c={name:s.name,active:s.active,legacy:s.legacy,db_path:s.db_path,db_size_bytes:o,docroot:a,project_count:i,config_keys:Object.keys(l).sort()};return D(r,"--json")?W(e,c):e.stdout.write(`${JSON.stringify(c,null,2)}
2447
- `),0}function DH(t,e){let r=P(t,[],["--json","--confirm","--force"]);if(r.error!==void 0)return y(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return y(e,"usage: lmctl workspace delete <name> --confirm [--force]");if(!Xe(n))return y(e,`invalid workspace name: ${n}`);if(!D(r,"--confirm"))return y(e,`refusing to delete workspace ${n} without --confirm`);if(n===Nr.default&&!D(r,"--force"))return y(e,"refusing to delete the default workspace without --force");if(fo()===n&&!D(r,"--force"))return y(e,`refusing to delete the active workspace (${n}) without --force`);let o=Ft(n);return Pe(o)?(ul(o,{recursive:!0,force:!0}),D(r,"--json")?W(e,{deleted:n,dir:o}):e.stdout.write(`deleted workspace ${n}
2444
+ `),0}function MH(t,e){let r=P(t,[]);if(r.error!==void 0)return y(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return y(e,"usage: lmctl workspace show <name>");if(!Ge(n))return y(e,`invalid workspace name: ${n}`);let s=Ek().find(u=>u.name===n);if(s===void 0)return y(e,`workspace not found: ${n}`);let o=0;try{o=Fe(s.db_path)?dl(s.db_path).size:0}catch{o=0}let i=0,a=null,l={};if(Fe(s.db_path)){let u=ge({path:s.db_path});try{i=u.listProjects().length,l=u.getConfigAll(),a=l["project.docroot"]??null}finally{u.close()}}let c={name:s.name,active:s.active,legacy:s.legacy,db_path:s.db_path,db_size_bytes:o,docroot:a,project_count:i,config_keys:Object.keys(l).sort()};return D(r,"--json")?W(e,c):e.stdout.write(`${JSON.stringify(c,null,2)}
2445
+ `),0}function DH(t,e){let r=P(t,[],["--json","--confirm","--force"]);if(r.error!==void 0)return y(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return y(e,"usage: lmctl workspace delete <name> --confirm [--force]");if(!Ge(n))return y(e,`invalid workspace name: ${n}`);if(!D(r,"--confirm"))return y(e,`refusing to delete workspace ${n} without --confirm`);if(n===Nr.default&&!D(r,"--force"))return y(e,"refusing to delete the default workspace without --force");if(fo()===n&&!D(r,"--force"))return y(e,`refusing to delete the active workspace (${n}) without --force`);let o=Ft(n);return Fe(o)?(ul(o,{recursive:!0,force:!0}),D(r,"--json")?W(e,{deleted:n,dir:o}):e.stdout.write(`deleted workspace ${n}
2448
2446
  `),0):y(e,`workspace not found: ${n}`)}function Hf(t,e,r){try{xH(t,e);return}catch(s){if(s.code!=="EXDEV")throw s}if(r.stderr.write(`note: cross-device move; copying ${t} -> ${e} then removing source
2449
- `),dl(t).isDirectory()?NH(t,e,{recursive:!0}):IH(t,e),!Pe(e))throw new Error(`migration copy verification failed: ${e} not present after copy`);ul(t,{recursive:!0,force:!0})}function PH(t,e){let r=P(t,[],["--json"]);if(r.error!==void 0)return y(e,r.error);let n=D(r,"--json"),s=hl(),o=Ir(),i=[],a=(f,m)=>{if(n)W(e,{migrated:f,reason:m??null,actions:i});else{for(let p of i)e.stdout.write(`${p}
2447
+ `),dl(t).isDirectory()?NH(t,e,{recursive:!0}):IH(t,e),!Fe(e))throw new Error(`migration copy verification failed: ${e} not present after copy`);ul(t,{recursive:!0,force:!0})}function PH(t,e){let r=P(t,[],["--json"]);if(r.error!==void 0)return y(e,r.error);let n=D(r,"--json"),s=hl(),o=Ir(),i=[],a=(f,m)=>{if(n)W(e,{migrated:f,reason:m??null,actions:i});else{for(let p of i)e.stdout.write(`${p}
2450
2448
  `);e.stdout.write(f?`migration complete
2451
2449
  `:`${m??"nothing to migrate"}
2452
- `)}return 0};if(!Pe(s))return a(!1,"no legacy ~/.lmctl/profiles/ found; nothing to migrate");let l;try{l=qf(s).sort()}catch{l=[]}let c=l.filter(f=>{try{return dl(co(s,f)).isDirectory()}catch{return!1}});if(c.length===0)ul(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`);else if(!Pe(o))Hf(s,o,e),i.push(`renamed ${s} -> ${o}`);else{let f=c.filter(m=>Pe(co(o,m)));if(f.length>0)return y(e,`refusing to migrate: ~/.lmctl/workspaces/ already has: ${f.join(", ")} (no files were moved; resolve the name collision, then re-run \`lmctl workspace migrate\`)`);kr(o,{recursive:!0});for(let m of c)Hf(co(s,m),co(o,m),e),i.push(`moved ${m} -> workspaces/${m}`);try{qf(s).length===0&&(ul(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`))}catch{}}let u=im(),d=uo();return Pe(u)&&(Pe(d)?i.push("left active-profile in place (active-workspace already exists; not clobbering)"):(Hf(u,d,e),i.push("renamed active-profile -> active-workspace"))),a(!0)}function Tk(t,e){return $H(t,e,{encoding:"utf8",timeout:5e3,maxBuffer:1024*1024})}function WH(t){return process.stderr.write(t),new Promise(e=>{let r=n=>{let s=(typeof n=="string"?n:n.toString("utf8")).trim();process.stdin.removeListener("data",r);try{process.stdin.pause()}catch{}e(s)};try{process.stdin.resume()}catch{}process.stdin.once("data",r)})}function wk(t){return t==="~"?yk():t.startsWith("~/")?co(yk(),t.slice(2)):t}async function bk(t,e,r={}){let n="usage: lmctl workspace init [--name N] [--basedir DIR] [--provider1 P] [--provider2 P] [--provider3 P]";if(t.includes("--help")||t.includes("-h"))return e.stdout.write([n,"","Creates ~/.lmctl/workspaces/<name>/ with its own state.db and the","provider1/2/3 -> concrete mapping (lmctl_config workspace.provider{1,2,3}).",`Missing options are asked one at a time. Scanned providers: ${Hn.join(", ")}.`].join(`
2450
+ `)}return 0};if(!Fe(s))return a(!1,"no legacy ~/.lmctl/profiles/ found; nothing to migrate");let l;try{l=qf(s).sort()}catch{l=[]}let c=l.filter(f=>{try{return dl(co(s,f)).isDirectory()}catch{return!1}});if(c.length===0)ul(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`);else if(!Fe(o))Hf(s,o,e),i.push(`renamed ${s} -> ${o}`);else{let f=c.filter(m=>Fe(co(o,m)));if(f.length>0)return y(e,`refusing to migrate: ~/.lmctl/workspaces/ already has: ${f.join(", ")} (no files were moved; resolve the name collision, then re-run \`lmctl workspace migrate\`)`);kr(o,{recursive:!0});for(let m of c)Hf(co(s,m),co(o,m),e),i.push(`moved ${m} -> workspaces/${m}`);try{qf(s).length===0&&(ul(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`))}catch{}}let u=im(),d=uo();return Fe(u)&&(Fe(d)?i.push("left active-profile in place (active-workspace already exists; not clobbering)"):(Hf(u,d,e),i.push("renamed active-profile -> active-workspace"))),a(!0)}function Tk(t,e){return $H(t,e,{encoding:"utf8",timeout:5e3,maxBuffer:1024*1024})}function WH(t){return process.stderr.write(t),new Promise(e=>{let r=n=>{let s=(typeof n=="string"?n:n.toString("utf8")).trim();process.stdin.removeListener("data",r);try{process.stdin.pause()}catch{}e(s)};try{process.stdin.resume()}catch{}process.stdin.once("data",r)})}function wk(t){return t==="~"?yk():t.startsWith("~/")?co(yk(),t.slice(2)):t}async function bk(t,e,r={}){let n="usage: lmctl workspace init [--name N] [--basedir DIR] [--provider1 P] [--provider2 P] [--provider3 P]";if(t.includes("--help")||t.includes("-h"))return e.stdout.write([n,"","Creates ~/.lmctl/workspaces/<name>/ with its own state.db and the","provider1/2/3 -> concrete mapping (lmctl_config workspace.provider{1,2,3}).",`Missing options are asked one at a time. Scanned providers: ${Hn.join(", ")}.`].join(`
2453
2451
  `)+`
2454
2452
  `),0;let s=P(t,["--name","--basedir","--provider1","--provider2","--provider3"]);if(s.error!==void 0)return y(e,s.error);if(s.positionals.length!==0)return y(e,n);let o=r.spawn??Tk,a=Hn.map(v=>Bf(v,o)).filter(v=>v.status==="ok"||v.status==="unverified").map(v=>v.provider);if(a.length===0)return e.stderr.write(`error: no provider CLI found on PATH; install/auth ${Hn.join("|")} first
2455
2453
  `),2;let l=r.isTty??!!process.stdin.isTTY,c=r.promptLine??WH,u=r.promptLine!==void 0||l,d=v=>(e.stderr.write(`error: ${v} is required in non-interactive mode (no TTY); pass it explicitly
2456
- `),2),f,m=A(s,"--name");if(m!==void 0){if(!Xe(m))return e.stderr.write(`error: invalid workspace name: ${m}
2457
- `),2;f=m}else{if(!u)return d("--name");for(;;){let v=(await c("Workspace name [default]: ")).trim(),R=v.length===0?"default":v;if(Xe(R)){f=R;break}e.stderr.write(`invalid workspace name: ${R} (letters/digits/.-_, start alnum, \u226464)
2458
- `)}}let p=Ft(f);if(Pe(p))return e.stderr.write(`error: workspace already exists: ${f} (${p}) \u2014 refusing to overwrite
2459
- `),2;let _,g=A(s,"--basedir"),h=pl(f);if(g!==void 0)_=wk(g);else{if(!u)return d("--basedir");let v=(await c(`Base directory for this workspace's projects [${h}]: `)).trim();_=v.length===0?h:wk(v)}let b={};for(let v of["provider1","provider2","provider3"]){let R=A(s,`--${v}`),G=FH[v],M=a.includes(G)?G:a[0];if(R!==void 0){if(!a.includes(R))return e.stderr.write(`error: --${v} ${R} is not an available provider (available: ${a.join(", ")})
2454
+ `),2),f,m=A(s,"--name");if(m!==void 0){if(!Ge(m))return e.stderr.write(`error: invalid workspace name: ${m}
2455
+ `),2;f=m}else{if(!u)return d("--name");for(;;){let v=(await c("Workspace name [default]: ")).trim(),R=v.length===0?"default":v;if(Ge(R)){f=R;break}e.stderr.write(`invalid workspace name: ${R} (letters/digits/.-_, start alnum, \u226464)
2456
+ `)}}let p=Ft(f);if(Fe(p))return e.stderr.write(`error: workspace already exists: ${f} (${p}) \u2014 refusing to overwrite
2457
+ `),2;let h,g=A(s,"--basedir"),_=pl(f);if(g!==void 0)h=wk(g);else{if(!u)return d("--basedir");let v=(await c(`Base directory for this workspace's projects [${_}]: `)).trim();h=v.length===0?_:wk(v)}let b={};for(let v of["provider1","provider2","provider3"]){let R=A(s,`--${v}`),G=FH[v],M=a.includes(G)?G:a[0];if(R!==void 0){if(!a.includes(R))return e.stderr.write(`error: --${v} ${R} is not an available provider (available: ${a.join(", ")})
2460
2458
  `),2;b[v]=R;continue}if(!u)return d(`--${v}`);for(;;){let L=(await c(`${v} (${UH[v]}) [${M}]: `)).trim(),$=L.length===0?M:L;if(a.includes($)){b[v]=$;break}e.stderr.write(`not an available provider: ${$} (available: ${a.join(", ")})
2461
- `)}}kr(p,{recursive:!0}),kr(_,{recursive:!0});let w=rr(f);kr(Jf(w),{recursive:!0});let k=ge({path:w});try{k.setConfig("project.docroot",_),k.setConfig("workspace.provider1",b.provider1),k.setConfig("workspace.provider2",b.provider2),k.setConfig("workspace.provider3",b.provider3)}finally{k.close()}let N={name:f,dir:p,db_path:w,basedir:_,providers:{...b}};return D(s,"--json")?W(e,N):(e.stdout.write(`created workspace ${f} at ${p}
2462
- `),e.stdout.write(` basedir: ${_}
2459
+ `)}}kr(p,{recursive:!0}),kr(h,{recursive:!0});let w=rr(f);kr(Jf(w),{recursive:!0});let k=ge({path:w});try{k.setConfig("project.docroot",h),k.setConfig("workspace.provider1",b.provider1),k.setConfig("workspace.provider2",b.provider2),k.setConfig("workspace.provider3",b.provider3)}finally{k.close()}let N={name:f,dir:p,db_path:w,basedir:h,providers:{...b}};return D(s,"--json")?W(e,N):(e.stdout.write(`created workspace ${f} at ${p}
2460
+ `),e.stdout.write(` basedir: ${h}
2463
2461
  `),e.stdout.write(` provider1=${b.provider1} provider2=${b.provider2} provider3=${b.provider3}
2464
2462
  `),e.stdout.write(`activate it with: lmctl workspace use ${f}
2465
2463
  `)),0}async function Sk(t,e,r={}){let n="usage: lmctl [--workspace W] workspace set-provider <provider1|provider2|provider3> <concrete>";if(t.includes("--help")||t.includes("-h"))return e.stdout.write([n,"","Remaps an abstract provider slot for the selected workspace. The next","`team seed` resolves that slot to the new concrete; already-seeded",`members keep their frozen provider_resolved. Scanned providers: ${Hn.join(", ")}.`].join(`
@@ -2468,7 +2466,7 @@ remote https:// workflow after a trust prompt.
2468
2466
  `),2;let c=r.spawn??Tk,u=Hn.map(p=>Bf(p,c)).filter(p=>p.status==="ok"||p.status==="unverified").map(p=>p.provider);if(u.length===0)return e.stderr.write(`error: no provider CLI found on PATH; install/auth ${Hn.join("|")} first
2469
2467
  `),2;if(!u.includes(i))return e.stderr.write(`error: ${i} is not an available provider (available: ${u.join(", ")})
2470
2468
  `),2;let d=e.dal===void 0,f=e.dal??ge({path:le()});try{f.setConfig(`workspace.${l}`,i)}finally{d&&f.close()}let m=Xn()??Nr.default;return e.stdout.write(`workspace.${l} = ${i} (workspace: ${m})
2471
- `),0}var RH,Hn,FH,UH,vk=E(()=>{"use strict";Ue();gk();fe();Ge();RH=`usage: lmctl workspace list [--json]
2469
+ `),0}var RH,Hn,FH,UH,vk=E(()=>{"use strict";We();gk();fe();Ve();RH=`usage: lmctl workspace list [--json]
2472
2470
  lmctl workspace create <name> [--docroot PATH] [--json]
2473
2471
  lmctl workspace use <name> [--json]
2474
2472
  lmctl workspace show <name> [--json]
@@ -2488,7 +2486,7 @@ delete requires --confirm; deleting default or active workspaces also requires -
2488
2486
  `),0):y(e,`project workflow not found: ${s}`)}function Ik(t,e,r,n){let s=P(t,[]);if(s.error!==void 0)return y(e,s.error);let o=Xf(s.positionals[0]),i=n?"enable":"disable";if(typeof o=="string"||s.positionals.length!==1)return y(e,`usage: project workflow ${i} <id>`);let a=r.setProjectWorkflowEnabled(o,n);return a===null?y(e,`project workflow not found: ${o}`):(D(s,"--json")?W(e,a):e.stdout.write(`${n?"enabled":"disabled"} project workflow ${o}
2489
2487
  `),0)}function zH(t){if(t===void 0)return null;try{let e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)?{json:JSON.stringify(e)}:"--params must be a JSON object"}catch{return"--params must be valid JSON"}}function Xf(t){return t===void 0||!/^\d+$/.test(t)||Number(t)<=0?"invalid id":Number(t)}function ZH(t,e,r){let n=P(t,[]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0)return y(e,"usage: project show <name>");let o=r.findProjectByName(s);if(o===null)return y(e,`project not found: ${s}`);let i=o.name.indexOf("/"),a=i>0?o.name.slice(0,i):null,l=i>0?o.name.slice(i+1):o.name,c={...o,owner:a,repo:l};return D(n,"--json")?W(e,c):e.stdout.write(`${JSON.stringify(c,null,2)}
2490
2488
  `),0}function QH(t,e,r){let n=P(t,[]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0)return y(e,"usage: project status <name>");let o=r.findProjectByName(s);if(o===null)return y(e,`project not found: ${s}`);let i={project:o.name,workflow_name:o.workflow_name};return D(n,"--json")?W(e,i):e.stdout.write(`${JSON.stringify(i,null,2)}
2491
- `),0}function eq(t,e,r){let n=P(t,["--local-path","--workflow","--team","--default-branch","--owner","--repo","--test-argv","--durable-memory-mode"]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals,o=A(n,"--owner"),i=A(n,"--repo"),a=o!==void 0&&i!==void 0?`${o}/${i}`:s;if(a===void 0)return y(e,`usage: project create <name> --local-path P --workflow W --team T [--default-branch B] [--test-argv '["go","test","./..."]'] OR project create --owner OWNER --repo REPO ...`);let l=r.getConfig("project.docroot"),c=a.indexOf("/"),u=c>0?a.slice(c+1):a,d=A(n,"--local-path")??(l!==null?Nk(l,u):void 0),f=A(n,"--workflow"),m=A(n,"--team");if(d===void 0||f===void 0||m===void 0)return y(e,"project create requires --local-path (or `api config set project.docroot`), --workflow, and --team");if(r.getWorkflowByName(f)===null)return y(e,`workflow not found: ${f}`);let p=r.findTeamByName(m);if(p===null)return y(e,`team not found: ${m}`);let _=A(n,"--test-argv"),g=null;if(_!==void 0)try{let k=JSON.parse(_);if(!Array.isArray(k)||!k.every(N=>typeof N=="string")||k.length===0)return y(e,`--test-argv must be a non-empty JSON array of strings (e.g. '["go","test","./..."]')`);g=JSON.stringify(k)}catch{return y(e,"--test-argv must be valid JSON")}let h=A(n,"--durable-memory-mode");if(h!==void 0&&h!=="folder"&&h!=="db")return y(e,'--durable-memory-mode must be "folder" or "db"');let b=h!==void 0?h:rq(d)||_s(d)?"folder":"db",w=r.insertProject({name:a,local_path:d,workflow_name:f,team_id:p.id,default_branch:A(n,"--default-branch")??null,test_argv:g,durable_memory_mode:b});return D(n,"--json")?W(e,w):e.stdout.write(`created project ${w.name}
2489
+ `),0}function eq(t,e,r){let n=P(t,["--local-path","--workflow","--team","--default-branch","--owner","--repo","--test-argv","--durable-memory-mode"]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals,o=A(n,"--owner"),i=A(n,"--repo"),a=o!==void 0&&i!==void 0?`${o}/${i}`:s;if(a===void 0)return y(e,`usage: project create <name> --local-path P --workflow W --team T [--default-branch B] [--test-argv '["go","test","./..."]'] OR project create --owner OWNER --repo REPO ...`);let l=r.getConfig("project.docroot"),c=a.indexOf("/"),u=c>0?a.slice(c+1):a,d=A(n,"--local-path")??(l!==null?Nk(l,u):void 0),f=A(n,"--workflow"),m=A(n,"--team");if(d===void 0||f===void 0||m===void 0)return y(e,"project create requires --local-path (or `api config set project.docroot`), --workflow, and --team");if(r.getWorkflowByName(f)===null)return y(e,`workflow not found: ${f}`);let p=r.findTeamByName(m);if(p===null)return y(e,`team not found: ${m}`);let h=A(n,"--test-argv"),g=null;if(h!==void 0)try{let k=JSON.parse(h);if(!Array.isArray(k)||!k.every(N=>typeof N=="string")||k.length===0)return y(e,`--test-argv must be a non-empty JSON array of strings (e.g. '["go","test","./..."]')`);g=JSON.stringify(k)}catch{return y(e,"--test-argv must be valid JSON")}let _=A(n,"--durable-memory-mode");if(_!==void 0&&_!=="folder"&&_!=="db")return y(e,'--durable-memory-mode must be "folder" or "db"');let b=_!==void 0?_:rq(d)||_s(d)?"folder":"db",w=r.insertProject({name:a,local_path:d,workflow_name:f,team_id:p.id,default_branch:A(n,"--default-branch")??null,test_argv:g,durable_memory_mode:b});return D(n,"--json")?W(e,w):e.stdout.write(`created project ${w.name}
2492
2490
  `),0}function tq(t,e,r){let n=P(t,[]);if(n.error!==void 0)return y(e,n.error);let s=r.listProjects();return D(n,"--json")?W(e,s):e.stdout.write(`${s.map(o=>`${o.id} ${o.name} ${o.workflow_name}`).join(`
2493
2491
  `)}${s.length>0?`
2494
2492
  `:""}`),0}function rq(t){try{let e=Nk(t,"durable-memory");return BH(e)&&HH(e).isDirectory()}catch{return!1}}var qH,Ak=E(()=>{"use strict";fe();wn();gs();qH=`usage: lmctl project create <name> [--local-path P] --workflow W --team T [--default-branch B] [--test-argv JSON] [--durable-memory-mode folder|db] [--json]
@@ -2529,14 +2527,14 @@ If project create omits --local-path, project.docroot must be configured.
2529
2527
  `),0;let r=Wk(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
2530
2528
  `),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)
2531
2529
  `),2;if(r.upload&&r.internalS3)return e.stderr.write(`error: pick one of --upload (HQ) or --internal-s3, not both
2532
- `),2;let n=$k(),s=r.outputPath??yq(n),o=r.internalS3?"internal-s3":r.upload?"hq":"local";try{return await O(e,async i=>{let a=await mm({dal:i,include:r.include,dbPath:le(),intentLog:process.env.LMCTL_INTENT_LOG}),l;try{l=await Dk({ticketId:n,data:a,outputPath:s,lmctlNextVersion:lt(),sanitized:!r.noSanitize})}catch(d){if(d instanceof xr)return e.stderr.write(`sanitization failed: ${d.message}
2530
+ `),2;let n=$k(),s=r.outputPath??yq(n),o=r.internalS3?"internal-s3":r.upload?"hq":"local";try{return await O(e,async i=>{let a=await mm({dal:i,include:r.include,dbPath:le(),intentLog:process.env.LMCTL_INTENT_LOG}),l;try{l=await Dk({ticketId:n,data:a,outputPath:s,lmctlNextVersion:ct(),sanitized:!r.noSanitize})}catch(d){if(d instanceof xr)return e.stderr.write(`sanitization failed: ${d.message}
2533
2531
  `),2;throw d}let c=await Fk({mode:o,bundlePath:l.outputPath,ticketId:n,hqUrl:r.hqUrl}),u={ticket_id:n,bundle:l.outputPath,bundle_size_bytes:l.bundleSizeBytes,sections:Object.keys(a).sort(),sanitized:!r.noSanitize,upload:c,manifest_files:l.manifest.files.length};return r.json?e.stdout.write(`${JSON.stringify(u,null,2)}
2534
2532
  `):(e.stdout.write(`ticket: ${n}
2535
2533
  `),e.stdout.write(`bundle: ${l.outputPath} (${l.bundleSizeBytes} bytes, ${l.manifest.files.length} files)
2536
2534
  `),e.stdout.write(`upload[${c.mode}]: ${c.ok?"ok":"noop"} \u2014 ${c.message}
2537
2535
  `)),c.ok||o==="local"?0:1})}catch(i){return e.stderr.write(`diagnose failed: ${i instanceof Error?i.message:String(i)}
2538
2536
  `),1}}function Wk(t){let e={upload:!1,internalS3:!1,noSanitize:!1,json:!1},r=[];for(let n=0;n<t.length;n+=1){let s=t[n];if(s==="--output"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --output";e.outputPath=o;continue}if(s==="--upload"){e.upload=!0;continue}if(s==="--internal-s3"){e.internalS3=!0;continue}if(s==="--hq"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --hq";e.hqUrl=o,e.upload=!0;continue}if(s==="--include"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --include";if(!gq(o))return`unknown section: ${o} (expected one of ${po.join(", ")})`;r.push(o);continue}if(s==="--no-sanitize"){e.noSanitize=!0;continue}if(s==="--json"){e.json=!0;continue}if(!(s==="--help"||s==="-h"))return`unknown argument: ${s}`}return r.length>0&&(e.include=r),e}function gq(t){return po.includes(t)}function yq(t){return hq(pq(),`lmctl-diag-${t}.tar.gz`)}function wq(){return["usage: lmctl diagnose [options]","","Collect platform diagnostics into a sanitized troubleshooting bundle,","with optional upload modes for support workflows.","","options:"," --output <path> write bundle to <path> (default /tmp/lmctl-diag-<ticket>.tar.gz)"," --upload upload to headquarter (HTTP, currently stub)"," --hq <url> override headquarter base URL (implies --upload)"," --internal-s3 upload to s3://lmctl/diagnostics/ (stub; checks aws CLI)"," --include <section> restrict to one of: serve|db|runs|jobs|attentions|env|intents (repeatable)"," --no-sanitize DANGER: skip secret redaction; incompatible with upload"," --json emit JSON summary to stdout"].join(`
2539
- `)}var Hk=E(()=>{"use strict";Kn();Pk();Gf();mo();Uk();Ge();fe()});var Kk={};re(Kk,{ATTENTION_STATES:()=>Zf,DAEMON_INTERVAL_FAST_MS:()=>zf,REQUIRED_TEAM_ALIASES:()=>qk,chooseDiagnoses:()=>Gk,collectEvidence:()=>Xk,diagnose:()=>Jk,renderReport:()=>Vk,runDiagnosePrompt:()=>bq});function Jk(t,e){let r=Xk(t,e),n=Gk(r);return Vk(r,n)}function Xk(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:Fs(),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=Tq(s.text),n.prompt.created_at=s.created_at,n.prompt.completed_at=s.completed_at,n.prompt.job_id=s.job_id),n.prompt.job_id!==void 0)try{let o=t.getJob(n.prompt.job_id);if(o!==null&&(n.job.exists=!0,n.job.status=o.status,n.job.attempt_count=o.attempt_count,n.job.last_error=o.last_error,n.job.available_at=o.available_at,n.job.locked_by=o.locked_by,n.job.run_id=o.run_id,o.run_id!==null))try{let i=t.getRun(o.run_id);if(i!==null){n.run.exists=!0,n.run.id=i.id,n.run.current_state=i.current_state,n.run.terminal_state=i.terminal_state,n.run.started_at=i.started_at,n.run.ended_at=i.ended_at;let a="__paused__:";n.run.paused_step=i.current_state!==null&&i.current_state.startsWith(a)?i.current_state.slice(a.length):null,n.run.paused_at=i.paused_at}}catch{n.run.sectionAvailable=!1}}catch{n.job.sectionAvailable=!1}if(n.prompt.project_id!==void 0)try{let o=t.getProject(n.prompt.project_id);if(o!==null){n.project.exists=!0,n.project.id=o.id,n.project.name=o.name,n.project.local_path=o.local_path,n.project.test_command=o.test_command,n.project.workflow_name=o.workflow_name,n.project.team_id=o.team_id;try{n.project.workflow_name_resolves=t.getWorkflowByName(o.workflow_name)!==null}catch{n.project.workflow_name_resolves=!1}}}catch{n.project.sectionAvailable=!1}if(n.project.id!==void 0)try{let o=t.listProjectWorkflows(n.project.id);n.workflows.count=o.length;for(let i of o){let a=`workflow_id=${i.workflow_id}`,l=0,c=null;try{let d=t.listWorkflows().find(f=>f.id===i.workflow_id);d!==void 0&&(a=d.name,l=d.version,c=d.source_uri)}catch{}n.workflows.rows.push({workflow_name:a,version:l,enabled:i.enabled,source_uri:c})}}catch{n.workflows.sectionAvailable=!1}if(n.project.team_id!==void 0)try{n.team.teamId=n.project.team_id;let o=t.listTeamMembers(n.project.team_id);for(let a of o)n.team.members.push({alias:a.alias,provider:a.provider,sessionid:a.sessionid,sessiondir:a.sessiondir,state:a.state,state_reason:a.state_reason,state_updated_at:a.state_updated_at});let i=new Set(o.map(a=>a.alias));n.team.missingAliases=qk.filter(a=>!i.has(a))}catch{n.team.sectionAvailable=!1}return n.daemon.workerPid=null,n.daemon.lastTickAt=null,n}function Gk(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>zf&&e.push({cause:`Daemon poll interval is ${t.daemon.intervalMs}ms (${Math.round(t.daemon.intervalMs/1e3)}s); WT/dev expected <=${zf}ms`,action:"Set LMCTL_DAEMON_INTERVAL_MS=5000 (or lower) in the agent's env before relaunching `lmctl-next-agent`"}),t.project.exists&&t.workflows.sectionAvailable&&t.workflows.count===0&&t.project.workflow_name_resolves!==!0&&e.push({cause:`Project ${t.project.name??`id=${t.project.id??"?"}`} has 0 workflows registered AND project.workflow_name does not resolve; engine can't dispatch`,action:"Run `lmctl workflow load <name>` then `lmctl project bind <project> <workflow>` (or check the v4-project bootstrap path)"}),t.team.sectionAvailable&&t.team.missingAliases.length>0&&e.push({cause:`Default team (team_id=${t.team.teamId??"?"}) missing required aliases: ${t.team.missingAliases.join(", ")} (TC2 DEFECT-E class \u2014 engine will stall with missing_agent:<alias>)`,action:"Run `lmctl team seed` against this project's team, or add the missing members via `lmctl team add-member`"});let r=t.team.sectionAvailable?t.team.members.filter(s=>Zf.has(s.state)):[];if(t.run.exists&&(t.run.paused_step??null)!==null||r.length>0){let s=t.run.paused_step??null,o=r.map(a=>a.alias).join(", "),i=s!==null&&o.length>0?`Run paused at ${s} awaiting operator escalation decision (member ${o} attention_needed)`:s!==null?`Run paused at ${s} awaiting operator escalation decision`:`Team member(s) ${o} awaiting operator attention`;e.push({cause:i,action:"Open the run in the SPA escalations panel (paused badge) or resolve via the operator-resume verb"})}return t.dispatch.rowExists&&t.job.exists&&!t.run.exists&&t.daemon.workerPid===null&&e.push({cause:"Worker pid not observable (agent serve process may not be actively daemoning)",action:"Verify `lmctl-next-agent` is running and check stderr for `[lmctl-next-agent]` lines"}),e.slice(0,3)}function Vk(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: ${Eq(t)}`))):r.push(" table not present (schema variation)"),r.push(""),r.push("[PROMPT_RUN]"),t.job.sectionAvailable?t.job.exists?t.run.exists?(r.push(" row exists in prompt_runs table: YES"),r.push(` run_id: ${t.run.id??"?"}`),r.push(` current_step: ${t.run.current_state??"null"}`),r.push(` status: ${t.run.terminal_state??"in_progress"}`),r.push(` started_at: ${t.run.started_at??"?"}`),r.push(` attempts: ${t.job.attempt_count??0}`)):(r.push(" row exists in prompt_runs table: NO"),r.push(` job_id: ${t.prompt.job_id??"?"} status=${t.job.status??"?"} attempts=${t.job.attempt_count??0}`),r.push(" -> job enqueued but no run; daemon poll did not consume it")):(r.push(" row exists in prompt_runs table: NO"),r.push(" -> worker never picked up the prompt (job row missing)")):r.push(" job table not accessible"),r.push(""),r.push("[PROJECT]"),t.project.sectionAvailable?t.project.exists?(r.push(` id: ${t.project.id??"?"}`),r.push(` name: ${t.project.name??"?"}`),r.push(` local_path: ${t.project.local_path??"?"}`),r.push(` test_command: ${t.project.test_command??"null"}`),r.push(` default_workflow: ${t.project.workflow_name??"null"}`)):t.prompt.project_id===void 0?r.push(" not resolvable (no project_id on prompt)"):r.push(` not present (id=${t.prompt.project_id})`):r.push(" project table not accessible"),r.push(""),r.push("[WORKFLOWS REGISTERED FOR PROJECT]"),!t.workflows.sectionAvailable)r.push(" project_workflow table not accessible");else if(t.workflows.count===0&&t.project.exists&&t.project.workflow_name_resolves===!0)r.push(` default_workflow_name: ${t.project.workflow_name??"?"} (resolved via project.workflow_name)`),r.push(" project_workflow rows: 0 (uses fallback resolution; expected)");else{r.push(` count: ${t.workflows.count}`);for(let o of t.workflows.rows)r.push(` - ${o.workflow_name} v${o.version} enabled=${o.enabled===1?"true":"false"} source=${o.source_uri??"null"}`)}if(r.push(""),r.push("[TEAM MEMBERS FOR PROJECT'S DEFAULT TEAM]"),!t.team.sectionAvailable)r.push(" team_member table not accessible");else if(t.team.teamId===void 0)r.push(" not resolvable (no team_id on project)");else{t.team.members.length===0&&r.push(" (no members)");for(let o of t.team.members)r.push(` - alias=${o.alias} provider=${o.provider} state=${o.state} sessionid=${o.sessionid??"null"} sessiondir=${o.sessiondir}`);t.team.missingAliases.length>0&&r.push(` ! missing aliases: ${t.team.missingAliases.join(", ")}`)}r.push("");let n=t.team.sectionAvailable?t.team.members.filter(o=>Zf.has(o.state)):[],s=t.run.exists?t.run.paused_step??null:null;if(s!==null||n.length>0){if(r.push("[ATTENTION/ESCALATION]"),s!==null){let o=t.run.paused_at??t.run.started_at??"?";r.push(` paused_step: ${s} (started: ${o})`)}if(n.length>0){let o=n.map(i=>`${i.alias} (state=${i.state}${i.state_updated_at?` since ${i.state_updated_at}`:""}${i.state_reason?`, reason="${i.state_reason}"`:""})`).join(", ");r.push(` members awaiting operator: ${o}`)}else r.push(" members awaiting operator: (none flagged on team)");r.push(" next action expected: operator response via /admin or webcli escalations verb"),r.push("")}if(r.push("[DAEMON STATE]"),r.push(` worker pid: ${t.daemon.workerPid===null?"not observable from CLI":String(t.daemon.workerPid)}`),r.push(` daemon poll interval (LMCTL_DAEMON_INTERVAL_MS env): ${t.daemon.intervalMs}`),r.push(` last daemon tick: ${t.daemon.lastTickAt??"not exposed"}`),r.push(""),r.push("[DIAGNOSIS]"),e.length===0)r.push(" no obvious root cause flagged by the v1 rules (see brief Part 4)");else for(let o of e)r.push(` - ${o.cause}`),r.push(` -> ${o.action}`);return r.join(`
2537
+ `)}var Hk=E(()=>{"use strict";Kn();Pk();Gf();mo();Uk();Ve();fe()});var Kk={};re(Kk,{ATTENTION_STATES:()=>Zf,DAEMON_INTERVAL_FAST_MS:()=>zf,REQUIRED_TEAM_ALIASES:()=>qk,chooseDiagnoses:()=>Gk,collectEvidence:()=>Xk,diagnose:()=>Jk,renderReport:()=>Vk,runDiagnosePrompt:()=>bq});function Jk(t,e){let r=Xk(t,e),n=Gk(r);return Vk(r,n)}function Xk(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:Fs(),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=Tq(s.text),n.prompt.created_at=s.created_at,n.prompt.completed_at=s.completed_at,n.prompt.job_id=s.job_id),n.prompt.job_id!==void 0)try{let o=t.getJob(n.prompt.job_id);if(o!==null&&(n.job.exists=!0,n.job.status=o.status,n.job.attempt_count=o.attempt_count,n.job.last_error=o.last_error,n.job.available_at=o.available_at,n.job.locked_by=o.locked_by,n.job.run_id=o.run_id,o.run_id!==null))try{let i=t.getRun(o.run_id);if(i!==null){n.run.exists=!0,n.run.id=i.id,n.run.current_state=i.current_state,n.run.terminal_state=i.terminal_state,n.run.started_at=i.started_at,n.run.ended_at=i.ended_at;let a="__paused__:";n.run.paused_step=i.current_state!==null&&i.current_state.startsWith(a)?i.current_state.slice(a.length):null,n.run.paused_at=i.paused_at}}catch{n.run.sectionAvailable=!1}}catch{n.job.sectionAvailable=!1}if(n.prompt.project_id!==void 0)try{let o=t.getProject(n.prompt.project_id);if(o!==null){n.project.exists=!0,n.project.id=o.id,n.project.name=o.name,n.project.local_path=o.local_path,n.project.test_command=o.test_command,n.project.workflow_name=o.workflow_name,n.project.team_id=o.team_id;try{n.project.workflow_name_resolves=t.getWorkflowByName(o.workflow_name)!==null}catch{n.project.workflow_name_resolves=!1}}}catch{n.project.sectionAvailable=!1}if(n.project.id!==void 0)try{let o=t.listProjectWorkflows(n.project.id);n.workflows.count=o.length;for(let i of o){let a=`workflow_id=${i.workflow_id}`,l=0,c=null;try{let d=t.listWorkflows().find(f=>f.id===i.workflow_id);d!==void 0&&(a=d.name,l=d.version,c=d.source_uri)}catch{}n.workflows.rows.push({workflow_name:a,version:l,enabled:i.enabled,source_uri:c})}}catch{n.workflows.sectionAvailable=!1}if(n.project.team_id!==void 0)try{n.team.teamId=n.project.team_id;let o=t.listTeamMembers(n.project.team_id);for(let a of o)n.team.members.push({alias:a.alias,provider:a.provider,sessionid:a.sessionid,sessiondir:a.sessiondir,state:a.state,state_reason:a.state_reason,state_updated_at:a.state_updated_at});let i=new Set(o.map(a=>a.alias));n.team.missingAliases=qk.filter(a=>!i.has(a))}catch{n.team.sectionAvailable=!1}return n.daemon.workerPid=null,n.daemon.lastTickAt=null,n}function Gk(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>zf&&e.push({cause:`Daemon poll interval is ${t.daemon.intervalMs}ms (${Math.round(t.daemon.intervalMs/1e3)}s); WT/dev expected <=${zf}ms`,action:"Set LMCTL_DAEMON_INTERVAL_MS=5000 (or lower) in the agent's env before relaunching `lmctl-next-agent`"}),t.project.exists&&t.workflows.sectionAvailable&&t.workflows.count===0&&t.project.workflow_name_resolves!==!0&&e.push({cause:`Project ${t.project.name??`id=${t.project.id??"?"}`} has 0 workflows registered AND project.workflow_name does not resolve; engine can't dispatch`,action:"Run `lmctl workflow load <name>` then `lmctl project bind <project> <workflow>` (or check the v4-project bootstrap path)"}),t.team.sectionAvailable&&t.team.missingAliases.length>0&&e.push({cause:`Default team (team_id=${t.team.teamId??"?"}) missing required aliases: ${t.team.missingAliases.join(", ")} (TC2 DEFECT-E class \u2014 engine will stall with missing_agent:<alias>)`,action:"Run `lmctl team seed` against this project's team, or add the missing members via `lmctl team add-member`"});let r=t.team.sectionAvailable?t.team.members.filter(s=>Zf.has(s.state)):[];if(t.run.exists&&(t.run.paused_step??null)!==null||r.length>0){let s=t.run.paused_step??null,o=r.map(a=>a.alias).join(", "),i=s!==null&&o.length>0?`Run paused at ${s} awaiting operator escalation decision (member ${o} attention_needed)`:s!==null?`Run paused at ${s} awaiting operator escalation decision`:`Team member(s) ${o} awaiting operator attention`;e.push({cause:i,action:"Open the run in the SPA escalations panel (paused badge) or resolve via the operator-resume verb"})}return t.dispatch.rowExists&&t.job.exists&&!t.run.exists&&t.daemon.workerPid===null&&e.push({cause:"Worker pid not observable (agent serve process may not be actively daemoning)",action:"Verify `lmctl-next-agent` is running and check stderr for `[lmctl-next-agent]` lines"}),e.slice(0,3)}function Vk(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: ${Eq(t)}`))):r.push(" table not present (schema variation)"),r.push(""),r.push("[PROMPT_RUN]"),t.job.sectionAvailable?t.job.exists?t.run.exists?(r.push(" row exists in prompt_runs table: YES"),r.push(` run_id: ${t.run.id??"?"}`),r.push(` current_step: ${t.run.current_state??"null"}`),r.push(` status: ${t.run.terminal_state??"in_progress"}`),r.push(` started_at: ${t.run.started_at??"?"}`),r.push(` attempts: ${t.job.attempt_count??0}`)):(r.push(" row exists in prompt_runs table: NO"),r.push(` job_id: ${t.prompt.job_id??"?"} status=${t.job.status??"?"} attempts=${t.job.attempt_count??0}`),r.push(" -> job enqueued but no run; daemon poll did not consume it")):(r.push(" row exists in prompt_runs table: NO"),r.push(" -> worker never picked up the prompt (job row missing)")):r.push(" job table not accessible"),r.push(""),r.push("[PROJECT]"),t.project.sectionAvailable?t.project.exists?(r.push(` id: ${t.project.id??"?"}`),r.push(` name: ${t.project.name??"?"}`),r.push(` local_path: ${t.project.local_path??"?"}`),r.push(` test_command: ${t.project.test_command??"null"}`),r.push(` default_workflow: ${t.project.workflow_name??"null"}`)):t.prompt.project_id===void 0?r.push(" not resolvable (no project_id on prompt)"):r.push(` not present (id=${t.prompt.project_id})`):r.push(" project table not accessible"),r.push(""),r.push("[WORKFLOWS REGISTERED FOR PROJECT]"),!t.workflows.sectionAvailable)r.push(" project_workflow table not accessible");else if(t.workflows.count===0&&t.project.exists&&t.project.workflow_name_resolves===!0)r.push(` default_workflow_name: ${t.project.workflow_name??"?"} (resolved via project.workflow_name)`),r.push(" project_workflow rows: 0 (uses fallback resolution; expected)");else{r.push(` count: ${t.workflows.count}`);for(let o of t.workflows.rows)r.push(` - ${o.workflow_name} v${o.version} enabled=${o.enabled===1?"true":"false"} source=${o.source_uri??"null"}`)}if(r.push(""),r.push("[TEAM MEMBERS FOR PROJECT'S DEFAULT TEAM]"),!t.team.sectionAvailable)r.push(" team_member table not accessible");else if(t.team.teamId===void 0)r.push(" not resolvable (no team_id on project)");else{t.team.members.length===0&&r.push(" (no members)");for(let o of t.team.members)r.push(` - alias=${o.alias} provider=${o.provider} state=${o.state} sessionid=${o.sessionid??"null"} sessiondir=${o.sessiondir}`);t.team.missingAliases.length>0&&r.push(` ! missing aliases: ${t.team.missingAliases.join(", ")}`)}r.push("");let n=t.team.sectionAvailable?t.team.members.filter(o=>Zf.has(o.state)):[],s=t.run.exists?t.run.paused_step??null:null;if(s!==null||n.length>0){if(r.push("[ATTENTION/ESCALATION]"),s!==null){let o=t.run.paused_at??t.run.started_at??"?";r.push(` paused_step: ${s} (started: ${o})`)}if(n.length>0){let o=n.map(i=>`${i.alias} (state=${i.state}${i.state_updated_at?` since ${i.state_updated_at}`:""}${i.state_reason?`, reason="${i.state_reason}"`:""})`).join(", ");r.push(` members awaiting operator: ${o}`)}else r.push(" members awaiting operator: (none flagged on team)");r.push(" next action expected: operator response via /admin or webcli escalations verb"),r.push("")}if(r.push("[DAEMON STATE]"),r.push(` worker pid: ${t.daemon.workerPid===null?"not observable from CLI":String(t.daemon.workerPid)}`),r.push(` daemon poll interval (LMCTL_DAEMON_INTERVAL_MS env): ${t.daemon.intervalMs}`),r.push(` last daemon tick: ${t.daemon.lastTickAt??"not exposed"}`),r.push(""),r.push("[DIAGNOSIS]"),e.length===0)r.push(" no obvious root cause flagged by the v1 rules (see brief Part 4)");else for(let o of e)r.push(` - ${o.cause}`),r.push(` -> ${o.action}`);return r.join(`
2540
2538
  `)+`
2541
2539
  `}function Eq(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 Tq(t){let e=t.replace(/\s+/g," ").trim();return e.length<=80?e:`${e.slice(0,80)}...`}async function bq(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${Yf()}
2542
2540
  `),0;let r=[];for(let s of t){if(s.startsWith("--"))return e.stderr.write(`error: unknown flag: ${s}
@@ -2562,8 +2560,8 @@ If project create omits --local-path, project.docroot must be configured.
2562
2560
  Show the current project context, active run, unacked attentions, and recent
2563
2561
  runs. Defaults to resolving the project from the current working directory;
2564
2562
  --project selects a project by name, and --web uses the web UI focus.
2565
- `});Ge();Kn();Ne();import{pathToFileURL as Fq}from"node:url";bl();Kn();import{mkdirSync as Vv,readFileSync as Kv,renameSync as Yv,writeFileSync as zv}from"node:fs";import{homedir as Zv}from"node:os";import{dirname as Qv,join as eI}from"node:path";var tI="https://registry.npmjs.org/@lmctl-ai/lmctl/latest",rI=60*60*1e3,nI=1500;function sI(){let t=process.env.HOME??Zv();return eI(t,".lmctl",".update-check.json")}function oI(t){return t.isTTY===!0}function iI(t,e){let r=o=>{let i=/^(\d+)\.(\d+)\.(\d+)(?:$|[-+])/.exec(o.trim());if(i===null)return null;let a=i.slice(1).map(l=>Number(l));return a.some(l=>!Number.isSafeInteger(l)||l<0)?null:a},n=r(t),s=r(e);if(n===null||s===null)return 0;for(let o=0;o<3;o+=1){if(n[o]>s[o])return 1;if(n[o]<s[o])return-1}return 0}function Sl(t,e){return!!(process.env.LMCTL_NO_UPDATE_NOTIFIER==="1"||!oI(e.stderr)||t.includes("--json")||t.some(n=>n.startsWith("I_am="))||t.includes("--help")||t.includes("-h")||t[0]==="help"||t[0]==="mcp")}function aI(t,e){try{let r=JSON.parse(Kv(t,"utf8"));if(typeof r.checkedAt=="number"&&Number.isFinite(r.checkedAt)&&typeof r.latest=="string"&&e-r.checkedAt<rI)return r.latest}catch{}return null}function lI(t,e){Vv(Qv(t),{recursive:!0});let r=`${t}.tmp-${process.pid}-${Math.random().toString(16).slice(2)}`;zv(r,`${JSON.stringify(e)}
2566
- `,"utf8"),Yv(r,t)}async function cI(){let t=await go(tI,{description:"lmctl npm metadata",timeoutMs:nI}),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 Tm(t,e=[],r={}){try{if(Sl(e,t))return;let n=r.now?.()??Date.now(),s=r.cachePath??sI();if(aI(s,n)!==null)return;let i=await(r.fetchLatest??cI)();try{lI(s,{checkedAt:n,latest:i})}catch{return}let a=r.currentVersion?.()??lt();iI(i,a)>0&&t.stderr.write(`update available: ${a} \u2192 ${i} run: npm i -g @lmctl-ai/lmctl@latest
2563
+ `});Ve();Kn();Ne();import{pathToFileURL as Fq}from"node:url";bl();Kn();import{mkdirSync as Vv,readFileSync as Kv,renameSync as Yv,writeFileSync as zv}from"node:fs";import{homedir as Zv}from"node:os";import{dirname as Qv,join as eI}from"node:path";var tI="https://registry.npmjs.org/@lmctl-ai/lmctl/latest",rI=60*60*1e3,nI=1500;function sI(){let t=process.env.HOME??Zv();return eI(t,".lmctl",".update-check.json")}function oI(t){return t.isTTY===!0}function iI(t,e){let r=o=>{let i=/^(\d+)\.(\d+)\.(\d+)(?:$|[-+])/.exec(o.trim());if(i===null)return null;let a=i.slice(1).map(l=>Number(l));return a.some(l=>!Number.isSafeInteger(l)||l<0)?null:a},n=r(t),s=r(e);if(n===null||s===null)return 0;for(let o=0;o<3;o+=1){if(n[o]>s[o])return 1;if(n[o]<s[o])return-1}return 0}function Sl(t,e){return!!(process.env.LMCTL_NO_UPDATE_NOTIFIER==="1"||!oI(e.stderr)||t.includes("--json")||t.some(n=>n.startsWith("I_am="))||t.includes("--help")||t.includes("-h")||t[0]==="help"||t[0]==="mcp")}function aI(t,e){try{let r=JSON.parse(Kv(t,"utf8"));if(typeof r.checkedAt=="number"&&Number.isFinite(r.checkedAt)&&typeof r.latest=="string"&&e-r.checkedAt<rI)return r.latest}catch{}return null}function lI(t,e){Vv(Qv(t),{recursive:!0});let r=`${t}.tmp-${process.pid}-${Math.random().toString(16).slice(2)}`;zv(r,`${JSON.stringify(e)}
2564
+ `,"utf8"),Yv(r,t)}async function cI(){let t=await go(tI,{description:"lmctl npm metadata",timeoutMs:nI}),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 Tm(t,e=[],r={}){try{if(Sl(e,t))return;let n=r.now?.()??Date.now(),s=r.cachePath??sI();if(aI(s,n)!==null)return;let i=await(r.fetchLatest??cI)();try{lI(s,{checkedAt:n,latest:i})}catch{return}let a=r.currentVersion?.()??ct();iI(i,a)>0&&t.stderr.write(`update available: ${a} \u2192 ${i} run: npm i -g @lmctl-ai/lmctl@latest
2567
2565
  `)}catch{}}var tm=`usage: lmctl [--db PATH] [--workspace NAME] [--debug] <command> [args]
2568
2566
  `,Qf=`${tm}
2569
2567
  Setup & status:
@@ -2620,14 +2618,13 @@ Run 'lmctl help <command>' for command-specific help.
2620
2618
  ${tm}Run 'lmctl help' for usage.
2621
2619
  `),2}function sv(t,e){return t.stderr.write(`error: unknown command: ${e}
2622
2620
  ${tm}Run 'lmctl help' for usage.
2623
- `),1}async function Uq(t,e={stdout:process.stdout,stderr:process.stderr}){let r=ym();try{return await Wq(t,e)}finally{wm(r)}}async function Wq(t,e={stdout:process.stdout,stderr:process.stderr}){let r=[];for(let i=0;i<t.length;i+=1){let a=t[i];if(a==="--db"){let l=t[++i];if(l===void 0||l.startsWith("--"))return em(e,"missing value for --db");process.env.LMCTL_DB=l;continue}if(a==="--workspace"){let l=t[++i];if(l===void 0||l.startsWith("--"))return em(e,"missing value for --workspace");if(!Xe(l))return em(e,`invalid workspace name: ${l}`);process.env.LMCTL_WORKSPACE=l;continue}if(a==="--debug"){gm();continue}r.push(a)}let n=r[0];if(n==="--version"||n==="-v"||n==="-V")return e.stdout.write(`lmctl ${lt()}
2624
- `),0;if(n==="--help"||n==="-h"||n===void 0)return e.stdout.write(Qf),0;if(n==="help"){let[i,...a]=r.slice(1);return i===void 0||i==="--help"||i==="-h"?(e.stdout.write(Qf),0):rv.has(i)?nv(i,[...a,"--help"],e):sv(e,i)}om(le(),e.stderr),am(e.stderr);let[s,...o]=r;if(s===void 0)return e.stdout.write(Qf),0;El()&&e.stderr.write(`[debug] lmctl ${lt()} | node ${process.version} | cmd ${s} ${o.join(" ")}
2625
- [debug] cwd ${process.cwd()} | db ${le()}${process.env.LMCTL_WORKSPACE?` | workspace ${process.env.LMCTL_WORKSPACE}`:""}
2626
- `);try{let i=await nv(s,o,e);return rv.has(s)&&!Sl(r,e)&&await Tm(e,r),i}catch(i){return Bq(i,s,o,e)}}function Bq(t,e,r,n){let s=t instanceof Error?t:new Error(String(t));if(!El())return n.stderr.write(`error: ${s.message}
2621
+ `),1}async function Uq(t,e={stdout:process.stdout,stderr:process.stderr}){let r=ym();try{return await Wq(t,e)}finally{wm(r)}}async function Wq(t,e={stdout:process.stdout,stderr:process.stderr}){let r=[];for(let i=0;i<t.length;i+=1){let a=t[i];if(a==="--db"){let l=t[++i];if(l===void 0||l.startsWith("--"))return em(e,"missing value for --db");process.env.LMCTL_DB=l;continue}if(a==="--workspace"){let l=t[++i];if(l===void 0||l.startsWith("--"))return em(e,"missing value for --workspace");if(!Ge(l))return em(e,`invalid workspace name: ${l}`);process.env.LMCTL_WORKSPACE=l;continue}if(a==="--debug"){gm();continue}r.push(a)}let n=r[0];if(n==="--version"||n==="-v"||n==="-V")return e.stdout.write(`lmctl ${ct()}
2622
+ `),0;if(n==="--help"||n==="-h"||n===void 0)return e.stdout.write(Qf),0;if(n==="help"){let[i,...a]=r.slice(1);return i===void 0||i==="--help"||i==="-h"?(e.stdout.write(Qf),0):rv.has(i)?nv(i,[...a,"--help"],e):sv(e,i)}om(le(),e.stderr),am(e.stderr);let[s,...o]=r;if(s===void 0)return e.stdout.write(Qf),0;El()&&Le({event:"legacy",msg:`[debug] lmctl ${ct()} | node ${process.version} | cmd ${s} ${o.join(" ")}
2623
+ [debug] cwd ${process.cwd()} | db ${le()}${process.env.LMCTL_WORKSPACE?` | workspace ${process.env.LMCTL_WORKSPACE}`:""}`},{always:!0});try{let i=await nv(s,o,e);return rv.has(s)&&!Sl(r,e)&&await Tm(e,r),i}catch(i){return Bq(i,s,o,e)}}function Bq(t,e,r,n){let s=t instanceof Error?t:new Error(String(t));if(!El())return n.stderr.write(`error: ${s.message}
2627
2624
  `),n.stderr.write(`(re-run with --debug for the full stack trace and context)
2628
2625
  `),1;n.stderr.write(`error: ${s.message}
2629
2626
  `),n.stderr.write(` command: lmctl ${e} ${r.join(" ")}
2630
- `),n.stderr.write(` lmctl ${lt()} | node ${process.version}
2627
+ `),n.stderr.write(` lmctl ${ct()} | node ${process.version}
2631
2628
  `),s.stack&&n.stderr.write(`${s.stack}
2632
2629
  `);let o=s.cause,i=0;for(;o!=null&&i<8;){let a=o instanceof Error?o:new Error(String(o));n.stderr.write(`caused by: ${a.message}
2633
2630
  `),a.stack&&n.stderr.write(`${a.stack}