@lmctl-ai/lmctl 0.1.140 → 0.1.142

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/cli/index.js +201 -181
  2. package/package.json +1 -1
package/dist/cli/index.js CHANGED
@@ -1,20 +1,20 @@
1
- var fk=Object.defineProperty;var T=(e,t)=>()=>(e&&(t=e(e=0)),t);var ye=(e,t)=>{for(var r in t)fk(e,r,{get:t[r],enumerable:!0})};import{existsSync as Hs,readdirSync as wH,readFileSync as mk}from"node:fs";import{homedir as pk,platform as Uf}from"node:os";import{join as Mt}from"node:path";function br(){let e=process.env.LMCTL_HOME;return e!==void 0&&e.length>0?e:Mt(pk(),_k)}function Js(){return Mt(br(),Wf)}function Xr(){return Mt(br(),hk)}function jt(e){return Mt(Xr(),e)}function Tr(e){return Mt(jt(e),Wf)}function Ga(e){return Mt(jt(e),"projects")}function Xs(){return Mt(br(),gk)}function ze(e){return!(e.length===0||e.length>64||!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(e)||e==="."||e==="..")}function Gs(){let e=Xs();if(!Hs(e))return null;try{let t=mk(e,"utf8").trim();return t.length===0||!ze(t)?null:t}catch{return null}}function Dt(){let e=process.env.LMCTL_WORKSPACE;return e!==void 0&&e.length>0&&ze(e)?e:Gs()}function le(e){if(e!==void 0&&e.length>0)return e;if(process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0)return process.env.LMCTL_DB;let t=Dt();if(t!==null)return Tr(t);let r=Js();return Hs(r)||!Hs(Xr())?r:Tr(Bf)}function Vs(e,t){return`workspace: ${process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0?"(overridden by --db)":e??"default"} db: ${t}`}function Ek(e,t=Uf()){return t!=="linux"?!1:e.startsWith("/mnt/c/")||e==="/mnt/c"}function qf(e,t=process.stderr,r=Uf()){Ek(e,r)&&t.write(`warning: DB on /mnt/c is slow; consider moving to ~/.lmctl/state.db (set LMCTL_DB or use --db)
2
- `)}function Va(){return Mt(br(),yk)}function Hf(){return Mt(br(),wk)}function Tk(){try{return Hs(Va())}catch{return!1}}function Jf(e=process.stderr){Tk()&&e.write(`note: legacy ~/.lmctl/profiles/ detected \u2014 run 'lmctl workspace migrate' to move it to ~/.lmctl/workspaces/
1
+ var fk=Object.defineProperty;var T=(e,t)=>()=>(e&&(t=e(e=0)),t);var ye=(e,t)=>{for(var r in t)fk(e,r,{get:t[r],enumerable:!0})};import{existsSync as Hs,readdirSync as SH,readFileSync as mk}from"node:fs";import{homedir as pk,platform as Uf}from"node:os";import{join as Mt}from"node:path";function br(){let e=process.env.LMCTL_HOME;return e!==void 0&&e.length>0?e:Mt(pk(),_k)}function Js(){return Mt(br(),Wf)}function Xr(){return Mt(br(),hk)}function jt(e){return Mt(Xr(),e)}function Tr(e){return Mt(jt(e),Wf)}function Xa(e){return Mt(jt(e),"projects")}function Xs(){return Mt(br(),gk)}function ze(e){return!(e.length===0||e.length>64||!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(e)||e==="."||e==="..")}function Gs(){let e=Xs();if(!Hs(e))return null;try{let t=mk(e,"utf8").trim();return t.length===0||!ze(t)?null:t}catch{return null}}function Dt(){let e=process.env.LMCTL_WORKSPACE;return e!==void 0&&e.length>0&&ze(e)?e:Gs()}function le(e){if(e!==void 0&&e.length>0)return e;if(process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0)return process.env.LMCTL_DB;let t=Dt();if(t!==null)return Tr(t);let r=Js();return Hs(r)||!Hs(Xr())?r:Tr(Bf)}function Vs(e,t){return`workspace: ${process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0?"(overridden by --db)":e??"default"} db: ${t}`}function Ek(e,t=Uf()){return t!=="linux"?!1:e.startsWith("/mnt/c/")||e==="/mnt/c"}function qf(e,t=process.stderr,r=Uf()){Ek(e,r)&&t.write(`warning: DB on /mnt/c is slow; consider moving to ~/.lmctl/state.db (set LMCTL_DB or use --db)
2
+ `)}function Ga(){return Mt(br(),yk)}function Hf(){return Mt(br(),wk)}function Tk(){try{return Hs(Ga())}catch{return!1}}function Jf(e=process.stderr){Tk()&&e.write(`note: legacy ~/.lmctl/profiles/ detected \u2014 run 'lmctl workspace migrate' to move it to ~/.lmctl/workspaces/
3
3
  `)}var _k,Wf,hk,gk,Bf,yk,wk,Sr,Je=T(()=>{"use strict";_k=".lmctl",Wf="state.db",hk="workspaces",gk="active-workspace",Bf="default",yk="profiles",wk="active-profile";Sr={default:Bf}});function kk(e){for(let t of vk)if(e.startsWith(t))return!0;if(e.startsWith("172.")){let t=Number(e.split(".")[1]);if(Number.isFinite(t)&&t>=16&&t<=31)return!0}return!!e.startsWith("169.254.")}function Ik(e){let t=e.toLowerCase();return!!(t==="::1"||t==="::"||t.startsWith("fe80:")||t.startsWith("fe80::"))}function Ak(e){let t=e.split(".");if(t.length!==4)return!1;for(let r of t){if(r.length===0||r.length>3)return!1;let n=Number(r);if(!Number.isFinite(n)||n<0||n>255)return!1}return!0}function Dn(e){let t=e;for(let{re:r,replacement:n}of Sk)t=t.replace(r,n);return t=t.replace(Nk,r=>!Ak(r)||kk(r)?r:Xf),t=t.replace(xk,r=>Ik(r)?r:Xf),t}function Pn(e){return e.split(`
4
4
  `).map(t=>Dn(t)).join(`
5
- `)}function Vf(e,t){let r=e.toUpperCase();return r.includes("TOKEN")||r.includes("SECRET")||r.includes("KEY")||r.includes("PASSWORD")||r.includes("PASSWD")||r.includes("CREDENTIAL")||r.includes("AUTH")?{key:e,value:st}:{key:e,value:Dn(t)}}function rr(e){if(typeof e=="string")return Dn(e);if(Array.isArray(e))return e.map(t=>rr(t));if(e!==null&&typeof e=="object"){let t={};for(let[r,n]of Object.entries(e)){let s=r.toUpperCase();s.includes("TOKEN")||s.includes("SECRET")||s.includes("KEY")||s.includes("PASSWORD")||s.includes("PASSWD")||s.includes("CREDENTIAL")?t[r]=typeof n=="string"?st:rr(n):t[r]=rr(n)}return t}return e}function Kf(e,t){for(let{name:r,re:n}of Rk){let s=t.match(n);if(s!==null&&!s[0].includes(st))throw new vr(e,r)}}var st,bk,Xf,Gf,Sk,vk,Nk,xk,Rk,vr,Ks=T(()=>{"use strict";st="[REDACTED]",bk="[REDACTED_EMAIL]",Xf="[REDACTED_IP]",Gf="[USER]",Sk=[{re:/(authorization\s*[:=]\s*)(bearer\s+[^\s,;"']+)/gi,replacement:`$1Bearer ${st}`},{re:/(authorization\s*[:=]\s*)(basic\s+[^\s,;"']+)/gi,replacement:`$1Basic ${st}`},{re:/\b(Bearer\s+)[A-Za-z0-9_\-./+=]{8,}/g,replacement:`$1${st}`},{re:/\bsk-ant-[A-Za-z0-9_\-]{8,}/g,replacement:st},{re:/\bsk-[A-Za-z0-9_\-]{16,}/g,replacement:st},{re:/\bgh[pousr]_[A-Za-z0-9]{30,}/g,replacement:st},{re:/\bAKIA[0-9A-Z]{16}\b/g,replacement:st},{re:/\b(api[_-]?key|token|secret|password|passwd)(\s*[:=]\s*"?)([A-Za-z0-9_\-./+=]{8,})("?)/gi,replacement:`$1$2${st}$4`},{re:/(\/home\/)[^/\s"'`]+/g,replacement:`$1${Gf}`},{re:/(\/Users\/)[^/\s"'`]+/g,replacement:`$1${Gf}`},{re:/\b[A-Za-z0-9._%+\-]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,}\b/g,replacement:bk}],vk=["127.","10.","192.168.","0.0.0.0"];Nk=/\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/g,xk=/\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;Rk=[{name:"sk-ant",re:/\bsk-ant-[A-Za-z0-9_\-]{8,}/},{name:"sk-openai",re:/\bsk-[A-Za-z0-9_\-]{16,}/},{name:"github-pat",re:/\bgh[pousr]_[A-Za-z0-9]{30,}/},{name:"aws-akid",re:/\bAKIA[0-9A-Z]{16}\b/},{name:"bearer",re:/\bBearer\s+[A-Za-z0-9_\-./+=]{8,}/},{name:"email",re:/\b[A-Za-z0-9._%+\-]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,}\b/},{name:"home-path",re:/\/home\/(?!\[USER\])[^/\s"'`]+/},{name:"users-path",re:/\/Users\/(?!\[USER\])[^/\s"'`]+/}],vr=class extends Error{bundlePath;patternName;constructor(t,r){super(`sanitization failed: ${r} pattern matched in ${t}`),this.bundlePath=t,this.patternName=r,this.name="SanitizationError"}}});import{spawnSync as Ka}from"node:child_process";import{readFileSync as Lk}from"node:fs";import{readFile as za,stat as Yf}from"node:fs/promises";import{homedir as Ok}from"node:os";import{join as $k}from"node:path";import{fileURLToPath as Ck}from"node:url";function yt(){try{let e=new URL("../../package.json",import.meta.url),t=JSON.parse(Lk(Ck(e),"utf8"));if(typeof t.version=="string")return t.version}catch{}return"0.0.0"}async function zf(e){let t=new Set(e.include??Ys),r={};return t.has("serve")&&(r.serve=await jk(e)),t.has("db")&&(r.db=Dk(e)),t.has("runs")&&(r.runs=Pk(e)),t.has("jobs")&&(r.jobs=Fk(e)),t.has("attentions")&&(r.attentions=Uk(e)),t.has("env")&&(r.env=await Wk(e)),t.has("intents")&&(r.intents=await qk(e)),r}async function jk(e){let t=e.pidFile??process.env.LMCTL_PID_FILE,r=e.serveLog??process.env.LMCTL_SERVE_LOG,n=e.logTailLines??1e3,s=null,i="none";if(t!==void 0)try{let d=(await za(t,"utf8")).trim(),u=Number.parseInt(d,10);Number.isInteger(u)&&u>0&&(s=u,i="pidfile")}catch{}let o=null;if(s!==null)try{process.kill(s,0),o=!0}catch{o=!1}let a="",l=null,c=0;if(r===void 0)l="no serve log configured (set LMCTL_SERVE_LOG or --serve-log)";else try{let u=(await za(r,"utf8")).split(`
5
+ `)}function Vf(e,t){let r=e.toUpperCase();return r.includes("TOKEN")||r.includes("SECRET")||r.includes("KEY")||r.includes("PASSWORD")||r.includes("PASSWD")||r.includes("CREDENTIAL")||r.includes("AUTH")?{key:e,value:st}:{key:e,value:Dn(t)}}function rr(e){if(typeof e=="string")return Dn(e);if(Array.isArray(e))return e.map(t=>rr(t));if(e!==null&&typeof e=="object"){let t={};for(let[r,n]of Object.entries(e)){let s=r.toUpperCase();s.includes("TOKEN")||s.includes("SECRET")||s.includes("KEY")||s.includes("PASSWORD")||s.includes("PASSWD")||s.includes("CREDENTIAL")?t[r]=typeof n=="string"?st:rr(n):t[r]=rr(n)}return t}return e}function Kf(e,t){for(let{name:r,re:n}of Rk){let s=t.match(n);if(s!==null&&!s[0].includes(st))throw new vr(e,r)}}var st,bk,Xf,Gf,Sk,vk,Nk,xk,Rk,vr,Ks=T(()=>{"use strict";st="[REDACTED]",bk="[REDACTED_EMAIL]",Xf="[REDACTED_IP]",Gf="[USER]",Sk=[{re:/(authorization\s*[:=]\s*)(bearer\s+[^\s,;"']+)/gi,replacement:`$1Bearer ${st}`},{re:/(authorization\s*[:=]\s*)(basic\s+[^\s,;"']+)/gi,replacement:`$1Basic ${st}`},{re:/\b(Bearer\s+)[A-Za-z0-9_\-./+=]{8,}/g,replacement:`$1${st}`},{re:/\bsk-ant-[A-Za-z0-9_\-]{8,}/g,replacement:st},{re:/\bsk-[A-Za-z0-9_\-]{16,}/g,replacement:st},{re:/\bgh[pousr]_[A-Za-z0-9]{30,}/g,replacement:st},{re:/\bAKIA[0-9A-Z]{16}\b/g,replacement:st},{re:/\b(api[_-]?key|token|secret|password|passwd)(\s*[:=]\s*"?)([A-Za-z0-9_\-./+=]{8,})("?)/gi,replacement:`$1$2${st}$4`},{re:/(\/home\/)[^/\s"'`]+/g,replacement:`$1${Gf}`},{re:/(\/Users\/)[^/\s"'`]+/g,replacement:`$1${Gf}`},{re:/\b[A-Za-z0-9._%+\-]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,}\b/g,replacement:bk}],vk=["127.","10.","192.168.","0.0.0.0"];Nk=/\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/g,xk=/\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;Rk=[{name:"sk-ant",re:/\bsk-ant-[A-Za-z0-9_\-]{8,}/},{name:"sk-openai",re:/\bsk-[A-Za-z0-9_\-]{16,}/},{name:"github-pat",re:/\bgh[pousr]_[A-Za-z0-9]{30,}/},{name:"aws-akid",re:/\bAKIA[0-9A-Z]{16}\b/},{name:"bearer",re:/\bBearer\s+[A-Za-z0-9_\-./+=]{8,}/},{name:"email",re:/\b[A-Za-z0-9._%+\-]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,}\b/},{name:"home-path",re:/\/home\/(?!\[USER\])[^/\s"'`]+/},{name:"users-path",re:/\/Users\/(?!\[USER\])[^/\s"'`]+/}],vr=class extends Error{bundlePath;patternName;constructor(t,r){super(`sanitization failed: ${r} pattern matched in ${t}`),this.bundlePath=t,this.patternName=r,this.name="SanitizationError"}}});import{spawnSync as Va}from"node:child_process";import{readFileSync as Lk}from"node:fs";import{readFile as Ya,stat as Yf}from"node:fs/promises";import{homedir as Ok}from"node:os";import{join as $k}from"node:path";import{fileURLToPath as Ck}from"node:url";function yt(){try{let e=new URL("../../package.json",import.meta.url),t=JSON.parse(Lk(Ck(e),"utf8"));if(typeof t.version=="string")return t.version}catch{}return"0.0.0"}async function zf(e){let t=new Set(e.include??Ys),r={};return t.has("serve")&&(r.serve=await jk(e)),t.has("db")&&(r.db=Dk(e)),t.has("runs")&&(r.runs=Pk(e)),t.has("jobs")&&(r.jobs=Fk(e)),t.has("attentions")&&(r.attentions=Uk(e)),t.has("env")&&(r.env=await Wk(e)),t.has("intents")&&(r.intents=await qk(e)),r}async function jk(e){let t=e.pidFile??process.env.LMCTL_PID_FILE,r=e.serveLog??process.env.LMCTL_SERVE_LOG,n=e.logTailLines??1e3,s=null,i="none";if(t!==void 0)try{let d=(await Ya(t,"utf8")).trim(),u=Number.parseInt(d,10);Number.isInteger(u)&&u>0&&(s=u,i="pidfile")}catch{}let o=null;if(s!==null)try{process.kill(s,0),o=!0}catch{o=!1}let a="",l=null,c=0;if(r===void 0)l="no serve log configured (set LMCTL_SERVE_LOG or --serve-log)";else try{let u=(await Ya(r,"utf8")).split(`
6
6
  `),f=u.slice(Math.max(0,u.length-n));c=f.length,a=Pn(f.join(`
7
7
  `))}catch(d){l=`serve log unreadable: ${d instanceof Error?d.message:String(d)}`}return{pid:s,pid_source:i,pid_alive:o,log_tail_lines:c,log_tail:a,log_note:l}}function Dk(e){let{dal:t}=e,r="unknown";try{r=t.query("PRAGMA integrity_check;").map(o=>o.integrity_check??JSON.stringify(o)).join(`
8
- `)}catch(i){r=`integrity_check failed: ${i instanceof Error?i.message:String(i)}`}let n=0;try{n=t.query("PRAGMA user_version;")[0]?.user_version??0}catch{n=0}let s={};try{let i=t.query("SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' ORDER BY name");for(let{name:o}of i)try{let a=t.query(`SELECT COUNT(*) AS c FROM "${o.replace(/"/g,'""')}"`);s[o]=a[0]?.c??0}catch{s[o]=-1}}catch{}return{integrity_check:r,schema_version:n,table_counts:s}}function Pk(e){let{dal:t}=e,r=(e.now??new Date).toISOString(),n=(e.staleThresholdMin??60)*6e4,s=new Date(Date.parse(r)-n).toISOString(),i=t.query(`SELECT ${Ya} FROM run ORDER BY id DESC LIMIT 50`),o=t.query(`SELECT ${Ya} FROM run WHERE paused_at IS NOT NULL AND terminal_state IS NULL ORDER BY paused_at DESC LIMIT 50`),a=t.query(`SELECT ${Ya} FROM run
8
+ `)}catch(i){r=`integrity_check failed: ${i instanceof Error?i.message:String(i)}`}let n=0;try{n=t.query("PRAGMA user_version;")[0]?.user_version??0}catch{n=0}let s={};try{let i=t.query("SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' ORDER BY name");for(let{name:o}of i)try{let a=t.query(`SELECT COUNT(*) AS c FROM "${o.replace(/"/g,'""')}"`);s[o]=a[0]?.c??0}catch{s[o]=-1}}catch{}return{integrity_check:r,schema_version:n,table_counts:s}}function Pk(e){let{dal:t}=e,r=(e.now??new Date).toISOString(),n=(e.staleThresholdMin??60)*6e4,s=new Date(Date.parse(r)-n).toISOString(),i=t.query(`SELECT ${Ka} FROM run ORDER BY id DESC LIMIT 50`),o=t.query(`SELECT ${Ka} FROM run WHERE paused_at IS NOT NULL AND terminal_state IS NULL ORDER BY paused_at DESC LIMIT 50`),a=t.query(`SELECT ${Ka} 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:rr(i),stale:rr(a),paused:rr(o)}}function Fk(e){let{dal:t}=e,r=t.query("SELECT status, COUNT(*) AS c FROM job GROUP BY status"),n={pending:0,running:0,done:0,failed:0,paused:0};for(let{status:o,c:a}of r)o==="queued"?n.pending+=a:o==="running"?n.running+=a:o==="done"||o==="succeeded"?n.done+=a:o==="failed"?n.failed+=a:o==="paused"&&(n.paused+=a);let s=t.query("SELECT id FROM job WHERE status IN ('queued', 'available') ORDER BY id DESC LIMIT 100"),i=t.query("SELECT id FROM job WHERE status = 'running' ORDER BY id DESC LIMIT 100");return{queue_state:n,pending_ids:s.map(o=>o.id),running_ids:i.map(o=>o.id)}}function Uk(e){let{dal:t}=e,r=t.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:rr(r)}}async function Wk(e){let t=yt(),r=process.version,n=Ka("uname",["-a"],{encoding:"utf8"}),s=Pn((n.stdout??"").trim()),i=[],o=e.dbPath??process.env.LMCTL_DB;if(o!==void 0)try{await Yf(o);let d=Ka("du",["-sh",o],{encoding:"utf8"});d.status===0&&i.push(d.stdout.trim())}catch{}let a=e.sessiondir??process.env.LMCTL_SESSIONDIR;if(a!==void 0)try{await Yf(a);let d=Ka("du",["-sh",a],{encoding:"utf8"});d.status===0&&i.push(d.stdout.trim())}catch{}let l=i.length===0?"(no paths configured)":Pn(i.join(`
13
- `)),c=[];for(let d of Mk){let u=process.env[d];if(u===void 0){c.push({key:d,value:"(unset)"});continue}c.push(Vf(d,u))}return{lmctl_next_version:t,node_version:r,os_info:s,disk_usage:l,env_keys_present:c}}function Bk(){return process.env.LMCTL_INTENT_LOG??$k(Ok(),".lmctl","recent-intents.log")}async function qk(e){let t=e.intentLog??Bk(),r=e.intentLogTailLines??500;try{let s=(await za(t,"utf8")).split(`
12
+ FROM attention WHERE acknowledged_at IS NULL ORDER BY created_at DESC LIMIT 100`);return{unacked:rr(r)}}async function Wk(e){let t=yt(),r=process.version,n=Va("uname",["-a"],{encoding:"utf8"}),s=Pn((n.stdout??"").trim()),i=[],o=e.dbPath??process.env.LMCTL_DB;if(o!==void 0)try{await Yf(o);let d=Va("du",["-sh",o],{encoding:"utf8"});d.status===0&&i.push(d.stdout.trim())}catch{}let a=e.sessiondir??process.env.LMCTL_SESSIONDIR;if(a!==void 0)try{await Yf(a);let d=Va("du",["-sh",a],{encoding:"utf8"});d.status===0&&i.push(d.stdout.trim())}catch{}let l=i.length===0?"(no paths configured)":Pn(i.join(`
13
+ `)),c=[];for(let d of Mk){let u=process.env[d];if(u===void 0){c.push({key:d,value:"(unset)"});continue}c.push(Vf(d,u))}return{lmctl_next_version:t,node_version:r,os_info:s,disk_usage:l,env_keys_present:c}}function Bk(){return process.env.LMCTL_INTENT_LOG??$k(Ok(),".lmctl","recent-intents.log")}async function qk(e){let t=e.intentLog??Bk(),r=e.intentLogTailLines??500;try{let s=(await Ya(t,"utf8")).split(`
14
14
  `).filter(o=>o.length>0),i=s.slice(Math.max(0,s.length-r));return{source_path:t,tail_lines:i.length,tail:Pn(i.join(`
15
- `)),note:null}}catch(n){return n.code==="ENOENT"?{source_path:t,tail_lines:0,tail:"",note:"no intent log present (status never run on this host)"}:{source_path:t,tail_lines:0,tail:"",note:`intent log unreadable: ${n instanceof Error?n.message:String(n)}`}}}var Ys,Mk,Ya,Fn=T(()=>{"use strict";Ks();Ys=["serve","db","runs","jobs","attentions","env","intents"];Mk=["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"];Ya=["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 em,appendFileSync as Hk,mkdirSync as Jk,existsSync as $H,readdirSync as CH,unlinkSync as MH}from"node:fs";import{join as Zs,dirname as Xk}from"node:path";import{homedir as Gk}from"node:os";function Za(){return Zs(Gk(),".lmctl")}function tm(){Gr=!0,process.env.LMCTL_DEBUG="1"}function rm(){return{cliDebug:Gr,lmctlDebugEnv:process.env.LMCTL_DEBUG}}function nm(e){Gr=e.cliDebug,e.lmctlDebugEnv===void 0?delete process.env.LMCTL_DEBUG:process.env.LMCTL_DEBUG=e.lmctlDebugEnv}function ce(){if(Gr||process.env.LMCTL_DEBUG==="1")return!0;let e=Date.now();return e-Qf>=Vk&&(Zf=zk(),Qf=e),Zf}function sm(){return Gr||process.env.LMCTL_DEBUG==="1"}function Kk(){let e=new Date,t=e.getTimezoneOffset(),r=t<=0?"+":"-",n=String(Math.floor(Math.abs(t)/60)).padStart(2,"0"),s=String(Math.abs(t)%60).padStart(2,"0");return new Date(e.getTime()-t*6e4).toISOString().replace("Z",`${r}${n}:${s}`)}function Xe(e,t){if(t?.verbose){if(!Gr)return}else if(!t?.always&&!ce())return;try{Yk();let r={ts:new Date().toISOString(),pid:process.pid,vti:process.env.LMCTL_VTI??null,autocode_run_id:process.env.LMCTL_AUTOCODE_RUN_ID??void 0,...e};Hk(zs,JSON.stringify(r)+`
16
- `)}catch{}}function Yk(){if(!zs){let t=Kk().slice(0,13).replace("T","-");zs=Zs(Za(),`debug-${t}.log`)}Jk(Xk(zs),{recursive:!0})}function Le(...e){Xe({event:"legacy",msg:e.join(" ")})}function wt(...e){Xe({event:"legacy",msg:e.join(" ")},{verbose:!0})}function V(e){Xe(e,{always:!0})}function zk(){return Zk()||Qk()}function Zk(){try{let e=em(Zs(Za(),"config.toml"),"utf-8");for(let t of e.split(`
17
- `)){let r=t.trim();if(!r||r.startsWith("#"))continue;if(r.startsWith("["))break;let n=/^debug\s*=\s*(.+)$/.exec(r);if(n){let s=n[1].trim().toLowerCase().replace(/^["']|["']$/g,"");return s==="true"||s==="1"}}}catch{}return!1}function Qk(){try{let e=em(Zs(Za(),"config.json"),"utf-8"),t=JSON.parse(e);return t!==null&&typeof t=="object"&&!Array.isArray(t)&&t.debug===!0}catch{}return!1}var Gr,Zf,Qf,Vk,zs,ve=T(()=>{"use strict";Gr=!1,Zf=!1,Qf=0,Vk=5e3;zs=null});import{existsSync as yI}from"node:fs";import{createRequire as wI}from"node:module";function EI(){return el===null&&(el=wI(import.meta.url)("node:sqlite").DatabaseSync),el}function tl(e){return e.length===1&&TI(e[0])?[e[0]]:e}function TI(e){if(!sl(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function sl(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var el,rl,cm,nl,dm=T(()=>{"use strict";el=null;rl=class{name;handle;transactionDepth=0;savepointId=0;constructor(t,r={}){if(r.fileMustExist===!0&&t!==":memory:"&&!yI(t))throw new Error("unable to open database file");this.name=t,this.handle=new(EI())(t,{readOnly:r.readonly===!0}),this.exec("PRAGMA busy_timeout = 5000")}prepare(t){return new nl(this.handle.prepare(t))}exec(t){this.handle.exec(t),this.updateTransactionDepth(t)}pragma(t,r){let n=`PRAGMA ${t}`;if(t.includes("=")){this.exec(n);return}let s=this.prepare(n).get();return r?.simple===!0?s===void 0?void 0:Object.values(s)[0]:s}transaction(t){return(...r)=>{if(this.transactionDepth===0){this.exec("BEGIN");try{let s=t(...r);return this.exec("COMMIT"),s}catch(s){throw this.inTransaction&&this.exec("ROLLBACK"),s}}let n=`lmctl_sp_${this.savepointId+=1}`;this.exec(`SAVEPOINT ${n}`);try{let s=t(...r);return this.exec(`RELEASE ${n}`),s}catch(s){throw this.inTransaction&&(this.exec(`ROLLBACK TO ${n}`),this.exec(`RELEASE ${n}`)),s}}}get inTransaction(){return this.transactionDepth>0}close(){this.handle.close()}updateTransactionDepth(t){let r=t.trim().match(/^([A-Za-z]+)/)?.[1]?.toUpperCase();if(r!==void 0){if(r==="BEGIN"||r==="SAVEPOINT"){this.transactionDepth+=1;return}if(r==="COMMIT"){this.transactionDepth=Math.max(0,this.transactionDepth-1);return}if(r==="RELEASE"){this.transactionDepth=Math.max(0,this.transactionDepth-1);return}r==="ROLLBACK"&&!/^ROLLBACK\s+TO\b/i.test(t.trim())&&(this.transactionDepth=0)}}},cm=rl,nl=class{handle;rawMode=!1;constructor(t){this.handle=t,this.handle.setAllowBareNamedParameters(!0)}get(...t){let r=this.handle.get(...tl(t));return this.normalizeRow(r)}all(...t){return this.handle.all(...tl(t)).map(r=>this.normalizeRow(r))}run(...t){let r=this.handle.run(...tl(t));return{changes:Number(r.changes),lastInsertRowid:Number(r.lastInsertRowid)}}raw(){return this.rawMode=!0,this}normalizeRow(t){return t==null?t:this.rawMode&&sl(t)?Object.values(t):sl(t)?{...t}:t}}});import{existsSync as bI,mkdirSync as SI,readFileSync as fm}from"node:fs";import{homedir as vI}from"node:os";import{dirname as mm,join as kI,resolve as pm}from"node:path";import{fileURLToPath as II,pathToFileURL as NI}from"node:url";function il(e){e.dbPath!==":memory:"&&SI(mm(e.dbPath),{recursive:!0});let t=new cm(e.dbPath);t.pragma("journal_mode = WAL"),t.pragma("synchronous = NORMAL"),t.pragma("foreign_keys = ON");let r=gm(t);return r===0&&(t.exec(fm(hm,"utf8")),t.pragma(`user_version = ${AI}`)),RI(t,r),t}function RI(e,t){let r=t;if(r<2&&r!==0&&(e.exec(`
15
+ `)),note:null}}catch(n){return n.code==="ENOENT"?{source_path:t,tail_lines:0,tail:"",note:"no intent log present (status never run on this host)"}:{source_path:t,tail_lines:0,tail:"",note:`intent log unreadable: ${n instanceof Error?n.message:String(n)}`}}}var Ys,Mk,Ka,Fn=T(()=>{"use strict";Ks();Ys=["serve","db","runs","jobs","attentions","env","intents"];Mk=["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"];Ka=["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 em,appendFileSync as Hk,mkdirSync as Jk,existsSync as DH,readdirSync as PH,unlinkSync as FH}from"node:fs";import{join as Zs,dirname as Xk}from"node:path";import{homedir as Gk}from"node:os";function za(){return Zs(Gk(),".lmctl")}function tm(){Gr=!0,process.env.LMCTL_DEBUG="1"}function rm(){return{cliDebug:Gr,lmctlDebugEnv:process.env.LMCTL_DEBUG}}function nm(e){Gr=e.cliDebug,e.lmctlDebugEnv===void 0?delete process.env.LMCTL_DEBUG:process.env.LMCTL_DEBUG=e.lmctlDebugEnv}function ce(){if(Gr||process.env.LMCTL_DEBUG==="1")return!0;let e=Date.now();return e-Qf>=Vk&&(Zf=zk(),Qf=e),Zf}function sm(){return Gr||process.env.LMCTL_DEBUG==="1"}function Kk(){let e=new Date,t=e.getTimezoneOffset(),r=t<=0?"+":"-",n=String(Math.floor(Math.abs(t)/60)).padStart(2,"0"),s=String(Math.abs(t)%60).padStart(2,"0");return new Date(e.getTime()-t*6e4).toISOString().replace("Z",`${r}${n}:${s}`)}function Xe(e,t){if(t?.verbose){if(!Gr)return}else if(!t?.always&&!ce())return;try{Yk();let r={ts:new Date().toISOString(),pid:process.pid,vti:process.env.LMCTL_VTI??null,autocode_run_id:process.env.LMCTL_AUTOCODE_RUN_ID??void 0,...e};Hk(zs,JSON.stringify(r)+`
16
+ `)}catch{}}function Yk(){if(!zs){let t=Kk().slice(0,13).replace("T","-");zs=Zs(za(),`debug-${t}.log`)}Jk(Xk(zs),{recursive:!0})}function Le(...e){Xe({event:"legacy",msg:e.join(" ")})}function wt(...e){Xe({event:"legacy",msg:e.join(" ")},{verbose:!0})}function V(e){Xe(e,{always:!0})}function zk(){return Zk()||Qk()}function Zk(){try{let e=em(Zs(za(),"config.toml"),"utf-8");for(let t of e.split(`
17
+ `)){let r=t.trim();if(!r||r.startsWith("#"))continue;if(r.startsWith("["))break;let n=/^debug\s*=\s*(.+)$/.exec(r);if(n){let s=n[1].trim().toLowerCase().replace(/^["']|["']$/g,"");return s==="true"||s==="1"}}}catch{}return!1}function Qk(){try{let e=em(Zs(za(),"config.json"),"utf-8"),t=JSON.parse(e);return t!==null&&typeof t=="object"&&!Array.isArray(t)&&t.debug===!0}catch{}return!1}var Gr,Zf,Qf,Vk,zs,ve=T(()=>{"use strict";Gr=!1,Zf=!1,Qf=0,Vk=5e3;zs=null});import{existsSync as yI}from"node:fs";import{createRequire as wI}from"node:module";function EI(){return Qa===null&&(Qa=wI(import.meta.url)("node:sqlite").DatabaseSync),Qa}function el(e){return e.length===1&&TI(e[0])?[e[0]]:e}function TI(e){if(!nl(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function nl(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var Qa,tl,cm,rl,dm=T(()=>{"use strict";Qa=null;tl=class{name;handle;transactionDepth=0;savepointId=0;constructor(t,r={}){if(r.fileMustExist===!0&&t!==":memory:"&&!yI(t))throw new Error("unable to open database file");this.name=t,this.handle=new(EI())(t,{readOnly:r.readonly===!0}),this.exec("PRAGMA busy_timeout = 5000")}prepare(t){return new rl(this.handle.prepare(t))}exec(t){this.handle.exec(t),this.updateTransactionDepth(t)}pragma(t,r){let n=`PRAGMA ${t}`;if(t.includes("=")){this.exec(n);return}let s=this.prepare(n).get();return r?.simple===!0?s===void 0?void 0:Object.values(s)[0]:s}transaction(t){return(...r)=>{if(this.transactionDepth===0){this.exec("BEGIN");try{let s=t(...r);return this.exec("COMMIT"),s}catch(s){throw this.inTransaction&&this.exec("ROLLBACK"),s}}let n=`lmctl_sp_${this.savepointId+=1}`;this.exec(`SAVEPOINT ${n}`);try{let s=t(...r);return this.exec(`RELEASE ${n}`),s}catch(s){throw this.inTransaction&&(this.exec(`ROLLBACK TO ${n}`),this.exec(`RELEASE ${n}`)),s}}}get inTransaction(){return this.transactionDepth>0}close(){this.handle.close()}updateTransactionDepth(t){let r=t.trim().match(/^([A-Za-z]+)/)?.[1]?.toUpperCase();if(r!==void 0){if(r==="BEGIN"||r==="SAVEPOINT"){this.transactionDepth+=1;return}if(r==="COMMIT"){this.transactionDepth=Math.max(0,this.transactionDepth-1);return}if(r==="RELEASE"){this.transactionDepth=Math.max(0,this.transactionDepth-1);return}r==="ROLLBACK"&&!/^ROLLBACK\s+TO\b/i.test(t.trim())&&(this.transactionDepth=0)}}},cm=tl,rl=class{handle;rawMode=!1;constructor(t){this.handle=t,this.handle.setAllowBareNamedParameters(!0)}get(...t){let r=this.handle.get(...el(t));return this.normalizeRow(r)}all(...t){return this.handle.all(...el(t)).map(r=>this.normalizeRow(r))}run(...t){let r=this.handle.run(...el(t));return{changes:Number(r.changes),lastInsertRowid:Number(r.lastInsertRowid)}}raw(){return this.rawMode=!0,this}normalizeRow(t){return t==null?t:this.rawMode&&nl(t)?Object.values(t):nl(t)?{...t}:t}}});import{existsSync as bI,mkdirSync as SI,readFileSync as fm}from"node:fs";import{homedir as vI}from"node:os";import{dirname as mm,join as kI,resolve as pm}from"node:path";import{fileURLToPath as II,pathToFileURL as NI}from"node:url";function sl(e){e.dbPath!==":memory:"&&SI(mm(e.dbPath),{recursive:!0});let t=new cm(e.dbPath);t.pragma("journal_mode = WAL"),t.pragma("synchronous = NORMAL"),t.pragma("foreign_keys = ON");let r=gm(t);return r===0&&(t.exec(fm(hm,"utf8")),t.pragma(`user_version = ${AI}`)),RI(t,r),t}function RI(e,t){let r=t;if(r<2&&r!==0&&(e.exec(`
18
18
  CREATE TABLE IF NOT EXISTS session_size (
19
19
  id INTEGER PRIMARY KEY AUTOINCREMENT,
20
20
  team_name TEXT NOT NULL,
@@ -628,7 +628,7 @@ var fk=Object.defineProperty;var T=(e,t)=>()=>(e&&(t=e(e=0)),t);var ye=(e,t)=>{f
628
628
  FROM team_chat_log;
629
629
  DROP TABLE team_chat_log;
630
630
  ALTER TABLE team_chat_log_v46 RENAME TO team_chat_log;
631
- `)}finally{e.pragma("foreign_keys = ON")}}function gm(e){let t=e.pragma("user_version",{simple:!0});return typeof t=="number"?t:0}function LI(){return process.env.LMCTL_DB??kI(vI(),".lmctl","state.db")}var _m,hm,xI,AI,ym=T(()=>{"use strict";dm();_m=mm(II(import.meta.url)),hm=pm(_m,"schema.sql"),xI=pm(_m,"migrations"),AI=52;if(process.argv[1]&&import.meta.url===NI(process.argv[1]).href){let e=il({dbPath:process.argv[2]??LI()});try{process.stdout.write(`migrated user_version=${gm(e)}
631
+ `)}finally{e.pragma("foreign_keys = ON")}}function gm(e){let t=e.pragma("user_version",{simple:!0});return typeof t=="number"?t:0}function LI(){return process.env.LMCTL_DB??kI(vI(),".lmctl","state.db")}var _m,hm,xI,AI,ym=T(()=>{"use strict";dm();_m=mm(II(import.meta.url)),hm=pm(_m,"schema.sql"),xI=pm(_m,"migrations"),AI=52;if(process.argv[1]&&import.meta.url===NI(process.argv[1]).href){let e=sl({dbPath:process.argv[2]??LI()});try{process.stdout.write(`migrated user_version=${gm(e)}
632
632
  `)}finally{e.close()}}});function wm(e){return{getAgentInflight:e.prepare("SELECT * FROM agent_inflight WHERE receiver_teamfile = ? AND receiver_alias = ?"),listAgentInflight:e.prepare("SELECT * FROM agent_inflight ORDER BY started_at ASC, receiver_teamfile ASC, receiver_alias ASC"),acquireAgentInflight:e.prepare(`
633
633
  INSERT INTO agent_inflight (receiver_teamfile, receiver_alias, sender_teamfile, sender_alias, started_at, active_count, holder_pid)
634
634
  VALUES (@receiver_teamfile, @receiver_alias, @sender_teamfile, @sender_alias, @started_at, 1, @holder_pid)
@@ -955,7 +955,7 @@ var fk=Object.defineProperty;var T=(e,t)=>()=>(e&&(t=e(e=0)),t);var ye=(e,t)=>{f
955
955
  ORDER BY receiver_teamfile ASC, receiver_alias ASC, id ASC
956
956
  `),deleteMailboxMessage:e.prepare("DELETE FROM agent_mailbox WHERE id = ?")}}function Wn(e){if(Buffer.byteLength(e,"utf8")<=65536)return e;let r=Buffer.byteLength(vm,"utf8"),n=Math.max(0,65536-r),s=Buffer.from(e,"utf8"),i=n;for(;i>0&&(s[i]&192)===128;)i-=1;return`${s.subarray(0,i).toString("utf8")}${vm}`}var vm,Im=T(()=>{"use strict";vm=`
957
957
  ...[truncated]`});function Hn(e,t){return JSON.stringify([e,t])}function Nm(e){try{let t=JSON.parse(e);return typeof t.lock_id!="string"||typeof t.teamfile!="string"||typeof t.alias!="string"||typeof t.holder_pid!="number"||typeof t.holder_host!="string"||!Array.isArray(t.holder_ips)||!t.holder_ips.every(r=>typeof r=="string")||typeof t.started_at!="string"||typeof t.last_heartbeat!="string"?null:{lock_id:t.lock_id,teamfile:t.teamfile,alias:t.alias,holder_pid:t.holder_pid,holder_host:t.holder_host,holder_ips:t.holder_ips,started_at:t.started_at,last_heartbeat:t.last_heartbeat}}catch{return null}}var Bn,qn,xm=T(()=>{"use strict";Bn="terminal_lock",qn="member"});function Ft(e){if(!Number.isInteger(e)||(e??0)<=0)return!1;try{return process.kill(e,0),!0}catch(t){return(t!==null&&typeof t=="object"&&"code"in t?t.code:void 0)!=="ESRCH"}}var Qs=T(()=>{"use strict"});function Vr(e){return typeof e=="string"&&OI.has(e)}function Lm(e){return["Decide the workflow outcome. Reply with a final line:",` STANCE: <one of: ${e.length>0?e.join(" | "):"(this step declares no outcomes \u2014 escalate)"}>`,"If you cannot pick one of those declared outcomes, escalate to a","human instead \u2014 reply with exactly one of:",` STANCE: ${ei[0]}`,` STANCE: ${ei[1]}`,` STANCE: ${ei[2]}`,` STANCE: ${Am}: <one short sentence: why no declared outcome fits>`,"Never invent a different outcome; never leave the STANCE line out."].join(`
958
- `)}var Am,ei,OI,Jn,Rm,ol,ti,Xn=T(()=>{"use strict";Am="other",ei=["not_enough_information","dont_know","other_work"],OI=new Set([Am,...ei]),Jn="@abort",Rm="invalid_decision",ol="escalation_aborted",ti="workflow_escalation"});import{randomUUID as Om}from"node:crypto";import{hostname as Gn}from"node:os";function Fe(e){return e.provider_resolved??e.provider}function O(){return new Date().toISOString()}function Ie(e){return new al(il({dbPath:e.path}))}function $m(e,t,r){let n=Cm(t);if(n.length===0)return;let s=new Set,i=[],o=l=>{if(l===e)return n;let c=r(l);if(c===null)throw new Error(`unknown workflow reference: ${l}`);return Cm(c.definition)},a=l=>{let c=i.indexOf(l);if(c>=0)throw new Error(`cycle detected: ${[...i.slice(c),l].join(" -> ")}`);if(!s.has(l)){i.push(l);try{for(let d of o(l))a(d)}finally{i.pop()}s.add(l)}};a(e)}function Cm(e){let t=$I(e),r=t===null?null:CI(t,"states");if(r===null)return[];let n=[];for(let s of Object.values(r))ri(s)&&s.type==="Subflow"&&typeof s.workflow_name=="string"&&s.workflow_name.length>0&&n.push(s.workflow_name);return n}function $I(e){try{let t=JSON.parse(e);return ri(t)?t:null}catch{return null}}function CI(e,t){let r=e[t];return ri(r)?r:null}function ri(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function MI(e){try{let t=JSON.parse(e);return!ri(t)||typeof t.lock_id!="string"||typeof t.holder_pid!="number"||typeof t.holder_host!="string"||typeof t.started_at!="string"||typeof t.last_heartbeat!="string"?null:{lock_id:t.lock_id,holder_pid:t.holder_pid,holder_host:t.holder_host,started_at:t.started_at,last_heartbeat:t.last_heartbeat}}catch{return null}}function jI(e,t){return e===null?!0:e.holder_host===Gn()?!Ft(e.holder_pid):e.last_heartbeat<t}function DI(e,t){return e.delivering_at===null?!1:e.delivery_holder_host===Gn()&&PI(e.delivery_holder_pid)?!Ft(e.delivery_holder_pid):e.delivering_at<t}function PI(e){return Number.isInteger(e)&&(e??0)>0}function FI(e){return{...km(e),getRuntimeState:e.prepare("SELECT * FROM runtime_state WHERE scope = ? AND key = ? AND kind = ?"),upsertRuntimeState:e.prepare(`
958
+ `)}var Am,ei,OI,Jn,Rm,il,ti,Xn=T(()=>{"use strict";Am="other",ei=["not_enough_information","dont_know","other_work"],OI=new Set([Am,...ei]),Jn="@abort",Rm="invalid_decision",il="escalation_aborted",ti="workflow_escalation"});import{randomUUID as Om}from"node:crypto";import{hostname as Gn}from"node:os";function Fe(e){return e.provider_resolved??e.provider}function O(){return new Date().toISOString()}function Ie(e){return new ol(sl({dbPath:e.path}))}function $m(e,t,r){let n=Cm(t);if(n.length===0)return;let s=new Set,i=[],o=l=>{if(l===e)return n;let c=r(l);if(c===null)throw new Error(`unknown workflow reference: ${l}`);return Cm(c.definition)},a=l=>{let c=i.indexOf(l);if(c>=0)throw new Error(`cycle detected: ${[...i.slice(c),l].join(" -> ")}`);if(!s.has(l)){i.push(l);try{for(let d of o(l))a(d)}finally{i.pop()}s.add(l)}};a(e)}function Cm(e){let t=$I(e),r=t===null?null:CI(t,"states");if(r===null)return[];let n=[];for(let s of Object.values(r))ri(s)&&s.type==="Subflow"&&typeof s.workflow_name=="string"&&s.workflow_name.length>0&&n.push(s.workflow_name);return n}function $I(e){try{let t=JSON.parse(e);return ri(t)?t:null}catch{return null}}function CI(e,t){let r=e[t];return ri(r)?r:null}function ri(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function MI(e){try{let t=JSON.parse(e);return!ri(t)||typeof t.lock_id!="string"||typeof t.holder_pid!="number"||typeof t.holder_host!="string"||typeof t.started_at!="string"||typeof t.last_heartbeat!="string"?null:{lock_id:t.lock_id,holder_pid:t.holder_pid,holder_host:t.holder_host,started_at:t.started_at,last_heartbeat:t.last_heartbeat}}catch{return null}}function jI(e,t){return e===null?!0:e.holder_host===Gn()?!Ft(e.holder_pid):e.last_heartbeat<t}function DI(e,t){return e.delivering_at===null?!1:e.delivery_holder_host===Gn()&&PI(e.delivery_holder_pid)?!Ft(e.delivery_holder_pid):e.delivering_at<t}function PI(e){return Number.isInteger(e)&&(e??0)>0}function FI(e){return{...km(e),getRuntimeState:e.prepare("SELECT * FROM runtime_state WHERE scope = ? AND key = ? AND kind = ?"),upsertRuntimeState:e.prepare(`
959
959
  INSERT INTO runtime_state (scope, key, kind, data, updated_at)
960
960
  VALUES (?, ?, ?, ?, ?)
961
961
  ON CONFLICT(scope, key, kind) DO UPDATE SET
@@ -1355,54 +1355,54 @@ var fk=Object.defineProperty;var T=(e,t)=>()=>(e&&(t=e(e=0)),t);var ye=(e,t)=>{f
1355
1355
  error_detail = ?,
1356
1356
  truncated = ?
1357
1357
  WHERE id = ?
1358
- `),...bm(e),...wm(e)}}function UI(e,t){return t===void 0?{resumed:!1,reason:e}:{resumed:!1,reason:e,valid:t}}var al,Ze=T(()=>{"use strict";ym();Em();Sm();Im();xm();Qs();Xn();al=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;tryAcquireAgentInflightTxn;recvMailboxMessagesTxn;constructor(t){t.pragma("foreign_keys = ON"),this.db=t,this.stmts=FI(t),this.claimTxn=t.transaction((r,n,s)=>{let i=this.stmts.selectClaimableJob.get(s,s,s);return i===void 0||this.stmts.claimJob.run(r,n,s,i.id,s,s,s).changes!==1?null:this.getJob(i.id)}),this.claimWithConcurrencyTxn=t.transaction((r,n,s,i)=>{let o=this.stmts.selectClaimableJobs.all(s,s,s);for(let a of o){let l=this.getJob(a.id);if(l===null)continue;let c=i(l);if(c.concurrency_key!==null&&(l.concurrency_key_resolved!==c.concurrency_key&&this.stmts.setJobConcurrencyKey.run(c.concurrency_key,l.id),(this.stmts.countRunningByConcurrencyKey.get(c.concurrency_key,s,l.id)?.count??0)>=Math.max(1,c.concurrent_limit)))continue;if(this.stmts.claimJob.run(r,n,s,l.id,s,s,s).changes===1)return this.getJob(l.id)}return null}),this.claimByIdWithConcurrencyTxn=t.transaction((r,n,s,i,o)=>{let a=this.getJob(r);if(a===null)return{claimed:!1,reason:"not_found",job_id:r};if(a.locked_until!==null&&a.locked_until>=i)return{claimed:!1,reason:"locked",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let c=a.status==="queued"&&a.available_at<=i,d=a.status==="running"&&a.locked_until!==null&&a.locked_until<i;if(!c&&!d)return{claimed:!1,reason:"not_claimable",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let u=o(a);if(u.concurrency_key!==null&&(a.concurrency_key_resolved!==u.concurrency_key&&this.stmts.setJobConcurrencyKey.run(u.concurrency_key,a.id),(this.stmts.countRunningByConcurrencyKey.get(u.concurrency_key,i,a.id)?.count??0)>=Math.max(1,u.concurrent_limit)))return{claimed:!1,reason:"concurrency_limit",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};if(this.stmts.claimJob.run(n,s,i,a.id,i,i,i).changes!==1){let p=this.getJob(a.id);return{claimed:!1,reason:p?.locked_until!==null&&p?.locked_until!==void 0&&p.locked_until>=i?"locked":"not_claimable",job_id:r,status:p?.status??a.status,locked_by:p?.locked_by??a.locked_by,locked_until:p?.locked_until??a.locked_until}}let m=this.getJob(a.id);return m===null?{claimed:!1,reason:"not_found",job_id:r}:{claimed:!0,job:m}}),this.resumeRunTxn=t.transaction((r,n,s)=>UI("state_not_found")),this.resumeInteractiveTxn=t.transaction((r,n,s,i)=>{let o=this.getInteractiveSessionByStepId(r);if(o===null)return{resumed:!1,reason:"not_found"};if(o.status!=="waiting_operator")return{resumed:!1,reason:"not_waiting_operator"};let a=this.getRun(o.run_id);if(a===null)return{resumed:!1,reason:"run_not_found"};let l=s?"done":"waiting_agent";return this.stmts.updateInteractiveSession.run(l,n,Date.now(),o.id),this.stmts.resumeRunState.run(o.state_name,a.id),this.stmts.requeuePausedJob.run(i,a.job_id),{resumed:!0,session:this.getInteractiveSessionByStepId(r),run:this.getRun(a.id),job:this.getJob(a.job_id)}}),this.resumeEscalationTxn=t.transaction((r,n,s)=>{let i=this.stmts.getAttention.get(r);if(i===void 0)return{resumed:!1,reason:"not_found"};if(i.kind!==ti)return{resumed:!1,reason:"wrong_kind"};if(i.acknowledged_at!==null)return{resumed:!1,reason:"already_acked"};if(i.run_id===null)return{resumed:!1,reason:"run_not_found"};let o=null,a=[];if(i.payload!==null)try{let d=JSON.parse(i.payload);d.step!==void 0&&typeof d.step.id=="string"&&d.step.id.length>0&&(o=d.step.id),Array.isArray(d.declared_outcomes)&&(a=d.declared_outcomes.filter(u=>typeof u=="string"))}catch{}if(o===null)return{resumed:!1,reason:"no_step"};let l=this.getRun(i.run_id);if(l===null)return{resumed:!1,reason:"run_not_found"};if(n!==Jn&&!a.includes(n))return{resumed:!1,reason:Rm};let c={};if(l.pending_escalation_decision!==null)try{let d=JSON.parse(l.pending_escalation_decision);d!==null&&typeof d=="object"&&!Array.isArray(d)&&(c=d)}catch{c={}}return c[o]=n,this.stmts.setRunPendingEscalationDecision.run(JSON.stringify(c),l.id),this.stmts.resumeRunState.run(o,l.id),this.stmts.requeuePausedJob.run(s,l.job_id),this.stmts.ackAttention.run(s,r),{resumed:!0,run:this.getRun(l.id),job:this.getJob(l.job_id)}}),this.tryAcquireAgentInflightTxn=(r,n={})=>{this.db.exec("BEGIN IMMEDIATE");try{let s=n.reclaim_observed,i=this.stmts.acquireAgentInflight.get({...r,holder_pid:process.pid,stale_before:n.stale_before??null,force:n.force===!0?1:0,reclaim_observed_sender_teamfile:s?.sender_teamfile??null,reclaim_observed_sender_alias:s?.sender_alias??null,reclaim_observed_started_at:s?.started_at??null,reclaim_observed_holder_pid:typeof s?.holder_pid=="number"?s.holder_pid:null}),o=i!==void 0?{acquired:!0,current:i}:{acquired:!1,current:this.getAgentInflight(r.receiver_teamfile,r.receiver_alias)??(()=>{throw new Error("agent_inflight conflict row disappeared during acquire")})()};return this.db.exec("COMMIT"),o}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}},this.recvMailboxMessagesTxn=t.transaction((r,n)=>{let s=this.stmts.listAllMailboxMessagesForReceiver.all(r,n);for(let i of s)this.stmts.deleteMailboxMessage.run(i.id);return s})}close(){this.db.close()}query(t,...r){let n=t.trim().toLowerCase();if(!n.startsWith("select")&&!n.startsWith("with")&&!n.startsWith("pragma"))throw new Error("Dal.query only allows read-only SELECT/WITH/PRAGMA statements");return this.db.prepare(t).all(...r)}insertWorkflow(t){$m(t.name,t.definition,o=>this.getWorkflowByName(o));let r=this.stmts.insertWorkflow.run(t.name,t.version??1,t.definition_schema_version??1,t.definition,O()),n=this.getWorkflow(Number(r.lastInsertRowid)),s=this.stmts.insertWorkflowVersion.run(n.id,n.version,t.definition,t.author??null,O());this.stmts.updateWorkflowActiveVersion.run(s.lastInsertRowid,n.id),(t.source_uri!=null||t.source_sha256!=null)&&this.stmts.setWorkflowSource.run(t.source_uri??null,t.source_sha256??null,n.id);let i=this.getWorkflow(n.id);return this.syncWorkflowTriggers(n.id,t.definition),i}upsertWorkflow(t){$m(t.name,t.definition,o=>this.getWorkflowByName(o));let r=this.getWorkflowByName(t.name);if(r===null)return this.insertWorkflow({name:t.name,definition_schema_version:t.definition_schema_version,definition:t.definition,author:t.author,source_uri:t.source_uri,source_sha256:t.source_sha256});let s=(this.stmts.getLatestWorkflowVersion.get(r.id)?.version??r.version)+1,i=this.stmts.insertWorkflowVersion.run(r.id,s,t.definition,t.author??null,O());return this.stmts.updateWorkflowActiveVersionDefinitionAndVersion.run(Number(i.lastInsertRowid),t.definition,t.definition_schema_version??r.definition_schema_version,s,r.id),(t.source_uri!=null||t.source_sha256!=null)&&this.stmts.setWorkflowSource.run(t.source_uri??null,t.source_sha256??null,r.id),this.syncWorkflowTriggers(r.id,t.definition),this.getWorkflow(r.id)}insertCompositionUnit(t){this.stmts.insertCompositionUnit.run(t.name,t.version,t.lang,t.source,t.source_sha,t.compiled_workflow_version_id,O())}getWorkflow(t){return this.stmts.getWorkflow.get(t)??null}getWorkflowByName(t,r){return(r===void 0?this.stmts.findWorkflowLatest.get(t):this.stmts.findWorkflowVersion.get(t,r))??null}findWorkflowByName(t,r){return this.getWorkflowByName(t,r)}insertWorkflowVersion(t,r,n){let i=(this.stmts.getLatestWorkflowVersion.get(t)?.version??0)+1,o=this.stmts.insertWorkflowVersion.run(t,i,r,n??null,O());return this.stmts.getWorkflowVersion.get(o.lastInsertRowid)}activateWorkflowVersion(t,r){let n=this.getWorkflowVersionById(r);if(n===null||n.workflow_id!==t)return null;let s=1;try{let i=JSON.parse(n.definition);typeof i.definition_schema_version=="number"&&(s=i.definition_schema_version)}catch{}return this.stmts.updateWorkflowActiveVersionAndDefinition.run(r,n.definition,s,t),this.syncWorkflowTriggers(t,n.definition),this.getWorkflow(t)}getWorkflowVersionById(t){return this.stmts.getWorkflowVersion.get(t)??null}listWorkflowVersions(t){return this.stmts.listWorkflowVersions.all(t)}upsertTriggerInstance(t){return this.stmts.upsertTriggerInstance.run(t.workflow_id,t.trigger_id,t.trigger_type,t.parameters,t.enabled===!1?0:1,O()),this.stmts.getTriggerInstanceByWorkflowAndId.get(t.workflow_id,t.trigger_id)}listTriggerInstancesForWorkflow(t){return this.stmts.listTriggerInstancesForWorkflow.all(t)}listEnabledTriggerInstances(){return this.stmts.listEnabledTriggerInstances.all()}setTriggerCursor(t,r){return this.stmts.setTriggerCursor.run(r,O(),t),this.stmts.getTriggerInstance.get(t)??null}setTriggerFailure(t,r){return this.stmts.setTriggerFailure.run(O(),r,t),this.stmts.getTriggerInstance.get(t)??null}syncWorkflowTriggers(t,r){let n;try{n=JSON.parse(r)}catch{return}if(n===null||typeof n!="object"||Array.isArray(n))return;let s=n.triggers;if(Array.isArray(s))for(let i of s){if(i===null||typeof i!="object"||Array.isArray(i))continue;let o=i;typeof o.id!="string"||o.id.length===0||typeof o.type!="string"||o.type.length===0||this.upsertTriggerInstance({workflow_id:t,trigger_id:o.id,trigger_type:o.type,parameters:JSON.stringify(o.parameters??{})})}}insertTeam(t){let r=this.stmts.insertTeam.run(t.name,O());return this.stmts.getTeam.get(r.lastInsertRowid)}getTeam(t){return this.stmts.getTeam.get(t)??null}findTeamByName(t){return this.stmts.findTeamByName.get(t)??null}listTeams(){return this.stmts.listTeams.all()}insertTeamMember(t){let r=this.stmts.insertTeamMember.run(t.team_id,t.alias,t.role??"agent",t.provider,t.model??null,t.sessionid??null,t.sessiondir,O());return this.stmts.getTeamMember.get(r.lastInsertRowid)}listTeamMembers(t){return this.stmts.listTeamMembers.all(t)}findTeamMemberByAlias(t,r){return this.stmts.findTeamMemberByAlias.get(t,r)??null}updateTeamMemberSession(t,r){return this.stmts.updateTeamMemberSession.run(r,t),this.stmts.getTeamMember.get(t)??null}setMemberState(t,r,n){return this.stmts.setMemberState.run(r,n??null,O(),t),this.stmts.getTeamMember.get(t)??null}listMembersInState(t){return this.stmts.listMembersInState.all(t)}setMemberPromptSnapshot(t,r){return this.stmts.setMemberPromptSnapshot.run(r,t),this.stmts.getTeamMember.get(t)??null}setMemberProviderResolved(t,r){return this.stmts.setMemberProviderResolved.run(r,t),this.stmts.getTeamMember.get(t)??null}setMemberRolePrompt(t,r){return this.stmts.setMemberRolePrompt.run(r,t),this.stmts.getTeamMember.get(t)??null}updateTeamMemberMeta(t,r){let n=this.stmts.getTeamMember.get(t);if(n===void 0)return null;let s=Object.prototype.hasOwnProperty.call(r,"role_prompt"),i=Object.prototype.hasOwnProperty.call(r,"model"),o=Object.prototype.hasOwnProperty.call(r,"provider");return this.stmts.updateTeamMemberMeta.run(s?r.role_prompt??null:n.role_prompt,i?r.model??null:n.model,o?r.provider??n.provider:n.provider,t),this.stmts.getTeamMember.get(t)??null}insertTeamMemberCompanion(t){let r=this.stmts.insertTeamMemberCompanion.run(t.interpreter_id,t.companion_id,O());return this.stmts.getTeamMemberCompanion.get(r.lastInsertRowid)}insertProject(t){let r=this.stmts.insertProject.run(t.name,t.description??null,t.local_path,t.workflow_name,t.team_id,t.default_branch??null,t.intake_config??null,t.test_argv??null,t.test_command??null,t.durable_memory_mode??"folder",O());return this.stmts.getProject.get(r.lastInsertRowid)}listProjects(){return this.stmts.listProjects.all()}getProject(t){return this.stmts.getProject.get(t)??null}findProjectByName(t){return this.stmts.findProjectByName.get(t)??null}setProjectIntakeConfig(t,r){return this.stmts.setProjectIntakeConfig.run(r,t),this.stmts.getProject.get(t)??null}updateProjectSettings(t,r){let n=this.stmts.getProject.get(t);if(n===void 0)return null;let s=Object.prototype.hasOwnProperty.call(r,"local_path"),i=Object.prototype.hasOwnProperty.call(r,"durable_memory_mode"),o=Object.prototype.hasOwnProperty.call(r,"default_branch"),a=Object.prototype.hasOwnProperty.call(r,"intake_config");return this.stmts.updateProjectSettings.run(s?r.local_path:n.local_path,i?r.durable_memory_mode:n.durable_memory_mode,o?r.default_branch??null:n.default_branch,a?r.intake_config??null:n.intake_config,t),this.stmts.getProject.get(t)??null}listProjectsWithIntakeEnabled(){return this.stmts.listProjectsWithIntakeConfig.all().filter(t=>{if(t.intake_config===null)return!1;try{let r=JSON.parse(t.intake_config);return typeof r=="object"&&r!==null&&!Array.isArray(r)&&r.scan_github_issues===!0}catch{return!1}})}getProjectByJob(t){return this.stmts.getProjectByJob.get(t)??null}insertProjectWorkflow(t){let r=t.condition??null,n=this.stmts.findProjectWorkflowUnique.get(t.project_id,t.workflow_id,r);if(n!==void 0)return n;let s=this.stmts.insertProjectWorkflow.run(t.project_id,t.workflow_id,r,t.parameters_override??null,t.enabled===!1?0:1,t.priority??100,O());return s.changes===1?this.stmts.getProjectWorkflow.get(s.lastInsertRowid):this.stmts.findProjectWorkflowUnique.get(t.project_id,t.workflow_id,r)}getProjectWorkflow(t){return this.stmts.getProjectWorkflow.get(t)??null}listProjectWorkflows(t,r={}){return r.enabled_only===!0?this.stmts.listEnabledProjectWorkflows.all(t):this.stmts.listProjectWorkflows.all(t)}removeProjectWorkflow(t){return this.stmts.removeProjectWorkflow.run(t).changes>0}setProjectWorkflowEnabled(t,r){return this.stmts.setProjectWorkflowEnabled.run(r?1:0,t),this.getProjectWorkflow(t)}createIssue(t){let r=O(),n=this.stmts.createIssue.run(t.project_id,t.title,t.body,t.severity??"medium",t.labels??null,t.ai_test_path??null,t.source_run_id??null,r,r);return this.stmts.getIssue.get(n.lastInsertRowid)}getIssue(t){return this.stmts.getIssue.get(t)??null}listIssues(t,r={}){return this.stmts.listIssuesForProject.all(t).filter(n=>!(r.status!==void 0&&!r.status.includes(n.status)||r.severity!==void 0&&!r.severity.includes(n.severity)||r.ai_test_path!==void 0&&n.ai_test_path!==r.ai_test_path))}claimNextIssue(t,r){return this.stmts.claimNextIssue.get(r,O(),t)??null}claimIssue(t,r){return this.stmts.claimIssue.get(r,O(),t)??null}closeIssue(t,r,n){let s=O(),i=this.stmts.closeIssue.get(r,n??null,s,s,t);if(i===void 0)throw new Error(`issue not found: ${t}`);return i}reopenIssue(t,r){let n=this.stmts.reopenIssue.get(r,O(),t);if(n===void 0)throw this.getIssue(t)===null?new Error(`issue not found: ${t}`):new Error(`issue ${t} is not closed`);return n}updateIssue(t,r){let n=this.getIssue(t);if(n===null)throw new Error(`issue not found: ${t}`);let s=Object.prototype.hasOwnProperty.call(r,"labels"),i=Object.prototype.hasOwnProperty.call(r,"ai_test_path"),o=this.stmts.updateIssue.get(r.title??n.title,r.body??n.body,r.severity??n.severity,s?r.labels??null:n.labels,i?r.ai_test_path??null:n.ai_test_path,O(),t);if(o===void 0)throw new Error(`issue not found: ${t}`);return o}listWorkflows(){return this.stmts.listWorkflows.all()}getOrCreateWebuiSession(t,r){let n=this.stmts.getWebuiSession.get(t);if(n!==void 0)return n;let s=O();return this.stmts.insertWebuiSession.run(t,r,"N1",null,null,null,null,"authenticated",s,s),this.stmts.getWebuiSession.get(t)}getWebuiSession(t){return this.stmts.getWebuiSession.get(t)??null}updateWebuiSessionTransition(t,r,n,s,i){if(this.stmts.updateWebuiSessionTransition.run(r,n,s,i,O(),t).changes===0)throw new Error(`webui_session not found: ${t}`);return this.stmts.getWebuiSession.get(t)}setWebuiSessionChatbot(t,r){if(this.stmts.setWebuiSessionChatbot.run(r,O(),t).changes===0)throw new Error(`webui_session not found: ${t}`);return this.stmts.getWebuiSession.get(t)}createChatbotSession(t,r){let n=Om(),s=O();return this.stmts.insertChatbotSession.run(n,t,r??null,s,s,"active"),this.stmts.getChatbotSession.get(n)}getChatbotSession(t){return this.stmts.getChatbotSession.get(t)??null}listChatbotSessions(t){return this.stmts.listChatbotSessionsForUser.all(t)}appendChatbotMessage(t,r,n,s){let i=O(),o=this.stmts.insertChatbotMessage.run(t,r,n,s??null,i);return this.stmts.touchChatbotSession.run(i,t),this.stmts.getChatbotMessage.get(o.lastInsertRowid)}listChatbotMessages(t){return this.stmts.listChatbotMessages.all(t)}getConfig(t){return this.stmts.getConfig.get(t)?.value??null}setConfig(t,r){this.stmts.upsertConfig.run(t,r,O())}getConfigAll(){let t=this.stmts.listConfig.all(),r={};for(let n of t)r[n.key]=n.value;return r}enqueueJob(t){let r=this.stmts.insertJob.run(t.project_id,t.workflow_id_override??null,t.source,t.source_ref??null,t.payload??null,t.priority??0,t.available_at??O(),t.dedupe_key??null,t.concurrency_key??null,O());if(r.changes===1)return this.stmts.getJob.get(r.lastInsertRowid);if(t.dedupe_key===void 0||t.dedupe_key===null)throw new Error("job insert ignored without dedupe key");return this.stmts.findJobByDedupe.get(t.source,t.dedupe_key)}claimNextJob(t){let r=O(),n=new Date(Date.now()+t.lease_ms).toISOString();return this.claimTxn(t.worker_id,n,r)}claimNextJobWithConcurrency(t){let r=O(),n=new Date(Date.now()+t.lease_ms).toISOString();return this.claimWithConcurrencyTxn(t.worker_id,n,r,t.evaluator)}claimJobByIdWithConcurrency(t){let r=O(),n=new Date(Date.now()+t.lease_ms).toISOString();return this.claimByIdWithConcurrencyTxn(t.job_id,t.worker_id,n,r,t.evaluator)}releaseJob(t,r,n){let s=r==="queued"||r==="running"?null:O();return this.stmts.releaseJob.run(r,n??null,s,t),this.getJob(t)}getJob(t){return this.stmts.getJob.get(t)??null}findJobBySourceAndDedupe(t,r){return this.stmts.findJobByDedupe.get(t,r)??null}insertRun(t){let r=this.getWorkflow(t.workflow_id);if(r===null)throw new Error(`workflow not found: ${t.workflow_id}`);let n=this.stmts.insertRun.run(t.job_id,t.workflow_id,t.team_id,t.current_state??null,r.active_version_id,t.parent_run_id??null,O()),s=this.stmts.getRun.get(n.lastInsertRowid);return(t.parent_run_id===void 0||t.parent_run_id===null)&&this.stmts.setJobRun.run(s.id,t.job_id),s}setJobRun(t,r){return this.stmts.setJobRun.run(r,t),this.getJob(t)}insertPromptDispatch(t){return this.stmts.insertPromptDispatch.run(t.prompt_id,t.project_id,t.job_id,t.text,t.context_json??null,O()),this.stmts.getPromptDispatch.get(t.prompt_id)}getPromptDispatch(t){return this.stmts.getPromptDispatch.get(t)??null}setPromptDispatchCompleted(t,r){return this.stmts.setPromptDispatchCompleted.run(r??O(),t),this.getPromptDispatch(t)}getWorkspace(t){return this.stmts.getWorkspace.get(t)??null}ensureWorkspace(t={}){let r=t.id??"default";this.stmts.ensureWorkspace.run(r,t.name??"Default workspace",t.idleThresholdMs??6e5,O());let n=this.getWorkspace(r);if(n===null)throw new Error(`workspace ${r} missing after upsert`);return n}listWebProjectsActive(t){return this.stmts.listWebProjectsActive.all(t)}getWebProject(t){return this.stmts.getWebProject.get(t)??null}insertWebProject(t){let r=O(),n=this.stmts.insertWebProject.run(t.workspace_id,t.name,t.repo_path,t.config_json??null,t.linked_v4_project_id??null,r,r),s=Number(n.lastInsertRowid),i=this.getWebProject(s);if(i===null)throw new Error(`web_project ${s} missing after insert`);return i}updateWebProject(t){let r=this.getWebProject(t.id);return r===null||r.deleted_at!==null?null:(this.stmts.updateWebProject.run(t.name??r.name,t.config_json===void 0?r.config_json:t.config_json,O(),t.id),this.getWebProject(t.id))}softDeleteWebProject(t){return this.stmts.softDeleteWebProject.run(O(),t).changes===1}loadMailboxCursor(t,r){return this.stmts.loadMailboxCursor.get(t,r)??null}saveMailboxCursor(t){this.stmts.saveMailboxCursor.run(t.user_id,t.mailbox_key,t.last_processed_version_id,t.last_processed_seq??null,t.last_processed_at)}addUsage(t){this.stmts.addUsage.run(t.user_id,t.device_id,t.period,t.put,t.get,t.list,t.updated_at)}loadUsage(t,r,n){return this.stmts.loadUsage.get(t,r,n)??null}sumUsageForPeriod(t,r){let n=this.stmts.sumUsageForPeriod.get(t,r);return{put:n?.put??0,get:n?.get??0,list:n?.list??0}}upsertRootTeam(t){this.stmts.upsertRootTeam.run(t.teamfile_path,t.name,t.raw_text,t.raw_sha256,t.registered_at,t.last_seeded_at)}getRootTeam(t){return this.stmts.getRootTeam.get(t)??null}listRootTeams(){return this.stmts.listRootTeams.all()}insertTeamChatLog(t){let r=this.stmts.insertTeamChatLog.run(t.root_teamfile,t.sender_teamfile,t.sender_alias,t.receiver_teamfile,t.receiver_alias,t.message,t.response,t.origin,t.status,t.error_detail,t.truncated,t.created_at);return Number(r.lastInsertRowid)}listTeamChatLog(t){return this.stmts.listTeamChatLog.all(t)}listTeamChatLogSinceId(t,r=500){return this.stmts.listTeamChatLogSinceId.all(t,Math.max(1,Math.trunc(r)))}getMaxTeamChatLogId(){return this.stmts.getMaxTeamChatLogId.get()?.max_id??0}loadTeamChatLogCursor(t){return this.stmts.loadTeamChatLogCursor.get(t)??null}saveTeamChatLogCursor(t){this.stmts.saveTeamChatLogCursor.run(t.cursor_key,t.last_pushed_id,t.updated_at)}startTrackedInvocation(t){let r=t.started_at??O(),n=t.holder_host??Gn(),s=t.last_heartbeat_at??r,i=this.stmts.insertTrackedInvocation.run(t.kind,t.origin,t.scope_teamfile??null,t.from_identity,t.target_teamfile??null,t.target_alias??null,t.root_teamfile??null,t.cwd??null,Pt(t.command),r,t.holder_pid??null,n,s,Pt(t.meta),t.launch_source??t.kind,t.request_payload??null);return this.getTrackedInvocation(Number(i.lastInsertRowid))}getTrackedInvocation(t){return this.stmts.getTrackedInvocation.get(t)??null}listAllRunningTrackedInvocations(){return this.stmts.listAllRunningTrackedInvocations.all()}finishTrackedInvocation(t,r){let n=r.ended_at??O();return this.stmts.finishTrackedInvocation.run(r.status,n,r.exit_code??null,r.signal??null,Pt(r.result_summary),Pt(r.error),r.team_chat_log_id??null,Pt(r.meta),n,t).changes!==1?null:this.getTrackedInvocation(t)}reclaimTrackedInvocationIfUnchanged(t,r,n){let s=n.ended_at??O();return this.stmts.reclaimTrackedInvocationIfUnchanged.run(n.status,s,n.exit_code??null,n.signal??null,Pt(n.result_summary),Pt(n.error),n.team_chat_log_id??null,Pt(n.meta),s,t,r.holder_pid,r.holder_host,r.started_at,r.last_heartbeat_at).changes!==1?null:this.getTrackedInvocation(t)}heartbeatTrackedInvocation(t,r=O()){return this.stmts.heartbeatTrackedInvocation.run(r,t).changes!==1?null:this.getTrackedInvocation(t)}updateTrackedInvocationRequestPayload(t,r){return this.stmts.updateTrackedInvocationRequestPayload.run(r,t).changes!==1?null:this.getTrackedInvocation(t)}listClaimableTerminalTrackedInvocations(t){let r=["status IN ('done', 'error', 'busy', 'cancelled')","ended_at IS NOT NULL","notified_by IS NULL"],n=[];t.from!==void 0&&(r.push("from_identity = ?"),n.push(t.from)),t.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(t.scope_teamfile));let s=Math.max(1,Math.min(1e3,Math.trunc(t.limit??100)));return n.push(s),this.db.prepare(`SELECT * FROM tracked_invocation WHERE ${r.join(" AND ")} ORDER BY ended_at ASC, id ASC LIMIT ?`).all(...n)}claimTrackedInvocationNotification(t,r,n=O()){return this.stmts.claimTrackedInvocationNotification.run(r,n,t).changes!==1?null:this.getTrackedInvocation(t)}listTrackedInvocations(t={}){let r=[],n=[];t.from!==void 0&&(r.push("from_identity = ?"),n.push(t.from)),t.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(t.scope_teamfile)),t.status!==void 0&&(r.push("status = ?"),n.push(t.status)),t.kind!==void 0&&(r.push("kind = ?"),n.push(t.kind)),t.origin!==void 0&&(r.push("origin = ?"),n.push(t.origin));let s=Math.max(1,Math.min(1e3,Math.trunc(t.limit??100)));n.push(s);let i=r.length===0?"":` WHERE ${r.join(" AND ")}`;return this.db.prepare(`SELECT * FROM tracked_invocation${i} ORDER BY started_at DESC, id DESC LIMIT ?`).all(...n)}maxTrackedInvocationId(t={}){let r=[],n=[];t.from!==void 0&&(r.push("from_identity = ?"),n.push(t.from)),t.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(t.scope_teamfile));let s=r.length===0?"":` WHERE ${r.join(" AND ")}`,i=this.db.prepare(`SELECT COALESCE(MAX(id), 0) AS max_id FROM tracked_invocation${s}`).get(...n);return Number(i?.max_id??0)}listRunningTrackedInvocations(t={}){return this.listTrackedInvocations({...t,status:"running"})}enqueueMail(t){return this.sendMailboxMessage(t)}sendMailboxMessage(t){let r=this.stmts.insertMailboxMessage.run(t.receiver_teamfile,t.receiver_alias,t.sender_teamfile??null,t.sender_alias??null,t.root_teamfile??null,Wn(t.payload),t.created_at??O(),t.remote_transport??null,t.remote_message_id??null,t.remote_thread_id??null,t.meta??null,t.message_type??"request",t.reply_mode??"pull",t.request_mailbox_id??null);return this.getMailboxMessage(Number(r.lastInsertRowid))}listEnqueuedRequestMailFromSender(t,r,n,s){return this.stmts.listEnqueuedRequestMailFromSender.all(t,r,n,s)}listEnqueuedResponseMailFromSender(t,r,n,s){return this.stmts.listEnqueuedResponseMailFromSender.all(t,r,n,s)}listRelayMailboxLanes(t){return this.stmts.listRelayMailboxLanes.all(Math.max(1,Math.trunc(t)))}markMailDelivered(t,r,n){let s=[...new Set(t.map(o=>Math.trunc(o)).filter(o=>Number.isInteger(o)&&o>0))];if(s.length===0)return 0;let i=Wn(r);this.db.exec("BEGIN IMMEDIATE");try{let o=0;for(let a of s)o+=this.stmts.markMailboxMessageDelivered.run(n,i,a).changes;return this.db.exec("COMMIT"),o}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}markRelayRequestDelivered(t,r,n){let s=Wn(r);this.db.exec("BEGIN IMMEDIATE");try{let i=0;for(let o of t)this.stmts.markMailboxMessageDeliveredIfUnchanged.run(n,s,o.id,o.delivering_at,o.delivery_holder_pid,o.delivery_holder_host).changes===1&&(i+=1);return this.db.exec("COMMIT"),i}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}markRelayRequestDeliveredAndEnqueueResponses(t,r,n){let s=Wn(r);this.db.exec("BEGIN IMMEDIATE");try{let i=0,o=0;for(let a of t){if(this.stmts.markMailboxMessageDeliveredIfUnchanged.run(n,s,a.id,a.delivering_at,a.delivery_holder_pid,a.delivery_holder_host).changes!==1||(i+=1,a.sender_teamfile===null||a.sender_alias===null))continue;let c=this.stmts.insertMailboxResponseIfAbsent.run(a.sender_teamfile,a.sender_alias,a.receiver_teamfile,a.receiver_alias,a.root_teamfile,s,n,null,null,null,null,a.reply_mode,a.id);o+=c.changes}return this.db.exec("COMMIT"),{marked:i,responses:o}}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}claimMailForDelivery(t,r,n=process.pid,s=Gn()){let i=[...new Set(t.map(o=>Math.trunc(o)).filter(o=>Number.isInteger(o)&&o>0))];if(i.length===0)return[];this.db.exec("BEGIN IMMEDIATE");try{let o=[];for(let a of i)if(this.stmts.claimMailboxMessageDelivery.run(r,n,s,a).changes===1){let c=this.getMailboxMessage(a);c!==null&&o.push(c)}return this.db.exec("COMMIT"),o}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}clearMailDelivery(t){let r=[...new Set(t.map(n=>Math.trunc(n)).filter(n=>Number.isInteger(n)&&n>0))];if(r.length===0)return 0;this.db.exec("BEGIN IMMEDIATE");try{let n=0;for(let s of r)n+=this.stmts.clearMailboxMessageDelivery.run(s).changes;return this.db.exec("COMMIT"),n}catch(n){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),n}}reclaimMailboxDeliveryIfUnchanged(t){return this.stmts.clearMailboxMessageDeliveryIfUnchanged.run(t.id,t.delivering_at,t.delivery_holder_pid,t.delivery_holder_host).changes!==1?null:this.getMailboxMessage(t.id)}reclaimStaleMailboxDeliveries(t){let r=this.stmts.listInFlightMailboxDeliveries.all(),n=[];this.db.exec("BEGIN IMMEDIATE");try{for(let s of r){if(!DI(s,t))continue;let i=this.reclaimMailboxDeliveryIfUnchanged(s);i!==null&&n.push(i)}return this.db.exec("COMMIT"),n}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}listDeliveredReceiptsForSender(t,r){return this.stmts.listDeliveredReceiptsForSender.all(t,r)}listOutboundPendingForSender(t,r){return this.stmts.listOutboundPendingForSender.all(t,r)}getMailboxMessage(t){return this.stmts.getMailboxMessage.get(t)??null}peekMailboxMessages(t,r=1e3){return this.stmts.listMailboxMessagesForReceiver.all(t.receiver_teamfile,t.receiver_alias,Math.max(1,Math.min(1e3,Math.trunc(r))))}recvMailboxMessages(t){return this.recvMailboxMessagesTxn(t.receiver_teamfile,t.receiver_alias)}updateTeamChatLogResponse(t,r){this.stmts.updateTeamChatLogResponse.run(r.response,r.status,r.error_detail,r.truncated,t)}getAgentInflight(t,r){return this.stmts.getAgentInflight.get(t,r)??null}listAgentInflight(){return this.stmts.listAgentInflight.all()}tryAcquireAgentInflight(t,r){return this.tryAcquireAgentInflightTxn(t,r)}clearAgentInflight(t,r){this.stmts.clearAgentInflight.run(t,r)}clearObservedTerminalAgentInflight(t,r,n){return this.stmts.clearObservedTerminalAgentInflight.run({receiver_teamfile:t,receiver_alias:r,observed_sender_teamfile:n.sender_teamfile,observed_sender_alias:n.sender_alias,observed_started_at:n.started_at,observed_holder_pid:n.holder_pid}).changes===1}releaseAgentInflight(t){this.db.exec("BEGIN IMMEDIATE");try{let r=this.getAgentInflight(t.receiver_teamfile,t.receiver_alias);if(r===null||r.sender_teamfile!==t.sender_teamfile||r.sender_alias!==t.sender_alias)return this.db.exec("COMMIT"),!1;if(r.active_count<=1)return this.stmts.clearAgentInflightIfSender.run(t.receiver_teamfile,t.receiver_alias,t.sender_teamfile,t.sender_alias),this.db.exec("COMMIT"),!0;let n=this.stmts.decrementAgentInflight.run(t.receiver_teamfile,t.receiver_alias,t.sender_teamfile,t.sender_alias);return this.db.exec("COMMIT"),n.changes===1}catch(r){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),r}}clearAgentInflightOlderThan(t){return this.stmts.clearAgentInflightOlderThan.run(t).changes}getTerminalLock(t,r){let n=this.stmts.getRuntimeState.get(Bn,Hn(t,r),qn);return n===void 0?null:Nm(n.data)}setTerminalLock(t){this.stmts.upsertRuntimeState.run(Bn,Hn(t.teamfile,t.alias),qn,JSON.stringify(t),t.last_heartbeat)}heartbeatTerminalLock(t,r,n,s){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getTerminalLock(t,r);if(i===null||i.lock_id!==n)return this.db.exec("COMMIT"),!1;let o={...i,last_heartbeat:s};return this.stmts.upsertRuntimeState.run(Bn,Hn(t,r),qn,JSON.stringify(o),s),this.db.exec("COMMIT"),!0}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}clearTerminalLock(t,r,n){this.db.exec("BEGIN IMMEDIATE");try{let s=this.getTerminalLock(t,r);if(s===null||s.lock_id!==n)return this.db.exec("COMMIT"),!1;let i=this.stmts.deleteRuntimeState.run(Bn,Hn(t,r),qn);return this.db.exec("COMMIT"),i.changes===1}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}getRuntimeProcessLock(t,r,n){let s=this.stmts.getRuntimeState.get(t,r,n);return s===void 0?null:MI(s.data)}tryAcquireRuntimeProcessLock(t,r,n,s,i=O()){this.db.exec("BEGIN IMMEDIATE");try{let o=this.getRuntimeProcessLock(t,r,n);if(o!==null&&!jI(o,s))return this.db.exec("COMMIT"),{acquired:!1,current:o};let a={lock_id:Om(),holder_pid:process.pid,holder_host:Gn(),started_at:i,last_heartbeat:i};return this.stmts.upsertRuntimeState.run(t,r,n,JSON.stringify(a),i),this.db.exec("COMMIT"),{acquired:!0,lock:a,previous:o}}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}clearRuntimeProcessLock(t,r,n,s){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getRuntimeProcessLock(t,r,n);if(i===null||i.lock_id!==s)return this.db.exec("COMMIT"),!1;let o=this.stmts.deleteRuntimeState.run(t,r,n);return this.db.exec("COMMIT"),o.changes===1}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}getRun(t){return this.stmts.getRun.get(t)??null}setRunCurrentState(t,r){return this.stmts.setRunCurrentState.run(r,t),this.stmts.getRun.get(t)??null}setRunPausedState(t,r,n){return this.stmts.setRunPausedState.run(r,n,t),this.stmts.getRun.get(t)??null}setRunPendingEscalationDecision(t,r){return this.stmts.setRunPendingEscalationDecision.run(r,t),this.stmts.getRun.get(t)??null}setRunTerminalState(t,r){return this.stmts.setRunTerminalState.run(r,O(),t),this.stmts.getRun.get(t)??null}pauseJob(t){return this.stmts.pauseJob.run(t),this.getJob(t)}resumeRun(t,r){return this.resumeRunTxn(t,r,O())}insertStep(t){let r=this.stmts.insertStep.run(t.run_id,t.parent_step_id??null,t.state_name,t.outcome??null,t.status_detail??null,O());return this.stmts.getStep.get(r.lastInsertRowid)}finishStep(t,r,n){return this.stmts.finishStep.run(r??null,n??null,O(),t),this.stmts.getStep.get(t)??null}listStepsForRun(t){return this.stmts.listStepsForRun.all(t)}listLatestStepOutcomesByState(t){let r=this.stmts.listLatestStepOutcomesByState.all(t),n={};for(let s of r)n[s.state_name]=s.outcome;return n}insertSubmittedPr(t){let r=this.stmts.insertSubmittedPr.run(t.repo,t.pr_url,t.issue_url??null,t.local_path??null,t.branch??null,t.head_sha??null,t.status??"watching",t.submitted_at??O(),t.last_known_state??null,t.created_by_run_id??null);return this.stmts.getSubmittedPr.get(r.lastInsertRowid)}listSubmittedPrs(t){return t?.status!==void 0?this.stmts.listSubmittedPrsByStatus.all(t.status):this.stmts.listSubmittedPrs.all()}getSubmittedPr(t){return this.stmts.getSubmittedPr.get(t)??null}findSubmittedPrByUrl(t){return this.stmts.findSubmittedPrByUrl.get(t)??null}insertStepArtifact(t){let r=this.stmts.insertStepArtifact.run(t.step_id,t.kind,t.path??null,t.content??null,t.sha??null,t.provider_call_mode??null,O());return this.stmts.getStepArtifact.get(r.lastInsertRowid)}insertExternalObject(t){let n=this.stmts.insertExternalObject.run(t.type,t.provider,t.project_id,t.run_id??null,t.external_id,t.url??null,t.status??null,t.metadata??null,t.last_seen_at??null,O()).changes===1;return{row:this.stmts.findExternalObjectByUnique.get(t.provider,t.type,t.external_id),inserted:n}}insertExternalSignal(t){let r=this.stmts.insertExternalSignal.run(t.object_id,t.kind,t.source??null,t.occurred_at??null,t.payload??null,t.signal_hash??null,null,O()),n=r.changes===1;return{row:t.signal_hash===void 0||t.signal_hash===null?this.stmts.getExternalSignal.get(r.lastInsertRowid):this.stmts.findExternalSignalByUnique.get(t.object_id,t.kind,t.signal_hash),inserted:n}}raiseAttention(t){let r=this.stmts.insertAttention.run(t.kind,t.severity??"warn",t.project_id??null,t.run_id??null,t.external_object_id??null,t.requires_user===!0?1:0,t.payload??null,O());return this.stmts.getAttention.get(r.lastInsertRowid)}acknowledgeAttention(t){return this.stmts.ackAttention.run(O(),t),this.stmts.getAttention.get(t)??null}upsertDurableMemory(t){let r=O();return this.stmts.upsertDurableMemory.run(t.project_id,t.type,t.name,t.description??null,t.body,r,r),this.stmts.getDurableMemoryByName.get(t.project_id,t.name)}getDurableMemoryByName(t,r){return this.stmts.getDurableMemoryByName.get(t,r)??null}deleteDurableMemory(t,r){return this.stmts.deleteDurableMemory.run(t,r).changes>0}listDurableMemory(t,r){return r!==void 0?this.stmts.listDurableMemoryByType.all(t,r):this.stmts.listDurableMemory.all(t)}indexDurableMemory(t,r){return r!==void 0&&r.length>0?this.stmts.listDurableMemory.all(t).filter(s=>r.includes(s.type)).map(({name:s,description:i,type:o,updated_at:a})=>({name:s,description:i,type:o,updated_at:a})):this.stmts.listDurableMemory.all(t).map(({name:n,description:s,type:i,updated_at:o})=>({name:n,description:s,type:i,updated_at:o}))}recordSessionSize(t){let r=this.stmts.insertSessionSize.run(t.team_name,t.alias,t.sessionid,t.input_tokens??null,t.cache_tokens??null,t.output_tokens??null,t.total_tokens??null,t.observed_at??O());return this.stmts.getSessionSize.get(r.lastInsertRowid)}latestSessionSizes(){return this.stmts.latestSessionSizes.all()}sessionSizeHistory(t,r,n=20){return this.stmts.sessionSizeHistory.all(t,r,n)}insertSessionEvent(t){let r=this.stmts.insertSessionEvent.run(t.run_id,t.step_id??null,t.kind,t.timestamp_ms,t.payload,t.payload_truncated??0,t.overflow_artifact_id??null);return this.stmts.getSessionEvent.get(r.lastInsertRowid)}listSessionEvents(t,r){return r!==void 0?this.stmts.listSessionEventsSince.all(t,r):this.stmts.listSessionEvents.all(t)}listSessionEventsSince(t,r=1e3){return this.stmts.listAllEventsSince.all(t,r)}latestAgentCall(t){let r=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call' ORDER BY id DESC LIMIT 1").get(t);if(r===void 0)return null;try{let n=JSON.parse(r.payload);return typeof n.alias!="string"||typeof n.provider!="string"?null:{alias:n.alias,provider:n.provider,...typeof n.model=="string"?{model:n.model}:{}}}catch{return null}}agentCallTokenTotals(t){let r=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call'").all(t),n=0,s=0,i=0;for(let o of r)try{let a=JSON.parse(o.payload);typeof a.tokens_in=="number"&&(n+=a.tokens_in),typeof a.tokens_out=="number"&&(s+=a.tokens_out),i+=1}catch{}return{totalInputTokens:n,totalOutputTokens:s,agentCallCount:i}}addRollupValue(t){this.stmts.upsertRollupStat.run(t.run_id,t.step_id??null,t.metric_kind,t.value,t.bucket_start_ms,t.bucket_end_ms,t.updated_at)}listRollupStats(t){return this.stmts.listRollupStats.all(t)}getRollupCursor(){return this.stmts.getRollupCursor.get("last_event_id")?.value??0}setRollupCursor(t){this.stmts.setRollupCursor.run("last_event_id",t)}insertDriftSignal(t){let r=this.stmts.insertDriftSignal.run(t.team_member_id,t.project_id??null,t.signal_kind,t.severity,t.description,t.detected_at,t.expires_at??null,t.payload??null);return this.stmts.getDriftSignal.get(r.lastInsertRowid)}listDriftSignals(t={}){return t.team_member_id!==void 0&&t.unacked?this.stmts.listUnackedDriftByMember.all(t.team_member_id):t.team_member_id!==void 0?this.stmts.listDriftByMember.all(t.team_member_id):t.project_id!==void 0?this.stmts.listDriftByProject.all(t.project_id):this.stmts.listAllDrift.all()}hasUnackedDriftSignal(t,r,n){return this.stmts.findUnackedDrift.get(t,r??null,n)!==void 0}acknowledgeDriftSignal(t){return this.stmts.ackDriftSignal.run(Date.now(),t),this.stmts.getDriftSignal.get(t)??null}insertInteractiveSession(t){let r=Date.now();return this.stmts.insertInteractiveSession.run(t.run_id,t.step_id,t.state_name,t.status,r,r),this.stmts.getInteractiveSessionByStepId.get(t.step_id)}getInteractiveSessionByStepId(t){return this.stmts.getInteractiveSessionByStepId.get(t)??null}getInteractiveSessionByRunAndState(t,r){return this.stmts.getInteractiveSessionByRunAndState.get(t,r)??null}setInteractiveAgentOutput(t,r,n){this.stmts.setInteractiveAgentOutput.run(r,n,Date.now(),t)}resumeInteractive(t,r,n){return this.resumeInteractiveTxn(t,r,n,O())}resumeEscalation(t,r){return this.resumeEscalationTxn(t,r,O())}}});import{realpathSync as WI}from"node:fs";import{resolve as BI}from"node:path";function ll(e){let t=BI(e);try{return WI(t)}catch{return t}}var Mm=T(()=>{"use strict"});import{platform as jm}from"node:os";function Et(e){let t=new Vn;for(let r of e)t.registerAdapter(r);return t}var Vn,cl=T(()=>{"use strict";Mm();Vn=class{providers=[];adapters=new Map;register(t){this.providers.push(t)}async listAll(t){let r=[],n=t?.provider?this.providers.filter(o=>o.name===t.provider):this.providers,s=await Promise.all(n.map(o=>o.discoverSessions()));for(let o of s)r.push(...o);let i=r;if(t?.workspace){let o=ll(t.workspace);i=i.filter(a=>ll(a.cwd)===o)}if(t?.from){let o=t.from.getTime();i=i.filter(a=>a.modifiedAt.getTime()>=o)}if(t?.to){let o=t.to.getTime();i=i.filter(a=>a.modifiedAt.getTime()<=o)}return i.sort((o,a)=>a.modifiedAt.getTime()-o.modifiedAt.getTime()),t?.limit&&(i=i.slice(0,t.limit)),i}async getSession(t,r){let n=r?this.providers.filter(s=>s.name===r):this.providers;for(let s of n){let i=await s.loadSession(t);if(i)return i}return null}async resolveSession(t,r){let n=await this.resolveSessions(t,r);return n.length===1?n[0]:null}async resolveSessions(t,r){let n=r?this.providers.filter(i=>i.name===r):this.providers,s=[];for(let i of n){let o=await i.resolveSessionPath(t);o&&s.push({provider:i,filePath:o})}return s}getWatchTargets(){let t=jm()==="darwin"||jm()==="win32",r=[];for(let n of this.providers)if(typeof n.getWatchPaths=="function")for(let s of n.getWatchPaths())r.push({provider:n.name,directory:s.directory,recursive:t,filePattern:s.filePattern});return r}async deleteSession(t,r){let n=await this.resolveSession(t,r);return n?n.provider.deleteSession(t):!1}registerAdapter(t){this.adapters.set(t.name,t),this.providers.push({name:t.name,discoverSessions:()=>t.discover(),loadSession:r=>t.load(r),resolveSessionPath:r=>t.resolvePath(r),deleteSession:r=>t.delete(r),getWatchPaths:()=>t.getWatchPaths?.()??[]})}getAdapter(t){return this.adapters.get(t)}getAllAdapters(){return[...this.adapters.values()]}}});import{createReadStream as Dm}from"node:fs";import{createInterface as Pm}from"node:readline";import{stat as qI}from"node:fs/promises";import{homedir as HI}from"node:os";async function*Ue(e){let t=Dm(e,{encoding:"utf-8"}),r=Pm({input:t,crlfDelay:1/0});try{for await(let n of r){let s=n.trim();if(s)try{yield JSON.parse(s)}catch{}}}finally{t.destroy()}}async function $e(e,t){let r=[],n=Dm(e,{encoding:"utf-8"}),s=Pm({input:n,crlfDelay:1/0});try{for await(let i of s){let o=i.trim();if(o){try{r.push(JSON.parse(o))}catch{}if(r.length>=t)break}}}finally{s.close(),n.destroy()}return r}async function Ne(e){let t=await qI(e);return{createdAt:t.birthtime,modifiedAt:t.mtime}}function fe(e){return e.replace(/\\n/g,`
1359
- `).replace(/\\t/g," ").replace(/\\r/g,"\r")}function H(e,t){return e.length<=t?e:e.slice(0,t-3)+"..."}var Te,nr=T(()=>{"use strict";Te=HI()});import{readdir as ni,stat as Fm,unlink as JI}from"node:fs/promises";import{join as Kr,basename as Um}from"node:path";function XI(e){return e==="file-history-snapshot"||e==="progress"||e==="system"||e==="queue-operation"}function GI(e){if(e.type==="system"){let t=e.message?.content;if(typeof t=="string"&&t.trim())return fe(t.trim());if(t!==void 0)return JSON.stringify(t,null,2)}return e.type==="progress"&&e.data!==void 0?JSON.stringify(e.data,null,2):JSON.stringify(e,null,2)}async function Wm(e){let t=0,r=0,n=0,s=0,i=0,o=0,a;for await(let l of Ue(e))if(!l.isSidechain){if(l.type==="user"&&!l.isMeta&&l.message){let c=l.message.content;if(typeof c=="string"){if(c.includes("<command-name>")||c.includes("<local-command-"))continue;t++}}else if(l.type==="assistant"&&l.message){let c=l.message.content;if(Array.isArray(c))for(let u of c)u.type==="text"&&t++;let d=l.message.usage;if(d){let u=d.input_tokens||0,f=d.cache_creation_input_tokens||0,m=d.cache_read_input_tokens||0,p=d.output_tokens||0;r+=u+f+m,n+=m,s+=f,i+=p;let _=u+f+m;_&&(o=_),a={inputTokens:u,cacheWriteInputTokens:f,cachedInputTokens:m,outputTokens:p}}}}return{messageCount:t,totalInputTokens:r,totalCacheReadInputTokens:n,totalCacheWriteInputTokens:s,totalOutputTokens:i,lastInputTokens:o,lastTokenUsage:a}}var si,Bm=T(()=>{"use strict";nr();si=class{name="claude";claudeDir;projectsDir;constructor(t={}){this.claudeDir=t.claudeDir||Kr(Te,".claude"),this.projectsDir=Kr(this.claudeDir,"projects")}getWatchPaths(){return[{directory:this.projectsDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let t=[],r;try{r=await ni(this.projectsDir)}catch{return t}for(let n of r){let s=Kr(this.projectsDir,n);if(!(await Fm(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await ni(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=Um(a,".jsonl");if(!/^[0-9a-f]{8}-/.test(l))continue;let c=Kr(s,a);try{let d=await this.extractSummary(c,l);d&&t.push(d)}catch{}}}return t}async extractSummary(t,r){let n=await $e(t,50),s=await Ne(t),i="",o,a,l,c,d,u;for(let m of n)if(!XI(m.type)&&(!i&&m.cwd&&(i=m.cwd),!o&&m.slug&&(o=m.slug),!a&&m.version&&(a=m.version),!u&&m.timestamp&&(u=new Date(m.timestamp)),m.type==="assistant"&&m.message?.model&&(l=m.message.model),m.type==="user"&&!m.isMeta&&m.message)){let p=m.message.content;if(typeof p=="string"){if(p.includes("<command-name>")||p.includes("<local-command-"))continue;c||(c=H(p.trim(),80)),d=H(p.trim(),80)}}if(!i)return null;let f=await Wm(t);return{provider:"claude",sessionId:r,slug:o,cwd:i,createdAt:u||s.createdAt,modifiedAt:s.modifiedAt,model:l,cliVersion:a,startCommand:"claude",firstUserMessage:c,lastUserMessage:d,messageCount:f.messageCount,filePath:t,totalInputTokens:f.totalInputTokens||void 0,totalCachedInputTokens:f.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:f.totalCacheWriteInputTokens||void 0,totalOutputTokens:f.totalOutputTokens||void 0,lastInputTokens:f.lastInputTokens||void 0,lastTokenUsage:f.lastTokenUsage}}async loadSession(t){let r=await this.resolveSessionFile(t);if(!r)return null;let n=await Ne(r),s=[],i="",o,a,l,c,d,u,f,m=t;for await(let _ of Ue(r))if(_.type!=="file-history-snapshot"&&!_.isSidechain){if(!i&&_.cwd&&(i=_.cwd),!o&&_.slug&&(o=_.slug),!a&&_.version&&(a=_.version),!c&&_.gitBranch&&(c=_.gitBranch),!f&&_.timestamp&&(f=new Date(_.timestamp)),_.sessionId&&(m=_.sessionId),_.type==="system"||_.type==="progress"||_.type==="queue-operation"){s.push({role:"system",timestamp:new Date(_.timestamp||0),content:GI(_)});continue}if(_.type==="user"&&_.message){if(_.isMeta)continue;let g=new Date(_.timestamp||0),h=_.message.content;if(typeof h=="string"){if(h.includes("<command-name>")||h.includes("<local-command-"))continue;d||(d=H(h.trim(),80)),u=H(h.trim(),80),s.push({role:"user",timestamp:g,content:fe(h.trim())})}else if(Array.isArray(h)){for(let S of h)if(S.type==="tool_result"){let y=typeof S.content=="string"?fe(S.content):JSON.stringify(S.content);s.push({role:"tool_result",timestamp:g,content:y,toolCallId:S.tool_use_id})}}}if(_.type==="assistant"&&_.message){_.message.model&&(l=_.message.model);let g=new Date(_.timestamp||0),h=_.message.content;if(Array.isArray(h))for(let S of h)S.type==="text"&&S.text?s.push({role:"assistant",timestamp:g,content:fe(S.text),model:_.message.model}):S.type==="tool_use"?s.push({role:"tool_use",timestamp:g,content:S.name||"unknown tool",toolName:S.name,toolInput:JSON.stringify(S.input,null,2),toolCallId:S.id,model:_.message.model}):S.type==="thinking"&&S.thinking&&s.push({role:"thinking",timestamp:g,content:S.thinking})}}if(!i)return null;let p=await Wm(r);return{provider:"claude",sessionId:m,slug:o,cwd:i,createdAt:f||n.createdAt,modifiedAt:n.modifiedAt,model:l,cliVersion:a,startCommand:"claude",gitBranch:c,firstUserMessage:d,lastUserMessage:u,messageCount:p.messageCount,filePath:r,totalInputTokens:p.totalInputTokens||void 0,totalCachedInputTokens:p.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:p.totalCacheWriteInputTokens||void 0,totalOutputTokens:p.totalOutputTokens||void 0,lastInputTokens:p.lastInputTokens||void 0,lastTokenUsage:p.lastTokenUsage,messages:s}}async resolveSessionPath(t){return this.resolveSessionFile(t)}async deleteSession(t){let r=await this.resolveSessionFile(t);return r?(await JI(r),!0):!1}async resolveSessionFile(t){let r;try{r=await ni(this.projectsDir)}catch{return null}let n=[];for(let o of r){let a=Kr(this.projectsDir,o);if(!(await Fm(a).catch(()=>null))?.isDirectory())continue;let c;try{c=await ni(a)}catch{continue}for(let d of c){if(!d.endsWith(".jsonl"))continue;let u=Um(d,".jsonl");/^[0-9a-f]{8}-/.test(u)&&n.push({filePath:Kr(a,d),fileSessionId:u})}}let s=n.find(o=>o.fileSessionId===t);if(s)return s.filePath;let i=n.filter(o=>o.fileSessionId.startsWith(t));if(i.length===1)return i[0].filePath;for(let o of n){let a=await $e(o.filePath,20);for(let l of a)if(l.slug&&l.slug===t)return o.filePath}return null}}});function ii(e){return"'"+e.replace(/'/g,"'\\''")+"'"}function KI(e,t,r){if(!r)return"";let n=e.tools[t]??dl[t],s=n?.profiles?.[r]?.flags??dl[t]?.profiles?.[r]?.flags;if(s!==void 0)return s.trim();if(n?.profile_flag)return n.profile_flag.replace(/\{\{profile\}\}/g,r).trim();throw new Error(`Profile "${r}" is not configured for tool "${t}"`)}function qm(e,t){return!!e.tools[t]}function Hm(e,t,r,n,s){let i=e.tools[t]??dl[t],o;if(i?.agent){let l=ii(n);o=i.agent.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,l)}else{let l=VI[t];if(!l)throw new Error(`No agent command configured for tool "${t}"`);let c=l.argv.map(d=>d.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,n));if(l.mode==="stdin"){let d=c.map(ii).join(" ");o=`printf '%s\\n' ${ii(n)} | ${d}`}else o=c.map(ii).join(" ")}let a=KI(e,t,s);return a&&(o+=" "+a),o}var dl,VI,Jm=T(()=>{"use strict";dl={claude:{start:"claude",resume:"claude --resume {{session_id}} --dangerously-skip-permissions",profiles:{default:{description:"Default profile",flags:""}}},codex:{start:"codex",resume:"codex resume {{session_id}} --dangerously-bypass-approvals-and-sandbox",profiles:{default:{description:"Default profile",flags:""}}},opencode:{start:"opencode",resume:"opencode --session {{session_id}}",profiles:{default:{description:"Default profile",flags:""}}},gemini:{start:"gemini",resume:"gemini --resume {{session_id}} -y",profiles:{default:{description:"Default profile",flags:""}}},copilot:{start:"copilot",resume:"copilot --resume={{session_id}} --yolo",profiles:{default:{description:"Default profile",flags:""}}},qwen:{start:"qwen",resume:"qwen --resume {{session_id}} --approval-mode yolo",profiles:{default:{description:"Default profile",flags:""}}},agy:{start:"agy",resume:"agy --conversation {{session_id}} --dangerously-skip-permissions",profiles:{default:{description:"Default profile",flags:""}}}},VI={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 Xm(e=process.env){let t=e.LMCTL_ONE_SHOT_TIMEOUT_MS;if(!t)return 6e5;let r=Number(t);return!Number.isFinite(r)||r<=0?6e5:r}var Gm=T(()=>{"use strict"});var YI,he,oi,Tt=T(()=>{"use strict";YI="ACK: waiting for explicit lmctl task.",he=`lmctl seed initial connection only. Create or pin this provider session, then stop. Do not inspect files, run commands, infer a task, delegate, edit, or begin work. Reply exactly: ${YI}`,oi=`send this exact lmctl seed instruction: "${he}"`});function Ut(e,t){let r={...e??process.env,PWD:t};return delete r.OLDPWD,r}function ZI(e,t){return t===void 0||t.length===0?e:{...e??process.env,[Kn]:t}}function We(e,t,r,n="chat"){return{...ZI(Ut(e,t),r),[zI]:n}}var Kn,zI,it=T(()=>{"use strict";Kn="LMCTL_SELF_SESSIONID",zI="LMCTL_LAUNCH_SOURCE"});import{spawn as Vm}from"node:child_process";import{mkdirSync as QI}from"node:fs";var ul,xe,Wt=T(()=>{"use strict";Jm();Gm();Tt();it();ul=class e extends Error{cancelReason;constructor(t,r){super(t),this.name="TurnAbortError",this.cancelReason=r,Object.setPrototypeOf(this,e.prototype)}},xe=class e{name;capabilities;injection;provider;binary;seedArgs;seedStdin;resumeTemplate;startTemplate;transportFn;constructor(t){this.name=t.provider.name,this.provider=t.provider,this.capabilities=t.capabilities,this.injection=t.injection,this.binary=t.binary,this.seedArgs=t.seedArgs,this.seedStdin=t.seedStdin,this.resumeTemplate=t.resumeTemplate,this.startTemplate=t.startTemplate,this.transportFn=t.transport}discover(){return this.provider.discoverSessions()}load(t){return this.provider.loadSession(t)}resolvePath(t){return this.provider.resolveSessionPath(t)}delete(t){return this.provider.deleteSession(t)}getWatchPaths(){return this.provider.getWatchPaths?.()??[]}seedArgsFor(t){let r=t?.prompt;return r===void 0?this.seedArgs:this.seedArgs.map(n=>n===he?r:n)}seed(t,r){return QI(t,{recursive:!0}),new Promise(n=>{let s;try{s=Vm(this.binary,this.seedArgsFor(r),{cwd:t,env:Ut(void 0,t),stdio:["pipe","pipe","pipe"],timeout:6e4})}catch(a){return n({success:!1,error:a instanceof Error?a.message:String(a)})}let i="";s.stderr?.on("data",a=>{i+=a.toString()});let o=r?.prompt!==void 0&&this.seedStdin!==void 0?`${r.prompt}
1360
- `:this.seedStdin;o&&s.stdin?.write(o),s.stdin?.end(),s.on("exit",a=>{n(a===0||a===null?{success:!0}:{success:!1,error:i.trim().slice(0,200)||`exit code ${a}`})}),s.on("error",a=>{n({success:!1,error:a.message})})})}resumeCommand(t,r){return this.resumeTemplate.replace(/\{\{session_id\}\}/g,t)}startCommand(t){return this.startTemplate}manualSeedHint(t){return{launchCommand:`cd ${t} && ${this.binary}`,postLaunchNote:oi,lsCommand:`lmctl ls --provider ${this.name} --sessiondir ${t}`}}static DEFAULT_IDLE_TIMEOUT_MS=8*60*60*1e3;sendTurn(t,r){if(r.userConfig&&qm(r.userConfig,this.name)){let s=r.userConfig.tools[this.name];if(s?.agent)return this.runOneShotAgent(t,r,s.agent)}let n=r.timeoutMs??e.DEFAULT_IDLE_TIMEOUT_MS;return n<=0&&!r.signal?this.transportFn(t,{...r,binary:this.binary}):this.withTimeouts(n,t,r)}withTimeouts(t,r,n){let s=new AbortController,i,o,a="",l,c=()=>{t<=0||(clearTimeout(i),i=setTimeout(()=>{n.onIdleWarning?.(t),d(),s.abort(),l&&l({text:a,sessionId:n.sessionId,durationMs:t,status:"stalled",stalledAfterMs:t})},t))},d=()=>{clearTimeout(i)};n.signal&&(n.signal.aborted?(o="external",s.abort()):n.signal.addEventListener("abort",()=>{o="external",s.abort()},{once:!0})),c();let u={...n,binary:this.binary,signal:s.signal,onDelta:p=>{a+=p,c(),n.onDelta?.(p)},onProgress:p=>{p.kind!=="api_retry"&&c(),n.onProgress?.(p)}},f=this.transportFn(r,u).then(p=>(d(),{...p,status:"ok"})).catch(p=>{throw d(),o==="external"?new ul("Turn cancelled","external"):p}),m=new Promise(p=>{l=p});return Promise.race([f,m])}runOneShotAgent(t,r,n){let s=Hm(r.userConfig,this.name,r.sessionId,t,r.profile),i=Date.now();return new Promise((o,a)=>{let l=Xm(r.env),c=Vm(s,{shell:!0,cwd:r.cwd,env:We(r.env,r.cwd,r.sessionId),stdio:["pipe","pipe","pipe"]}),d=!1,u=!1,f=setTimeout(()=>{u=!0,c.kill()},l),m="",p="";if(c.stdout?.on("data",_=>{let g=_.toString();m+=g,r.onDelta?.(g)}),c.stderr?.on("data",_=>{p+=_.toString()}),r.signal){if(r.signal.aborted)return clearTimeout(f),c.kill(),a(new Error("Aborted"));r.signal.addEventListener("abort",()=>c.kill(),{once:!0})}c.on("exit",_=>{if(d)return;d=!0,clearTimeout(f);let g=Date.now()-i;u?a(new Error(`Agent command timed out after ${l}ms`)):_===0||_===null?o({text:m.trim(),sessionId:r.sessionId,durationMs:g}):a(new Error(p.trim().slice(0,200)||`Agent command exited with code ${_}`))}),c.on("error",_=>{d||(d=!0,clearTimeout(f),a(_))})})}}});function li(e,t){let r;if(t&&typeof t=="object"){let n=t.code;typeof n=="number"&&(r=n)}return new qt(e,r,t)}var Qe,be,Bt,ai,qt,Yr=T(()=>{"use strict";Qe=class extends Error{constructor(t,r){super(t,r),this.name=this.constructor.name}},be=class extends Qe{},Bt=class extends Qe{exitCode;signal;stderr;constructor(t,r,n=null,s){super(t),this.exitCode=r,this.signal=n,this.stderr=s}},ai=class extends Qe{line;constructor(t,r,n){super(t,{cause:n}),this.line=r}},qt=class extends Qe{rpcCode;rpcData;constructor(t,r,n){super(t),r!==void 0&&(this.rpcCode=r),n!==void 0&&(this.rpcData=n)}}});import*as ml from"node:child_process";function t0(e){if(typeof ml.spawnSync=="function")try{ml.spawnSync("taskkill",["/T","/F","/PID",String(e)],{windowsHide:!0})}catch{}}function Km(e){return e.exitCode!==null||e.signalCode!==null}function fl(e,t){return Km(e)?Promise.resolve(!0):new Promise(r=>{let n=!1,s=()=>{n||(n=!0,clearTimeout(i),r(!0))},i=setTimeout(()=>{n||(n=!0,e.removeListener("exit",s),r(!1))},t);e.once("exit",s)})}async function ot(e,t={}){let r=Date.now(),n=t.stdinEnd!==!1,s=t.softDelayMs??5e3,i=t.killDelayMs??5e3,o=t.platform??process.platform,a=t.runTaskkill??t0;if(Km(e))return{signal:"natural",elapsedMs:Date.now()-r};if(n&&e.stdin&&!e.stdin.destroyed)try{e.stdin.end()}catch{}if(await fl(e,s))return{signal:"stdin",elapsedMs:Date.now()-r};if(o==="win32"&&typeof e.pid=="number")a(e.pid);else try{e.kill("SIGTERM")}catch{}if(await fl(e,i))return{signal:"SIGTERM",elapsedMs:Date.now()-r};if(o!=="win32")try{e.kill("SIGKILL")}catch{}return await fl(e,e0)?{signal:"SIGKILL",elapsedMs:Date.now()-r}:{signal:"abandoned",elapsedMs:Date.now()-r}}var e0,ci=T(()=>{"use strict";e0=1e3});function Ym(e){ce()&&Xe({event:"legacy",msg:`[debug] ${e}`},{always:!0})}function sr(e,t){let r=n0[e];if(r)return r[t]??r.yolo}function i0(e,t){if(t.length===0)return!0;for(let r=0;r+t.length<=e.length;r++){let n=!0;for(let s=0;s<t.length;s++)if(e[r+s]!==t[s]){n=!1;break}if(n)return!0}return!1}function at(e,t,r="yolo"){if(s0.has(e)){Ym(`YOLO ${e} [mode=${r}]: ${e==="codex"?`JSON-RPC params (approvalPolicy=never, sandbox=${r==="plan"?"read-only":"danger-full-access"})`:e==="opencode"?".opencode/opencode.json (permission=allow)":"protocol/config (out-of-band)"} \u2014 no argv flag`);return}let n=r==="plan"?sr(e,"plan"):r0[e];if(!n){let s=`unknown provider "${e}" \u2014 YOLO contract not configured. Add an entry to YOLO_FLAGS in src/providers/yolo-contract.ts before spawning this provider.`;throw V({event:"yolo_assert_failed",provider:e,reason:"unconfigured_provider",args:t.join(" "),message:s}),new be(s)}if(!i0(t,n)){let s=n.join(" "),i=`${e} spawn missing YOLO flag '${s}' \u2014 YOLO is mandatory for every provider; see src/providers/yolo-contract.ts. Got argv: [${t.map(o=>JSON.stringify(o)).join(", ")}]`;throw V({event:"yolo_assert_failed",provider:e,reason:"flag_missing",required_flag:s,mode:r,args:t.join(" "),message:i}),new be(i)}Ym(`YOLO ${e} [mode=${r}]: argv flag '${n.join(" ")}'`)}var r0,n0,s0,zr=T(()=>{"use strict";Yr();ve();r0={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"],gemini:["-y"],copilot:["--yolo"],agy:["--dangerously-skip-permissions"],lmplayer:["--dangerously-skip-permissions"]},n0={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"]}};s0=new Set(["codex","opencode"])});function zm(e){if(e.length===0)return"";if(e.length===1)return e[0];let t=[];for(let r=0;r<e.length;r++)r===0?t.push(e[r]):t.push(`
1358
+ `),...bm(e),...wm(e)}}function UI(e,t){return t===void 0?{resumed:!1,reason:e}:{resumed:!1,reason:e,valid:t}}var ol,Ze=T(()=>{"use strict";ym();Em();Sm();Im();xm();Qs();Xn();ol=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;tryAcquireAgentInflightTxn;recvMailboxMessagesTxn;constructor(t){t.pragma("foreign_keys = ON"),this.db=t,this.stmts=FI(t),this.claimTxn=t.transaction((r,n,s)=>{let i=this.stmts.selectClaimableJob.get(s,s,s);return i===void 0||this.stmts.claimJob.run(r,n,s,i.id,s,s,s).changes!==1?null:this.getJob(i.id)}),this.claimWithConcurrencyTxn=t.transaction((r,n,s,i)=>{let o=this.stmts.selectClaimableJobs.all(s,s,s);for(let a of o){let l=this.getJob(a.id);if(l===null)continue;let c=i(l);if(c.concurrency_key!==null&&(l.concurrency_key_resolved!==c.concurrency_key&&this.stmts.setJobConcurrencyKey.run(c.concurrency_key,l.id),(this.stmts.countRunningByConcurrencyKey.get(c.concurrency_key,s,l.id)?.count??0)>=Math.max(1,c.concurrent_limit)))continue;if(this.stmts.claimJob.run(r,n,s,l.id,s,s,s).changes===1)return this.getJob(l.id)}return null}),this.claimByIdWithConcurrencyTxn=t.transaction((r,n,s,i,o)=>{let a=this.getJob(r);if(a===null)return{claimed:!1,reason:"not_found",job_id:r};if(a.locked_until!==null&&a.locked_until>=i)return{claimed:!1,reason:"locked",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let c=a.status==="queued"&&a.available_at<=i,d=a.status==="running"&&a.locked_until!==null&&a.locked_until<i;if(!c&&!d)return{claimed:!1,reason:"not_claimable",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let u=o(a);if(u.concurrency_key!==null&&(a.concurrency_key_resolved!==u.concurrency_key&&this.stmts.setJobConcurrencyKey.run(u.concurrency_key,a.id),(this.stmts.countRunningByConcurrencyKey.get(u.concurrency_key,i,a.id)?.count??0)>=Math.max(1,u.concurrent_limit)))return{claimed:!1,reason:"concurrency_limit",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};if(this.stmts.claimJob.run(n,s,i,a.id,i,i,i).changes!==1){let p=this.getJob(a.id);return{claimed:!1,reason:p?.locked_until!==null&&p?.locked_until!==void 0&&p.locked_until>=i?"locked":"not_claimable",job_id:r,status:p?.status??a.status,locked_by:p?.locked_by??a.locked_by,locked_until:p?.locked_until??a.locked_until}}let m=this.getJob(a.id);return m===null?{claimed:!1,reason:"not_found",job_id:r}:{claimed:!0,job:m}}),this.resumeRunTxn=t.transaction((r,n,s)=>UI("state_not_found")),this.resumeInteractiveTxn=t.transaction((r,n,s,i)=>{let o=this.getInteractiveSessionByStepId(r);if(o===null)return{resumed:!1,reason:"not_found"};if(o.status!=="waiting_operator")return{resumed:!1,reason:"not_waiting_operator"};let a=this.getRun(o.run_id);if(a===null)return{resumed:!1,reason:"run_not_found"};let l=s?"done":"waiting_agent";return this.stmts.updateInteractiveSession.run(l,n,Date.now(),o.id),this.stmts.resumeRunState.run(o.state_name,a.id),this.stmts.requeuePausedJob.run(i,a.job_id),{resumed:!0,session:this.getInteractiveSessionByStepId(r),run:this.getRun(a.id),job:this.getJob(a.job_id)}}),this.resumeEscalationTxn=t.transaction((r,n,s)=>{let i=this.stmts.getAttention.get(r);if(i===void 0)return{resumed:!1,reason:"not_found"};if(i.kind!==ti)return{resumed:!1,reason:"wrong_kind"};if(i.acknowledged_at!==null)return{resumed:!1,reason:"already_acked"};if(i.run_id===null)return{resumed:!1,reason:"run_not_found"};let o=null,a=[];if(i.payload!==null)try{let d=JSON.parse(i.payload);d.step!==void 0&&typeof d.step.id=="string"&&d.step.id.length>0&&(o=d.step.id),Array.isArray(d.declared_outcomes)&&(a=d.declared_outcomes.filter(u=>typeof u=="string"))}catch{}if(o===null)return{resumed:!1,reason:"no_step"};let l=this.getRun(i.run_id);if(l===null)return{resumed:!1,reason:"run_not_found"};if(n!==Jn&&!a.includes(n))return{resumed:!1,reason:Rm};let c={};if(l.pending_escalation_decision!==null)try{let d=JSON.parse(l.pending_escalation_decision);d!==null&&typeof d=="object"&&!Array.isArray(d)&&(c=d)}catch{c={}}return c[o]=n,this.stmts.setRunPendingEscalationDecision.run(JSON.stringify(c),l.id),this.stmts.resumeRunState.run(o,l.id),this.stmts.requeuePausedJob.run(s,l.job_id),this.stmts.ackAttention.run(s,r),{resumed:!0,run:this.getRun(l.id),job:this.getJob(l.job_id)}}),this.tryAcquireAgentInflightTxn=(r,n={})=>{this.db.exec("BEGIN IMMEDIATE");try{let s=n.reclaim_observed,i=this.stmts.acquireAgentInflight.get({...r,holder_pid:process.pid,stale_before:n.stale_before??null,force:n.force===!0?1:0,reclaim_observed_sender_teamfile:s?.sender_teamfile??null,reclaim_observed_sender_alias:s?.sender_alias??null,reclaim_observed_started_at:s?.started_at??null,reclaim_observed_holder_pid:typeof s?.holder_pid=="number"?s.holder_pid:null}),o=i!==void 0?{acquired:!0,current:i}:{acquired:!1,current:this.getAgentInflight(r.receiver_teamfile,r.receiver_alias)??(()=>{throw new Error("agent_inflight conflict row disappeared during acquire")})()};return this.db.exec("COMMIT"),o}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}},this.recvMailboxMessagesTxn=t.transaction((r,n)=>{let s=this.stmts.listAllMailboxMessagesForReceiver.all(r,n);for(let i of s)this.stmts.deleteMailboxMessage.run(i.id);return s})}close(){this.db.close()}query(t,...r){let n=t.trim().toLowerCase();if(!n.startsWith("select")&&!n.startsWith("with")&&!n.startsWith("pragma"))throw new Error("Dal.query only allows read-only SELECT/WITH/PRAGMA statements");return this.db.prepare(t).all(...r)}insertWorkflow(t){$m(t.name,t.definition,o=>this.getWorkflowByName(o));let r=this.stmts.insertWorkflow.run(t.name,t.version??1,t.definition_schema_version??1,t.definition,O()),n=this.getWorkflow(Number(r.lastInsertRowid)),s=this.stmts.insertWorkflowVersion.run(n.id,n.version,t.definition,t.author??null,O());this.stmts.updateWorkflowActiveVersion.run(s.lastInsertRowid,n.id),(t.source_uri!=null||t.source_sha256!=null)&&this.stmts.setWorkflowSource.run(t.source_uri??null,t.source_sha256??null,n.id);let i=this.getWorkflow(n.id);return this.syncWorkflowTriggers(n.id,t.definition),i}upsertWorkflow(t){$m(t.name,t.definition,o=>this.getWorkflowByName(o));let r=this.getWorkflowByName(t.name);if(r===null)return this.insertWorkflow({name:t.name,definition_schema_version:t.definition_schema_version,definition:t.definition,author:t.author,source_uri:t.source_uri,source_sha256:t.source_sha256});let s=(this.stmts.getLatestWorkflowVersion.get(r.id)?.version??r.version)+1,i=this.stmts.insertWorkflowVersion.run(r.id,s,t.definition,t.author??null,O());return this.stmts.updateWorkflowActiveVersionDefinitionAndVersion.run(Number(i.lastInsertRowid),t.definition,t.definition_schema_version??r.definition_schema_version,s,r.id),(t.source_uri!=null||t.source_sha256!=null)&&this.stmts.setWorkflowSource.run(t.source_uri??null,t.source_sha256??null,r.id),this.syncWorkflowTriggers(r.id,t.definition),this.getWorkflow(r.id)}insertCompositionUnit(t){this.stmts.insertCompositionUnit.run(t.name,t.version,t.lang,t.source,t.source_sha,t.compiled_workflow_version_id,O())}getWorkflow(t){return this.stmts.getWorkflow.get(t)??null}getWorkflowByName(t,r){return(r===void 0?this.stmts.findWorkflowLatest.get(t):this.stmts.findWorkflowVersion.get(t,r))??null}findWorkflowByName(t,r){return this.getWorkflowByName(t,r)}insertWorkflowVersion(t,r,n){let i=(this.stmts.getLatestWorkflowVersion.get(t)?.version??0)+1,o=this.stmts.insertWorkflowVersion.run(t,i,r,n??null,O());return this.stmts.getWorkflowVersion.get(o.lastInsertRowid)}activateWorkflowVersion(t,r){let n=this.getWorkflowVersionById(r);if(n===null||n.workflow_id!==t)return null;let s=1;try{let i=JSON.parse(n.definition);typeof i.definition_schema_version=="number"&&(s=i.definition_schema_version)}catch{}return this.stmts.updateWorkflowActiveVersionAndDefinition.run(r,n.definition,s,t),this.syncWorkflowTriggers(t,n.definition),this.getWorkflow(t)}getWorkflowVersionById(t){return this.stmts.getWorkflowVersion.get(t)??null}listWorkflowVersions(t){return this.stmts.listWorkflowVersions.all(t)}upsertTriggerInstance(t){return this.stmts.upsertTriggerInstance.run(t.workflow_id,t.trigger_id,t.trigger_type,t.parameters,t.enabled===!1?0:1,O()),this.stmts.getTriggerInstanceByWorkflowAndId.get(t.workflow_id,t.trigger_id)}listTriggerInstancesForWorkflow(t){return this.stmts.listTriggerInstancesForWorkflow.all(t)}listEnabledTriggerInstances(){return this.stmts.listEnabledTriggerInstances.all()}setTriggerCursor(t,r){return this.stmts.setTriggerCursor.run(r,O(),t),this.stmts.getTriggerInstance.get(t)??null}setTriggerFailure(t,r){return this.stmts.setTriggerFailure.run(O(),r,t),this.stmts.getTriggerInstance.get(t)??null}syncWorkflowTriggers(t,r){let n;try{n=JSON.parse(r)}catch{return}if(n===null||typeof n!="object"||Array.isArray(n))return;let s=n.triggers;if(Array.isArray(s))for(let i of s){if(i===null||typeof i!="object"||Array.isArray(i))continue;let o=i;typeof o.id!="string"||o.id.length===0||typeof o.type!="string"||o.type.length===0||this.upsertTriggerInstance({workflow_id:t,trigger_id:o.id,trigger_type:o.type,parameters:JSON.stringify(o.parameters??{})})}}insertTeam(t){let r=this.stmts.insertTeam.run(t.name,O());return this.stmts.getTeam.get(r.lastInsertRowid)}getTeam(t){return this.stmts.getTeam.get(t)??null}findTeamByName(t){return this.stmts.findTeamByName.get(t)??null}listTeams(){return this.stmts.listTeams.all()}insertTeamMember(t){let r=this.stmts.insertTeamMember.run(t.team_id,t.alias,t.role??"agent",t.provider,t.model??null,t.sessionid??null,t.sessiondir,O());return this.stmts.getTeamMember.get(r.lastInsertRowid)}listTeamMembers(t){return this.stmts.listTeamMembers.all(t)}findTeamMemberByAlias(t,r){return this.stmts.findTeamMemberByAlias.get(t,r)??null}updateTeamMemberSession(t,r){return this.stmts.updateTeamMemberSession.run(r,t),this.stmts.getTeamMember.get(t)??null}setMemberState(t,r,n){return this.stmts.setMemberState.run(r,n??null,O(),t),this.stmts.getTeamMember.get(t)??null}listMembersInState(t){return this.stmts.listMembersInState.all(t)}setMemberPromptSnapshot(t,r){return this.stmts.setMemberPromptSnapshot.run(r,t),this.stmts.getTeamMember.get(t)??null}setMemberProviderResolved(t,r){return this.stmts.setMemberProviderResolved.run(r,t),this.stmts.getTeamMember.get(t)??null}setMemberRolePrompt(t,r){return this.stmts.setMemberRolePrompt.run(r,t),this.stmts.getTeamMember.get(t)??null}updateTeamMemberMeta(t,r){let n=this.stmts.getTeamMember.get(t);if(n===void 0)return null;let s=Object.prototype.hasOwnProperty.call(r,"role_prompt"),i=Object.prototype.hasOwnProperty.call(r,"model"),o=Object.prototype.hasOwnProperty.call(r,"provider");return this.stmts.updateTeamMemberMeta.run(s?r.role_prompt??null:n.role_prompt,i?r.model??null:n.model,o?r.provider??n.provider:n.provider,t),this.stmts.getTeamMember.get(t)??null}insertTeamMemberCompanion(t){let r=this.stmts.insertTeamMemberCompanion.run(t.interpreter_id,t.companion_id,O());return this.stmts.getTeamMemberCompanion.get(r.lastInsertRowid)}insertProject(t){let r=this.stmts.insertProject.run(t.name,t.description??null,t.local_path,t.workflow_name,t.team_id,t.default_branch??null,t.intake_config??null,t.test_argv??null,t.test_command??null,t.durable_memory_mode??"folder",O());return this.stmts.getProject.get(r.lastInsertRowid)}listProjects(){return this.stmts.listProjects.all()}getProject(t){return this.stmts.getProject.get(t)??null}findProjectByName(t){return this.stmts.findProjectByName.get(t)??null}setProjectIntakeConfig(t,r){return this.stmts.setProjectIntakeConfig.run(r,t),this.stmts.getProject.get(t)??null}updateProjectSettings(t,r){let n=this.stmts.getProject.get(t);if(n===void 0)return null;let s=Object.prototype.hasOwnProperty.call(r,"local_path"),i=Object.prototype.hasOwnProperty.call(r,"durable_memory_mode"),o=Object.prototype.hasOwnProperty.call(r,"default_branch"),a=Object.prototype.hasOwnProperty.call(r,"intake_config");return this.stmts.updateProjectSettings.run(s?r.local_path:n.local_path,i?r.durable_memory_mode:n.durable_memory_mode,o?r.default_branch??null:n.default_branch,a?r.intake_config??null:n.intake_config,t),this.stmts.getProject.get(t)??null}listProjectsWithIntakeEnabled(){return this.stmts.listProjectsWithIntakeConfig.all().filter(t=>{if(t.intake_config===null)return!1;try{let r=JSON.parse(t.intake_config);return typeof r=="object"&&r!==null&&!Array.isArray(r)&&r.scan_github_issues===!0}catch{return!1}})}getProjectByJob(t){return this.stmts.getProjectByJob.get(t)??null}insertProjectWorkflow(t){let r=t.condition??null,n=this.stmts.findProjectWorkflowUnique.get(t.project_id,t.workflow_id,r);if(n!==void 0)return n;let s=this.stmts.insertProjectWorkflow.run(t.project_id,t.workflow_id,r,t.parameters_override??null,t.enabled===!1?0:1,t.priority??100,O());return s.changes===1?this.stmts.getProjectWorkflow.get(s.lastInsertRowid):this.stmts.findProjectWorkflowUnique.get(t.project_id,t.workflow_id,r)}getProjectWorkflow(t){return this.stmts.getProjectWorkflow.get(t)??null}listProjectWorkflows(t,r={}){return r.enabled_only===!0?this.stmts.listEnabledProjectWorkflows.all(t):this.stmts.listProjectWorkflows.all(t)}removeProjectWorkflow(t){return this.stmts.removeProjectWorkflow.run(t).changes>0}setProjectWorkflowEnabled(t,r){return this.stmts.setProjectWorkflowEnabled.run(r?1:0,t),this.getProjectWorkflow(t)}createIssue(t){let r=O(),n=this.stmts.createIssue.run(t.project_id,t.title,t.body,t.severity??"medium",t.labels??null,t.ai_test_path??null,t.source_run_id??null,r,r);return this.stmts.getIssue.get(n.lastInsertRowid)}getIssue(t){return this.stmts.getIssue.get(t)??null}listIssues(t,r={}){return this.stmts.listIssuesForProject.all(t).filter(n=>!(r.status!==void 0&&!r.status.includes(n.status)||r.severity!==void 0&&!r.severity.includes(n.severity)||r.ai_test_path!==void 0&&n.ai_test_path!==r.ai_test_path))}claimNextIssue(t,r){return this.stmts.claimNextIssue.get(r,O(),t)??null}claimIssue(t,r){return this.stmts.claimIssue.get(r,O(),t)??null}closeIssue(t,r,n){let s=O(),i=this.stmts.closeIssue.get(r,n??null,s,s,t);if(i===void 0)throw new Error(`issue not found: ${t}`);return i}reopenIssue(t,r){let n=this.stmts.reopenIssue.get(r,O(),t);if(n===void 0)throw this.getIssue(t)===null?new Error(`issue not found: ${t}`):new Error(`issue ${t} is not closed`);return n}updateIssue(t,r){let n=this.getIssue(t);if(n===null)throw new Error(`issue not found: ${t}`);let s=Object.prototype.hasOwnProperty.call(r,"labels"),i=Object.prototype.hasOwnProperty.call(r,"ai_test_path"),o=this.stmts.updateIssue.get(r.title??n.title,r.body??n.body,r.severity??n.severity,s?r.labels??null:n.labels,i?r.ai_test_path??null:n.ai_test_path,O(),t);if(o===void 0)throw new Error(`issue not found: ${t}`);return o}listWorkflows(){return this.stmts.listWorkflows.all()}getOrCreateWebuiSession(t,r){let n=this.stmts.getWebuiSession.get(t);if(n!==void 0)return n;let s=O();return this.stmts.insertWebuiSession.run(t,r,"N1",null,null,null,null,"authenticated",s,s),this.stmts.getWebuiSession.get(t)}getWebuiSession(t){return this.stmts.getWebuiSession.get(t)??null}updateWebuiSessionTransition(t,r,n,s,i){if(this.stmts.updateWebuiSessionTransition.run(r,n,s,i,O(),t).changes===0)throw new Error(`webui_session not found: ${t}`);return this.stmts.getWebuiSession.get(t)}setWebuiSessionChatbot(t,r){if(this.stmts.setWebuiSessionChatbot.run(r,O(),t).changes===0)throw new Error(`webui_session not found: ${t}`);return this.stmts.getWebuiSession.get(t)}createChatbotSession(t,r){let n=Om(),s=O();return this.stmts.insertChatbotSession.run(n,t,r??null,s,s,"active"),this.stmts.getChatbotSession.get(n)}getChatbotSession(t){return this.stmts.getChatbotSession.get(t)??null}listChatbotSessions(t){return this.stmts.listChatbotSessionsForUser.all(t)}appendChatbotMessage(t,r,n,s){let i=O(),o=this.stmts.insertChatbotMessage.run(t,r,n,s??null,i);return this.stmts.touchChatbotSession.run(i,t),this.stmts.getChatbotMessage.get(o.lastInsertRowid)}listChatbotMessages(t){return this.stmts.listChatbotMessages.all(t)}getConfig(t){return this.stmts.getConfig.get(t)?.value??null}setConfig(t,r){this.stmts.upsertConfig.run(t,r,O())}getConfigAll(){let t=this.stmts.listConfig.all(),r={};for(let n of t)r[n.key]=n.value;return r}enqueueJob(t){let r=this.stmts.insertJob.run(t.project_id,t.workflow_id_override??null,t.source,t.source_ref??null,t.payload??null,t.priority??0,t.available_at??O(),t.dedupe_key??null,t.concurrency_key??null,O());if(r.changes===1)return this.stmts.getJob.get(r.lastInsertRowid);if(t.dedupe_key===void 0||t.dedupe_key===null)throw new Error("job insert ignored without dedupe key");return this.stmts.findJobByDedupe.get(t.source,t.dedupe_key)}claimNextJob(t){let r=O(),n=new Date(Date.now()+t.lease_ms).toISOString();return this.claimTxn(t.worker_id,n,r)}claimNextJobWithConcurrency(t){let r=O(),n=new Date(Date.now()+t.lease_ms).toISOString();return this.claimWithConcurrencyTxn(t.worker_id,n,r,t.evaluator)}claimJobByIdWithConcurrency(t){let r=O(),n=new Date(Date.now()+t.lease_ms).toISOString();return this.claimByIdWithConcurrencyTxn(t.job_id,t.worker_id,n,r,t.evaluator)}releaseJob(t,r,n){let s=r==="queued"||r==="running"?null:O();return this.stmts.releaseJob.run(r,n??null,s,t),this.getJob(t)}getJob(t){return this.stmts.getJob.get(t)??null}findJobBySourceAndDedupe(t,r){return this.stmts.findJobByDedupe.get(t,r)??null}insertRun(t){let r=this.getWorkflow(t.workflow_id);if(r===null)throw new Error(`workflow not found: ${t.workflow_id}`);let n=this.stmts.insertRun.run(t.job_id,t.workflow_id,t.team_id,t.current_state??null,r.active_version_id,t.parent_run_id??null,O()),s=this.stmts.getRun.get(n.lastInsertRowid);return(t.parent_run_id===void 0||t.parent_run_id===null)&&this.stmts.setJobRun.run(s.id,t.job_id),s}setJobRun(t,r){return this.stmts.setJobRun.run(r,t),this.getJob(t)}insertPromptDispatch(t){return this.stmts.insertPromptDispatch.run(t.prompt_id,t.project_id,t.job_id,t.text,t.context_json??null,O()),this.stmts.getPromptDispatch.get(t.prompt_id)}getPromptDispatch(t){return this.stmts.getPromptDispatch.get(t)??null}setPromptDispatchCompleted(t,r){return this.stmts.setPromptDispatchCompleted.run(r??O(),t),this.getPromptDispatch(t)}getWorkspace(t){return this.stmts.getWorkspace.get(t)??null}ensureWorkspace(t={}){let r=t.id??"default";this.stmts.ensureWorkspace.run(r,t.name??"Default workspace",t.idleThresholdMs??6e5,O());let n=this.getWorkspace(r);if(n===null)throw new Error(`workspace ${r} missing after upsert`);return n}listWebProjectsActive(t){return this.stmts.listWebProjectsActive.all(t)}getWebProject(t){return this.stmts.getWebProject.get(t)??null}insertWebProject(t){let r=O(),n=this.stmts.insertWebProject.run(t.workspace_id,t.name,t.repo_path,t.config_json??null,t.linked_v4_project_id??null,r,r),s=Number(n.lastInsertRowid),i=this.getWebProject(s);if(i===null)throw new Error(`web_project ${s} missing after insert`);return i}updateWebProject(t){let r=this.getWebProject(t.id);return r===null||r.deleted_at!==null?null:(this.stmts.updateWebProject.run(t.name??r.name,t.config_json===void 0?r.config_json:t.config_json,O(),t.id),this.getWebProject(t.id))}softDeleteWebProject(t){return this.stmts.softDeleteWebProject.run(O(),t).changes===1}loadMailboxCursor(t,r){return this.stmts.loadMailboxCursor.get(t,r)??null}saveMailboxCursor(t){this.stmts.saveMailboxCursor.run(t.user_id,t.mailbox_key,t.last_processed_version_id,t.last_processed_seq??null,t.last_processed_at)}addUsage(t){this.stmts.addUsage.run(t.user_id,t.device_id,t.period,t.put,t.get,t.list,t.updated_at)}loadUsage(t,r,n){return this.stmts.loadUsage.get(t,r,n)??null}sumUsageForPeriod(t,r){let n=this.stmts.sumUsageForPeriod.get(t,r);return{put:n?.put??0,get:n?.get??0,list:n?.list??0}}upsertRootTeam(t){this.stmts.upsertRootTeam.run(t.teamfile_path,t.name,t.raw_text,t.raw_sha256,t.registered_at,t.last_seeded_at)}getRootTeam(t){return this.stmts.getRootTeam.get(t)??null}listRootTeams(){return this.stmts.listRootTeams.all()}insertTeamChatLog(t){let r=this.stmts.insertTeamChatLog.run(t.root_teamfile,t.sender_teamfile,t.sender_alias,t.receiver_teamfile,t.receiver_alias,t.message,t.response,t.origin,t.status,t.error_detail,t.truncated,t.created_at);return Number(r.lastInsertRowid)}listTeamChatLog(t){return this.stmts.listTeamChatLog.all(t)}listTeamChatLogSinceId(t,r=500){return this.stmts.listTeamChatLogSinceId.all(t,Math.max(1,Math.trunc(r)))}getMaxTeamChatLogId(){return this.stmts.getMaxTeamChatLogId.get()?.max_id??0}loadTeamChatLogCursor(t){return this.stmts.loadTeamChatLogCursor.get(t)??null}saveTeamChatLogCursor(t){this.stmts.saveTeamChatLogCursor.run(t.cursor_key,t.last_pushed_id,t.updated_at)}startTrackedInvocation(t){let r=t.started_at??O(),n=t.holder_host??Gn(),s=t.last_heartbeat_at??r,i=this.stmts.insertTrackedInvocation.run(t.kind,t.origin,t.scope_teamfile??null,t.from_identity,t.target_teamfile??null,t.target_alias??null,t.root_teamfile??null,t.cwd??null,Pt(t.command),r,t.holder_pid??null,n,s,Pt(t.meta),t.launch_source??t.kind,t.request_payload??null);return this.getTrackedInvocation(Number(i.lastInsertRowid))}getTrackedInvocation(t){return this.stmts.getTrackedInvocation.get(t)??null}listAllRunningTrackedInvocations(){return this.stmts.listAllRunningTrackedInvocations.all()}finishTrackedInvocation(t,r){let n=r.ended_at??O();return this.stmts.finishTrackedInvocation.run(r.status,n,r.exit_code??null,r.signal??null,Pt(r.result_summary),Pt(r.error),r.team_chat_log_id??null,Pt(r.meta),n,t).changes!==1?null:this.getTrackedInvocation(t)}reclaimTrackedInvocationIfUnchanged(t,r,n){let s=n.ended_at??O();return this.stmts.reclaimTrackedInvocationIfUnchanged.run(n.status,s,n.exit_code??null,n.signal??null,Pt(n.result_summary),Pt(n.error),n.team_chat_log_id??null,Pt(n.meta),s,t,r.holder_pid,r.holder_host,r.started_at,r.last_heartbeat_at).changes!==1?null:this.getTrackedInvocation(t)}heartbeatTrackedInvocation(t,r=O()){return this.stmts.heartbeatTrackedInvocation.run(r,t).changes!==1?null:this.getTrackedInvocation(t)}updateTrackedInvocationRequestPayload(t,r){return this.stmts.updateTrackedInvocationRequestPayload.run(r,t).changes!==1?null:this.getTrackedInvocation(t)}listClaimableTerminalTrackedInvocations(t){let r=["status IN ('done', 'error', 'busy', 'cancelled')","ended_at IS NOT NULL","notified_by IS NULL"],n=[];t.from!==void 0&&(r.push("from_identity = ?"),n.push(t.from)),t.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(t.scope_teamfile));let s=Math.max(1,Math.min(1e3,Math.trunc(t.limit??100)));return n.push(s),this.db.prepare(`SELECT * FROM tracked_invocation WHERE ${r.join(" AND ")} ORDER BY ended_at ASC, id ASC LIMIT ?`).all(...n)}claimTrackedInvocationNotification(t,r,n=O()){return this.stmts.claimTrackedInvocationNotification.run(r,n,t).changes!==1?null:this.getTrackedInvocation(t)}listTrackedInvocations(t={}){let r=[],n=[];t.from!==void 0&&(r.push("from_identity = ?"),n.push(t.from)),t.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(t.scope_teamfile)),t.status!==void 0&&(r.push("status = ?"),n.push(t.status)),t.kind!==void 0&&(r.push("kind = ?"),n.push(t.kind)),t.origin!==void 0&&(r.push("origin = ?"),n.push(t.origin));let s=Math.max(1,Math.min(1e3,Math.trunc(t.limit??100)));n.push(s);let i=r.length===0?"":` WHERE ${r.join(" AND ")}`;return this.db.prepare(`SELECT * FROM tracked_invocation${i} ORDER BY started_at DESC, id DESC LIMIT ?`).all(...n)}maxTrackedInvocationId(t={}){let r=[],n=[];t.from!==void 0&&(r.push("from_identity = ?"),n.push(t.from)),t.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(t.scope_teamfile));let s=r.length===0?"":` WHERE ${r.join(" AND ")}`,i=this.db.prepare(`SELECT COALESCE(MAX(id), 0) AS max_id FROM tracked_invocation${s}`).get(...n);return Number(i?.max_id??0)}listRunningTrackedInvocations(t={}){return this.listTrackedInvocations({...t,status:"running"})}enqueueMail(t){return this.sendMailboxMessage(t)}sendMailboxMessage(t){let r=this.stmts.insertMailboxMessage.run(t.receiver_teamfile,t.receiver_alias,t.sender_teamfile??null,t.sender_alias??null,t.root_teamfile??null,Wn(t.payload),t.created_at??O(),t.remote_transport??null,t.remote_message_id??null,t.remote_thread_id??null,t.meta??null,t.message_type??"request",t.reply_mode??"pull",t.request_mailbox_id??null);return this.getMailboxMessage(Number(r.lastInsertRowid))}listEnqueuedRequestMailFromSender(t,r,n,s){return this.stmts.listEnqueuedRequestMailFromSender.all(t,r,n,s)}listEnqueuedResponseMailFromSender(t,r,n,s){return this.stmts.listEnqueuedResponseMailFromSender.all(t,r,n,s)}listRelayMailboxLanes(t){return this.stmts.listRelayMailboxLanes.all(Math.max(1,Math.trunc(t)))}markMailDelivered(t,r,n){let s=[...new Set(t.map(o=>Math.trunc(o)).filter(o=>Number.isInteger(o)&&o>0))];if(s.length===0)return 0;let i=Wn(r);this.db.exec("BEGIN IMMEDIATE");try{let o=0;for(let a of s)o+=this.stmts.markMailboxMessageDelivered.run(n,i,a).changes;return this.db.exec("COMMIT"),o}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}markRelayRequestDelivered(t,r,n){let s=Wn(r);this.db.exec("BEGIN IMMEDIATE");try{let i=0;for(let o of t)this.stmts.markMailboxMessageDeliveredIfUnchanged.run(n,s,o.id,o.delivering_at,o.delivery_holder_pid,o.delivery_holder_host).changes===1&&(i+=1);return this.db.exec("COMMIT"),i}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}markRelayRequestDeliveredAndEnqueueResponses(t,r,n){let s=Wn(r);this.db.exec("BEGIN IMMEDIATE");try{let i=0,o=0;for(let a of t){if(this.stmts.markMailboxMessageDeliveredIfUnchanged.run(n,s,a.id,a.delivering_at,a.delivery_holder_pid,a.delivery_holder_host).changes!==1||(i+=1,a.sender_teamfile===null||a.sender_alias===null))continue;let c=this.stmts.insertMailboxResponseIfAbsent.run(a.sender_teamfile,a.sender_alias,a.receiver_teamfile,a.receiver_alias,a.root_teamfile,s,n,null,null,null,null,a.reply_mode,a.id);o+=c.changes}return this.db.exec("COMMIT"),{marked:i,responses:o}}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}claimMailForDelivery(t,r,n=process.pid,s=Gn()){let i=[...new Set(t.map(o=>Math.trunc(o)).filter(o=>Number.isInteger(o)&&o>0))];if(i.length===0)return[];this.db.exec("BEGIN IMMEDIATE");try{let o=[];for(let a of i)if(this.stmts.claimMailboxMessageDelivery.run(r,n,s,a).changes===1){let c=this.getMailboxMessage(a);c!==null&&o.push(c)}return this.db.exec("COMMIT"),o}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}clearMailDelivery(t){let r=[...new Set(t.map(n=>Math.trunc(n)).filter(n=>Number.isInteger(n)&&n>0))];if(r.length===0)return 0;this.db.exec("BEGIN IMMEDIATE");try{let n=0;for(let s of r)n+=this.stmts.clearMailboxMessageDelivery.run(s).changes;return this.db.exec("COMMIT"),n}catch(n){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),n}}reclaimMailboxDeliveryIfUnchanged(t){return this.stmts.clearMailboxMessageDeliveryIfUnchanged.run(t.id,t.delivering_at,t.delivery_holder_pid,t.delivery_holder_host).changes!==1?null:this.getMailboxMessage(t.id)}reclaimStaleMailboxDeliveries(t){let r=this.stmts.listInFlightMailboxDeliveries.all(),n=[];this.db.exec("BEGIN IMMEDIATE");try{for(let s of r){if(!DI(s,t))continue;let i=this.reclaimMailboxDeliveryIfUnchanged(s);i!==null&&n.push(i)}return this.db.exec("COMMIT"),n}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}listDeliveredReceiptsForSender(t,r){return this.stmts.listDeliveredReceiptsForSender.all(t,r)}listOutboundPendingForSender(t,r){return this.stmts.listOutboundPendingForSender.all(t,r)}getMailboxMessage(t){return this.stmts.getMailboxMessage.get(t)??null}peekMailboxMessages(t,r=1e3){return this.stmts.listMailboxMessagesForReceiver.all(t.receiver_teamfile,t.receiver_alias,Math.max(1,Math.min(1e3,Math.trunc(r))))}recvMailboxMessages(t){return this.recvMailboxMessagesTxn(t.receiver_teamfile,t.receiver_alias)}updateTeamChatLogResponse(t,r){this.stmts.updateTeamChatLogResponse.run(r.response,r.status,r.error_detail,r.truncated,t)}getAgentInflight(t,r){return this.stmts.getAgentInflight.get(t,r)??null}listAgentInflight(){return this.stmts.listAgentInflight.all()}tryAcquireAgentInflight(t,r){return this.tryAcquireAgentInflightTxn(t,r)}clearAgentInflight(t,r){this.stmts.clearAgentInflight.run(t,r)}clearObservedTerminalAgentInflight(t,r,n){return this.stmts.clearObservedTerminalAgentInflight.run({receiver_teamfile:t,receiver_alias:r,observed_sender_teamfile:n.sender_teamfile,observed_sender_alias:n.sender_alias,observed_started_at:n.started_at,observed_holder_pid:n.holder_pid}).changes===1}releaseAgentInflight(t){this.db.exec("BEGIN IMMEDIATE");try{let r=this.getAgentInflight(t.receiver_teamfile,t.receiver_alias);if(r===null||r.sender_teamfile!==t.sender_teamfile||r.sender_alias!==t.sender_alias)return this.db.exec("COMMIT"),!1;if(r.active_count<=1)return this.stmts.clearAgentInflightIfSender.run(t.receiver_teamfile,t.receiver_alias,t.sender_teamfile,t.sender_alias),this.db.exec("COMMIT"),!0;let n=this.stmts.decrementAgentInflight.run(t.receiver_teamfile,t.receiver_alias,t.sender_teamfile,t.sender_alias);return this.db.exec("COMMIT"),n.changes===1}catch(r){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),r}}clearAgentInflightOlderThan(t){return this.stmts.clearAgentInflightOlderThan.run(t).changes}getTerminalLock(t,r){let n=this.stmts.getRuntimeState.get(Bn,Hn(t,r),qn);return n===void 0?null:Nm(n.data)}setTerminalLock(t){this.stmts.upsertRuntimeState.run(Bn,Hn(t.teamfile,t.alias),qn,JSON.stringify(t),t.last_heartbeat)}heartbeatTerminalLock(t,r,n,s){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getTerminalLock(t,r);if(i===null||i.lock_id!==n)return this.db.exec("COMMIT"),!1;let o={...i,last_heartbeat:s};return this.stmts.upsertRuntimeState.run(Bn,Hn(t,r),qn,JSON.stringify(o),s),this.db.exec("COMMIT"),!0}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}clearTerminalLock(t,r,n){this.db.exec("BEGIN IMMEDIATE");try{let s=this.getTerminalLock(t,r);if(s===null||s.lock_id!==n)return this.db.exec("COMMIT"),!1;let i=this.stmts.deleteRuntimeState.run(Bn,Hn(t,r),qn);return this.db.exec("COMMIT"),i.changes===1}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}getRuntimeProcessLock(t,r,n){let s=this.stmts.getRuntimeState.get(t,r,n);return s===void 0?null:MI(s.data)}tryAcquireRuntimeProcessLock(t,r,n,s,i=O()){this.db.exec("BEGIN IMMEDIATE");try{let o=this.getRuntimeProcessLock(t,r,n);if(o!==null&&!jI(o,s))return this.db.exec("COMMIT"),{acquired:!1,current:o};let a={lock_id:Om(),holder_pid:process.pid,holder_host:Gn(),started_at:i,last_heartbeat:i};return this.stmts.upsertRuntimeState.run(t,r,n,JSON.stringify(a),i),this.db.exec("COMMIT"),{acquired:!0,lock:a,previous:o}}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}clearRuntimeProcessLock(t,r,n,s){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getRuntimeProcessLock(t,r,n);if(i===null||i.lock_id!==s)return this.db.exec("COMMIT"),!1;let o=this.stmts.deleteRuntimeState.run(t,r,n);return this.db.exec("COMMIT"),o.changes===1}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}getRun(t){return this.stmts.getRun.get(t)??null}setRunCurrentState(t,r){return this.stmts.setRunCurrentState.run(r,t),this.stmts.getRun.get(t)??null}setRunPausedState(t,r,n){return this.stmts.setRunPausedState.run(r,n,t),this.stmts.getRun.get(t)??null}setRunPendingEscalationDecision(t,r){return this.stmts.setRunPendingEscalationDecision.run(r,t),this.stmts.getRun.get(t)??null}setRunTerminalState(t,r){return this.stmts.setRunTerminalState.run(r,O(),t),this.stmts.getRun.get(t)??null}pauseJob(t){return this.stmts.pauseJob.run(t),this.getJob(t)}resumeRun(t,r){return this.resumeRunTxn(t,r,O())}insertStep(t){let r=this.stmts.insertStep.run(t.run_id,t.parent_step_id??null,t.state_name,t.outcome??null,t.status_detail??null,O());return this.stmts.getStep.get(r.lastInsertRowid)}finishStep(t,r,n){return this.stmts.finishStep.run(r??null,n??null,O(),t),this.stmts.getStep.get(t)??null}listStepsForRun(t){return this.stmts.listStepsForRun.all(t)}listLatestStepOutcomesByState(t){let r=this.stmts.listLatestStepOutcomesByState.all(t),n={};for(let s of r)n[s.state_name]=s.outcome;return n}insertSubmittedPr(t){let r=this.stmts.insertSubmittedPr.run(t.repo,t.pr_url,t.issue_url??null,t.local_path??null,t.branch??null,t.head_sha??null,t.status??"watching",t.submitted_at??O(),t.last_known_state??null,t.created_by_run_id??null);return this.stmts.getSubmittedPr.get(r.lastInsertRowid)}listSubmittedPrs(t){return t?.status!==void 0?this.stmts.listSubmittedPrsByStatus.all(t.status):this.stmts.listSubmittedPrs.all()}getSubmittedPr(t){return this.stmts.getSubmittedPr.get(t)??null}findSubmittedPrByUrl(t){return this.stmts.findSubmittedPrByUrl.get(t)??null}insertStepArtifact(t){let r=this.stmts.insertStepArtifact.run(t.step_id,t.kind,t.path??null,t.content??null,t.sha??null,t.provider_call_mode??null,O());return this.stmts.getStepArtifact.get(r.lastInsertRowid)}insertExternalObject(t){let n=this.stmts.insertExternalObject.run(t.type,t.provider,t.project_id,t.run_id??null,t.external_id,t.url??null,t.status??null,t.metadata??null,t.last_seen_at??null,O()).changes===1;return{row:this.stmts.findExternalObjectByUnique.get(t.provider,t.type,t.external_id),inserted:n}}insertExternalSignal(t){let r=this.stmts.insertExternalSignal.run(t.object_id,t.kind,t.source??null,t.occurred_at??null,t.payload??null,t.signal_hash??null,null,O()),n=r.changes===1;return{row:t.signal_hash===void 0||t.signal_hash===null?this.stmts.getExternalSignal.get(r.lastInsertRowid):this.stmts.findExternalSignalByUnique.get(t.object_id,t.kind,t.signal_hash),inserted:n}}raiseAttention(t){let r=this.stmts.insertAttention.run(t.kind,t.severity??"warn",t.project_id??null,t.run_id??null,t.external_object_id??null,t.requires_user===!0?1:0,t.payload??null,O());return this.stmts.getAttention.get(r.lastInsertRowid)}acknowledgeAttention(t){return this.stmts.ackAttention.run(O(),t),this.stmts.getAttention.get(t)??null}upsertDurableMemory(t){let r=O();return this.stmts.upsertDurableMemory.run(t.project_id,t.type,t.name,t.description??null,t.body,r,r),this.stmts.getDurableMemoryByName.get(t.project_id,t.name)}getDurableMemoryByName(t,r){return this.stmts.getDurableMemoryByName.get(t,r)??null}deleteDurableMemory(t,r){return this.stmts.deleteDurableMemory.run(t,r).changes>0}listDurableMemory(t,r){return r!==void 0?this.stmts.listDurableMemoryByType.all(t,r):this.stmts.listDurableMemory.all(t)}indexDurableMemory(t,r){return r!==void 0&&r.length>0?this.stmts.listDurableMemory.all(t).filter(s=>r.includes(s.type)).map(({name:s,description:i,type:o,updated_at:a})=>({name:s,description:i,type:o,updated_at:a})):this.stmts.listDurableMemory.all(t).map(({name:n,description:s,type:i,updated_at:o})=>({name:n,description:s,type:i,updated_at:o}))}recordSessionSize(t){let r=this.stmts.insertSessionSize.run(t.team_name,t.alias,t.sessionid,t.input_tokens??null,t.cache_tokens??null,t.output_tokens??null,t.total_tokens??null,t.observed_at??O());return this.stmts.getSessionSize.get(r.lastInsertRowid)}latestSessionSizes(){return this.stmts.latestSessionSizes.all()}sessionSizeHistory(t,r,n=20){return this.stmts.sessionSizeHistory.all(t,r,n)}insertSessionEvent(t){let r=this.stmts.insertSessionEvent.run(t.run_id,t.step_id??null,t.kind,t.timestamp_ms,t.payload,t.payload_truncated??0,t.overflow_artifact_id??null);return this.stmts.getSessionEvent.get(r.lastInsertRowid)}listSessionEvents(t,r){return r!==void 0?this.stmts.listSessionEventsSince.all(t,r):this.stmts.listSessionEvents.all(t)}listSessionEventsSince(t,r=1e3){return this.stmts.listAllEventsSince.all(t,r)}latestAgentCall(t){let r=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call' ORDER BY id DESC LIMIT 1").get(t);if(r===void 0)return null;try{let n=JSON.parse(r.payload);return typeof n.alias!="string"||typeof n.provider!="string"?null:{alias:n.alias,provider:n.provider,...typeof n.model=="string"?{model:n.model}:{}}}catch{return null}}agentCallTokenTotals(t){let r=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call'").all(t),n=0,s=0,i=0;for(let o of r)try{let a=JSON.parse(o.payload);typeof a.tokens_in=="number"&&(n+=a.tokens_in),typeof a.tokens_out=="number"&&(s+=a.tokens_out),i+=1}catch{}return{totalInputTokens:n,totalOutputTokens:s,agentCallCount:i}}addRollupValue(t){this.stmts.upsertRollupStat.run(t.run_id,t.step_id??null,t.metric_kind,t.value,t.bucket_start_ms,t.bucket_end_ms,t.updated_at)}listRollupStats(t){return this.stmts.listRollupStats.all(t)}getRollupCursor(){return this.stmts.getRollupCursor.get("last_event_id")?.value??0}setRollupCursor(t){this.stmts.setRollupCursor.run("last_event_id",t)}insertDriftSignal(t){let r=this.stmts.insertDriftSignal.run(t.team_member_id,t.project_id??null,t.signal_kind,t.severity,t.description,t.detected_at,t.expires_at??null,t.payload??null);return this.stmts.getDriftSignal.get(r.lastInsertRowid)}listDriftSignals(t={}){return t.team_member_id!==void 0&&t.unacked?this.stmts.listUnackedDriftByMember.all(t.team_member_id):t.team_member_id!==void 0?this.stmts.listDriftByMember.all(t.team_member_id):t.project_id!==void 0?this.stmts.listDriftByProject.all(t.project_id):this.stmts.listAllDrift.all()}hasUnackedDriftSignal(t,r,n){return this.stmts.findUnackedDrift.get(t,r??null,n)!==void 0}acknowledgeDriftSignal(t){return this.stmts.ackDriftSignal.run(Date.now(),t),this.stmts.getDriftSignal.get(t)??null}insertInteractiveSession(t){let r=Date.now();return this.stmts.insertInteractiveSession.run(t.run_id,t.step_id,t.state_name,t.status,r,r),this.stmts.getInteractiveSessionByStepId.get(t.step_id)}getInteractiveSessionByStepId(t){return this.stmts.getInteractiveSessionByStepId.get(t)??null}getInteractiveSessionByRunAndState(t,r){return this.stmts.getInteractiveSessionByRunAndState.get(t,r)??null}setInteractiveAgentOutput(t,r,n){this.stmts.setInteractiveAgentOutput.run(r,n,Date.now(),t)}resumeInteractive(t,r,n){return this.resumeInteractiveTxn(t,r,n,O())}resumeEscalation(t,r){return this.resumeEscalationTxn(t,r,O())}}});import{realpathSync as WI}from"node:fs";import{resolve as BI}from"node:path";function al(e){let t=BI(e);try{return WI(t)}catch{return t}}var Mm=T(()=>{"use strict"});import{platform as jm}from"node:os";function Et(e){let t=new Vn;for(let r of e)t.registerAdapter(r);return t}var Vn,ll=T(()=>{"use strict";Mm();Vn=class{providers=[];adapters=new Map;register(t){this.providers.push(t)}async listAll(t){let r=[],n=t?.provider?this.providers.filter(o=>o.name===t.provider):this.providers,s=await Promise.all(n.map(o=>o.discoverSessions()));for(let o of s)r.push(...o);let i=r;if(t?.workspace){let o=al(t.workspace);i=i.filter(a=>al(a.cwd)===o)}if(t?.from){let o=t.from.getTime();i=i.filter(a=>a.modifiedAt.getTime()>=o)}if(t?.to){let o=t.to.getTime();i=i.filter(a=>a.modifiedAt.getTime()<=o)}return i.sort((o,a)=>a.modifiedAt.getTime()-o.modifiedAt.getTime()),t?.limit&&(i=i.slice(0,t.limit)),i}async getSession(t,r){let n=r?this.providers.filter(s=>s.name===r):this.providers;for(let s of n){let i=await s.loadSession(t);if(i)return i}return null}async resolveSession(t,r){let n=await this.resolveSessions(t,r);return n.length===1?n[0]:null}async resolveSessions(t,r){let n=r?this.providers.filter(i=>i.name===r):this.providers,s=[];for(let i of n){let o=await i.resolveSessionPath(t);o&&s.push({provider:i,filePath:o})}return s}getWatchTargets(){let t=jm()==="darwin"||jm()==="win32",r=[];for(let n of this.providers)if(typeof n.getWatchPaths=="function")for(let s of n.getWatchPaths())r.push({provider:n.name,directory:s.directory,recursive:t,filePattern:s.filePattern});return r}async deleteSession(t,r){let n=await this.resolveSession(t,r);return n?n.provider.deleteSession(t):!1}registerAdapter(t){this.adapters.set(t.name,t),this.providers.push({name:t.name,discoverSessions:()=>t.discover(),loadSession:r=>t.load(r),resolveSessionPath:r=>t.resolvePath(r),deleteSession:r=>t.delete(r),getWatchPaths:()=>t.getWatchPaths?.()??[]})}getAdapter(t){return this.adapters.get(t)}getAllAdapters(){return[...this.adapters.values()]}}});import{createReadStream as Dm}from"node:fs";import{createInterface as Pm}from"node:readline";import{stat as qI}from"node:fs/promises";import{homedir as HI}from"node:os";async function*Ue(e){let t=Dm(e,{encoding:"utf-8"}),r=Pm({input:t,crlfDelay:1/0});try{for await(let n of r){let s=n.trim();if(s)try{yield JSON.parse(s)}catch{}}}finally{t.destroy()}}async function $e(e,t){let r=[],n=Dm(e,{encoding:"utf-8"}),s=Pm({input:n,crlfDelay:1/0});try{for await(let i of s){let o=i.trim();if(o){try{r.push(JSON.parse(o))}catch{}if(r.length>=t)break}}}finally{s.close(),n.destroy()}return r}async function Ne(e){let t=await qI(e);return{createdAt:t.birthtime,modifiedAt:t.mtime}}function fe(e){return e.replace(/\\n/g,`
1359
+ `).replace(/\\t/g," ").replace(/\\r/g,"\r")}function H(e,t){return e.length<=t?e:e.slice(0,t-3)+"..."}var Te,nr=T(()=>{"use strict";Te=HI()});import{readdir as ni,stat as Fm,unlink as JI}from"node:fs/promises";import{join as Kr,basename as Um}from"node:path";function XI(e){return e==="file-history-snapshot"||e==="progress"||e==="system"||e==="queue-operation"}function GI(e){if(e.type==="system"){let t=e.message?.content;if(typeof t=="string"&&t.trim())return fe(t.trim());if(t!==void 0)return JSON.stringify(t,null,2)}return e.type==="progress"&&e.data!==void 0?JSON.stringify(e.data,null,2):JSON.stringify(e,null,2)}async function Wm(e){let t=0,r=0,n=0,s=0,i=0,o=0,a;for await(let l of Ue(e))if(!l.isSidechain){if(l.type==="user"&&!l.isMeta&&l.message){let c=l.message.content;if(typeof c=="string"){if(c.includes("<command-name>")||c.includes("<local-command-"))continue;t++}}else if(l.type==="assistant"&&l.message){let c=l.message.content;if(Array.isArray(c))for(let u of c)u.type==="text"&&t++;let d=l.message.usage;if(d){let u=d.input_tokens||0,f=d.cache_creation_input_tokens||0,m=d.cache_read_input_tokens||0,p=d.output_tokens||0;r+=u+f+m,n+=m,s+=f,i+=p;let _=u+f+m;_&&(o=_),a={inputTokens:u,cacheWriteInputTokens:f,cachedInputTokens:m,outputTokens:p}}}}return{messageCount:t,totalInputTokens:r,totalCacheReadInputTokens:n,totalCacheWriteInputTokens:s,totalOutputTokens:i,lastInputTokens:o,lastTokenUsage:a}}var si,Bm=T(()=>{"use strict";nr();si=class{name="claude";claudeDir;projectsDir;constructor(t={}){this.claudeDir=t.claudeDir||Kr(Te,".claude"),this.projectsDir=Kr(this.claudeDir,"projects")}getWatchPaths(){return[{directory:this.projectsDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let t=[],r;try{r=await ni(this.projectsDir)}catch{return t}for(let n of r){let s=Kr(this.projectsDir,n);if(!(await Fm(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await ni(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=Um(a,".jsonl");if(!/^[0-9a-f]{8}-/.test(l))continue;let c=Kr(s,a);try{let d=await this.extractSummary(c,l);d&&t.push(d)}catch{}}}return t}async extractSummary(t,r){let n=await $e(t,50),s=await Ne(t),i="",o,a,l,c,d,u;for(let m of n)if(!XI(m.type)&&(!i&&m.cwd&&(i=m.cwd),!o&&m.slug&&(o=m.slug),!a&&m.version&&(a=m.version),!u&&m.timestamp&&(u=new Date(m.timestamp)),m.type==="assistant"&&m.message?.model&&(l=m.message.model),m.type==="user"&&!m.isMeta&&m.message)){let p=m.message.content;if(typeof p=="string"){if(p.includes("<command-name>")||p.includes("<local-command-"))continue;c||(c=H(p.trim(),80)),d=H(p.trim(),80)}}if(!i)return null;let f=await Wm(t);return{provider:"claude",sessionId:r,slug:o,cwd:i,createdAt:u||s.createdAt,modifiedAt:s.modifiedAt,model:l,cliVersion:a,startCommand:"claude",firstUserMessage:c,lastUserMessage:d,messageCount:f.messageCount,filePath:t,totalInputTokens:f.totalInputTokens||void 0,totalCachedInputTokens:f.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:f.totalCacheWriteInputTokens||void 0,totalOutputTokens:f.totalOutputTokens||void 0,lastInputTokens:f.lastInputTokens||void 0,lastTokenUsage:f.lastTokenUsage}}async loadSession(t){let r=await this.resolveSessionFile(t);if(!r)return null;let n=await Ne(r),s=[],i="",o,a,l,c,d,u,f,m=t;for await(let _ of Ue(r))if(_.type!=="file-history-snapshot"&&!_.isSidechain){if(!i&&_.cwd&&(i=_.cwd),!o&&_.slug&&(o=_.slug),!a&&_.version&&(a=_.version),!c&&_.gitBranch&&(c=_.gitBranch),!f&&_.timestamp&&(f=new Date(_.timestamp)),_.sessionId&&(m=_.sessionId),_.type==="system"||_.type==="progress"||_.type==="queue-operation"){s.push({role:"system",timestamp:new Date(_.timestamp||0),content:GI(_)});continue}if(_.type==="user"&&_.message){if(_.isMeta)continue;let g=new Date(_.timestamp||0),h=_.message.content;if(typeof h=="string"){if(h.includes("<command-name>")||h.includes("<local-command-"))continue;d||(d=H(h.trim(),80)),u=H(h.trim(),80),s.push({role:"user",timestamp:g,content:fe(h.trim())})}else if(Array.isArray(h)){for(let S of h)if(S.type==="tool_result"){let y=typeof S.content=="string"?fe(S.content):JSON.stringify(S.content);s.push({role:"tool_result",timestamp:g,content:y,toolCallId:S.tool_use_id})}}}if(_.type==="assistant"&&_.message){_.message.model&&(l=_.message.model);let g=new Date(_.timestamp||0),h=_.message.content;if(Array.isArray(h))for(let S of h)S.type==="text"&&S.text?s.push({role:"assistant",timestamp:g,content:fe(S.text),model:_.message.model}):S.type==="tool_use"?s.push({role:"tool_use",timestamp:g,content:S.name||"unknown tool",toolName:S.name,toolInput:JSON.stringify(S.input,null,2),toolCallId:S.id,model:_.message.model}):S.type==="thinking"&&S.thinking&&s.push({role:"thinking",timestamp:g,content:S.thinking})}}if(!i)return null;let p=await Wm(r);return{provider:"claude",sessionId:m,slug:o,cwd:i,createdAt:f||n.createdAt,modifiedAt:n.modifiedAt,model:l,cliVersion:a,startCommand:"claude",gitBranch:c,firstUserMessage:d,lastUserMessage:u,messageCount:p.messageCount,filePath:r,totalInputTokens:p.totalInputTokens||void 0,totalCachedInputTokens:p.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:p.totalCacheWriteInputTokens||void 0,totalOutputTokens:p.totalOutputTokens||void 0,lastInputTokens:p.lastInputTokens||void 0,lastTokenUsage:p.lastTokenUsage,messages:s}}async resolveSessionPath(t){return this.resolveSessionFile(t)}async deleteSession(t){let r=await this.resolveSessionFile(t);return r?(await JI(r),!0):!1}async resolveSessionFile(t){let r;try{r=await ni(this.projectsDir)}catch{return null}let n=[];for(let o of r){let a=Kr(this.projectsDir,o);if(!(await Fm(a).catch(()=>null))?.isDirectory())continue;let c;try{c=await ni(a)}catch{continue}for(let d of c){if(!d.endsWith(".jsonl"))continue;let u=Um(d,".jsonl");/^[0-9a-f]{8}-/.test(u)&&n.push({filePath:Kr(a,d),fileSessionId:u})}}let s=n.find(o=>o.fileSessionId===t);if(s)return s.filePath;let i=n.filter(o=>o.fileSessionId.startsWith(t));if(i.length===1)return i[0].filePath;for(let o of n){let a=await $e(o.filePath,20);for(let l of a)if(l.slug&&l.slug===t)return o.filePath}return null}}});function ii(e){return"'"+e.replace(/'/g,"'\\''")+"'"}function KI(e,t,r){if(!r)return"";let n=e.tools[t]??cl[t],s=n?.profiles?.[r]?.flags??cl[t]?.profiles?.[r]?.flags;if(s!==void 0)return s.trim();if(n?.profile_flag)return n.profile_flag.replace(/\{\{profile\}\}/g,r).trim();throw new Error(`Profile "${r}" is not configured for tool "${t}"`)}function qm(e,t){return!!e.tools[t]}function Hm(e,t,r,n,s){let i=e.tools[t]??cl[t],o;if(i?.agent){let l=ii(n);o=i.agent.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,l)}else{let l=VI[t];if(!l)throw new Error(`No agent command configured for tool "${t}"`);let c=l.argv.map(d=>d.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,n));if(l.mode==="stdin"){let d=c.map(ii).join(" ");o=`printf '%s\\n' ${ii(n)} | ${d}`}else o=c.map(ii).join(" ")}let a=KI(e,t,s);return a&&(o+=" "+a),o}var cl,VI,Jm=T(()=>{"use strict";cl={claude:{start:"claude",resume:"claude --resume {{session_id}} --dangerously-skip-permissions",profiles:{default:{description:"Default profile",flags:""}}},codex:{start:"codex",resume:"codex resume {{session_id}} --dangerously-bypass-approvals-and-sandbox",profiles:{default:{description:"Default profile",flags:""}}},opencode:{start:"opencode",resume:"opencode --session {{session_id}}",profiles:{default:{description:"Default profile",flags:""}}},gemini:{start:"gemini",resume:"gemini --resume {{session_id}} -y",profiles:{default:{description:"Default profile",flags:""}}},copilot:{start:"copilot",resume:"copilot --resume={{session_id}} --yolo",profiles:{default:{description:"Default profile",flags:""}}},qwen:{start:"qwen",resume:"qwen --resume {{session_id}} --approval-mode yolo",profiles:{default:{description:"Default profile",flags:""}}},agy:{start:"agy",resume:"agy --conversation {{session_id}} --dangerously-skip-permissions",profiles:{default:{description:"Default profile",flags:""}}}},VI={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 Xm(e=process.env){let t=e.LMCTL_ONE_SHOT_TIMEOUT_MS;if(!t)return 6e5;let r=Number(t);return!Number.isFinite(r)||r<=0?6e5:r}var Gm=T(()=>{"use strict"});var YI,he,oi,Tt=T(()=>{"use strict";YI="ACK: waiting for explicit lmctl task.",he=`lmctl seed initial connection only. Create or pin this provider session, then stop. Do not inspect files, run commands, infer a task, delegate, edit, or begin work. Reply exactly: ${YI}`,oi=`send this exact lmctl seed instruction: "${he}"`});function Ut(e,t){let r={...e??process.env,PWD:t};return delete r.OLDPWD,r}function ZI(e,t){return t===void 0||t.length===0?e:{...e??process.env,[Kn]:t}}function We(e,t,r,n="chat"){return{...ZI(Ut(e,t),r),[zI]:n}}var Kn,zI,it=T(()=>{"use strict";Kn="LMCTL_SELF_SESSIONID",zI="LMCTL_LAUNCH_SOURCE"});import{spawn as Vm}from"node:child_process";import{mkdirSync as QI}from"node:fs";var dl,xe,Wt=T(()=>{"use strict";Jm();Gm();Tt();it();dl=class e extends Error{cancelReason;constructor(t,r){super(t),this.name="TurnAbortError",this.cancelReason=r,Object.setPrototypeOf(this,e.prototype)}},xe=class e{name;capabilities;injection;provider;binary;seedArgs;seedStdin;resumeTemplate;startTemplate;transportFn;constructor(t){this.name=t.provider.name,this.provider=t.provider,this.capabilities=t.capabilities,this.injection=t.injection,this.binary=t.binary,this.seedArgs=t.seedArgs,this.seedStdin=t.seedStdin,this.resumeTemplate=t.resumeTemplate,this.startTemplate=t.startTemplate,this.transportFn=t.transport}discover(){return this.provider.discoverSessions()}load(t){return this.provider.loadSession(t)}resolvePath(t){return this.provider.resolveSessionPath(t)}delete(t){return this.provider.deleteSession(t)}getWatchPaths(){return this.provider.getWatchPaths?.()??[]}seedArgsFor(t){let r=t?.prompt;return r===void 0?this.seedArgs:this.seedArgs.map(n=>n===he?r:n)}seed(t,r){return QI(t,{recursive:!0}),new Promise(n=>{let s;try{s=Vm(this.binary,this.seedArgsFor(r),{cwd:t,env:Ut(void 0,t),stdio:["pipe","pipe","pipe"],timeout:6e4})}catch(a){return n({success:!1,error:a instanceof Error?a.message:String(a)})}let i="";s.stderr?.on("data",a=>{i+=a.toString()});let o=r?.prompt!==void 0&&this.seedStdin!==void 0?`${r.prompt}
1360
+ `:this.seedStdin;o&&s.stdin?.write(o),s.stdin?.end(),s.on("exit",a=>{n(a===0||a===null?{success:!0}:{success:!1,error:i.trim().slice(0,200)||`exit code ${a}`})}),s.on("error",a=>{n({success:!1,error:a.message})})})}resumeCommand(t,r){return this.resumeTemplate.replace(/\{\{session_id\}\}/g,t)}startCommand(t){return this.startTemplate}manualSeedHint(t){return{launchCommand:`cd ${t} && ${this.binary}`,postLaunchNote:oi,lsCommand:`lmctl ls --provider ${this.name} --sessiondir ${t}`}}static DEFAULT_IDLE_TIMEOUT_MS=8*60*60*1e3;sendTurn(t,r){if(r.userConfig&&qm(r.userConfig,this.name)){let s=r.userConfig.tools[this.name];if(s?.agent)return this.runOneShotAgent(t,r,s.agent)}let n=r.timeoutMs??e.DEFAULT_IDLE_TIMEOUT_MS;return n<=0&&!r.signal?this.transportFn(t,{...r,binary:this.binary}):this.withTimeouts(n,t,r)}withTimeouts(t,r,n){let s=new AbortController,i,o,a="",l,c=()=>{t<=0||(clearTimeout(i),i=setTimeout(()=>{n.onIdleWarning?.(t),d(),s.abort(),l&&l({text:a,sessionId:n.sessionId,durationMs:t,status:"stalled",stalledAfterMs:t})},t))},d=()=>{clearTimeout(i)};n.signal&&(n.signal.aborted?(o="external",s.abort()):n.signal.addEventListener("abort",()=>{o="external",s.abort()},{once:!0})),c();let u={...n,binary:this.binary,signal:s.signal,onDelta:p=>{a+=p,c(),n.onDelta?.(p)},onProgress:p=>{p.kind!=="api_retry"&&c(),n.onProgress?.(p)}},f=this.transportFn(r,u).then(p=>(d(),{...p,status:"ok"})).catch(p=>{throw d(),o==="external"?new dl("Turn cancelled","external"):p}),m=new Promise(p=>{l=p});return Promise.race([f,m])}runOneShotAgent(t,r,n){let s=Hm(r.userConfig,this.name,r.sessionId,t,r.profile),i=Date.now();return new Promise((o,a)=>{let l=Xm(r.env),c=Vm(s,{shell:!0,cwd:r.cwd,env:We(r.env,r.cwd,r.sessionId),stdio:["pipe","pipe","pipe"]}),d=!1,u=!1,f=setTimeout(()=>{u=!0,c.kill()},l),m="",p="";if(c.stdout?.on("data",_=>{let g=_.toString();m+=g,r.onDelta?.(g)}),c.stderr?.on("data",_=>{p+=_.toString()}),r.signal){if(r.signal.aborted)return clearTimeout(f),c.kill(),a(new Error("Aborted"));r.signal.addEventListener("abort",()=>c.kill(),{once:!0})}c.on("exit",_=>{if(d)return;d=!0,clearTimeout(f);let g=Date.now()-i;u?a(new Error(`Agent command timed out after ${l}ms`)):_===0||_===null?o({text:m.trim(),sessionId:r.sessionId,durationMs:g}):a(new Error(p.trim().slice(0,200)||`Agent command exited with code ${_}`))}),c.on("error",_=>{d||(d=!0,clearTimeout(f),a(_))})})}}});function li(e,t){let r;if(t&&typeof t=="object"){let n=t.code;typeof n=="number"&&(r=n)}return new qt(e,r,t)}var Qe,be,Bt,ai,qt,Yr=T(()=>{"use strict";Qe=class extends Error{constructor(t,r){super(t,r),this.name=this.constructor.name}},be=class extends Qe{},Bt=class extends Qe{exitCode;signal;stderr;constructor(t,r,n=null,s){super(t),this.exitCode=r,this.signal=n,this.stderr=s}},ai=class extends Qe{line;constructor(t,r,n){super(t,{cause:n}),this.line=r}},qt=class extends Qe{rpcCode;rpcData;constructor(t,r,n){super(t),r!==void 0&&(this.rpcCode=r),n!==void 0&&(this.rpcData=n)}}});import*as fl from"node:child_process";function t0(e){if(typeof fl.spawnSync=="function")try{fl.spawnSync("taskkill",["/T","/F","/PID",String(e)],{windowsHide:!0})}catch{}}function Km(e){return e.exitCode!==null||e.signalCode!==null}function ul(e,t){return Km(e)?Promise.resolve(!0):new Promise(r=>{let n=!1,s=()=>{n||(n=!0,clearTimeout(i),r(!0))},i=setTimeout(()=>{n||(n=!0,e.removeListener("exit",s),r(!1))},t);e.once("exit",s)})}async function ot(e,t={}){let r=Date.now(),n=t.stdinEnd!==!1,s=t.softDelayMs??5e3,i=t.killDelayMs??5e3,o=t.platform??process.platform,a=t.runTaskkill??t0;if(Km(e))return{signal:"natural",elapsedMs:Date.now()-r};if(n&&e.stdin&&!e.stdin.destroyed)try{e.stdin.end()}catch{}if(await ul(e,s))return{signal:"stdin",elapsedMs:Date.now()-r};if(o==="win32"&&typeof e.pid=="number")a(e.pid);else try{e.kill("SIGTERM")}catch{}if(await ul(e,i))return{signal:"SIGTERM",elapsedMs:Date.now()-r};if(o!=="win32")try{e.kill("SIGKILL")}catch{}return await ul(e,e0)?{signal:"SIGKILL",elapsedMs:Date.now()-r}:{signal:"abandoned",elapsedMs:Date.now()-r}}var e0,ci=T(()=>{"use strict";e0=1e3});function Ym(e){ce()&&Xe({event:"legacy",msg:`[debug] ${e}`},{always:!0})}function sr(e,t){let r=n0[e];if(r)return r[t]??r.yolo}function i0(e,t){if(t.length===0)return!0;for(let r=0;r+t.length<=e.length;r++){let n=!0;for(let s=0;s<t.length;s++)if(e[r+s]!==t[s]){n=!1;break}if(n)return!0}return!1}function at(e,t,r="yolo"){if(s0.has(e)){Ym(`YOLO ${e} [mode=${r}]: ${e==="codex"?`JSON-RPC params (approvalPolicy=never, sandbox=${r==="plan"?"read-only":"danger-full-access"})`:e==="opencode"?".opencode/opencode.json (permission=allow)":"protocol/config (out-of-band)"} \u2014 no argv flag`);return}let n=r==="plan"?sr(e,"plan"):r0[e];if(!n){let s=`unknown provider "${e}" \u2014 YOLO contract not configured. Add an entry to YOLO_FLAGS in src/providers/yolo-contract.ts before spawning this provider.`;throw V({event:"yolo_assert_failed",provider:e,reason:"unconfigured_provider",args:t.join(" "),message:s}),new be(s)}if(!i0(t,n)){let s=n.join(" "),i=`${e} spawn missing YOLO flag '${s}' \u2014 YOLO is mandatory for every provider; see src/providers/yolo-contract.ts. Got argv: [${t.map(o=>JSON.stringify(o)).join(", ")}]`;throw V({event:"yolo_assert_failed",provider:e,reason:"flag_missing",required_flag:s,mode:r,args:t.join(" "),message:i}),new be(i)}Ym(`YOLO ${e} [mode=${r}]: argv flag '${n.join(" ")}'`)}var r0,n0,s0,zr=T(()=>{"use strict";Yr();ve();r0={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"],gemini:["-y"],copilot:["--yolo"],agy:["--dangerously-skip-permissions"],lmplayer:["--dangerously-skip-permissions"]},n0={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"]}};s0=new Set(["codex","opencode"])});function zm(e){if(e.length===0)return"";if(e.length===1)return e[0];let t=[];for(let r=0;r<e.length;r++)r===0?t.push(e[r]):t.push(`
1361
1361
 
1362
1362
  --- additional response (turn ${r+1} of ${e.length}; likely an injected mid-call notification) ---
1363
1363
 
1364
- `+e[r]);return t.join("")}function pl(e={}){let t=[],r="",n=!1;return{processLine(s){if(!s.trim())return;let i;try{i=JSON.parse(s)}catch{return}e.onEvent?.(i);let o=i.type;if(o==="system"&&i.subtype==="init"&&(r=i.session_id||r),o==="assistant"){let l=i.message?.content;if(Array.isArray(l))for(let c of l)c.type==="text"&&c.text&&e.onText?.(c.text)}o==="result"&&(n=!0,t.push(i))},sawResult(){return n},finalize(){if(!n)return null;let s=Zm(t);return{result:zm(s.resultTexts),sessionId:s.sessionId||r,durationMs:s.durationMs,numTurns:s.numTurns}}}}function Zm(e){let t=[],r=0,n=0,s="";for(let i of e){t.push(i.result||"");let o=i.duration_ms;typeof o=="number"&&Number.isFinite(o)&&(r+=o);let a=i.num_turns;typeof a=="number"&&Number.isFinite(a)&&(n=a);let l=i.session_id;typeof l=="string"&&l&&(s=l)}return{resultTexts:t,durationMs:r,numTurns:n,sessionId:s}}var _l=T(()=>{"use strict"});import{spawn as o0}from"node:child_process";import{existsSync as a0}from"node:fs";function c0(e){let t=e.stderr.trim().slice(0,500),r=`lmctl: ${e.tool} exited with code ${e.exitCode} before returning a final result event.
1364
+ `+e[r]);return t.join("")}function ml(e={}){let t=[],r="",n=!1;return{processLine(s){if(!s.trim())return;let i;try{i=JSON.parse(s)}catch{return}e.onEvent?.(i);let o=i.type;if(o==="system"&&i.subtype==="init"&&(r=i.session_id||r),o==="assistant"){let l=i.message?.content;if(Array.isArray(l))for(let c of l)c.type==="text"&&c.text&&e.onText?.(c.text)}o==="result"&&(n=!0,t.push(i))},sawResult(){return n},finalize(){if(!n)return null;let s=Zm(t);return{result:zm(s.resultTexts),sessionId:s.sessionId||r,durationMs:s.durationMs,numTurns:s.numTurns}}}}function Zm(e){let t=[],r=0,n=0,s="";for(let i of e){t.push(i.result||"");let o=i.duration_ms;typeof o=="number"&&Number.isFinite(o)&&(r+=o);let a=i.num_turns;typeof a=="number"&&Number.isFinite(a)&&(n=a);let l=i.session_id;typeof l=="string"&&l&&(s=l)}return{resultTexts:t,durationMs:r,numTurns:n,sessionId:s}}var pl=T(()=>{"use strict"});import{spawn as o0}from"node:child_process";import{existsSync as a0}from"node:fs";function c0(e){let t=e.stderr.trim().slice(0,500),r=`lmctl: ${e.tool} exited with code ${e.exitCode} before returning a final result event.
1365
1365
  One possible cause: the provider stream ended before a complete response was delivered; for Claude Code this can appear as "API Error: Stream idle timeout - partial response received".`;return t?`Original provider error:
1366
1366
  ${t}
1367
1367
 
1368
- ${r}`:r}function Qm(e,t){return new Promise((r,n)=>{let s=t.tool||"claude",i=t.binaryPath||l0[s]||"claude",o=["-p","","--output-format","stream-json","--input-format","stream-json"];s==="claude"&&o.push("--verbose"),t.sessionId&&o.push("--resume",t.sessionId),t.model&&o.push("--model",t.model);let a=t.permissionMode??"yolo",l=sr(s,a)??d0[s]??["--dangerously-skip-permissions"];o.push(...l);try{at(s,o,a)}catch(g){return n(g)}if(t.cwd&&!a0(t.cwd))return V({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${t.cwd}`,elapsed_ms:0}),n(new be(`sessiondir missing: ${t.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=o0(i,o,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:We(t.env,t.cwd,t.sessionId)}),d=!1;if(t.signal){if(t.signal.aborted)return d=!0,V({event:"transport_abort",provider:s,phase:"pre_spawn"}),ot(c).catch(()=>{}),n(new Error("Aborted"));t.signal.addEventListener("abort",()=>{d=!0,V({event:"transport_abort",provider:s}),ot(c).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let u=pl({onEvent:t.onEvent,onText:t.onText}),f="";function m(g){let h=u.sawResult();u.processLine(g),!h&&u.sawResult()&&c.stdin?.end()}c.stdout?.on("data",g=>{f+=g.toString();let h=f.split(`
1368
+ ${r}`:r}function Qm(e,t){return new Promise((r,n)=>{let s=t.tool||"claude",i=t.binaryPath||l0[s]||"claude",o=["-p","","--output-format","stream-json","--input-format","stream-json"];s==="claude"&&o.push("--verbose"),t.sessionId&&o.push("--resume",t.sessionId),t.model&&o.push("--model",t.model);let a=t.permissionMode??"yolo",l=sr(s,a)??d0[s]??["--dangerously-skip-permissions"];o.push(...l);try{at(s,o,a)}catch(g){return n(g)}if(t.cwd&&!a0(t.cwd))return V({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${t.cwd}`,elapsed_ms:0}),n(new be(`sessiondir missing: ${t.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=o0(i,o,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:We(t.env,t.cwd,t.sessionId)}),d=!1;if(t.signal){if(t.signal.aborted)return d=!0,V({event:"transport_abort",provider:s,phase:"pre_spawn"}),ot(c).catch(()=>{}),n(new Error("Aborted"));t.signal.addEventListener("abort",()=>{d=!0,V({event:"transport_abort",provider:s}),ot(c).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let u=ml({onEvent:t.onEvent,onText:t.onText}),f="";function m(g){let h=u.sawResult();u.processLine(g),!h&&u.sawResult()&&c.stdin?.end()}c.stdout?.on("data",g=>{f+=g.toString();let h=f.split(`
1369
1369
  `);f=h.pop()||"";for(let S of h)m(S)});let p="";c.stderr?.on("data",g=>{p+=g.toString()}),c.on("error",g=>{V({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:g.message}),n(new be(`Failed to spawn ${i}: ${g.message}`,{cause:g}))}),c.on("exit",g=>{if(d)return;f.trim()&&m(f);let h=u.finalize();h?(wt(`stream-json: result ${h.result.slice(0,80)}${h.result.length>80?"...":""} (${h.durationMs}ms)`),r({...h,exitCode:g})):(V({event:"transport_error",provider:s,error_class:"Error",reason:"provider_no_result",exit_code:g,stderr_tail:p.slice(0,500)}),n(new Error(c0({tool:s,exitCode:g,stderr:p}))))});let _=JSON.stringify({type:"user",message:{role:"user",content:e}});c.stdin?.write(_+`
1370
- `),wt(`stream-json: prompt sent (${e.length} chars)`)})}var l0,d0,ep=T(()=>{"use strict";Yr();ci();zr();ve();it();_l();_l();l0={claude:"claude",qwen:"qwen"};d0={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"]}});function di(e={}){return[]}var hl=T(()=>{"use strict"});function gl(e){return e==="plan"?"read-only":"danger-full-access"}function tp(e="0.0.0"){return{clientInfo:{name:"lmctl",title:"lmctl",version:e},capabilities:{experimentalApi:!1}}}function yl(){return{agentItems:new Map,resultText:""}}function ui(e,t,r,n){let s=e.method;if(!s)return!1;let i=e.params;if(s==="turn/started")return t.agentItems.clear(),t.resultText="",!1;if(s==="item/started"){let o=i?.item;if(o?.type==="agentMessage"&&typeof o.id=="string"){let a=typeof o.phase=="string"?o.phase:void 0,l=a==="commentary"||a==="final_answer"?a:void 0;return t.agentItems.set(o.id,{phase:l,buffer:""}),!0}return!1}if(s==="item/agentMessage/delta"){let o=i?.delta||"",a=typeof i?.itemId=="string"?i.itemId:void 0;if(!o)return!0;let l=a?t.agentItems.get(a):void 0;return l?(l.phase==="commentary"||(l.buffer+=o),r?.(o),l.phase&&i&&(i._lmctlItemPhase=l.phase)):(t.resultText+=o,r?.(o)),!0}if(s==="item/completed"){let o=i?.item;if(o?.type==="agentMessage"&&typeof o.id=="string"){let a=t.agentItems.get(o.id);if(a){if(a.phase!=="commentary"){let l=typeof o.text=="string"?o.text:a.buffer;if(n&&typeof o.text=="string"&&o.text!==a.buffer){let c=typeof i?.threadId=="string"?i.threadId:void 0,d=typeof i?.turnId=="string"?i.turnId:void 0;n({itemId:o.id,threadId:c,turnId:d,expectedFromItemText:o.text,gotFromBuffer:a.buffer})}t.resultText+=l}t.agentItems.delete(o.id)}return!0}return!1}return!1}function wl(e){for(let[,t]of e.agentItems.entries())t.phase!=="commentary"&&t.buffer&&(e.resultText+=t.buffer);e.agentItems.clear()}function rp(e){let t=e.params,r=t?.error,n=typeof r?.message=="string"?r.message:void 0,s=n&&n.length>0?n:"(no message)";return t?.willRetry===!0?{willRetry:!0}:{willRetry:!1,turnError:new Error(`Turn errored: ${s}`)}}function El(){return{pendingCodexError:null}}function Tl(e,t){let r=rp(e);return r.willRetry||(t.pendingCodexError=r.turnError),r}function bl(e,t){if(t.pendingCodexError){let i=t.pendingCodexError;return t.pendingCodexError=null,{shouldReject:!0,turnError:i}}let n=e.params?.turn;if((typeof n?.status=="string"?n.status:void 0)==="failed"){let i=n?.error,o=typeof i?.message=="string"?i.message:void 0,a=o&&o.length>0?o:"(no message)";return{shouldReject:!0,turnError:new Error(`Turn errored: ${a}`)}}return{shouldReject:!1}}var Sl=T(()=>{"use strict"});import{spawn as u0}from"node:child_process";import{createInterface as f0}from"node:readline";import{existsSync as m0,readFileSync as p0}from"node:fs";import{fileURLToPath as _0}from"node:url";function g0(){return tp(h0)}function ir(e,t){wt(`[codex:${e}] ${JSON.stringify(t)}`)}function y0(e){let t=e.stderr.trim().slice(0,500),r=`lmctl: codex app-server exited with code ${e.exitCode} before completing the turn.
1370
+ `),wt(`stream-json: prompt sent (${e.length} chars)`)})}var l0,d0,ep=T(()=>{"use strict";Yr();ci();zr();ve();it();pl();pl();l0={claude:"claude",qwen:"qwen"};d0={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"]}});function di(e={}){return[]}var _l=T(()=>{"use strict"});function hl(e){return e==="plan"?"read-only":"danger-full-access"}function tp(e="0.0.0"){return{clientInfo:{name:"lmctl",title:"lmctl",version:e},capabilities:{experimentalApi:!1}}}function gl(){return{agentItems:new Map,resultText:""}}function ui(e,t,r,n){let s=e.method;if(!s)return!1;let i=e.params;if(s==="turn/started")return t.agentItems.clear(),t.resultText="",!1;if(s==="item/started"){let o=i?.item;if(o?.type==="agentMessage"&&typeof o.id=="string"){let a=typeof o.phase=="string"?o.phase:void 0,l=a==="commentary"||a==="final_answer"?a:void 0;return t.agentItems.set(o.id,{phase:l,buffer:""}),!0}return!1}if(s==="item/agentMessage/delta"){let o=i?.delta||"",a=typeof i?.itemId=="string"?i.itemId:void 0;if(!o)return!0;let l=a?t.agentItems.get(a):void 0;return l?(l.phase==="commentary"||(l.buffer+=o),r?.(o),l.phase&&i&&(i._lmctlItemPhase=l.phase)):(t.resultText+=o,r?.(o)),!0}if(s==="item/completed"){let o=i?.item;if(o?.type==="agentMessage"&&typeof o.id=="string"){let a=t.agentItems.get(o.id);if(a){if(a.phase!=="commentary"){let l=typeof o.text=="string"?o.text:a.buffer;if(n&&typeof o.text=="string"&&o.text!==a.buffer){let c=typeof i?.threadId=="string"?i.threadId:void 0,d=typeof i?.turnId=="string"?i.turnId:void 0;n({itemId:o.id,threadId:c,turnId:d,expectedFromItemText:o.text,gotFromBuffer:a.buffer})}t.resultText+=l}t.agentItems.delete(o.id)}return!0}return!1}return!1}function yl(e){for(let[,t]of e.agentItems.entries())t.phase!=="commentary"&&t.buffer&&(e.resultText+=t.buffer);e.agentItems.clear()}function rp(e){let t=e.params,r=t?.error,n=typeof r?.message=="string"?r.message:void 0,s=n&&n.length>0?n:"(no message)";return t?.willRetry===!0?{willRetry:!0}:{willRetry:!1,turnError:new Error(`Turn errored: ${s}`)}}function wl(){return{pendingCodexError:null}}function El(e,t){let r=rp(e);return r.willRetry||(t.pendingCodexError=r.turnError),r}function Tl(e,t){if(t.pendingCodexError){let i=t.pendingCodexError;return t.pendingCodexError=null,{shouldReject:!0,turnError:i}}let n=e.params?.turn;if((typeof n?.status=="string"?n.status:void 0)==="failed"){let i=n?.error,o=typeof i?.message=="string"?i.message:void 0,a=o&&o.length>0?o:"(no message)";return{shouldReject:!0,turnError:new Error(`Turn errored: ${a}`)}}return{shouldReject:!1}}var bl=T(()=>{"use strict"});import{spawn as u0}from"node:child_process";import{createInterface as f0}from"node:readline";import{existsSync as m0,readFileSync as p0}from"node:fs";import{fileURLToPath as _0}from"node:url";function g0(){return tp(h0)}function ir(e,t){wt(`[codex:${e}] ${JSON.stringify(t)}`)}function y0(e){let t=e.stderr.trim().slice(0,500),r=`lmctl: codex app-server exited with code ${e.exitCode} before completing the turn.
1371
1371
  One possible cause: Codex stopped before delivering a terminal turn/completed event.`;return t?`Original provider error:
1372
1372
  ${t}
1373
1373
 
1374
- ${r}`:r}function np(e,t){return new Promise((r,n)=>{let s=t.binaryPath||"codex",i=["app-server","--listen","stdio://"];t.model&&i.push("-c",`model=${JSON.stringify(t.model)}`);let o=t.isLead??t.alias?.toLowerCase()==="lead",a=o?di():[];i.push(...a),ce()&&Le(JSON.stringify({event:"codex_mcp_inject",alias:t.alias??null,isLead:o,injected:a.length>0}));let l=t.permissionMode??"yolo",c=gl(l);try{at("codex",i,l)}catch(W){return n(W)}if(t.cwd&&!m0(t.cwd))return V({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:`sessiondir missing: ${t.cwd}`}),n(new be(`sessiondir missing: ${t.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let d=u0(s,i,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:We(t.env,t.cwd,t.threadId)}),u=!1;if(t.signal){if(t.signal.aborted)return u=!0,V({event:"transport_abort",provider:"codex",phase:"pre_spawn"}),ot(d).catch(()=>{}),n(new Error("Aborted"));t.signal.addEventListener("abort",()=>{u=!0,V({event:"transport_abort",provider:"codex"}),ot(d).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let f=f0({input:d.stdout}),m=new Map,p=1,_=t.threadId||"",g="",h=!1,S=!1,y=Date.now(),w=yl(),I=El();function x(W,M={}){return new Promise((A,Q)=>{let B=p++;m.set(B,{resolve:A,reject:Q});let k=JSON.stringify({jsonrpc:"2.0",id:B,method:W,params:M});d.stdin?.write(k+`
1374
+ ${r}`:r}function np(e,t){return new Promise((r,n)=>{let s=t.binaryPath||"codex",i=["app-server","--listen","stdio://"];t.model&&i.push("-c",`model=${JSON.stringify(t.model)}`);let o=t.isLead??t.alias?.toLowerCase()==="lead",a=o?di():[];i.push(...a),ce()&&Le(JSON.stringify({event:"codex_mcp_inject",alias:t.alias??null,isLead:o,injected:a.length>0}));let l=t.permissionMode??"yolo",c=hl(l);try{at("codex",i,l)}catch(W){return n(W)}if(t.cwd&&!m0(t.cwd))return V({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:`sessiondir missing: ${t.cwd}`}),n(new be(`sessiondir missing: ${t.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let d=u0(s,i,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:We(t.env,t.cwd,t.threadId)}),u=!1;if(t.signal){if(t.signal.aborted)return u=!0,V({event:"transport_abort",provider:"codex",phase:"pre_spawn"}),ot(d).catch(()=>{}),n(new Error("Aborted"));t.signal.addEventListener("abort",()=>{u=!0,V({event:"transport_abort",provider:"codex"}),ot(d).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let f=f0({input:d.stdout}),m=new Map,p=1,_=t.threadId||"",g="",h=!1,S=!1,y=Date.now(),w=gl(),I=wl();function x(W,M={}){return new Promise((A,Q)=>{let B=p++;m.set(B,{resolve:A,reject:Q});let k=JSON.stringify({jsonrpc:"2.0",id:B,method:W,params:M});d.stdin?.write(k+`
1375
1375
  `)})}function U(W,M={}){let A=JSON.stringify({jsonrpc:"2.0",method:W,params:M});d.stdin?.write(A+`
1376
- `)}f.on("line",W=>{let M;try{M=JSON.parse(W)}catch{return}if(typeof M.id=="number"&&m.has(M.id)){let B=m.get(M.id);if(m.delete(M.id),M.error){let k=M.error,N=typeof k?.message=="string"&&k.message.length>0?k.message:JSON.stringify(M.error);B.reject(li(`codex app-server error: ${N}`,k))}else B.resolve(M);t.onEvent?.(M);return}let A=M.method;if(!A){t.onEvent?.(M);return}if(A==="thread/started"){let k=M.params?.thread;k?.id&&(_=k.id)}let Q=ce()?B=>{ir("item.text/buffer-mismatch",{itemId:B.itemId,threadId:B.threadId??null,turnId:B.turnId??null,expectedFromItemText:B.expectedFromItemText,gotFromBuffer:B.gotFromBuffer,expectedLen:B.expectedFromItemText.length,gotLen:B.gotFromBuffer.length})}:void 0;if(A==="turn/started"){let B=M.params,k=B?.turn;k?.id&&(g=k.id),ui(M,w,t.onDelta,Q),ce()&&ir("turn/started",{params:B??null})}if(ce()&&(A==="item/started"||A==="item/completed")){let B=M.params;B?.item?.type==="agentMessage"&&ir(A,{params:B??null})}if(A==="item/started"||A==="item/agentMessage/delta"||A==="item/completed"){if(A==="item/agentMessage/delta"){let B=M.params;ce()&&ir("agentMessage/delta",{params:B??null})}ui(M,w,t.onDelta,Q)}if(A==="turn/completed"){let B=M.params;if(ce())for(let[N,L]of w.agentItems.entries())L.buffer&&ir("turn/completed/unflushed-item",{itemId:N,phase:L.phase,bufferLen:L.buffer.length});wl(w),ce()&&ir("turn/completed",{params:B??null});let k=bl(M,I);k.shouldReject?(ce()&&ir("turn/completed/terminal-reject",{message:k.turnError.message}),S=!0,h=!0,d.stdin?.end(),n(k.turnError)):(h=!0,d.stdin?.end())}if(A==="error"){let B=Tl(M,I);if(ce()){let k=M.params,N=k?.error,L=typeof N?.message=="string"?N.message:"(no message)";ir(B.willRetry?"error/retry":"error/terminal-deferred",{message:L,willRetry:B.willRetry,params:k??null})}}t.onEvent?.(M)});let ue="";d.stderr?.on("data",W=>{ue+=W.toString()}),d.on("error",W=>{V({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:W.message}),n(new be(`Failed to spawn codex app-server: ${W.message}`,{cause:W}))}),d.on("exit",W=>{if(!u&&!S){if(h){r({result:w.resultText,threadId:_,turnId:g,durationMs:Date.now()-y,exitCode:W});return}if(I.pendingCodexError){n(I.pendingCodexError);return}V({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:W,stderr_tail:ue.slice(0,500)}),n(new Error(y0({exitCode:W,stderr:ue})))}}),(async()=>{try{if(await x("initialize",g0()),U("initialized",{}),t.threadId)try{let W=x("thread/resume",{threadId:t.threadId,sandbox:c,approvalPolicy:"never",...t.model?{model:t.model}:{}}),M=new Promise((A,Q)=>setTimeout(()=>Q(new Error("resume timeout")),5e3));await Promise.race([W,M]),_=t.threadId}catch{process.stderr.write(`[codex] thread/resume failed, creating new thread
1377
- `);let M=(await x("thread/start",{cwd:t.cwd,approvalPolicy:"never",sandbox:c,...t.model?{model:t.model}:{}})).result?.thread;M?.id&&(_=M.id)}else{let M=(await x("thread/start",{cwd:t.cwd,approvalPolicy:"never",sandbox:c,...t.model?{model:t.model}:{}})).result?.thread;M?.id&&(_=M.id)}await x("turn/start",{threadId:_,input:[{type:"text",text:e}],...t.model?{model:t.model}:{}})}catch(W){ot(d).catch(()=>{}),n(W instanceof Error?W:new Error(String(W)))}})()})}var h0,sp=T(()=>{"use strict";ve();ve();Yr();ci();zr();hl();ve();it();Sl();Sl();h0=(()=>{try{let e=new URL("../../../package.json",import.meta.url),t=JSON.parse(p0(_0(e),"utf8"));return typeof t.version=="string"?t.version:"0.0.0"}catch{return"0.0.0"}})()});import{existsSync as ap,mkdirSync as w0,readFileSync as lp,writeFileSync as ip}from"node:fs";import{join as Yn,resolve as E0}from"node:path";function cp(e){if(e==="allow")return!0;if(e&&typeof e=="object"&&!Array.isArray(e)){let t=Object.entries(e);if(t.length===1&&t[0][0]==="*"&&t[0][1]==="allow")return!0}return!1}function vl(e,t,r={existsSync:ap,readFileSync:lp}){let n=[];for(let s of e){if(s.provider.trim().toLowerCase()!=="opencode")continue;let i=E0(t,s.sessiondir??t);for(let o of T0(i)){let a=b0(o,r);a!==void 0&&Object.prototype.hasOwnProperty.call(a,"permission")&&(cp(a.permission)||n.push(`[${s.alias}] ${o} sets a non-allow \`permission\`, which opencode merges over lmctl's YOLO (.opencode/opencode.json permission:"allow") \u2014 the member may hang on permission prompts. Set \`permission: "allow"\` in that file (or remove the key).`))}}return n}function T0(e){return[Yn(e,".opencode","opencode.jsonc"),Yn(e,"opencode.jsonc"),Yn(e,"opencode.json")]}function b0(e,t){try{if(!t.existsSync(e))return;let r=t.readFileSync(e,"utf-8"),n=JSON.parse(S0(r));return n===null||typeof n!="object"||Array.isArray(n)?void 0:n}catch{return}}function S0(e){let t="",r=!1,n="",s=!1;for(let i=0;i<e.length;i+=1){let o=e[i],a=e[i+1];if(r){t+=o,s?s=!1:o==="\\"?s=!0:o===n&&(r=!1,n="");continue}if(o==='"'||o==="'"){r=!0,n=o,t+=o;continue}if(o==="/"&&a==="/"){for(;i<e.length&&e[i]!==`
1376
+ `)}f.on("line",W=>{let M;try{M=JSON.parse(W)}catch{return}if(typeof M.id=="number"&&m.has(M.id)){let B=m.get(M.id);if(m.delete(M.id),M.error){let k=M.error,N=typeof k?.message=="string"&&k.message.length>0?k.message:JSON.stringify(M.error);B.reject(li(`codex app-server error: ${N}`,k))}else B.resolve(M);t.onEvent?.(M);return}let A=M.method;if(!A){t.onEvent?.(M);return}if(A==="thread/started"){let k=M.params?.thread;k?.id&&(_=k.id)}let Q=ce()?B=>{ir("item.text/buffer-mismatch",{itemId:B.itemId,threadId:B.threadId??null,turnId:B.turnId??null,expectedFromItemText:B.expectedFromItemText,gotFromBuffer:B.gotFromBuffer,expectedLen:B.expectedFromItemText.length,gotLen:B.gotFromBuffer.length})}:void 0;if(A==="turn/started"){let B=M.params,k=B?.turn;k?.id&&(g=k.id),ui(M,w,t.onDelta,Q),ce()&&ir("turn/started",{params:B??null})}if(ce()&&(A==="item/started"||A==="item/completed")){let B=M.params;B?.item?.type==="agentMessage"&&ir(A,{params:B??null})}if(A==="item/started"||A==="item/agentMessage/delta"||A==="item/completed"){if(A==="item/agentMessage/delta"){let B=M.params;ce()&&ir("agentMessage/delta",{params:B??null})}ui(M,w,t.onDelta,Q)}if(A==="turn/completed"){let B=M.params;if(ce())for(let[N,L]of w.agentItems.entries())L.buffer&&ir("turn/completed/unflushed-item",{itemId:N,phase:L.phase,bufferLen:L.buffer.length});yl(w),ce()&&ir("turn/completed",{params:B??null});let k=Tl(M,I);k.shouldReject?(ce()&&ir("turn/completed/terminal-reject",{message:k.turnError.message}),S=!0,h=!0,d.stdin?.end(),n(k.turnError)):(h=!0,d.stdin?.end())}if(A==="error"){let B=El(M,I);if(ce()){let k=M.params,N=k?.error,L=typeof N?.message=="string"?N.message:"(no message)";ir(B.willRetry?"error/retry":"error/terminal-deferred",{message:L,willRetry:B.willRetry,params:k??null})}}t.onEvent?.(M)});let ue="";d.stderr?.on("data",W=>{ue+=W.toString()}),d.on("error",W=>{V({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:W.message}),n(new be(`Failed to spawn codex app-server: ${W.message}`,{cause:W}))}),d.on("exit",W=>{if(!u&&!S){if(h){r({result:w.resultText,threadId:_,turnId:g,durationMs:Date.now()-y,exitCode:W});return}if(I.pendingCodexError){n(I.pendingCodexError);return}V({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:W,stderr_tail:ue.slice(0,500)}),n(new Error(y0({exitCode:W,stderr:ue})))}}),(async()=>{try{if(await x("initialize",g0()),U("initialized",{}),t.threadId)try{let W=x("thread/resume",{threadId:t.threadId,sandbox:c,approvalPolicy:"never",...t.model?{model:t.model}:{}}),M=new Promise((A,Q)=>setTimeout(()=>Q(new Error("resume timeout")),5e3));await Promise.race([W,M]),_=t.threadId}catch{process.stderr.write(`[codex] thread/resume failed, creating new thread
1377
+ `);let M=(await x("thread/start",{cwd:t.cwd,approvalPolicy:"never",sandbox:c,...t.model?{model:t.model}:{}})).result?.thread;M?.id&&(_=M.id)}else{let M=(await x("thread/start",{cwd:t.cwd,approvalPolicy:"never",sandbox:c,...t.model?{model:t.model}:{}})).result?.thread;M?.id&&(_=M.id)}await x("turn/start",{threadId:_,input:[{type:"text",text:e}],...t.model?{model:t.model}:{}})}catch(W){ot(d).catch(()=>{}),n(W instanceof Error?W:new Error(String(W)))}})()})}var h0,sp=T(()=>{"use strict";ve();ve();Yr();ci();zr();_l();ve();it();bl();bl();h0=(()=>{try{let e=new URL("../../../package.json",import.meta.url),t=JSON.parse(p0(_0(e),"utf8"));return typeof t.version=="string"?t.version:"0.0.0"}catch{return"0.0.0"}})()});import{existsSync as ap,mkdirSync as w0,readFileSync as lp,writeFileSync as ip}from"node:fs";import{join as Yn,resolve as E0}from"node:path";function cp(e){if(e==="allow")return!0;if(e&&typeof e=="object"&&!Array.isArray(e)){let t=Object.entries(e);if(t.length===1&&t[0][0]==="*"&&t[0][1]==="allow")return!0}return!1}function Sl(e,t,r={existsSync:ap,readFileSync:lp}){let n=[];for(let s of e){if(s.provider.trim().toLowerCase()!=="opencode")continue;let i=E0(t,s.sessiondir??t);for(let o of T0(i)){let a=b0(o,r);a!==void 0&&Object.prototype.hasOwnProperty.call(a,"permission")&&(cp(a.permission)||n.push(`[${s.alias}] ${o} sets a non-allow \`permission\`, which opencode merges over lmctl's YOLO (.opencode/opencode.json permission:"allow") \u2014 the member may hang on permission prompts. Set \`permission: "allow"\` in that file (or remove the key).`))}}return n}function T0(e){return[Yn(e,".opencode","opencode.jsonc"),Yn(e,"opencode.jsonc"),Yn(e,"opencode.json")]}function b0(e,t){try{if(!t.existsSync(e))return;let r=t.readFileSync(e,"utf-8"),n=JSON.parse(S0(r));return n===null||typeof n!="object"||Array.isArray(n)?void 0:n}catch{return}}function S0(e){let t="",r=!1,n="",s=!1;for(let i=0;i<e.length;i+=1){let o=e[i],a=e[i+1];if(r){t+=o,s?s=!1:o==="\\"?s=!0:o===n&&(r=!1,n="");continue}if(o==='"'||o==="'"){r=!0,n=o,t+=o;continue}if(o==="/"&&a==="/"){for(;i<e.length&&e[i]!==`
1378
1378
  `;)i+=1;i<e.length&&(t+=e[i]);continue}if(o==="/"&&a==="*"){for(i+=2;i<e.length&&!(e[i]==="*"&&e[i+1]==="/");)i+=1;i+=1;continue}t+=o}return t.replace(/,\s*([}\]])/g,"$1")}function fi(e,t={}){let r=Yn(e,".opencode"),n=Yn(r,"opencode.json");if(!ap(n)){w0(r,{recursive:!0});let o=JSON.stringify({permission:"allow"},null,2);return ip(n,o+`
1379
1379
  `,"utf-8"),!0}let s;try{s=JSON.parse(lp(n,"utf-8"))}catch{return console.log(op.yellow(` .opencode/opencode.json at ${n} is malformed \u2014 skipping opencode config install.`)),!1}if(typeof s!="object"||s===null)return console.log(op.yellow(` .opencode/opencode.json at ${n} is not an object \u2014 skipping opencode config install.`)),!1;let i=!1;return s.permission===void 0&&(s.permission="allow",i=!0),cp(s.permission)||V({event:"opencode_yolo_override",provider:"opencode",config_path:n,user_permission:s.permission,message:`opencode.json has a user-set 'permission' value other than 'allow' \u2014 lmctl's YOLO contract is NOT in effect; turns may hang waiting on permission prompts. Set permission: "allow" or remove the key to restore YOLO.`}),i&&ip(n,JSON.stringify(s,null,2)+`
1380
- `,"utf-8"),i}var op,mi=T(()=>{"use strict";ve();op={yellow:e=>e}});function fp(e){let t=[...e.matchAll(v0)];if(t.length>0){let r=t[t.length-1],n=(r.index??0)+r[0].length;return dp(e.slice(n).trimStart())}return dp(A0(e.replace(k0,"")))}function A0(e){let t=I0.exec(e);if(t===null)return e;let r=e.slice(t[0].length),n=[...r.matchAll(N0)];if(n.length<2)return e;let s=n[0],i=(s.index??0)+s[0].length;return r.slice(i).trimStart()}function dp(e){let t=[...e.matchAll(x0)];if(t.length===0)return e;let r=t[t.length-1],n=(r.index??0)+r[0].length;return e.slice(n).trimStart()}function zn(e,t=""){let r=e.result;return typeof r?.sessionId=="string"&&r.sessionId.length>0?r.sessionId:t}function mp(e){let t=e.result;return typeof t?.stopReason=="string"?t.stopReason:""}function kl(e={}){let t="",r="",n="",s=!1,i=!1,o=()=>({result:e.tool==="gemini"?fp(r):r,sessionId:t,stopReason:n});return{setSessionId(a){t=a},beginTurn(){r="",n="",s=!1,i=!0},completeTurn(a){return n=mp(a),s=!0,i=!1,o()},processMessage(a){if(a.method!=="session/update")return!1;let c=a.params?.update;if(c?.sessionUpdate!=="agent_message_chunk")return!1;let d=c.content,u=typeof d?.text=="string"?d.text:"";return u&&i&&(r+=u,e.onDelta?.(u)),!0},finalize(){return s?o():null}}}var up,v0,k0,I0,N0,x0,Il=T(()=>{"use strict";up="(?:png|jpe?g|webp|heic|pdf)",v0=new RegExp(`\\bSTANCE:\\s*\\S+_\\d{6,}\\.${up}\\s*`,"gi"),k0=new RegExp(`^ACK:\\s*waiting for explicit lmctl task\\.\\d{6,}\\.${up}\\s*`,"i"),I0=/^ACK:\s*waiting for explicit lmctl task[._]?\s*/i,N0=/^STANCE:\s+\S+\s*$/gim,x0=/\[Thought:\s*true\]\s*/gi});import{spawn as R0}from"node:child_process";import{existsSync as L0}from"node:fs";import{createInterface as O0}from"node:readline";function $0(e){let t=e.stderr.trim().slice(0,500),r=`lmctl: ${e.tool} ACP process exited with code ${e.exitCode} before completing the prompt.
1380
+ `,"utf-8"),i}var op,mi=T(()=>{"use strict";ve();op={yellow:e=>e}});function fp(e){let t=[...e.matchAll(v0)];if(t.length>0){let r=t[t.length-1],n=(r.index??0)+r[0].length;return dp(e.slice(n).trimStart())}return dp(A0(e.replace(k0,"")))}function A0(e){let t=I0.exec(e);if(t===null)return e;let r=e.slice(t[0].length),n=[...r.matchAll(N0)];if(n.length<2)return e;let s=n[0],i=(s.index??0)+s[0].length;return r.slice(i).trimStart()}function dp(e){let t=[...e.matchAll(x0)];if(t.length===0)return e;let r=t[t.length-1],n=(r.index??0)+r[0].length;return e.slice(n).trimStart()}function zn(e,t=""){let r=e.result;return typeof r?.sessionId=="string"&&r.sessionId.length>0?r.sessionId:t}function mp(e){let t=e.result;return typeof t?.stopReason=="string"?t.stopReason:""}function vl(e={}){let t="",r="",n="",s=!1,i=!1,o=()=>({result:e.tool==="gemini"?fp(r):r,sessionId:t,stopReason:n});return{setSessionId(a){t=a},beginTurn(){r="",n="",s=!1,i=!0},completeTurn(a){return n=mp(a),s=!0,i=!1,o()},processMessage(a){if(a.method!=="session/update")return!1;let c=a.params?.update;if(c?.sessionUpdate!=="agent_message_chunk")return!1;let d=c.content,u=typeof d?.text=="string"?d.text:"";return u&&i&&(r+=u,e.onDelta?.(u)),!0},finalize(){return s?o():null}}}var up,v0,k0,I0,N0,x0,kl=T(()=>{"use strict";up="(?:png|jpe?g|webp|heic|pdf)",v0=new RegExp(`\\bSTANCE:\\s*\\S+_\\d{6,}\\.${up}\\s*`,"gi"),k0=new RegExp(`^ACK:\\s*waiting for explicit lmctl task\\.\\d{6,}\\.${up}\\s*`,"i"),I0=/^ACK:\s*waiting for explicit lmctl task[._]?\s*/i,N0=/^STANCE:\s+\S+\s*$/gim,x0=/\[Thought:\s*true\]\s*/gi});import{spawn as R0}from"node:child_process";import{existsSync as L0}from"node:fs";import{createInterface as O0}from"node:readline";function $0(e){let t=e.stderr.trim().slice(0,500),r=`lmctl: ${e.tool} ACP process exited with code ${e.exitCode} before completing the prompt.
1381
1381
  One possible cause: the provider process failed before a complete ACP response was delivered.`;return t?`Original provider error:
1382
1382
  ${t}
1383
1383
 
1384
1384
  ${r}`:r}function pp(e,t){let r=C0[t.tool];return r?new Promise((n,s)=>{let i=t.binaryPath||r.binary;if(t.tool==="opencode")try{fi(t.cwd)}catch(y){V({event:"opencode_config_install_failed",cwd:t.cwd,error_message:y instanceof Error?y.message:String(y)})}let o=t.permissionMode??"yolo",a=[...r.args];if(o==="plan")if(t.tool==="gemini"){let y=sr("gemini","plan"),w=sr("gemini","yolo");a=a.filter(I=>!(w??[]).includes(I)),y&&a.push(...y)}else t.tool==="copilot"&&process.stderr.write(`[acp] copilot has no plan-mode flag in --acp mode; --permission-mode plan is not honored (running yolo). See src/providers/yolo-contract.ts.
1385
1385
  `);t.model&&t.tool==="gemini"&&a.push("--model",t.model);let l=t.tool==="copilot"?"yolo":o;try{at(t.tool,a,l)}catch(y){return s(y)}if(t.model&&t.tool==="copilot"&&process.stderr.write(`[acp] copilot does not support per-session model selection in --acp mode (model="${t.model}" ignored). Set the default via copilot's /model slash command in an interactive \`lmctl terminal\` session.
1386
- `),t.cwd&&!L0(t.cwd))return V({event:"transport_error",provider:t.tool,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${t.cwd}`,elapsed_ms:0}),s(new be(`sessiondir missing: ${t.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=R0(i,a,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:We(t.env,t.cwd,t.sessionId)}),d=Date.now(),u=!1;if(t.signal){if(t.signal.aborted)return u=!0,V({event:"transport_abort",provider:t.tool,phase:"pre_spawn"}),ot(c).catch(()=>{}),s(new Error("Aborted"));t.signal.addEventListener("abort",()=>{u=!0,V({event:"transport_abort",provider:t.tool,elapsed_ms:Date.now()-d}),ot(c).catch(()=>{}),s(new Error("Aborted"))},{once:!0})}let f=O0({input:c.stdout}),m=new Map,p=t.sessionId||"",_=kl({tool:t.tool,onDelta:t.onDelta});_.setSessionId(p);function g(y,w={}){return new Promise((I,x)=>{let U=M0++;m.set(U,{resolve:I,reject:x});let ue=JSON.stringify({jsonrpc:"2.0",id:U,method:y,params:w});Xe({event:"acp_send",direction:"SEND",provider:t.tool,method:y,id:U,params:w}),c.stdin?.write(ue+`
1386
+ `),t.cwd&&!L0(t.cwd))return V({event:"transport_error",provider:t.tool,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${t.cwd}`,elapsed_ms:0}),s(new be(`sessiondir missing: ${t.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=R0(i,a,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:We(t.env,t.cwd,t.sessionId)}),d=Date.now(),u=!1;if(t.signal){if(t.signal.aborted)return u=!0,V({event:"transport_abort",provider:t.tool,phase:"pre_spawn"}),ot(c).catch(()=>{}),s(new Error("Aborted"));t.signal.addEventListener("abort",()=>{u=!0,V({event:"transport_abort",provider:t.tool,elapsed_ms:Date.now()-d}),ot(c).catch(()=>{}),s(new Error("Aborted"))},{once:!0})}let f=O0({input:c.stdout}),m=new Map,p=t.sessionId||"",_=vl({tool:t.tool,onDelta:t.onDelta});_.setSessionId(p);function g(y,w={}){return new Promise((I,x)=>{let U=M0++;m.set(U,{resolve:I,reject:x});let ue=JSON.stringify({jsonrpc:"2.0",id:U,method:y,params:w});Xe({event:"acp_send",direction:"SEND",provider:t.tool,method:y,id:U,params:w}),c.stdin?.write(ue+`
1387
1387
  `)})}f.on("line",y=>{let w;try{w=JSON.parse(y)}catch{return}if(Xe({event:"acp_recv",direction:"RECV",provider:t.tool,id:typeof w.id=="number"?w.id:void 0,method:typeof w.method=="string"?w.method:void 0,preview:JSON.stringify(w).slice(0,300)}),t.onEvent?.(w),typeof w.id=="number"&&m.has(w.id)){let x=m.get(w.id);if(m.delete(w.id),w.error){let U=w.error,ue=typeof U?.message=="string"&&U.message.length>0?U.message:JSON.stringify(w.error);x.reject(li(`ACP RPC error: ${ue}`,U))}else x.resolve(w);return}let I=w.method;if(I){if(typeof w.id=="number"){V({event:"acp_unhandled_request",provider:t.tool,method:I,id:w.id,params:w.params});let x=JSON.stringify({jsonrpc:"2.0",id:w.id,error:{code:-32601,message:`Method not found: ${I} (lmctl does not implement server-side ACP methods)`}});Xe({event:"acp_send",direction:"SEND",provider:t.tool,replyTo:w.id,error:"method not found"}),c.stdin?.write(x+`
1388
1388
  `);return}_.processMessage(w)}});let h="";c.stderr?.on("data",y=>{h+=y.toString()}),c.on("error",y=>{V({event:"transport_error",provider:t.tool,error_class:"TransportConnectionError",error_message:y.message,elapsed_ms:Date.now()-d}),s(new be(`Failed to spawn ${r.binary} ${r.args.join(" ")}: ${y.message}`,{cause:y}))}),c.on("exit",y=>{if(u)return;let w=_.finalize();w!==null?n({result:w.result,sessionId:w.sessionId,durationMs:Date.now()-d,stopReason:w.stopReason,exitCode:y}):(V({event:"transport_error",provider:t.tool,error_class:"Error",reason:"provider_no_result",exit_code:y,stderr_tail:h.slice(0,500),elapsed_ms:Date.now()-d}),s(new Error($0({tool:t.tool,exitCode:y,stderr:h}))))});function S(y,w={}){let I=JSON.stringify({jsonrpc:"2.0",method:y,params:w});c.stdin?.write(I+`
1389
1389
  `)}(async()=>{try{if(await g("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),S("notifications/initialized"),t.sessionId)try{let I=await g("session/load",{sessionId:t.sessionId,cwd:t.cwd,mcpServers:[]});p=zn(I,t.sessionId),_.setSessionId(p)}catch(I){if(t.requireResume)throw new Error(`Cannot resume session ${t.sessionId} via ACP: ${I instanceof Error?I.message:String(I)}`);process.stderr.write(`[acp] session/load failed for ${t.sessionId}, creating new session
1390
1390
  `);let x=await g("session/new",{cwd:t.cwd,mcpServers:[]});p=zn(x),_.setSessionId(p)}else{let I=await g("session/new",{cwd:t.cwd,mcpServers:[]});p=zn(I),_.setSessionId(p)}if(t.model&&t.tool==="opencode")try{await g("session/set_config_option",{sessionId:p,configId:"model",value:t.model}),wt(`acp: set_config_option(model=${t.model}) ok`)}catch(I){let x=I instanceof Error?I.message:String(I);process.stderr.write(`[acp] set_config_option(model=${t.model}) failed: ${x}
1391
1391
  `)}if(t.effort&&t.tool==="opencode")try{await g("session/set_config_option",{sessionId:p,configId:"effort",value:t.effort}),wt(`acp: set_config_option(effort=${t.effort}) ok`)}catch(I){let x=I instanceof Error?I.message:String(I);process.stderr.write(`[acp] set_config_option(effort=${t.effort}) failed: ${x}
1392
- `)}_.beginTurn(),wt(`acp: prompt sent (${e.length} chars)`);let y=await g("session/prompt",{sessionId:p,prompt:[{type:"text",text:e}]}),w=_.completeTurn(y);wt(`acp: result received (${w.result.length} chars, stopReason=${w.stopReason})`),c.stdin?.end()}catch(y){ot(c).catch(()=>{}),s(y instanceof Error?y:new Error(String(y)))}})()}):Promise.reject(new Error(`No ACP config for tool "${t.tool}"`))}var C0,M0,_p=T(()=>{"use strict";ve();Yr();ci();zr();mi();ve();it();Il();Il();C0={gemini:{binary:"gemini",args:["--acp","-y","--skip-trust"]},copilot:{binary:"copilot",args:["--acp","--yolo"]},opencode:{binary:"opencode",args:["acp"]}},M0=1});function pe(e,t=120){let r=e.replace(/\s+/g," ").trim();return r.length>t?r.slice(0,t-1)+"\u2026":r}function hp(e,t){return r=>{if(r.kind==="tool_use"&&typeof r.id=="string"){if(e.size>=j0){let n=e.keys().next().value;n!==void 0&&e.delete(n)}e.set(r.id,Date.now()),t(r);return}if(r.kind==="tool_result"&&typeof r.id=="string"&&r.elapsedMs===void 0){let n=e.get(r.id);if(n!==void 0){t({...r,elapsedMs:Date.now()-n}),e.delete(r.id);return}}t(r)}}function D0(){let e=new Map;return(t,r)=>{P0(t,hp(e,r))}}function P0(e,t){let r=e.type;if(r==="system"){let n=e.subtype;if(n==="api_retry"){let s=typeof e.attempt=="number"?e.attempt:void 0,i=typeof e.max_retries=="number"?e.max_retries:void 0,o=typeof e.error_status=="number"?e.error_status:void 0,a=typeof e.error=="string"?e.error:void 0,l=typeof e.retry_delay_ms=="number"?e.retry_delay_ms:void 0,c=[];s!==void 0&&c.push(i!==void 0?`attempt ${s}/${i}`:`attempt ${s}`),o!==void 0&&c.push(`HTTP ${o}`),l!==void 0&&c.push(`retry in ${Math.round(l/1e3)}s`),a&&c.push(pe(a,60));let d=c.length>0?c.join(", "):n;t({kind:"api_retry",summary:d});return}if(n==="api_error"){let s=typeof e.error_status=="number"?e.error_status:void 0,i=typeof e.error=="string"?e.error:void 0,o=["api_error"];s!==void 0&&o.push(`HTTP ${s}`),i&&o.push(pe(i,80)),t({kind:"other",summary:o.join(": "),raw:e});return}t({kind:"system",summary:n||"system",raw:e});return}if(r==="assistant"||r==="user"){let s=e.message?.content;if(!Array.isArray(s))return;for(let i of s){let o=i.type;if(o==="text"){let a=i.text||"";a&&t({kind:"text",summary:pe(a),raw:i})}else if(o==="tool_use"){let a=i.name||"tool",l=typeof i.id=="string"?i.id:void 0,c=i.input,d="";c&&(typeof c.command=="string"?d=c.command:typeof c.file_path=="string"?d=c.file_path:typeof c.path=="string"?d=c.path:typeof c.pattern=="string"?d=c.pattern:typeof c.url=="string"?d=c.url:d=pe(JSON.stringify(c))),t({kind:"tool_use",tool:a,summary:pe(d),id:l,raw:i})}else if(o==="thinking"){let a=i.thinking||"";t({kind:"thinking",summary:pe(a),raw:i})}else if(o==="tool_result"){let l=i.is_error===!0?"error":"ok",c=typeof i.tool_use_id=="string"?i.tool_use_id:void 0,d,u=i.content;if(typeof u=="string")d=`${u.split(`
1392
+ `)}_.beginTurn(),wt(`acp: prompt sent (${e.length} chars)`);let y=await g("session/prompt",{sessionId:p,prompt:[{type:"text",text:e}]}),w=_.completeTurn(y);wt(`acp: result received (${w.result.length} chars, stopReason=${w.stopReason})`),c.stdin?.end()}catch(y){ot(c).catch(()=>{}),s(y instanceof Error?y:new Error(String(y)))}})()}):Promise.reject(new Error(`No ACP config for tool "${t.tool}"`))}var C0,M0,_p=T(()=>{"use strict";ve();Yr();ci();zr();mi();ve();it();kl();kl();C0={gemini:{binary:"gemini",args:["--acp","-y","--skip-trust"]},copilot:{binary:"copilot",args:["--acp","--yolo"]},opencode:{binary:"opencode",args:["acp"]}},M0=1});function pe(e,t=120){let r=e.replace(/\s+/g," ").trim();return r.length>t?r.slice(0,t-1)+"\u2026":r}function hp(e,t){return r=>{if(r.kind==="tool_use"&&typeof r.id=="string"){if(e.size>=j0){let n=e.keys().next().value;n!==void 0&&e.delete(n)}e.set(r.id,Date.now()),t(r);return}if(r.kind==="tool_result"&&typeof r.id=="string"&&r.elapsedMs===void 0){let n=e.get(r.id);if(n!==void 0){t({...r,elapsedMs:Date.now()-n}),e.delete(r.id);return}}t(r)}}function D0(){let e=new Map;return(t,r)=>{P0(t,hp(e,r))}}function P0(e,t){let r=e.type;if(r==="system"){let n=e.subtype;if(n==="api_retry"){let s=typeof e.attempt=="number"?e.attempt:void 0,i=typeof e.max_retries=="number"?e.max_retries:void 0,o=typeof e.error_status=="number"?e.error_status:void 0,a=typeof e.error=="string"?e.error:void 0,l=typeof e.retry_delay_ms=="number"?e.retry_delay_ms:void 0,c=[];s!==void 0&&c.push(i!==void 0?`attempt ${s}/${i}`:`attempt ${s}`),o!==void 0&&c.push(`HTTP ${o}`),l!==void 0&&c.push(`retry in ${Math.round(l/1e3)}s`),a&&c.push(pe(a,60));let d=c.length>0?c.join(", "):n;t({kind:"api_retry",summary:d});return}if(n==="api_error"){let s=typeof e.error_status=="number"?e.error_status:void 0,i=typeof e.error=="string"?e.error:void 0,o=["api_error"];s!==void 0&&o.push(`HTTP ${s}`),i&&o.push(pe(i,80)),t({kind:"other",summary:o.join(": "),raw:e});return}t({kind:"system",summary:n||"system",raw:e});return}if(r==="assistant"||r==="user"){let s=e.message?.content;if(!Array.isArray(s))return;for(let i of s){let o=i.type;if(o==="text"){let a=i.text||"";a&&t({kind:"text",summary:pe(a),raw:i})}else if(o==="tool_use"){let a=i.name||"tool",l=typeof i.id=="string"?i.id:void 0,c=i.input,d="";c&&(typeof c.command=="string"?d=c.command:typeof c.file_path=="string"?d=c.file_path:typeof c.path=="string"?d=c.path:typeof c.pattern=="string"?d=c.pattern:typeof c.url=="string"?d=c.url:d=pe(JSON.stringify(c))),t({kind:"tool_use",tool:a,summary:pe(d),id:l,raw:i})}else if(o==="thinking"){let a=i.thinking||"";t({kind:"thinking",summary:pe(a),raw:i})}else if(o==="tool_result"){let l=i.is_error===!0?"error":"ok",c=typeof i.tool_use_id=="string"?i.tool_use_id:void 0,d,u=i.content;if(typeof u=="string")d=`${u.split(`
1393
1393
  `).length} lines, ${u.length} chars`;else if(Array.isArray(u)){let f=u.map(m=>typeof m=="object"&&m&&"text"in m?m.text:"").filter(Boolean).join("");f&&(d=`${f.split(`
1394
1394
  `).length} lines, ${f.length} chars`)}t({kind:"tool_result",status:l,summary:d,id:c,raw:i})}else o&&t({kind:"other",summary:o,raw:i})}return}if(r==="result"){t({kind:"system",summary:"result",raw:e});return}}async function pi(e,t){let r=t.binary==="qwen"?"qwen":"claude",n=t.onProgress?D0():void 0,s=await Qm(e,{sessionId:t.sessionId,cwd:t.cwd,env:t.env,tool:r,binaryPath:t.progPath,model:t.model,permissionMode:t.permissionMode,onText:t.onDelta,onEvent:n?i=>n(i,t.onProgress):void 0,signal:t.signal});return{text:s.result,sessionId:s.sessionId,durationMs:s.durationMs,numTurns:s.numTurns}}function F0(){let e=new Map;return(t,r)=>{U0(t,hp(e,r))}}function U0(e,t){if(e.method!=="session/update")return;let s=e.params?.update;if(!s)return;let i=s.sessionUpdate;if(i){if(i==="agent_message_chunk"){let a=s.content?.text||"";a&&t({kind:"text",summary:pe(a)});return}if(i==="agent_thought_chunk"){let a=s.content?.text||"";t({kind:"thinking",summary:pe(a)});return}if(i==="tool_call"){let o=s.title||s.kind||"tool",a=typeof s.toolCallId=="string"?s.toolCallId:void 0,l="",c=s.rawInput;c&&(typeof c.command=="string"?l=c.command:typeof c.file_path=="string"?l=c.file_path:typeof c.path=="string"?l=c.path:l=pe(JSON.stringify(c))),t({kind:"tool_use",tool:o,summary:pe(l),id:a});return}if(i==="tool_call_update"){let o=s.status||"",a=typeof s.toolCallId=="string"?s.toolCallId:void 0;if(o==="completed"||o==="failed")t({kind:"tool_result",summary:o,status:o==="failed"?"error":"ok",id:a});else if(o==="in_progress"){let l=s.content,c=typeof l=="string"?l:typeof l?.text=="string"?l.text:"",d=c?`running\u2026 ${pe(c,80)}`:"running\u2026";t({kind:"other",summary:d,id:a})}return}t({kind:"other",summary:i})}}async function Zr(e,t){let r=t.acpTool||t.binary;t.model&&r==="copilot"&&Xe({event:"model_ignored",provider:r,model:t.model,reason:"copilot --acp does not implement per-session model selection"});let n=t.onProgress?F0():void 0,s=await pp(e,{tool:r,sessionId:t.sessionId,cwd:t.cwd,env:t.env,binaryPath:t.progPath,model:t.model,effort:t.effort,alias:t.alias,permissionMode:t.permissionMode,onDelta:t.onDelta,onEvent:n?i=>n(i,t.onProgress):void 0,signal:t.signal});return{text:s.result,sessionId:s.sessionId,durationMs:s.durationMs,stopReason:s.stopReason}}function W0(e,t){let r=e.method;if(!r)return;let n=e.params;if(r==="turn/started"){t({kind:"system",summary:"turn started"});return}if(r==="turn/completed"){t({kind:"system",summary:"turn completed"});return}if(r==="error"){let s=n?.error,i=typeof s?.message=="string"?s.message:void 0,o=i&&i.length>0?i:"(no message)",a=n?.willRetry===!0;t(a?{kind:"api_retry",summary:`codex retry: ${pe(o,120)}`}:{kind:"other",summary:`codex error: ${pe(o,120)}`});return}if(r==="item/started"||r==="item/completed"){let s=n?.item;if(!s)return;let i=s.type,o=r==="item/started";switch(i){case"commandExecution":{let a=typeof s.id=="string"?s.id:void 0,l=s.command,c=Array.isArray(l)?l.join(" "):typeof l=="string"?l:"";if(o)t({kind:"tool_use",tool:"Bash",summary:pe(c||"(command)"),id:a});else{let d=s.exitCode,u=s.status||"",f=typeof s.durationMs=="number"?s.durationMs:void 0,m=typeof d=="number"?`exit ${d}`:u||"done",p=[];typeof d=="number"?p.push(`exit ${d}`):u&&p.push(u),typeof f=="number"&&p.push(`${Math.round(f/1e3)}s`),t({kind:"tool_result",summary:p.join(", ")||"done",status:m,elapsedMs:f,id:a})}return}case"fileChange":{let a=typeof s.id=="string"?s.id:void 0;if(o){let l=s.changes,c=Array.isArray(l)?l.map(d=>d.path||"").filter(Boolean).join(", "):"";t({kind:"tool_use",tool:"FileChange",summary:pe(c||"(edit)"),id:a})}else{let l=s.status||"done";t({kind:"tool_result",summary:l,status:l,id:a})}return}case"mcpToolCall":{let a=typeof s.id=="string"?s.id:void 0,l=s.server||"mcp",c=s.tool||"tool";if(o)t({kind:"tool_use",tool:`${l}/${c}`,summary:"",id:a});else{let d=s.status||"done";t({kind:"tool_result",summary:d,status:d,id:a})}return}case"webSearch":{let a=typeof s.id=="string"?s.id:void 0;t(o?{kind:"tool_use",tool:"WebSearch",summary:pe(s.query||""),id:a}:{kind:"tool_result",summary:"done",status:"done",id:a});return}case"reasoning":{o&&t({kind:"thinking",summary:""});return}case"agentMessage":case"userMessage":return;default:{i&&t({kind:o?"tool_use":"tool_result",tool:i,summary:""});return}}}if(r==="item/agentMessage/delta"){let s=n?.delta||"";if(s){let i=typeof n?._lmctlItemPhase=="string"?n._lmctlItemPhase:void 0;t(i==="commentary"?{kind:"thinking",summary:pe(s)}:{kind:"text",summary:pe(s)})}return}if(r==="item/reasoning/summaryTextDelta"||r==="item/reasoning/textDelta"){let s=n?.delta||"";s&&t({kind:"thinking",summary:pe(s)});return}if(r==="item/commandExecution/outputDelta"){let s=(typeof n?.delta=="string"?n.delta:"")||"";if(s){let i=s.split(`
1395
1395
  `).filter(l=>l.length>0),o=i[i.length-1]||"",a=i.length>1?`${i.length} lines: ${pe(o,60)}`:pe(s,80);t({kind:"other",summary:`running\u2026 ${a}`})}else t({kind:"other",summary:"running\u2026"});return}if(r==="item/commandExecution/terminalInteraction"||r==="item/commandExecution/outputChunk"||r==="item/commandExecution/output"){let s=(typeof n?.stdin=="string"?n.stdin:"")||(typeof n?.delta=="string"?n.delta:"")||(typeof n?.output=="string"?n.output:"")||(typeof n?.text=="string"?n.text:"")||(typeof n?.content=="string"?n.content:"")||(typeof n?.chunk=="string"?n.chunk:"")||"";if(s){let i=s.split(`
1396
- `).filter(l=>l.length>0),o=i[i.length-1]||"",a=i.length>1?`${i.length} lines: ${pe(o,60)}`:pe(s,80);t({kind:"other",summary:`running\u2026 ${a}`})}else t({kind:"other",summary:"running\u2026"});return}if(r.startsWith("item/")){t({kind:"other",summary:r.slice(5)});return}}async function gp(e,t){let r=await np(e,{threadId:t.sessionId,cwd:t.cwd,env:t.env,binaryPath:t.progPath,model:t.model,alias:t.alias,isLead:t.isLead,permissionMode:t.permissionMode,onDelta:t.onDelta,onEvent:t.onProgress?n=>W0(n,t.onProgress):void 0,signal:t.signal});return{text:r.result,sessionId:r.threadId,durationMs:r.durationMs}}var j0,Ir=T(()=>{"use strict";ep();sp();_p();ve();j0=256});function xl(e){return new Nl(e)}var Nl,Al=T(()=>{"use strict";Bm();Wt();Ir();Tt();Nl=class extends xe{constructor(t){super({provider:new si(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"claude",seedArgs:["-p",he,"--dangerously-skip-permissions"],resumeTemplate:"claude --resume {{session_id}}",startTemplate:"claude",transport:pi})}}});import{readdir as B0,stat as yp,unlink as q0}from"node:fs/promises";import{join as Zn,basename as H0}from"node:path";function J0(e,t,r){return`${e}|${t.toISOString()}|${r}`}function Qn(e,t,r){let n=J0(r.role,r.timestamp,r.content);t.has(n)||(t.add(n),e.push(r))}function wp(e,t){return t==="exec"||e==="codex_exec"?"codex exec":"codex"}function X0(e){if(!e)return;let t=e.cached_input_tokens??e.cache_read_input_tokens;return{inputTokens:e.input_tokens,cachedInputTokens:t,outputTokens:e.output_tokens,reasoningOutputTokens:e.reasoning_output_tokens,totalTokens:e.total_tokens}}function _i(e){if(e==null)return"";if(typeof e=="string")return e;if(typeof e=="number"||typeof e=="boolean")return String(e);if(Array.isArray(e))return e.map(r=>{if(typeof r=="string")return r;if(r&&typeof r=="object"){let n=r;if(typeof n.text=="string")return n.text;if(typeof n.image_url=="string")return"[input_image]";if(typeof n.type=="string")return`[${n.type}]`}return _i(r)}).filter(r=>r.length>0).join(`
1396
+ `).filter(l=>l.length>0),o=i[i.length-1]||"",a=i.length>1?`${i.length} lines: ${pe(o,60)}`:pe(s,80);t({kind:"other",summary:`running\u2026 ${a}`})}else t({kind:"other",summary:"running\u2026"});return}if(r.startsWith("item/")){t({kind:"other",summary:r.slice(5)});return}}async function gp(e,t){let r=await np(e,{threadId:t.sessionId,cwd:t.cwd,env:t.env,binaryPath:t.progPath,model:t.model,alias:t.alias,isLead:t.isLead,permissionMode:t.permissionMode,onDelta:t.onDelta,onEvent:t.onProgress?n=>W0(n,t.onProgress):void 0,signal:t.signal});return{text:r.result,sessionId:r.threadId,durationMs:r.durationMs}}var j0,Ir=T(()=>{"use strict";ep();sp();_p();ve();j0=256});function Nl(e){return new Il(e)}var Il,xl=T(()=>{"use strict";Bm();Wt();Ir();Tt();Il=class extends xe{constructor(t){super({provider:new si(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"claude",seedArgs:["-p",he,"--dangerously-skip-permissions"],resumeTemplate:"claude --resume {{session_id}}",startTemplate:"claude",transport:pi})}}});import{readdir as B0,stat as yp,unlink as q0}from"node:fs/promises";import{join as Zn,basename as H0}from"node:path";function J0(e,t,r){return`${e}|${t.toISOString()}|${r}`}function Qn(e,t,r){let n=J0(r.role,r.timestamp,r.content);t.has(n)||(t.add(n),e.push(r))}function wp(e,t){return t==="exec"||e==="codex_exec"?"codex exec":"codex"}function X0(e){if(!e)return;let t=e.cached_input_tokens??e.cache_read_input_tokens;return{inputTokens:e.input_tokens,cachedInputTokens:t,outputTokens:e.output_tokens,reasoningOutputTokens:e.reasoning_output_tokens,totalTokens:e.total_tokens}}function _i(e){if(e==null)return"";if(typeof e=="string")return e;if(typeof e=="number"||typeof e=="boolean")return String(e);if(Array.isArray(e))return e.map(r=>{if(typeof r=="string")return r;if(r&&typeof r=="object"){let n=r;if(typeof n.text=="string")return n.text;if(typeof n.image_url=="string")return"[input_image]";if(typeof n.type=="string")return`[${n.type}]`}return _i(r)}).filter(r=>r.length>0).join(`
1397
1397
  `);try{return JSON.stringify(e)}catch{return String(e)}}async function Ep(e){let t=0,r=0,n=0,s=0,i=0,o,a;for await(let l of Ue(e)){if(l.type==="response_item"&&l.payload){let c=l.payload;if(c.type==="message"&&c.role==="user"&&c.content)for(let d of c.content)d.type==="input_text"&&typeof d.text=="string"&&d.text&&t++;else if(c.type==="message"&&c.role==="assistant"&&c.content)for(let d of c.content)d.type==="output_text"&&typeof d.text=="string"&&d.text&&t++}if(l.payload&&typeof l.payload.model_context_window=="number"&&(a=l.payload.model_context_window),l.type==="event_msg"&&l.payload?.type==="token_count"&&l.payload.info?.total_token_usage){let c=l.payload.info.total_token_usage;r=c.input_tokens??r,n=c.cached_input_tokens??c.cache_read_input_tokens??n,s=c.output_tokens??s,i=c.reasoning_output_tokens??i;let d=X0(l.payload.info.last_token_usage);d&&(o=d),typeof l.payload.info.model_context_window=="number"&&(a=l.payload.info.model_context_window)}}return{messageCount:t,totalInputTokens:r,totalCachedInputTokens:n,totalOutputTokens:s,totalReasoningOutputTokens:i,lastTokenUsage:o,modelContextWindow:a}}var hi,Tp=T(()=>{"use strict";nr();hi=class{name="codex";codexDirs;constructor(t={}){let r=[Zn(Te,".codex"),Zn(Te,".code")];if(t.codexDirs&&t.codexDirs.length>0){this.codexDirs=[...new Set(t.codexDirs)];return}let n=[t.codexDir||r[0],t.codeDir||r[1]];this.codexDirs=[...new Set(n)]}getWatchPaths(){return this.codexDirs.map(t=>({directory:Zn(t,"sessions"),filePattern:/\.jsonl$/}))}async getSessionsDirs(){let t=[];for(let r of this.codexDirs){let n=Zn(r,"sessions");try{await yp(n),t.push(n)}catch{}}return t}async discoverSessions(){let t=[],r=await this.getSessionsDirs();for(let n of r){let s=await this.findSessionFiles(n);for(let i of s)try{let o=await this.extractSummary(i);o&&t.push(o)}catch{}}return t}async findSessionFiles(t){let r=[],n;try{n=await B0(t)}catch{return r}for(let s of n){let i=Zn(t,s),o=await yp(i).catch(()=>null);if(o)if(o.isDirectory()){let a=await this.findSessionFiles(i);r.push(...a)}else s.endsWith(".jsonl")&&r.push(i)}return r}extractSessionIdFromFilename(t){let r=H0(t,".jsonl"),n=r.match(/rollout-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}-(.+)$/);return n?n[1]:r}async extractSummary(t){let r=await $e(t,30),n=await Ne(t),s=this.extractSessionIdFromFilename(t),i="",o,a,l,c,d,u,f;for(let p of r){if(p.type==="session_meta"&&p.payload&&(p.payload.id&&(s=p.payload.id),p.payload.cwd&&(i=p.payload.cwd),p.payload.cli_version&&(o=p.payload.cli_version),p.payload.timestamp&&(l=new Date(p.payload.timestamp)),p.payload.originator&&(u=p.payload.originator),p.payload.source&&(f=p.payload.source)),p.type==="turn_context"&&p.payload&&(p.payload.model&&(a=p.payload.model),!i&&p.payload.cwd&&(i=p.payload.cwd)),p.type==="event_msg"&&p.payload?.type==="user_message"){let _=p.payload.message||p.payload.text;_&&(c||(c=H(_.trim(),80)),d=H(_.trim(),80))}if(p.type==="response_item"&&p.payload?.type==="message"&&p.payload.role==="user"&&p.payload.content){let _=p.payload.content.find(g=>g.type==="input_text"&&typeof g.text=="string"&&g.text);typeof _?.text=="string"&&(c||(c=H(_.text.trim(),80)),d=H(_.text.trim(),80))}}if(!i)return null;let m=await Ep(t);return{provider:"codex",sessionId:s,cwd:i,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:o,startCommand:wp(u,f),firstUserMessage:c,lastUserMessage:d,messageCount:m.messageCount,filePath:t,totalInputTokens:m.totalInputTokens||void 0,totalCachedInputTokens:m.totalCachedInputTokens||void 0,totalOutputTokens:m.totalOutputTokens||void 0,totalReasoningOutputTokens:m.totalReasoningOutputTokens||void 0,lastInputTokens:m.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:m.lastTokenUsage,modelContextWindow:m.modelContextWindow}}async loadSession(t){let r=await this.resolveSessionFile(t);if(!r)return null;let n=await Ne(r),s=[],i="",o,a,l,c,d,u=t,f,m=new Set;for await(let _ of Ue(r)){let g=_.timestamp?new Date(_.timestamp):new Date;if(_.type==="session_meta"&&_.payload){_.payload.id&&(u=_.payload.id),_.payload.cwd&&(i=_.payload.cwd),_.payload.cli_version&&(o=_.payload.cli_version),_.payload.timestamp&&(l=new Date(_.payload.timestamp)),f=wp(_.payload.originator,_.payload.source);continue}if(_.type==="turn_context"&&_.payload){_.payload.model&&(a=_.payload.model),!i&&_.payload.cwd&&(i=_.payload.cwd);continue}if(_.type==="response_item"&&_.payload){let h=_.payload;if(h.type==="message"){if(h.role==="user"&&h.content){for(let S of h.content)if(S.type==="input_text"&&typeof S.text=="string"&&S.text){let y=S.text.trim();c||(c=H(y,80)),d=H(y,80),Qn(s,m,{role:"user",timestamp:g,content:fe(y)})}continue}if(h.role==="assistant"&&h.content){for(let S of h.content)S.type==="output_text"&&typeof S.text=="string"&&S.text&&Qn(s,m,{role:"assistant",timestamp:g,content:fe(S.text),model:a});continue}if(h.role!=="user"&&h.role!=="assistant"&&h.content){for(let S of h.content)(S.type==="input_text"||S.type==="output_text")&&typeof S.text=="string"&&S.text&&Qn(s,m,{role:"system",timestamp:g,content:fe(S.text.trim())});continue}}if(h.type==="function_call"){s.push({role:"tool_use",timestamp:g,content:h.name||"unknown tool",toolName:h.name,toolInput:h.arguments!==void 0?fe(_i(h.arguments)):void 0,toolCallId:h.call_id});continue}if(h.type==="function_call_output"){s.push({role:"tool_result",timestamp:g,content:fe(_i(h.output)),toolCallId:h.call_id});continue}if(h.type==="reasoning"&&h.summary){let S=h.summary.map(y=>_i(y.text)).join(`
1398
- `);S.trim()&&Qn(s,m,{role:"thinking",timestamp:g,content:fe(S)});continue}}if(_.type==="event_msg"&&_.payload&&_.payload.type==="agent_reasoning"){let h=_.payload.message||_.payload.text;h&&Qn(s,m,{role:"thinking",timestamp:g,content:fe(h)})}}if(!i)return null;let p=await Ep(r);return{provider:"codex",sessionId:u,cwd:i,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:o,startCommand:f,firstUserMessage:c,lastUserMessage:d,messageCount:p.messageCount,filePath:r,totalInputTokens:p.totalInputTokens||void 0,totalCachedInputTokens:p.totalCachedInputTokens||void 0,totalOutputTokens:p.totalOutputTokens||void 0,totalReasoningOutputTokens:p.totalReasoningOutputTokens||void 0,lastInputTokens:p.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:p.lastTokenUsage,modelContextWindow:p.modelContextWindow,messages:s}}async resolveSessionPath(t){return this.resolveSessionFile(t)}async deleteSession(t){let r=await this.resolveSessionFile(t);return r?(await q0(r),!0):!1}async resolveSessionFile(t){let r=await this.getSessionsDirs(),n=[];for(let i of r){let o=await this.findSessionFiles(i);n.push(...o)}for(let i of n)if(this.extractSessionIdFromFilename(i)===t)return i;let s=[];for(let i of n)this.extractSessionIdFromFilename(i).startsWith(t)&&s.push(i);if(s.length===1)return s[0];for(let i of n){let o=await $e(i,1);if(o.length>0&&o[0].type==="session_meta"){let a=o[0].payload?.id;if(a===t||a&&a.startsWith(t))return i}}return null}}});function Ll(e){return new Rl(e)}var Rl,Ol=T(()=>{"use strict";Tp();Wt();Ir();Tt();Rl=class extends xe{constructor(t){super({provider:new hi(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append"},binary:"codex",seedArgs:["exec","--dangerously-bypass-approvals-and-sandbox","--skip-git-repo-check","-"],seedStdin:`${he}
1398
+ `);S.trim()&&Qn(s,m,{role:"thinking",timestamp:g,content:fe(S)});continue}}if(_.type==="event_msg"&&_.payload&&_.payload.type==="agent_reasoning"){let h=_.payload.message||_.payload.text;h&&Qn(s,m,{role:"thinking",timestamp:g,content:fe(h)})}}if(!i)return null;let p=await Ep(r);return{provider:"codex",sessionId:u,cwd:i,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:o,startCommand:f,firstUserMessage:c,lastUserMessage:d,messageCount:p.messageCount,filePath:r,totalInputTokens:p.totalInputTokens||void 0,totalCachedInputTokens:p.totalCachedInputTokens||void 0,totalOutputTokens:p.totalOutputTokens||void 0,totalReasoningOutputTokens:p.totalReasoningOutputTokens||void 0,lastInputTokens:p.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:p.lastTokenUsage,modelContextWindow:p.modelContextWindow,messages:s}}async resolveSessionPath(t){return this.resolveSessionFile(t)}async deleteSession(t){let r=await this.resolveSessionFile(t);return r?(await q0(r),!0):!1}async resolveSessionFile(t){let r=await this.getSessionsDirs(),n=[];for(let i of r){let o=await this.findSessionFiles(i);n.push(...o)}for(let i of n)if(this.extractSessionIdFromFilename(i)===t)return i;let s=[];for(let i of n)this.extractSessionIdFromFilename(i).startsWith(t)&&s.push(i);if(s.length===1)return s[0];for(let i of n){let o=await $e(i,1);if(o.length>0&&o[0].type==="session_meta"){let a=o[0].payload?.id;if(a===t||a&&a.startsWith(t))return i}}return null}}});function Rl(e){return new Al(e)}var Al,Ll=T(()=>{"use strict";Tp();Wt();Ir();Tt();Al=class extends xe{constructor(t){super({provider:new hi(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append"},binary:"codex",seedArgs:["exec","--dangerously-bypass-approvals-and-sandbox","--skip-git-repo-check","-"],seedStdin:`${he}
1399
1399
  `,resumeTemplate:"codex resume {{session_id}}",startTemplate:"codex",transport:gp})}seedArgsFor(t){let r=super.seedArgsFor(t);return t?.model?[...r.slice(0,-1),"--model",t.model,r[r.length-1]]:r}}});function es(e){if(!e.trim())return"unknown";let t=e.split(/\r?\n/).filter(n=>n.trim().length>0);if(t.length>1)try{let n=JSON.parse(t[0]);if(n!==null&&typeof n=="object"&&!Array.isArray(n)&&"kind"in n)return"jsonl"}catch{}let r;try{r=JSON.parse(e)}catch{return"unknown"}if(r!==null&&typeof r=="object"&&!Array.isArray(r)){let n=r;if(Array.isArray(n.messages))return"json";if("kind"in n)return"jsonl"}return"unknown"}function gi(e){let t=es(e);if(t==="unknown")throw new Error("gemini session content matches neither known format (old .json with messages[] or new .jsonl with kind metadata)");if(t==="json"){let a=JSON.parse(e);return{sessionId:a.sessionId,projectHash:a.projectHash,startTime:a.startTime,lastUpdated:a.lastUpdated,kind:a.kind,messages:Array.isArray(a.messages)?a.messages:[]}}let r=e.split(`
1400
1400
  `).map(a=>a).filter(a=>a.trim().length>0);if(r.length===0)throw new Error("gemini session file is empty");let n=r[0],s;try{s=JSON.parse(n)}catch(a){throw new Error(`gemini JSONL session: metadata line failed to parse: ${a instanceof Error?a.message:String(a)}`)}if(s===null||typeof s!="object")throw new Error("gemini JSONL session: metadata line is not an object");let i=[],o=new Map;for(let a=1;a<r.length;a++){let l;try{l=JSON.parse(r[a])}catch{continue}if(l===null||typeof l!="object")continue;let c=l;if("$set"in c&&c.$set&&typeof c.$set=="object"){Object.assign(s,c.$set);continue}if(typeof c.id=="string"||typeof c.type=="string"){let d=c;if(typeof d.id=="string"){let u=o.get(d.id);u?G0(u,d):(i.push(d),o.set(d.id,d))}else i.push(d)}}return{sessionId:typeof s.sessionId=="string"?s.sessionId:void 0,projectHash:typeof s.projectHash=="string"?s.projectHash:void 0,startTime:typeof s.startTime=="string"?s.startTime:void 0,lastUpdated:typeof s.lastUpdated=="string"?s.lastUpdated:void 0,kind:typeof s.kind=="string"?s.kind:void 0,messages:i}}function G0(e,t){for(let[r,n]of Object.entries(t))if(n!==void 0){if(r==="tokens"&&bp(e.tokens)&&bp(n)){e.tokens={...e.tokens,...n};continue}e[r]=n}}function bp(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Sp(e,t){if(t==="json")return JSON.stringify(e,null,2);let{messages:r,...n}=e,s=[JSON.stringify(n)];for(let i of r)s.push(JSON.stringify(i));return s.join(`
1401
1401
  `)+`
1402
- `}var $l=T(()=>{"use strict"});import{createHash as V0}from"node:crypto";import{readdir as ts,readFile as vp,stat as yi,unlink as K0}from"node:fs/promises";import{join as Ge,basename as Y0,dirname as z0}from"node:path";import{cwd as Z0}from"node:process";function kp(e){return e?typeof e=="string"?e:Array.isArray(e)?e.map(t=>t.text||"").join(""):"":""}function Ip(e){return e==="user"}function Cl(e){return e==="gemini"||e==="assistant"}function Nr(e,t=new Date(0)){if(!e)return t;let r=new Date(e);return Number.isNaN(r.getTime())?t:r}function Q0(e){return`${e.sessionId}\0${e.cwd}`}function eN(e,t){let r=e.filePaths??[e.filePath],n=t.filePaths??[t.filePath],s=[...new Set([...r,...n])],i=t.modifiedAt.getTime()>=e.modifiedAt.getTime()?t:e;return{...i,createdAt:e.createdAt.getTime()<=t.createdAt.getTime()?e.createdAt:t.createdAt,modifiedAt:i.modifiedAt,filePath:i.filePath,filePaths:s}}function wi(e){let t=Number(e??0);return Number.isFinite(t)?Math.max(0,Math.round(t)):0}function Np(e){let t=0,r=0,n=0,s=0,i=0,o;for(let a of e){if(!Cl(a.type)||!a.tokens)continue;let l=wi(a.tokens.input),c=wi(a.tokens.cached),d=Math.max(l-c,0),u=wi(a.tokens.output),f=wi(a.tokens.thoughts);t+=l,r+=c,n+=u,s+=f,i=l,o={inputTokens:d,cachedInputTokens:c,cacheWriteInputTokens:0,outputTokens:u,reasoningOutputTokens:f,totalTokens:l+u+f}}return{totalInputTokens:t,totalCachedInputTokens:r,totalOutputTokens:n,totalReasoningOutputTokens:s,lastInputTokens:i,lastTokenUsage:o}}function tN(e){return V0("sha256").update(e).digest("hex")}function rs(e,t){let r=t;for(;r&&!e.has(r);){e.add(r);let n=z0(r);if(n===r)break;r=n}}var Ei,xp=T(()=>{"use strict";nr();$l();ve();Ei=class{name="gemini";workspaceHashMap;geminiProjectsFile;geminiTmpDir;claudeProjectsDir;codexSessionDirs;extraWorkspacePaths;constructor(t={}){let r=t.geminiDir||Ge(Te,".gemini");this.geminiProjectsFile=Ge(r,"projects.json"),this.geminiTmpDir=Ge(r,"tmp");let n=t.claudeDir||Ge(Te,".claude");this.claudeProjectsDir=Ge(n,"projects");let s=[Ge(Te,".codex"),Ge(Te,".code")],i=t.codexDirs&&t.codexDirs.length>0?t.codexDirs:[t.codexDir||s[0],t.codeDir||s[1]];this.codexSessionDirs=[...new Set(i)].map(o=>Ge(o,"sessions")),this.extraWorkspacePaths=t.extraWorkspacePaths||[]}getWatchPaths(){return[{directory:this.geminiTmpDir,filePattern:/\.jsonl?$/}]}async discoverSessions(){let t=await this.findSessionFiles(),r=new Map;for(let n of t)try{let s=await this.extractSummary(n);if(!s)continue;let i=Q0(s),o=r.get(i);r.set(i,o?eN(o,s):s)}catch{}return[...r.values()]}async loadSession(t){let r=await this.resolveSessionFile(t);if(!r)return null;let n;try{n=await this.readSessionFile(r)}catch{return null}if(!n)return null;let s=await Ne(r),i=[],o=n.messages||[],a=n.sessionId||this.extractSessionIdFromFilename(r),l=n.projectHash||"",c=await this.resolveWorkspace(l),d,u,f;for(let g of o){let h=Nr(g.timestamp),S=g.type,y=fe(kp(g.content));if(Ip(S)){let I=y.trim();I&&(d||(d=H(I,80)),u=H(I,80)),i.push({role:"user",timestamp:h,content:I||y});continue}if(Cl(S)){g.model&&(f=g.model);for(let I of g.thoughts||[]){let x=[I.subject,I.description].filter(Boolean).join(`
1403
- `).trim();x&&i.push({role:"thinking",timestamp:Nr(I.timestamp,h),content:fe(x)})}i.push({role:"assistant",timestamp:h,content:y,model:g.model});continue}let w=S?`[${S}] `:"";i.push({role:"system",timestamp:h,content:`${w}${y}`.trim()})}let m=Nr(n.startTime,s.createdAt),p=Nr(n.lastUpdated,s.modifiedAt),_=Np(o);return{provider:"gemini",sessionId:a,cwd:c,createdAt:m,modifiedAt:p,model:f,startCommand:"gemini",firstUserMessage:d,lastUserMessage:u,messageCount:i.filter(g=>g.role==="user"||g.role==="assistant").length,filePath:r,totalInputTokens:_.totalInputTokens||void 0,totalCachedInputTokens:_.totalCachedInputTokens||void 0,totalOutputTokens:_.totalOutputTokens||void 0,totalReasoningOutputTokens:_.totalReasoningOutputTokens||void 0,lastInputTokens:_.lastInputTokens||void 0,lastTokenUsage:_.lastTokenUsage,messages:i}}async extractSummary(t){let r=await this.readSessionFile(t);if(!r)return null;let n=await Ne(t),s=r.messages||[],i=r.sessionId||this.extractSessionIdFromFilename(t),o=r.projectHash||"",a=await this.resolveWorkspace(o),l,c,d,u=0;for(let m of s)if(Ip(m.type)){u++;let p=kp(m.content).trim();p&&(l||(l=H(fe(p),80)),c=H(fe(p),80))}else Cl(m.type)&&(u++,m.model&&(d=m.model));let f=Np(s);return{provider:"gemini",sessionId:i,cwd:a,createdAt:Nr(r.startTime,n.createdAt),modifiedAt:Nr(r.lastUpdated,n.modifiedAt),model:d,startCommand:"gemini",firstUserMessage:l,lastUserMessage:c,messageCount:u,filePath:t,totalInputTokens:f.totalInputTokens||void 0,totalCachedInputTokens:f.totalCachedInputTokens||void 0,totalOutputTokens:f.totalOutputTokens||void 0,totalReasoningOutputTokens:f.totalReasoningOutputTokens||void 0,lastInputTokens:f.lastInputTokens||void 0,lastTokenUsage:f.lastTokenUsage}}async readSessionFile(t){let r=await vp(t,"utf-8");if(es(r)==="unknown")return V({event:"gemini_session_format_unknown",provider:"gemini",file:t,preview:r.slice(0,120),message:`gemini session file at ${t} matches neither old (.json with messages[]) nor new (.jsonl with kind metadata) format. Skipping; lmctl ls / audit / stats will not see this session.`}),null;try{return gi(r)}catch{return null}}extractSessionIdFromFilename(t){let r=Y0(t).replace(/\.jsonl?$/,""),n=r.match(/session-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-(.+)$/);return n?n[1]:r}async findSessionFiles(){let t=[],r;try{r=await ts(this.geminiTmpDir)}catch{return t}for(let n of r){let s=Ge(this.geminiTmpDir,n,"chats");if(!(await yi(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await ts(s)}catch{continue}for(let a of o)a.startsWith("session-")&&(!a.endsWith(".json")&&!a.endsWith(".jsonl")||t.push(Ge(s,a)))}return t}async resolveSessionPath(t){return this.resolveSessionFile(t)}async deleteSession(t){let r=await this.resolveSessionFile(t);return r?(await K0(r),!0):!1}async resolveSessionFile(t){let r=await this.findSessionFiles(),n=[];for(let s of r){let i=await this.readSessionFile(s).catch(()=>null),o=this.extractSessionIdFromFilename(s),a=i?.sessionId||o,l=a===t||a.startsWith(t),c=o===t||o.startsWith(t)||o.length>=8&&t.startsWith(o);if(!l&&!c)continue;let d=await Ne(s).catch(()=>({createdAt:new Date(0),modifiedAt:new Date(0)}));n.push({filePath:s,modifiedAt:Nr(i?.lastUpdated,d.modifiedAt)})}return n.sort((s,i)=>{let o=i.modifiedAt.getTime()-s.modifiedAt.getTime();return o!==0?o:i.filePath.localeCompare(s.filePath)}),n[0]?.filePath??null}async resolveWorkspace(t){return t?(await this.getWorkspaceHashMap()).get(t)||`[hash:${t.slice(0,16)}]`:"(unknown workspace)"}async getWorkspaceHashMap(){if(this.workspaceHashMap)return this.workspaceHashMap;let t=new Set;rs(t,Z0());for(let n of this.extraWorkspacePaths)rs(t,n);for(let n of await this.collectGeminiProjectPaths())rs(t,n);for(let n of await this.collectCodexCwds())rs(t,n);for(let n of await this.collectClaudeCwds())rs(t,n);let r=new Map;for(let n of t)r.set(tN(n),n);return this.workspaceHashMap=r,r}async collectGeminiProjectPaths(){let t;try{t=await vp(this.geminiProjectsFile,"utf-8")}catch{return[]}try{let n=JSON.parse(t).projects;return!n||typeof n!="object"||Array.isArray(n)?[]:Object.keys(n)}catch{return[]}}async collectCodexCwds(){let t=new Set;for(let r of this.codexSessionDirs){let n=await this.findJsonlFiles(r);for(let s of n){let o=(await $e(s,1).catch(()=>[]))[0]?.payload?.cwd;o&&t.add(o)}}return[...t]}async collectClaudeCwds(){let t=new Set,r;try{r=await ts(this.claudeProjectsDir)}catch{return[]}for(let n of r){let s=Ge(this.claudeProjectsDir,n);if(!(await yi(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await ts(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=Ge(s,a),d=(await $e(l,1).catch(()=>[]))[0]?.cwd;d&&t.add(d)}}return[...t]}async findJsonlFiles(t){let r=[];if(!(await yi(t).catch(()=>null))?.isDirectory())return r;let s;try{s=await ts(t)}catch{return r}for(let i of s){let o=Ge(t,i),a=await yi(o).catch(()=>null);if(a)if(a.isDirectory()){let l=await this.findJsonlFiles(o);r.push(...l)}else i.endsWith(".jsonl")&&r.push(o)}return r}}});import{readFileSync as rN,writeFileSync as nN,mkdirSync as sN}from"node:fs";import{join as iN,dirname as oN}from"node:path";import{randomUUID as aN}from"node:crypto";function jl(e){return new Ml(e)}var Ml,Dl=T(()=>{"use strict";xp();Wt();Ir();Tt();$l();Ml=class extends xe{constructor(t){super({provider:new Ei(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!0,forkSupport:"automatic",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"skill-file",leaderSetupHint:"Place skill files in the project's .gemini/ directory"},binary:"gemini",seedArgs:["-p",he,"-y","--skip-trust"],resumeTemplate:"gemini --resume {{session_id}} --skip-trust",startTemplate:"gemini --skip-trust",transport:(r,n)=>Zr(r,{...n,acpTool:"gemini"})})}forkHint(t){return["Gemini fork: copies the session file with a new ID.","The forked session has the same conversation history","but diverges from that point forward."].join(`
1402
+ `}var Ol=T(()=>{"use strict"});import{createHash as V0}from"node:crypto";import{readdir as ts,readFile as vp,stat as yi,unlink as K0}from"node:fs/promises";import{join as Ge,basename as Y0,dirname as z0}from"node:path";import{cwd as Z0}from"node:process";function kp(e){return e?typeof e=="string"?e:Array.isArray(e)?e.map(t=>t.text||"").join(""):"":""}function Ip(e){return e==="user"}function $l(e){return e==="gemini"||e==="assistant"}function Nr(e,t=new Date(0)){if(!e)return t;let r=new Date(e);return Number.isNaN(r.getTime())?t:r}function Q0(e){return`${e.sessionId}\0${e.cwd}`}function eN(e,t){let r=e.filePaths??[e.filePath],n=t.filePaths??[t.filePath],s=[...new Set([...r,...n])],i=t.modifiedAt.getTime()>=e.modifiedAt.getTime()?t:e;return{...i,createdAt:e.createdAt.getTime()<=t.createdAt.getTime()?e.createdAt:t.createdAt,modifiedAt:i.modifiedAt,filePath:i.filePath,filePaths:s}}function wi(e){let t=Number(e??0);return Number.isFinite(t)?Math.max(0,Math.round(t)):0}function Np(e){let t=0,r=0,n=0,s=0,i=0,o;for(let a of e){if(!$l(a.type)||!a.tokens)continue;let l=wi(a.tokens.input),c=wi(a.tokens.cached),d=Math.max(l-c,0),u=wi(a.tokens.output),f=wi(a.tokens.thoughts);t+=l,r+=c,n+=u,s+=f,i=l,o={inputTokens:d,cachedInputTokens:c,cacheWriteInputTokens:0,outputTokens:u,reasoningOutputTokens:f,totalTokens:l+u+f}}return{totalInputTokens:t,totalCachedInputTokens:r,totalOutputTokens:n,totalReasoningOutputTokens:s,lastInputTokens:i,lastTokenUsage:o}}function tN(e){return V0("sha256").update(e).digest("hex")}function rs(e,t){let r=t;for(;r&&!e.has(r);){e.add(r);let n=z0(r);if(n===r)break;r=n}}var Ei,xp=T(()=>{"use strict";nr();Ol();ve();Ei=class{name="gemini";workspaceHashMap;geminiProjectsFile;geminiTmpDir;claudeProjectsDir;codexSessionDirs;extraWorkspacePaths;constructor(t={}){let r=t.geminiDir||Ge(Te,".gemini");this.geminiProjectsFile=Ge(r,"projects.json"),this.geminiTmpDir=Ge(r,"tmp");let n=t.claudeDir||Ge(Te,".claude");this.claudeProjectsDir=Ge(n,"projects");let s=[Ge(Te,".codex"),Ge(Te,".code")],i=t.codexDirs&&t.codexDirs.length>0?t.codexDirs:[t.codexDir||s[0],t.codeDir||s[1]];this.codexSessionDirs=[...new Set(i)].map(o=>Ge(o,"sessions")),this.extraWorkspacePaths=t.extraWorkspacePaths||[]}getWatchPaths(){return[{directory:this.geminiTmpDir,filePattern:/\.jsonl?$/}]}async discoverSessions(){let t=await this.findSessionFiles(),r=new Map;for(let n of t)try{let s=await this.extractSummary(n);if(!s)continue;let i=Q0(s),o=r.get(i);r.set(i,o?eN(o,s):s)}catch{}return[...r.values()]}async loadSession(t){let r=await this.resolveSessionFile(t);if(!r)return null;let n;try{n=await this.readSessionFile(r)}catch{return null}if(!n)return null;let s=await Ne(r),i=[],o=n.messages||[],a=n.sessionId||this.extractSessionIdFromFilename(r),l=n.projectHash||"",c=await this.resolveWorkspace(l),d,u,f;for(let g of o){let h=Nr(g.timestamp),S=g.type,y=fe(kp(g.content));if(Ip(S)){let I=y.trim();I&&(d||(d=H(I,80)),u=H(I,80)),i.push({role:"user",timestamp:h,content:I||y});continue}if($l(S)){g.model&&(f=g.model);for(let I of g.thoughts||[]){let x=[I.subject,I.description].filter(Boolean).join(`
1403
+ `).trim();x&&i.push({role:"thinking",timestamp:Nr(I.timestamp,h),content:fe(x)})}i.push({role:"assistant",timestamp:h,content:y,model:g.model});continue}let w=S?`[${S}] `:"";i.push({role:"system",timestamp:h,content:`${w}${y}`.trim()})}let m=Nr(n.startTime,s.createdAt),p=Nr(n.lastUpdated,s.modifiedAt),_=Np(o);return{provider:"gemini",sessionId:a,cwd:c,createdAt:m,modifiedAt:p,model:f,startCommand:"gemini",firstUserMessage:d,lastUserMessage:u,messageCount:i.filter(g=>g.role==="user"||g.role==="assistant").length,filePath:r,totalInputTokens:_.totalInputTokens||void 0,totalCachedInputTokens:_.totalCachedInputTokens||void 0,totalOutputTokens:_.totalOutputTokens||void 0,totalReasoningOutputTokens:_.totalReasoningOutputTokens||void 0,lastInputTokens:_.lastInputTokens||void 0,lastTokenUsage:_.lastTokenUsage,messages:i}}async extractSummary(t){let r=await this.readSessionFile(t);if(!r)return null;let n=await Ne(t),s=r.messages||[],i=r.sessionId||this.extractSessionIdFromFilename(t),o=r.projectHash||"",a=await this.resolveWorkspace(o),l,c,d,u=0;for(let m of s)if(Ip(m.type)){u++;let p=kp(m.content).trim();p&&(l||(l=H(fe(p),80)),c=H(fe(p),80))}else $l(m.type)&&(u++,m.model&&(d=m.model));let f=Np(s);return{provider:"gemini",sessionId:i,cwd:a,createdAt:Nr(r.startTime,n.createdAt),modifiedAt:Nr(r.lastUpdated,n.modifiedAt),model:d,startCommand:"gemini",firstUserMessage:l,lastUserMessage:c,messageCount:u,filePath:t,totalInputTokens:f.totalInputTokens||void 0,totalCachedInputTokens:f.totalCachedInputTokens||void 0,totalOutputTokens:f.totalOutputTokens||void 0,totalReasoningOutputTokens:f.totalReasoningOutputTokens||void 0,lastInputTokens:f.lastInputTokens||void 0,lastTokenUsage:f.lastTokenUsage}}async readSessionFile(t){let r=await vp(t,"utf-8");if(es(r)==="unknown")return V({event:"gemini_session_format_unknown",provider:"gemini",file:t,preview:r.slice(0,120),message:`gemini session file at ${t} matches neither old (.json with messages[]) nor new (.jsonl with kind metadata) format. Skipping; lmctl ls / audit / stats will not see this session.`}),null;try{return gi(r)}catch{return null}}extractSessionIdFromFilename(t){let r=Y0(t).replace(/\.jsonl?$/,""),n=r.match(/session-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-(.+)$/);return n?n[1]:r}async findSessionFiles(){let t=[],r;try{r=await ts(this.geminiTmpDir)}catch{return t}for(let n of r){let s=Ge(this.geminiTmpDir,n,"chats");if(!(await yi(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await ts(s)}catch{continue}for(let a of o)a.startsWith("session-")&&(!a.endsWith(".json")&&!a.endsWith(".jsonl")||t.push(Ge(s,a)))}return t}async resolveSessionPath(t){return this.resolveSessionFile(t)}async deleteSession(t){let r=await this.resolveSessionFile(t);return r?(await K0(r),!0):!1}async resolveSessionFile(t){let r=await this.findSessionFiles(),n=[];for(let s of r){let i=await this.readSessionFile(s).catch(()=>null),o=this.extractSessionIdFromFilename(s),a=i?.sessionId||o,l=a===t||a.startsWith(t),c=o===t||o.startsWith(t)||o.length>=8&&t.startsWith(o);if(!l&&!c)continue;let d=await Ne(s).catch(()=>({createdAt:new Date(0),modifiedAt:new Date(0)}));n.push({filePath:s,modifiedAt:Nr(i?.lastUpdated,d.modifiedAt)})}return n.sort((s,i)=>{let o=i.modifiedAt.getTime()-s.modifiedAt.getTime();return o!==0?o:i.filePath.localeCompare(s.filePath)}),n[0]?.filePath??null}async resolveWorkspace(t){return t?(await this.getWorkspaceHashMap()).get(t)||`[hash:${t.slice(0,16)}]`:"(unknown workspace)"}async getWorkspaceHashMap(){if(this.workspaceHashMap)return this.workspaceHashMap;let t=new Set;rs(t,Z0());for(let n of this.extraWorkspacePaths)rs(t,n);for(let n of await this.collectGeminiProjectPaths())rs(t,n);for(let n of await this.collectCodexCwds())rs(t,n);for(let n of await this.collectClaudeCwds())rs(t,n);let r=new Map;for(let n of t)r.set(tN(n),n);return this.workspaceHashMap=r,r}async collectGeminiProjectPaths(){let t;try{t=await vp(this.geminiProjectsFile,"utf-8")}catch{return[]}try{let n=JSON.parse(t).projects;return!n||typeof n!="object"||Array.isArray(n)?[]:Object.keys(n)}catch{return[]}}async collectCodexCwds(){let t=new Set;for(let r of this.codexSessionDirs){let n=await this.findJsonlFiles(r);for(let s of n){let o=(await $e(s,1).catch(()=>[]))[0]?.payload?.cwd;o&&t.add(o)}}return[...t]}async collectClaudeCwds(){let t=new Set,r;try{r=await ts(this.claudeProjectsDir)}catch{return[]}for(let n of r){let s=Ge(this.claudeProjectsDir,n);if(!(await yi(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await ts(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=Ge(s,a),d=(await $e(l,1).catch(()=>[]))[0]?.cwd;d&&t.add(d)}}return[...t]}async findJsonlFiles(t){let r=[];if(!(await yi(t).catch(()=>null))?.isDirectory())return r;let s;try{s=await ts(t)}catch{return r}for(let i of s){let o=Ge(t,i),a=await yi(o).catch(()=>null);if(a)if(a.isDirectory()){let l=await this.findJsonlFiles(o);r.push(...l)}else i.endsWith(".jsonl")&&r.push(o)}return r}}});import{readFileSync as rN,writeFileSync as nN,mkdirSync as sN}from"node:fs";import{join as iN,dirname as oN}from"node:path";import{randomUUID as aN}from"node:crypto";function Ml(e){return new Cl(e)}var Cl,jl=T(()=>{"use strict";xp();Wt();Ir();Tt();Ol();Cl=class extends xe{constructor(t){super({provider:new Ei(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!0,forkSupport:"automatic",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"skill-file",leaderSetupHint:"Place skill files in the project's .gemini/ directory"},binary:"gemini",seedArgs:["-p",he,"-y","--skip-trust"],resumeTemplate:"gemini --resume {{session_id}} --skip-trust",startTemplate:"gemini --skip-trust",transport:(r,n)=>Zr(r,{...n,acpTool:"gemini"})})}forkHint(t){return["Gemini fork: copies the session file with a new ID.","The forked session has the same conversation history","but diverges from that point forward."].join(`
1404
1404
  `)}manualSeedHint(t){return{launchCommand:`cd ${t} && gemini --skip-trust`,postLaunchNote:oi,lsCommand:`lmctl ls --provider gemini --sessiondir ${t}`}}async fork(t,r){let n=await this.resolvePath(t);if(!n)return{success:!1,error:`Session file not found for ${t}`};try{let s=rN(n,"utf-8"),i=es(s),o=gi(s),a=aN();o.sessionId=a,o.kind="main";let l=oN(n),c=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),d=i==="jsonl"?".jsonl":".json",u=`session-${c}-${a.slice(0,8)}${d}`,f=iN(l,u);return sN(l,{recursive:!0}),nN(f,Sp(o,i),"utf-8"),{success:!0,sessionId:a,filePath:f}}catch(s){return{success:!1,error:s instanceof Error?s.message:String(s)}}}}});import{readdir as Ap,readFile as lN,rm as cN,stat as Qr}from"node:fs/promises";import{basename as dN,join as lt}from"node:path";function uN(e){let t={};for(let r of e.split(`
1405
- `)){let n=r.match(/^(\w+):\s*(.*)$/);n&&(t[n[1]]=n[2].trim())}return{id:t.id,cwd:t.cwd,summary_count:t.summary_count?parseInt(t.summary_count,10):void 0,created_at:t.created_at,updated_at:t.updated_at,summary:t.summary}}function xr(e){if(!e)return;let t=new Date(e);return Number.isNaN(t.getTime())?void 0:t}async function fN(e){let t=0;for await(let r of Ue(e))(r.type==="user.message"||r.type==="assistant.message"&&(r.data?.content||"").trim())&&t++;return t}var Ti,Rp=T(()=>{"use strict";nr();Ti=class{name="copilot";sessionStateDir;constructor(t={}){let r=t.copilotDir||lt(Te,".copilot");this.sessionStateDir=lt(r,"session-state")}getWatchPaths(){return[{directory:this.sessionStateDir,filePattern:/events\.jsonl$/}]}async discoverSessions(){let t=[],r;try{r=await Ap(this.sessionStateDir)}catch{return t}for(let n of r){let s=lt(this.sessionStateDir,n);if((await Qr(s).catch(()=>null))?.isDirectory())try{let o=await this.extractSummary(s,n);o&&t.push(o)}catch{}}return t}async loadSession(t){let r=await this.resolveSessionDir(t);if(!r)return null;let n=await this.readWorkspaceYaml(r),s=lt(r,"events.jsonl"),i=await Qr(s).catch(()=>null),o=i?s:lt(r,"workspace.yaml"),a=await Ne(i?s:r),l=[],c=n?.cwd||"(unknown workspace)",d,u,f,m,p,_,g=n?.id||dN(r)||t;if(i)for await(let h of Ue(s)){let S=xr(h.timestamp)||a.modifiedAt;if(h.type==="session.start"&&h.data){h.data.sessionId&&(g=h.data.sessionId),h.data.copilotVersion&&(u=h.data.copilotVersion),h.data.startTime&&(_=xr(h.data.startTime)),h.data.selectedModel&&(d=h.data.selectedModel),h.data.context&&(h.data.context.cwd&&(c=h.data.context.cwd),h.data.context.branch&&(f=h.data.context.branch));continue}if(h.type==="session.model_change"&&h.data?.newModel){d=h.data.newModel;continue}if(h.type==="user.message"&&h.data){let y=h.data.content||"",w=y.trim();w&&(m||(m=H(w,80)),p=H(w,80)),l.push({role:"user",timestamp:S,content:fe(w||y)});continue}if(h.type==="assistant.message"&&h.data){let y=(h.data.content||"").trim();if(y&&l.push({role:"assistant",timestamp:S,content:fe(y),model:d}),h.data.toolRequests)for(let w of h.data.toolRequests)l.push({role:"tool_use",timestamp:S,content:w.name||"unknown tool",toolName:w.name,toolInput:w.arguments?JSON.stringify(w.arguments,null,2):void 0,toolCallId:w.toolCallId});continue}if(h.type==="tool.execution_complete"&&h.data){let y=h.data.result?.content||"",w=h.data.result?.detailedContent||"";l.push({role:"tool_result",timestamp:S,content:fe(y),toolDetailedContent:w?fe(w):void 0,toolCallId:h.data.toolCallId});continue}if(h.type==="assistant.reasoning"&&h.data?.content){l.push({role:"thinking",timestamp:S,content:fe(h.data.content)});continue}if(h.type==="session.error"||h.type==="session.warning"||h.type==="session.info"||h.type==="system.message"){let y=h.data?.message||"";y.trim()&&l.push({role:"system",timestamp:S,content:fe(y)});continue}}if(!m){let h=(n?.summary||"").trim();h&&(m=H(h,80))}return{provider:"copilot",sessionId:g,cwd:c,createdAt:_??xr(n?.created_at)??a.createdAt,modifiedAt:xr(n?.updated_at)??a.modifiedAt,model:d,cliVersion:u,startCommand:"copilot",gitBranch:f,firstUserMessage:m,lastUserMessage:p,messageCount:l.filter(h=>h.role==="user"||h.role==="assistant").length,filePath:o,messages:l}}async extractSummary(t,r){let n=await this.readWorkspaceYaml(t),s=lt(t,"events.jsonl"),i=await Qr(s).catch(()=>null),o=i?s:lt(t,"workspace.yaml"),a=await Ne(i?s:t),l=i?await $e(s,20):[],c=n?.id||r,d=n?.cwd||"(unknown workspace)",u,f,m,p,_;for(let h of l)if(h.type==="session.start"&&h.data&&(h.data.sessionId&&(c=h.data.sessionId),h.data.copilotVersion&&(f=h.data.copilotVersion),h.data.startTime&&(m=xr(h.data.startTime)),h.data.selectedModel&&(u=h.data.selectedModel),h.data.context?.cwd&&(d=h.data.context.cwd)),h.type==="session.model_change"&&h.data?.newModel&&(u||(u=h.data.newModel)),h.type==="user.message"&&h.data){let S=(h.data.content||"").trim();S&&(p||(p=H(S,80)),_=H(S,80))}if(!p){let h=(n?.summary||"").trim();h&&(p=H(h,80))}let g=i?await fN(s):0;return{provider:"copilot",sessionId:c,cwd:d,createdAt:m??xr(n?.created_at)??a.createdAt,modifiedAt:xr(n?.updated_at)??a.modifiedAt,model:u,cliVersion:f,startCommand:"copilot",firstUserMessage:p,lastUserMessage:_,messageCount:g,filePath:o}}async readWorkspaceYaml(t){let r=lt(t,"workspace.yaml");try{let n=await lN(r,"utf-8");return uN(n)}catch{return null}}async resolveSessionPath(t){return this.resolveSessionDir(t)}async deleteSession(t){let r=await this.resolveSessionDir(t);return r?(await cN(r,{recursive:!0}),!0):!1}async resolveSessionDir(t){let r;try{r=await Ap(this.sessionStateDir)}catch{return null}if(r.includes(t)){let s=lt(this.sessionStateDir,t);if((await Qr(s).catch(()=>null))?.isDirectory())return s}let n=[];for(let s of r)if(s.startsWith(t)){let i=lt(this.sessionStateDir,s);(await Qr(i).catch(()=>null))?.isDirectory()&&n.push(i)}if(n.length===1)return n[0];for(let s of r){let i=lt(this.sessionStateDir,s);if(!(await Qr(i).catch(()=>null))?.isDirectory())continue;let a=await this.readWorkspaceYaml(i);if(a&&(a.id===t||a.id?.startsWith(t)))return i}return null}}});function Pl(e){return new xe({provider:new Ti(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"copilot",seedArgs:["-p",he,"--yolo"],resumeTemplate:"copilot --resume={{session_id}}",startTemplate:"copilot",transport:(t,r)=>Zr(t,{...r,acpTool:"copilot"})})}var Fl=T(()=>{"use strict";Rp();Wt();Ir();Tt()});import{existsSync as Lp,readdirSync as mN,statSync as Op}from"node:fs";import{join as or}from"node:path";import{createRequire as pN}from"node:module";function $p(){return Ul===null&&(Ul=pN(import.meta.url)("node:sqlite").DatabaseSync),Ul}function _N(){let e=process.env.XDG_DATA_HOME||or(Te,".local","share"),t=process.env.XDG_CONFIG_HOME||or(Te,".config");return[or(e,"opencode","opencode.db"),or(t,"opencode","opencode.db")]}function hN(){if(process.env.OPENCODE_DB)return[process.env.OPENCODE_DB];let e=process.env.XDG_DATA_HOME||or(Te,".local","share"),t=or(e,"lmplayer"),r=or(t,"opencode-local.db"),n=[r];try{let s=mN(t).filter(i=>/^opencode.*\.db$/u.test(i)).map(i=>or(t,i)).filter(i=>i!==r).sort((i,o)=>{try{return Op(o).mtimeMs-Op(i).mtimeMs}catch{return 0}});n.push(...s)}catch{}return n}function gN(e){return e==="lmplayer"?hN():_N()}var Ul,en,Wl=T(()=>{"use strict";nr();Ul=null;en=class{name;startCommand;dbPaths;constructor(t){this.name=t?.providerName??"opencode",this.startCommand=t?.startCommand??this.name,t?.dbPath?this.dbPaths=[t.dbPath]:this.dbPaths=gN(this.name)}existingDbPaths(){return this.dbPaths.filter(t=>Lp(t))}openDb(t){return Lp(t)?new($p())(t,{open:!0,readOnly:!0}):null}async discoverSessions(){let t=[];for(let r of this.existingDbPaths()){let n=this.openDb(r);if(n)try{let s=new Map,i=n.prepare("SELECT id, worktree, name FROM project").all();for(let a of i)s.set(a.id,a);let o=n.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
1405
+ `)){let n=r.match(/^(\w+):\s*(.*)$/);n&&(t[n[1]]=n[2].trim())}return{id:t.id,cwd:t.cwd,summary_count:t.summary_count?parseInt(t.summary_count,10):void 0,created_at:t.created_at,updated_at:t.updated_at,summary:t.summary}}function xr(e){if(!e)return;let t=new Date(e);return Number.isNaN(t.getTime())?void 0:t}async function fN(e){let t=0;for await(let r of Ue(e))(r.type==="user.message"||r.type==="assistant.message"&&(r.data?.content||"").trim())&&t++;return t}var Ti,Rp=T(()=>{"use strict";nr();Ti=class{name="copilot";sessionStateDir;constructor(t={}){let r=t.copilotDir||lt(Te,".copilot");this.sessionStateDir=lt(r,"session-state")}getWatchPaths(){return[{directory:this.sessionStateDir,filePattern:/events\.jsonl$/}]}async discoverSessions(){let t=[],r;try{r=await Ap(this.sessionStateDir)}catch{return t}for(let n of r){let s=lt(this.sessionStateDir,n);if((await Qr(s).catch(()=>null))?.isDirectory())try{let o=await this.extractSummary(s,n);o&&t.push(o)}catch{}}return t}async loadSession(t){let r=await this.resolveSessionDir(t);if(!r)return null;let n=await this.readWorkspaceYaml(r),s=lt(r,"events.jsonl"),i=await Qr(s).catch(()=>null),o=i?s:lt(r,"workspace.yaml"),a=await Ne(i?s:r),l=[],c=n?.cwd||"(unknown workspace)",d,u,f,m,p,_,g=n?.id||dN(r)||t;if(i)for await(let h of Ue(s)){let S=xr(h.timestamp)||a.modifiedAt;if(h.type==="session.start"&&h.data){h.data.sessionId&&(g=h.data.sessionId),h.data.copilotVersion&&(u=h.data.copilotVersion),h.data.startTime&&(_=xr(h.data.startTime)),h.data.selectedModel&&(d=h.data.selectedModel),h.data.context&&(h.data.context.cwd&&(c=h.data.context.cwd),h.data.context.branch&&(f=h.data.context.branch));continue}if(h.type==="session.model_change"&&h.data?.newModel){d=h.data.newModel;continue}if(h.type==="user.message"&&h.data){let y=h.data.content||"",w=y.trim();w&&(m||(m=H(w,80)),p=H(w,80)),l.push({role:"user",timestamp:S,content:fe(w||y)});continue}if(h.type==="assistant.message"&&h.data){let y=(h.data.content||"").trim();if(y&&l.push({role:"assistant",timestamp:S,content:fe(y),model:d}),h.data.toolRequests)for(let w of h.data.toolRequests)l.push({role:"tool_use",timestamp:S,content:w.name||"unknown tool",toolName:w.name,toolInput:w.arguments?JSON.stringify(w.arguments,null,2):void 0,toolCallId:w.toolCallId});continue}if(h.type==="tool.execution_complete"&&h.data){let y=h.data.result?.content||"",w=h.data.result?.detailedContent||"";l.push({role:"tool_result",timestamp:S,content:fe(y),toolDetailedContent:w?fe(w):void 0,toolCallId:h.data.toolCallId});continue}if(h.type==="assistant.reasoning"&&h.data?.content){l.push({role:"thinking",timestamp:S,content:fe(h.data.content)});continue}if(h.type==="session.error"||h.type==="session.warning"||h.type==="session.info"||h.type==="system.message"){let y=h.data?.message||"";y.trim()&&l.push({role:"system",timestamp:S,content:fe(y)});continue}}if(!m){let h=(n?.summary||"").trim();h&&(m=H(h,80))}return{provider:"copilot",sessionId:g,cwd:c,createdAt:_??xr(n?.created_at)??a.createdAt,modifiedAt:xr(n?.updated_at)??a.modifiedAt,model:d,cliVersion:u,startCommand:"copilot",gitBranch:f,firstUserMessage:m,lastUserMessage:p,messageCount:l.filter(h=>h.role==="user"||h.role==="assistant").length,filePath:o,messages:l}}async extractSummary(t,r){let n=await this.readWorkspaceYaml(t),s=lt(t,"events.jsonl"),i=await Qr(s).catch(()=>null),o=i?s:lt(t,"workspace.yaml"),a=await Ne(i?s:t),l=i?await $e(s,20):[],c=n?.id||r,d=n?.cwd||"(unknown workspace)",u,f,m,p,_;for(let h of l)if(h.type==="session.start"&&h.data&&(h.data.sessionId&&(c=h.data.sessionId),h.data.copilotVersion&&(f=h.data.copilotVersion),h.data.startTime&&(m=xr(h.data.startTime)),h.data.selectedModel&&(u=h.data.selectedModel),h.data.context?.cwd&&(d=h.data.context.cwd)),h.type==="session.model_change"&&h.data?.newModel&&(u||(u=h.data.newModel)),h.type==="user.message"&&h.data){let S=(h.data.content||"").trim();S&&(p||(p=H(S,80)),_=H(S,80))}if(!p){let h=(n?.summary||"").trim();h&&(p=H(h,80))}let g=i?await fN(s):0;return{provider:"copilot",sessionId:c,cwd:d,createdAt:m??xr(n?.created_at)??a.createdAt,modifiedAt:xr(n?.updated_at)??a.modifiedAt,model:u,cliVersion:f,startCommand:"copilot",firstUserMessage:p,lastUserMessage:_,messageCount:g,filePath:o}}async readWorkspaceYaml(t){let r=lt(t,"workspace.yaml");try{let n=await lN(r,"utf-8");return uN(n)}catch{return null}}async resolveSessionPath(t){return this.resolveSessionDir(t)}async deleteSession(t){let r=await this.resolveSessionDir(t);return r?(await cN(r,{recursive:!0}),!0):!1}async resolveSessionDir(t){let r;try{r=await Ap(this.sessionStateDir)}catch{return null}if(r.includes(t)){let s=lt(this.sessionStateDir,t);if((await Qr(s).catch(()=>null))?.isDirectory())return s}let n=[];for(let s of r)if(s.startsWith(t)){let i=lt(this.sessionStateDir,s);(await Qr(i).catch(()=>null))?.isDirectory()&&n.push(i)}if(n.length===1)return n[0];for(let s of r){let i=lt(this.sessionStateDir,s);if(!(await Qr(i).catch(()=>null))?.isDirectory())continue;let a=await this.readWorkspaceYaml(i);if(a&&(a.id===t||a.id?.startsWith(t)))return i}return null}}});function Dl(e){return new xe({provider:new Ti(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"copilot",seedArgs:["-p",he,"--yolo"],resumeTemplate:"copilot --resume={{session_id}}",startTemplate:"copilot",transport:(t,r)=>Zr(t,{...r,acpTool:"copilot"})})}var Pl=T(()=>{"use strict";Rp();Wt();Ir();Tt()});import{existsSync as Lp,readdirSync as mN,statSync as Op}from"node:fs";import{join as or}from"node:path";import{createRequire as pN}from"node:module";function $p(){return Fl===null&&(Fl=pN(import.meta.url)("node:sqlite").DatabaseSync),Fl}function _N(){let e=process.env.XDG_DATA_HOME||or(Te,".local","share"),t=process.env.XDG_CONFIG_HOME||or(Te,".config");return[or(e,"opencode","opencode.db"),or(t,"opencode","opencode.db")]}function hN(){if(process.env.OPENCODE_DB)return[process.env.OPENCODE_DB];let e=process.env.XDG_DATA_HOME||or(Te,".local","share"),t=or(e,"lmplayer"),r=or(t,"opencode-local.db"),n=[r];try{let s=mN(t).filter(i=>/^opencode.*\.db$/u.test(i)).map(i=>or(t,i)).filter(i=>i!==r).sort((i,o)=>{try{return Op(o).mtimeMs-Op(i).mtimeMs}catch{return 0}});n.push(...s)}catch{}return n}function gN(e){return e==="lmplayer"?hN():_N()}var Fl,en,Ul=T(()=>{"use strict";nr();Fl=null;en=class{name;startCommand;dbPaths;constructor(t){this.name=t?.providerName??"opencode",this.startCommand=t?.startCommand??this.name,t?.dbPath?this.dbPaths=[t.dbPath]:this.dbPaths=gN(this.name)}existingDbPaths(){return this.dbPaths.filter(t=>Lp(t))}openDb(t){return Lp(t)?new($p())(t,{open:!0,readOnly:!0}):null}async discoverSessions(){let t=[];for(let r of this.existingDbPaths()){let n=this.openDb(r);if(n)try{let s=new Map,i=n.prepare("SELECT id, worktree, name FROM project").all();for(let a of i)s.set(a.id,a);let o=n.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
1406
1406
  s.time_created, s.time_updated
1407
1407
  FROM session s
1408
1408
  ORDER BY s.time_updated DESC`).all();for(let a of o){let l=s.get(a.project_id),c=a.directory||l?.worktree||"(unknown)",d=n.prepare(`SELECT m.id, m.data, m.time_created FROM message m
@@ -1415,12 +1415,12 @@ ${r}`:r}function pp(e,t){let r=C0[t.tool];return r?new Promise((n,s)=>{let i=t.b
1415
1415
  FROM session s
1416
1416
  WHERE s.id LIKE ?
1417
1417
  ORDER BY s.time_updated DESC
1418
- LIMIT 2`).all(`${r}%`);return s.length!==1?null:s[0]}}});function ql(){return new Bl}var Bl,Hl=T(()=>{"use strict";Wl();Wt();Ir();Tt();Bl=class extends xe{constructor(){super({provider:new en,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"custom-tool",leaderSetupHint:"OpenCode supports custom tools via .opencode/tools/ directory"},binary:"opencode",seedArgs:["run",he],resumeTemplate:"opencode --session {{session_id}}",startTemplate:"opencode",transport:(t,r)=>Zr(t,{...r,acpTool:"opencode"})})}seedArgsFor(t){let r=["run"];return t?.model&&r.push("--model",t.model),t?.effort&&r.push("--variant",t.effort),r.push(t?.prompt??he),r}}});import{spawn as yN}from"node:child_process";import{mkdirSync as wN}from"node:fs";function Xl(e){return new Jl(e)}async function EN(e,t){let r=Date.now(),n=Cp({prompt:e,sessionId:t.sessionId,model:t.model,effort:t.effort,formatJson:!0,permissionMode:t.permissionMode??"yolo"});at("lmplayer",n,t.permissionMode??"yolo");let s=await Mp(t.binary,n,{cwd:t.cwd,env:We(t.env,t.cwd,t.sessionId),signal:t.signal,onText:i=>{t.onProgress?.({kind:"text",summary:i.slice(0,120)}),t.onDelta?.(i)}});if(s.code!==0&&s.code!==null)throw new Error(s.stderr.trim().slice(0,200)||`lmplayer exited with code ${s.code}`);return{text:s.text.trim(),sessionId:s.sessionId??t.sessionId,durationMs:Date.now()-r}}function Cp(e){let t=["run"];return e.model&&t.push("--model",e.model),e.sessionId&&t.push("--session",e.sessionId),e.formatJson&&t.push("--format","json"),e.effort&&t.push("--effort",e.effort),t.push(...sr("lmplayer",e.permissionMode)??[]),t.push(e.prompt),t}function Mp(e,t,r){return new Promise((n,s)=>{let i;try{i=yN(e,t,{cwd:r.cwd,env:r.env,stdio:["ignore","pipe","pipe"]})}catch(g){s(g);return}let o="",a="",l="",c,d,u=[],f=!1,m=r.timeoutMs===void 0?void 0:setTimeout(()=>{f||(f=!0,i.kill(),p(),s(new Error(`lmplayer seed timed out after ${r.timeoutMs}ms`)))},r.timeoutMs),p=()=>{m!==void 0&&clearTimeout(m)},_=g=>{let h=g.trim();if(!h)return;let S;try{S=JSON.parse(h)}catch{u.push(g),r.onText?.(g);return}if(!Si(S))return;let y=bi(S,!1);c===void 0&&y!==void 0&&(c=y),d=bi(S,!0)??d;let w=jp(S);w&&(u.push(w),r.onText?.(w))};i.stdout?.on("data",g=>{let h=g.toString("utf8");o+=h,l+=h;let S=l.indexOf(`
1418
+ LIMIT 2`).all(`${r}%`);return s.length!==1?null:s[0]}}});function Bl(){return new Wl}var Wl,ql=T(()=>{"use strict";Ul();Wt();Ir();Tt();Wl=class extends xe{constructor(){super({provider:new en,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"custom-tool",leaderSetupHint:"OpenCode supports custom tools via .opencode/tools/ directory"},binary:"opencode",seedArgs:["run",he],resumeTemplate:"opencode --session {{session_id}}",startTemplate:"opencode",transport:(t,r)=>Zr(t,{...r,acpTool:"opencode"})})}seedArgsFor(t){let r=["run"];return t?.model&&r.push("--model",t.model),t?.effort&&r.push("--variant",t.effort),r.push(t?.prompt??he),r}}});import{spawn as yN}from"node:child_process";import{mkdirSync as wN}from"node:fs";function Jl(e){return new Hl(e)}async function EN(e,t){let r=Date.now(),n=Cp({prompt:e,sessionId:t.sessionId,model:t.model,effort:t.effort,formatJson:!0,permissionMode:t.permissionMode??"yolo"});at("lmplayer",n,t.permissionMode??"yolo");let s=await Mp(t.binary,n,{cwd:t.cwd,env:We(t.env,t.cwd,t.sessionId),signal:t.signal,onText:i=>{t.onProgress?.({kind:"text",summary:i.slice(0,120)}),t.onDelta?.(i)}});if(s.code!==0&&s.code!==null)throw new Error(s.stderr.trim().slice(0,200)||`lmplayer exited with code ${s.code}`);return{text:s.text.trim(),sessionId:s.sessionId??t.sessionId,durationMs:Date.now()-r}}function Cp(e){let t=["run"];return e.model&&t.push("--model",e.model),e.sessionId&&t.push("--session",e.sessionId),e.formatJson&&t.push("--format","json"),e.effort&&t.push("--effort",e.effort),t.push(...sr("lmplayer",e.permissionMode)??[]),t.push(e.prompt),t}function Mp(e,t,r){return new Promise((n,s)=>{let i;try{i=yN(e,t,{cwd:r.cwd,env:r.env,stdio:["ignore","pipe","pipe"]})}catch(g){s(g);return}let o="",a="",l="",c,d,u=[],f=!1,m=r.timeoutMs===void 0?void 0:setTimeout(()=>{f||(f=!0,i.kill(),p(),s(new Error(`lmplayer seed timed out after ${r.timeoutMs}ms`)))},r.timeoutMs),p=()=>{m!==void 0&&clearTimeout(m)},_=g=>{let h=g.trim();if(!h)return;let S;try{S=JSON.parse(h)}catch{u.push(g),r.onText?.(g);return}if(!Si(S))return;let y=bi(S,!1);c===void 0&&y!==void 0&&(c=y),d=bi(S,!0)??d;let w=jp(S);w&&(u.push(w),r.onText?.(w))};i.stdout?.on("data",g=>{let h=g.toString("utf8");o+=h,l+=h;let S=l.indexOf(`
1419
1419
  `);for(;S>=0;){let y=l.slice(0,S);l=l.slice(S+1),_(y),S=l.indexOf(`
1420
- `)}}),i.stderr?.on("data",g=>{a+=g.toString("utf8")}),r.signal&&(r.signal.aborted?i.kill():r.signal.addEventListener("abort",()=>i.kill(),{once:!0})),i.on("exit",g=>{f||(f=!0,p(),l.length>0&&_(l),n({code:g,stdout:o,stderr:a,sessionId:c??d,text:u.join("")}))}),i.on("error",g=>{f||(f=!0,p(),s(g))})})}function jp(e){for(let t of["text","content","delta","output","message"]){let r=e[t];if(typeof r=="string")return r}for(let t of["data","event","payload","part"]){let r=e[t];if(Si(r)){let n=jp(r);if(n)return n}}}function bi(e,t){for(let n of["sessionID","sessionId","session_id"]){let s=e[n];if(typeof s=="string"&&s.length>0)return s}let r=e.session;if(typeof r=="string"&&r.length>0)return r;if(Si(r)){let n=bi(r,t);if(n!==void 0)return n}if(t){let n=e.id;if(typeof n=="string"&&n.length>0)return n}for(let n of["data","event","payload","part"]){let s=e[n];if(Si(s)){let i=bi(s,t);if(i!==void 0)return i}}}function Si(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var Jl,Gl=T(()=>{"use strict";Wl();Wt();Tt();zr();it();Jl=class extends xe{constructor(t){super({provider:new en({providerName:"lmplayer",startCommand:"lmplayer",dbPath:t?.lmplayerDbPath}),capabilities:{canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!0},injection:{leaderMode:"none"},binary:"lmplayer",seedArgs:["run","--format","json","--dangerously-skip-permissions",he],resumeTemplate:"lmplayer run --session {{session_id}} --dangerously-skip-permissions",startTemplate:"lmplayer run --dangerously-skip-permissions",transport:EN})}seedArgsFor(t){return Cp({prompt:t?.prompt??he,model:t?.model,effort:t?.effort,formatJson:!0,permissionMode:"yolo"})}async seed(t,r){wN(t,{recursive:!0});let n=this.seedArgsFor(r);at("lmplayer",n);try{let s=await Mp(this.binary,n,{cwd:t,env:Ut(void 0,t),timeoutMs:6e4});return s.code!==0&&s.code!==null?{success:!1,error:s.stderr.trim().slice(0,200)||`exit code ${s.code}`}:s.sessionId?{success:!0,sessionId:s.sessionId}:{success:!1,error:"lmplayer seed failed; provider did not report a sessionID"}}catch(s){return{success:!1,error:s instanceof Error?s.message:String(s)}}}manualSeedHint(t){return{launchCommand:`cd ${t} && lmplayer run --format json --dangerously-skip-permissions "${he}"`,postLaunchNote:"Copy the sessionID reported by lmplayer into this member's sessionid= field.",lsCommand:`lmctl ls --provider lmplayer --sessiondir ${t}`}}}});import{readdir as vi,readFile as TN,rm as bN}from"node:fs/promises";import{basename as Dp,join as ar}from"node:path";function Pp(e){return e.type==="user"||e.message?.role==="user"}function Fp(e){return e.type==="assistant"||e.message?.role==="assistant"||e.message?.role==="model"}function Up(e){let t=e.message;return t?typeof t.content=="string"?t.content:Array.isArray(t.content)?t.content.filter(r=>r.type==="text").map(r=>r.text||"").join(`
1420
+ `)}}),i.stderr?.on("data",g=>{a+=g.toString("utf8")}),r.signal&&(r.signal.aborted?i.kill():r.signal.addEventListener("abort",()=>i.kill(),{once:!0})),i.on("exit",g=>{f||(f=!0,p(),l.length>0&&_(l),n({code:g,stdout:o,stderr:a,sessionId:c??d,text:u.join("")}))}),i.on("error",g=>{f||(f=!0,p(),s(g))})})}function jp(e){for(let t of["text","content","delta","output","message"]){let r=e[t];if(typeof r=="string")return r}for(let t of["data","event","payload","part"]){let r=e[t];if(Si(r)){let n=jp(r);if(n)return n}}}function bi(e,t){for(let n of["sessionID","sessionId","session_id"]){let s=e[n];if(typeof s=="string"&&s.length>0)return s}let r=e.session;if(typeof r=="string"&&r.length>0)return r;if(Si(r)){let n=bi(r,t);if(n!==void 0)return n}if(t){let n=e.id;if(typeof n=="string"&&n.length>0)return n}for(let n of["data","event","payload","part"]){let s=e[n];if(Si(s)){let i=bi(s,t);if(i!==void 0)return i}}}function Si(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var Hl,Xl=T(()=>{"use strict";Ul();Wt();Tt();zr();it();Hl=class extends xe{constructor(t){super({provider:new en({providerName:"lmplayer",startCommand:"lmplayer",dbPath:t?.lmplayerDbPath}),capabilities:{canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!0},injection:{leaderMode:"none"},binary:"lmplayer",seedArgs:["run","--format","json","--dangerously-skip-permissions",he],resumeTemplate:"lmplayer run --session {{session_id}} --dangerously-skip-permissions",startTemplate:"lmplayer run --dangerously-skip-permissions",transport:EN})}seedArgsFor(t){return Cp({prompt:t?.prompt??he,model:t?.model,effort:t?.effort,formatJson:!0,permissionMode:"yolo"})}async seed(t,r){wN(t,{recursive:!0});let n=this.seedArgsFor(r);at("lmplayer",n);try{let s=await Mp(this.binary,n,{cwd:t,env:Ut(void 0,t),timeoutMs:6e4});return s.code!==0&&s.code!==null?{success:!1,error:s.stderr.trim().slice(0,200)||`exit code ${s.code}`}:s.sessionId?{success:!0,sessionId:s.sessionId}:{success:!1,error:"lmplayer seed failed; provider did not report a sessionID"}}catch(s){return{success:!1,error:s instanceof Error?s.message:String(s)}}}manualSeedHint(t){return{launchCommand:`cd ${t} && lmplayer run --format json --dangerously-skip-permissions "${he}"`,postLaunchNote:"Copy the sessionID reported by lmplayer into this member's sessionid= field.",lsCommand:`lmctl ls --provider lmplayer --sessiondir ${t}`}}}});import{readdir as vi,readFile as TN,rm as bN}from"node:fs/promises";import{basename as Dp,join as ar}from"node:path";function Pp(e){return e.type==="user"||e.message?.role==="user"}function Fp(e){return e.type==="assistant"||e.message?.role==="assistant"||e.message?.role==="model"}function Up(e){let t=e.message;return t?typeof t.content=="string"?t.content:Array.isArray(t.content)?t.content.filter(r=>r.type==="text").map(r=>r.text||"").join(`
1421
1421
  `):Array.isArray(t.parts)?t.parts.filter(r=>!r.thought&&r.type!=="thinking").map(r=>r.text||"").join(`
1422
- `):"":""}function Wp(e){return e.model||e.message?.model}var ki,Bp=T(()=>{"use strict";nr();ki=class{name="qwen";baseDir;constructor(t){this.baseDir=t?.qwenDir||ar(Te,".qwen")}async discoverSessions(){let t=ar(this.baseDir,"projects"),r;try{r=await vi(t)}catch{return[]}let n=[];for(let s of r){let i=ar(t,s,"chats"),o;try{o=await vi(i)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),c=ar(i,a);try{let d=await this.extractSummary(c,l);d&&n.push(d)}catch{}}}return n}async extractSummary(t,r){let n=await $e(t,30);if(n.length===0)return null;let s=await Ne(t),i="(unknown)",o,a,l,c,d=0;for(let u of n){if(u.cwd&&(i=u.cwd,u.version&&(a=u.version)),u.type==="system"&&u.cwd&&(i=u.cwd,u.version&&(a=u.version),u.model&&(o=u.model)),Pp(u)){let f=Up(u).trim();f&&(l||(l=H(f,80)),c=H(f,80)),d++}if(Fp(u)){let f=Wp(u);f&&(o=f),d++}}return{provider:"qwen",sessionId:r,cwd:i,createdAt:s.createdAt,modifiedAt:s.modifiedAt,model:o,cliVersion:a,startCommand:"qwen",firstUserMessage:l,lastUserMessage:c,messageCount:d,filePath:t}}async loadSession(t){let r=await this.resolveSessionPath(t);if(!r)return null;let n=Dp(r,".jsonl");return this.loadFromFile(r,n)}async loadFromFile(t,r){let n=await Ne(t),s="(unknown)",i,o,a,l,c,d,u=[];for await(let f of Ue(t)){if(f.cwd&&(s=f.cwd,f.version&&(o=f.version),f.gitBranch&&(a=f.gitBranch)),f.type==="system"&&f.cwd&&(s=f.cwd,f.version&&(o=f.version),f.model&&(i=f.model),f.gitBranch&&(a=f.gitBranch)),!f.message)continue;let m=f.message,p=f.timestamp?new Date(f.timestamp):n.modifiedAt;if(Pp(f)){let _=Up(f);_.trim()&&(c||(c=H(_.trim(),80)),d=H(_.trim(),80)),u.push({role:"user",timestamp:p,content:_})}else if(Fp(f)){let _=Wp(f);if(_&&(i=_),Array.isArray(m.content))for(let g of m.content)g.type==="text"&&g.text?u.push({role:"assistant",timestamp:p,content:g.text,model:_}):g.type==="thinking"&&g.thinking&&u.push({role:"thinking",timestamp:p,content:g.thinking});else if(typeof m.content=="string")u.push({role:"assistant",timestamp:p,content:m.content,model:_});else if(Array.isArray(m.parts))for(let g of m.parts)if(g.thought||g.type==="thinking"){let h=g.thinking||g.text;h&&u.push({role:"thinking",timestamp:p,content:h})}else g.text&&u.push({role:"assistant",timestamp:p,content:g.text,model:_})}}return{provider:"qwen",sessionId:r,slug:l,cwd:s,createdAt:n.createdAt,modifiedAt:n.modifiedAt,model:i,cliVersion:o,gitBranch:a,startCommand:"qwen",firstUserMessage:c,lastUserMessage:d,messageCount:u.length,filePath:t,messages:u}}async resolveSessionPath(t){let r=ar(this.baseDir,"projects");try{let n=await vi(r),s=[];for(let i of n){let o=ar(r,i,"chats",`${t}.jsonl`);try{return await TN(o,{flag:"r"}),o}catch{continue}}for(let i of n){let o=ar(r,i,"chats"),a;try{a=await vi(o)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;Dp(l,".jsonl").startsWith(t)&&s.push(ar(o,l))}}if(s.length===1)return s[0]}catch{}return null}async deleteSession(t){let r=await this.resolveSessionPath(t);if(!r)return!1;try{return await bN(r),!0}catch{return!1}}}});function Kl(){return new Vl}var Vl,Yl=T(()=>{"use strict";Bp();Wt();Ir();Tt();Vl=class extends xe{constructor(){super({provider:new ki,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"qwen",seedArgs:["-p",he,"--approval-mode","yolo"],resumeTemplate:"qwen --resume {{session_id}}",startTemplate:"qwen",transport:pi})}}});import{readdir as qp,readFile as SN,rm as Hp,stat as Jp}from"node:fs/promises";import{basename as zl,join as Ht}from"node:path";async function vN(e){let t=await Promise.all(e.map(r=>Ne(r)));return{createdAt:new Date(Math.min(...t.map(r=>r.createdAt.getTime()))),modifiedAt:new Date(Math.max(...t.map(r=>r.modifiedAt.getTime())))}}function kN(e,t){if(!e)return t;let r=new Date(e);return Number.isNaN(r.getTime())?t:r}function Xp(e){return e.type==="USER_INPUT"}function Gp(e){return e.source==="MODEL"&&e.type==="PLANNER_RESPONSE"}function IN(e){return e.source==="MODEL"&&e.type!=="PLANNER_RESPONSE"}function Vp(e){if(!e)return"";let t=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(e);return t?t[1]:e}function Kp(e){if(!e)return;let t=/Model Selection` from [^\n]+? to ([^\n]+)/.exec(e);if(t)return t[1].replace(/\. No need\b[\s\S]*$/,"").replace(/\. If reporting\b[\s\S]*$/,"").replace(/\.\s*$/,"").trim()}function NN(e){if(e===void 0)return"";try{return JSON.stringify(e)}catch{return String(e)}}async function xN(e){for await(let t of Ue(e)){let r=t.tool_calls?.map(s=>s.args)??[];for(let s of r){let i=AN(s);if(i)return i}let n=RN(t.content);if(n)return n}return null}function AN(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let t=e,r=t.Cwd??t.cwd??t.DirectoryPath;return typeof r!="string"?null:r.replace(/^"|"$/g,"")}function RN(e){return e?/"Cwd":"([^"]+)"/.exec(e)?.[1]??null:null}function Yp(e){if(e.endsWith(".db"))return zl(e,".db");let t="/brain/",r=e.indexOf(t);return r===-1?null:e.slice(r+t.length).split("/")[0]||null}var Ii,zp=T(()=>{"use strict";nr();Ii=class{name="agy";baseDir;constructor(t={}){this.baseDir=t.agyDir||Ht(Te,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:Ht(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let t=Ht(this.baseDir,"conversations"),r;try{r=await qp(t)}catch{return[]}let n=[];for(let s of r){if(!s.endsWith(".db"))continue;let i=zl(s,".db");try{let o=await this.extractSummary(i);o&&n.push(o)}catch{}}return n}conversationPath(t){return Ht(this.baseDir,"conversations",`${t}.db`)}transcriptPath(t){return Ht(this.baseDir,"brain",t,".system_generated","logs","transcript.jsonl")}async existingTranscriptPath(t){let r=this.transcriptPath(t);try{return await Jp(r),r}catch{return null}}async extractSummary(t){let r=this.conversationPath(t),n=await this.existingTranscriptPath(t),s=n??r,i=await vN([r,n].filter(Boolean)),o=await this.resolveCwd(t,n),a,l,c,d=0;if(n){let u=await $e(n,80);for(let f of u){let m=Kp(f.content);if(m&&(a=m),Xp(f)){let p=Vp(f.content).trim();p&&(l||(l=H(p,80)),c=H(p,80)),d++}else Gp(f)&&d++}}return{provider:"agy",sessionId:t,cwd:o,createdAt:i.createdAt,modifiedAt:i.modifiedAt,model:a,startCommand:"agy",firstUserMessage:l,lastUserMessage:c,messageCount:d,filePath:s,filePaths:n?[r,n]:[r]}}async loadSession(t){let r=await this.resolveSessionPath(t);if(!r)return null;let n=Yp(r);if(!n)return null;let s=await this.extractSummary(n);if(!s)return null;let i=await this.existingTranscriptPath(n),o=[],a=s.model,l=s.firstUserMessage,c=s.lastUserMessage;if(i)for await(let d of Ue(i)){let u=kN(d.created_at,s.modifiedAt),f=Kp(d.content);if(f&&(a=f),Xp(d)){let m=Vp(d.content),p=m.trim();p&&(l||(l=H(p,80)),c=H(p,80)),o.push({role:"user",timestamp:u,content:m});continue}if(Array.isArray(d.tool_calls))for(let m of d.tool_calls)o.push({role:"tool_use",timestamp:u,content:NN(m.args),toolName:m.name||"tool"});Gp(d)&&d.content?o.push({role:"assistant",timestamp:u,content:d.content,model:a}):IN(d)&&d.content&&o.push({role:"tool_result",timestamp:u,content:d.content,toolName:d.type?.toLowerCase()}),d.thinking&&o.push({role:"thinking",timestamp:u,content:d.thinking})}return{...s,model:a,firstUserMessage:l,lastUserMessage:c,messageCount:o.length,messages:o}}async resolveSessionPath(t){let r=this.conversationPath(t);try{return await Jp(r),r}catch{}let n=Ht(this.baseDir,"conversations");try{let s=[];for(let i of await qp(n)){if(!i.endsWith(".db"))continue;zl(i,".db").startsWith(t)&&s.push(Ht(n,i))}if(s.length===1)return s[0]}catch{}return null}async deleteSession(t){let r=await this.resolveSessionPath(t);if(!r)return!1;let n=Yp(r);return n?(await Hp(this.conversationPath(n),{force:!0}),await Hp(Ht(this.baseDir,"brain",n),{recursive:!0,force:!0}),!0):!1}async resolveCwd(t,r){let n=await this.cwdFromLastConversationCache(t);if(n)return n;if(r){let s=await xN(r);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(t){let r=Ht(this.baseDir,"cache","last_conversations.json");try{let n=JSON.parse(await SN(r,"utf8"));for(let[s,i]of Object.entries(n))if(i===t)return s}catch{}return null}}});import{spawn as LN}from"node:child_process";function Ql(e){return new Zl(e)}async function ON(e,t){let r=Date.now(),n=["--conversation",t.sessionId,"-p",e,"--dangerously-skip-permissions","--print-timeout",CN(t.timeoutMs)];t.model&&n.push("--model",t.model),at("agy",n,t.permissionMode??"yolo"),t.onProgress?.({kind:"system",summary:"agy -p one-shot started (no streaming events)"});let{stdout:s}=await $N(t.binary,n,{cwd:t.cwd,env:We(t.env,t.cwd,t.sessionId),signal:t.signal});return t.onProgress?.({kind:"system",summary:"agy -p one-shot completed"}),{text:s.trimEnd(),sessionId:t.sessionId,durationMs:Date.now()-r}}function $N(e,t,r){return new Promise((n,s)=>{let i;try{i=LN(e,t,{cwd:r.cwd,env:r.env,stdio:["ignore","pipe","pipe"]})}catch(c){s(c);return}let o="",a="";i.stdout?.on("data",c=>{o+=c.toString()}),i.stderr?.on("data",c=>{a+=c.toString()});let l=()=>{i.kill("SIGTERM"),s(new Error("agy turn aborted"))};if(r.signal){if(r.signal.aborted){l();return}r.signal.addEventListener("abort",l,{once:!0})}i.on("error",c=>{r.signal?.removeEventListener("abort",l),s(c)}),i.on("exit",(c,d)=>{if(r.signal?.removeEventListener("abort",l),c===0){n({stdout:o,stderr:a});return}let u=d?`signal ${d}`:`exit code ${c}`,f=a.trim()||o.trim();s(new Error(`agy failed (${u})${f?`: ${f}`:""}`))})})}function CN(e){return!e||e<=0?"8h":`${Math.max(1,Math.ceil(e/1e3))}s`}var Zl,ec=T(()=>{"use strict";zp();Wt();Tt();it();zr();Zl=class extends xe{constructor(t){super({provider:new Ii(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append",leaderSetupHint:"Antigravity uses one-shot print turns; no streaming events are available."},binary:"agy",seedArgs:["-p",he,"--dangerously-skip-permissions","--print-timeout","2m"],resumeTemplate:"agy --conversation {{session_id}} --dangerously-skip-permissions",startTemplate:"agy --dangerously-skip-permissions",transport:ON})}seedArgsFor(t){let r=[...super.seedArgsFor(t)];return t?.model&&r.push("--model",t.model),r}manualSeedHint(t){return{launchCommand:`cd ${t} && agy --dangerously-skip-permissions`,postLaunchNote:"Send the lmctl seed instruction, wait for the conversation to write, then exit.",lsCommand:`lmctl ls --provider agy --sessiondir ${t}`}}}});import{createHash as MN}from"node:crypto";import{existsSync as jN,mkdirSync as DN,readFileSync as PN,renameSync as FN,writeFileSync as UN}from"node:fs";import{dirname as r_,join as Zp,resolve as tc}from"node:path";function WN(e){return MN("sha256").update(e).digest("hex").slice(0,8)}function BN(e){let t=e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return t.length>0?t:"session"}function qN(e,t){let r=t?.prompt??"",n=/\bYou are alias\s+([A-Za-z][A-Za-z0-9_-]*)\b/.exec(r);return n!==null?n[1]:e.split(/[\\/]/).filter(Boolean).pop()??"session"}function n_(e){return e.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function Ni(e){return Math.max(1,Math.ceil(e.length/4))}function rn(e=process.cwd()){let t=process.env.LMCTL_CLAUDE_MOCK_STORE;if(t!==void 0&&t.trim().length>0)return tc(t);let r=process.env.LMCTL_DB;return r!==void 0&&r.trim().length>0?Zp(r_(tc(r)),".lmctl-claude-mock","sessions.json"):Zp(tc(e),".lmctl-claude-mock","sessions.json")}function Qp(){return{schemaVersion:1,sessions:{}}}function ns(e){if(!jN(e))return Qp();try{let t=JSON.parse(PN(e,"utf8")),r=typeof t.sessions=="object"&&t.sessions!==null?t.sessions:{},n=typeof t.script=="object"&&t.script!==null?t.script:void 0;return{schemaVersion:1,sessions:r,...n!==void 0?{script:n}:{}}}catch{return Qp()}}function s_(e,t){DN(r_(e),{recursive:!0});let r=`${e}.${process.pid}.${Date.now()}.tmp`;UN(r,`${JSON.stringify(t,null,2)}
1423
- `,"utf8"),FN(r,e)}function HN(e){return{...e,timestamp:e.timestamp.toISOString()}}function JN(e){return{...e,timestamp:new Date(e.timestamp)}}function XN(e){return{...e,createdAt:e.createdAt.toISOString(),modifiedAt:e.modifiedAt.toISOString(),messages:e.messages.map(HN)}}function i_(e){return{...e,createdAt:new Date(e.createdAt),modifiedAt:new Date(e.modifiedAt),messages:e.messages.map(JN)}}function xi(e,t=process.cwd()){let r=tn.get(e);if(r!==void 0)return r;let s=ns(rn(t)).sessions[e];if(s===void 0)return;let i=i_(s);return tn.set(i.sessionId,i),i}function e_(e){tn.set(e.sessionId,e);let t=rn(e.cwd),r=ns(t);r.sessions[e.sessionId]=XN({...e,filePath:t}),s_(t,r)}function GN(){let e=ns(rn()),t=Object.values(e.sessions).map(i_);for(let r of t)tn.set(r.sessionId,r);return t}function VN(e,t){let r=t.script;if(r===void 0)return;let n=r[e],s=r[n_(e)],i=n??s;if(typeof i=="string")return i;if(i!==void 0&&typeof i.text=="string")return i.text}function t_(e){return{provider:"ClaudeMock",sessionId:e.sessionId,cwd:e.cwd,createdAt:e.createdAt,modifiedAt:e.modifiedAt,messageCount:e.messages.length,filePath:e.filePath,cliVersion:"ClaudeMock/0",model:"claude-mock",totalInputTokens:e.totalInputTokens,totalOutputTokens:e.totalOutputTokens,lastTokenUsage:{totalTokens:e.totalInputTokens+e.totalOutputTokens}}}function sc(){return new nc}var tn,rc,nc,ic=T(()=>{"use strict";tn=new Map;rc=class{name="ClaudeMock";async discoverSessions(){let t=new Map;for(let r of GN())t.set(r.sessionId,r);for(let r of tn.values())t.set(r.sessionId,r);return[...t.values()].map(t_)}async loadSession(t){let r=xi(t);return r===void 0?null:{...t_(r),messages:r.messages.slice()}}async resolveSessionPath(t){return xi(t)?.filePath??null}async deleteSession(t){let r=tn.delete(t),n=rn(),s=ns(n),i=s.sessions[t]!==void 0;return delete s.sessions[t],i&&s_(n,s),r||i}},nc=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new rc;discover(){return this.provider.discoverSessions()}load(t){return this.provider.loadSession(t)}resolvePath(t){return this.provider.resolveSessionPath(t)}delete(t){return this.provider.deleteSession(t)}getWatchPaths(){return[]}async seed(t,r){let n=BN(qN(t,r)),s=`mock-${n}-${WN(`${t}:${n}`)}`,i=new Date,o=rn(t),a=xi(s,t),l=r?.prompt??"ClaudeMock seed",c=Ni(l),d={sessionId:s,cwd:t,filePath:o,createdAt:a?.createdAt??i,modifiedAt:i,messages:a?.messages.slice()??[],totalInputTokens:a?.totalInputTokens??0,totalOutputTokens:a?.totalOutputTokens??0};return d.messages.push({role:"user",timestamp:i,content:l}),d.messages.push({role:"assistant",timestamp:i,content:"ACK: ClaudeMock seeded"}),d.totalInputTokens+=c,d.totalOutputTokens+=Ni("ACK: ClaudeMock seeded"),e_(d),{success:!0,sessionId:s}}resumeCommand(t){return`ClaudeMock --resume ${t}`}startCommand(){return"ClaudeMock"}manualSeedHint(t){return{launchCommand:`cd ${t} && ClaudeMock`,postLaunchNote:"ClaudeMock is a hermetic test provider; no manual seed is required.",lsCommand:`lmctl ls --provider ClaudeMock --sessiondir ${t}`}}forkHint(t){return"ClaudeMock does not support fork."}async fork(t,r){return{success:!1,error:"ClaudeMock does not support fork."}}async sendTurn(t,r){let n=Date.now(),s=xi(r.sessionId,r.cwd);if(s===void 0)throw new Error(`ClaudeMock session not found: ${r.sessionId}`);let i=new Date,o=ns(rn(r.cwd)),a=VN(t,o)??`ClaudeMock ack: ${n_(t)}`;return s.messages.push({role:"user",timestamp:i,content:t}),s.messages.push({role:"assistant",timestamp:i,content:a,model:r.model??"claude-mock"}),s.modifiedAt=i,s.totalInputTokens+=Ni(t),s.totalOutputTokens+=Ni(a),e_(s),r.onProgress?.({kind:"text",summary:"ClaudeMock deterministic reply"}),{text:a,sessionId:r.sessionId,durationMs:Math.max(1,Date.now()-n),stopReason:"mock_stop",numTurns:1,status:"ok"}}}});function bt(e){let t=[xl({claudeDir:e?.claudeDir}),Ll({codexDir:e?.codexDir,codeDir:e?.codeDir}),jl({geminiDir:e?.geminiDir,claudeDir:e?.claudeDir,codexDir:e?.codexDir,codeDir:e?.codeDir}),Pl({copilotDir:e?.copilotDir}),ql(),Xl({lmplayerDbPath:e?.lmplayerDbPath}),Kl(),Ql({agyDir:e?.agyDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&t.push(sc()),t}var oc=T(()=>{"use strict";Al();Ol();Dl();Fl();Hl();Gl();Yl();ec();ic();Al();Ol();Dl();Fl();Hl();Gl();Yl();ec();ic()});var dc={};ye(dc,{ProviderRegistry:()=>Vn,TransportConnectionError:()=>be,TransportError:()=>Qe,TransportJsonError:()=>ai,TransportProcessError:()=>Bt,TransportRpcError:()=>qt,_resetDefaultRegistryForTests:()=>KN,chat:()=>St,countTokens:()=>cc,createAdapterRegistry:()=>Et,createAllAdapters:()=>bt,listSessions:()=>lc,seed:()=>ac});function Ri(){return Ai===null&&(Ai=Et(bt())),Ai}function KN(){Ai=null}function a_(e,t){let r=e.getAdapter(t);if(!r)throw new Error(`provider "${t}" is not registered in this registry`);return r}async function St(e){let t=e.registry??Ri(),r=a_(t,e.provider),n={sessionId:e.sessionId,cwd:e.cwd,env:e.env,onDelta:e.onDelta,onProgress:e.onProgress,signal:e.signal,timeoutMs:e.timeoutMs,model:e.model,effort:e.effort,progPath:e.progPath,alias:e.alias,isLead:e.isLead,permissionMode:e.permissionMode},s=await r.sendTurn(e.prompt,n);return{text:s.text,sessionId:s.sessionId,durationMs:s.durationMs,stopReason:s.stopReason,numTurns:s.numTurns,status:s.status,stalledAfterMs:s.stalledAfterMs}}async function ac(e){let t=e.registry??Ri(),r=a_(t,e.provider),n=await o_(t,e.provider,e.cwd),s=await r.seed(e.cwd,{model:e.model,effort:e.effort,prompt:e.prompt});if(!s.success)return{success:!1,error:s.error};if(s.sessionId)return{success:!0,sessionId:s.sessionId};let i=await o_(t,e.provider,e.cwd),o=YN(n,i);return o?{success:!0,sessionId:o}:{success:!0}}async function o_(e,t,r){let n=await e.listAll({provider:t,workspace:r}),s=new Map;for(let i of n)s.set(i.sessionId,i.modifiedAt);return s}function YN(e,t){let r=[];for(let n of t.keys())e.has(n)||r.push(n);return r.length===1?r[0]:void 0}async function lc(e={}){return(e.registry??Ri()).listAll({provider:e.provider,workspace:e.workspace,limit:e.limit,from:e.from,to:e.to})}async function cc(e){let r=await(e.registry??Ri()).getSession(e.sessionId,e.provider);if(!r)throw new Error(`session "${e.sessionId}" not found`);let n=r.totalInputTokens??0,s=r.totalCachedInputTokens??0,i=r.totalCacheWriteInputTokens??0,o=r.totalOutputTokens??0,a=r.totalReasoningOutputTokens??0;return{provider:r.provider,sessionId:r.sessionId,input:n,cachedInput:s,cacheWriteInput:i,output:o,reasoningOutput:a,total:n+s+i+o+a,lastTurn:r.lastTokenUsage}}var Ai,vt=T(()=>{"use strict";cl();oc();cl();oc();Yr();Ai=null});function zN(){return uc===null&&(uc=Et(bt())),uc}async function Li(e){let{dal:t,team_member_id:r}=e,n=t!==void 0&&r!==void 0;n&&t.setMemberState(r,"in_chat");let s=!1,i;try{return await QN(e)}catch(o){throw s=!0,i=o,o}finally{if(n)if(!s)nn.delete(r),t.setMemberState(r,"idle");else{let o=ZN(i,r);t.setMemberState(r,o!==null?"attention_needed":"idle",o)}}}function ZN(e,t){if(!(e instanceof Se))return nn.delete(t),null;if(e.kind==="sessiondir_missing")return"sessiondir_missing";if(e.kind==="enoent")return"binary_missing";if(e.kind==="nonzero_exit"&&(e.exit_status===137||e.exit_status===139))return"oom_exit";if(e.kind==="timeout"){let r=(nn.get(t)??0)+1;return r>=3?(nn.delete(t),"consecutive_timeouts"):(nn.set(t,r),null)}return nn.delete(t),null}async function QN(e){let t=e.timeoutMs,r=typeof t=="number"&&t>0,n=zN(),s;try{let d=await n.resolveSession(e.sessionid);if(!d)return Promise.reject(new Se("other",null,`library: sessionid "${e.sessionid}" matched no registered provider`,fc(e.sessionid,e.sessiondir,"unresolved")));s=d.provider.name}catch(d){return Promise.reject(new Se("other",null,`library: session resolution failed: ${l_(d)}`,fc(e.sessionid,e.sessiondir,"unresolved")))}let i=fc(e.sessionid,e.sessiondir,s),o=new AbortController,a=r?setTimeout(()=>o.abort(),t):null,l=!1;o.signal.addEventListener("abort",()=>{l=!0},{once:!0});let c=Date.now();try{let d=await St({provider:s,sessionId:e.sessionid,cwd:e.sessiondir,prompt:e.prompt,timeoutMs:0,signal:o.signal,registry:n,onProgress:e.onProgress,permissionMode:e.permissionMode});if(d.status==="stalled")throw new Se("timeout",null,`library: stalled after ${d.stalledAfterMs??0}ms`,i);return{text:d.text,ms:Date.now()-c,exit_status:0,argv:i}}catch(d){throw l?new Se("timeout",null,`library: wall-clock timeout after ${t??0}ms`,i):ex(d,i)}finally{a!==null&&clearTimeout(a)}}function fc(e,t,r){return["<library>","chat",e,t,"--provider",r]}function l_(e){return e instanceof Error?e.message:String(e)}function ex(e,t){if(e instanceof Se)return e;if(e instanceof be){let r=e.cause;return r?.code==="ENOENT_CWD"?new Se("sessiondir_missing",null,e.message,t):r?.code==="ENOENT"?new Se("enoent",null,e.message,t):new Se("other",null,e.message,t)}return e instanceof Bt?new Se("nonzero_exit",e.exitCode??null,e.stderr??e.message,t):e instanceof qt?new Se("nonzero_exit",e.rpcCode??null,e.message,t):e instanceof Qe?new Se("other",null,e.message,t):new Se("other",null,l_(e),t)}var Se,uc,nn,Oi=T(()=>{"use strict";vt();Se=class extends Error{kind;exit_status;stderr;argv;constructor(t,r,n,s){super(`lmctl chat failed: ${t}`),this.kind=t,this.exit_status=r,this.stderr=n,this.argv=s,this.name="ChatError"}},uc=null;nn=new Map});function c_(){return mc===null&&(mc=Et(bt())),mc}function rx(e,t){if(!tx.test(e))return e;let r=t.getConfig(`workspace.${e}`);if(r===null||r.length===0)throw new ke("other",null,`workspace has no mapping for ${e}; run \`lmctl workspace init\` (or set workspace.${e} in lmctl_config)`,["<library>","seed","--provider",e]);return r}async function $i(e){let t=rx(e.member.provider,e.dal),r=t===e.member.provider?e.member:{...e.member,provider:t},n=await nx({member:r});return e.dal.setMemberProviderResolved(e.member.id,t),{sessionid:n.sessionid,provider_resolved:t}}async function nx(e){let t=e.member.provider,r=e.member.sessiondir,n=pc("seed",r,t);try{let s=await ac({provider:t,cwd:r,registry:c_()});if(!s.success)throw ix(s.error,n);if(!s.sessionId)throw new ke("parse",0,"",n);return{sessionid:s.sessionId}}catch(s){throw s instanceof ke?s:_c(s,n)}}async function d_(e){return sx(e)}async function sx(e){let t=c_(),r=pc("tokens",e.sessionid,"unresolved"),n;try{let i=await t.resolveSession(e.sessionid);if(!i)throw new ke("parse",0,`library: sessionid "${e.sessionid}" matched no registered provider`,r);n=i.provider.name}catch(i){throw i instanceof ke?i:_c(i,r)}let s=pc("tokens",e.sessionid,n);try{let i=await cc({sessionId:e.sessionid,provider:n,registry:t});return{input_tokens:i.input,cache_tokens:i.cachedInput+i.cacheWriteInput,output_tokens:i.output,total_tokens:i.total}}catch(i){throw i instanceof ke?i:_c(i,s)}}function pc(e,t,r){return["<library>",e,t,"--provider",r]}function ix(e,t){let r=e??"";if(/\bENOENT\b/i.test(r))return new ke("enoent",null,r,t);if(/timed?\s*out/i.test(r))return new ke("timeout",null,r,t);if(/\bexit code\s+(-?\d+)\b/i.test(r)){let n=/\bexit code\s+(-?\d+)\b/i.exec(r);return new ke("nonzero_exit",Number(n[1]),r,t)}return new ke("other",null,r,t)}function _c(e,t){return e instanceof ke?e:e instanceof be?e.cause?.code==="ENOENT"?new ke("enoent",null,e.message,t):new ke("other",null,e.message,t):e instanceof Bt?new ke("nonzero_exit",e.exitCode??null,e.stderr??e.message,t):e instanceof qt?new ke("nonzero_exit",e.rpcCode??null,e.message,t):e instanceof Qe?new ke("other",null,e.message,t):new ke("other",null,e instanceof Error?e.message:String(e),t)}var ke,mc,tx,hc=T(()=>{"use strict";vt();ke=class extends Error{kind;exit_status;stderr;argv;constructor(t,r,n,s){super(`lmctl seed failed: ${t}`),this.kind=t,this.exit_status=r,this.stderr=n,this.argv=s,this.name="SeedError"}},mc=null;tx=/^provider[123]$/});function Ci(e){return Buffer.from(e,"utf8").toString("base64url")}function is(e){return Buffer.from(e,"base64url").toString("utf8")}async function u_(e,t=r=>d_({sessionid:r})){if(process.env.LMCTL_SESSION_SIZE_DISABLED==="1")return{recorded:0,failed:0};let r=0,n=0;for(let s of ox(e)){let i=s.member.sessionid;if(i!==null)try{let o=await t(i);e.recordSessionSize({team_name:s.team_name,alias:s.member.alias,sessionid:i,...o}),r+=1}catch(o){n+=1;try{e.raiseAttention({kind:"daemon_session_size_failed",severity:"warn",payload:JSON.stringify({team_name:s.team_name,alias:s.member.alias,sessionid:i,error:o instanceof Error?o.message:String(o)})})}catch{}}}return{recorded:r,failed:n}}async function f_(e,t,r){let n=m_(e,t,r);if(n===null||n.member.sessionid===null)throw new Error("session member not found");if(n.member.state!=="idle")throw new ss(r,n.member.state);e.setMemberState(n.member.id,"in_chat","compacting");try{return await Li({sessionid:n.member.sessionid,sessiondir:n.member.sessiondir,prompt:"/compact"}),e.setMemberState(n.member.id,"idle",null),{ok:!0,row:p_(e,t,r)}}catch(s){throw e.setMemberState(n.member.id,"attention_needed",`compact failed: ${s instanceof Error?s.message:String(s)}`),s}}async function gc(e,t,r){let n=m_(e,t,r);if(n===null)throw new Error("session member not found");let s=await $i({member:n.member,dal:e});return e.updateTeamMemberSession(n.member.id,s.sessionid),{ok:!0,sessionid:s.sessionid,row:p_(e,t,r)}}function ox(e){return e.listTeams().flatMap(t=>e.listTeamMembers(t.id).filter(r=>r.sessionid!==null).map(r=>({team_name:t.name,member:r})))}function m_(e,t,r){let n=e.findTeamByName(t);if(n===null)return null;let s=e.findTeamMemberByAlias(n.id,r);return s===null?null:{team_name:n.name,member:s}}function p_(e,t,r){return e.sessionSizeHistory(t,r,1)[0]??null}var ss,Mi=T(()=>{"use strict";Oi();hc();ss=class extends Error{constructor(t,r){super(`member ${t} is currently ${r}; cannot compact while busy`),this.name="MemberBusyError"}}});async function yc(e){let t=e.dal,r=e.nowMs??Date.now(),n=e.thresholdMs??lx(t),s=r-n,i=t.query(`
1422
+ `):"":""}function Wp(e){return e.model||e.message?.model}var ki,Bp=T(()=>{"use strict";nr();ki=class{name="qwen";baseDir;constructor(t){this.baseDir=t?.qwenDir||ar(Te,".qwen")}async discoverSessions(){let t=ar(this.baseDir,"projects"),r;try{r=await vi(t)}catch{return[]}let n=[];for(let s of r){let i=ar(t,s,"chats"),o;try{o=await vi(i)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),c=ar(i,a);try{let d=await this.extractSummary(c,l);d&&n.push(d)}catch{}}}return n}async extractSummary(t,r){let n=await $e(t,30);if(n.length===0)return null;let s=await Ne(t),i="(unknown)",o,a,l,c,d=0;for(let u of n){if(u.cwd&&(i=u.cwd,u.version&&(a=u.version)),u.type==="system"&&u.cwd&&(i=u.cwd,u.version&&(a=u.version),u.model&&(o=u.model)),Pp(u)){let f=Up(u).trim();f&&(l||(l=H(f,80)),c=H(f,80)),d++}if(Fp(u)){let f=Wp(u);f&&(o=f),d++}}return{provider:"qwen",sessionId:r,cwd:i,createdAt:s.createdAt,modifiedAt:s.modifiedAt,model:o,cliVersion:a,startCommand:"qwen",firstUserMessage:l,lastUserMessage:c,messageCount:d,filePath:t}}async loadSession(t){let r=await this.resolveSessionPath(t);if(!r)return null;let n=Dp(r,".jsonl");return this.loadFromFile(r,n)}async loadFromFile(t,r){let n=await Ne(t),s="(unknown)",i,o,a,l,c,d,u=[];for await(let f of Ue(t)){if(f.cwd&&(s=f.cwd,f.version&&(o=f.version),f.gitBranch&&(a=f.gitBranch)),f.type==="system"&&f.cwd&&(s=f.cwd,f.version&&(o=f.version),f.model&&(i=f.model),f.gitBranch&&(a=f.gitBranch)),!f.message)continue;let m=f.message,p=f.timestamp?new Date(f.timestamp):n.modifiedAt;if(Pp(f)){let _=Up(f);_.trim()&&(c||(c=H(_.trim(),80)),d=H(_.trim(),80)),u.push({role:"user",timestamp:p,content:_})}else if(Fp(f)){let _=Wp(f);if(_&&(i=_),Array.isArray(m.content))for(let g of m.content)g.type==="text"&&g.text?u.push({role:"assistant",timestamp:p,content:g.text,model:_}):g.type==="thinking"&&g.thinking&&u.push({role:"thinking",timestamp:p,content:g.thinking});else if(typeof m.content=="string")u.push({role:"assistant",timestamp:p,content:m.content,model:_});else if(Array.isArray(m.parts))for(let g of m.parts)if(g.thought||g.type==="thinking"){let h=g.thinking||g.text;h&&u.push({role:"thinking",timestamp:p,content:h})}else g.text&&u.push({role:"assistant",timestamp:p,content:g.text,model:_})}}return{provider:"qwen",sessionId:r,slug:l,cwd:s,createdAt:n.createdAt,modifiedAt:n.modifiedAt,model:i,cliVersion:o,gitBranch:a,startCommand:"qwen",firstUserMessage:c,lastUserMessage:d,messageCount:u.length,filePath:t,messages:u}}async resolveSessionPath(t){let r=ar(this.baseDir,"projects");try{let n=await vi(r),s=[];for(let i of n){let o=ar(r,i,"chats",`${t}.jsonl`);try{return await TN(o,{flag:"r"}),o}catch{continue}}for(let i of n){let o=ar(r,i,"chats"),a;try{a=await vi(o)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;Dp(l,".jsonl").startsWith(t)&&s.push(ar(o,l))}}if(s.length===1)return s[0]}catch{}return null}async deleteSession(t){let r=await this.resolveSessionPath(t);if(!r)return!1;try{return await bN(r),!0}catch{return!1}}}});function Vl(){return new Gl}var Gl,Kl=T(()=>{"use strict";Bp();Wt();Ir();Tt();Gl=class extends xe{constructor(){super({provider:new ki,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"qwen",seedArgs:["-p",he,"--approval-mode","yolo"],resumeTemplate:"qwen --resume {{session_id}}",startTemplate:"qwen",transport:pi})}}});import{readdir as qp,readFile as SN,rm as Hp,stat as Jp}from"node:fs/promises";import{basename as Yl,join as Ht}from"node:path";async function vN(e){let t=await Promise.all(e.map(r=>Ne(r)));return{createdAt:new Date(Math.min(...t.map(r=>r.createdAt.getTime()))),modifiedAt:new Date(Math.max(...t.map(r=>r.modifiedAt.getTime())))}}function kN(e,t){if(!e)return t;let r=new Date(e);return Number.isNaN(r.getTime())?t:r}function Xp(e){return e.type==="USER_INPUT"}function Gp(e){return e.source==="MODEL"&&e.type==="PLANNER_RESPONSE"}function IN(e){return e.source==="MODEL"&&e.type!=="PLANNER_RESPONSE"}function Vp(e){if(!e)return"";let t=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(e);return t?t[1]:e}function Kp(e){if(!e)return;let t=/Model Selection` from [^\n]+? to ([^\n]+)/.exec(e);if(t)return t[1].replace(/\. No need\b[\s\S]*$/,"").replace(/\. If reporting\b[\s\S]*$/,"").replace(/\.\s*$/,"").trim()}function NN(e){if(e===void 0)return"";try{return JSON.stringify(e)}catch{return String(e)}}async function xN(e){for await(let t of Ue(e)){let r=t.tool_calls?.map(s=>s.args)??[];for(let s of r){let i=AN(s);if(i)return i}let n=RN(t.content);if(n)return n}return null}function AN(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let t=e,r=t.Cwd??t.cwd??t.DirectoryPath;return typeof r!="string"?null:r.replace(/^"|"$/g,"")}function RN(e){return e?/"Cwd":"([^"]+)"/.exec(e)?.[1]??null:null}function Yp(e){if(e.endsWith(".db"))return Yl(e,".db");let t="/brain/",r=e.indexOf(t);return r===-1?null:e.slice(r+t.length).split("/")[0]||null}var Ii,zp=T(()=>{"use strict";nr();Ii=class{name="agy";baseDir;constructor(t={}){this.baseDir=t.agyDir||Ht(Te,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:Ht(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let t=Ht(this.baseDir,"conversations"),r;try{r=await qp(t)}catch{return[]}let n=[];for(let s of r){if(!s.endsWith(".db"))continue;let i=Yl(s,".db");try{let o=await this.extractSummary(i);o&&n.push(o)}catch{}}return n}conversationPath(t){return Ht(this.baseDir,"conversations",`${t}.db`)}transcriptPath(t){return Ht(this.baseDir,"brain",t,".system_generated","logs","transcript.jsonl")}async existingTranscriptPath(t){let r=this.transcriptPath(t);try{return await Jp(r),r}catch{return null}}async extractSummary(t){let r=this.conversationPath(t),n=await this.existingTranscriptPath(t),s=n??r,i=await vN([r,n].filter(Boolean)),o=await this.resolveCwd(t,n),a,l,c,d=0;if(n){let u=await $e(n,80);for(let f of u){let m=Kp(f.content);if(m&&(a=m),Xp(f)){let p=Vp(f.content).trim();p&&(l||(l=H(p,80)),c=H(p,80)),d++}else Gp(f)&&d++}}return{provider:"agy",sessionId:t,cwd:o,createdAt:i.createdAt,modifiedAt:i.modifiedAt,model:a,startCommand:"agy",firstUserMessage:l,lastUserMessage:c,messageCount:d,filePath:s,filePaths:n?[r,n]:[r]}}async loadSession(t){let r=await this.resolveSessionPath(t);if(!r)return null;let n=Yp(r);if(!n)return null;let s=await this.extractSummary(n);if(!s)return null;let i=await this.existingTranscriptPath(n),o=[],a=s.model,l=s.firstUserMessage,c=s.lastUserMessage;if(i)for await(let d of Ue(i)){let u=kN(d.created_at,s.modifiedAt),f=Kp(d.content);if(f&&(a=f),Xp(d)){let m=Vp(d.content),p=m.trim();p&&(l||(l=H(p,80)),c=H(p,80)),o.push({role:"user",timestamp:u,content:m});continue}if(Array.isArray(d.tool_calls))for(let m of d.tool_calls)o.push({role:"tool_use",timestamp:u,content:NN(m.args),toolName:m.name||"tool"});Gp(d)&&d.content?o.push({role:"assistant",timestamp:u,content:d.content,model:a}):IN(d)&&d.content&&o.push({role:"tool_result",timestamp:u,content:d.content,toolName:d.type?.toLowerCase()}),d.thinking&&o.push({role:"thinking",timestamp:u,content:d.thinking})}return{...s,model:a,firstUserMessage:l,lastUserMessage:c,messageCount:o.length,messages:o}}async resolveSessionPath(t){let r=this.conversationPath(t);try{return await Jp(r),r}catch{}let n=Ht(this.baseDir,"conversations");try{let s=[];for(let i of await qp(n)){if(!i.endsWith(".db"))continue;Yl(i,".db").startsWith(t)&&s.push(Ht(n,i))}if(s.length===1)return s[0]}catch{}return null}async deleteSession(t){let r=await this.resolveSessionPath(t);if(!r)return!1;let n=Yp(r);return n?(await Hp(this.conversationPath(n),{force:!0}),await Hp(Ht(this.baseDir,"brain",n),{recursive:!0,force:!0}),!0):!1}async resolveCwd(t,r){let n=await this.cwdFromLastConversationCache(t);if(n)return n;if(r){let s=await xN(r);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(t){let r=Ht(this.baseDir,"cache","last_conversations.json");try{let n=JSON.parse(await SN(r,"utf8"));for(let[s,i]of Object.entries(n))if(i===t)return s}catch{}return null}}});import{spawn as LN}from"node:child_process";function Zl(e){return new zl(e)}async function ON(e,t){let r=Date.now(),n=["--conversation",t.sessionId,"-p",e,"--dangerously-skip-permissions","--print-timeout",CN(t.timeoutMs)];t.model&&n.push("--model",t.model),at("agy",n,t.permissionMode??"yolo"),t.onProgress?.({kind:"system",summary:"agy -p one-shot started (no streaming events)"});let{stdout:s}=await $N(t.binary,n,{cwd:t.cwd,env:We(t.env,t.cwd,t.sessionId),signal:t.signal});return t.onProgress?.({kind:"system",summary:"agy -p one-shot completed"}),{text:s.trimEnd(),sessionId:t.sessionId,durationMs:Date.now()-r}}function $N(e,t,r){return new Promise((n,s)=>{let i;try{i=LN(e,t,{cwd:r.cwd,env:r.env,stdio:["ignore","pipe","pipe"]})}catch(c){s(c);return}let o="",a="";i.stdout?.on("data",c=>{o+=c.toString()}),i.stderr?.on("data",c=>{a+=c.toString()});let l=()=>{i.kill("SIGTERM"),s(new Error("agy turn aborted"))};if(r.signal){if(r.signal.aborted){l();return}r.signal.addEventListener("abort",l,{once:!0})}i.on("error",c=>{r.signal?.removeEventListener("abort",l),s(c)}),i.on("exit",(c,d)=>{if(r.signal?.removeEventListener("abort",l),c===0){n({stdout:o,stderr:a});return}let u=d?`signal ${d}`:`exit code ${c}`,f=a.trim()||o.trim();s(new Error(`agy failed (${u})${f?`: ${f}`:""}`))})})}function CN(e){return!e||e<=0?"8h":`${Math.max(1,Math.ceil(e/1e3))}s`}var zl,Ql=T(()=>{"use strict";zp();Wt();Tt();it();zr();zl=class extends xe{constructor(t){super({provider:new Ii(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append",leaderSetupHint:"Antigravity uses one-shot print turns; no streaming events are available."},binary:"agy",seedArgs:["-p",he,"--dangerously-skip-permissions","--print-timeout","2m"],resumeTemplate:"agy --conversation {{session_id}} --dangerously-skip-permissions",startTemplate:"agy --dangerously-skip-permissions",transport:ON})}seedArgsFor(t){let r=[...super.seedArgsFor(t)];return t?.model&&r.push("--model",t.model),r}manualSeedHint(t){return{launchCommand:`cd ${t} && agy --dangerously-skip-permissions`,postLaunchNote:"Send the lmctl seed instruction, wait for the conversation to write, then exit.",lsCommand:`lmctl ls --provider agy --sessiondir ${t}`}}}});import{createHash as MN}from"node:crypto";import{existsSync as jN,mkdirSync as DN,readFileSync as PN,renameSync as FN,writeFileSync as UN}from"node:fs";import{dirname as r_,join as Zp,resolve as ec}from"node:path";function WN(e){return MN("sha256").update(e).digest("hex").slice(0,8)}function BN(e){let t=e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return t.length>0?t:"session"}function qN(e,t){let r=t?.prompt??"",n=/\bYou are alias\s+([A-Za-z][A-Za-z0-9_-]*)\b/.exec(r);return n!==null?n[1]:e.split(/[\\/]/).filter(Boolean).pop()??"session"}function n_(e){return e.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function Ni(e){return Math.max(1,Math.ceil(e.length/4))}function rn(e=process.cwd()){let t=process.env.LMCTL_CLAUDE_MOCK_STORE;if(t!==void 0&&t.trim().length>0)return ec(t);let r=process.env.LMCTL_DB;return r!==void 0&&r.trim().length>0?Zp(r_(ec(r)),".lmctl-claude-mock","sessions.json"):Zp(ec(e),".lmctl-claude-mock","sessions.json")}function Qp(){return{schemaVersion:1,sessions:{}}}function ns(e){if(!jN(e))return Qp();try{let t=JSON.parse(PN(e,"utf8")),r=typeof t.sessions=="object"&&t.sessions!==null?t.sessions:{},n=typeof t.script=="object"&&t.script!==null?t.script:void 0;return{schemaVersion:1,sessions:r,...n!==void 0?{script:n}:{}}}catch{return Qp()}}function s_(e,t){DN(r_(e),{recursive:!0});let r=`${e}.${process.pid}.${Date.now()}.tmp`;UN(r,`${JSON.stringify(t,null,2)}
1423
+ `,"utf8"),FN(r,e)}function HN(e){return{...e,timestamp:e.timestamp.toISOString()}}function JN(e){return{...e,timestamp:new Date(e.timestamp)}}function XN(e){return{...e,createdAt:e.createdAt.toISOString(),modifiedAt:e.modifiedAt.toISOString(),messages:e.messages.map(HN)}}function i_(e){return{...e,createdAt:new Date(e.createdAt),modifiedAt:new Date(e.modifiedAt),messages:e.messages.map(JN)}}function xi(e,t=process.cwd()){let r=tn.get(e);if(r!==void 0)return r;let s=ns(rn(t)).sessions[e];if(s===void 0)return;let i=i_(s);return tn.set(i.sessionId,i),i}function e_(e){tn.set(e.sessionId,e);let t=rn(e.cwd),r=ns(t);r.sessions[e.sessionId]=XN({...e,filePath:t}),s_(t,r)}function GN(){let e=ns(rn()),t=Object.values(e.sessions).map(i_);for(let r of t)tn.set(r.sessionId,r);return t}function VN(e,t){let r=t.script;if(r===void 0)return;let n=r[e],s=r[n_(e)],i=n??s;if(typeof i=="string")return i;if(i!==void 0&&typeof i.text=="string")return i.text}function t_(e){return{provider:"ClaudeMock",sessionId:e.sessionId,cwd:e.cwd,createdAt:e.createdAt,modifiedAt:e.modifiedAt,messageCount:e.messages.length,filePath:e.filePath,cliVersion:"ClaudeMock/0",model:"claude-mock",totalInputTokens:e.totalInputTokens,totalOutputTokens:e.totalOutputTokens,lastTokenUsage:{totalTokens:e.totalInputTokens+e.totalOutputTokens}}}function nc(){return new rc}var tn,tc,rc,sc=T(()=>{"use strict";tn=new Map;tc=class{name="ClaudeMock";async discoverSessions(){let t=new Map;for(let r of GN())t.set(r.sessionId,r);for(let r of tn.values())t.set(r.sessionId,r);return[...t.values()].map(t_)}async loadSession(t){let r=xi(t);return r===void 0?null:{...t_(r),messages:r.messages.slice()}}async resolveSessionPath(t){return xi(t)?.filePath??null}async deleteSession(t){let r=tn.delete(t),n=rn(),s=ns(n),i=s.sessions[t]!==void 0;return delete s.sessions[t],i&&s_(n,s),r||i}},rc=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new tc;discover(){return this.provider.discoverSessions()}load(t){return this.provider.loadSession(t)}resolvePath(t){return this.provider.resolveSessionPath(t)}delete(t){return this.provider.deleteSession(t)}getWatchPaths(){return[]}async seed(t,r){let n=BN(qN(t,r)),s=`mock-${n}-${WN(`${t}:${n}`)}`,i=new Date,o=rn(t),a=xi(s,t),l=r?.prompt??"ClaudeMock seed",c=Ni(l),d={sessionId:s,cwd:t,filePath:o,createdAt:a?.createdAt??i,modifiedAt:i,messages:a?.messages.slice()??[],totalInputTokens:a?.totalInputTokens??0,totalOutputTokens:a?.totalOutputTokens??0};return d.messages.push({role:"user",timestamp:i,content:l}),d.messages.push({role:"assistant",timestamp:i,content:"ACK: ClaudeMock seeded"}),d.totalInputTokens+=c,d.totalOutputTokens+=Ni("ACK: ClaudeMock seeded"),e_(d),{success:!0,sessionId:s}}resumeCommand(t){return`ClaudeMock --resume ${t}`}startCommand(){return"ClaudeMock"}manualSeedHint(t){return{launchCommand:`cd ${t} && ClaudeMock`,postLaunchNote:"ClaudeMock is a hermetic test provider; no manual seed is required.",lsCommand:`lmctl ls --provider ClaudeMock --sessiondir ${t}`}}forkHint(t){return"ClaudeMock does not support fork."}async fork(t,r){return{success:!1,error:"ClaudeMock does not support fork."}}async sendTurn(t,r){let n=Date.now(),s=xi(r.sessionId,r.cwd);if(s===void 0)throw new Error(`ClaudeMock session not found: ${r.sessionId}`);let i=new Date,o=ns(rn(r.cwd)),a=VN(t,o)??`ClaudeMock ack: ${n_(t)}`;return s.messages.push({role:"user",timestamp:i,content:t}),s.messages.push({role:"assistant",timestamp:i,content:a,model:r.model??"claude-mock"}),s.modifiedAt=i,s.totalInputTokens+=Ni(t),s.totalOutputTokens+=Ni(a),e_(s),r.onProgress?.({kind:"text",summary:"ClaudeMock deterministic reply"}),{text:a,sessionId:r.sessionId,durationMs:Math.max(1,Date.now()-n),stopReason:"mock_stop",numTurns:1,status:"ok"}}}});function bt(e){let t=[Nl({claudeDir:e?.claudeDir}),Rl({codexDir:e?.codexDir,codeDir:e?.codeDir}),Ml({geminiDir:e?.geminiDir,claudeDir:e?.claudeDir,codexDir:e?.codexDir,codeDir:e?.codeDir}),Dl({copilotDir:e?.copilotDir}),Bl(),Jl({lmplayerDbPath:e?.lmplayerDbPath}),Vl(),Zl({agyDir:e?.agyDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&t.push(nc()),t}var ic=T(()=>{"use strict";xl();Ll();jl();Pl();ql();Xl();Kl();Ql();sc();xl();Ll();jl();Pl();ql();Xl();Kl();Ql();sc()});var cc={};ye(cc,{ProviderRegistry:()=>Vn,TransportConnectionError:()=>be,TransportError:()=>Qe,TransportJsonError:()=>ai,TransportProcessError:()=>Bt,TransportRpcError:()=>qt,_resetDefaultRegistryForTests:()=>KN,chat:()=>St,countTokens:()=>lc,createAdapterRegistry:()=>Et,createAllAdapters:()=>bt,listSessions:()=>ac,seed:()=>oc});function Ri(){return Ai===null&&(Ai=Et(bt())),Ai}function KN(){Ai=null}function a_(e,t){let r=e.getAdapter(t);if(!r)throw new Error(`provider "${t}" is not registered in this registry`);return r}async function St(e){let t=e.registry??Ri(),r=a_(t,e.provider),n={sessionId:e.sessionId,cwd:e.cwd,env:e.env,onDelta:e.onDelta,onProgress:e.onProgress,signal:e.signal,timeoutMs:e.timeoutMs,model:e.model,effort:e.effort,progPath:e.progPath,alias:e.alias,isLead:e.isLead,permissionMode:e.permissionMode},s=await r.sendTurn(e.prompt,n);return{text:s.text,sessionId:s.sessionId,durationMs:s.durationMs,stopReason:s.stopReason,numTurns:s.numTurns,status:s.status,stalledAfterMs:s.stalledAfterMs}}async function oc(e){let t=e.registry??Ri(),r=a_(t,e.provider),n=await o_(t,e.provider,e.cwd),s=await r.seed(e.cwd,{model:e.model,effort:e.effort,prompt:e.prompt});if(!s.success)return{success:!1,error:s.error};if(s.sessionId)return{success:!0,sessionId:s.sessionId};let i=await o_(t,e.provider,e.cwd),o=YN(n,i);return o?{success:!0,sessionId:o}:{success:!0}}async function o_(e,t,r){let n=await e.listAll({provider:t,workspace:r}),s=new Map;for(let i of n)s.set(i.sessionId,i.modifiedAt);return s}function YN(e,t){let r=[];for(let n of t.keys())e.has(n)||r.push(n);return r.length===1?r[0]:void 0}async function ac(e={}){return(e.registry??Ri()).listAll({provider:e.provider,workspace:e.workspace,limit:e.limit,from:e.from,to:e.to})}async function lc(e){let r=await(e.registry??Ri()).getSession(e.sessionId,e.provider);if(!r)throw new Error(`session "${e.sessionId}" not found`);let n=r.totalInputTokens??0,s=r.totalCachedInputTokens??0,i=r.totalCacheWriteInputTokens??0,o=r.totalOutputTokens??0,a=r.totalReasoningOutputTokens??0;return{provider:r.provider,sessionId:r.sessionId,input:n,cachedInput:s,cacheWriteInput:i,output:o,reasoningOutput:a,total:n+s+i+o+a,lastTurn:r.lastTokenUsage}}var Ai,vt=T(()=>{"use strict";ll();ic();ll();ic();Yr();Ai=null});function zN(){return dc===null&&(dc=Et(bt())),dc}async function Li(e){let{dal:t,team_member_id:r}=e,n=t!==void 0&&r!==void 0;n&&t.setMemberState(r,"in_chat");let s=!1,i;try{return await QN(e)}catch(o){throw s=!0,i=o,o}finally{if(n)if(!s)nn.delete(r),t.setMemberState(r,"idle");else{let o=ZN(i,r);t.setMemberState(r,o!==null?"attention_needed":"idle",o)}}}function ZN(e,t){if(!(e instanceof Se))return nn.delete(t),null;if(e.kind==="sessiondir_missing")return"sessiondir_missing";if(e.kind==="enoent")return"binary_missing";if(e.kind==="nonzero_exit"&&(e.exit_status===137||e.exit_status===139))return"oom_exit";if(e.kind==="timeout"){let r=(nn.get(t)??0)+1;return r>=3?(nn.delete(t),"consecutive_timeouts"):(nn.set(t,r),null)}return nn.delete(t),null}async function QN(e){let t=e.timeoutMs,r=typeof t=="number"&&t>0,n=zN(),s;try{let d=await n.resolveSession(e.sessionid);if(!d)return Promise.reject(new Se("other",null,`library: sessionid "${e.sessionid}" matched no registered provider`,uc(e.sessionid,e.sessiondir,"unresolved")));s=d.provider.name}catch(d){return Promise.reject(new Se("other",null,`library: session resolution failed: ${l_(d)}`,uc(e.sessionid,e.sessiondir,"unresolved")))}let i=uc(e.sessionid,e.sessiondir,s),o=new AbortController,a=r?setTimeout(()=>o.abort(),t):null,l=!1;o.signal.addEventListener("abort",()=>{l=!0},{once:!0});let c=Date.now();try{let d=await St({provider:s,sessionId:e.sessionid,cwd:e.sessiondir,prompt:e.prompt,timeoutMs:0,signal:o.signal,registry:n,onProgress:e.onProgress,permissionMode:e.permissionMode});if(d.status==="stalled")throw new Se("timeout",null,`library: stalled after ${d.stalledAfterMs??0}ms`,i);return{text:d.text,ms:Date.now()-c,exit_status:0,argv:i}}catch(d){throw l?new Se("timeout",null,`library: wall-clock timeout after ${t??0}ms`,i):ex(d,i)}finally{a!==null&&clearTimeout(a)}}function uc(e,t,r){return["<library>","chat",e,t,"--provider",r]}function l_(e){return e instanceof Error?e.message:String(e)}function ex(e,t){if(e instanceof Se)return e;if(e instanceof be){let r=e.cause;return r?.code==="ENOENT_CWD"?new Se("sessiondir_missing",null,e.message,t):r?.code==="ENOENT"?new Se("enoent",null,e.message,t):new Se("other",null,e.message,t)}return e instanceof Bt?new Se("nonzero_exit",e.exitCode??null,e.stderr??e.message,t):e instanceof qt?new Se("nonzero_exit",e.rpcCode??null,e.message,t):e instanceof Qe?new Se("other",null,e.message,t):new Se("other",null,l_(e),t)}var Se,dc,nn,Oi=T(()=>{"use strict";vt();Se=class extends Error{kind;exit_status;stderr;argv;constructor(t,r,n,s){super(`lmctl chat failed: ${t}`),this.kind=t,this.exit_status=r,this.stderr=n,this.argv=s,this.name="ChatError"}},dc=null;nn=new Map});function c_(){return fc===null&&(fc=Et(bt())),fc}function rx(e,t){if(!tx.test(e))return e;let r=t.getConfig(`workspace.${e}`);if(r===null||r.length===0)throw new ke("other",null,`workspace has no mapping for ${e}; run \`lmctl workspace init\` (or set workspace.${e} in lmctl_config)`,["<library>","seed","--provider",e]);return r}async function $i(e){let t=rx(e.member.provider,e.dal),r=t===e.member.provider?e.member:{...e.member,provider:t},n=await nx({member:r});return e.dal.setMemberProviderResolved(e.member.id,t),{sessionid:n.sessionid,provider_resolved:t}}async function nx(e){let t=e.member.provider,r=e.member.sessiondir,n=mc("seed",r,t);try{let s=await oc({provider:t,cwd:r,registry:c_()});if(!s.success)throw ix(s.error,n);if(!s.sessionId)throw new ke("parse",0,"",n);return{sessionid:s.sessionId}}catch(s){throw s instanceof ke?s:pc(s,n)}}async function d_(e){return sx(e)}async function sx(e){let t=c_(),r=mc("tokens",e.sessionid,"unresolved"),n;try{let i=await t.resolveSession(e.sessionid);if(!i)throw new ke("parse",0,`library: sessionid "${e.sessionid}" matched no registered provider`,r);n=i.provider.name}catch(i){throw i instanceof ke?i:pc(i,r)}let s=mc("tokens",e.sessionid,n);try{let i=await lc({sessionId:e.sessionid,provider:n,registry:t});return{input_tokens:i.input,cache_tokens:i.cachedInput+i.cacheWriteInput,output_tokens:i.output,total_tokens:i.total}}catch(i){throw i instanceof ke?i:pc(i,s)}}function mc(e,t,r){return["<library>",e,t,"--provider",r]}function ix(e,t){let r=e??"";if(/\bENOENT\b/i.test(r))return new ke("enoent",null,r,t);if(/timed?\s*out/i.test(r))return new ke("timeout",null,r,t);if(/\bexit code\s+(-?\d+)\b/i.test(r)){let n=/\bexit code\s+(-?\d+)\b/i.exec(r);return new ke("nonzero_exit",Number(n[1]),r,t)}return new ke("other",null,r,t)}function pc(e,t){return e instanceof ke?e:e instanceof be?e.cause?.code==="ENOENT"?new ke("enoent",null,e.message,t):new ke("other",null,e.message,t):e instanceof Bt?new ke("nonzero_exit",e.exitCode??null,e.stderr??e.message,t):e instanceof qt?new ke("nonzero_exit",e.rpcCode??null,e.message,t):e instanceof Qe?new ke("other",null,e.message,t):new ke("other",null,e instanceof Error?e.message:String(e),t)}var ke,fc,tx,_c=T(()=>{"use strict";vt();ke=class extends Error{kind;exit_status;stderr;argv;constructor(t,r,n,s){super(`lmctl seed failed: ${t}`),this.kind=t,this.exit_status=r,this.stderr=n,this.argv=s,this.name="SeedError"}},fc=null;tx=/^provider[123]$/});function Ci(e){return Buffer.from(e,"utf8").toString("base64url")}function is(e){return Buffer.from(e,"base64url").toString("utf8")}async function u_(e,t=r=>d_({sessionid:r})){if(process.env.LMCTL_SESSION_SIZE_DISABLED==="1")return{recorded:0,failed:0};let r=0,n=0;for(let s of ox(e)){let i=s.member.sessionid;if(i!==null)try{let o=await t(i);e.recordSessionSize({team_name:s.team_name,alias:s.member.alias,sessionid:i,...o}),r+=1}catch(o){n+=1;try{e.raiseAttention({kind:"daemon_session_size_failed",severity:"warn",payload:JSON.stringify({team_name:s.team_name,alias:s.member.alias,sessionid:i,error:o instanceof Error?o.message:String(o)})})}catch{}}}return{recorded:r,failed:n}}async function f_(e,t,r){let n=m_(e,t,r);if(n===null||n.member.sessionid===null)throw new Error("session member not found");if(n.member.state!=="idle")throw new ss(r,n.member.state);e.setMemberState(n.member.id,"in_chat","compacting");try{return await Li({sessionid:n.member.sessionid,sessiondir:n.member.sessiondir,prompt:"/compact"}),e.setMemberState(n.member.id,"idle",null),{ok:!0,row:p_(e,t,r)}}catch(s){throw e.setMemberState(n.member.id,"attention_needed",`compact failed: ${s instanceof Error?s.message:String(s)}`),s}}async function hc(e,t,r){let n=m_(e,t,r);if(n===null)throw new Error("session member not found");let s=await $i({member:n.member,dal:e});return e.updateTeamMemberSession(n.member.id,s.sessionid),{ok:!0,sessionid:s.sessionid,row:p_(e,t,r)}}function ox(e){return e.listTeams().flatMap(t=>e.listTeamMembers(t.id).filter(r=>r.sessionid!==null).map(r=>({team_name:t.name,member:r})))}function m_(e,t,r){let n=e.findTeamByName(t);if(n===null)return null;let s=e.findTeamMemberByAlias(n.id,r);return s===null?null:{team_name:n.name,member:s}}function p_(e,t,r){return e.sessionSizeHistory(t,r,1)[0]??null}var ss,Mi=T(()=>{"use strict";Oi();_c();ss=class extends Error{constructor(t,r){super(`member ${t} is currently ${r}; cannot compact while busy`),this.name="MemberBusyError"}}});async function gc(e){let t=e.dal,r=e.nowMs??Date.now(),n=e.thresholdMs??lx(t),s=r-n,i=t.query(`
1424
1424
  SELECT
1425
1425
  isess.id AS interactive_session_id,
1426
1426
  isess.run_id,
@@ -1446,16 +1446,16 @@ ${r}`:r}function pp(e,t){let r=C0[t.tool];return r?new Promise((n,s)=>{let i=t.b
1446
1446
  JOIN step s ON s.id = isess.step_id
1447
1447
  WHERE isess.status = 'waiting_agent'
1448
1448
  AND r.terminal_state IS NULL
1449
- `),o={scanned:i.length,hung_detected:0,attentions_created:0,duplicates_suppressed:0};for(let a of i){let l=ux(a.workflow_definition,a.session_state_name,a.step_state_name);if(l===null)continue;let c=cx(t,a.team_id,l);if(c===null||c.sessionid===null)continue;let d=c.alias.toLowerCase()!=="lead",u=a.last_activity_at<s&&(a.last_event_at===null||a.last_event_at<s),f=a.started_at<s;if(!d||!u||!f)continue;let m={session_id:c.sessionid,step_id:a.step_id,member_alias:c.alias,provider:Fe(c),last_activity_at:a.last_activity_at,elapsed_ms:r-a.started_at,session_state:a.session_status,factors:{leaf:!0,no_activity:!0,elapsed:!0}};if(o.hung_detected+=1,dx(t,a.run_id,a.step_id,c.sessionid)){o.duplicates_suppressed+=1;continue}let p={run_id:a.run_id,project_id:a.project_id,payload:m};t.raiseAttention({kind:"session_hung",severity:"warn",project_id:a.project_id,run_id:a.run_id,requires_user:!0,payload:JSON.stringify(m)}),o.attentions_created+=1,e.enableKillHook===!0&&e.killHook!==void 0&&await e.killHook(p)}return o}function lx(e){return __(e.getConfig(ji),ax)*1e3}function wc(e,t){return __(e.getConfig(Di),t)}function __(e,t){if(e===null||e.trim().length===0)return t;let r=Number(e);return Number.isFinite(r)&&r>0?Math.floor(r):t}function cx(e,t,r){return e.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",t,r)[0]??null}function dx(e,t,r,n){return e.query(`SELECT * FROM attention
1449
+ `),o={scanned:i.length,hung_detected:0,attentions_created:0,duplicates_suppressed:0};for(let a of i){let l=ux(a.workflow_definition,a.session_state_name,a.step_state_name);if(l===null)continue;let c=cx(t,a.team_id,l);if(c===null||c.sessionid===null)continue;let d=c.alias.toLowerCase()!=="lead",u=a.last_activity_at<s&&(a.last_event_at===null||a.last_event_at<s),f=a.started_at<s;if(!d||!u||!f)continue;let m={session_id:c.sessionid,step_id:a.step_id,member_alias:c.alias,provider:Fe(c),last_activity_at:a.last_activity_at,elapsed_ms:r-a.started_at,session_state:a.session_status,factors:{leaf:!0,no_activity:!0,elapsed:!0}};if(o.hung_detected+=1,dx(t,a.run_id,a.step_id,c.sessionid)){o.duplicates_suppressed+=1;continue}let p={run_id:a.run_id,project_id:a.project_id,payload:m};t.raiseAttention({kind:"session_hung",severity:"warn",project_id:a.project_id,run_id:a.run_id,requires_user:!0,payload:JSON.stringify(m)}),o.attentions_created+=1,e.enableKillHook===!0&&e.killHook!==void 0&&await e.killHook(p)}return o}function lx(e){return __(e.getConfig(ji),ax)*1e3}function yc(e,t){return __(e.getConfig(Di),t)}function __(e,t){if(e===null||e.trim().length===0)return t;let r=Number(e);return Number.isFinite(r)&&r>0?Math.floor(r):t}function cx(e,t,r){return e.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",t,r)[0]??null}function dx(e,t,r,n){return e.query(`SELECT * FROM attention
1450
1450
  WHERE kind = 'session_hung'
1451
1451
  AND run_id = ?
1452
- AND acknowledged_at IS NULL`,t).some(i=>{let o=h_(i.payload);return o!==null&&o.step_id===r&&o.session_id===n})}function ux(e,t,r){let n=h_(e);return n===null?null:fx(n,t,r)??mx(n,t,r)}function fx(e,t,r){if(!Array.isArray(e.steps))return null;let n=e.steps.filter(px),s=n.find(a=>a.id===t)??n.find(a=>a.name===t)??n.find(a=>a.name===r);if(s===void 0||s.type!=="lmctl/interactive")return null;let i=Ar(s.members)?s.members:null,o=i!==null&&Ar(i.agent)?i.agent:null;return typeof o?.alias=="string"?o.alias:null}function mx(e,t,r){if(!Ar(e.states))return null;let n=e.states[t]??e.states[r];if(!Ar(n))return null;let s=n;if(!Ar(s.agent))return null;let i=s.agent;return typeof i.alias=="string"?i.alias:null}function px(e){return Ar(e)}function h_(e){if(e===null)return null;try{let t=JSON.parse(e);return Ar(t)?t:null}catch{return null}}function Ar(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}var ji,Di,ax,Ec=T(()=>{"use strict";Ze();ji="monitor.session_hung.elapsed_threshold_seconds",Di="monitor.session_hung.check_interval_ms",ax=600});function Fi(e){let t=e.query(`
1452
+ AND acknowledged_at IS NULL`,t).some(i=>{let o=h_(i.payload);return o!==null&&o.step_id===r&&o.session_id===n})}function ux(e,t,r){let n=h_(e);return n===null?null:fx(n,t,r)??mx(n,t,r)}function fx(e,t,r){if(!Array.isArray(e.steps))return null;let n=e.steps.filter(px),s=n.find(a=>a.id===t)??n.find(a=>a.name===t)??n.find(a=>a.name===r);if(s===void 0||s.type!=="lmctl/interactive")return null;let i=Ar(s.members)?s.members:null,o=i!==null&&Ar(i.agent)?i.agent:null;return typeof o?.alias=="string"?o.alias:null}function mx(e,t,r){if(!Ar(e.states))return null;let n=e.states[t]??e.states[r];if(!Ar(n))return null;let s=n;if(!Ar(s.agent))return null;let i=s.agent;return typeof i.alias=="string"?i.alias:null}function px(e){return Ar(e)}function h_(e){if(e===null)return null;try{let t=JSON.parse(e);return Ar(t)?t:null}catch{return null}}function Ar(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}var ji,Di,ax,wc=T(()=>{"use strict";Ze();ji="monitor.session_hung.elapsed_threshold_seconds",Di="monitor.session_hung.check_interval_ms",ax=600});function Fi(e){let t=e.query(`
1453
1453
  SELECT status, COUNT(*) AS count FROM job GROUP BY status
1454
- `),r={queued:Pi(t,"queued"),running:Pi(t,"running"),done:Pi(t,"done"),failed:Pi(t,"failed"),total:bc(t)},n=e.query(`
1454
+ `),r={queued:Pi(t,"queued"),running:Pi(t,"running"),done:Pi(t,"done"),failed:Pi(t,"failed"),total:Tc(t)},n=e.query(`
1455
1455
  SELECT terminal_state, COUNT(*) AS count FROM run GROUP BY terminal_state
1456
1456
  `),s=e.query(`
1457
1457
  SELECT acknowledged_at, COUNT(*) AS count FROM attention GROUP BY acknowledged_at IS NOT NULL
1458
- `);return{generated_at:new Date().toISOString(),jobs:r,runs:{active:n.filter(i=>i.terminal_state===null).reduce((i,o)=>i+o.count,0),terminal:n.filter(i=>i.terminal_state!==null).reduce((i,o)=>i+o.count,0),total:bc(n)},attentions:{unacked:s.filter(i=>i.acknowledged_at===null).reduce((i,o)=>i+o.count,0),total:bc(s)},projects:Tc(e,"project"),teams:Tc(e,"team"),workflows:Tc(e,"workflow")}}function Ui(e){return e.listProjects()}function w_(e){return e.listTeams().map(t=>({...t,members:e.listTeamMembers(t.id)}))}function Wi(e){return e.query(`
1458
+ `);return{generated_at:new Date().toISOString(),jobs:r,runs:{active:n.filter(i=>i.terminal_state===null).reduce((i,o)=>i+o.count,0),terminal:n.filter(i=>i.terminal_state!==null).reduce((i,o)=>i+o.count,0),total:Tc(n)},attentions:{unacked:s.filter(i=>i.acknowledged_at===null).reduce((i,o)=>i+o.count,0),total:Tc(s)},projects:Ec(e,"project"),teams:Ec(e,"team"),workflows:Ec(e,"workflow")}}function Ui(e){return e.listProjects()}function w_(e){return e.listTeams().map(t=>({...t,members:e.listTeamMembers(t.id)}))}function Wi(e){return e.query(`
1459
1459
  SELECT w.*
1460
1460
  FROM workflow w
1461
1461
  JOIN (
@@ -1464,7 +1464,7 @@ ${r}`:r}function pp(e,t){let r=C0[t.tool];return r?new Promise((n,s)=>{let i=t.b
1464
1464
  GROUP BY name
1465
1465
  ) latest ON latest.name = w.name AND latest.version = w.version
1466
1466
  ORDER BY w.name ASC
1467
- `)}function E_(e,t={}){return t.status!==void 0?e.query("SELECT * FROM job WHERE status = ? ORDER BY priority DESC, id ASC",t.status):e.query("SELECT * FROM job ORDER BY priority DESC, id ASC LIMIT 100")}function T_(e,t={}){if(t.pr_url!==void 0){let r=e.findSubmittedPrByUrl(t.pr_url);return r===null?[]:[r]}return e.listSubmittedPrs({status:t.status})}function b_(e,t){return e.getSubmittedPr(t)}function Bi(e,t){return e.query("SELECT * FROM job WHERE id = ?",t)[0]??null}function sn(e,t={}){return e.query("SELECT * FROM run ORDER BY id DESC LIMIT ?",t.limit??100)}function Rr(e,t){let r=e.query("SELECT * FROM run WHERE id = ?",t)[0];return r===void 0?null:{...r,job:Bi(e,r.job_id),workflow:e.query("SELECT * FROM workflow WHERE id = ?",r.workflow_id)[0]??null,team:e.getTeam(r.team_id),steps:_x(e,r.id)}}function _x(e,t){return e.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",t).map(r=>({...r,artifacts:S_(e,r.id)}))}function Sc(e,t,r){let n=e.query("SELECT * FROM step WHERE run_id = ? AND id = ?",t,r)[0];return n===void 0?null:{...n,artifacts:S_(e,n.id)}}function S_(e,t){return e.query("SELECT * FROM step_artifact WHERE step_id = ? ORDER BY id ASC",t)}function Lr(e,t,r){let n=r===void 0?"SELECT sa.*, s.state_name FROM step_artifact sa JOIN step s ON sa.step_id = s.id WHERE s.run_id = ? ORDER BY sa.id ASC":"SELECT sa.*, s.state_name FROM step_artifact sa JOIN step s ON sa.step_id = s.id WHERE s.run_id = ? AND sa.kind = ? ORDER BY sa.id ASC";return r===void 0?e.query(n,t):e.query(n,t,r)}function v_(e,t,r){let n=Sc(e,t,r);return n===null?null:(n.artifacts.find(i=>i.kind===`${n.state_name}_transcript`)??n.artifacts.find(i=>i.content!==null))?.content??null}function k_(e,t={}){return t.type!==void 0?e.query("SELECT * FROM external_object WHERE type = ? ORDER BY id DESC",t.type):e.query("SELECT * FROM external_object ORDER BY id DESC LIMIT 100")}function I_(e,t={}){return t.unhandled===!0?e.query("SELECT * FROM external_signal WHERE handled_at IS NULL ORDER BY id DESC"):e.query("SELECT * FROM external_signal ORDER BY id DESC LIMIT 100")}function cr(e,t={}){return t.unacked===!0?e.query("SELECT * FROM attention WHERE acknowledged_at IS NULL ORDER BY id DESC"):e.query("SELECT * FROM attention ORDER BY id DESC LIMIT 100")}function qi(e,t={}){let r=[],n="a.kind IN ('interactive_waiting_operator', 'workflow_escalation')";return t.all!==!0&&(n+=" AND a.acknowledged_at IS NULL"),t.project!==void 0&&(n+=" AND p.name = ?",r.push(t.project)),t.since!==void 0&&(n+=" AND a.created_at >= ?",r.push(t.since)),e.query(`${N_}
1467
+ `)}function E_(e,t={}){return t.status!==void 0?e.query("SELECT * FROM job WHERE status = ? ORDER BY priority DESC, id ASC",t.status):e.query("SELECT * FROM job ORDER BY priority DESC, id ASC LIMIT 100")}function T_(e,t={}){if(t.pr_url!==void 0){let r=e.findSubmittedPrByUrl(t.pr_url);return r===null?[]:[r]}return e.listSubmittedPrs({status:t.status})}function b_(e,t){return e.getSubmittedPr(t)}function Bi(e,t){return e.query("SELECT * FROM job WHERE id = ?",t)[0]??null}function sn(e,t={}){return e.query("SELECT * FROM run ORDER BY id DESC LIMIT ?",t.limit??100)}function Rr(e,t){let r=e.query("SELECT * FROM run WHERE id = ?",t)[0];return r===void 0?null:{...r,job:Bi(e,r.job_id),workflow:e.query("SELECT * FROM workflow WHERE id = ?",r.workflow_id)[0]??null,team:e.getTeam(r.team_id),steps:_x(e,r.id)}}function _x(e,t){return e.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",t).map(r=>({...r,artifacts:S_(e,r.id)}))}function bc(e,t,r){let n=e.query("SELECT * FROM step WHERE run_id = ? AND id = ?",t,r)[0];return n===void 0?null:{...n,artifacts:S_(e,n.id)}}function S_(e,t){return e.query("SELECT * FROM step_artifact WHERE step_id = ? ORDER BY id ASC",t)}function Lr(e,t,r){let n=r===void 0?"SELECT sa.*, s.state_name FROM step_artifact sa JOIN step s ON sa.step_id = s.id WHERE s.run_id = ? ORDER BY sa.id ASC":"SELECT sa.*, s.state_name FROM step_artifact sa JOIN step s ON sa.step_id = s.id WHERE s.run_id = ? AND sa.kind = ? ORDER BY sa.id ASC";return r===void 0?e.query(n,t):e.query(n,t,r)}function v_(e,t,r){let n=bc(e,t,r);return n===null?null:(n.artifacts.find(i=>i.kind===`${n.state_name}_transcript`)??n.artifacts.find(i=>i.content!==null))?.content??null}function k_(e,t={}){return t.type!==void 0?e.query("SELECT * FROM external_object WHERE type = ? ORDER BY id DESC",t.type):e.query("SELECT * FROM external_object ORDER BY id DESC LIMIT 100")}function I_(e,t={}){return t.unhandled===!0?e.query("SELECT * FROM external_signal WHERE handled_at IS NULL ORDER BY id DESC"):e.query("SELECT * FROM external_signal ORDER BY id DESC LIMIT 100")}function cr(e,t={}){return t.unacked===!0?e.query("SELECT * FROM attention WHERE acknowledged_at IS NULL ORDER BY id DESC"):e.query("SELECT * FROM attention ORDER BY id DESC LIMIT 100")}function qi(e,t={}){let r=[],n="a.kind IN ('interactive_waiting_operator', 'workflow_escalation')";return t.all!==!0&&(n+=" AND a.acknowledged_at IS NULL"),t.project!==void 0&&(n+=" AND p.name = ?",r.push(t.project)),t.since!==void 0&&(n+=" AND a.created_at >= ?",r.push(t.since)),e.query(`${N_}
1468
1468
  WHERE ${n}
1469
1469
  ORDER BY a.created_at DESC`,...r).map(x_)}function kt(e,t){let n=e.query(`${N_}
1470
1470
  WHERE a.id = ?`,t)[0];return n===void 0?null:x_(n)}function x_(e){let{payload_json:t,...r}=e,n={...r,node_path:null,expected_response:null,transcript_tail:null,paused_at:null,created_run_inputs:null,workflow_version_id:null,workflow_step:null,escalation_tier:null,escalation_token:null,escalation_reason:null,declared_outcomes:null,agent_output:null};if(t==null)return n;let s;try{s=JSON.parse(t)}catch{return n}if(s===null||typeof s!="object")return n;let i=s;if(Array.isArray(i.node_path)&&i.node_path.every(o=>typeof o=="string")&&(n.node_path=i.node_path),i.expected_response!==null&&typeof i.expected_response=="object"){let o=i.expected_response;if(typeof o.kind=="string"){let a=Array.isArray(o.choices)&&o.choices.every(l=>typeof l=="string")?o.choices:null;n.expected_response={kind:o.kind,choices:a}}}if(Array.isArray(i.transcript_tail)&&i.transcript_tail.every(o=>typeof o=="string")&&(n.transcript_tail=i.transcript_tail),typeof i.paused_at=="string"&&(n.paused_at=i.paused_at),i.created_run_inputs!==null&&typeof i.created_run_inputs=="object"&&!Array.isArray(i.created_run_inputs)&&(n.created_run_inputs=i.created_run_inputs),typeof i.workflow_version_id=="number"?n.workflow_version_id=i.workflow_version_id:i.workflow_version_id===null&&(n.workflow_version_id=null),i.step!==null&&typeof i.step=="object"&&!Array.isArray(i.step)){let o=i.step;typeof o.id=="string"&&o.id.length>0&&(n.workflow_step={id:o.id,name:typeof o.name=="string"?o.name:null,type:typeof o.type=="string"?o.type:null})}return typeof i.tier=="string"&&(n.escalation_tier=i.tier),typeof i.token=="string"&&(n.escalation_token=i.token),typeof i.reason=="string"&&(n.escalation_reason=i.reason),Array.isArray(i.declared_outcomes)&&i.declared_outcomes.every(o=>typeof o=="string")&&(n.declared_outcomes=i.declared_outcomes),typeof i.agent_output=="string"&&(n.agent_output=i.agent_output),n}function A_(e){return e.query(`
@@ -1473,7 +1473,7 @@ ${r}`:r}function pp(e,t){let r=C0[t.tool];return r?new Promise((n,s)=>{let i=t.b
1473
1473
  JOIN workflow w ON w.id = r.workflow_id
1474
1474
  GROUP BY w.name, r.terminal_state
1475
1475
  ORDER BY w.name ASC, r.terminal_state ASC
1476
- `)}function Tc(e,t){return e.query(`SELECT COUNT(*) AS count FROM ${t}`)[0]?.count??0}function Pi(e,t){return e.find(r=>r.status===t)?.count??0}function bc(e){return e.reduce((t,r)=>t+r.count,0)}function vc(e,t,r){let n=r!==void 0?new Date(Date.now()-Math.trunc(r)*864e5).toISOString():null,s=[t];n!==null&&s.push(n);let i=e.query(`SELECT s.state_name, s.outcome
1476
+ `)}function Ec(e,t){return e.query(`SELECT COUNT(*) AS count FROM ${t}`)[0]?.count??0}function Pi(e,t){return e.find(r=>r.status===t)?.count??0}function Tc(e){return e.reduce((t,r)=>t+r.count,0)}function Sc(e,t,r){let n=r!==void 0?new Date(Date.now()-Math.trunc(r)*864e5).toISOString():null,s=[t];n!==null&&s.push(n);let i=e.query(`SELECT s.state_name, s.outcome
1477
1477
  FROM step s
1478
1478
  JOIN run r ON r.id = s.run_id
1479
1479
  JOIN job j ON j.id = r.job_id
@@ -1497,7 +1497,7 @@ ${r}`:r}function pp(e,t){let r=C0[t.tool];return r?new Promise((n,s)=>{let i=t.b
1497
1497
  WHERE j.project_id = ?
1498
1498
  ${n!==null?"AND r.started_at >= ?":""}
1499
1499
  GROUP BY s.run_id, s.state_name
1500
- HAVING COUNT(*) > 1`,...s),h=new Map;for(let y of g){let w=h.get(y.state_name)??{runs:0,total_attempts:0};w.runs++,w.total_attempts+=y.attempt_count,h.set(y.state_name,w)}let S=[...h.entries()].map(([y,w])=>({state_name:y,retried_runs:w.runs,avg_retries:w.runs>0?Number((w.total_attempts/w.runs).toFixed(2)):0}));return{request_changes_rate:d,step_duration_histogram:_,retry_counts:S}}function kc(e,t={}){let r=t.since_days!==void 0?Date.now()-Math.trunc(t.since_days)*864e5:0,n=t.project_id!==void 0?e.query(`SELECT json_extract(se.payload, '$.tool') AS tool_name, COUNT(*) AS cnt
1500
+ HAVING COUNT(*) > 1`,...s),h=new Map;for(let y of g){let w=h.get(y.state_name)??{runs:0,total_attempts:0};w.runs++,w.total_attempts+=y.attempt_count,h.set(y.state_name,w)}let S=[...h.entries()].map(([y,w])=>({state_name:y,retried_runs:w.runs,avg_retries:w.runs>0?Number((w.total_attempts/w.runs).toFixed(2)):0}));return{request_changes_rate:d,step_duration_histogram:_,retry_counts:S}}function vc(e,t={}){let r=t.since_days!==void 0?Date.now()-Math.trunc(t.since_days)*864e5:0,n=t.project_id!==void 0?e.query(`SELECT json_extract(se.payload, '$.tool') AS tool_name, COUNT(*) AS cnt
1501
1501
  FROM session_event se
1502
1502
  JOIN run r ON r.id = se.run_id
1503
1503
  JOIN job j ON j.id = r.job_id
@@ -1574,7 +1574,7 @@ ${r}`:r}function pp(e,t){let r=C0[t.tool];return r?new Promise((n,s)=>{let i=t.b
1574
1574
  ON isess.run_id = a.run_id
1575
1575
  AND isess.id = (
1576
1576
  SELECT MAX(id) FROM interactive_session WHERE run_id = a.run_id
1577
- )`});var X_={};ye(X_,{parseApiArgs:()=>M_,readApiClientConfig:()=>Ic,runApi:()=>Cx});import{readFileSync as Ax}from"node:fs";import{basename as Rx,extname as Lx}from"node:path";async function Cx(e,t={stdout:process.stdout,stderr:process.stderr}){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write($x),0;if(e[0]==="config")return jx(e.slice(1),t);let r=H_(e,"--direct");if(r.rest[0]==="escalations")return Dx(r.rest.slice(1),t,r.present);if(r.rest[0]==="workflows"&&r.rest[1]==="verify"&&Yi(r.rest.slice(2)))return t.stdout.write(`${Wx}
1577
+ )`});var X_={};ye(X_,{parseApiArgs:()=>M_,readApiClientConfig:()=>kc,runApi:()=>Cx});import{readFileSync as Ax}from"node:fs";import{basename as Rx,extname as Lx}from"node:path";async function Cx(e,t={stdout:process.stdout,stderr:process.stderr}){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write($x),0;if(e[0]==="config")return jx(e.slice(1),t);let r=H_(e,"--direct");if(r.rest[0]==="escalations")return Dx(r.rest.slice(1),t,r.present);if(r.rest[0]==="workflows"&&r.rest[1]==="verify"&&Yi(r.rest.slice(2)))return t.stdout.write(`${Wx}
1578
1578
  `),0;if(r.rest[0]==="workflows"&&r.rest[1]==="verify")return r.present?(t.stderr.write(`error: --direct is not supported for workflows verify; use the HTTP api route
1579
1579
  `),2):MA(r.rest.slice(2),t);if(r.rest[0]==="run"&&r.rest[1]==="where"&&Yi(r.rest.slice(2)))return t.stdout.write(`${Fx}
1580
1580
  `),0;if(r.rest[0]==="run"&&r.rest[1]==="timeline"&&Yi(r.rest.slice(2)))return t.stdout.write(`${Ux}
@@ -1589,7 +1589,7 @@ ${r}`:r}function pp(e,t){let r=C0[t.tool];return r?new Promise((n,s)=>{let i=t.b
1589
1589
  `):t.stdout.write(`${JSON.stringify(f)}
1590
1590
  `)}else n.json?t.stdout.write(`${JSON.stringify(await l.json(),null,2)}
1591
1591
  `):(t.stdout.write(await l.text()),t.stdout.write(`
1592
- `));return 0}function M_(e){let t=P_(e);if(typeof t=="string")return t;let r=t.args,n=t.format!=="text",[s,...i]=r;return s===void 0?"usage: lmctl api <subcommand>":s==="status"?Ki(i,"/api/status",n):s==="projects"?Ki(i,"/api/projects",n):s==="teams"?Ki(i,"/api/teams",n):s==="workflows"?i[0]==="verify"?iA(i.slice(1),t.format):Ki(i,"/api/workflows",n):s==="workflow"?sA(i,n):s==="upload"?rA(i,n):s==="submit-job"?nA(i,n):s==="issues"?tA(i,n):s==="jobs"?os(i,"--status","/api/jobs","status",n):s==="job"?eA(i,n):s==="project"?oA(i,n):s==="artifact"?cA(i,n):s==="runs"?os(i,"--limit","/api/runs","limit",n,!0):s==="external-objects"?os(i,"--type","/api/external-objects","type",n):s==="external-signals"?O_(i,"--unhandled","/api/external-signals","unhandled",n):s==="attentions"||s==="attention"?i[0]==="ack"?dA(i,n):O_(i,"--unacked","/api/attentions","unacked",n):s==="stats"?uA(i,n):s==="daemon"?fA(i,n):s==="intake"?mA(i,n):s==="session"?pA(i,n):s==="run"?_A(i,t.format):s==="prs"?os(i,"--status","/api/submitted-prs","status",n):s==="pr"?Zx(i,n):`unknown subcommand: ${s}`}function dr(e,t){let r={Accept:e};return t!==null&&t.length>0&&(r.Authorization=`Bearer ${t}`),r}function Or(e){if(e.dal!==void 0)return Ic(e.dal,process.env,e);let t=Ie({path:le()});try{return Ic(t,process.env,e)}finally{t.close()}}function Ic(e,t,r){let n=[],s=e.getConfig("api.url"),i;s!==null?i=s:t.LMCTL_API_URL!==void 0&&t.LMCTL_API_URL.length>0?(i=t.LMCTL_API_URL,n.push("api.url")):i=Ox;let o=e.getConfig("api.token"),a;o!==null?a=o:t.LMCTL_API_TOKEN!==void 0&&t.LMCTL_API_TOKEN.length>0?(a=t.LMCTL_API_TOKEN,n.push("api.token")):a=null;for(let l of n)r.stderr.write(`note: ${Mx(l)} env var read; consider \`lmctl api config set ${l} ...\` to make this DB-canonical.
1592
+ `));return 0}function M_(e){let t=P_(e);if(typeof t=="string")return t;let r=t.args,n=t.format!=="text",[s,...i]=r;return s===void 0?"usage: lmctl api <subcommand>":s==="status"?Ki(i,"/api/status",n):s==="projects"?Ki(i,"/api/projects",n):s==="teams"?Ki(i,"/api/teams",n):s==="workflows"?i[0]==="verify"?iA(i.slice(1),t.format):Ki(i,"/api/workflows",n):s==="workflow"?sA(i,n):s==="upload"?rA(i,n):s==="submit-job"?nA(i,n):s==="issues"?tA(i,n):s==="jobs"?os(i,"--status","/api/jobs","status",n):s==="job"?eA(i,n):s==="project"?oA(i,n):s==="artifact"?cA(i,n):s==="runs"?os(i,"--limit","/api/runs","limit",n,!0):s==="external-objects"?os(i,"--type","/api/external-objects","type",n):s==="external-signals"?O_(i,"--unhandled","/api/external-signals","unhandled",n):s==="attentions"||s==="attention"?i[0]==="ack"?dA(i,n):O_(i,"--unacked","/api/attentions","unacked",n):s==="stats"?uA(i,n):s==="daemon"?fA(i,n):s==="intake"?mA(i,n):s==="session"?pA(i,n):s==="run"?_A(i,t.format):s==="prs"?os(i,"--status","/api/submitted-prs","status",n):s==="pr"?Zx(i,n):`unknown subcommand: ${s}`}function dr(e,t){let r={Accept:e};return t!==null&&t.length>0&&(r.Authorization=`Bearer ${t}`),r}function Or(e){if(e.dal!==void 0)return kc(e.dal,process.env,e);let t=Ie({path:le()});try{return kc(t,process.env,e)}finally{t.close()}}function kc(e,t,r){let n=[],s=e.getConfig("api.url"),i;s!==null?i=s:t.LMCTL_API_URL!==void 0&&t.LMCTL_API_URL.length>0?(i=t.LMCTL_API_URL,n.push("api.url")):i=Ox;let o=e.getConfig("api.token"),a;o!==null?a=o:t.LMCTL_API_TOKEN!==void 0&&t.LMCTL_API_TOKEN.length>0?(a=t.LMCTL_API_TOKEN,n.push("api.token")):a=null;for(let l of n)r.stderr.write(`note: ${Mx(l)} env var read; consider \`lmctl api config set ${l} ...\` to make this DB-canonical.
1593
1593
  `);return{baseUrl:i,token:a}}function Mx(e){switch(e){case"api.port":return"LMCTL_API_PORT";case"api.token":return"LMCTL_API_TOKEN";case"api.url":return"LMCTL_API_URL";default:return`LMCTL_${e.replaceAll(".","_").toUpperCase()}`}}async function jx(e,t){let[r,...n]=e;if(r===void 0)return t.stderr.write(`usage: lmctl api config <get|set|list>
1594
1594
  `),2;let s=t.dal===void 0,i=t.dal??Ie({path:le()});try{if(r==="get"){if(n.length!==1)return t.stderr.write(`usage: lmctl api config get <key>
1595
1595
  `),2;let o=n[0];if(!Vi.has(o))return t.stderr.write(`error: unsupported config key: ${o} (Phase A keys: ${[...Vi].join(", ")})
@@ -1632,7 +1632,7 @@ ${r}`:r}function pp(e,t){let r=C0[t.tool];return r?new Promise((n,s)=>{let i=t.b
1632
1632
  `),1;if(!d.ok){let f=await d.text();return t.stderr.write(`error: HTTP ${d.status}: ${f}
1633
1633
  `),d.status===400?2:1}let u=await d.json();return r?t.stdout.write(`${JSON.stringify(u,null,2)}
1634
1634
  `):t.stdout.write(`ok: attention ${i} acknowledged; step ${u.step_id} resumed (session_status=${String(u.session_status)})
1635
- `),0}function L_(e,t,r){return e!=="api.token"||r?t:t.length<=8?"***":`${t.slice(0,8)}\u2026(masked; use --show-secrets to reveal)`}function Vx(e,t){if(t.length===0)return`${e} value must be non-empty`;if(e==="api.port"){let r=Number(t);if(!Number.isInteger(r)||r<=0||r>65535)return`invalid api.port: ${t}`}if(e==="api.url")try{new URL(t)}catch{return`invalid api.url: ${t}`}if(e===ji||e===Di){let r=Number(t);if(!Number.isInteger(r)||r<=0)return`invalid ${e}: ${t}`}return null}function Kx(e,t){let r=Ax(e),n=r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength),s=new FormData;return s.append("image",new Blob([n],{type:Yx(e)}),Rx(e)),t!==void 0&&s.append("project",t),s}function Yx(e){switch(Lx(e).toLowerCase()){case".png":return"image/png";case".jpg":case".jpeg":return"image/jpeg";case".webp":return"image/webp";case".heic":return"image/heic";case".pdf":return"application/pdf";default:return"application/octet-stream"}}function zx(e){if(e!==null&&typeof e=="object"&&!Array.isArray(e)){let t=e.id;return typeof t=="number"&&Number.isInteger(t)?t:null}return null}function Zx(e,t){let[r,...n]=e;if(r===void 0)return"usage: lmctl api pr <id|list|get>";if(r==="list")return os(n,"--status","/api/submitted-prs","status",t);if(r==="get"){let[s]=n;return s===void 0?"usage: api pr get <id-or-url>":/^\d+$/.test(s)?{method:"GET",path:`/api/submitted-prs/${s}`,accept:"application/json",json:t}:{method:"GET",path:`/api/submitted-prs?pr_url=${encodeURIComponent(s)}`,accept:"application/json",json:t}}return/^\d+$/.test(r)?{method:"GET",path:`/api/submitted-prs/${r}`,accept:"application/json",json:t}:`usage: lmctl api pr <id|list|get>; got: ${r}`}function P_(e){let t=[],r="json";for(let n of e)n==="--json"?r="json":n==="--text"?r="text":t.push(n);return{args:t,format:r}}function Ki(e,t,r){return e.length>0?re(e[0]):{method:"GET",path:t,accept:r?"application/json":"text/html",json:r}}function os(e,t,r,n,s,i=!1){let o;for(let l=0;l<e.length;l+=1){let c=e[l];if(c!==t)return re(c);let d=e[++l];if(d===void 0||d.startsWith("--"))return`missing value for ${t}`;if(i&&(!/^\d+$/.test(d)||Number(d)<=0))return`invalid ${t}: ${d}`;o=d}let a=o===void 0?"":`?${n}=${encodeURIComponent(o)}`;return{method:"GET",path:`${r}${a}`,accept:s?"application/json":"text/html",json:s}}function O_(e,t,r,n,s){let i=!1;for(let o of e){if(o!==t)return re(o);i=!0}return{method:"GET",path:`${r}${i?`?${n}=true`:""}`,accept:s?"application/json":"text/html",json:s}}function Qx(e,t,r){if(e.length!==1)return`usage: lmctl api ${r} <id>`;let n=ne(e[0],"id");return typeof n=="string"?n:{method:"GET",path:`${t}/${n}`,accept:"application/json",json:!0}}function eA(e,t){let[r,...n]=e;if(r!==void 0&&n.length===0&&r!=="enqueue"&&r!=="run")return Qx([r],"/api/jobs","job");if(r==="enqueue"){let s,i,o="manual",a,l,c;for(let u=0;u<n.length;u+=1){let f=n[u],m=n[++u];if(m===void 0||m.startsWith("--"))return`missing value for ${f}`;if(f==="--project")s=m;else if(f==="--project-id"){let p=Number(m);if(!Number.isInteger(p))return`invalid --project-id: ${m}`;i=p}else if(f==="--source")o=m;else if(f==="--payload")a=m;else if(f==="--dedupe-key")l=m;else if(f==="--priority"){let p=Number(m);if(!Number.isInteger(p))return`invalid --priority: ${m}`;c=p}else return re(f)}if(s===void 0&&i===void 0)return"usage: lmctl api job enqueue (--project NAME | --project-id ID) [--source S] [--payload JSON] [--dedupe-key K] [--priority N]";let d={source:o};return s!==void 0&&(d.project=s),i!==void 0&&(d.project_id=i),a!==void 0&&(d.payload=Nc(a)),l!==void 0&&(d.dedupe_key=l),c!==void 0&&(d.priority=c),{method:"POST",path:"/api/jobs",accept:"application/json",json:t,body:JSON.stringify(d)}}if(r==="run"){if(n.length!==1)return"usage: lmctl api job run <id>";let s=ne(n[0],"id");return typeof s=="string"?s:{method:"POST",path:`/api/jobs/${s}/run`,accept:"application/json",json:t}}return"usage: lmctl api job <id|enqueue|run>"}function tA(e,t){let[r,...n]=e;if(r==="list"){let[s,...i]=n;if(s===void 0||s.startsWith("--"))return"usage: lmctl api issues list <project> [--status STATUS] [--severity SEVERITY] [--ai-test-path P]";let o=new URLSearchParams;for(let l=0;l<i.length;l+=1){let c=i[l],d=i[++l];if(d===void 0||d.startsWith("--"))return`missing value for ${c}`;if(c==="--status")o.set("status",d);else if(c==="--severity")o.set("severity",d);else if(c==="--ai-test-path")o.set("ai_test_path",d);else return re(c)}let a=o.toString();return{method:"GET",path:`/api/projects/${encodeURIComponent(s)}/issues${a.length>0?`?${a}`:""}`,accept:t?"application/json":"text/html",json:t}}if(r==="show"){if(n.length!==1)return"usage: lmctl api issues show <id>";let s=ne(n[0],"id");return typeof s=="string"?s:{method:"GET",path:`/api/issues/${s}`,accept:"application/json",json:t}}return r==="create"?F_(n,t):r==="claim"?U_(n,t):r==="claim-next"?W_(n,t):r==="close"?B_(n,t):r==="reopen"?q_(n,t):"usage: lmctl api issues <list|show|create|claim|claim-next|close|reopen>"}function F_(e,t){let[r,...n]=e;if(r===void 0||r.startsWith("--"))return"usage: lmctl api issues create <project> --title T --body B [--severity S] [--labels JSON] [--ai-test-path P]";let s=new Set(["--title","--body"]),i={};for(let o=0;o<n.length;o+=1){let a=n[o],l=n[++o];if(l===void 0)return`missing value for ${a}`;if(!s.has(a)&&l.startsWith("--"))return`missing value for ${a}`;if(a==="--title")i.title=l;else if(a==="--body")i.body=l;else if(a==="--severity")i.severity=l;else if(a==="--labels")i.labels=Nc(l);else if(a==="--ai-test-path")i.ai_test_path=l;else if(a==="--source-run-id"){let c=ne(l,"--source-run-id");if(typeof c=="string")return c;i.source_run_id=c}else return re(a)}return typeof i.title!="string"?"missing value for --title":typeof i.body!="string"?"missing value for --body":{method:"POST",path:`/api/projects/${encodeURIComponent(r)}/issues`,accept:"application/json",json:t,body:JSON.stringify(i)}}function U_(e,t){let[r,...n]=e;if(r===void 0)return"usage: lmctl api issues claim <id> --assigned-run-id RUN";let s=ne(r,"id");if(typeof s=="string")return s;let i={};for(let o=0;o<n.length;o+=1){let a=n[o],l=n[++o];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--assigned-run-id"){let c=ne(l,"--assigned-run-id");if(typeof c=="string")return c;i.assigned_run_id=c}else return re(a)}return typeof i.assigned_run_id!="number"?"missing value for --assigned-run-id":{method:"POST",path:`/api/issues/${s}/claim`,accept:"application/json",json:t,body:JSON.stringify(i)}}function W_(e,t){let[r,...n]=e;if(r===void 0||r.startsWith("--"))return"usage: lmctl api issues claim-next <project> --assigned-run-id RUN";let s={};for(let i=0;i<n.length;i+=1){let o=n[i],a=n[++i];if(a===void 0||a.startsWith("--"))return`missing value for ${o}`;if(o==="--assigned-run-id"){let l=ne(a,"--assigned-run-id");if(typeof l=="string")return l;s.assigned_run_id=l}else return re(o)}return typeof s.assigned_run_id!="number"?"missing value for --assigned-run-id":{method:"POST",path:`/api/projects/${encodeURIComponent(r)}/issues/claim-next`,accept:"application/json",json:t,body:JSON.stringify(s)}}function B_(e,t){let[r,...n]=e;if(r===void 0)return"usage: lmctl api issues close <id> [--commit-hash SHA] [--closed-run-id RUN]";let s=ne(r,"id");if(typeof s=="string")return s;let i={};for(let o=0;o<n.length;o+=1){let a=n[o],l=n[++o];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--commit-hash")i.commit_hash=l;else if(a==="--closed-run-id"){let c=ne(l,"--closed-run-id");if(typeof c=="string")return c;i.closed_run_id=c}else return re(a)}return{method:"POST",path:`/api/issues/${s}/close`,accept:"application/json",json:t,body:JSON.stringify(i)}}function q_(e,t){let[r,...n]=e;if(r===void 0)return"usage: lmctl api issues reopen <id> [--source-run-id RUN]";let s=ne(r,"id");if(typeof s=="string")return s;let i={};for(let o=0;o<n.length;o+=1){let a=n[o],l=n[++o];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--source-run-id"){let c=ne(l,"--source-run-id");if(typeof c=="string")return c;i.source_run_id=c}else return re(a)}return{method:"POST",path:`/api/issues/${s}/reopen`,accept:"application/json",json:t,body:JSON.stringify(i)}}function rA(e,t){let[r,...n]=e;if(r===void 0||r.startsWith("--"))return"usage: lmctl api upload <file> [--project NAME] [--json]";let s;for(let i=0;i<n.length;i+=1){let o=n[i];if(o!=="--project")return re(o);let a=n[++i];if(a===void 0||a.startsWith("--"))return"missing value for --project";s=a}return{method:"POST",path:"/api/uploads",accept:"application/json",json:t,upload:{filePath:r,project:s}}}function nA(e,t){let r,n,s,i;for(let a=0;a<e.length;a+=1){let l=e[a],c=e[++a];if(c===void 0||c.startsWith("--"))return`missing value for ${l}`;if(l==="--workflow")r=c;else if(l==="--workflow-id-override"){let d=Number(c);if(!Number.isInteger(d)||d<=0)return`invalid --workflow-id-override: ${c}`;n=d}else if(l==="--project")s=c;else if(l==="--inputs")try{let d=JSON.parse(c);if(d===null||typeof d!="object"||Array.isArray(d))return"--inputs must be a JSON object";i=d}catch{return"invalid --inputs JSON"}else return re(l)}if(r===void 0&&n===void 0)return"missing value for --workflow";if(i===void 0)return"missing value for --inputs";let o={source:"api-submit-job",payload:i};return r!==void 0&&(o.workflow=r),n!==void 0&&(o.workflow_id_override=n),s!==void 0&&(o.project=s),{method:"POST",path:"/api/jobs",accept:"application/json",json:t,body:JSON.stringify(o),runAfterSubmit:!0}}function Nc(e){try{return JSON.parse(e)}catch{return e}}function sA(e,t){let[r,n]=e;return r!=="show"||n===void 0||e.length!==2?"usage: lmctl api workflow show <name>":{method:"GET",path:`/api/workflows/${encodeURIComponent(n)}`,accept:"application/json",json:t}}function iA(e,t){for(let r of e)if(!(r==="--json"||r==="--text"))return re(r);return{method:"GET",path:"/api/workflows/verify",accept:t==="text"?"text/plain":"application/json",json:t!=="text"}}function oA(e,t){let[r,n,...s]=e;return r==="workflow"?aA([n,...s].filter(i=>i!==void 0),t):r!=="show"||n===void 0||e.length!==2?"usage: lmctl api project <show|workflow>":{method:"GET",path:`/api/projects/${encodeURIComponent(n)}`,accept:"application/json",json:t}}function aA(e,t){let[r,...n]=e;if(r==="list")return n.length!==1?"usage: lmctl api project workflow list <project>":{method:"GET",path:`/api/projects/${encodeURIComponent(n[0])}/workflows`,accept:t?"application/json":"text/html",json:t};if(r==="show"){if(n.length!==1)return"usage: lmctl api project workflow show <id>";let s=ne(n[0],"id");return typeof s=="string"?s:{method:"GET",path:`/api/projects/workflows/${s}`,accept:t?"application/json":"text/html",json:t}}if(r==="remove"||r==="enable"||r==="disable"){if(n.length!==1)return`usage: lmctl api project workflow ${r} <id>`;let s=ne(n[0],"id");if(typeof s=="string")return s;let i=r==="remove"?"DELETE":"POST",o=r==="remove"?"":`/${r}`;return{method:i,path:`/api/projects/workflows/${s}${o}`,accept:"application/json",json:t}}if(r==="add"){let s=lA(n);return typeof s=="string"?s:{method:"POST",path:`/api/projects/${encodeURIComponent(s.project)}/workflows`,accept:"application/json",json:t,body:JSON.stringify(s.body)}}return"usage: lmctl api project workflow <add|list|show|remove|enable|disable>"}function lA(e){let[t,r,...n]=e;if(t===void 0||r===void 0)return"usage: lmctl api project workflow add <project> <workflow> [--condition JEXL] [--params JSON] [--priority N]";let s={workflow:r};for(let i=0;i<n.length;i+=1){let o=n[i],a=n[++i];if(a===void 0||a.startsWith("--"))return`missing value for ${o}`;if(o==="--condition")s.condition=a;else if(o==="--params")s.params=Nc(a);else if(o==="--priority"){let l=Number(a);if(!Number.isInteger(l))return`invalid --priority: ${a}`;s.priority=l}else return re(o)}return{project:t,body:s}}function cA(e,t){if(e[0]!=="get")return"usage: lmctl api artifact get --run R --kind K [--raw]";let r,n,s=!1;for(let o=1;o<e.length;o+=1){let a=e[o];if(a==="--raw"){s=!0;continue}let l=e[++o];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--run"){let c=ne(l,"run");if(typeof c=="string")return c;r=c}else if(a==="--kind")n=l;else return re(a)}return r===void 0||n===void 0?"usage: lmctl api artifact get --run R --kind K [--raw]":{method:"GET",path:`/api/runs/${r}/artifacts/${encodeURIComponent(n)}${s?"?raw=true":""}`,accept:s?"text/plain":"application/json",json:!s&&t}}function dA(e,t){if(e[0]!=="ack"||e.length!==2)return"usage: lmctl api attention ack <id>";let r=ne(e[1],"id");return typeof r=="string"?r:{method:"POST",path:`/api/attentions/${r}/ack`,accept:t?"application/json":"text/html",json:t}}function uA(e,t){return e.length!==1||e[0]!=="run-throughput"?"usage: lmctl api stats run-throughput":{method:"GET",path:"/api/stats/run-throughput",accept:t?"application/json":"text/html",json:t}}function fA(e,t){return e.length!==1||e[0]!=="state"&&e[0]!=="cycle"?"usage: lmctl api daemon <state|cycle>":{method:e[0]==="cycle"?"POST":"GET",path:e[0]==="cycle"?"/api/daemon/cycle":"/api/daemon/state",accept:t?"application/json":"text/html",json:t}}function mA(e,t){return e.length!==1||e[0]!=="state"&&e[0]!=="scan"?"usage: lmctl api intake <state|scan>":{method:e[0]==="scan"?"POST":"GET",path:e[0]==="scan"?"/api/intake/scan":"/api/intake/state",accept:t?"application/json":"text/html",json:t}}function pA(e,t){let r=e[0];if(r==="list")return e.length!==1?"usage: lmctl api session list":{method:"GET",path:"/api/sessions",accept:t?"application/json":"text/html",json:t};if(r==="history"||r==="compact"||r==="refresh"){if(e.length!==3)return`usage: lmctl api session ${r} <team_name> <alias>`;let n=Ci(e[1]),s=encodeURIComponent(e[2]);return{method:r==="history"?"GET":"POST",path:`/api/sessions/${n}/${s}/${r}`,accept:t?"application/json":"text/html",json:t}}return"usage: lmctl api session <list|history|compact|refresh>"}function _A(e,t){let[r,n,s,i]=e;if(r!==void 0&&/^\d+$/.test(r)&&n===void 0){let o=ne(r,"run_id");return typeof o=="string"?o:{method:"GET",path:`/api/runs/${o}`,accept:"application/json",json:t!=="text"}}if(r==="resume"){if(n===void 0)return"usage: lmctl api run resume <run_id> --outcome <value>";let o=ne(n,"run_id");if(typeof o=="string")return o;let a;for(let l=2;l<e.length;l+=1){let c=e[l];if(c!=="--outcome")return re(c);let d=e[++l];if(d===void 0||d.startsWith("--"))return"missing value for --outcome";a=d}return a===void 0?"missing value for --outcome":{method:"POST",path:`/api/runs/${o}/resume?outcome=${encodeURIComponent(a)}`,accept:t==="text"?"text/html":"application/json",json:t!=="text"}}if(r==="get"){if(n===void 0||s!==void 0)return"usage: lmctl api run get <run_id>";let o=ne(n,"run_id");return typeof o=="string"?o:{method:"GET",path:`/api/runs/${o}`,accept:"application/json",json:t!=="text"}}if(r==="step"||r==="transcript"||r==="messages"){if(n===void 0||s===void 0||i!==void 0)return`usage: lmctl api run ${r} <run_id> <step_id>`;let o=ne(n,"run_id");if(typeof o=="string")return o;let a=ne(s,"step_id");if(typeof a=="string")return a;let l=r==="step"?"":`/${r}`,c=r==="transcript"&&t==="text";return{method:"GET",path:`/api/runs/${o}/steps/${a}${l}`,accept:c?"text/plain":"application/json",json:!c}}if(r==="artifacts"){if(n===void 0)return"usage: lmctl api run artifacts <run_id> [--kind K]";let o=ne(n,"run_id");if(typeof o=="string")return o;let a;for(let c=2;c<e.length;c+=1){let d=e[c];if(d!=="--kind")return re(d);let u=e[++c];if(u===void 0)return"missing value for --kind";a=u}let l=a===void 0?"":`?kind=${encodeURIComponent(a)}`;return{method:"GET",path:`/api/runs/${o}/artifacts${l}`,accept:"application/json",json:t!=="text"}}if(r==="where"){if(n===void 0||s!==void 0)return"usage: lmctl api run where <run_id>";let o=ne(n,"run_id");return typeof o=="string"?o:{method:"GET",path:`/api/runs/${o}/where`,accept:t==="text"?"text/plain":"application/json",json:t!=="text"}}if(r==="timeline"){if(n===void 0||s!==void 0)return"usage: lmctl api run timeline <run_id>";let o=ne(n,"run_id");return typeof o=="string"?o:{method:"GET",path:`/api/runs/${o}/timeline`,accept:t==="text"?"text/plain":"application/json",json:t!=="text"}}return"usage: lmctl api run <id|get|step|transcript|messages|resume|artifacts|where|timeline>"}function ne(e,t){return e===void 0||e.startsWith("--")?`missing value for ${t}`:!/^\d+$/.test(e)||Number(e)<=0?`invalid ${t}: ${e}`:Number(e)}function re(e){return e.startsWith("--")?`unknown flag: ${e}`:`unknown argument: ${e}`}function H_(e,t){let r=[],n=!1;for(let s of e){if(s===t){n=!0;continue}r.push(s)}return{rest:r,present:n}}async function hA(e,t){let r=P_(e);if(typeof r=="string")return t.stderr.write(`error: ${r}
1635
+ `),0}function L_(e,t,r){return e!=="api.token"||r?t:t.length<=8?"***":`${t.slice(0,8)}\u2026(masked; use --show-secrets to reveal)`}function Vx(e,t){if(t.length===0)return`${e} value must be non-empty`;if(e==="api.port"){let r=Number(t);if(!Number.isInteger(r)||r<=0||r>65535)return`invalid api.port: ${t}`}if(e==="api.url")try{new URL(t)}catch{return`invalid api.url: ${t}`}if(e===ji||e===Di){let r=Number(t);if(!Number.isInteger(r)||r<=0)return`invalid ${e}: ${t}`}return null}function Kx(e,t){let r=Ax(e),n=r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength),s=new FormData;return s.append("image",new Blob([n],{type:Yx(e)}),Rx(e)),t!==void 0&&s.append("project",t),s}function Yx(e){switch(Lx(e).toLowerCase()){case".png":return"image/png";case".jpg":case".jpeg":return"image/jpeg";case".webp":return"image/webp";case".heic":return"image/heic";case".pdf":return"application/pdf";default:return"application/octet-stream"}}function zx(e){if(e!==null&&typeof e=="object"&&!Array.isArray(e)){let t=e.id;return typeof t=="number"&&Number.isInteger(t)?t:null}return null}function Zx(e,t){let[r,...n]=e;if(r===void 0)return"usage: lmctl api pr <id|list|get>";if(r==="list")return os(n,"--status","/api/submitted-prs","status",t);if(r==="get"){let[s]=n;return s===void 0?"usage: api pr get <id-or-url>":/^\d+$/.test(s)?{method:"GET",path:`/api/submitted-prs/${s}`,accept:"application/json",json:t}:{method:"GET",path:`/api/submitted-prs?pr_url=${encodeURIComponent(s)}`,accept:"application/json",json:t}}return/^\d+$/.test(r)?{method:"GET",path:`/api/submitted-prs/${r}`,accept:"application/json",json:t}:`usage: lmctl api pr <id|list|get>; got: ${r}`}function P_(e){let t=[],r="json";for(let n of e)n==="--json"?r="json":n==="--text"?r="text":t.push(n);return{args:t,format:r}}function Ki(e,t,r){return e.length>0?re(e[0]):{method:"GET",path:t,accept:r?"application/json":"text/html",json:r}}function os(e,t,r,n,s,i=!1){let o;for(let l=0;l<e.length;l+=1){let c=e[l];if(c!==t)return re(c);let d=e[++l];if(d===void 0||d.startsWith("--"))return`missing value for ${t}`;if(i&&(!/^\d+$/.test(d)||Number(d)<=0))return`invalid ${t}: ${d}`;o=d}let a=o===void 0?"":`?${n}=${encodeURIComponent(o)}`;return{method:"GET",path:`${r}${a}`,accept:s?"application/json":"text/html",json:s}}function O_(e,t,r,n,s){let i=!1;for(let o of e){if(o!==t)return re(o);i=!0}return{method:"GET",path:`${r}${i?`?${n}=true`:""}`,accept:s?"application/json":"text/html",json:s}}function Qx(e,t,r){if(e.length!==1)return`usage: lmctl api ${r} <id>`;let n=ne(e[0],"id");return typeof n=="string"?n:{method:"GET",path:`${t}/${n}`,accept:"application/json",json:!0}}function eA(e,t){let[r,...n]=e;if(r!==void 0&&n.length===0&&r!=="enqueue"&&r!=="run")return Qx([r],"/api/jobs","job");if(r==="enqueue"){let s,i,o="manual",a,l,c;for(let u=0;u<n.length;u+=1){let f=n[u],m=n[++u];if(m===void 0||m.startsWith("--"))return`missing value for ${f}`;if(f==="--project")s=m;else if(f==="--project-id"){let p=Number(m);if(!Number.isInteger(p))return`invalid --project-id: ${m}`;i=p}else if(f==="--source")o=m;else if(f==="--payload")a=m;else if(f==="--dedupe-key")l=m;else if(f==="--priority"){let p=Number(m);if(!Number.isInteger(p))return`invalid --priority: ${m}`;c=p}else return re(f)}if(s===void 0&&i===void 0)return"usage: lmctl api job enqueue (--project NAME | --project-id ID) [--source S] [--payload JSON] [--dedupe-key K] [--priority N]";let d={source:o};return s!==void 0&&(d.project=s),i!==void 0&&(d.project_id=i),a!==void 0&&(d.payload=Ic(a)),l!==void 0&&(d.dedupe_key=l),c!==void 0&&(d.priority=c),{method:"POST",path:"/api/jobs",accept:"application/json",json:t,body:JSON.stringify(d)}}if(r==="run"){if(n.length!==1)return"usage: lmctl api job run <id>";let s=ne(n[0],"id");return typeof s=="string"?s:{method:"POST",path:`/api/jobs/${s}/run`,accept:"application/json",json:t}}return"usage: lmctl api job <id|enqueue|run>"}function tA(e,t){let[r,...n]=e;if(r==="list"){let[s,...i]=n;if(s===void 0||s.startsWith("--"))return"usage: lmctl api issues list <project> [--status STATUS] [--severity SEVERITY] [--ai-test-path P]";let o=new URLSearchParams;for(let l=0;l<i.length;l+=1){let c=i[l],d=i[++l];if(d===void 0||d.startsWith("--"))return`missing value for ${c}`;if(c==="--status")o.set("status",d);else if(c==="--severity")o.set("severity",d);else if(c==="--ai-test-path")o.set("ai_test_path",d);else return re(c)}let a=o.toString();return{method:"GET",path:`/api/projects/${encodeURIComponent(s)}/issues${a.length>0?`?${a}`:""}`,accept:t?"application/json":"text/html",json:t}}if(r==="show"){if(n.length!==1)return"usage: lmctl api issues show <id>";let s=ne(n[0],"id");return typeof s=="string"?s:{method:"GET",path:`/api/issues/${s}`,accept:"application/json",json:t}}return r==="create"?F_(n,t):r==="claim"?U_(n,t):r==="claim-next"?W_(n,t):r==="close"?B_(n,t):r==="reopen"?q_(n,t):"usage: lmctl api issues <list|show|create|claim|claim-next|close|reopen>"}function F_(e,t){let[r,...n]=e;if(r===void 0||r.startsWith("--"))return"usage: lmctl api issues create <project> --title T --body B [--severity S] [--labels JSON] [--ai-test-path P]";let s=new Set(["--title","--body"]),i={};for(let o=0;o<n.length;o+=1){let a=n[o],l=n[++o];if(l===void 0)return`missing value for ${a}`;if(!s.has(a)&&l.startsWith("--"))return`missing value for ${a}`;if(a==="--title")i.title=l;else if(a==="--body")i.body=l;else if(a==="--severity")i.severity=l;else if(a==="--labels")i.labels=Ic(l);else if(a==="--ai-test-path")i.ai_test_path=l;else if(a==="--source-run-id"){let c=ne(l,"--source-run-id");if(typeof c=="string")return c;i.source_run_id=c}else return re(a)}return typeof i.title!="string"?"missing value for --title":typeof i.body!="string"?"missing value for --body":{method:"POST",path:`/api/projects/${encodeURIComponent(r)}/issues`,accept:"application/json",json:t,body:JSON.stringify(i)}}function U_(e,t){let[r,...n]=e;if(r===void 0)return"usage: lmctl api issues claim <id> --assigned-run-id RUN";let s=ne(r,"id");if(typeof s=="string")return s;let i={};for(let o=0;o<n.length;o+=1){let a=n[o],l=n[++o];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--assigned-run-id"){let c=ne(l,"--assigned-run-id");if(typeof c=="string")return c;i.assigned_run_id=c}else return re(a)}return typeof i.assigned_run_id!="number"?"missing value for --assigned-run-id":{method:"POST",path:`/api/issues/${s}/claim`,accept:"application/json",json:t,body:JSON.stringify(i)}}function W_(e,t){let[r,...n]=e;if(r===void 0||r.startsWith("--"))return"usage: lmctl api issues claim-next <project> --assigned-run-id RUN";let s={};for(let i=0;i<n.length;i+=1){let o=n[i],a=n[++i];if(a===void 0||a.startsWith("--"))return`missing value for ${o}`;if(o==="--assigned-run-id"){let l=ne(a,"--assigned-run-id");if(typeof l=="string")return l;s.assigned_run_id=l}else return re(o)}return typeof s.assigned_run_id!="number"?"missing value for --assigned-run-id":{method:"POST",path:`/api/projects/${encodeURIComponent(r)}/issues/claim-next`,accept:"application/json",json:t,body:JSON.stringify(s)}}function B_(e,t){let[r,...n]=e;if(r===void 0)return"usage: lmctl api issues close <id> [--commit-hash SHA] [--closed-run-id RUN]";let s=ne(r,"id");if(typeof s=="string")return s;let i={};for(let o=0;o<n.length;o+=1){let a=n[o],l=n[++o];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--commit-hash")i.commit_hash=l;else if(a==="--closed-run-id"){let c=ne(l,"--closed-run-id");if(typeof c=="string")return c;i.closed_run_id=c}else return re(a)}return{method:"POST",path:`/api/issues/${s}/close`,accept:"application/json",json:t,body:JSON.stringify(i)}}function q_(e,t){let[r,...n]=e;if(r===void 0)return"usage: lmctl api issues reopen <id> [--source-run-id RUN]";let s=ne(r,"id");if(typeof s=="string")return s;let i={};for(let o=0;o<n.length;o+=1){let a=n[o],l=n[++o];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--source-run-id"){let c=ne(l,"--source-run-id");if(typeof c=="string")return c;i.source_run_id=c}else return re(a)}return{method:"POST",path:`/api/issues/${s}/reopen`,accept:"application/json",json:t,body:JSON.stringify(i)}}function rA(e,t){let[r,...n]=e;if(r===void 0||r.startsWith("--"))return"usage: lmctl api upload <file> [--project NAME] [--json]";let s;for(let i=0;i<n.length;i+=1){let o=n[i];if(o!=="--project")return re(o);let a=n[++i];if(a===void 0||a.startsWith("--"))return"missing value for --project";s=a}return{method:"POST",path:"/api/uploads",accept:"application/json",json:t,upload:{filePath:r,project:s}}}function nA(e,t){let r,n,s,i;for(let a=0;a<e.length;a+=1){let l=e[a],c=e[++a];if(c===void 0||c.startsWith("--"))return`missing value for ${l}`;if(l==="--workflow")r=c;else if(l==="--workflow-id-override"){let d=Number(c);if(!Number.isInteger(d)||d<=0)return`invalid --workflow-id-override: ${c}`;n=d}else if(l==="--project")s=c;else if(l==="--inputs")try{let d=JSON.parse(c);if(d===null||typeof d!="object"||Array.isArray(d))return"--inputs must be a JSON object";i=d}catch{return"invalid --inputs JSON"}else return re(l)}if(r===void 0&&n===void 0)return"missing value for --workflow";if(i===void 0)return"missing value for --inputs";let o={source:"api-submit-job",payload:i};return r!==void 0&&(o.workflow=r),n!==void 0&&(o.workflow_id_override=n),s!==void 0&&(o.project=s),{method:"POST",path:"/api/jobs",accept:"application/json",json:t,body:JSON.stringify(o),runAfterSubmit:!0}}function Ic(e){try{return JSON.parse(e)}catch{return e}}function sA(e,t){let[r,n]=e;return r!=="show"||n===void 0||e.length!==2?"usage: lmctl api workflow show <name>":{method:"GET",path:`/api/workflows/${encodeURIComponent(n)}`,accept:"application/json",json:t}}function iA(e,t){for(let r of e)if(!(r==="--json"||r==="--text"))return re(r);return{method:"GET",path:"/api/workflows/verify",accept:t==="text"?"text/plain":"application/json",json:t!=="text"}}function oA(e,t){let[r,n,...s]=e;return r==="workflow"?aA([n,...s].filter(i=>i!==void 0),t):r!=="show"||n===void 0||e.length!==2?"usage: lmctl api project <show|workflow>":{method:"GET",path:`/api/projects/${encodeURIComponent(n)}`,accept:"application/json",json:t}}function aA(e,t){let[r,...n]=e;if(r==="list")return n.length!==1?"usage: lmctl api project workflow list <project>":{method:"GET",path:`/api/projects/${encodeURIComponent(n[0])}/workflows`,accept:t?"application/json":"text/html",json:t};if(r==="show"){if(n.length!==1)return"usage: lmctl api project workflow show <id>";let s=ne(n[0],"id");return typeof s=="string"?s:{method:"GET",path:`/api/projects/workflows/${s}`,accept:t?"application/json":"text/html",json:t}}if(r==="remove"||r==="enable"||r==="disable"){if(n.length!==1)return`usage: lmctl api project workflow ${r} <id>`;let s=ne(n[0],"id");if(typeof s=="string")return s;let i=r==="remove"?"DELETE":"POST",o=r==="remove"?"":`/${r}`;return{method:i,path:`/api/projects/workflows/${s}${o}`,accept:"application/json",json:t}}if(r==="add"){let s=lA(n);return typeof s=="string"?s:{method:"POST",path:`/api/projects/${encodeURIComponent(s.project)}/workflows`,accept:"application/json",json:t,body:JSON.stringify(s.body)}}return"usage: lmctl api project workflow <add|list|show|remove|enable|disable>"}function lA(e){let[t,r,...n]=e;if(t===void 0||r===void 0)return"usage: lmctl api project workflow add <project> <workflow> [--condition JEXL] [--params JSON] [--priority N]";let s={workflow:r};for(let i=0;i<n.length;i+=1){let o=n[i],a=n[++i];if(a===void 0||a.startsWith("--"))return`missing value for ${o}`;if(o==="--condition")s.condition=a;else if(o==="--params")s.params=Ic(a);else if(o==="--priority"){let l=Number(a);if(!Number.isInteger(l))return`invalid --priority: ${a}`;s.priority=l}else return re(o)}return{project:t,body:s}}function cA(e,t){if(e[0]!=="get")return"usage: lmctl api artifact get --run R --kind K [--raw]";let r,n,s=!1;for(let o=1;o<e.length;o+=1){let a=e[o];if(a==="--raw"){s=!0;continue}let l=e[++o];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--run"){let c=ne(l,"run");if(typeof c=="string")return c;r=c}else if(a==="--kind")n=l;else return re(a)}return r===void 0||n===void 0?"usage: lmctl api artifact get --run R --kind K [--raw]":{method:"GET",path:`/api/runs/${r}/artifacts/${encodeURIComponent(n)}${s?"?raw=true":""}`,accept:s?"text/plain":"application/json",json:!s&&t}}function dA(e,t){if(e[0]!=="ack"||e.length!==2)return"usage: lmctl api attention ack <id>";let r=ne(e[1],"id");return typeof r=="string"?r:{method:"POST",path:`/api/attentions/${r}/ack`,accept:t?"application/json":"text/html",json:t}}function uA(e,t){return e.length!==1||e[0]!=="run-throughput"?"usage: lmctl api stats run-throughput":{method:"GET",path:"/api/stats/run-throughput",accept:t?"application/json":"text/html",json:t}}function fA(e,t){return e.length!==1||e[0]!=="state"&&e[0]!=="cycle"?"usage: lmctl api daemon <state|cycle>":{method:e[0]==="cycle"?"POST":"GET",path:e[0]==="cycle"?"/api/daemon/cycle":"/api/daemon/state",accept:t?"application/json":"text/html",json:t}}function mA(e,t){return e.length!==1||e[0]!=="state"&&e[0]!=="scan"?"usage: lmctl api intake <state|scan>":{method:e[0]==="scan"?"POST":"GET",path:e[0]==="scan"?"/api/intake/scan":"/api/intake/state",accept:t?"application/json":"text/html",json:t}}function pA(e,t){let r=e[0];if(r==="list")return e.length!==1?"usage: lmctl api session list":{method:"GET",path:"/api/sessions",accept:t?"application/json":"text/html",json:t};if(r==="history"||r==="compact"||r==="refresh"){if(e.length!==3)return`usage: lmctl api session ${r} <team_name> <alias>`;let n=Ci(e[1]),s=encodeURIComponent(e[2]);return{method:r==="history"?"GET":"POST",path:`/api/sessions/${n}/${s}/${r}`,accept:t?"application/json":"text/html",json:t}}return"usage: lmctl api session <list|history|compact|refresh>"}function _A(e,t){let[r,n,s,i]=e;if(r!==void 0&&/^\d+$/.test(r)&&n===void 0){let o=ne(r,"run_id");return typeof o=="string"?o:{method:"GET",path:`/api/runs/${o}`,accept:"application/json",json:t!=="text"}}if(r==="resume"){if(n===void 0)return"usage: lmctl api run resume <run_id> --outcome <value>";let o=ne(n,"run_id");if(typeof o=="string")return o;let a;for(let l=2;l<e.length;l+=1){let c=e[l];if(c!=="--outcome")return re(c);let d=e[++l];if(d===void 0||d.startsWith("--"))return"missing value for --outcome";a=d}return a===void 0?"missing value for --outcome":{method:"POST",path:`/api/runs/${o}/resume?outcome=${encodeURIComponent(a)}`,accept:t==="text"?"text/html":"application/json",json:t!=="text"}}if(r==="get"){if(n===void 0||s!==void 0)return"usage: lmctl api run get <run_id>";let o=ne(n,"run_id");return typeof o=="string"?o:{method:"GET",path:`/api/runs/${o}`,accept:"application/json",json:t!=="text"}}if(r==="step"||r==="transcript"||r==="messages"){if(n===void 0||s===void 0||i!==void 0)return`usage: lmctl api run ${r} <run_id> <step_id>`;let o=ne(n,"run_id");if(typeof o=="string")return o;let a=ne(s,"step_id");if(typeof a=="string")return a;let l=r==="step"?"":`/${r}`,c=r==="transcript"&&t==="text";return{method:"GET",path:`/api/runs/${o}/steps/${a}${l}`,accept:c?"text/plain":"application/json",json:!c}}if(r==="artifacts"){if(n===void 0)return"usage: lmctl api run artifacts <run_id> [--kind K]";let o=ne(n,"run_id");if(typeof o=="string")return o;let a;for(let c=2;c<e.length;c+=1){let d=e[c];if(d!=="--kind")return re(d);let u=e[++c];if(u===void 0)return"missing value for --kind";a=u}let l=a===void 0?"":`?kind=${encodeURIComponent(a)}`;return{method:"GET",path:`/api/runs/${o}/artifacts${l}`,accept:"application/json",json:t!=="text"}}if(r==="where"){if(n===void 0||s!==void 0)return"usage: lmctl api run where <run_id>";let o=ne(n,"run_id");return typeof o=="string"?o:{method:"GET",path:`/api/runs/${o}/where`,accept:t==="text"?"text/plain":"application/json",json:t!=="text"}}if(r==="timeline"){if(n===void 0||s!==void 0)return"usage: lmctl api run timeline <run_id>";let o=ne(n,"run_id");return typeof o=="string"?o:{method:"GET",path:`/api/runs/${o}/timeline`,accept:t==="text"?"text/plain":"application/json",json:t!=="text"}}return"usage: lmctl api run <id|get|step|transcript|messages|resume|artifacts|where|timeline>"}function ne(e,t){return e===void 0||e.startsWith("--")?`missing value for ${t}`:!/^\d+$/.test(e)||Number(e)<=0?`invalid ${t}: ${e}`:Number(e)}function re(e){return e.startsWith("--")?`unknown flag: ${e}`:`unknown argument: ${e}`}function H_(e,t){let r=[],n=!1;for(let s of e){if(s===t){n=!0;continue}r.push(s)}return{rest:r,present:n}}async function hA(e,t){let r=P_(e);if(typeof r=="string")return t.stderr.write(`error: ${r}
1636
1636
  `),2;let n=r.args,s=r.format!=="text",[i,...o]=n;if(i===void 0)return t.stderr.write(`error: --direct requires a subcommand (issues|status|projects|workflows|runs|attentions)
1637
1637
  `),2;let a=t.dal===void 0,l=t.dal??Ie({path:le()});try{if(i==="issues"){let[c,...d]=o;return c===void 0?(t.stderr.write(`error: --direct issues requires a subcommand (list|show|create|claim|claim-next|close|reopen)
1638
1638
  `),2):c==="create"?gA(l,d,t,s):c==="claim"?yA(l,d,t,s):c==="claim-next"?wA(l,d,t,s):c==="close"?EA(l,d,t,s):c==="reopen"?TA(l,d,t,s):c==="list"?kA(l,d,t,s):c==="show"?IA(l,d,t,s):(t.stderr.write(`error: --direct does not support: issues ${c} (supported: list, show, create, claim, claim-next, close, reopen)
@@ -1719,7 +1719,7 @@ ${r}`:r}function pp(e,t){let r=C0[t.tool];return r?new Promise((n,s)=>{let i=t.b
1719
1719
  `),2;let d=e.resumeInteractive(l.step_id,a,s);if(!d.resumed)return r.stderr.write(`error: interactive respond failed: ${d.reason} (step_id=${l.step_id})
1720
1720
  `),2;let u=e.acknowledgeAttention(o),f={ok:!0,attention_id:o,step_id:l.step_id,session_status:d.session.status,acknowledged_at:u?.acknowledged_at??null};return n?r.stdout.write(`${JSON.stringify(f,null,2)}
1721
1721
  `):r.stdout.write(`ok: attention ${o} acknowledged; step ${l.step_id} resumed (session_status=${f.session_status})
1722
- `),0}function $_(e,t){let r=e.split(",").map(n=>n.trim()).filter(n=>n.length>0);if(r.length===0)return`invalid value: ${e}`;for(let n of r)if(!t.includes(n))return`invalid value: ${n}`;return r}var Ox,$x,C_,Vi,Px,Fx,Ux,Wx,vA,G_=T(()=>{"use strict";Ze();Je();Mi();Ec();Jt();Ox="http://127.0.0.1:8787",$x=`usage: lmctl api [--direct] <subcommand> ...
1722
+ `),0}function $_(e,t){let r=e.split(",").map(n=>n.trim()).filter(n=>n.length>0);if(r.length===0)return`invalid value: ${e}`;for(let n of r)if(!t.includes(n))return`invalid value: ${n}`;return r}var Ox,$x,C_,Vi,Px,Fx,Ux,Wx,vA,G_=T(()=>{"use strict";Ze();Je();Mi();wc();Jt();Ox="http://127.0.0.1:8787",$x=`usage: lmctl api [--direct] <subcommand> ...
1723
1723
 
1724
1724
  Call the lmctl HTTP API using the configured daemon URL/token. Some
1725
1725
  workflow shellstep-safe commands also support --direct to use the local DAL
@@ -1749,27 +1749,27 @@ without an HTTP round trip.
1749
1749
 
1750
1750
  Verify every workflows/*.compound.json file: load/validate the workflow graph
1751
1751
  and report the first step that would be started. Default output is the TTY
1752
- table; --json emits the structured WorkflowVerifyReport payload.`;vA=["open","assigned","closed","reopened"]});import V_ from"jexl";function an(e){V_.compile(K_(e))}async function $r(e,t){return V_.eval(K_(e),t)}function K_(e){return e.replace(/([A-Za-z_$][\w$.[\]]*)\.includes\(([^()]+)\)/g,"($2 in $1)")}var as=T(()=>{"use strict"});import{z as E}from"zod";function Cc(e){let t=e.trim();return t.startsWith("={{")&&t.endsWith("}}")?t.slice(3,-2).trim():e}var PA,Y_,xc,Ac,Rc,Lc,Oc,$c,z_,FA,UA,WA,ls,BA,zi,Zi,Qi,eo,to,Z_,qA,HA,JA,XA,ro,ln=T(()=>{"use strict";as();PA=E.object({kind:E.enum(["success","neutral","failure"])}),Y_=E.enum(["string","number","boolean","object","array"]),xc=E.object({name:E.string().min(1),type:Y_,required:E.boolean().optional(),default:E.unknown().optional(),description:E.string().optional()}),Ac=E.object({name:E.string().min(1),type:Y_,source_step_id:E.string().min(1),source_field:E.string().min(1),description:E.string().optional()}),Rc=E.object({id:E.string().min(1),type:E.string().min(1),parameters:E.record(E.string(),E.unknown()).default({})}),Lc="__failure__",Oc=E.object({tools:E.array(E.string().min(1)).optional(),auth:E.array(E.string().min(1)).optional()}).strict().optional(),$c=E.object({on_unhandled_failure:E.object({attention_kind:E.string().min(1).default("workflow_failed"),severity:E.enum(["warn","error","critical"]).default("warn"),capture_evidence:E.boolean().default(!0),recommend_recovery:E.string().min(1).optional()}).optional(),on_unhandled_failure_state:E.string().min(1).optional()}).optional(),z_=E.object({type:E.literal("AssertRepoClean"),fail_message:E.string().min(1).optional(),next:E.string().min(1)}),FA=E.object({name:E.string().min(1),command:E.string().min(1).optional(),args:E.array(E.string()).optional(),env:E.record(E.string(),E.string()).optional(),type:E.enum(["stdio","http","sse"]).optional(),url:E.string().min(1).optional(),headers:E.record(E.string(),E.string()).optional()}).strict(),UA=E.union([E.string().min(1),FA]),WA=E.union([E.string().min(1),E.object({name:E.string().min(1),content:E.string().min(1)}).strict()]),ls=E.object({team:E.string().min(1),alias:E.string().min(1),prompt_template:E.string().optional(),mcp:E.array(UA).optional(),skills:E.array(WA).optional()}),BA=E.object({kind:E.literal("shell"),command:E.string().min(1),description:E.string().optional()}),zi=E.object({type:E.literal("Review"),state_name:E.string().min(1),coder:ls,pre_checks:E.array(BA).optional(),reviewers:E.array(ls.extend({rubric_artifact:E.string().optional()})).optional(),outcomes:E.object({approve:E.string().min(1),request_changes:E.string().optional(),fail_pre_check:E.string().optional(),max_loops_exceeded:E.string().optional()}),writes_to_project_path:E.boolean().optional(),durable_memory_tags:E.array(E.string().min(1)).optional(),write_back_durable_memory:E.union([E.boolean(),E.string().min(1)]).optional(),max_loops:E.number().int().positive().default(5),loop_feedback_artifact:E.string().optional(),outcomes_from_stance:E.record(E.string(),E.string().min(1)).optional()}).superRefine((e,t)=>{(e.reviewers??[]).length>0&&e.outcomes_from_stance!==void 0&&t.addIssue({code:"custom",path:["outcomes_from_stance"],message:"outcomes_from_stance cannot be used when reviewers is non-empty"})}),Zi=E.object({type:E.literal("Consolidate"),state_name:E.string().min(1),researchers:E.array(ls.extend({topic:E.string().min(1)})).optional(),consolidator:ls,outcomes:E.object({ok:E.string().min(1),error:E.string().optional()}),research_artifact_prefix:E.string().optional(),durable_memory_tags:E.array(E.string().min(1)).optional(),write_back_durable_memory:E.union([E.boolean(),E.string().min(1)]).optional()}),Qi=E.object({type:E.literal("Interactive"),state_name:E.string().min(1),agent:ls.extend({initial_prompt_template:E.string().min(1)}),termination:E.object({operator_signal:E.boolean().default(!0),agent_signal:E.string().optional(),max_turns:E.number().int().positive().default(20),timeout_seconds:E.number().int().positive().optional()}),outcomes:E.object({done:E.string().min(1),timeout:E.string().optional()}),artifact_name:E.string().optional(),durable_memory_tags:E.array(E.string().min(1)).optional(),write_back_durable_memory:E.union([E.boolean(),E.string().min(1)]).optional()}),eo=E.object({type:E.literal("Loop"),state_name:E.string().min(1),over:E.string().min(1),item_var:E.string().min(1),body:E.string().min(1),outcomes:E.object({ok:E.string().min(1),error:E.string().optional()}),stop_on_error:E.boolean().default(!0),max_items:E.number().int().positive().default(1e3)}),to=E.object({type:E.literal("ShellStep"),state_name:E.string().min(1),command:E.string().min(1),outcomes_from_exit:E.record(E.string(),E.string().min(1)),timeout_ms:E.number().int().nonnegative().optional(),capture_output_to:E.string().optional(),writes_to_project_path:E.boolean().optional()}),Z_=E.object({type:E.literal("Choice"),state_name:E.string().min(1),branches:E.array(E.object({when:E.string().min(1),next:E.string().min(1)})).default([]),default_next:E.string().min(1).optional()}).superRefine((e,t)=>{for(let[r,n]of e.branches.entries())try{an(Cc(n.when))}catch(s){let i=s instanceof Error?s.message:"invalid expression";t.addIssue({code:"custom",path:["branches",r,"when"],message:`invalid jexl expression: ${i}`})}}),qA=E.discriminatedUnion("type",[z_,zi,Zi,Qi,eo,to,Z_]),HA=E.object({type:E.literal("ForEach"),state_name:E.string().min(1),items_from:E.string().min(1),mode:E.enum(["sequential","parallel"]).default("sequential"),max_concurrency:E.number().int().positive().default(1),on_item_failure:E.enum(["continue","stop"]).default("stop"),body:qA,outcomes:E.object({all_ok:E.string().min(1),any_failed:E.string().optional()})}).superRefine((e,t)=>{try{an(Cc(e.items_from))}catch(r){let n=r instanceof Error?r.message:"invalid expression";t.addIssue({code:"custom",path:["items_from"],message:`invalid jexl expression: ${n}`})}}),JA=E.object({type:E.literal("Subflow"),state_name:E.string().min(1),workflow_name:E.string().min(1),inputs:E.record(E.string(),E.string().min(1)).optional(),outcomes:E.record(E.string(),E.string().min(1))}).superRefine((e,t)=>{for(let[r,n]of Object.entries(e.inputs??{}))try{an(Cc(n))}catch(s){let i=s instanceof Error?s.message:"invalid expression";t.addIssue({code:"custom",path:["inputs",r],message:`invalid jexl expression: ${i}`})}}),XA=E.discriminatedUnion("type",[z_,zi,Zi,Qi,eo,to,Z_,HA,JA]),ro=E.object({name:E.string().min(1),version:E.number().int().positive(),definition_schema_version:E.union([E.literal(1),E.literal(2)]),description:E.string().optional(),estimated_duration_ms:E.number().int().nonnegative().optional(),primitive_version:E.union([E.literal(1),E.literal(2)]).default(1),start_at:E.string().min(1),states:E.record(E.string().min(1),XA),terminals:E.record(E.string().min(1),PA),errors:$c,concurrency_key:E.string().min(1).optional(),concurrent_limit:E.number().int().positive().optional(),default_task_timeout_ms:E.number().int().positive().max(216e5).optional(),inputs:E.array(xc).optional(),outputs:E.array(Ac).optional(),triggers:E.array(Rc).optional(),read_only:E.boolean().optional(),requires:Oc}).superRefine((e,t)=>{e.definition_schema_version===1&&e.errors!==void 0&&t.addIssue({code:"custom",path:["errors"],message:"errors block requires definition_schema_version: 2"}),e.definition_schema_version===1&&e.concurrency_key!==void 0&&t.addIssue({code:"custom",path:["concurrency_key"],message:"concurrency_key requires definition_schema_version: 2"}),e.definition_schema_version===1&&e.default_task_timeout_ms!==void 0&&t.addIssue({code:"custom",path:["default_task_timeout_ms"],message:"default_task_timeout_ms requires definition_schema_version: 2"})})});import{z as K}from"zod";var GA,no,VA,KA,YA,It,cn=T(()=>{"use strict";ln();GA=/^s-[a-z0-9-]+-[a-f0-9]{4}$/,no=K.string().regex(GA),VA=K.object({step_id:no,type:K.literal("main"),index:K.number().int().min(0)}),KA=K.record(no,K.record(K.string().min(1),K.array(K.array(VA)))),YA=K.object({id:no,name:K.string().min(1),type:K.string().min(1),typeVersion:K.number().int().positive().default(1),parameters:K.record(K.string(),K.unknown()).default({}),members:K.record(K.string(),K.unknown()).optional(),estimated_duration_ms:K.number().int().nonnegative().optional()}),It=K.object({schema_version:K.literal("lmctl/v3"),definition_schema_version:K.literal(3),name:K.string().min(1),version:K.number().int().positive(),description:K.string().optional(),estimated_duration_ms:K.number().int().nonnegative().optional(),default_task_timeout_ms:K.number().int().positive().max(216e5).optional(),concurrency_key:K.string().min(1).optional(),concurrent_limit:K.number().int().positive().optional(),errors:$c,inputs:K.array(xc).optional(),outputs:K.array(Ac).optional(),steps:K.array(YA).min(1),connections:KA.default({}),entry_step_id:no,triggers:K.array(Rc).optional(),read_only:K.boolean().optional(),requires:Oc}).superRefine((e,t)=>{let r=new Set;for(let[n,s]of e.steps.entries())r.has(s.id)&&t.addIssue({code:"custom",path:["steps",n,"id"],message:`duplicate step id: ${s.id}`}),r.add(s.id);r.has(e.entry_step_id)||t.addIssue({code:"custom",path:["entry_step_id"],message:`entry_step_id does not reference an existing step: ${e.entry_step_id}`});for(let[n,s]of Object.entries(e.connections)){r.has(n)||t.addIssue({code:"custom",path:["connections",n],message:`connection source does not reference an existing step: ${n}`});for(let[i,o]of Object.entries(s))for(let[a,l]of o.entries())for(let[c,d]of l.entries())r.has(d.step_id)||t.addIssue({code:"custom",path:["connections",n,i,a,c,"step_id"],message:`connection target does not reference an existing step: ${d.step_id}`})}})});function so(e){return jc(e)}function jc(e){if(Array.isArray(e))return e.map(jc);if(e===null||typeof e!="object")return e;let t=e,r={};for(let n of Object.keys(t))r[n]=jc(t[n]);if(typeof r.type=="string"){let n=ZA[r.type];n!==void 0&&(r.type=n)}return r}var Mc,zA,ZA,Dc=T(()=>{"use strict";Mc="lmctl.builtin.",zA={Review:`${Mc}Review`,Research:`${Mc}Research`,Consolidate:`${Mc}Consolidate`},ZA=Object.fromEntries(Object.entries(zA).map(([e,t])=>[t,e]))});import{readFileSync as QA}from"node:fs";function th(e){return eR(e)}function eR(e){let t=so(nR(e));if(rR(t),rh(t)===3)return tR(t);let r=ro.safeParse(t);if(!r.success)throw new Xt({errors:r.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message}))});let n=sR(r.data);if(n.errors.length>0||n.unresolvedRefs.length>0)throw new Xt(n);return r.data}function tR(e){let t=It.safeParse(e);if(!t.success)throw new Xt({errors:t.error.issues.map(r=>({path:r.path.length===0?"$":r.path.map(String).join("."),message:r.message}))});return t.data}function rR(e){if(typeof e!="object"||e===null||!("definition_schema_version"in e))return;let t=rh(e);if(!(t===null||Q_.includes(t)))throw new Xt({errors:[{path:"definition_schema_version",message:`unsupported definition_schema_version ${t}; supported versions: ${Q_.join(", ")}`}]})}function rh(e){if(typeof e!="object"||e===null||!("definition_schema_version"in e))return null;let t=e.definition_schema_version;return typeof t=="number"?t:null}function nR(e){if(typeof e!="string")return e;let t=e.trim();return e.includes(`
1753
- `)||t.startsWith("{")||t.startsWith("[")?eh(e,"$"):t.endsWith(".json")?eh(QA(t,"utf8"),t):e}function eh(e,t){try{return JSON.parse(e)}catch(r){let n=r instanceof Error?r.message:"invalid JSON";throw new Xt({errors:[{path:t,message:`invalid JSON: ${n}`}]})}}function sR(e){let t=[],r=[],n=new Set(Object.keys(e.states));n.has(e.start_at)||r.push({state:"$",ref:e.start_at,kind:"next"}),iR(e,n,r);for(let[s,i]of Object.entries(e.states))new Set(Object.keys(e.terminals));return{errors:t,unresolvedRefs:r}}function iR(e,t,r){let n=e.errors?.on_unhandled_failure_state;n!==void 0&&(t.has(n)||r.push({state:"$",ref:n,kind:"next"}))}var Q_,Xt,nh=T(()=>{"use strict";ln();cn();Dc();Q_=[1,2,3],Xt=class extends Error{errors;unresolvedRefs;constructor(t){super(t.message??"workflow validation failed"),this.name="WorkflowValidationError",this.errors=t.errors??[],this.unresolvedRefs=t.unresolvedRefs??[]}}});import{createHash as oR}from"node:crypto";function sh(e,t){let r=aR(t),n=oR("sha1").update(`${e}:${t}`).digest("hex").slice(0,4);return`s-${r}-${n}`}function aR(e){let t=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return t.length>0?t:"step"}var ih=T(()=>{"use strict";cn()});function dR(e,t){let r=cR[e]??[],n={},s={};for(let[i,o]of Object.entries(t))r.includes(i)?s[i]=o:n[i]=o;return{params:n,members:s}}function ch(e){let t=[],r=(k,N)=>{throw new dn([{line:k,message:N}])},n=e.split(`
1754
- `),s=[];for(let k=0;k<n.length;k+=1){let L=mR(n[k]).trim();L.length>0&&s.push({n:k+1,text:L})}s.length===0&&r(1,"empty composition: expected a `workflow <name> v<version>` header");let i=/^workflow\s+(\S+)\s+v(\d+)$/.exec(s[0].text)??r(s[0].n,`expected header \`workflow <name> v<version>\`, got: ${s[0].text}`),o=i[1],a=Number.parseInt(i[2],10),l=new Map,c=[],d=[],u=[],f,m={},p=new Map,_=new Map,g=new Map,h=(k,N,L,F,j,C)=>{l.has(k)&&r(F,`duplicate step/terminal id: ${k}`),/^[A-Za-z][\w-]*$/.test(k)||r(F,`invalid id (must start with a letter): ${k}`),l.set(k,{declId:k,type:N,params:L,line:F,isTerminal:j,...C?{members:C}:{}}),d.push(k)},S=k=>{let N=[],L=k+1;for(;L<s.length;L+=1){let F=/^([A-Za-z][\w-]*|default)\s*->\s*([A-Za-z][\w-]*)$/.exec(s[L].text);if(F===null)break;N.push({label:F[1],dst:F[2]})}return{branches:N,nextIdx:L-1}};for(let k=1;k<s.length;k+=1){let{n:N,text:L}=s[k],F=L.split(/\s+/,1)[0];if(/^meta\s*\(/.test(L)){k!==1&&r(N,"`meta(...)` must be the preamble \u2014 the FIRST line after the `workflow` header (at most one, before any construct)");let j=/^meta\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`meta\` (expected \`meta({ "requires"?:\u2026, "default_task_timeout_ms"?:\u2026, "errors"?:\u2026, "concurrency_key"?:\u2026, "concurrent_limit"?:\u2026 })\`): ${L}`),C=ur(j[1],N,r);for(let z of Object.keys(C))ah.has(z)||r(N,`unknown \`meta\` key \`${z}\` \u2014 only workflow-level runtime metadata is allowed: ${[...ah].join(", ")} (no grammar inflation; bounded)`);m=C;continue}if(F==="step"){let j=/^step\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`step\` (expected \`step <id> = <archetype>(k=v, ...)\`): ${L}`),C=j[1],z=j[2],_e=j[3],ie=oh[z];ie===void 0&&r(N,`unknown step type: ${z} (supported \`step\` archetypes: ${Object.keys(oh).join(", ")}; choice/terminal/loop/foreach/call/decide have their own constructs)`);let{params:Ee,members:Ct}=dR(ie,ur(_e,N,r));h(C,ie,Ee,N,!1,Object.keys(Ct).length>0?Ct:void 0);continue}if(F==="trigger"){let j=/^trigger\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`trigger\` (expected \`trigger <id> = <trigger-type>({ ...json... })\`): ${L}`),C=j[1],z=j[2],_e=j[3],ie=lh[z];ie===void 0&&r(N,`unknown trigger type: ${z} (registered trigger archetypes: ${Object.keys(lh).join(", ")})`),p.has(C)&&r(N,`duplicate trigger id: ${C}`),p.set(C,{id:C,type:ie,parameters:ur(_e,N,r)});continue}if(F==="mcp"||F==="skill"){let j=new RegExp(`^${F}\\s+([A-Za-z][\\w-]*)\\s*=\\s*(.+)$`).exec(L)??r(N,`malformed \`${F}\` decl (expected \`${F} <name> = {json} | ${F} <name> = "<file|url>"\`): ${L}`),C=j[1],z=j[2].trim(),_e=F==="mcp"?_:g;_e.has(C)&&r(N,`duplicate ${F} declaration: ${C}`);let ie;if(z.startsWith("{")){let Ee=ur(z,N,r);F==="mcp"?ie={...Ee,name:C}:((typeof Ee.content!="string"||Ee.content.length===0)&&r(N,`\`skill ${C}\`: inline form requires a non-empty string \`content\` (a SKILL.md body)`),ie={name:C,content:Ee.content})}else{let Ee=dh(z);(typeof Ee!="string"||Ee.length===0)&&r(N,`\`${F} ${C}\`: string form must be a non-empty file path or http(s) URL`),ie=Ee}_e.set(C,ie);continue}if(F==="terminal"){let j=/^terminal\s+([A-Za-z][\w-]*)\s*=\s*([A-Za-z][\w-]*)(?:\s+(success|failure|neutral))?\s*$/.exec(L)??r(N,`malformed \`terminal\` (expected \`terminal <id> = <name> [success|failure|neutral]\`): ${L}`);h(j[1],"lmctl/terminal",{name:j[2],kind:j[3]??"neutral"},N,!0);continue}if(F==="seq"){let C=L.slice(3).trim().split(/\s*(->|-[a-z0-9_]+->)\s*/).map(z=>z.trim()).filter(z=>z.length>0);(C.length<3||C.length%2===0)&&r(N,`malformed \`seq\` (expected \`<id> -> <id> [ -> <id> ... ]\`, optional \`-<port>->\`): ${L}`);for(let z=0;z+2<C.length+1&&!(z+2>C.length-1);z+=2){let _e=C[z],ie=C[z+1],Ee=C[z+2],Ct=ie==="->"?"main":ie.slice(1,-2);c.push({srcDeclId:_e,port:Ct,dstDeclId:Ee,line:N})}continue}if(F==="choice"){let C=(/^choice\s+([A-Za-z][\w-]*)\s*:$/.exec(L)??r(N,`malformed \`choice\` (expected \`choice <id>:\` then \`when <predicate> -<port>-> <id>\` lines): ${L}`))[1],z=[],_e,ie=k+1;for(;ie<s.length;ie+=1){let Ee=s[ie].text,Ct=/^when\s+(.+)\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(Ee);if(Ct!==null){_e!==void 0&&r(s[ie].n,`\`choice ${C}\`: a \`when\` branch may not follow \`default\` (branches are ordered, default is the fallback)`);let jn=Ct[2];z.push({when:Ct[1].trim(),next:`@terminal:${jn}`}),c.push({srcDeclId:C,port:jn,dstDeclId:Ct[3],line:s[ie].n});continue}let Xa=/^default\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(Ee);if(Xa!==null){_e!==void 0&&r(s[ie].n,`\`choice ${C}\` has more than one \`default\``);let jn=Xa[1];_e=`@terminal:${jn}`,c.push({srcDeclId:C,port:jn,dstDeclId:Xa[2],line:s[ie].n});continue}break}z.length===0&&r(N,`\`choice ${C}\` has no \`when\` branches (need \u22651 \`when <jexl-predicate> -<port>-> <id>\`)`),h(C,"lmctl/choice",{branches:z,..._e!==void 0?{default_next:_e}:{}},N,!1),k=ie-1;continue}if(F==="loop"){let j=/^loop\s+([A-Za-z][\w-]*)\s*=\s*loop\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`loop\` (expected \`loop <id> = loop(k=v, ...)\`): ${L}`);h(j[1],"lmctl/loop",ur(j[2],N,r),N,!1);continue}if(F==="foreach"){let j=/^foreach\s+([A-Za-z][\w-]*)\s*=\s*foreach\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`foreach\` (expected \`foreach <id> = foreach(items=<expr>, ...)\`): ${L}`),C=ur(j[2],N,r);"mode"in C&&r(N,"foreach is SEQUENTIAL-ONLY: `mode` is not permitted (single-thread; durable-memory/composition-language-design.md \xA7Execution model)"),h(j[1],"lmctl/foreach",C,N,!1);continue}if(F==="call"){let j=/^call\s+([A-Za-z][\w-]*)\s*=\s*call\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`call\` (expected \`call <id> = call(workflow=<name>, ...)\`): ${L}`),C=j[1],z=ur(j[2],N,r),_e=z.workflow;(typeof _e!="string"||_e.length===0)&&r(N,`\`call ${C}\` requires a \`workflow=<name>\` argument`);let{workflow:ie,...Ee}=z;h(C,"lmctl/subflow",{workflow_name:_e,...Ee},N,!1),u.push({declId:C,target:_e,line:N});continue}if(F==="decide"){let j=/^decide\s+([A-Za-z][\w-]*)\s+by\s+agent\s*\((.*)\)\s*:$/.exec(L)??r(N,`malformed \`decide\` (expected \`decide <id> by agent(k=v, ...):\`): ${L}`),C=j[1],z=ur(j[2],N,r),{branches:_e,nextIdx:ie}=S(k);_e.length===0&&r(N,`\`decide ${C}\` has no outcomes (need at least one \`<outcome> -> <id>\`)`),h(C,"lmctl/interactive",{termination:{operator_signal:!0}},N,!1,{agent:z});for(let Ee of _e)c.push({srcDeclId:C,port:Ee.label,dstDeclId:Ee.dst,line:N});k=ie;continue}if(F==="entry"){let j=/^entry\s+([A-Za-z][\w-]*)$/.exec(L)??r(N,`malformed \`entry\` (expected \`entry <id>\`): ${L}`);f!==void 0&&r(N,`duplicate \`entry\` (already set to ${f})`),f=j[1];continue}r(N,`unknown statement \`${F}\` (grammar: workflow / meta / trigger / mcp / skill / step / terminal / seq / choice / loop / foreach / call / decide / entry)`)}d.length===0&&r(s[0].n,"composition declares no steps"),f===void 0&&(f=d[0]),l.has(f)||r(s[0].n,`entry references undeclared step: ${f}`);let y=k=>{if(Array.isArray(k)){for(let L of k)y(L);return}if(typeof k!="object"||k===null)return;let N=k;if(typeof N.alias=="string")for(let[L,F]of[["mcp",_],["skills",g]]){let j=N[L];Array.isArray(j)&&(N[L]=j.map(C=>typeof C=="string"&&F.has(C)?structuredClone(F.get(C)):C))}for(let L of Object.values(N))y(L)};for(let k of d){let N=l.get(k);N.members!==void 0&&y(N.members)}let w=k=>sh(o,k),I=d.map(k=>{let N=l.get(k);return{id:w(k),name:k,type:N.type,typeVersion:1,parameters:N.params,...N.members?{members:N.members}:{}}}),x={};for(let k of c){l.has(k.srcDeclId)||r(k.line,`edge source references undeclared step: ${k.srcDeclId}`),l.has(k.dstDeclId)||r(k.line,`dangling edge target: ${k.dstDeclId} is not declared`),l.get(k.srcDeclId).isTerminal&&r(k.line,`terminal \`${k.srcDeclId}\` cannot have an outgoing edge`);let N=w(k.srcDeclId);x[N]??={},x[N][k.port]!==void 0&&r(k.line,`duplicate edge port \`${k.port}\` on step \`${k.srcDeclId}\``),x[N][k.port]=[[{step_id:w(k.dstDeclId),type:"main",index:0}]]}for(let k of d){let N=l.get(k);uR.has(N.type)||r(N.line,`unknown archetype \`${N.type}\` for step \`${k}\` \u2014 not a registered builtin (src/engine/archetypes/index.ts:17-32)`)}for(let k of u)k.target===o&&r(k.line,`subflow cycle: \`call ${k.declId}\` invokes this workflow (\`${o}\`) \u2014 direct recursion is not allowed (cross-workflow A\u2192B\u2192A cycle detection is deferred to the M3 compile.ts seam)`);let U=new Map;for(let k of c){let N=U.get(k.srcDeclId);N===void 0?U.set(k.srcDeclId,[k.dstDeclId]):N.push(k.dstDeclId)}for(let k of d){let N=l.get(k);if(N.type!=="lmctl/loop")continue;let L=N.params.body;if(typeof L=="string"&&l.has(L)){let F=U.get(k);F===void 0?U.set(k,[L]):F.push(L)}}let ue=new Set([f]),W=[f];for(;W.length>0;){let k=W.shift();for(let N of U.get(k)??[])ue.has(N)||(ue.add(N),W.push(N))}for(let k of d)ue.has(k)||r(l.get(k).line,`step \`${k}\` is unreachable from entry \`${f}\``);let M=new Map;for(let k of c){let N=M.get(k.srcDeclId);N===void 0&&(N=new Set,M.set(k.srcDeclId,N)),N.add(k.port)}let A=new Set(["approve","request_changes","fail_pre_check","max_loops_exceeded"]);for(let k of d){let N=l.get(k);if(N.isTerminal)continue;let L=M.get(k)??new Set;if(N.type==="lmctl/review"){let j=[...L].some(C=>!A.has(C));!L.has("approve")&&!j&&r(N.line,`uncovered outcome: review step \`${k}\` wires neither \`approve\` nor any stance outcome \u2014 route \`approve\` (\`seq ${k} -approve-> <target>\`) or a stance port (run.ts:423-438 synthesizes outcomes_from_stance; review.ts:88-102 routes a stance before default approve)`);continue}let F=fR[N.type];if(F!==void 0)for(let j of F)L.has(j)||r(N.line,`uncovered outcome: required outcome \`${j}\` of step \`${k}\` (\`${N.type}\`) has no connection \u2014 route it (\`seq ${k} -${j}-> <target|terminal>\`)`);else L.size===0&&r(N.line,`uncovered outcome: non-terminal step \`${k}\` (\`${N.type}\`) has no outgoing connection \u2014 wire it with \`seq\` or route to a \`terminal\``)}for(let k of d){let N=l.get(k),L=lR[N.type];if(L===void 0)continue;let F={...N.params,...N.members??{},type:L.v2type,state_name:k,...Object.keys(L.outcomes).length>0?{outcomes:L.outcomes}:{}},j=L.schema.safeParse(F);if(!j.success){let C=j.error.issues[0],z=C.path.length===0?"$":C.path.map(String).join(".");r(N.line,`step \`${k}\` (\`${N.type}\`) has invalid params for archetype \`${L.v2type}\` at \`${z}\`: ${C.message} \u2014 this would crash the engine (it derefs this field unguarded). Provide it via the structured form: \`step ${k} = ${N.type.replace("lmctl/","")}({ ... })\``)}}let Q={schema_version:"lmctl/v3",definition_schema_version:3,name:o,version:a,...m,...p.size>0?{triggers:[...p.values()]}:{},steps:I,connections:x,entry_step_id:w(f)},B=It.safeParse(Q);if(!B.success)throw new dn(B.error.issues.map(k=>({line:s[0].n,message:`emitted V3 invalid at ${k.path.length===0?"$":k.path.map(String).join(".")}: ${k.message}`})));return B.data}function mR(e){let t=null;for(let r=0;r<e.length;r+=1){let n=e[r];if(t!==null){if(n==="\\"){r+=1;continue}n===t&&(t=null);continue}if(n==='"'||n==="'"){t=n;continue}if(n==="#")return e.slice(0,r)}return e}function ur(e,t,r){let n=e.trim();if(n.length===0)return{};if(n.startsWith("{")){let i;try{i=JSON.parse(n)}catch(o){r(t,`malformed structured args (expected a single-line JSON object): ${o.message}`)}return(i===null||typeof i!="object"||Array.isArray(i))&&r(t,"structured args must be a JSON object"),i}let s={};for(let i of pR(n)){let o=i.indexOf("=");o===-1&&r(t,`malformed arg (expected k=v): ${i}`);let a=i.slice(0,o).trim(),l=i.slice(o+1).trim();/^[A-Za-z_][\w-]*$/.test(a)||r(t,`invalid arg name: ${a}`),s[a]=dh(l)}return s}function pR(e){return e.split(",").map(t=>t.trim()).filter(t=>t.length>0)}function dh(e){return e.startsWith('"')&&e.endsWith('"')||e.startsWith("'")&&e.endsWith("'")?e.slice(1,-1):e==="true"?!0:e==="false"?!1:/^-?\d+$/.test(e)?Number.parseInt(e,10):/^-?\d*\.\d+$/.test(e)?Number.parseFloat(e):e}var lR,cR,oh,dn,uR,fR,ah,lh,uh=T(()=>{"use strict";cn();ih();ln();lR={"lmctl/review":{v2type:"Review",outcomes:{approve:"_"},schema:zi},"lmctl/consolidate":{v2type:"Consolidate",outcomes:{ok:"_"},schema:Zi},"lmctl/interactive":{v2type:"Interactive",outcomes:{done:"_"},schema:Qi},"lmctl/loop":{v2type:"Loop",outcomes:{ok:"_"},schema:eo},"lmctl/shell-step":{v2type:"ShellStep",outcomes:{},schema:to}},cR={"lmctl/review":["coder","reviewers"],"lmctl/consolidate":["researchers","consolidator"],"lmctl/interactive":["agent"]};oh={review:"lmctl/review",consolidate:"lmctl/consolidate",interactive:"lmctl/interactive","shell-step":"lmctl/shell-step","assert-repo-clean":"lmctl/assert-repo-clean","render-docx":"lmctl/render-docx","render-xlsx":"lmctl/render-xlsx"},dn=class extends Error{issues;constructor(t){super(`composition DSL compile failed:
1752
+ table; --json emits the structured WorkflowVerifyReport payload.`;vA=["open","assigned","closed","reopened"]});import V_ from"jexl";function an(e){V_.compile(K_(e))}async function $r(e,t){return V_.eval(K_(e),t)}function K_(e){return e.replace(/([A-Za-z_$][\w$.[\]]*)\.includes\(([^()]+)\)/g,"($2 in $1)")}var as=T(()=>{"use strict"});import{z as E}from"zod";function $c(e){let t=e.trim();return t.startsWith("={{")&&t.endsWith("}}")?t.slice(3,-2).trim():e}var PA,Y_,Nc,xc,Ac,Rc,Lc,Oc,z_,FA,UA,WA,ls,BA,zi,Zi,Qi,eo,to,Z_,qA,HA,JA,XA,ro,ln=T(()=>{"use strict";as();PA=E.object({kind:E.enum(["success","neutral","failure"])}),Y_=E.enum(["string","number","boolean","object","array"]),Nc=E.object({name:E.string().min(1),type:Y_,required:E.boolean().optional(),default:E.unknown().optional(),description:E.string().optional()}),xc=E.object({name:E.string().min(1),type:Y_,source_step_id:E.string().min(1),source_field:E.string().min(1),description:E.string().optional()}),Ac=E.object({id:E.string().min(1),type:E.string().min(1),parameters:E.record(E.string(),E.unknown()).default({})}),Rc="__failure__",Lc=E.object({tools:E.array(E.string().min(1)).optional(),auth:E.array(E.string().min(1)).optional()}).strict().optional(),Oc=E.object({on_unhandled_failure:E.object({attention_kind:E.string().min(1).default("workflow_failed"),severity:E.enum(["warn","error","critical"]).default("warn"),capture_evidence:E.boolean().default(!0),recommend_recovery:E.string().min(1).optional()}).optional(),on_unhandled_failure_state:E.string().min(1).optional()}).optional(),z_=E.object({type:E.literal("AssertRepoClean"),fail_message:E.string().min(1).optional(),next:E.string().min(1)}),FA=E.object({name:E.string().min(1),command:E.string().min(1).optional(),args:E.array(E.string()).optional(),env:E.record(E.string(),E.string()).optional(),type:E.enum(["stdio","http","sse"]).optional(),url:E.string().min(1).optional(),headers:E.record(E.string(),E.string()).optional()}).strict(),UA=E.union([E.string().min(1),FA]),WA=E.union([E.string().min(1),E.object({name:E.string().min(1),content:E.string().min(1)}).strict()]),ls=E.object({team:E.string().min(1),alias:E.string().min(1),prompt_template:E.string().optional(),mcp:E.array(UA).optional(),skills:E.array(WA).optional()}),BA=E.object({kind:E.literal("shell"),command:E.string().min(1),description:E.string().optional()}),zi=E.object({type:E.literal("Review"),state_name:E.string().min(1),coder:ls,pre_checks:E.array(BA).optional(),reviewers:E.array(ls.extend({rubric_artifact:E.string().optional()})).optional(),outcomes:E.object({approve:E.string().min(1),request_changes:E.string().optional(),fail_pre_check:E.string().optional(),max_loops_exceeded:E.string().optional()}),writes_to_project_path:E.boolean().optional(),durable_memory_tags:E.array(E.string().min(1)).optional(),write_back_durable_memory:E.union([E.boolean(),E.string().min(1)]).optional(),max_loops:E.number().int().positive().default(5),loop_feedback_artifact:E.string().optional(),outcomes_from_stance:E.record(E.string(),E.string().min(1)).optional()}).superRefine((e,t)=>{(e.reviewers??[]).length>0&&e.outcomes_from_stance!==void 0&&t.addIssue({code:"custom",path:["outcomes_from_stance"],message:"outcomes_from_stance cannot be used when reviewers is non-empty"})}),Zi=E.object({type:E.literal("Consolidate"),state_name:E.string().min(1),researchers:E.array(ls.extend({topic:E.string().min(1)})).optional(),consolidator:ls,outcomes:E.object({ok:E.string().min(1),error:E.string().optional()}),research_artifact_prefix:E.string().optional(),durable_memory_tags:E.array(E.string().min(1)).optional(),write_back_durable_memory:E.union([E.boolean(),E.string().min(1)]).optional()}),Qi=E.object({type:E.literal("Interactive"),state_name:E.string().min(1),agent:ls.extend({initial_prompt_template:E.string().min(1)}),termination:E.object({operator_signal:E.boolean().default(!0),agent_signal:E.string().optional(),max_turns:E.number().int().positive().default(20),timeout_seconds:E.number().int().positive().optional()}),outcomes:E.object({done:E.string().min(1),timeout:E.string().optional()}),artifact_name:E.string().optional(),durable_memory_tags:E.array(E.string().min(1)).optional(),write_back_durable_memory:E.union([E.boolean(),E.string().min(1)]).optional()}),eo=E.object({type:E.literal("Loop"),state_name:E.string().min(1),over:E.string().min(1),item_var:E.string().min(1),body:E.string().min(1),outcomes:E.object({ok:E.string().min(1),error:E.string().optional()}),stop_on_error:E.boolean().default(!0),max_items:E.number().int().positive().default(1e3)}),to=E.object({type:E.literal("ShellStep"),state_name:E.string().min(1),command:E.string().min(1),outcomes_from_exit:E.record(E.string(),E.string().min(1)),timeout_ms:E.number().int().nonnegative().optional(),capture_output_to:E.string().optional(),writes_to_project_path:E.boolean().optional()}),Z_=E.object({type:E.literal("Choice"),state_name:E.string().min(1),branches:E.array(E.object({when:E.string().min(1),next:E.string().min(1)})).default([]),default_next:E.string().min(1).optional()}).superRefine((e,t)=>{for(let[r,n]of e.branches.entries())try{an($c(n.when))}catch(s){let i=s instanceof Error?s.message:"invalid expression";t.addIssue({code:"custom",path:["branches",r,"when"],message:`invalid jexl expression: ${i}`})}}),qA=E.discriminatedUnion("type",[z_,zi,Zi,Qi,eo,to,Z_]),HA=E.object({type:E.literal("ForEach"),state_name:E.string().min(1),items_from:E.string().min(1),mode:E.enum(["sequential","parallel"]).default("sequential"),max_concurrency:E.number().int().positive().default(1),on_item_failure:E.enum(["continue","stop"]).default("stop"),body:qA,outcomes:E.object({all_ok:E.string().min(1),any_failed:E.string().optional()})}).superRefine((e,t)=>{try{an($c(e.items_from))}catch(r){let n=r instanceof Error?r.message:"invalid expression";t.addIssue({code:"custom",path:["items_from"],message:`invalid jexl expression: ${n}`})}}),JA=E.object({type:E.literal("Subflow"),state_name:E.string().min(1),workflow_name:E.string().min(1),inputs:E.record(E.string(),E.string().min(1)).optional(),outcomes:E.record(E.string(),E.string().min(1))}).superRefine((e,t)=>{for(let[r,n]of Object.entries(e.inputs??{}))try{an($c(n))}catch(s){let i=s instanceof Error?s.message:"invalid expression";t.addIssue({code:"custom",path:["inputs",r],message:`invalid jexl expression: ${i}`})}}),XA=E.discriminatedUnion("type",[z_,zi,Zi,Qi,eo,to,Z_,HA,JA]),ro=E.object({name:E.string().min(1),version:E.number().int().positive(),definition_schema_version:E.union([E.literal(1),E.literal(2)]),description:E.string().optional(),estimated_duration_ms:E.number().int().nonnegative().optional(),primitive_version:E.union([E.literal(1),E.literal(2)]).default(1),start_at:E.string().min(1),states:E.record(E.string().min(1),XA),terminals:E.record(E.string().min(1),PA),errors:Oc,concurrency_key:E.string().min(1).optional(),concurrent_limit:E.number().int().positive().optional(),default_task_timeout_ms:E.number().int().positive().max(216e5).optional(),inputs:E.array(Nc).optional(),outputs:E.array(xc).optional(),triggers:E.array(Ac).optional(),read_only:E.boolean().optional(),requires:Lc}).superRefine((e,t)=>{e.definition_schema_version===1&&e.errors!==void 0&&t.addIssue({code:"custom",path:["errors"],message:"errors block requires definition_schema_version: 2"}),e.definition_schema_version===1&&e.concurrency_key!==void 0&&t.addIssue({code:"custom",path:["concurrency_key"],message:"concurrency_key requires definition_schema_version: 2"}),e.definition_schema_version===1&&e.default_task_timeout_ms!==void 0&&t.addIssue({code:"custom",path:["default_task_timeout_ms"],message:"default_task_timeout_ms requires definition_schema_version: 2"})})});import{z as K}from"zod";var GA,no,VA,KA,YA,It,cn=T(()=>{"use strict";ln();GA=/^s-[a-z0-9-]+-[a-f0-9]{4}$/,no=K.string().regex(GA),VA=K.object({step_id:no,type:K.literal("main"),index:K.number().int().min(0)}),KA=K.record(no,K.record(K.string().min(1),K.array(K.array(VA)))),YA=K.object({id:no,name:K.string().min(1),type:K.string().min(1),typeVersion:K.number().int().positive().default(1),parameters:K.record(K.string(),K.unknown()).default({}),members:K.record(K.string(),K.unknown()).optional(),estimated_duration_ms:K.number().int().nonnegative().optional()}),It=K.object({schema_version:K.literal("lmctl/v3"),definition_schema_version:K.literal(3),name:K.string().min(1),version:K.number().int().positive(),description:K.string().optional(),estimated_duration_ms:K.number().int().nonnegative().optional(),default_task_timeout_ms:K.number().int().positive().max(216e5).optional(),concurrency_key:K.string().min(1).optional(),concurrent_limit:K.number().int().positive().optional(),errors:Oc,inputs:K.array(Nc).optional(),outputs:K.array(xc).optional(),steps:K.array(YA).min(1),connections:KA.default({}),entry_step_id:no,triggers:K.array(Ac).optional(),read_only:K.boolean().optional(),requires:Lc}).superRefine((e,t)=>{let r=new Set;for(let[n,s]of e.steps.entries())r.has(s.id)&&t.addIssue({code:"custom",path:["steps",n,"id"],message:`duplicate step id: ${s.id}`}),r.add(s.id);r.has(e.entry_step_id)||t.addIssue({code:"custom",path:["entry_step_id"],message:`entry_step_id does not reference an existing step: ${e.entry_step_id}`});for(let[n,s]of Object.entries(e.connections)){r.has(n)||t.addIssue({code:"custom",path:["connections",n],message:`connection source does not reference an existing step: ${n}`});for(let[i,o]of Object.entries(s))for(let[a,l]of o.entries())for(let[c,d]of l.entries())r.has(d.step_id)||t.addIssue({code:"custom",path:["connections",n,i,a,c,"step_id"],message:`connection target does not reference an existing step: ${d.step_id}`})}})});function so(e){return Mc(e)}function Mc(e){if(Array.isArray(e))return e.map(Mc);if(e===null||typeof e!="object")return e;let t=e,r={};for(let n of Object.keys(t))r[n]=Mc(t[n]);if(typeof r.type=="string"){let n=ZA[r.type];n!==void 0&&(r.type=n)}return r}var Cc,zA,ZA,jc=T(()=>{"use strict";Cc="lmctl.builtin.",zA={Review:`${Cc}Review`,Research:`${Cc}Research`,Consolidate:`${Cc}Consolidate`},ZA=Object.fromEntries(Object.entries(zA).map(([e,t])=>[t,e]))});import{readFileSync as QA}from"node:fs";function th(e){return eR(e)}function eR(e){let t=so(nR(e));if(rR(t),rh(t)===3)return tR(t);let r=ro.safeParse(t);if(!r.success)throw new Xt({errors:r.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message}))});let n=sR(r.data);if(n.errors.length>0||n.unresolvedRefs.length>0)throw new Xt(n);return r.data}function tR(e){let t=It.safeParse(e);if(!t.success)throw new Xt({errors:t.error.issues.map(r=>({path:r.path.length===0?"$":r.path.map(String).join("."),message:r.message}))});return t.data}function rR(e){if(typeof e!="object"||e===null||!("definition_schema_version"in e))return;let t=rh(e);if(!(t===null||Q_.includes(t)))throw new Xt({errors:[{path:"definition_schema_version",message:`unsupported definition_schema_version ${t}; supported versions: ${Q_.join(", ")}`}]})}function rh(e){if(typeof e!="object"||e===null||!("definition_schema_version"in e))return null;let t=e.definition_schema_version;return typeof t=="number"?t:null}function nR(e){if(typeof e!="string")return e;let t=e.trim();return e.includes(`
1753
+ `)||t.startsWith("{")||t.startsWith("[")?eh(e,"$"):t.endsWith(".json")?eh(QA(t,"utf8"),t):e}function eh(e,t){try{return JSON.parse(e)}catch(r){let n=r instanceof Error?r.message:"invalid JSON";throw new Xt({errors:[{path:t,message:`invalid JSON: ${n}`}]})}}function sR(e){let t=[],r=[],n=new Set(Object.keys(e.states));n.has(e.start_at)||r.push({state:"$",ref:e.start_at,kind:"next"}),iR(e,n,r);for(let[s,i]of Object.entries(e.states))new Set(Object.keys(e.terminals));return{errors:t,unresolvedRefs:r}}function iR(e,t,r){let n=e.errors?.on_unhandled_failure_state;n!==void 0&&(t.has(n)||r.push({state:"$",ref:n,kind:"next"}))}var Q_,Xt,nh=T(()=>{"use strict";ln();cn();jc();Q_=[1,2,3],Xt=class extends Error{errors;unresolvedRefs;constructor(t){super(t.message??"workflow validation failed"),this.name="WorkflowValidationError",this.errors=t.errors??[],this.unresolvedRefs=t.unresolvedRefs??[]}}});import{createHash as oR}from"node:crypto";function sh(e,t){let r=aR(t),n=oR("sha1").update(`${e}:${t}`).digest("hex").slice(0,4);return`s-${r}-${n}`}function aR(e){let t=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return t.length>0?t:"step"}var ih=T(()=>{"use strict";cn()});function dR(e,t){let r=cR[e]??[],n={},s={};for(let[i,o]of Object.entries(t))r.includes(i)?s[i]=o:n[i]=o;return{params:n,members:s}}function ch(e){let t=[],r=(k,N)=>{throw new dn([{line:k,message:N}])},n=e.split(`
1754
+ `),s=[];for(let k=0;k<n.length;k+=1){let L=mR(n[k]).trim();L.length>0&&s.push({n:k+1,text:L})}s.length===0&&r(1,"empty composition: expected a `workflow <name> v<version>` header");let i=/^workflow\s+(\S+)\s+v(\d+)$/.exec(s[0].text)??r(s[0].n,`expected header \`workflow <name> v<version>\`, got: ${s[0].text}`),o=i[1],a=Number.parseInt(i[2],10),l=new Map,c=[],d=[],u=[],f,m={},p=new Map,_=new Map,g=new Map,h=(k,N,L,F,j,C)=>{l.has(k)&&r(F,`duplicate step/terminal id: ${k}`),/^[A-Za-z][\w-]*$/.test(k)||r(F,`invalid id (must start with a letter): ${k}`),l.set(k,{declId:k,type:N,params:L,line:F,isTerminal:j,...C?{members:C}:{}}),d.push(k)},S=k=>{let N=[],L=k+1;for(;L<s.length;L+=1){let F=/^([A-Za-z][\w-]*|default)\s*->\s*([A-Za-z][\w-]*)$/.exec(s[L].text);if(F===null)break;N.push({label:F[1],dst:F[2]})}return{branches:N,nextIdx:L-1}};for(let k=1;k<s.length;k+=1){let{n:N,text:L}=s[k],F=L.split(/\s+/,1)[0];if(/^meta\s*\(/.test(L)){k!==1&&r(N,"`meta(...)` must be the preamble \u2014 the FIRST line after the `workflow` header (at most one, before any construct)");let j=/^meta\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`meta\` (expected \`meta({ "requires"?:\u2026, "default_task_timeout_ms"?:\u2026, "errors"?:\u2026, "concurrency_key"?:\u2026, "concurrent_limit"?:\u2026 })\`): ${L}`),C=ur(j[1],N,r);for(let z of Object.keys(C))ah.has(z)||r(N,`unknown \`meta\` key \`${z}\` \u2014 only workflow-level runtime metadata is allowed: ${[...ah].join(", ")} (no grammar inflation; bounded)`);m=C;continue}if(F==="step"){let j=/^step\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`step\` (expected \`step <id> = <archetype>(k=v, ...)\`): ${L}`),C=j[1],z=j[2],_e=j[3],ie=oh[z];ie===void 0&&r(N,`unknown step type: ${z} (supported \`step\` archetypes: ${Object.keys(oh).join(", ")}; choice/terminal/loop/foreach/call/decide have their own constructs)`);let{params:Ee,members:Ct}=dR(ie,ur(_e,N,r));h(C,ie,Ee,N,!1,Object.keys(Ct).length>0?Ct:void 0);continue}if(F==="trigger"){let j=/^trigger\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`trigger\` (expected \`trigger <id> = <trigger-type>({ ...json... })\`): ${L}`),C=j[1],z=j[2],_e=j[3],ie=lh[z];ie===void 0&&r(N,`unknown trigger type: ${z} (registered trigger archetypes: ${Object.keys(lh).join(", ")})`),p.has(C)&&r(N,`duplicate trigger id: ${C}`),p.set(C,{id:C,type:ie,parameters:ur(_e,N,r)});continue}if(F==="mcp"||F==="skill"){let j=new RegExp(`^${F}\\s+([A-Za-z][\\w-]*)\\s*=\\s*(.+)$`).exec(L)??r(N,`malformed \`${F}\` decl (expected \`${F} <name> = {json} | ${F} <name> = "<file|url>"\`): ${L}`),C=j[1],z=j[2].trim(),_e=F==="mcp"?_:g;_e.has(C)&&r(N,`duplicate ${F} declaration: ${C}`);let ie;if(z.startsWith("{")){let Ee=ur(z,N,r);F==="mcp"?ie={...Ee,name:C}:((typeof Ee.content!="string"||Ee.content.length===0)&&r(N,`\`skill ${C}\`: inline form requires a non-empty string \`content\` (a SKILL.md body)`),ie={name:C,content:Ee.content})}else{let Ee=dh(z);(typeof Ee!="string"||Ee.length===0)&&r(N,`\`${F} ${C}\`: string form must be a non-empty file path or http(s) URL`),ie=Ee}_e.set(C,ie);continue}if(F==="terminal"){let j=/^terminal\s+([A-Za-z][\w-]*)\s*=\s*([A-Za-z][\w-]*)(?:\s+(success|failure|neutral))?\s*$/.exec(L)??r(N,`malformed \`terminal\` (expected \`terminal <id> = <name> [success|failure|neutral]\`): ${L}`);h(j[1],"lmctl/terminal",{name:j[2],kind:j[3]??"neutral"},N,!0);continue}if(F==="seq"){let C=L.slice(3).trim().split(/\s*(->|-[a-z0-9_]+->)\s*/).map(z=>z.trim()).filter(z=>z.length>0);(C.length<3||C.length%2===0)&&r(N,`malformed \`seq\` (expected \`<id> -> <id> [ -> <id> ... ]\`, optional \`-<port>->\`): ${L}`);for(let z=0;z+2<C.length+1&&!(z+2>C.length-1);z+=2){let _e=C[z],ie=C[z+1],Ee=C[z+2],Ct=ie==="->"?"main":ie.slice(1,-2);c.push({srcDeclId:_e,port:Ct,dstDeclId:Ee,line:N})}continue}if(F==="choice"){let C=(/^choice\s+([A-Za-z][\w-]*)\s*:$/.exec(L)??r(N,`malformed \`choice\` (expected \`choice <id>:\` then \`when <predicate> -<port>-> <id>\` lines): ${L}`))[1],z=[],_e,ie=k+1;for(;ie<s.length;ie+=1){let Ee=s[ie].text,Ct=/^when\s+(.+)\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(Ee);if(Ct!==null){_e!==void 0&&r(s[ie].n,`\`choice ${C}\`: a \`when\` branch may not follow \`default\` (branches are ordered, default is the fallback)`);let jn=Ct[2];z.push({when:Ct[1].trim(),next:`@terminal:${jn}`}),c.push({srcDeclId:C,port:jn,dstDeclId:Ct[3],line:s[ie].n});continue}let Ja=/^default\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(Ee);if(Ja!==null){_e!==void 0&&r(s[ie].n,`\`choice ${C}\` has more than one \`default\``);let jn=Ja[1];_e=`@terminal:${jn}`,c.push({srcDeclId:C,port:jn,dstDeclId:Ja[2],line:s[ie].n});continue}break}z.length===0&&r(N,`\`choice ${C}\` has no \`when\` branches (need \u22651 \`when <jexl-predicate> -<port>-> <id>\`)`),h(C,"lmctl/choice",{branches:z,..._e!==void 0?{default_next:_e}:{}},N,!1),k=ie-1;continue}if(F==="loop"){let j=/^loop\s+([A-Za-z][\w-]*)\s*=\s*loop\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`loop\` (expected \`loop <id> = loop(k=v, ...)\`): ${L}`);h(j[1],"lmctl/loop",ur(j[2],N,r),N,!1);continue}if(F==="foreach"){let j=/^foreach\s+([A-Za-z][\w-]*)\s*=\s*foreach\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`foreach\` (expected \`foreach <id> = foreach(items=<expr>, ...)\`): ${L}`),C=ur(j[2],N,r);"mode"in C&&r(N,"foreach is SEQUENTIAL-ONLY: `mode` is not permitted (single-thread; durable-memory/composition-language-design.md \xA7Execution model)"),h(j[1],"lmctl/foreach",C,N,!1);continue}if(F==="call"){let j=/^call\s+([A-Za-z][\w-]*)\s*=\s*call\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`call\` (expected \`call <id> = call(workflow=<name>, ...)\`): ${L}`),C=j[1],z=ur(j[2],N,r),_e=z.workflow;(typeof _e!="string"||_e.length===0)&&r(N,`\`call ${C}\` requires a \`workflow=<name>\` argument`);let{workflow:ie,...Ee}=z;h(C,"lmctl/subflow",{workflow_name:_e,...Ee},N,!1),u.push({declId:C,target:_e,line:N});continue}if(F==="decide"){let j=/^decide\s+([A-Za-z][\w-]*)\s+by\s+agent\s*\((.*)\)\s*:$/.exec(L)??r(N,`malformed \`decide\` (expected \`decide <id> by agent(k=v, ...):\`): ${L}`),C=j[1],z=ur(j[2],N,r),{branches:_e,nextIdx:ie}=S(k);_e.length===0&&r(N,`\`decide ${C}\` has no outcomes (need at least one \`<outcome> -> <id>\`)`),h(C,"lmctl/interactive",{termination:{operator_signal:!0}},N,!1,{agent:z});for(let Ee of _e)c.push({srcDeclId:C,port:Ee.label,dstDeclId:Ee.dst,line:N});k=ie;continue}if(F==="entry"){let j=/^entry\s+([A-Za-z][\w-]*)$/.exec(L)??r(N,`malformed \`entry\` (expected \`entry <id>\`): ${L}`);f!==void 0&&r(N,`duplicate \`entry\` (already set to ${f})`),f=j[1];continue}r(N,`unknown statement \`${F}\` (grammar: workflow / meta / trigger / mcp / skill / step / terminal / seq / choice / loop / foreach / call / decide / entry)`)}d.length===0&&r(s[0].n,"composition declares no steps"),f===void 0&&(f=d[0]),l.has(f)||r(s[0].n,`entry references undeclared step: ${f}`);let y=k=>{if(Array.isArray(k)){for(let L of k)y(L);return}if(typeof k!="object"||k===null)return;let N=k;if(typeof N.alias=="string")for(let[L,F]of[["mcp",_],["skills",g]]){let j=N[L];Array.isArray(j)&&(N[L]=j.map(C=>typeof C=="string"&&F.has(C)?structuredClone(F.get(C)):C))}for(let L of Object.values(N))y(L)};for(let k of d){let N=l.get(k);N.members!==void 0&&y(N.members)}let w=k=>sh(o,k),I=d.map(k=>{let N=l.get(k);return{id:w(k),name:k,type:N.type,typeVersion:1,parameters:N.params,...N.members?{members:N.members}:{}}}),x={};for(let k of c){l.has(k.srcDeclId)||r(k.line,`edge source references undeclared step: ${k.srcDeclId}`),l.has(k.dstDeclId)||r(k.line,`dangling edge target: ${k.dstDeclId} is not declared`),l.get(k.srcDeclId).isTerminal&&r(k.line,`terminal \`${k.srcDeclId}\` cannot have an outgoing edge`);let N=w(k.srcDeclId);x[N]??={},x[N][k.port]!==void 0&&r(k.line,`duplicate edge port \`${k.port}\` on step \`${k.srcDeclId}\``),x[N][k.port]=[[{step_id:w(k.dstDeclId),type:"main",index:0}]]}for(let k of d){let N=l.get(k);uR.has(N.type)||r(N.line,`unknown archetype \`${N.type}\` for step \`${k}\` \u2014 not a registered builtin (src/engine/archetypes/index.ts:17-32)`)}for(let k of u)k.target===o&&r(k.line,`subflow cycle: \`call ${k.declId}\` invokes this workflow (\`${o}\`) \u2014 direct recursion is not allowed (cross-workflow A\u2192B\u2192A cycle detection is deferred to the M3 compile.ts seam)`);let U=new Map;for(let k of c){let N=U.get(k.srcDeclId);N===void 0?U.set(k.srcDeclId,[k.dstDeclId]):N.push(k.dstDeclId)}for(let k of d){let N=l.get(k);if(N.type!=="lmctl/loop")continue;let L=N.params.body;if(typeof L=="string"&&l.has(L)){let F=U.get(k);F===void 0?U.set(k,[L]):F.push(L)}}let ue=new Set([f]),W=[f];for(;W.length>0;){let k=W.shift();for(let N of U.get(k)??[])ue.has(N)||(ue.add(N),W.push(N))}for(let k of d)ue.has(k)||r(l.get(k).line,`step \`${k}\` is unreachable from entry \`${f}\``);let M=new Map;for(let k of c){let N=M.get(k.srcDeclId);N===void 0&&(N=new Set,M.set(k.srcDeclId,N)),N.add(k.port)}let A=new Set(["approve","request_changes","fail_pre_check","max_loops_exceeded"]);for(let k of d){let N=l.get(k);if(N.isTerminal)continue;let L=M.get(k)??new Set;if(N.type==="lmctl/review"){let j=[...L].some(C=>!A.has(C));!L.has("approve")&&!j&&r(N.line,`uncovered outcome: review step \`${k}\` wires neither \`approve\` nor any stance outcome \u2014 route \`approve\` (\`seq ${k} -approve-> <target>\`) or a stance port (run.ts:423-438 synthesizes outcomes_from_stance; review.ts:88-102 routes a stance before default approve)`);continue}let F=fR[N.type];if(F!==void 0)for(let j of F)L.has(j)||r(N.line,`uncovered outcome: required outcome \`${j}\` of step \`${k}\` (\`${N.type}\`) has no connection \u2014 route it (\`seq ${k} -${j}-> <target|terminal>\`)`);else L.size===0&&r(N.line,`uncovered outcome: non-terminal step \`${k}\` (\`${N.type}\`) has no outgoing connection \u2014 wire it with \`seq\` or route to a \`terminal\``)}for(let k of d){let N=l.get(k),L=lR[N.type];if(L===void 0)continue;let F={...N.params,...N.members??{},type:L.v2type,state_name:k,...Object.keys(L.outcomes).length>0?{outcomes:L.outcomes}:{}},j=L.schema.safeParse(F);if(!j.success){let C=j.error.issues[0],z=C.path.length===0?"$":C.path.map(String).join(".");r(N.line,`step \`${k}\` (\`${N.type}\`) has invalid params for archetype \`${L.v2type}\` at \`${z}\`: ${C.message} \u2014 this would crash the engine (it derefs this field unguarded). Provide it via the structured form: \`step ${k} = ${N.type.replace("lmctl/","")}({ ... })\``)}}let Q={schema_version:"lmctl/v3",definition_schema_version:3,name:o,version:a,...m,...p.size>0?{triggers:[...p.values()]}:{},steps:I,connections:x,entry_step_id:w(f)},B=It.safeParse(Q);if(!B.success)throw new dn(B.error.issues.map(k=>({line:s[0].n,message:`emitted V3 invalid at ${k.path.length===0?"$":k.path.map(String).join(".")}: ${k.message}`})));return B.data}function mR(e){let t=null;for(let r=0;r<e.length;r+=1){let n=e[r];if(t!==null){if(n==="\\"){r+=1;continue}n===t&&(t=null);continue}if(n==='"'||n==="'"){t=n;continue}if(n==="#")return e.slice(0,r)}return e}function ur(e,t,r){let n=e.trim();if(n.length===0)return{};if(n.startsWith("{")){let i;try{i=JSON.parse(n)}catch(o){r(t,`malformed structured args (expected a single-line JSON object): ${o.message}`)}return(i===null||typeof i!="object"||Array.isArray(i))&&r(t,"structured args must be a JSON object"),i}let s={};for(let i of pR(n)){let o=i.indexOf("=");o===-1&&r(t,`malformed arg (expected k=v): ${i}`);let a=i.slice(0,o).trim(),l=i.slice(o+1).trim();/^[A-Za-z_][\w-]*$/.test(a)||r(t,`invalid arg name: ${a}`),s[a]=dh(l)}return s}function pR(e){return e.split(",").map(t=>t.trim()).filter(t=>t.length>0)}function dh(e){return e.startsWith('"')&&e.endsWith('"')||e.startsWith("'")&&e.endsWith("'")?e.slice(1,-1):e==="true"?!0:e==="false"?!1:/^-?\d+$/.test(e)?Number.parseInt(e,10):/^-?\d*\.\d+$/.test(e)?Number.parseFloat(e):e}var lR,cR,oh,dn,uR,fR,ah,lh,uh=T(()=>{"use strict";cn();ih();ln();lR={"lmctl/review":{v2type:"Review",outcomes:{approve:"_"},schema:zi},"lmctl/consolidate":{v2type:"Consolidate",outcomes:{ok:"_"},schema:Zi},"lmctl/interactive":{v2type:"Interactive",outcomes:{done:"_"},schema:Qi},"lmctl/loop":{v2type:"Loop",outcomes:{ok:"_"},schema:eo},"lmctl/shell-step":{v2type:"ShellStep",outcomes:{},schema:to}},cR={"lmctl/review":["coder","reviewers"],"lmctl/consolidate":["researchers","consolidator"],"lmctl/interactive":["agent"]};oh={review:"lmctl/review",consolidate:"lmctl/consolidate",interactive:"lmctl/interactive","shell-step":"lmctl/shell-step","assert-repo-clean":"lmctl/assert-repo-clean","render-docx":"lmctl/render-docx","render-xlsx":"lmctl/render-xlsx"},dn=class extends Error{issues;constructor(t){super(`composition DSL compile failed:
1755
1755
  ${t.map(r=>` line ${r.line}: ${r.message}`).join(`
1756
1756
  `)}`),this.issues=t,this.name="DslCompileError"}},uR=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"]),fR={"lmctl/consolidate":["ok"],"lmctl/interactive":["done"],"lmctl/loop":["ok"],"lmctl/foreach":["all_ok"]},ah=new Set(["requires","default_task_timeout_ms","errors","concurrency_key","concurrent_limit"]),lh={"trigger-schedule":"lmctl/trigger-schedule","trigger-gh-issue":"lmctl/trigger-gh-issue"}});import{readFileSync as _R}from"node:fs";function hR(){let e=process.env.LMCTL_DSL;return e===void 0?!0:!["0","false","off"].includes(e.trim().toLowerCase())}function gR(e){for(let t of e.split(`
1757
- `)){let r=t.replace(/#.*/,"").trim();if(r.length!==0)return/^workflow\s+\S+\s+v\d+\s*$/.test(r)}return!1}function ct(e){if(typeof e=="string"&&hR()&&gR(e)){let r;try{r=ch(e)}catch(s){throw s instanceof dn?new Gt(s.issues.map(i=>({path:`dsl:${i.line}`,message:i.message}))):s}let n=It.safeParse(r);if(!n.success)throw new Gt(n.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));return n.data}let t=so(wR(e));if(ER(t)&&t.definition_schema_version===3){let r=It.safeParse(t);if(!r.success)throw new Gt(r.error.issues.map(n=>({path:n.path.length===0?"$":n.path.map(String).join("."),message:n.message})));return r.data}return yR(t)}function yR(e){let t=ro.safeParse(e);if(!t.success)throw new Gt(t.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));let r=t.data,n=new Set(["Task","Pause","Parallel","LoopUntil","Pass","Fail","Succeed"]);for(let[s,i]of Object.entries(r.states))if(n.has(i.type))throw new Gt([{path:`states.${s}`,message:`v2 workflows (primitive_version: 2) may not use v1 primitive type: ${i.type}`}]);try{return th(r)}catch(s){throw s instanceof Xt?new Pc(s):s}}function wR(e){if(typeof e!="string")return e;let t=e.trim();return e.includes(`
1758
- `)||t.startsWith("{")||t.startsWith("[")?fh(e):t.endsWith(".json")?fh(_R(t,"utf8")):e}function fh(e){return JSON.parse(e)}function ER(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var Pc,Gt,cs=T(()=>{"use strict";ln();nh();Dc();cn();uh();Pc=class extends Error{causeError;constructor(t){super("compiler emitted invalid atomic workflow"),this.causeError=t,this.name="CompilerInvariantError"}},Gt=class extends Error{issues;constructor(t){super("compound workflow validation failed"),this.issues=t,this.name="CompilerValidationError"}}});function io(e){let t=e.workflow?.concurrent_limit??1,r=e.job.concurrency_key_resolved??e.workflow?.concurrency_key??null;return r===null||r.trim().length===0?{concurrency_key:null,concurrent_limit:t}:{concurrency_key:TR(r,{job:{id:e.job.id,kind:e.job.source,source:e.job.source,source_ref:e.job.source_ref,payload:SR(e.job.payload)},project:e.project===null?null:{id:e.project.id,name:e.project.name}}),concurrent_limit:t}}function TR(e,t){return e.replace(/\{\{\s*([^}]+?)\s*\}\}/g,(r,n)=>{let s=bR(t,n.trim());return s==null?"":typeof s=="string"?s:typeof s=="number"||typeof s=="boolean"?String(s):JSON.stringify(s)})}function bR(e,t){let r=e;for(let n of t.split(".")){if(typeof r!="object"||r===null||!Object.prototype.hasOwnProperty.call(r,n))return;r=r[n]}return r}function SR(e){if(e===null||e.trim().length===0)return null;try{return JSON.parse(e)}catch{return e}}var Fc=T(()=>{"use strict"});var mh={};ye(mh,{enqueueFromAgentOutput:()=>kR,enqueueFromGitHubIssue:()=>Uc,enqueueManual:()=>vR,enqueueScheduled:()=>IR});function Uc(e,t){return ao(e,{project_id:t.project_id,workflow_id_override:t.workflow_id_override??null,source:"gh_issue",source_ref:t.issue_url,dedupe_key:t.dedupe_key??t.issue_url,payload:oo(t.payload),concurrency_key:t.concurrency_key,priority:t.priority})}function vR(e,t){return ao(e,{project_id:t.project_id,workflow_id_override:null,source:"manual",source_ref:t.source_ref??null,dedupe_key:t.source_ref??null,payload:oo(t.payload),concurrency_key:t.concurrency_key})}function kR(e,t){let r=t.sequence===void 0?`run:${t.parent_run_id}`:`run:${t.parent_run_id}:${t.sequence}`;return ao(e,{project_id:t.project_id,workflow_id_override:null,source:"agent_output",source_ref:r,dedupe_key:r,available_at:t.available_at,payload:oo(t.payload),concurrency_key:t.concurrency_key})}function IR(e,t){return ao(e,{project_id:t.project_id,workflow_id_override:null,source:"schedule",source_ref:t.source_ref,dedupe_key:t.source_ref,available_at:t.available_at,payload:oo(t.payload),concurrency_key:t.concurrency_key})}function oo(e){return e==null?null:typeof e=="string"?e:JSON.stringify(e)}function ao(e,t){let r=t.concurrency_key;if(r!==void 0)return e.enqueueJob({...t,concurrency_key:r});let n=e.getProject(t.project_id),s=n===null?null:t.workflow_id_override!==void 0&&t.workflow_id_override!==null?e.getWorkflow(t.workflow_id_override):e.getWorkflowByName(n.workflow_name);if(n===null||s===null)return e.enqueueJob(t);try{let i=ct(s.definition),o={id:-1,project_id:t.project_id,workflow_id_override:t.workflow_id_override??null,source:t.source,source_ref:t.source_ref??null,payload:t.payload??null,status:"queued",priority:t.priority??0,available_at:t.available_at??new Date().toISOString(),locked_by:null,locked_until:null,attempt_count:0,last_error:null,dedupe_key:t.dedupe_key??null,concurrency_key_resolved:null,enqueued_at:new Date().toISOString(),started_at:null,ended_at:null,run_id:null},a=io({workflow:i,job:o,project:n});return e.enqueueJob({...t,concurrency_key:a.concurrency_key})}catch{return e.enqueueJob(t)}}var Wc=T(()=>{"use strict";cs();Fc()});async function _h(e){let t=e.dal.listProjectWorkflows(e.project.id,{enabled_only:!0});if(t.length===0)return ph(e.dal,e.project.id,e.issue,e.issue.url,null,e.issue,void 0);let r={event:{kind:"github_issue",issue:e.issue}},n=[],s=0;for(let i of t){if(!await NR(i.condition,r))continue;let o=`${e.issue.url}#workflow:${i.workflow_id}`,a={issue:e.issue,...xR(i.parameters_override)},l=ph(e.dal,e.project.id,e.issue,o,i.workflow_id,a,-i.priority);n.push(...l.jobs),s+=l.new_jobs}return{jobs:n,new_jobs:s}}function ph(e,t,r,n,s,i,o){let a=e.findJobBySourceAndDedupe("gh_issue",n);return{jobs:[Uc(e,{project_id:t,issue_url:r.url,payload:i,workflow_id_override:s,dedupe_key:n,priority:o})],new_jobs:a===null?1:0}}async function NR(e,t){if(e===null||e.trim().length===0)return!0;try{return await $r(e,t)===!0}catch{return!1}}function xR(e){if(e===null||e.trim().length===0)return{};try{let t=JSON.parse(e);if(t!==null&&typeof t=="object"&&!Array.isArray(t))return t}catch{return{}}return{}}var hh=T(()=>{"use strict";as();Wc()});import{spawnSync as AR}from"node:child_process";async function RR(e){let t=e.labels??["bug"],r=e.state??"open",n=["issue","list","--repo",e.project.name,"--state",r,"--json","number,title,url,body,state,labels","--limit","100"];t.length>0&&n.splice(4,0,"--label",t.join(","));let s=AR(e.binary??"gh",n,{encoding:"utf8",timeout:e.timeoutMs??6e4,maxBuffer:10*1024*1024});if(s.error!==void 0)throw s.error;if(s.status!==0)throw new Error(`gh issue list failed: ${s.stderr??""}`.trim());let i;try{i=JSON.parse(s.stdout??"[]")}catch{throw new Error("gh issue list returned malformed JSON")}if(!OR(i))throw new Error("gh issue list returned unexpected JSON shape");let o=0;for(let a of i){let l=await _h({dal:e.dal,project:e.project,issue:$R(a)});o+=l.new_jobs}return{scanned:i.length,new_jobs:o}}async function lo(e){if(process.env.LMCTL_INTAKE_DISABLED==="1")return[];let t=[];for(let r of e.listProjectsWithIntakeEnabled()){let n=LR(r.intake_config);try{let s=await RR({dal:e,project:r,labels:n.labels,state:n.state});t.push({project_id:r.id,project_name:r.name,...s})}catch(s){let i=s instanceof Error?s.message:String(s);t.push({project_id:r.id,project_name:r.name,scanned:0,new_jobs:0,error:i});try{e.raiseAttention({kind:"daemon_intake_scan_failed",severity:"warn",project_id:r.id,payload:JSON.stringify({project_id:r.id,project_name:r.name,error:i})})}catch{}}}return t}function LR(e){if(e===null)return{};try{let t=JSON.parse(e);if(!Bc(t))return{};let r=t.state==="open"||t.state==="closed"||t.state==="all"?t.state:void 0,n=Array.isArray(t.labels)?t.labels.filter(s=>typeof s=="string"&&s.length>0):void 0;return{scan_github_issues:t.scan_github_issues===!0,labels:n,state:r}}catch{return{}}}function OR(e){return Array.isArray(e)&&e.every(t=>{if(!Bc(t))return!1;let r=t.labels;return typeof t.number=="number"&&typeof t.title=="string"&&typeof t.url=="string"&&(typeof t.body=="string"||t.body===null||t.body===void 0)&&(t.state===void 0||typeof t.state=="string")&&(r===void 0||Array.isArray(r)&&r.every(n=>typeof n=="string"?!0:Bc(n)&&typeof n.name=="string"))})}function $R(e){let t=e.labels?.map(s=>typeof s=="string"?s:s.name),{labels:r,...n}=e;return t===void 0?n:{...n,labels:t}}function Bc(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}var qc=T(()=>{"use strict";hh()});function yh(e){return async t=>MR(e.app,t,e.log!==void 0?{log:e.log}:{})}async function MR(e,t,r={}){let n=jR(t.path),s={"content-type":"application/json",...t.headers??{},[co]:Hc},i={method:t.method,headers:s};t.body!==void 0&&t.method!=="GET"&&t.method!=="DELETE"&&(i.body=typeof t.body=="string"?t.body:JSON.stringify(t.body));let o=new Request(n,i),a=Date.now();try{let l=await e.fetch(o),c=await DR(l);if(r.log!==void 0){let d=Date.now()-a;r.log(`[mailbox-dispatch] ${t.method} ${gh(t.path)} \u2192 ${c.status} (${d}ms)`)}return c}catch(l){if(r.log!==void 0){let c=Date.now()-a;r.log(`[mailbox-dispatch] ${t.method} ${gh(t.path)} \u2192 ERR (${c}ms)`)}throw l}}function gh(e){let t=e.startsWith("/")?e:`/${e}`,r=t.search(/[?#]/);return r===-1?t:t.slice(0,r)}function jR(e){let t=e.startsWith("/")?e:`/${e}`;return`${CR}${t}`}async function DR(e){let t=await e.text(),r;if(t==="")r=void 0;else try{r=JSON.parse(t)}catch{r=t}let n={};e.headers.forEach((i,o)=>{o.toLowerCase()!==co&&(n[o]=i)});let s={status:e.status};return Object.keys(n).length>0&&(s.headers=n),r!==void 0&&(s.body=r),s}var co,Hc,CR,Jc=T(()=>{"use strict";co="x-mailbox-channel",Hc="1",CR="http://mailbox.local"});import{createHash as wh,createHmac as PR,timingSafeEqual as FR}from"node:crypto";function Eh(){return async(e,t)=>{let r=Th();if(r===null||HR(e.req.path)){await t();return}if(e.req.path.startsWith("/mailbox/")&&e.req.header(co)===Hc){await t();return}let n=e.req.query("token");if(n!==void 0&&uo(n,r)){Gc(e,r),await t();return}if(qR(e,r)){await t();return}return e.req.path.startsWith("/api/")||e.req.path.startsWith("/mailbox/")?e.json({error:"API requires auth; set LMCTL_API_TOKEN"},401):e.redirect("/login",302)}}function Th(){let e=process.env.LMCTL_API_TOKEN;return e&&e.length>0?e:null}function bh(e){let t=Th();return t!==null&&uo(e,t)}function Gc(e,t,r=new Date){e.header("Set-Cookie",`${Xc}=${WR(t,r)}; Path=/; HttpOnly; SameSite=Lax`)}function Sh(e){e.header("Set-Cookie",`${Xc}=; Path=/; HttpOnly; SameSite=Lax; Max-Age=0`)}function WR(e,t=new Date){let n=`auth=ok|${new Date(t.getTime()+UR*24*60*60*1e3).toISOString()}`;return Buffer.from(`${n}|${vh(e,n)}`,"utf8").toString("base64url")}function BR(e,t,r=new Date){let n;try{n=Buffer.from(e,"base64url").toString("utf8")}catch{return!1}let s=n.split("|");if(s.length!==3||s[0]!=="auth=ok")return!1;let i=new Date(s[1]);return Number.isNaN(i.getTime())||i.getTime()<=r.getTime()?!1:uo(s[2],vh(t,`${s[0]}|${s[1]}`))}function uo(e,t){return FR(wh("sha256").update(e).digest(),wh("sha256").update(t).digest())}function qR(e,t){let r=/^Bearer\s+(.+)$/i.exec(e.req.header("authorization")??"")?.[1];if(r!==void 0&&uo(r,t))return!0;let n=JR(e.req.header("cookie")??"")[Xc];return n!==void 0&&BR(n,t)}function HR(e){return e==="/login"||e==="/logout"}function JR(e){let t={};for(let r of e.split(";")){let[n,...s]=r.trim().split("=");n===void 0||n.length===0||s.length===0||(t[n]=s.join("="))}return t}function vh(e,t){return PR("sha256",e).update(t).digest("hex")}var Xc,UR,kh=T(()=>{"use strict";Jc();Xc="lmctl_next_session",UR=30});import{existsSync as un,mkdirSync as XR,readdirSync as GR,readFileSync as fo,unlinkSync as VR,writeFileSync as Yc}from"node:fs";import{join as Cr}from"node:path";function et(e){if(!KR.test(e))throw new Error(`invalid memory name "${e}": only alphanumeric characters, underscores, and hyphens are allowed`)}function Nh(e,t){let r=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(r===null)return null;let n=r[1],s=r[2].trimStart(),i=n.match(/^type:\s*(.+)$/m),o=n.match(/^description:\s*(.+)$/m),a=i?.[1]?.trim()??"";return QR(a)?{name:e,type:a,description:o?.[1]?.trim()??null,body:s,created_at:Ih,updated_at:Ih}:null}function YR(e,t,r,n){let s=r!==null?`
1757
+ `)){let r=t.replace(/#.*/,"").trim();if(r.length!==0)return/^workflow\s+\S+\s+v\d+\s*$/.test(r)}return!1}function ct(e){if(typeof e=="string"&&hR()&&gR(e)){let r;try{r=ch(e)}catch(s){throw s instanceof dn?new Gt(s.issues.map(i=>({path:`dsl:${i.line}`,message:i.message}))):s}let n=It.safeParse(r);if(!n.success)throw new Gt(n.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));return n.data}let t=so(wR(e));if(ER(t)&&t.definition_schema_version===3){let r=It.safeParse(t);if(!r.success)throw new Gt(r.error.issues.map(n=>({path:n.path.length===0?"$":n.path.map(String).join("."),message:n.message})));return r.data}return yR(t)}function yR(e){let t=ro.safeParse(e);if(!t.success)throw new Gt(t.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));let r=t.data,n=new Set(["Task","Pause","Parallel","LoopUntil","Pass","Fail","Succeed"]);for(let[s,i]of Object.entries(r.states))if(n.has(i.type))throw new Gt([{path:`states.${s}`,message:`v2 workflows (primitive_version: 2) may not use v1 primitive type: ${i.type}`}]);try{return th(r)}catch(s){throw s instanceof Xt?new Dc(s):s}}function wR(e){if(typeof e!="string")return e;let t=e.trim();return e.includes(`
1758
+ `)||t.startsWith("{")||t.startsWith("[")?fh(e):t.endsWith(".json")?fh(_R(t,"utf8")):e}function fh(e){return JSON.parse(e)}function ER(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var Dc,Gt,cs=T(()=>{"use strict";ln();nh();jc();cn();uh();Dc=class extends Error{causeError;constructor(t){super("compiler emitted invalid atomic workflow"),this.causeError=t,this.name="CompilerInvariantError"}},Gt=class extends Error{issues;constructor(t){super("compound workflow validation failed"),this.issues=t,this.name="CompilerValidationError"}}});function io(e){let t=e.workflow?.concurrent_limit??1,r=e.job.concurrency_key_resolved??e.workflow?.concurrency_key??null;return r===null||r.trim().length===0?{concurrency_key:null,concurrent_limit:t}:{concurrency_key:TR(r,{job:{id:e.job.id,kind:e.job.source,source:e.job.source,source_ref:e.job.source_ref,payload:SR(e.job.payload)},project:e.project===null?null:{id:e.project.id,name:e.project.name}}),concurrent_limit:t}}function TR(e,t){return e.replace(/\{\{\s*([^}]+?)\s*\}\}/g,(r,n)=>{let s=bR(t,n.trim());return s==null?"":typeof s=="string"?s:typeof s=="number"||typeof s=="boolean"?String(s):JSON.stringify(s)})}function bR(e,t){let r=e;for(let n of t.split(".")){if(typeof r!="object"||r===null||!Object.prototype.hasOwnProperty.call(r,n))return;r=r[n]}return r}function SR(e){if(e===null||e.trim().length===0)return null;try{return JSON.parse(e)}catch{return e}}var Pc=T(()=>{"use strict"});var mh={};ye(mh,{enqueueFromAgentOutput:()=>kR,enqueueFromGitHubIssue:()=>Fc,enqueueManual:()=>vR,enqueueScheduled:()=>IR});function Fc(e,t){return ao(e,{project_id:t.project_id,workflow_id_override:t.workflow_id_override??null,source:"gh_issue",source_ref:t.issue_url,dedupe_key:t.dedupe_key??t.issue_url,payload:oo(t.payload),concurrency_key:t.concurrency_key,priority:t.priority})}function vR(e,t){return ao(e,{project_id:t.project_id,workflow_id_override:null,source:"manual",source_ref:t.source_ref??null,dedupe_key:t.source_ref??null,payload:oo(t.payload),concurrency_key:t.concurrency_key})}function kR(e,t){let r=t.sequence===void 0?`run:${t.parent_run_id}`:`run:${t.parent_run_id}:${t.sequence}`;return ao(e,{project_id:t.project_id,workflow_id_override:null,source:"agent_output",source_ref:r,dedupe_key:r,available_at:t.available_at,payload:oo(t.payload),concurrency_key:t.concurrency_key})}function IR(e,t){return ao(e,{project_id:t.project_id,workflow_id_override:null,source:"schedule",source_ref:t.source_ref,dedupe_key:t.source_ref,available_at:t.available_at,payload:oo(t.payload),concurrency_key:t.concurrency_key})}function oo(e){return e==null?null:typeof e=="string"?e:JSON.stringify(e)}function ao(e,t){let r=t.concurrency_key;if(r!==void 0)return e.enqueueJob({...t,concurrency_key:r});let n=e.getProject(t.project_id),s=n===null?null:t.workflow_id_override!==void 0&&t.workflow_id_override!==null?e.getWorkflow(t.workflow_id_override):e.getWorkflowByName(n.workflow_name);if(n===null||s===null)return e.enqueueJob(t);try{let i=ct(s.definition),o={id:-1,project_id:t.project_id,workflow_id_override:t.workflow_id_override??null,source:t.source,source_ref:t.source_ref??null,payload:t.payload??null,status:"queued",priority:t.priority??0,available_at:t.available_at??new Date().toISOString(),locked_by:null,locked_until:null,attempt_count:0,last_error:null,dedupe_key:t.dedupe_key??null,concurrency_key_resolved:null,enqueued_at:new Date().toISOString(),started_at:null,ended_at:null,run_id:null},a=io({workflow:i,job:o,project:n});return e.enqueueJob({...t,concurrency_key:a.concurrency_key})}catch{return e.enqueueJob(t)}}var Uc=T(()=>{"use strict";cs();Pc()});async function _h(e){let t=e.dal.listProjectWorkflows(e.project.id,{enabled_only:!0});if(t.length===0)return ph(e.dal,e.project.id,e.issue,e.issue.url,null,e.issue,void 0);let r={event:{kind:"github_issue",issue:e.issue}},n=[],s=0;for(let i of t){if(!await NR(i.condition,r))continue;let o=`${e.issue.url}#workflow:${i.workflow_id}`,a={issue:e.issue,...xR(i.parameters_override)},l=ph(e.dal,e.project.id,e.issue,o,i.workflow_id,a,-i.priority);n.push(...l.jobs),s+=l.new_jobs}return{jobs:n,new_jobs:s}}function ph(e,t,r,n,s,i,o){let a=e.findJobBySourceAndDedupe("gh_issue",n);return{jobs:[Fc(e,{project_id:t,issue_url:r.url,payload:i,workflow_id_override:s,dedupe_key:n,priority:o})],new_jobs:a===null?1:0}}async function NR(e,t){if(e===null||e.trim().length===0)return!0;try{return await $r(e,t)===!0}catch{return!1}}function xR(e){if(e===null||e.trim().length===0)return{};try{let t=JSON.parse(e);if(t!==null&&typeof t=="object"&&!Array.isArray(t))return t}catch{return{}}return{}}var hh=T(()=>{"use strict";as();Uc()});import{spawnSync as AR}from"node:child_process";async function RR(e){let t=e.labels??["bug"],r=e.state??"open",n=["issue","list","--repo",e.project.name,"--state",r,"--json","number,title,url,body,state,labels","--limit","100"];t.length>0&&n.splice(4,0,"--label",t.join(","));let s=AR(e.binary??"gh",n,{encoding:"utf8",timeout:e.timeoutMs??6e4,maxBuffer:10*1024*1024});if(s.error!==void 0)throw s.error;if(s.status!==0)throw new Error(`gh issue list failed: ${s.stderr??""}`.trim());let i;try{i=JSON.parse(s.stdout??"[]")}catch{throw new Error("gh issue list returned malformed JSON")}if(!OR(i))throw new Error("gh issue list returned unexpected JSON shape");let o=0;for(let a of i){let l=await _h({dal:e.dal,project:e.project,issue:$R(a)});o+=l.new_jobs}return{scanned:i.length,new_jobs:o}}async function lo(e){if(process.env.LMCTL_INTAKE_DISABLED==="1")return[];let t=[];for(let r of e.listProjectsWithIntakeEnabled()){let n=LR(r.intake_config);try{let s=await RR({dal:e,project:r,labels:n.labels,state:n.state});t.push({project_id:r.id,project_name:r.name,...s})}catch(s){let i=s instanceof Error?s.message:String(s);t.push({project_id:r.id,project_name:r.name,scanned:0,new_jobs:0,error:i});try{e.raiseAttention({kind:"daemon_intake_scan_failed",severity:"warn",project_id:r.id,payload:JSON.stringify({project_id:r.id,project_name:r.name,error:i})})}catch{}}}return t}function LR(e){if(e===null)return{};try{let t=JSON.parse(e);if(!Wc(t))return{};let r=t.state==="open"||t.state==="closed"||t.state==="all"?t.state:void 0,n=Array.isArray(t.labels)?t.labels.filter(s=>typeof s=="string"&&s.length>0):void 0;return{scan_github_issues:t.scan_github_issues===!0,labels:n,state:r}}catch{return{}}}function OR(e){return Array.isArray(e)&&e.every(t=>{if(!Wc(t))return!1;let r=t.labels;return typeof t.number=="number"&&typeof t.title=="string"&&typeof t.url=="string"&&(typeof t.body=="string"||t.body===null||t.body===void 0)&&(t.state===void 0||typeof t.state=="string")&&(r===void 0||Array.isArray(r)&&r.every(n=>typeof n=="string"?!0:Wc(n)&&typeof n.name=="string"))})}function $R(e){let t=e.labels?.map(s=>typeof s=="string"?s:s.name),{labels:r,...n}=e;return t===void 0?n:{...n,labels:t}}function Wc(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}var Bc=T(()=>{"use strict";hh()});function yh(e){return async t=>MR(e.app,t,e.log!==void 0?{log:e.log}:{})}async function MR(e,t,r={}){let n=jR(t.path),s={"content-type":"application/json",...t.headers??{},[co]:qc},i={method:t.method,headers:s};t.body!==void 0&&t.method!=="GET"&&t.method!=="DELETE"&&(i.body=typeof t.body=="string"?t.body:JSON.stringify(t.body));let o=new Request(n,i),a=Date.now();try{let l=await e.fetch(o),c=await DR(l);if(r.log!==void 0){let d=Date.now()-a;r.log(`[mailbox-dispatch] ${t.method} ${gh(t.path)} \u2192 ${c.status} (${d}ms)`)}return c}catch(l){if(r.log!==void 0){let c=Date.now()-a;r.log(`[mailbox-dispatch] ${t.method} ${gh(t.path)} \u2192 ERR (${c}ms)`)}throw l}}function gh(e){let t=e.startsWith("/")?e:`/${e}`,r=t.search(/[?#]/);return r===-1?t:t.slice(0,r)}function jR(e){let t=e.startsWith("/")?e:`/${e}`;return`${CR}${t}`}async function DR(e){let t=await e.text(),r;if(t==="")r=void 0;else try{r=JSON.parse(t)}catch{r=t}let n={};e.headers.forEach((i,o)=>{o.toLowerCase()!==co&&(n[o]=i)});let s={status:e.status};return Object.keys(n).length>0&&(s.headers=n),r!==void 0&&(s.body=r),s}var co,qc,CR,Hc=T(()=>{"use strict";co="x-mailbox-channel",qc="1",CR="http://mailbox.local"});import{createHash as wh,createHmac as PR,timingSafeEqual as FR}from"node:crypto";function Eh(){return async(e,t)=>{let r=Th();if(r===null||HR(e.req.path)){await t();return}if(e.req.path.startsWith("/mailbox/")&&e.req.header(co)===qc){await t();return}let n=e.req.query("token");if(n!==void 0&&uo(n,r)){Xc(e,r),await t();return}if(qR(e,r)){await t();return}return e.req.path.startsWith("/api/")||e.req.path.startsWith("/mailbox/")?e.json({error:"API requires auth; set LMCTL_API_TOKEN"},401):e.redirect("/login",302)}}function Th(){let e=process.env.LMCTL_API_TOKEN;return e&&e.length>0?e:null}function bh(e){let t=Th();return t!==null&&uo(e,t)}function Xc(e,t,r=new Date){e.header("Set-Cookie",`${Jc}=${WR(t,r)}; Path=/; HttpOnly; SameSite=Lax`)}function Sh(e){e.header("Set-Cookie",`${Jc}=; Path=/; HttpOnly; SameSite=Lax; Max-Age=0`)}function WR(e,t=new Date){let n=`auth=ok|${new Date(t.getTime()+UR*24*60*60*1e3).toISOString()}`;return Buffer.from(`${n}|${vh(e,n)}`,"utf8").toString("base64url")}function BR(e,t,r=new Date){let n;try{n=Buffer.from(e,"base64url").toString("utf8")}catch{return!1}let s=n.split("|");if(s.length!==3||s[0]!=="auth=ok")return!1;let i=new Date(s[1]);return Number.isNaN(i.getTime())||i.getTime()<=r.getTime()?!1:uo(s[2],vh(t,`${s[0]}|${s[1]}`))}function uo(e,t){return FR(wh("sha256").update(e).digest(),wh("sha256").update(t).digest())}function qR(e,t){let r=/^Bearer\s+(.+)$/i.exec(e.req.header("authorization")??"")?.[1];if(r!==void 0&&uo(r,t))return!0;let n=JR(e.req.header("cookie")??"")[Jc];return n!==void 0&&BR(n,t)}function HR(e){return e==="/login"||e==="/logout"}function JR(e){let t={};for(let r of e.split(";")){let[n,...s]=r.trim().split("=");n===void 0||n.length===0||s.length===0||(t[n]=s.join("="))}return t}function vh(e,t){return PR("sha256",e).update(t).digest("hex")}var Jc,UR,kh=T(()=>{"use strict";Hc();Jc="lmctl_next_session",UR=30});import{existsSync as un,mkdirSync as XR,readdirSync as GR,readFileSync as fo,unlinkSync as VR,writeFileSync as Kc}from"node:fs";import{join as Cr}from"node:path";function et(e){if(!KR.test(e))throw new Error(`invalid memory name "${e}": only alphanumeric characters, underscores, and hyphens are allowed`)}function Nh(e,t){let r=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(r===null)return null;let n=r[1],s=r[2].trimStart(),i=n.match(/^type:\s*(.+)$/m),o=n.match(/^description:\s*(.+)$/m),a=i?.[1]?.trim()??"";return QR(a)?{name:e,type:a,description:o?.[1]?.trim()??null,body:s,created_at:Ih,updated_at:Ih}:null}function YR(e,t,r,n){let s=r!==null?`
1759
1759
  description: ${r}`:"";return`---
1760
1760
  name: ${e}${s}
1761
1761
  type: ${t}
1762
1762
  ---
1763
- ${n}`}function zR(e,t,r,n){let s=Cr(e,zc),i=`- [${t}.md](${t}.md)${n!==null?` \u2014 ${n}`:""} (${r})`,o=un(s)?fo(s,"utf8"):"",a=new RegExp(`^- \\[${xh(t)}\\.md\\].*$`,"m");a.test(o)?o=o.replace(a,i):o=o.length>0&&!o.endsWith(`
1763
+ ${n}`}function zR(e,t,r,n){let s=Cr(e,Yc),i=`- [${t}.md](${t}.md)${n!==null?` \u2014 ${n}`:""} (${r})`,o=un(s)?fo(s,"utf8"):"",a=new RegExp(`^- \\[${xh(t)}\\.md\\].*$`,"m");a.test(o)?o=o.replace(a,i):o=o.length>0&&!o.endsWith(`
1764
1764
  `)?`${o}
1765
1765
  ${i}
1766
1766
  `:`${o}${i}
1767
- `,Yc(s,o,"utf8")}function ZR(e,t){let r=Cr(e,zc);if(!un(r))return;let n=fo(r,"utf8"),s=new RegExp(`^- \\[${xh(t)}\\.md\\].*$\\r?\\n?`,"m");s.test(n)&&Yc(r,n.replace(s,""),"utf8")}function xh(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function QR(e){return e==="user"||e==="feedback"||e==="project"||e==="reference"}function dt(e,t){return e.durable_memory_mode==="db"?new Kc(t,e.id):new Vc(e.local_path)}var KR,zc,Ih,Vc,Kc,Zc=T(()=>{"use strict";KR=/^[a-zA-Z0-9_-]+$/;zc="MEMORY.md",Ih="1970-01-01T00:00:00.000Z",Vc=class{dir;constructor(t){this.dir=Cr(t,"durable-memory")}read(t){et(t);let r=Cr(this.dir,`${t}.md`);if(!un(r))return null;let n=fo(r,"utf8");return Nh(t,n)}write(t){et(t.name),XR(this.dir,{recursive:!0});let r=Cr(this.dir,`${t.name}.md`),n=!un(r),s=YR(t.name,t.type,t.description??null,t.body);return Yc(r,s,"utf8"),zR(this.dir,t.name,t.type,t.description??null),{created:n}}index(t){return this.listFiles().filter(r=>t===void 0||t.length===0||t.includes(r.type)).map(({name:r,type:n,description:s,updated_at:i})=>({name:r,type:n,description:s,updated_at:i}))}list(t){return this.listFiles().filter(r=>t===void 0||r.type===t).map(({name:r,type:n,updated_at:s})=>({name:r,type:n,updated_at:s}))}delete(t){et(t);let r=Cr(this.dir,`${t}.md`);return un(r)?(VR(r),ZR(this.dir,t),!0):!1}listFiles(){if(!un(this.dir))return[];let t=GR(this.dir).filter(n=>n.endsWith(".md")&&n!==zc),r=[];for(let n of t){let s=n.slice(0,-3),i=fo(Cr(this.dir,n),"utf8"),o=Nh(s,i);o!==null&&r.push(o)}return r.sort((n,s)=>n.name.localeCompare(s.name))}};Kc=class{dal;projectId;constructor(t,r){this.dal=t,this.projectId=r}read(t){et(t);let r=this.dal.getDurableMemoryByName(this.projectId,t);return r===null?null:{name:r.name,type:r.type,description:r.description,body:r.body,created_at:r.created_at,updated_at:r.updated_at}}write(t){et(t.name);let r=this.dal.getDurableMemoryByName(this.projectId,t.name);return this.dal.upsertDurableMemory({project_id:this.projectId,type:t.type,name:t.name,description:t.description??null,body:t.body}),{created:r===null}}index(t){return this.dal.indexDurableMemory(this.projectId,t).map(n=>({name:n.name,type:n.type,description:n.description,updated_at:n.updated_at}))}list(t){return this.dal.listDurableMemory(this.projectId,t).map(n=>({name:n.name,type:n.type,updated_at:n.updated_at}))}delete(t){return et(t),this.dal.deleteDurableMemory(this.projectId,t)}}});function Rh(e,t){let{dal:r}=t;e.get("/api/durable-memory/index/:project_id",n=>{let s=Number(n.req.param("project_id")),i=r.getProject(s);if(i===null)return n.json({error:"project not found"},404);let o=dt(i,r),a=n.req.query("types"),l=a!==void 0&&a.length>0?a.split(",").map(c=>c.trim()).filter(Boolean):void 0;return n.json(o.index(l))}),e.get("/api/durable-memory/read/:project_id/:name",n=>{let s=Number(n.req.param("project_id")),i=n.req.param("name"),o=r.getProject(s);if(o===null)return n.json({error:"project not found"},404);let a=dt(o,r),l;try{l=a.read(i)}catch(c){return n.json({error:c.message},400)}return l===null?n.json({error:`memory entry not found: ${i}`},404):n.json(l)}),e.post("/api/durable-memory/write/:project_id",async n=>{let s=Number(n.req.param("project_id")),i=r.getProject(s);if(i===null)return n.json({error:"project not found"},404);let o;try{o=await n.req.json()}catch{return n.json({error:"invalid JSON body"},400)}let a=typeof o.type=="string"?o.type:null,l=typeof o.name=="string"?o.name:null,c=typeof o.body=="string"?o.body:null,d=typeof o.description=="string"?o.description:null;if(a===null||!Ah.has(a))return n.json({error:`invalid type: must be one of ${[...Ah].join("|")}`},400);if(l===null)return n.json({error:"missing name"},400);if(c===null)return n.json({error:"missing body"},400);let u=dt(i,r),f;try{({created:f}=u.write({type:a,name:l,description:d,body:c}))}catch(m){return n.json({error:m.message},400)}return n.json({success:!0,created_or_updated:f?"created":"updated"})}),e.get("/api/durable-memory/list/:project_id",n=>{let s=Number(n.req.param("project_id")),i=r.getProject(s);if(i===null)return n.json({error:"project not found"},404);let o=dt(i,r),a=n.req.query("type");return n.json(o.list(a))})}var Ah,Lh=T(()=>{"use strict";Zc();Ah=new Set(["user","feedback","project","reference"])});function tL(e){let t=4294967295;for(let r=0;r<e.length;r+=1)t=(eL[(t^e[r])&255]^t>>>8)>>>0;return(t^4294967295)>>>0}function rL(e){let t=Math.max(1980,e.getFullYear()),r=(e.getHours()&31)<<11|(e.getMinutes()&63)<<5|Math.floor(e.getSeconds()/2)&31,n=(t-1980&127)<<9|(e.getMonth()+1&15)<<5|e.getDate()&31;return{time:r,date:n}}function Oh(e,t=new Date){let{time:r,date:n}=rL(t),s=[],i=[],o=0,a=new TextEncoder;for(let _ of e){let g=a.encode(_.name),h=tL(_.data),S=_.data.length,y=new Uint8Array(30+g.length),w=new DataView(y.buffer);w.setUint32(0,67324752,!0),w.setUint16(4,20,!0),w.setUint16(6,0,!0),w.setUint16(8,0,!0),w.setUint16(10,r,!0),w.setUint16(12,n,!0),w.setUint32(14,h,!0),w.setUint32(18,S,!0),w.setUint32(22,S,!0),w.setUint16(26,g.length,!0),w.setUint16(28,0,!0),y.set(g,30),s.push(y,_.data);let I=new Uint8Array(46+g.length),x=new DataView(I.buffer);x.setUint32(0,33639248,!0),x.setUint16(4,20,!0),x.setUint16(6,20,!0),x.setUint16(8,0,!0),x.setUint16(10,0,!0),x.setUint16(12,r,!0),x.setUint16(14,n,!0),x.setUint32(16,h,!0),x.setUint32(20,S,!0),x.setUint32(24,S,!0),x.setUint16(28,g.length,!0),x.setUint16(30,0,!0),x.setUint16(32,0,!0),x.setUint16(34,0,!0),x.setUint16(36,0,!0),x.setUint32(38,0,!0),x.setUint32(42,o,!0),I.set(g,46),i.push(I),o+=y.length+_.data.length}let l=o,c=0;for(let _ of i)c+=_.length;let d=new Uint8Array(22),u=new DataView(d.buffer);u.setUint32(0,101010256,!0),u.setUint16(4,0,!0),u.setUint16(6,0,!0),u.setUint16(8,e.length,!0),u.setUint16(10,e.length,!0),u.setUint32(12,c,!0),u.setUint32(16,l,!0),u.setUint16(20,0,!0);let f=l+c+d.length,m=new Uint8Array(f),p=0;for(let _ of s)m.set(_,p),p+=_.length;for(let _ of i)m.set(_,p),p+=_.length;return m.set(d,p),m}var eL,$h=T(()=>{"use strict";eL=(()=>{let e=new Uint32Array(256);for(let t=0;t<256;t+=1){let r=t;for(let n=0;n<8;n+=1)r=r&1?3988292384^r>>>1:r>>>1;e[t]=r>>>0}return e})()});import{existsSync as _o,mkdirSync as nL,readdirSync as sL,readFileSync as jh,statSync as iL,unlinkSync as oL,writeFileSync as aL}from"node:fs";import{join as fs}from"node:path";function Dh(e,t){let{dal:r}=t;e.post("/api/projects",async n=>{let s=await ut(n);if(typeof s=="string")return R(n,s,400);let i=oe(s,"name"),o=oe(s,"local_path");if(i===null||i.length===0)return R(n,"missing or empty name",400);if(o===null||o.length===0)return R(n,"missing or empty local_path",400);if(r.findProjectByName(i)!==null)return R(n,`project already exists: ${i}`,409);let a=oe(s,"workflow_name")??"bugfix",l,c=oe(s,"team_name");if(c!==null&&c.length>0){let u=r.findTeamByName(c);if(u===null)return R(n,`team not found: ${c}`,404);l=u.id}else{let u=r.listTeams();if(u.length===0)return R(n,"no teams exist; create a team first",400);l=u[0].id}let d=r.insertProject({name:i,local_path:o,workflow_name:a,team_id:l,default_branch:oe(s,"default_branch")});return n.json(d,201)}),e.patch("/api/projects/:name",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=await ut(n);if(typeof i=="string")return R(n,i,400);let o={};if(Object.prototype.hasOwnProperty.call(i,"local_path")){let l=i.local_path;if(typeof l!="string"||l.length===0)return R(n,"local_path must be a non-empty string",400);o.local_path=l}if(Object.prototype.hasOwnProperty.call(i,"durable_memory_mode")){let l=i.durable_memory_mode;if(l!=="folder"&&l!=="db")return R(n,'durable_memory_mode must be "folder" or "db"',400);o.durable_memory_mode=l}if(Object.prototype.hasOwnProperty.call(i,"default_branch")){let l=i.default_branch;if(l!==null&&typeof l!="string")return R(n,"default_branch must be string or null",400);o.default_branch=l}if(Object.prototype.hasOwnProperty.call(i,"intake_config")){let l=i.intake_config;if(l===null)o.intake_config=null;else if(typeof l=="string")o.intake_config=l;else if(typeof l=="object"&&!Array.isArray(l))o.intake_config=JSON.stringify(l);else return R(n,"intake_config must be a JSON object, string, or null",400)}let a=r.updateProjectSettings(s.id,o);return a===null?R(n,"project not found",404):n.json(a)}),e.post("/api/teams",async n=>{let s=await ut(n);if(typeof s=="string")return R(n,s,400);let i=oe(s,"name");if(i===null||i.length===0)return R(n,"missing or empty name",400);if(r.findTeamByName(i)!==null)return R(n,`team already exists: ${i}`,409);let o=r.insertTeam({name:i});return n.json(o,201)}),e.post("/api/teams/:name/members",async n=>{let s=r.findTeamByName(n.req.param("name"));if(s===null)return R(n,"team not found",404);let i=await ut(n);if(typeof i=="string")return R(n,i,400);let o=oe(i,"alias"),a=oe(i,"provider");if(o===null||o.length===0)return R(n,"missing or empty alias",400);if(a===null||a.length===0)return R(n,"missing or empty provider",400);if(r.findTeamMemberByAlias(s.id,o)!==null)return R(n,`member already exists: ${o}`,409);let l=oe(i,"model"),c=r.insertTeamMember({team_id:s.id,alias:o,provider:a,model:l,sessiondir:`.lmctl/sessions/${s.name}/${o}`}),d=oe(i,"role_prompt");d!==null&&r.setMemberRolePrompt(c.id,d);let u=r.findTeamMemberByAlias(s.id,o);return n.json(u??c,201)}),e.put("/api/teams/:name/members/:alias",async n=>{let s=r.findTeamByName(n.req.param("name"));if(s===null)return R(n,"team not found",404);let i=r.findTeamMemberByAlias(s.id,n.req.param("alias"));if(i===null)return R(n,"member not found",404);let o=await ut(n);if(typeof o=="string")return R(n,o,400);let a={};if(Object.prototype.hasOwnProperty.call(o,"role_prompt")){let c=o.role_prompt;if(c!==null&&typeof c!="string")return R(n,"role_prompt must be string or null",400);a.role_prompt=c}if(Object.prototype.hasOwnProperty.call(o,"model")){let c=o.model;if(c!==null&&typeof c!="string")return R(n,"model must be string or null",400);a.model=c}if(Object.prototype.hasOwnProperty.call(o,"provider")){let c=o.provider;if(typeof c!="string"||c.length===0)return R(n,"provider must be a non-empty string",400);a.provider=c}if(Object.keys(a).length===0)return R(n,"no updatable fields provided",400);let l=r.updateTeamMemberMeta(i.id,a);return l===null?R(n,"member not found",404):n.json(l)}),e.get("/api/projects/:name/durable-memory",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=dt(s,r);return n.json(i.index())}),e.post("/api/projects/:name/durable-memory",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=await ut(n);if(typeof i=="string")return R(n,i,400);let o=oe(i,"name"),a=oe(i,"body"),l=oe(i,"type");if(o===null||o.length===0)return R(n,"missing or empty name",400);if(a===null)return R(n,"missing body",400);if(l===null||!mo.includes(l))return R(n,`invalid type: must be one of ${mo.join("|")}`,400);try{et(o)}catch(u){return R(n,u.message,400)}let c=dt(s,r);try{if(c.read(o)!==null)return R(n,`chapter already exists: ${o}`,409)}catch(u){return R(n,u.message,400)}try{c.write({type:l,name:o,description:oe(i,"description"),body:a})}catch(u){return R(n,u.message,400)}let d=c.read(o);return d===null?R(n,"chapter created but unreadable",500):n.json(d,201)}),e.get("/api/projects/:name/durable-memory/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=dt(s,r),o;try{o=i.read(n.req.param("chapter"))}catch(a){return R(n,a.message,400)}return o===null?R(n,"chapter not found",404):n.json(o)}),e.put("/api/projects/:name/durable-memory/:chapter",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=n.req.param("chapter"),o=await ut(n);if(typeof o=="string")return R(n,o,400);let a=dt(s,r),l;try{l=a.read(i)}catch(m){return R(n,m.message,400)}if(l===null)return R(n,"chapter not found",404);let c=oe(o,"body")??l.body,d=Object.prototype.hasOwnProperty.call(o,"description")?oe(o,"description"):l.description,u=oe(o,"type")??l.type;if(!mo.includes(u))return R(n,`invalid type: must be one of ${mo.join("|")}`,400);try{a.write({type:u,name:i,description:d,body:c})}catch(m){return R(n,m.message,400)}let f=a.read(i);return f===null?R(n,"chapter updated but unreadable",500):n.json(f)}),e.delete("/api/projects/:name/durable-memory/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=dt(s,r),o;try{o=i.delete(n.req.param("chapter"))}catch(a){return R(n,a.message,400)}return o?n.json({removed:!0}):R(n,"chapter not found",404)}),e.get("/api/projects/:name/ai-test",n=>{let s=r.findProjectByName(n.req.param("name"));return s===null?R(n,"project not found",404):n.json(cL(s.local_path))}),e.post("/api/projects/:name/ai-test",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=await ut(n);if(typeof i=="string")return R(n,i,400);let o=oe(i,"name"),a=oe(i,"body"),l=oe(i,"type");if(o===null||o.length===0)return R(n,"missing or empty name",400);if(a===null)return R(n,"missing body",400);if(l===null||!po.has(l))return R(n,`invalid type: must be one of ${[...po].join("|")}`,400);try{et(o)}catch(f){return R(n,f.message,400)}let c=ds(s.local_path),d=fs(c,`${o}.md`);if(_o(d))return R(n,`chapter already exists: ${o}`,409);nL(c,{recursive:!0}),Mh(d,o,l,oe(i,"description"),a);let u=us(c,o);return u===null?R(n,"chapter created but unreadable",500):n.json(u,201)}),e.get("/api/projects/:name/ai-test/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);try{et(n.req.param("chapter"))}catch(o){return R(n,o.message,400)}let i=us(ds(s.local_path),n.req.param("chapter"));return i===null?R(n,"chapter not found",404):n.json(i)}),e.put("/api/projects/:name/ai-test/:chapter",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=n.req.param("chapter");try{et(i)}catch(m){return R(n,m.message,400)}let o=ds(s.local_path),a=us(o,i);if(a===null)return R(n,"chapter not found",404);let l=await ut(n);if(typeof l=="string")return R(n,l,400);let c=oe(l,"body")??a.body,d=Object.prototype.hasOwnProperty.call(l,"description")?oe(l,"description"):a.description,u=oe(l,"type")??a.type;if(!po.has(u))return R(n,`invalid type: must be one of ${[...po].join("|")}`,400);Mh(fs(o,`${i}.md`),i,u,d,c);let f=us(o,i);return f===null?R(n,"chapter updated but unreadable",500):n.json(f)}),e.delete("/api/projects/:name/ai-test/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=n.req.param("chapter");try{et(i)}catch(a){return R(n,a.message,400)}let o=fs(ds(s.local_path),`${i}.md`);return _o(o)?(oL(o),n.json({removed:!0})):R(n,"chapter not found",404)}),e.get("/api/tokens",n=>n.json([])),e.post("/api/tokens",n=>R(n,"scoped-tokens table not yet migrated; see briefs/scoped-tokens-design.md",501)),e.get("/api/settings",n=>n.json({})),e.patch("/api/settings",async n=>{let s=await ut(n);return typeof s=="string"?R(n,s,400):n.json({accepted:s,note:"settings persistence not yet implemented"})}),e.get("/api/chat/sessions",n=>n.json(r.listChatbotSessions(Ch))),e.post("/api/chat/sessions",async n=>{let s=await lL(n);if(typeof s=="string")return R(n,s,400);let i=s!==null?oe(s,"title"):null,o=r.createChatbotSession(Ch,i);return n.json(o,201)}),e.get("/api/chat/sessions/:id/messages",n=>{let s=n.req.param("id");return r.getChatbotSession(s)===null?R(n,"chat session not found",404):n.json(r.listChatbotMessages(s))}),e.post("/api/chat/sessions/:id/messages",async n=>{let s=n.req.param("id");if(r.getChatbotSession(s)===null)return R(n,"chat session not found",404);let i=await ut(n);if(typeof i=="string")return R(n,i,400);let o=oe(i,"role"),a=oe(i,"content");if(o===null||o!=="user"&&o!=="assistant"&&o!=="tool")return R(n,"role must be one of user|assistant|tool",400);if(a===null)return R(n,"missing content",400);let l=r.appendChatbotMessage(s,o,a);return n.json(l,201)}),e.get("/api/runs/:id/artifacts.zip",n=>{let s=Number(n.req.param("id"));if(!Number.isInteger(s))return R(n,"invalid run id",400);if(r.getRun(s)===null)return R(n,"run not found",404);let o=Lr(r,s),a=[];for(let c of o){let d=uL(c),u=null;if(c.content!==null&&c.content!==void 0)u=new TextEncoder().encode(c.content);else if(c.path!==null&&c.path!==void 0)try{let f=jh(c.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);u=new Uint8Array(m)}catch{u=new Uint8Array(0)}u!==null&&a.push({name:d,data:u})}let l=Oh(a);return new Response(l,{status:200,headers:{"Content-Type":"application/zip","Content-Disposition":`attachment; filename="run-${s}-artifacts.zip"`,"Content-Length":String(l.byteLength)}})})}function R(e,t,r){return e.json({error:t},r)}async function ut(e){try{let t=await e.req.json();return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:"invalid JSON body"}catch{return"invalid JSON body"}}async function lL(e){let t=await e.req.text().catch(()=>"");if(t.trim().length===0)return null;try{let r=JSON.parse(t);return r!==null&&typeof r=="object"&&!Array.isArray(r)?r:"invalid JSON body"}catch{return"invalid JSON body"}}function oe(e,t){let r=e[t];return typeof r!="string"?null:r}function ds(e){return fs(e,"ai-test")}function us(e,t){let r=fs(e,`${t}.md`);if(!_o(r))return null;let n=jh(r,"utf8"),s=dL(n),i=iL(r).mtime.toISOString();return{name:t,type:s.type,description:s.description,body:s.body,updated_at:i}}function cL(e){let t=ds(e);return _o(t)?sL(t).filter(r=>r.endsWith(".md")&&r!=="index.md").map(r=>r.slice(0,-3)).sort().map(r=>{let n=us(t,r);if(n===null)return null;let{name:s,type:i,description:o,updated_at:a}=n;return{name:s,type:i,description:o,updated_at:a}}).filter(r=>r!==null):[]}function Mh(e,t,r,n,s){let i=n!==null&&n.length>0?`
1767
+ `,Kc(s,o,"utf8")}function ZR(e,t){let r=Cr(e,Yc);if(!un(r))return;let n=fo(r,"utf8"),s=new RegExp(`^- \\[${xh(t)}\\.md\\].*$\\r?\\n?`,"m");s.test(n)&&Kc(r,n.replace(s,""),"utf8")}function xh(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function QR(e){return e==="user"||e==="feedback"||e==="project"||e==="reference"}function dt(e,t){return e.durable_memory_mode==="db"?new Vc(t,e.id):new Gc(e.local_path)}var KR,Yc,Ih,Gc,Vc,zc=T(()=>{"use strict";KR=/^[a-zA-Z0-9_-]+$/;Yc="MEMORY.md",Ih="1970-01-01T00:00:00.000Z",Gc=class{dir;constructor(t){this.dir=Cr(t,"durable-memory")}read(t){et(t);let r=Cr(this.dir,`${t}.md`);if(!un(r))return null;let n=fo(r,"utf8");return Nh(t,n)}write(t){et(t.name),XR(this.dir,{recursive:!0});let r=Cr(this.dir,`${t.name}.md`),n=!un(r),s=YR(t.name,t.type,t.description??null,t.body);return Kc(r,s,"utf8"),zR(this.dir,t.name,t.type,t.description??null),{created:n}}index(t){return this.listFiles().filter(r=>t===void 0||t.length===0||t.includes(r.type)).map(({name:r,type:n,description:s,updated_at:i})=>({name:r,type:n,description:s,updated_at:i}))}list(t){return this.listFiles().filter(r=>t===void 0||r.type===t).map(({name:r,type:n,updated_at:s})=>({name:r,type:n,updated_at:s}))}delete(t){et(t);let r=Cr(this.dir,`${t}.md`);return un(r)?(VR(r),ZR(this.dir,t),!0):!1}listFiles(){if(!un(this.dir))return[];let t=GR(this.dir).filter(n=>n.endsWith(".md")&&n!==Yc),r=[];for(let n of t){let s=n.slice(0,-3),i=fo(Cr(this.dir,n),"utf8"),o=Nh(s,i);o!==null&&r.push(o)}return r.sort((n,s)=>n.name.localeCompare(s.name))}};Vc=class{dal;projectId;constructor(t,r){this.dal=t,this.projectId=r}read(t){et(t);let r=this.dal.getDurableMemoryByName(this.projectId,t);return r===null?null:{name:r.name,type:r.type,description:r.description,body:r.body,created_at:r.created_at,updated_at:r.updated_at}}write(t){et(t.name);let r=this.dal.getDurableMemoryByName(this.projectId,t.name);return this.dal.upsertDurableMemory({project_id:this.projectId,type:t.type,name:t.name,description:t.description??null,body:t.body}),{created:r===null}}index(t){return this.dal.indexDurableMemory(this.projectId,t).map(n=>({name:n.name,type:n.type,description:n.description,updated_at:n.updated_at}))}list(t){return this.dal.listDurableMemory(this.projectId,t).map(n=>({name:n.name,type:n.type,updated_at:n.updated_at}))}delete(t){return et(t),this.dal.deleteDurableMemory(this.projectId,t)}}});function Rh(e,t){let{dal:r}=t;e.get("/api/durable-memory/index/:project_id",n=>{let s=Number(n.req.param("project_id")),i=r.getProject(s);if(i===null)return n.json({error:"project not found"},404);let o=dt(i,r),a=n.req.query("types"),l=a!==void 0&&a.length>0?a.split(",").map(c=>c.trim()).filter(Boolean):void 0;return n.json(o.index(l))}),e.get("/api/durable-memory/read/:project_id/:name",n=>{let s=Number(n.req.param("project_id")),i=n.req.param("name"),o=r.getProject(s);if(o===null)return n.json({error:"project not found"},404);let a=dt(o,r),l;try{l=a.read(i)}catch(c){return n.json({error:c.message},400)}return l===null?n.json({error:`memory entry not found: ${i}`},404):n.json(l)}),e.post("/api/durable-memory/write/:project_id",async n=>{let s=Number(n.req.param("project_id")),i=r.getProject(s);if(i===null)return n.json({error:"project not found"},404);let o;try{o=await n.req.json()}catch{return n.json({error:"invalid JSON body"},400)}let a=typeof o.type=="string"?o.type:null,l=typeof o.name=="string"?o.name:null,c=typeof o.body=="string"?o.body:null,d=typeof o.description=="string"?o.description:null;if(a===null||!Ah.has(a))return n.json({error:`invalid type: must be one of ${[...Ah].join("|")}`},400);if(l===null)return n.json({error:"missing name"},400);if(c===null)return n.json({error:"missing body"},400);let u=dt(i,r),f;try{({created:f}=u.write({type:a,name:l,description:d,body:c}))}catch(m){return n.json({error:m.message},400)}return n.json({success:!0,created_or_updated:f?"created":"updated"})}),e.get("/api/durable-memory/list/:project_id",n=>{let s=Number(n.req.param("project_id")),i=r.getProject(s);if(i===null)return n.json({error:"project not found"},404);let o=dt(i,r),a=n.req.query("type");return n.json(o.list(a))})}var Ah,Lh=T(()=>{"use strict";zc();Ah=new Set(["user","feedback","project","reference"])});function tL(e){let t=4294967295;for(let r=0;r<e.length;r+=1)t=(eL[(t^e[r])&255]^t>>>8)>>>0;return(t^4294967295)>>>0}function rL(e){let t=Math.max(1980,e.getFullYear()),r=(e.getHours()&31)<<11|(e.getMinutes()&63)<<5|Math.floor(e.getSeconds()/2)&31,n=(t-1980&127)<<9|(e.getMonth()+1&15)<<5|e.getDate()&31;return{time:r,date:n}}function Oh(e,t=new Date){let{time:r,date:n}=rL(t),s=[],i=[],o=0,a=new TextEncoder;for(let _ of e){let g=a.encode(_.name),h=tL(_.data),S=_.data.length,y=new Uint8Array(30+g.length),w=new DataView(y.buffer);w.setUint32(0,67324752,!0),w.setUint16(4,20,!0),w.setUint16(6,0,!0),w.setUint16(8,0,!0),w.setUint16(10,r,!0),w.setUint16(12,n,!0),w.setUint32(14,h,!0),w.setUint32(18,S,!0),w.setUint32(22,S,!0),w.setUint16(26,g.length,!0),w.setUint16(28,0,!0),y.set(g,30),s.push(y,_.data);let I=new Uint8Array(46+g.length),x=new DataView(I.buffer);x.setUint32(0,33639248,!0),x.setUint16(4,20,!0),x.setUint16(6,20,!0),x.setUint16(8,0,!0),x.setUint16(10,0,!0),x.setUint16(12,r,!0),x.setUint16(14,n,!0),x.setUint32(16,h,!0),x.setUint32(20,S,!0),x.setUint32(24,S,!0),x.setUint16(28,g.length,!0),x.setUint16(30,0,!0),x.setUint16(32,0,!0),x.setUint16(34,0,!0),x.setUint16(36,0,!0),x.setUint32(38,0,!0),x.setUint32(42,o,!0),I.set(g,46),i.push(I),o+=y.length+_.data.length}let l=o,c=0;for(let _ of i)c+=_.length;let d=new Uint8Array(22),u=new DataView(d.buffer);u.setUint32(0,101010256,!0),u.setUint16(4,0,!0),u.setUint16(6,0,!0),u.setUint16(8,e.length,!0),u.setUint16(10,e.length,!0),u.setUint32(12,c,!0),u.setUint32(16,l,!0),u.setUint16(20,0,!0);let f=l+c+d.length,m=new Uint8Array(f),p=0;for(let _ of s)m.set(_,p),p+=_.length;for(let _ of i)m.set(_,p),p+=_.length;return m.set(d,p),m}var eL,$h=T(()=>{"use strict";eL=(()=>{let e=new Uint32Array(256);for(let t=0;t<256;t+=1){let r=t;for(let n=0;n<8;n+=1)r=r&1?3988292384^r>>>1:r>>>1;e[t]=r>>>0}return e})()});import{existsSync as _o,mkdirSync as nL,readdirSync as sL,readFileSync as jh,statSync as iL,unlinkSync as oL,writeFileSync as aL}from"node:fs";import{join as fs}from"node:path";function Dh(e,t){let{dal:r}=t;e.post("/api/projects",async n=>{let s=await ut(n);if(typeof s=="string")return R(n,s,400);let i=oe(s,"name"),o=oe(s,"local_path");if(i===null||i.length===0)return R(n,"missing or empty name",400);if(o===null||o.length===0)return R(n,"missing or empty local_path",400);if(r.findProjectByName(i)!==null)return R(n,`project already exists: ${i}`,409);let a=oe(s,"workflow_name")??"bugfix",l,c=oe(s,"team_name");if(c!==null&&c.length>0){let u=r.findTeamByName(c);if(u===null)return R(n,`team not found: ${c}`,404);l=u.id}else{let u=r.listTeams();if(u.length===0)return R(n,"no teams exist; create a team first",400);l=u[0].id}let d=r.insertProject({name:i,local_path:o,workflow_name:a,team_id:l,default_branch:oe(s,"default_branch")});return n.json(d,201)}),e.patch("/api/projects/:name",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=await ut(n);if(typeof i=="string")return R(n,i,400);let o={};if(Object.prototype.hasOwnProperty.call(i,"local_path")){let l=i.local_path;if(typeof l!="string"||l.length===0)return R(n,"local_path must be a non-empty string",400);o.local_path=l}if(Object.prototype.hasOwnProperty.call(i,"durable_memory_mode")){let l=i.durable_memory_mode;if(l!=="folder"&&l!=="db")return R(n,'durable_memory_mode must be "folder" or "db"',400);o.durable_memory_mode=l}if(Object.prototype.hasOwnProperty.call(i,"default_branch")){let l=i.default_branch;if(l!==null&&typeof l!="string")return R(n,"default_branch must be string or null",400);o.default_branch=l}if(Object.prototype.hasOwnProperty.call(i,"intake_config")){let l=i.intake_config;if(l===null)o.intake_config=null;else if(typeof l=="string")o.intake_config=l;else if(typeof l=="object"&&!Array.isArray(l))o.intake_config=JSON.stringify(l);else return R(n,"intake_config must be a JSON object, string, or null",400)}let a=r.updateProjectSettings(s.id,o);return a===null?R(n,"project not found",404):n.json(a)}),e.post("/api/teams",async n=>{let s=await ut(n);if(typeof s=="string")return R(n,s,400);let i=oe(s,"name");if(i===null||i.length===0)return R(n,"missing or empty name",400);if(r.findTeamByName(i)!==null)return R(n,`team already exists: ${i}`,409);let o=r.insertTeam({name:i});return n.json(o,201)}),e.post("/api/teams/:name/members",async n=>{let s=r.findTeamByName(n.req.param("name"));if(s===null)return R(n,"team not found",404);let i=await ut(n);if(typeof i=="string")return R(n,i,400);let o=oe(i,"alias"),a=oe(i,"provider");if(o===null||o.length===0)return R(n,"missing or empty alias",400);if(a===null||a.length===0)return R(n,"missing or empty provider",400);if(r.findTeamMemberByAlias(s.id,o)!==null)return R(n,`member already exists: ${o}`,409);let l=oe(i,"model"),c=r.insertTeamMember({team_id:s.id,alias:o,provider:a,model:l,sessiondir:`.lmctl/sessions/${s.name}/${o}`}),d=oe(i,"role_prompt");d!==null&&r.setMemberRolePrompt(c.id,d);let u=r.findTeamMemberByAlias(s.id,o);return n.json(u??c,201)}),e.put("/api/teams/:name/members/:alias",async n=>{let s=r.findTeamByName(n.req.param("name"));if(s===null)return R(n,"team not found",404);let i=r.findTeamMemberByAlias(s.id,n.req.param("alias"));if(i===null)return R(n,"member not found",404);let o=await ut(n);if(typeof o=="string")return R(n,o,400);let a={};if(Object.prototype.hasOwnProperty.call(o,"role_prompt")){let c=o.role_prompt;if(c!==null&&typeof c!="string")return R(n,"role_prompt must be string or null",400);a.role_prompt=c}if(Object.prototype.hasOwnProperty.call(o,"model")){let c=o.model;if(c!==null&&typeof c!="string")return R(n,"model must be string or null",400);a.model=c}if(Object.prototype.hasOwnProperty.call(o,"provider")){let c=o.provider;if(typeof c!="string"||c.length===0)return R(n,"provider must be a non-empty string",400);a.provider=c}if(Object.keys(a).length===0)return R(n,"no updatable fields provided",400);let l=r.updateTeamMemberMeta(i.id,a);return l===null?R(n,"member not found",404):n.json(l)}),e.get("/api/projects/:name/durable-memory",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=dt(s,r);return n.json(i.index())}),e.post("/api/projects/:name/durable-memory",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=await ut(n);if(typeof i=="string")return R(n,i,400);let o=oe(i,"name"),a=oe(i,"body"),l=oe(i,"type");if(o===null||o.length===0)return R(n,"missing or empty name",400);if(a===null)return R(n,"missing body",400);if(l===null||!mo.includes(l))return R(n,`invalid type: must be one of ${mo.join("|")}`,400);try{et(o)}catch(u){return R(n,u.message,400)}let c=dt(s,r);try{if(c.read(o)!==null)return R(n,`chapter already exists: ${o}`,409)}catch(u){return R(n,u.message,400)}try{c.write({type:l,name:o,description:oe(i,"description"),body:a})}catch(u){return R(n,u.message,400)}let d=c.read(o);return d===null?R(n,"chapter created but unreadable",500):n.json(d,201)}),e.get("/api/projects/:name/durable-memory/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=dt(s,r),o;try{o=i.read(n.req.param("chapter"))}catch(a){return R(n,a.message,400)}return o===null?R(n,"chapter not found",404):n.json(o)}),e.put("/api/projects/:name/durable-memory/:chapter",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=n.req.param("chapter"),o=await ut(n);if(typeof o=="string")return R(n,o,400);let a=dt(s,r),l;try{l=a.read(i)}catch(m){return R(n,m.message,400)}if(l===null)return R(n,"chapter not found",404);let c=oe(o,"body")??l.body,d=Object.prototype.hasOwnProperty.call(o,"description")?oe(o,"description"):l.description,u=oe(o,"type")??l.type;if(!mo.includes(u))return R(n,`invalid type: must be one of ${mo.join("|")}`,400);try{a.write({type:u,name:i,description:d,body:c})}catch(m){return R(n,m.message,400)}let f=a.read(i);return f===null?R(n,"chapter updated but unreadable",500):n.json(f)}),e.delete("/api/projects/:name/durable-memory/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=dt(s,r),o;try{o=i.delete(n.req.param("chapter"))}catch(a){return R(n,a.message,400)}return o?n.json({removed:!0}):R(n,"chapter not found",404)}),e.get("/api/projects/:name/ai-test",n=>{let s=r.findProjectByName(n.req.param("name"));return s===null?R(n,"project not found",404):n.json(cL(s.local_path))}),e.post("/api/projects/:name/ai-test",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=await ut(n);if(typeof i=="string")return R(n,i,400);let o=oe(i,"name"),a=oe(i,"body"),l=oe(i,"type");if(o===null||o.length===0)return R(n,"missing or empty name",400);if(a===null)return R(n,"missing body",400);if(l===null||!po.has(l))return R(n,`invalid type: must be one of ${[...po].join("|")}`,400);try{et(o)}catch(f){return R(n,f.message,400)}let c=ds(s.local_path),d=fs(c,`${o}.md`);if(_o(d))return R(n,`chapter already exists: ${o}`,409);nL(c,{recursive:!0}),Mh(d,o,l,oe(i,"description"),a);let u=us(c,o);return u===null?R(n,"chapter created but unreadable",500):n.json(u,201)}),e.get("/api/projects/:name/ai-test/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);try{et(n.req.param("chapter"))}catch(o){return R(n,o.message,400)}let i=us(ds(s.local_path),n.req.param("chapter"));return i===null?R(n,"chapter not found",404):n.json(i)}),e.put("/api/projects/:name/ai-test/:chapter",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=n.req.param("chapter");try{et(i)}catch(m){return R(n,m.message,400)}let o=ds(s.local_path),a=us(o,i);if(a===null)return R(n,"chapter not found",404);let l=await ut(n);if(typeof l=="string")return R(n,l,400);let c=oe(l,"body")??a.body,d=Object.prototype.hasOwnProperty.call(l,"description")?oe(l,"description"):a.description,u=oe(l,"type")??a.type;if(!po.has(u))return R(n,`invalid type: must be one of ${[...po].join("|")}`,400);Mh(fs(o,`${i}.md`),i,u,d,c);let f=us(o,i);return f===null?R(n,"chapter updated but unreadable",500):n.json(f)}),e.delete("/api/projects/:name/ai-test/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=n.req.param("chapter");try{et(i)}catch(a){return R(n,a.message,400)}let o=fs(ds(s.local_path),`${i}.md`);return _o(o)?(oL(o),n.json({removed:!0})):R(n,"chapter not found",404)}),e.get("/api/tokens",n=>n.json([])),e.post("/api/tokens",n=>R(n,"scoped-tokens table not yet migrated; see briefs/scoped-tokens-design.md",501)),e.get("/api/settings",n=>n.json({})),e.patch("/api/settings",async n=>{let s=await ut(n);return typeof s=="string"?R(n,s,400):n.json({accepted:s,note:"settings persistence not yet implemented"})}),e.get("/api/chat/sessions",n=>n.json(r.listChatbotSessions(Ch))),e.post("/api/chat/sessions",async n=>{let s=await lL(n);if(typeof s=="string")return R(n,s,400);let i=s!==null?oe(s,"title"):null,o=r.createChatbotSession(Ch,i);return n.json(o,201)}),e.get("/api/chat/sessions/:id/messages",n=>{let s=n.req.param("id");return r.getChatbotSession(s)===null?R(n,"chat session not found",404):n.json(r.listChatbotMessages(s))}),e.post("/api/chat/sessions/:id/messages",async n=>{let s=n.req.param("id");if(r.getChatbotSession(s)===null)return R(n,"chat session not found",404);let i=await ut(n);if(typeof i=="string")return R(n,i,400);let o=oe(i,"role"),a=oe(i,"content");if(o===null||o!=="user"&&o!=="assistant"&&o!=="tool")return R(n,"role must be one of user|assistant|tool",400);if(a===null)return R(n,"missing content",400);let l=r.appendChatbotMessage(s,o,a);return n.json(l,201)}),e.get("/api/runs/:id/artifacts.zip",n=>{let s=Number(n.req.param("id"));if(!Number.isInteger(s))return R(n,"invalid run id",400);if(r.getRun(s)===null)return R(n,"run not found",404);let o=Lr(r,s),a=[];for(let c of o){let d=uL(c),u=null;if(c.content!==null&&c.content!==void 0)u=new TextEncoder().encode(c.content);else if(c.path!==null&&c.path!==void 0)try{let f=jh(c.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);u=new Uint8Array(m)}catch{u=new Uint8Array(0)}u!==null&&a.push({name:d,data:u})}let l=Oh(a);return new Response(l,{status:200,headers:{"Content-Type":"application/zip","Content-Disposition":`attachment; filename="run-${s}-artifacts.zip"`,"Content-Length":String(l.byteLength)}})})}function R(e,t,r){return e.json({error:t},r)}async function ut(e){try{let t=await e.req.json();return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:"invalid JSON body"}catch{return"invalid JSON body"}}async function lL(e){let t=await e.req.text().catch(()=>"");if(t.trim().length===0)return null;try{let r=JSON.parse(t);return r!==null&&typeof r=="object"&&!Array.isArray(r)?r:"invalid JSON body"}catch{return"invalid JSON body"}}function oe(e,t){let r=e[t];return typeof r!="string"?null:r}function ds(e){return fs(e,"ai-test")}function us(e,t){let r=fs(e,`${t}.md`);if(!_o(r))return null;let n=jh(r,"utf8"),s=dL(n),i=iL(r).mtime.toISOString();return{name:t,type:s.type,description:s.description,body:s.body,updated_at:i}}function cL(e){let t=ds(e);return _o(t)?sL(t).filter(r=>r.endsWith(".md")&&r!=="index.md").map(r=>r.slice(0,-3)).sort().map(r=>{let n=us(t,r);if(n===null)return null;let{name:s,type:i,description:o,updated_at:a}=n;return{name:s,type:i,description:o,updated_at:a}}).filter(r=>r!==null):[]}function Mh(e,t,r,n,s){let i=n!==null&&n.length>0?`
1768
1768
  description: ${n}`:"",o=`---
1769
1769
  name: ${t}${i}
1770
1770
  type: ${r}
1771
1771
  ---
1772
- ${s}`;aL(e,o,"utf8")}function dL(e){let t=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(t===null)return{type:"scenario",description:null,body:e};let r=t[1],n=t[2].trimStart(),s=r.match(/^type:\s*(.+)$/m),i=r.match(/^description:\s*(.+)$/m);return{type:s?.[1]?.trim()??"scenario",description:i?.[1]?.trim()??null,body:n}}function uL(e){let t=e.state_name.replace(/[^a-zA-Z0-9_-]+/g,"_"),r=e.kind.replace(/[^a-zA-Z0-9_-]+/g,"_"),n=e.path!==null?fL(e.path):mL(e.kind);return`step-${e.step_id}-${t}/${e.id}-${r}${n}`}function fL(e){let t=e.lastIndexOf(".");if(t<0)return"";let r=e.slice(t);return/^\.[A-Za-z0-9]+$/.test(r)?r:""}function mL(e){return e.endsWith("_md")||e.includes("markdown")?".md":e.endsWith("_json")||e.includes("json")?".json":".txt"}var mo,po,Ch,Ph=T(()=>{"use strict";Jt();$h();Zc();mo=["user","feedback","project","reference"],po=new Set(["smoke","integration","vision","scenario","regression"]),Ch="operator"});function Ae(e,t){return`<!doctype html>
1772
+ ${s}`;aL(e,o,"utf8")}function dL(e){let t=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(t===null)return{type:"scenario",description:null,body:e};let r=t[1],n=t[2].trimStart(),s=r.match(/^type:\s*(.+)$/m),i=r.match(/^description:\s*(.+)$/m);return{type:s?.[1]?.trim()??"scenario",description:i?.[1]?.trim()??null,body:n}}function uL(e){let t=e.state_name.replace(/[^a-zA-Z0-9_-]+/g,"_"),r=e.kind.replace(/[^a-zA-Z0-9_-]+/g,"_"),n=e.path!==null?fL(e.path):mL(e.kind);return`step-${e.step_id}-${t}/${e.id}-${r}${n}`}function fL(e){let t=e.lastIndexOf(".");if(t<0)return"";let r=e.slice(t);return/^\.[A-Za-z0-9]+$/.test(r)?r:""}function mL(e){return e.endsWith("_md")||e.includes("markdown")?".md":e.endsWith("_json")||e.includes("json")?".json":".txt"}var mo,po,Ch,Ph=T(()=>{"use strict";Jt();$h();zc();mo=["user","feedback","project","reference"],po=new Set(["smoke","integration","vision","scenario","regression"]),Ch="operator"});function Ae(e,t){return`<!doctype html>
1773
1773
  <html lang="en">
1774
1774
  <head>
1775
1775
  <meta charset="utf-8">
@@ -1830,23 +1830,23 @@ ${s}`;aL(e,o,"utf8")}function dL(e){let t=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r
1830
1830
  </nav>
1831
1831
  <main>${t}</main>
1832
1832
  </body>
1833
- </html>`}function b(e){return String(e??"").replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&#39;")}function me(e,t){let r=e.map(s=>`<th>${b(s)}</th>`).join(""),n=t.length===0?`<tr><td colspan="${e.length}"><span class="muted">(empty)</span></td></tr>`:t.map(s=>`<tr>${s.map(i=>`<td>${i}</td>`).join("")}</tr>`).join("");return`<table><thead><tr>${r}</tr></thead><tbody>${n}</tbody></table>`}function de(e){return`<pre>${b(JSON.stringify(e,null,2))}</pre>`}var Qc=T(()=>{"use strict"});import{createHash as pL}from"node:crypto";import{existsSync as ms,mkdirSync as Uh,readFileSync as ps,readdirSync as _L,renameSync as hL,statSync as gL,unlinkSync as yL,writeFileSync as ho}from"node:fs";import{homedir as wL}from"node:os";import{dirname as ed,isAbsolute as Fh,join as ft,relative as EL,resolve as fn}from"node:path";import{fileURLToPath as TL}from"node:url";function Bh(e){let t=fn(e);for(;;){let r=ft(t,td);try{if(gL(r).isDirectory())return r}catch{}let n=ed(t);if(n===t)return null;t=n}}function rd(e=process.cwd()){let t=process.env.LMCTL_HOME;if(t!==void 0&&t.trim().length>0)return fn(t);let r=Bh(e);return r!==null?r:ft(Wh(),td)}function qh(){return fn(ed(TL(import.meta.url)),"..","..","workflows")}function bL(e){let t=ft(e,Hh);try{let r=JSON.parse(ps(t,"utf8"));if(r&&typeof r=="object"&&r.files&&typeof r.files=="object")return{version:String(r.version??""),files:r.files}}catch{}return{version:"",files:{}}}function SL(e,t){Uh(e,{recursive:!0});let r=ft(e,Hh),n=`${r}.tmp-${process.pid}`;ho(n,`${JSON.stringify(t,null,2)}
1834
- `,"utf8"),hL(n,r)}function vL(e){if(typeof e=="object"&&e!==null&&"code"in e){let t=e.code;if(typeof t=="string")return t}}function kL(e,t,r,n,s){let i=`${t}.dist-${r}`;for(let o=0;o<1e3;o+=1){let a=o===0?i:`${i}-${o}`,l=ft(e,a);try{return ho(l,n,{flag:"wx"}),a}catch(c){if(vL(c)!=="EEXIST")throw c;if(go(ps(l))===s)return a}}throw new Error(`could not find available dist shadow path for ${t}`)}function IL(e,t){if(Fh(t)||ed(t)!=="workflows")return null;let r=t.slice(10);if(r.length===0||r.includes("/")||r.includes("\\")||r.includes(".."))return null;let n=fn(e,"templates","workflows"),s=fn(e,"templates",t),i=EL(n,s);return i.length===0||i.startsWith("..")||Fh(i)||i.includes("/")||i.includes("\\")?null:s}function NL(e,t,r){for(let[n,s]of Object.entries(t.files)){if(r.has(n))continue;let i=IL(e,n);if(i===null){delete t.files[n];continue}if(!ms(i)){delete t.files[n];continue}try{if(go(ps(i))!==s)continue;yL(i),delete t.files[n]}catch{}}}function Jh(e={}){let t=rd(e.cwd),r=ft(t,"templates","workflows"),n=qh(),s={basedir:t,copied:[],refreshed:[],preserved:[],shadowed:[]};try{let i=ms(n)?_L(n).filter(c=>c.endsWith(".compound.json")||c.endsWith(".lmctl")||c==="index.jsonl"):[];if(i.length===0)return s;Uh(r,{recursive:!0});let o=bL(t),a=yt(),l=new Set(i.map(c=>`workflows/${c}`));for(let c of i){let d=`workflows/${c}`,u=ps(ft(n,c)),f=go(u),m=ft(r,c);if(!ms(m)){try{ho(m,u,{flag:"wx"}),s.copied.push(c)}catch{}o.files[d]=f;continue}let p=go(ps(m));if(p===f){o.files[d]=f;continue}let _=o.files[d];if(_!==void 0&&p===_)ho(m,u),o.files[d]=f,s.refreshed.push(c);else{let g=kL(r,c,a,u,f);s.preserved.push(c),s.shadowed.push(g)}}NL(t,o,l),SL(t,{version:a,files:o.files})}catch(i){if(e.swallow!==!0)throw i}return s}function nd(e){let t=[],r=process.env.LMCTL_HOME;r!==void 0&&r.trim().length>0&&t.push(fn(r));let n=Bh(e??process.cwd());return n!==null&&t.push(n),t.push(ft(Wh(),td)),t}function yo(e,t){let r=nd(t),n=[`${e}.compound.json`,`${e}.lmctl`];for(let s of r)for(let i of n){let o=ft(s,"templates","workflows",i);if(ms(o))return o}for(let s of n){let i=ft(qh(),s);if(ms(i))return i}return null}var td,Wh,go,Hh,sd=T(()=>{"use strict";Fn();td=".lmctl",Wh=()=>process.env.HOME??wL(),go=e=>pL("sha256").update(e).digest("hex");Hh=".dist-manifest.json"});function Xh(e,t){if(t.query(`SELECT sa.id FROM step_artifact sa
1833
+ </html>`}function b(e){return String(e??"").replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&#39;")}function me(e,t){let r=e.map(s=>`<th>${b(s)}</th>`).join(""),n=t.length===0?`<tr><td colspan="${e.length}"><span class="muted">(empty)</span></td></tr>`:t.map(s=>`<tr>${s.map(i=>`<td>${i}</td>`).join("")}</tr>`).join("");return`<table><thead><tr>${r}</tr></thead><tbody>${n}</tbody></table>`}function de(e){return`<pre>${b(JSON.stringify(e,null,2))}</pre>`}var Zc=T(()=>{"use strict"});import{createHash as pL}from"node:crypto";import{existsSync as ms,mkdirSync as Uh,readFileSync as ps,readdirSync as _L,renameSync as hL,statSync as gL,unlinkSync as yL,writeFileSync as ho}from"node:fs";import{homedir as wL}from"node:os";import{dirname as Qc,isAbsolute as Fh,join as ft,relative as EL,resolve as fn}from"node:path";import{fileURLToPath as TL}from"node:url";function Bh(e){let t=fn(e);for(;;){let r=ft(t,ed);try{if(gL(r).isDirectory())return r}catch{}let n=Qc(t);if(n===t)return null;t=n}}function td(e=process.cwd()){let t=process.env.LMCTL_HOME;if(t!==void 0&&t.trim().length>0)return fn(t);let r=Bh(e);return r!==null?r:ft(Wh(),ed)}function qh(){return fn(Qc(TL(import.meta.url)),"..","..","workflows")}function bL(e){let t=ft(e,Hh);try{let r=JSON.parse(ps(t,"utf8"));if(r&&typeof r=="object"&&r.files&&typeof r.files=="object")return{version:String(r.version??""),files:r.files}}catch{}return{version:"",files:{}}}function SL(e,t){Uh(e,{recursive:!0});let r=ft(e,Hh),n=`${r}.tmp-${process.pid}`;ho(n,`${JSON.stringify(t,null,2)}
1834
+ `,"utf8"),hL(n,r)}function vL(e){if(typeof e=="object"&&e!==null&&"code"in e){let t=e.code;if(typeof t=="string")return t}}function kL(e,t,r,n,s){let i=`${t}.dist-${r}`;for(let o=0;o<1e3;o+=1){let a=o===0?i:`${i}-${o}`,l=ft(e,a);try{return ho(l,n,{flag:"wx"}),a}catch(c){if(vL(c)!=="EEXIST")throw c;if(go(ps(l))===s)return a}}throw new Error(`could not find available dist shadow path for ${t}`)}function IL(e,t){if(Fh(t)||Qc(t)!=="workflows")return null;let r=t.slice(10);if(r.length===0||r.includes("/")||r.includes("\\")||r.includes(".."))return null;let n=fn(e,"templates","workflows"),s=fn(e,"templates",t),i=EL(n,s);return i.length===0||i.startsWith("..")||Fh(i)||i.includes("/")||i.includes("\\")?null:s}function NL(e,t,r){for(let[n,s]of Object.entries(t.files)){if(r.has(n))continue;let i=IL(e,n);if(i===null){delete t.files[n];continue}if(!ms(i)){delete t.files[n];continue}try{if(go(ps(i))!==s)continue;yL(i),delete t.files[n]}catch{}}}function Jh(e={}){let t=td(e.cwd),r=ft(t,"templates","workflows"),n=qh(),s={basedir:t,copied:[],refreshed:[],preserved:[],shadowed:[]};try{let i=ms(n)?_L(n).filter(c=>c.endsWith(".compound.json")||c.endsWith(".lmctl")||c==="index.jsonl"):[];if(i.length===0)return s;Uh(r,{recursive:!0});let o=bL(t),a=yt(),l=new Set(i.map(c=>`workflows/${c}`));for(let c of i){let d=`workflows/${c}`,u=ps(ft(n,c)),f=go(u),m=ft(r,c);if(!ms(m)){try{ho(m,u,{flag:"wx"}),s.copied.push(c)}catch{}o.files[d]=f;continue}let p=go(ps(m));if(p===f){o.files[d]=f;continue}let _=o.files[d];if(_!==void 0&&p===_)ho(m,u),o.files[d]=f,s.refreshed.push(c);else{let g=kL(r,c,a,u,f);s.preserved.push(c),s.shadowed.push(g)}}NL(t,o,l),SL(t,{version:a,files:o.files})}catch(i){if(e.swallow!==!0)throw i}return s}function rd(e){let t=[],r=process.env.LMCTL_HOME;r!==void 0&&r.trim().length>0&&t.push(fn(r));let n=Bh(e??process.cwd());return n!==null&&t.push(n),t.push(ft(Wh(),ed)),t}function yo(e,t){let r=rd(t),n=[`${e}.compound.json`,`${e}.lmctl`];for(let s of r)for(let i of n){let o=ft(s,"templates","workflows",i);if(ms(o))return o}for(let s of n){let i=ft(qh(),s);if(ms(i))return i}return null}var ed,Wh,go,Hh,nd=T(()=>{"use strict";Fn();ed=".lmctl",Wh=()=>process.env.HOME??wL(),go=e=>pL("sha256").update(e).digest("hex");Hh=".dist-manifest.json"});function Xh(e,t){if(t.query(`SELECT sa.id FROM step_artifact sa
1835
1835
  JOIN step s ON s.id = sa.step_id
1836
1836
  WHERE s.run_id = ? AND sa.kind = 'run_report' LIMIT 1`,e).length>0)return;let n=t.getRun(e);if(n===null)return;let s=t.query("SELECT id FROM step WHERE run_id = ? ORDER BY id DESC LIMIT 1",e);if(s.length===0)return;let i=s[0].id,o=t.query("SELECT id, state_name, outcome, started_at, ended_at FROM step WHERE run_id = ? ORDER BY id ASC",e),a=t.query(`SELECT sa.id, sa.step_id, sa.kind FROM step_artifact sa
1837
1837
  JOIN step s ON s.id = sa.step_id
1838
1838
  WHERE s.run_id = ? ORDER BY sa.id ASC`,e),l=new Map;for(let A of a){let Q=l.get(A.step_id)??[];Q.push({kind:A.kind,id:A.id}),l.set(A.step_id,Q)}let c=o.map(A=>({id:A.id,state_name:A.state_name,outcome:A.outcome,duration_ms:A.started_at!==null&&A.ended_at!==null?Math.max(0,new Date(A.ended_at).getTime()-new Date(A.started_at).getTime()):null,artifacts:l.get(A.id)??[]})),d=t.query("SELECT kind, COUNT(*) AS count FROM session_event WHERE run_id = ? GROUP BY kind",e),u=t.query("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'tool_result' AND payload_truncated = 0",e),f=0;for(let A of u)try{let Q=JSON.parse(A.payload);typeof Q.elapsedMs=="number"&&Q.elapsedMs>0&&(f+=Q.elapsedMs)}catch{}let m=d.map(A=>({kind:A.kind,count:A.count,total_elapsed_ms:A.kind==="tool_result"?f:0})),p=c.filter(A=>A.outcome==="request_changes"),_=[...new Set(p.map(A=>A.state_name))],g=new Date(n.started_at).getTime(),h=n.ended_at!==null?new Date(n.ended_at).getTime():Date.now(),y=t.query("SELECT project_id FROM job WHERE id = ?",n.job_id)[0]?.project_id??null,w=y!==null?t.query(`SELECT id, signal_kind, severity, description, detected_at FROM drift_signal
1839
1839
  WHERE project_id = ? AND detected_at >= ? AND detected_at <= ? ORDER BY detected_at ASC`,y,g,h):[],x=t.query(`SELECT SUM(input_tokens) AS input, SUM(output_tokens) AS output
1840
- FROM session_size WHERE observed_at >= ? AND observed_at <= ?`,n.started_at,n.ended_at??new Date().toISOString())[0],U=x?.input!==null&&x?.input!==void 0?`input: ${x.input}, output: ${x.output??0}`:"n/a",ue=t.getWorkflow(n.workflow_id),W=n.started_at!==null&&n.ended_at!==null?Math.max(0,new Date(n.ended_at).getTime()-new Date(n.started_at).getTime()):null,M={run_id:e,workflow_name:ue?.name??null,started_at:n.started_at,ended_at:n.ended_at,terminal_state:n.terminal_state,duration_ms:W,steps:c,tool_stats:m,reviewer_interventions:{count:p.length,state_names:_},drift_signals:w,token_totals:U};t.insertStepArtifact({step_id:i,kind:"run_report",content:JSON.stringify(M)})}var Gh=T(()=>{"use strict"});import{spawnSync as Kh}from"node:child_process";function id(e){return xL[e]??`no install hint; ensure '${e}' is on PATH`}function AL(e){switch(e){case"gh":return{args:["auth","status"]};case"claude":case"codex":case"gemini":case"qwen":return{args:["auth","status"]};case"opencode":return{args:["auth","list"]};default:return null}}function Vh(e){return Kh("which",[e],{encoding:"utf8"}).status===0}function Yh(e){if(e===void 0)return null;for(let t of e.tools??[])if(!Vh(t)){let r=id(t);return{kind:"missing_tool",tool:t,install_hint:r,message:`missing dependency: ${t}; ${r}`}}for(let t of e.auth??[]){if(!Vh(t)){let s=id(t);return{kind:"missing_tool",tool:t,install_hint:s,message:`missing dependency: ${t}; ${s}`}}let r=AL(t);if(r===null)continue;let n=Kh(t,r.args,{encoding:"utf8"});if(n.status!==0){let s=typeof n.stderr=="string"?n.stderr.trim():"";return{kind:"auth_failed",tool:t,install_hint:id(t),message:`${t} not authenticated; run \`${t} login\` or equivalent`,detail:s.length>0?s:void 0}}}return null}var xL,zh=T(()=>{"use strict";xL={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 RL,readdirSync as LL,readFileSync as OL}from"node:fs";import{join as Zh}from"node:path";function $L(e){let t=e.match(/^---\n([\s\S]*?)\n---/);if(!t)return[];let r=t[1],n=r.match(/^tags:\s*\[([^\]]*)\]/m);if(n)return n[1].split(",").map(i=>i.trim()).filter(Boolean);let s=r.match(/^tags:\s*\n((?:\s*-\s+.+\n?)*)/m);return s?s[1].split(`
1841
- `).map(i=>i.replace(/^\s*-\s+/,"").trim()).filter(Boolean):[]}function Qh(e,t){let r=e.match(/^---\n([\s\S]*?)\n---/);if(!r)return null;let s=r[1].match(new RegExp(`^${t}:\\s*(.+)$`,"m"));return s?s[1].trim():null}function eg(e,t){if(t.length===0)return null;let r=Zh(e,"durable-memory");if(!RL(r))return null;let n;try{n=LL(r).filter(i=>i.endsWith(".md")&&i!=="index.md")}catch{return null}let s=[];for(let i of n)try{let o=OL(Zh(r,i),"utf8");if($L(o).some(l=>t.includes(l))){let l=Qh(o,"name")??i.replace(".md",""),c=Qh(o,"description");s.push(c?`${l} (${c})`:l)}}catch{}return s.length===0?null:`[Durable-memory entries relevant to this task: ${s.join(", ")}. Pull the full chapter as needed.]`}var tg=T(()=>{"use strict"});function ld(e){let t=e.trim().replace(CL,"").trim();for(let r=0;r<4;r+=1){let n=ML.exec(t);if(n===null)break;t=n[2].trim()}return t}function rg(e){let t=e.trim(),r=jL.exec(t);if(r!==null)return r[2];let n=DL.exec(t);return n!==null?n[0]:null}function _s(e,t){let r=e.split(`
1842
- `),n=null,s=-1;for(let o=0;o<r.length;o+=1){let a=ld(r[o]),l=od.exec(a);if(l===null)continue;let c=l[1].trim();if(ad.test(c))continue;let d=rg(c);d!==null&&(n=d,s=o)}if(n===null)return{outcome:null,reason:"no_stance"};if(!t.includes(n))return{outcome:null,reason:"unknown_outcome",actual:n};let i={};for(let o=s-1;o>=0;o-=1){let a=ld(r[o]),l=od.exec(a);if(l===null)break;let c=ad.exec(l[1].trim());if(c===null)break;i[c[1]]=c[2].trim()}return{outcome:n,evidence:i}}function ng(e){let t=e.split(`
1843
- `),r=null;for(let n=0;n<t.length;n+=1){let s=ld(t[n]),i=od.exec(s);if(i===null)continue;let o=i[1].trim();if(ad.test(o))continue;let a=rg(o);if(a===null||!Vr(a))continue;let c=o.slice(o.indexOf(a)+a.length).replace(/^[`*_:\s\-–—]+/,"").trim();r={token:a,reason:c}}return r}var CL,ML,od,ad,jL,DL,cd=T(()=>{"use strict";Xn();CL=/^#{1,6}\s+/,ML=/^(```|\*\*|__|`|\*|_)([\s\S]+?)\1$/,od=/^STANCE:\s+(.+)$/,ad=/^([A-Z][A-Z0-9_]*):\s*(.+)$/,jL=/^(```|\*\*|__|`|\*|_)([A-Za-z0-9_-]+)\1/,DL=/^[A-Za-z0-9_-]+/});function sg(e,t,r){return n=>{let s=r(),i=Date.now(),o=JSON.stringify({kind:n.kind,tool:n.tool??null,summary:n.summary??null,id:n.id??null,elapsedMs:n.elapsedMs??null,status:n.status??null}),a=Buffer.byteLength(o,"utf8");if(a<=262144){e.insertSessionEvent({run_id:t,step_id:s,kind:n.kind,timestamp_ms:i,payload:o});return}let l=o.slice(0,1024),c=JSON.stringify({truncated:!0,size:a,preview:l});if(s!==null){let d=e.insertStepArtifact({step_id:s,kind:"session_event_overflow",content:o});e.insertSessionEvent({run_id:t,step_id:s,kind:n.kind,timestamp_ms:i,payload:c,payload_truncated:1,overflow_artifact_id:d.id})}else e.insertSessionEvent({run_id:t,step_id:null,kind:n.kind,timestamp_ms:i,payload:c,payload_truncated:1,overflow_artifact_id:null})}}var ig=T(()=>{"use strict"});import{readFileSync as PL}from"node:fs";import{dirname as FL,join as UL}from"node:path";import{fileURLToPath as WL}from"node:url";function HL(e){return e.rules.map(t=>({command:t.command,subcommands:t.argv_patterns.map(r=>r.trim().split(/\s+/)),kind:t.kind}))}function VL(e){let t=[],r=[];for(let n of e)BL.has(n)?(r.length>0&&t.push(r),r=[]):r.push(n);return r.length>0&&t.push(r),t}function KL(e,t){if(e.length===0)return{matched:!1};let r=0;for(;r<e.length&&qL.test(e[r]);)r+=1;if(r>=e.length)return{matched:!1};let n=e[r],s=e.slice(r+1);for(let i of t)if(n===i.command){for(let o of i.subcommands)if(o.every((l,c)=>s[c]===l))return{matched:!0,kind:i.kind}}return{matched:!1}}function YL(e,t){if(e.length===0)return{matched:!1};let r=VL(e);for(let n of r){let s=KL(n,t);if(s.matched)return s}return{matched:!1}}function dd(e){return YL(e,GL)}function zL(e){return e.replace(/&&/g," && ").replace(/\|\|/g," || ").replace(/;/g," ; ").replace(/\|/g," | ").replace(/(?<!\d)>{1,2}/g,t=>` ${t} `).replace(/(?<!\d)<{1,2}/g,t=>` ${t} `).replace(/\s+/g," ").trim()}function ud(e){return zL(e).split(" ").filter(t=>t.length>0)}var BL,qL,JL,XL,GL,og=T(()=>{"use strict";BL=new Set(["&&","||",";","|",">",">>","<","<<"]),qL=/^[A-Za-z_][A-Za-z0-9_]*=/;JL=FL(WL(import.meta.url)),XL=JSON.parse(PL(UL(JL,"side_effect_classifier.json"),"utf-8")),GL=HL(XL)});function wo(e){return{context:{outcomes:e.outcomes,inputs:e.inputs,item:e.iteration?.item,index:e.iteration?.index},outcomes:e.outcomes,inputs:e.inputs,item:e.iteration?.item,index:e.iteration?.index}}async function ag(e,t){try{return await $r(fd(e)??e,wo(t))===!0}catch{return!1}}async function Eo(e,t){try{return await $r(fd(e)??e,wo(t))}catch{return}}async function lg(e,t){if(typeof e!="string")return e;let r=fd(e);if(r===null)return e;try{return await $r(r,wo(t))}catch{return}}async function cg(e,t){let r=Array.from(e.matchAll(/=\{\{([\s\S]*?)\}\}/g));if(r.length===0)return e;let n="",s=0;for(let i of r){let o=i.index??0;n+=e.slice(s,o);let a=i[1]?.trim()??"";try{n+=ZL(await $r(a,wo(t)))}catch{n+=""}s=o+i[0].length}return n+=e.slice(s),n}function fd(e){let t=e.trim();return!t.startsWith("={{")||!t.endsWith("}}")?null:t.slice(3,-2).trim()}function ZL(e){return e==null?"":typeof e=="string"?e:JSON.stringify(e)}var hs=T(()=>{"use strict";as()});import{existsSync as dg,readdirSync as ug,readFileSync as QL,statSync as fg}from"node:fs";import{join as bo}from"node:path";function mg(e,t,r,n){return Object.assign(e,{stateId:t,state:r,displayName:n})}function q(e,t){return e.dal.insertStep({...t,parent_step_id:e.parent_step_id})}function J(e,t){return t.startsWith("@terminal:")?{kind:"terminal",terminal:t.slice(10)}:e.states[t]===void 0?{kind:"escalate",token:t,reason:`unknown state ref '${t}'`}:{kind:"state",state:t}}function tt(e,t,r,n,s={}){let i=O(),o=q(e,{run_id:e.run_id,state_name:t.name});e.steps_executed+=1,e.dal.finishStep(o.id,null,`escalation:${n}`.slice(0,480)),e.dal.setRunPausedState(e.run_id,`${gs}${t.id}`,i);let a=e.dal.getRun(e.run_id),l=Vr(r)?"generic":"unhandled";return e.dal.raiseAttention({kind:ti,severity:"attn",project_id:e.project.id,run_id:e.run_id,requires_user:!0,payload:JSON.stringify({run_id:e.run_id,step_id:o.id,project_id:e.project.id,workflow_name:e.workflow.name,workflow_version_id:a?.workflow_version_id??null,step:{id:t.id,name:t.name,type:t.type},tier:l,token:r,reason:n,declared_outcomes:[...s.declared_outcomes??[]],agent_output:eO(s.agent_output??n),paused_at:i,created_at:i})}),e.dal.pauseJob(e.job.id),{kind:"paused"}}function eO(e){return e.length>8e3?`${e.slice(0,8e3)}
1844
- \u2026[truncated ${e.length-8e3} chars]`:e}function X(e,t,r,n){e.outcomes[t]=n,r!==t&&(e.outcomes[r]=n)}function Y(e){return e.terminals.aborted?.kind==="failure"?"aborted":Object.entries(e.terminals).find(([,r])=>r.kind==="failure")?.[0]??Object.keys(e.terminals)[0]??"aborted"}function pg(e,t){let r=t.trim();if(r.startsWith("[")){try{let n=JSON.parse(r);if(Array.isArray(n)&&n.every(s=>typeof s=="string"))return n}catch{return null}return null}if(r.startsWith("job.payload.")){let n=r.slice(12);if(n.length===0)return null;let i=fr(e.job.payload)?.[n];if(Array.isArray(i)&&i.every(o=>typeof o=="string"))return i}return null}async function Ke(e,t,r){let n=e.replace(/(?<!=)\{\{\s*([a-zA-Z0-9_.]+)\s*\}\}/g,(s,i)=>{if(i==="run_id")return String(t.run_id);if(i==="state_id")return r;if(i==="item")return t.iteration?.item??"";if(i==="index")return t.iteration===null?"":String(t.iteration.index);if(i.startsWith("project.")){let o=i.slice(8);if(o==="id")return String(t.project.id);if(o==="name")return t.project.name;if(o==="local_path")return t.project.local_path;if(o==="default_branch")return t.project.default_branch??"";if(o==="owner"){let a=t.project.name.indexOf("/");return a>0?t.project.name.slice(0,a):""}if(o==="repo"){let a=t.project.name.indexOf("/");return a>0?t.project.name.slice(a+1):t.project.name}if(o==="test_command"){let a=t.project.test_command;return a===null||a===""?"npm test":a}return""}if(i==="job_payload"){let o=fr(t.job.payload);return o===null?"":JSON.stringify(o)}if(i.startsWith("job_payload.")){let o=i.slice(12),l=fr(t.job.payload)?.[o];return l==null?"":String(l)}if(i.startsWith("outcomes.")){let o=tO(t.outcomes,i.slice(9));return o==null?"":typeof o=="string"?o:JSON.stringify(o)}return""});return cg(n,t)}function tO(e,t){let r=e;for(let n of t.split(".")){if(r===null||typeof r!="object"||Array.isArray(r))return;r=r[n]}return r}function fr(e){if(e===null)return null;try{let t=JSON.parse(e);return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:null}catch{return null}}async function ys(e){let{context:t,stateId:r,member:n,prompt:s,stepId:i,timeoutMs:o,writesToProjectPath:a}=e,l=sg(t.dal,t.run_id,()=>i),c=md(t,r),d={violation:null},u=S=>{if(l(S),d.violation===null&&S.kind==="tool_use"&&S.tool==="Bash"&&S.summary){let y=ud(S.summary),w=dd(y);w.matched&&!c&&(d.violation={summary:S.summary,kind:w.kind})}},f=new Date(Date.now()-1),m=0,p=0,_=S=>{u(S),rO(S,(y,w)=>{m+=y,p+=w})},g=await Li({sessionid:n.sessionid,sessiondir:n.sessiondir,prompt:s,timeoutMs:o,dal:t.dal,team_member_id:n.id,onProgress:_});t.dal.insertSessionEvent({run_id:t.run_id,step_id:i,kind:"agent_call",timestamp_ms:Date.now(),payload:JSON.stringify({alias:n.alias,provider:Fe(n),model:n.model??"unknown",tokens_in:m,tokens_out:p,wall_time_ms:g.ms})}),nO(t.project,t.dal,f);let h=d.violation;return h!==null?{kind:"g3_violation",summary:h.summary,violationKind:h.kind}:!a&&t.project.local_path.trim().length>0&&pd(t.project.local_path,f)?{kind:"g2_violation"}:{kind:"ok",text:g.text,ms:g.ms,argv:g.argv}}function rO(e,t){let r=e.raw;if(r==null)return;let s=r.message?.usage;if(s!==void 0){let o=To(s.input_tokens),a=To(s.output_tokens);(o>0||a>0)&&t(o,a);return}let i=r.usage;if(i!==void 0){let o=To(i.input_tokens),a=To(i.output_tokens);(o>0||a>0)&&t(o,a)}}function To(e){return typeof e=="number"&&Number.isFinite(e)&&e>=0?e:0}async function Vt(e,t,r,n){if(r.sessionid===null)return;let s=`${t}:write_back`,i=q(e,{run_id:e.run_id,state_name:s});e.steps_executed+=1;let a=`This state completed successfully.${typeof n=="string"?` Category hint: "${n}".`:""} Did you learn anything worth preserving in durable-memory? If yes, use Write to create/update an entry under <project>/durable-memory/<descriptive-name>.md. Include YAML frontmatter (name/description/type[/tags]). Be brief \u2014 one entry per insight. If you didn't learn anything new, respond with \`STANCE: no_writeback\` and the engine moves on.`;try{let l=await ys({context:e,stateId:s,member:r,prompt:a,stepId:i.id,timeoutMs:e.workflow.default_task_timeout_ms,writesToProjectPath:!1});if(l.kind==="ok"){e.dal.insertStepArtifact({step_id:i.id,kind:"write_back_transcript",content:l.text});let c=!l.text.includes("STANCE: no_writeback");e.dal.finishStep(i.id,c?"wrote_back":"no_writeback","write_back_turn")}else e.dal.finishStep(i.id,null,`write_back_${l.kind}`)}catch{e.dal.finishStep(i.id,null,"write_back_error")}}async function mn(e,t,r,n,s,i,o,a=!1,l){let c=e.membersByAlias.get(r.alias);if(c===void 0||c.sessionid===null)return{outcome:null,text:"",status_detail:`missing_agent:${r.alias}`};let d=q(e,{run_id:e.run_id,state_name:t});e.steps_executed+=1;let u=[];c.prompt_snapshot!==null&&c.prompt_snapshot.length>0&&u.push(c.prompt_snapshot),i&&u.push(Lm(s)),l!=null&&l.length>0&&u.push(l);let f=r.prompt_template!==void 0?await Ke(r.prompt_template,e,t):"";f.length>0&&u.push(f),n!==null&&n.length>0&&u.push(n);let m=u.join(`
1840
+ FROM session_size WHERE observed_at >= ? AND observed_at <= ?`,n.started_at,n.ended_at??new Date().toISOString())[0],U=x?.input!==null&&x?.input!==void 0?`input: ${x.input}, output: ${x.output??0}`:"n/a",ue=t.getWorkflow(n.workflow_id),W=n.started_at!==null&&n.ended_at!==null?Math.max(0,new Date(n.ended_at).getTime()-new Date(n.started_at).getTime()):null,M={run_id:e,workflow_name:ue?.name??null,started_at:n.started_at,ended_at:n.ended_at,terminal_state:n.terminal_state,duration_ms:W,steps:c,tool_stats:m,reviewer_interventions:{count:p.length,state_names:_},drift_signals:w,token_totals:U};t.insertStepArtifact({step_id:i,kind:"run_report",content:JSON.stringify(M)})}var Gh=T(()=>{"use strict"});import{spawnSync as Kh}from"node:child_process";function sd(e){return xL[e]??`no install hint; ensure '${e}' is on PATH`}function AL(e){switch(e){case"gh":return{args:["auth","status"]};case"claude":case"codex":case"gemini":case"qwen":return{args:["auth","status"]};case"opencode":return{args:["auth","list"]};default:return null}}function Vh(e){return Kh("which",[e],{encoding:"utf8"}).status===0}function Yh(e){if(e===void 0)return null;for(let t of e.tools??[])if(!Vh(t)){let r=sd(t);return{kind:"missing_tool",tool:t,install_hint:r,message:`missing dependency: ${t}; ${r}`}}for(let t of e.auth??[]){if(!Vh(t)){let s=sd(t);return{kind:"missing_tool",tool:t,install_hint:s,message:`missing dependency: ${t}; ${s}`}}let r=AL(t);if(r===null)continue;let n=Kh(t,r.args,{encoding:"utf8"});if(n.status!==0){let s=typeof n.stderr=="string"?n.stderr.trim():"";return{kind:"auth_failed",tool:t,install_hint:sd(t),message:`${t} not authenticated; run \`${t} login\` or equivalent`,detail:s.length>0?s:void 0}}}return null}var xL,zh=T(()=>{"use strict";xL={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 RL,readdirSync as LL,readFileSync as OL}from"node:fs";import{join as Zh}from"node:path";function $L(e){let t=e.match(/^---\n([\s\S]*?)\n---/);if(!t)return[];let r=t[1],n=r.match(/^tags:\s*\[([^\]]*)\]/m);if(n)return n[1].split(",").map(i=>i.trim()).filter(Boolean);let s=r.match(/^tags:\s*\n((?:\s*-\s+.+\n?)*)/m);return s?s[1].split(`
1841
+ `).map(i=>i.replace(/^\s*-\s+/,"").trim()).filter(Boolean):[]}function Qh(e,t){let r=e.match(/^---\n([\s\S]*?)\n---/);if(!r)return null;let s=r[1].match(new RegExp(`^${t}:\\s*(.+)$`,"m"));return s?s[1].trim():null}function eg(e,t){if(t.length===0)return null;let r=Zh(e,"durable-memory");if(!RL(r))return null;let n;try{n=LL(r).filter(i=>i.endsWith(".md")&&i!=="index.md")}catch{return null}let s=[];for(let i of n)try{let o=OL(Zh(r,i),"utf8");if($L(o).some(l=>t.includes(l))){let l=Qh(o,"name")??i.replace(".md",""),c=Qh(o,"description");s.push(c?`${l} (${c})`:l)}}catch{}return s.length===0?null:`[Durable-memory entries relevant to this task: ${s.join(", ")}. Pull the full chapter as needed.]`}var tg=T(()=>{"use strict"});function ad(e){let t=e.trim().replace(CL,"").trim();for(let r=0;r<4;r+=1){let n=ML.exec(t);if(n===null)break;t=n[2].trim()}return t}function rg(e){let t=e.trim(),r=jL.exec(t);if(r!==null)return r[2];let n=DL.exec(t);return n!==null?n[0]:null}function _s(e,t){let r=e.split(`
1842
+ `),n=null,s=-1;for(let o=0;o<r.length;o+=1){let a=ad(r[o]),l=id.exec(a);if(l===null)continue;let c=l[1].trim();if(od.test(c))continue;let d=rg(c);d!==null&&(n=d,s=o)}if(n===null)return{outcome:null,reason:"no_stance"};if(!t.includes(n))return{outcome:null,reason:"unknown_outcome",actual:n};let i={};for(let o=s-1;o>=0;o-=1){let a=ad(r[o]),l=id.exec(a);if(l===null)break;let c=od.exec(l[1].trim());if(c===null)break;i[c[1]]=c[2].trim()}return{outcome:n,evidence:i}}function ng(e){let t=e.split(`
1843
+ `),r=null;for(let n=0;n<t.length;n+=1){let s=ad(t[n]),i=id.exec(s);if(i===null)continue;let o=i[1].trim();if(od.test(o))continue;let a=rg(o);if(a===null||!Vr(a))continue;let c=o.slice(o.indexOf(a)+a.length).replace(/^[`*_:\s\-–—]+/,"").trim();r={token:a,reason:c}}return r}var CL,ML,id,od,jL,DL,ld=T(()=>{"use strict";Xn();CL=/^#{1,6}\s+/,ML=/^(```|\*\*|__|`|\*|_)([\s\S]+?)\1$/,id=/^STANCE:\s+(.+)$/,od=/^([A-Z][A-Z0-9_]*):\s*(.+)$/,jL=/^(```|\*\*|__|`|\*|_)([A-Za-z0-9_-]+)\1/,DL=/^[A-Za-z0-9_-]+/});function sg(e,t,r){return n=>{let s=r(),i=Date.now(),o=JSON.stringify({kind:n.kind,tool:n.tool??null,summary:n.summary??null,id:n.id??null,elapsedMs:n.elapsedMs??null,status:n.status??null}),a=Buffer.byteLength(o,"utf8");if(a<=262144){e.insertSessionEvent({run_id:t,step_id:s,kind:n.kind,timestamp_ms:i,payload:o});return}let l=o.slice(0,1024),c=JSON.stringify({truncated:!0,size:a,preview:l});if(s!==null){let d=e.insertStepArtifact({step_id:s,kind:"session_event_overflow",content:o});e.insertSessionEvent({run_id:t,step_id:s,kind:n.kind,timestamp_ms:i,payload:c,payload_truncated:1,overflow_artifact_id:d.id})}else e.insertSessionEvent({run_id:t,step_id:null,kind:n.kind,timestamp_ms:i,payload:c,payload_truncated:1,overflow_artifact_id:null})}}var ig=T(()=>{"use strict"});import{readFileSync as PL}from"node:fs";import{dirname as FL,join as UL}from"node:path";import{fileURLToPath as WL}from"node:url";function HL(e){return e.rules.map(t=>({command:t.command,subcommands:t.argv_patterns.map(r=>r.trim().split(/\s+/)),kind:t.kind}))}function VL(e){let t=[],r=[];for(let n of e)BL.has(n)?(r.length>0&&t.push(r),r=[]):r.push(n);return r.length>0&&t.push(r),t}function KL(e,t){if(e.length===0)return{matched:!1};let r=0;for(;r<e.length&&qL.test(e[r]);)r+=1;if(r>=e.length)return{matched:!1};let n=e[r],s=e.slice(r+1);for(let i of t)if(n===i.command){for(let o of i.subcommands)if(o.every((l,c)=>s[c]===l))return{matched:!0,kind:i.kind}}return{matched:!1}}function YL(e,t){if(e.length===0)return{matched:!1};let r=VL(e);for(let n of r){let s=KL(n,t);if(s.matched)return s}return{matched:!1}}function cd(e){return YL(e,GL)}function zL(e){return e.replace(/&&/g," && ").replace(/\|\|/g," || ").replace(/;/g," ; ").replace(/\|/g," | ").replace(/(?<!\d)>{1,2}/g,t=>` ${t} `).replace(/(?<!\d)<{1,2}/g,t=>` ${t} `).replace(/\s+/g," ").trim()}function dd(e){return zL(e).split(" ").filter(t=>t.length>0)}var BL,qL,JL,XL,GL,og=T(()=>{"use strict";BL=new Set(["&&","||",";","|",">",">>","<","<<"]),qL=/^[A-Za-z_][A-Za-z0-9_]*=/;JL=FL(WL(import.meta.url)),XL=JSON.parse(PL(UL(JL,"side_effect_classifier.json"),"utf-8")),GL=HL(XL)});function wo(e){return{context:{outcomes:e.outcomes,inputs:e.inputs,item:e.iteration?.item,index:e.iteration?.index},outcomes:e.outcomes,inputs:e.inputs,item:e.iteration?.item,index:e.iteration?.index}}async function ag(e,t){try{return await $r(ud(e)??e,wo(t))===!0}catch{return!1}}async function Eo(e,t){try{return await $r(ud(e)??e,wo(t))}catch{return}}async function lg(e,t){if(typeof e!="string")return e;let r=ud(e);if(r===null)return e;try{return await $r(r,wo(t))}catch{return}}async function cg(e,t){let r=Array.from(e.matchAll(/=\{\{([\s\S]*?)\}\}/g));if(r.length===0)return e;let n="",s=0;for(let i of r){let o=i.index??0;n+=e.slice(s,o);let a=i[1]?.trim()??"";try{n+=ZL(await $r(a,wo(t)))}catch{n+=""}s=o+i[0].length}return n+=e.slice(s),n}function ud(e){let t=e.trim();return!t.startsWith("={{")||!t.endsWith("}}")?null:t.slice(3,-2).trim()}function ZL(e){return e==null?"":typeof e=="string"?e:JSON.stringify(e)}var hs=T(()=>{"use strict";as()});import{existsSync as dg,readdirSync as ug,readFileSync as QL,statSync as fg}from"node:fs";import{join as bo}from"node:path";function mg(e,t,r,n){return Object.assign(e,{stateId:t,state:r,displayName:n})}function q(e,t){return e.dal.insertStep({...t,parent_step_id:e.parent_step_id})}function J(e,t){return t.startsWith("@terminal:")?{kind:"terminal",terminal:t.slice(10)}:e.states[t]===void 0?{kind:"escalate",token:t,reason:`unknown state ref '${t}'`}:{kind:"state",state:t}}function tt(e,t,r,n,s={}){let i=O(),o=q(e,{run_id:e.run_id,state_name:t.name});e.steps_executed+=1,e.dal.finishStep(o.id,null,`escalation:${n}`.slice(0,480)),e.dal.setRunPausedState(e.run_id,`${gs}${t.id}`,i);let a=e.dal.getRun(e.run_id),l=Vr(r)?"generic":"unhandled";return e.dal.raiseAttention({kind:ti,severity:"attn",project_id:e.project.id,run_id:e.run_id,requires_user:!0,payload:JSON.stringify({run_id:e.run_id,step_id:o.id,project_id:e.project.id,workflow_name:e.workflow.name,workflow_version_id:a?.workflow_version_id??null,step:{id:t.id,name:t.name,type:t.type},tier:l,token:r,reason:n,declared_outcomes:[...s.declared_outcomes??[]],agent_output:eO(s.agent_output??n),paused_at:i,created_at:i})}),e.dal.pauseJob(e.job.id),{kind:"paused"}}function eO(e){return e.length>8e3?`${e.slice(0,8e3)}
1844
+ \u2026[truncated ${e.length-8e3} chars]`:e}function X(e,t,r,n){e.outcomes[t]=n,r!==t&&(e.outcomes[r]=n)}function Y(e){return e.terminals.aborted?.kind==="failure"?"aborted":Object.entries(e.terminals).find(([,r])=>r.kind==="failure")?.[0]??Object.keys(e.terminals)[0]??"aborted"}function pg(e,t){let r=t.trim();if(r.startsWith("[")){try{let n=JSON.parse(r);if(Array.isArray(n)&&n.every(s=>typeof s=="string"))return n}catch{return null}return null}if(r.startsWith("job.payload.")){let n=r.slice(12);if(n.length===0)return null;let i=fr(e.job.payload)?.[n];if(Array.isArray(i)&&i.every(o=>typeof o=="string"))return i}return null}async function Ke(e,t,r){let n=e.replace(/(?<!=)\{\{\s*([a-zA-Z0-9_.]+)\s*\}\}/g,(s,i)=>{if(i==="run_id")return String(t.run_id);if(i==="state_id")return r;if(i==="item")return t.iteration?.item??"";if(i==="index")return t.iteration===null?"":String(t.iteration.index);if(i.startsWith("project.")){let o=i.slice(8);if(o==="id")return String(t.project.id);if(o==="name")return t.project.name;if(o==="local_path")return t.project.local_path;if(o==="default_branch")return t.project.default_branch??"";if(o==="owner"){let a=t.project.name.indexOf("/");return a>0?t.project.name.slice(0,a):""}if(o==="repo"){let a=t.project.name.indexOf("/");return a>0?t.project.name.slice(a+1):t.project.name}if(o==="test_command"){let a=t.project.test_command;return a===null||a===""?"npm test":a}return""}if(i==="job_payload"){let o=fr(t.job.payload);return o===null?"":JSON.stringify(o)}if(i.startsWith("job_payload.")){let o=i.slice(12),l=fr(t.job.payload)?.[o];return l==null?"":String(l)}if(i.startsWith("outcomes.")){let o=tO(t.outcomes,i.slice(9));return o==null?"":typeof o=="string"?o:JSON.stringify(o)}return""});return cg(n,t)}function tO(e,t){let r=e;for(let n of t.split(".")){if(r===null||typeof r!="object"||Array.isArray(r))return;r=r[n]}return r}function fr(e){if(e===null)return null;try{let t=JSON.parse(e);return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:null}catch{return null}}async function ys(e){let{context:t,stateId:r,member:n,prompt:s,stepId:i,timeoutMs:o,writesToProjectPath:a}=e,l=sg(t.dal,t.run_id,()=>i),c=fd(t,r),d={violation:null},u=S=>{if(l(S),d.violation===null&&S.kind==="tool_use"&&S.tool==="Bash"&&S.summary){let y=dd(S.summary),w=cd(y);w.matched&&!c&&(d.violation={summary:S.summary,kind:w.kind})}},f=new Date(Date.now()-1),m=0,p=0,_=S=>{u(S),rO(S,(y,w)=>{m+=y,p+=w})},g=await Li({sessionid:n.sessionid,sessiondir:n.sessiondir,prompt:s,timeoutMs:o,dal:t.dal,team_member_id:n.id,onProgress:_});t.dal.insertSessionEvent({run_id:t.run_id,step_id:i,kind:"agent_call",timestamp_ms:Date.now(),payload:JSON.stringify({alias:n.alias,provider:Fe(n),model:n.model??"unknown",tokens_in:m,tokens_out:p,wall_time_ms:g.ms})}),nO(t.project,t.dal,f);let h=d.violation;return h!==null?{kind:"g3_violation",summary:h.summary,violationKind:h.kind}:!a&&t.project.local_path.trim().length>0&&md(t.project.local_path,f)?{kind:"g2_violation"}:{kind:"ok",text:g.text,ms:g.ms,argv:g.argv}}function rO(e,t){let r=e.raw;if(r==null)return;let s=r.message?.usage;if(s!==void 0){let o=To(s.input_tokens),a=To(s.output_tokens);(o>0||a>0)&&t(o,a);return}let i=r.usage;if(i!==void 0){let o=To(i.input_tokens),a=To(i.output_tokens);(o>0||a>0)&&t(o,a)}}function To(e){return typeof e=="number"&&Number.isFinite(e)&&e>=0?e:0}async function Vt(e,t,r,n){if(r.sessionid===null)return;let s=`${t}:write_back`,i=q(e,{run_id:e.run_id,state_name:s});e.steps_executed+=1;let a=`This state completed successfully.${typeof n=="string"?` Category hint: "${n}".`:""} Did you learn anything worth preserving in durable-memory? If yes, use Write to create/update an entry under <project>/durable-memory/<descriptive-name>.md. Include YAML frontmatter (name/description/type[/tags]). Be brief \u2014 one entry per insight. If you didn't learn anything new, respond with \`STANCE: no_writeback\` and the engine moves on.`;try{let l=await ys({context:e,stateId:s,member:r,prompt:a,stepId:i.id,timeoutMs:e.workflow.default_task_timeout_ms,writesToProjectPath:!1});if(l.kind==="ok"){e.dal.insertStepArtifact({step_id:i.id,kind:"write_back_transcript",content:l.text});let c=!l.text.includes("STANCE: no_writeback");e.dal.finishStep(i.id,c?"wrote_back":"no_writeback","write_back_turn")}else e.dal.finishStep(i.id,null,`write_back_${l.kind}`)}catch{e.dal.finishStep(i.id,null,"write_back_error")}}async function mn(e,t,r,n,s,i,o,a=!1,l){let c=e.membersByAlias.get(r.alias);if(c===void 0||c.sessionid===null)return{outcome:null,text:"",status_detail:`missing_agent:${r.alias}`};let d=q(e,{run_id:e.run_id,state_name:t});e.steps_executed+=1;let u=[];c.prompt_snapshot!==null&&c.prompt_snapshot.length>0&&u.push(c.prompt_snapshot),i&&u.push(Lm(s)),l!=null&&l.length>0&&u.push(l);let f=r.prompt_template!==void 0?await Ke(r.prompt_template,e,t):"";f.length>0&&u.push(f),n!==null&&n.length>0&&u.push(n);let m=u.join(`
1845
1845
 
1846
- `);try{let p=await ys({context:e,stateId:t,member:c,prompt:m,stepId:d.id,timeoutMs:o,writesToProjectPath:a});if(p.kind==="g3_violation"||p.kind==="g2_violation"){let g=p.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${p.violationKind}`:"policy_violation:writes_to_project_path";return e.dal.insertSessionEvent({run_id:e.run_id,step_id:d.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(p.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:t,kind:p.violationKind,command_summary:p.summary,message:`State ${t} ran a classified side-effect command (${p.violationKind}) without a preceding approved Pause`}:{violation:"writes_to_project_path",state_id:t,message:`State ${t} wrote to project.local_path without writes_to_project_path: true`})}),e.dal.finishStep(d.id,null,g),{outcome:null,text:"",status_detail:g}}if(e.dal.insertStepArtifact({step_id:d.id,kind:`${t}_transcript`,content:p.text}),e.transcripts[t]=p.text,!i)return e.dal.finishStep(d.id,"done",`chat_ms=${p.ms}`),e.outcomes[t]="done",{outcome:"done",text:p.text,status_detail:`chat_ms=${p.ms}`};let _=_s(p.text,s);return e.dal.finishStep(d.id,_.outcome,_.outcome!==null?`chat_ms=${p.ms}`:_.reason),_.outcome!==null&&(e.outcomes[t]=_.outcome),{outcome:_.outcome,text:p.text,status_detail:_.outcome!==null?`chat_ms=${p.ms}`:_.reason}}catch(p){let _=p instanceof Se?`chat_${p.kind}`:"chat_other";return e.dal.finishStep(d.id,null,_),{outcome:null,text:"",status_detail:_}}}function pn(e,t){return(t?.length??0)>0?eg(e.project.local_path,t):null}function _g(e){return dd(ud(e))}function md(e,t){let r=e.dal.query(`SELECT state_name, outcome FROM step
1846
+ `);try{let p=await ys({context:e,stateId:t,member:c,prompt:m,stepId:d.id,timeoutMs:o,writesToProjectPath:a});if(p.kind==="g3_violation"||p.kind==="g2_violation"){let g=p.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${p.violationKind}`:"policy_violation:writes_to_project_path";return e.dal.insertSessionEvent({run_id:e.run_id,step_id:d.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(p.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:t,kind:p.violationKind,command_summary:p.summary,message:`State ${t} ran a classified side-effect command (${p.violationKind}) without a preceding approved Pause`}:{violation:"writes_to_project_path",state_id:t,message:`State ${t} wrote to project.local_path without writes_to_project_path: true`})}),e.dal.finishStep(d.id,null,g),{outcome:null,text:"",status_detail:g}}if(e.dal.insertStepArtifact({step_id:d.id,kind:`${t}_transcript`,content:p.text}),e.transcripts[t]=p.text,!i)return e.dal.finishStep(d.id,"done",`chat_ms=${p.ms}`),e.outcomes[t]="done",{outcome:"done",text:p.text,status_detail:`chat_ms=${p.ms}`};let _=_s(p.text,s);return e.dal.finishStep(d.id,_.outcome,_.outcome!==null?`chat_ms=${p.ms}`:_.reason),_.outcome!==null&&(e.outcomes[t]=_.outcome),{outcome:_.outcome,text:p.text,status_detail:_.outcome!==null?`chat_ms=${p.ms}`:_.reason}}catch(p){let _=p instanceof Se?`chat_${p.kind}`:"chat_other";return e.dal.finishStep(d.id,null,_),{outcome:null,text:"",status_detail:_}}}function pn(e,t){return(t?.length??0)>0?eg(e.project.local_path,t):null}function _g(e){return cd(dd(e))}function fd(e,t){let r=e.dal.query(`SELECT state_name, outcome FROM step
1847
1847
  WHERE run_id = ? AND state_name != ? AND ended_at IS NOT NULL
1848
- ORDER BY started_at DESC, id DESC LIMIT 1`,e.run_id,t);if(r.length===0)return!1;let n=r[0];return e.workflow.states[n.state_name]?.type==="Interactive"&&n.outcome==="done"}function pd(e,t){if(!dg(e))return!1;let r=bo(e,"durable-memory");function n(s){let i;try{i=ug(s,{withFileTypes:!0})}catch{return!1}for(let o of i){if(o.name===".git")continue;let a=bo(s,o.name);if(a!==r)if(o.isDirectory()){if(n(a))return!0}else try{if(fg(a).mtime>t)return!0}catch{}}return!1}return n(e)}function nO(e,t,r){let n=bo(e.local_path,"durable-memory");if(!dg(n))return;let s;try{s=ug(n)}catch{return}for(let i of s){if(!i.endsWith(".md")||i==="MEMORY.md")continue;let o=bo(n,i),a;try{a=fg(o).mtime}catch{continue}if(a<=r)continue;let l;try{l=QL(o,"utf8")}catch{continue}let c=iO(l);if(c===null){process.stderr.write(`[durable-memory-sync] warning: ${i} has no valid frontmatter, skipping
1849
- `);continue}if(e.durable_memory_mode==="db")try{t.upsertDurableMemory({project_id:e.id,type:c.type,name:c.name,description:c.description,body:c.body})}catch{}}}function iO(e){let t=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(t===null)return null;let r=t[1],n=t[2].trimStart(),s=r.match(/^name:\s*(.+)$/m),i=r.match(/^type:\s*(.+)$/m),o=r.match(/^description:\s*(.+)$/m),a=s?.[1]?.trim(),l=i?.[1]?.trim();return a===void 0||a.length===0||l===void 0||!sO.has(l)?null:{name:a,type:l,description:o?.[1]?.trim()??null,body:n}}var gs,sO,Be=T(()=>{"use strict";Ze();ln();Oi();tg();cd();Xn();ig();og();hs();gs="__paused__:";sO=new Set(["user","feedback","project","reference"])});import{spawnSync as hg}from"node:child_process";function oO(e,t){let r=e.stateId,n=e.displayName,s=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;let i=e.project.local_path,o=hg("git",["diff","--quiet"],{cwd:i}).status!==0,a=hg("git",["diff","--cached","--quiet"],{cwd:i}).status!==0;if(o||a){let l=t.fail_message??"repository has uncommitted changes";return e.dal.finishStep(s.id,null,l),X(e,r,n,Lc),{kind:"terminal",terminal:Y(e.workflow)}}return e.dal.finishStep(s.id,"clean","repo_clean"),X(e,r,n,"clean"),J(e.workflow,t.next)}var gg,yg=T(()=>{"use strict";Be();gg={description:{displayName:"Assert Repo Clean",name:"assert-repo-clean",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],builtin:!0},execute:e=>oO(e,e.state)}});async function aO(e,t){let r=e.stateId,n=e.displayName,s=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;for(let i of t.branches)if(await ag(i.when,e))return e.dal.finishStep(s.id,"matched",i.when),X(e,r,n,"matched"),J(e.workflow,i.next);return e.dal.finishStep(s.id,"no_match","choice_no_match"),X(e,r,n,"no_match"),t.default_next!==void 0?J(e.workflow,t.default_next):{kind:"terminal",terminal:e.workflow.terminals.no_match?"no_match":Y(e.workflow)}}var wg,Eg=T(()=>{"use strict";Be();hs();wg={description:{displayName:"Choice",name:"choice",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[{name:"branches",displayName:"Branches",type:"json",description:"Jexl predicates evaluated against input-only context: context.outcomes and context.inputs. Globals and functions such as process.exit(1) and Math.random() are not exposed."}],builtin:!0},execute:async e=>aO(e,e.state)}});async function lO(e,t){let r=e.stateId,n=e.displayName,s=e.workflow.default_task_timeout_ms,i=t.researchers??[],o=pn(e,t.durable_memory_tags),a=new Array(i.length).fill(null);await Promise.all(i.map(async(m,p)=>{let _=`${n}:researcher_${m.alias}[${p}]`,g=await mn(e,_,m,`TOPIC: ${m.topic}`,[],!1,s,!1,o);g.text.length>0&&(a[p]=g.text)}));let l=a.map((m,p)=>m!==null?`# Research ${p+1}: ${i[p]?.topic??""}
1848
+ ORDER BY started_at DESC, id DESC LIMIT 1`,e.run_id,t);if(r.length===0)return!1;let n=r[0];return e.workflow.states[n.state_name]?.type==="Interactive"&&n.outcome==="done"}function md(e,t){if(!dg(e))return!1;let r=bo(e,"durable-memory");function n(s){let i;try{i=ug(s,{withFileTypes:!0})}catch{return!1}for(let o of i){if(o.name===".git")continue;let a=bo(s,o.name);if(a!==r)if(o.isDirectory()){if(n(a))return!0}else try{if(fg(a).mtime>t)return!0}catch{}}return!1}return n(e)}function nO(e,t,r){let n=bo(e.local_path,"durable-memory");if(!dg(n))return;let s;try{s=ug(n)}catch{return}for(let i of s){if(!i.endsWith(".md")||i==="MEMORY.md")continue;let o=bo(n,i),a;try{a=fg(o).mtime}catch{continue}if(a<=r)continue;let l;try{l=QL(o,"utf8")}catch{continue}let c=iO(l);if(c===null){process.stderr.write(`[durable-memory-sync] warning: ${i} has no valid frontmatter, skipping
1849
+ `);continue}if(e.durable_memory_mode==="db")try{t.upsertDurableMemory({project_id:e.id,type:c.type,name:c.name,description:c.description,body:c.body})}catch{}}}function iO(e){let t=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(t===null)return null;let r=t[1],n=t[2].trimStart(),s=r.match(/^name:\s*(.+)$/m),i=r.match(/^type:\s*(.+)$/m),o=r.match(/^description:\s*(.+)$/m),a=s?.[1]?.trim(),l=i?.[1]?.trim();return a===void 0||a.length===0||l===void 0||!sO.has(l)?null:{name:a,type:l,description:o?.[1]?.trim()??null,body:n}}var gs,sO,Be=T(()=>{"use strict";Ze();ln();Oi();tg();ld();Xn();ig();og();hs();gs="__paused__:";sO=new Set(["user","feedback","project","reference"])});import{spawnSync as hg}from"node:child_process";function oO(e,t){let r=e.stateId,n=e.displayName,s=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;let i=e.project.local_path,o=hg("git",["diff","--quiet"],{cwd:i}).status!==0,a=hg("git",["diff","--cached","--quiet"],{cwd:i}).status!==0;if(o||a){let l=t.fail_message??"repository has uncommitted changes";return e.dal.finishStep(s.id,null,l),X(e,r,n,Rc),{kind:"terminal",terminal:Y(e.workflow)}}return e.dal.finishStep(s.id,"clean","repo_clean"),X(e,r,n,"clean"),J(e.workflow,t.next)}var gg,yg=T(()=>{"use strict";Be();gg={description:{displayName:"Assert Repo Clean",name:"assert-repo-clean",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],builtin:!0},execute:e=>oO(e,e.state)}});async function aO(e,t){let r=e.stateId,n=e.displayName,s=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;for(let i of t.branches)if(await ag(i.when,e))return e.dal.finishStep(s.id,"matched",i.when),X(e,r,n,"matched"),J(e.workflow,i.next);return e.dal.finishStep(s.id,"no_match","choice_no_match"),X(e,r,n,"no_match"),t.default_next!==void 0?J(e.workflow,t.default_next):{kind:"terminal",terminal:e.workflow.terminals.no_match?"no_match":Y(e.workflow)}}var wg,Eg=T(()=>{"use strict";Be();hs();wg={description:{displayName:"Choice",name:"choice",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[{name:"branches",displayName:"Branches",type:"json",description:"Jexl predicates evaluated against input-only context: context.outcomes and context.inputs. Globals and functions such as process.exit(1) and Math.random() are not exposed."}],builtin:!0},execute:async e=>aO(e,e.state)}});async function lO(e,t){let r=e.stateId,n=e.displayName,s=e.workflow.default_task_timeout_ms,i=t.researchers??[],o=pn(e,t.durable_memory_tags),a=new Array(i.length).fill(null);await Promise.all(i.map(async(m,p)=>{let _=`${n}:researcher_${m.alias}[${p}]`,g=await mn(e,_,m,`TOPIC: ${m.topic}`,[],!1,s,!1,o);g.text.length>0&&(a[p]=g.text)}));let l=a.map((m,p)=>m!==null?`# Research ${p+1}: ${i[p]?.topic??""}
1850
1850
  ${m}`:null).filter(m=>m!==null).join(`
1851
1851
 
1852
1852
  `),c=`${n}:consolidator`,d=await mn(e,c,t.consolidator,l.length>0?l:null,["ok","error"],!0,s,!1,o),u=q(e,{run_id:e.run_id,state_name:n});if(e.steps_executed+=1,d.outcome===null||d.outcome==="error"){e.dal.finishStep(u.id,d.outcome,d.status_detail),d.outcome==="error"&&X(e,r,n,"error");let m=t.outcomes.error;return m!==void 0?J(e.workflow,m):{kind:"terminal",terminal:Y(e.workflow)}}let f=t.research_artifact_prefix??n;if(e.dal.insertStepArtifact({step_id:u.id,kind:`${f}_consolidated`,content:d.text}),e.dal.finishStep(u.id,"ok","consolidated"),X(e,r,n,"ok"),t.write_back_durable_memory){let m=e.membersByAlias.get(t.consolidator.alias);m!==void 0&&await Vt(e,n,m,t.write_back_durable_memory)}return J(e.workflow,t.outcomes.ok)}var Tg,bg=T(()=>{"use strict";Be();Tg={description:{displayName:"Consolidate",name:"consolidate",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],emits_progress:!0,builtin:!0},execute:async e=>lO(e,e.state)}});async function cO(e,t){let r=e.stateId,n=e.displayName,s=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;let i=e.progress_step_id;e.progress_step_id=s.id;try{let o=await Eo(t.items_from,e),a=mO(o);if(a===null){e.dal.finishStep(s.id,null,`foreach_invalid_items:${t.items_from}`);let f=t.outcomes.any_failed;return f!==void 0?J(e.workflow,f):{kind:"terminal",terminal:Y(e.workflow)}}let l={routed:null},c=t.mode==="parallel"?await uO(e,t,s.id,a,l):await dO(e,t,s.id,a,l);if(l.routed!==null)return e.dal.finishStep(s.id,null,`foreach_propagated:${l.routed.kind}`),l.routed;let d=c.some(f=>f.outcome===null||f.outcome==="__failure__"),u=d?"any_failed":"all_ok";if(e.dal.finishStep(s.id,u,JSON.stringify({iterations:c,count:a.length})),X(e,r,n,u),d){let f=t.outcomes.any_failed;return f!==void 0?J(e.workflow,f):{kind:"terminal",terminal:Y(e.workflow)}}return J(e.workflow,t.outcomes.all_ok)}finally{e.progress_step_id=i}}async function dO(e,t,r,n,s){let i=[];for(let o=0;o<n.length;o+=1){let a=await vg(e,t,r,n[o],o,s);if(s.routed!==null||(i.push(a),(a.outcome===null||a.outcome==="__failure__")&&t.on_item_failure==="stop"))break}return i}async function uO(e,t,r,n,s){let i=new Array(n.length),o=0,a=Array.from({length:Math.min(t.max_concurrency,n.length)},async()=>{for(;o<n.length&&s.routed===null;){let l=o;o+=1,i[l]=await vg(e,t,r,n[l],l,s)}});return await Promise.all(a),i}async function vg(e,t,r,n,s,i){let o=e.iteration;e.iteration={item:n,index:s};let a=`${e.displayName}[${s}]`;e.emit_progress?.({kind:"item_started",data:{index:s,item:n}});let l;try{l=await e.dispatchState(a,t.body,{parent_step_id:r,iteration:{item:n,index:s}})}finally{e.iteration=o}(l.kind==="paused"||l.kind==="escalate")&&i.routed===null&&(i.routed=l);let d=l.kind==="terminal"&&e.workflow.terminals[l.terminal]?.kind==="failure"?"__failure__":fO(e.outcomes[a]);return e.emit_progress?.({kind:d===null||d==="__failure__"?"item_failed":"item_completed",data:{index:s,item:n,outcome:d}}),{index:s,value:n,outcome:d}}function fO(e){return e==null?null:typeof e=="string"?e:JSON.stringify(e)}function mO(e){if(!Array.isArray(e))return null;let t=[];for(let r of e)if(typeof r=="string")t.push(r);else if(typeof r=="number"||typeof r=="boolean")t.push(String(r));else return null;return t}var Sg,kg=T(()=>{"use strict";Be();hs();Sg={description:{displayName:"For Each",name:"foreach",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],emits_progress:!0,builtin:!0},execute:async e=>cO(e,e.state)}});async function pO(e,t){let r=e.stateId,n=e.displayName,s=t.termination.timeout_seconds!==void 0?t.termination.timeout_seconds*1e3:void 0,i=e.membersByAlias.get(t.agent.alias);if(i===void 0||i.sessionid===null){let f=q(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.finishStep(f.id,null,`missing_agent:${t.agent.alias}`),{kind:"terminal",terminal:Y(e.workflow)}}let o=pn(e,t.durable_memory_tags),a=e.dal.getInteractiveSessionByRunAndState(e.run_id,r);if(a!==null){if(a.status==="done")return e.dal.finishStep(a.step_id,"done","operator_done"),e.outcomes[n]="done",t.write_back_durable_memory&&await Vt(e,n,i,t.write_back_durable_memory),J(e.workflow,t.outcomes.done);if(a.status==="waiting_agent"){if(a.turn_count>=t.termination.max_turns){e.dal.finishStep(a.step_id,"timeout",`max_turns=${t.termination.max_turns}`),X(e,r,n,"timeout");let m=t.outcomes.timeout;return m!==void 0?J(e.workflow,m):{kind:"terminal",terminal:Y(e.workflow)}}let f=a.last_operator_input??"";try{let m=await ys({context:e,stateId:n,member:i,prompt:f,stepId:a.step_id,timeoutMs:s,writesToProjectPath:!1});if(m.kind==="g3_violation"||m.kind==="g2_violation"){let p=m.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${m.violationKind}`:"policy_violation:writes_to_project_path";return e.dal.insertSessionEvent({run_id:e.run_id,step_id:a.step_id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(m.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:n,kind:m.violationKind,command_summary:m.summary,message:`State ${n} ran a classified side-effect command (${m.violationKind}) without a preceding approved gate`}:{violation:"writes_to_project_path",state_id:n,message:`State ${n} wrote to project.local_path without writes_to_project_path: true`})}),e.dal.finishStep(a.step_id,null,p),{kind:"terminal",terminal:Y(e.workflow)}}return e.dal.setInteractiveAgentOutput(a.id,m.text,"waiting_operator"),t.termination.agent_signal!==void 0&&m.text.includes(t.termination.agent_signal)?(t.artifact_name!==void 0&&e.dal.insertStepArtifact({step_id:a.step_id,kind:t.artifact_name,content:m.text}),e.dal.finishStep(a.step_id,"done","agent_signal"),X(e,r,n,"done"),t.write_back_durable_memory&&await Vt(e,n,i,t.write_back_durable_memory),J(e.workflow,t.outcomes.done)):(Ig({context:e,state:t,stateId:r,displayName:n,stepId:a.step_id,agentText:m.text}),{kind:"paused"})}catch(m){let p=m instanceof Se?`chat_${m.kind}`:"chat_other";return e.dal.finishStep(a.step_id,null,p),{kind:"terminal",terminal:Y(e.workflow)}}}return{kind:"paused"}}let l=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;let c=e.dal.insertInteractiveSession({run_id:e.run_id,step_id:l.id,state_name:r,status:"waiting_agent"}),d=await Ke(t.agent.initial_prompt_template,e,n),u=o?`${o}
@@ -1858,19 +1858,19 @@ ${d}`:d;try{let f=await ys({context:e,stateId:n,member:i,prompt:u,stepId:l.id,ti
1858
1858
  AND s.state_name LIKE ?
1859
1859
  AND sa.content IS NOT NULL
1860
1860
  ORDER BY sa.id DESC
1861
- LIMIT 1`,e.run_id,`${n}:coder[%`);return i[0]?.content===void 0?null:So(i[0].content)}function So(e){return e.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}async function HO(e,t){let r=Cg(MO.lexer(e,{gfm:!0})),n=new NO({title:t,numbering:{config:[{reference:"ordered-list",levels:[{level:0,format:AO.DECIMAL,text:"%1."}]}]},sections:[{children:r.length===0?[new mt("")]:r}]});return RO.toBuffer(n)}function Cg(e){let t=[];for(let r of e)switch(r.type){case"space":break;case"heading":t.push(new mt({heading:zO(r.depth),children:pr(mr(r))}));break;case"paragraph":t.push(new mt({children:pr(mr(r))}));break;case"text":t.push(new mt({children:mr(r).length===0?[new pt(r.text)]:pr(mr(r))}));break;case"blockquote":t.push(...Cg(mr(r)).map(n=>n instanceof mt?n:new mt({children:[new pt(r.text)]})));break;case"list":VO(r)&&t.push(...JO(r));break;case"table":KO(r)&&t.push(XO(r));break;case"code":YO(r)&&t.push(...GO(r));break;case"hr":t.push(new mt(""));break;case"html":r.text.trim().length>0&&t.push(new mt({children:[new pt(r.text)]}));break;default:break}return t}function pr(e,t){let r=[];for(let n of e)switch(n.type){case"text":case"escape":r.push(new pt({text:n.text,..._d(t)}));break;case"strong":r.push(...pr(mr(n),{...t,bold:!0}));break;case"em":r.push(...pr(mr(n),{...t,italics:!0}));break;case"codespan":r.push(new pt({text:n.text,..._d({...t,code:!0})}));break;case"link":r.push(new xO({link:n.href,children:pr(mr(n),{...t})}));break;case"br":r.push(new pt({text:"",break:1}));break;case"image":r.push(new pt({text:`[image: ${n.text}]`,italics:!0}));break;case"del":r.push(new pt({text:n.text,strike:!0}));break;default:r.push(new pt({text:n.raw,..._d(t)}));break}return r.length===0?[new pt("")]:r}function _d(e){return{...e?.bold===!0?{bold:!0}:{},...e?.italics===!0?{italics:!0}:{},...e?.code===!0?{font:"Courier New"}:{}}}function JO(e){return e.items.map(t=>new mt({children:pr(t.tokens.length===1&&t.tokens[0]?.type==="text"?[{...t.tokens[0],text:Lg(t)+t.tokens[0].text}]:[{type:"text",raw:t.text,text:Lg(t)+t.text}]),...e.ordered?{numbering:{reference:"ordered-list",level:0}}:{bullet:{level:0}}}))}function Lg(e){return e.task?`[${e.checked?"x":" "}] `:""}function XO(e){let t=[e.header,...e.rows].map(r=>new $O({children:r.map(n=>new OO({children:[new mt({children:pr(n.tokens,n.header?{bold:!0}:void 0)})]}))}));return new LO({width:{size:100,type:CO.PERCENTAGE},rows:t})}function GO(e){return e.text.split(`
1861
+ LIMIT 1`,e.run_id,`${n}:coder[%`);return i[0]?.content===void 0?null:So(i[0].content)}function So(e){return e.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}async function HO(e,t){let r=Cg(MO.lexer(e,{gfm:!0})),n=new NO({title:t,numbering:{config:[{reference:"ordered-list",levels:[{level:0,format:AO.DECIMAL,text:"%1."}]}]},sections:[{children:r.length===0?[new mt("")]:r}]});return RO.toBuffer(n)}function Cg(e){let t=[];for(let r of e)switch(r.type){case"space":break;case"heading":t.push(new mt({heading:zO(r.depth),children:pr(mr(r))}));break;case"paragraph":t.push(new mt({children:pr(mr(r))}));break;case"text":t.push(new mt({children:mr(r).length===0?[new pt(r.text)]:pr(mr(r))}));break;case"blockquote":t.push(...Cg(mr(r)).map(n=>n instanceof mt?n:new mt({children:[new pt(r.text)]})));break;case"list":VO(r)&&t.push(...JO(r));break;case"table":KO(r)&&t.push(XO(r));break;case"code":YO(r)&&t.push(...GO(r));break;case"hr":t.push(new mt(""));break;case"html":r.text.trim().length>0&&t.push(new mt({children:[new pt(r.text)]}));break;default:break}return t}function pr(e,t){let r=[];for(let n of e)switch(n.type){case"text":case"escape":r.push(new pt({text:n.text,...pd(t)}));break;case"strong":r.push(...pr(mr(n),{...t,bold:!0}));break;case"em":r.push(...pr(mr(n),{...t,italics:!0}));break;case"codespan":r.push(new pt({text:n.text,...pd({...t,code:!0})}));break;case"link":r.push(new xO({link:n.href,children:pr(mr(n),{...t})}));break;case"br":r.push(new pt({text:"",break:1}));break;case"image":r.push(new pt({text:`[image: ${n.text}]`,italics:!0}));break;case"del":r.push(new pt({text:n.text,strike:!0}));break;default:r.push(new pt({text:n.raw,...pd(t)}));break}return r.length===0?[new pt("")]:r}function pd(e){return{...e?.bold===!0?{bold:!0}:{},...e?.italics===!0?{italics:!0}:{},...e?.code===!0?{font:"Courier New"}:{}}}function JO(e){return e.items.map(t=>new mt({children:pr(t.tokens.length===1&&t.tokens[0]?.type==="text"?[{...t.tokens[0],text:Lg(t)+t.tokens[0].text}]:[{type:"text",raw:t.text,text:Lg(t)+t.text}]),...e.ordered?{numbering:{reference:"ordered-list",level:0}}:{bullet:{level:0}}}))}function Lg(e){return e.task?`[${e.checked?"x":" "}] `:""}function XO(e){let t=[e.header,...e.rows].map(r=>new $O({children:r.map(n=>new OO({children:[new mt({children:pr(n.tokens,n.header?{bold:!0}:void 0)})]}))}));return new LO({width:{size:100,type:CO.PERCENTAGE},rows:t})}function GO(e){return e.text.split(`
1862
1862
  `).map(r=>new mt({children:[new pt({text:r.length===0?" ":r,font:"Courier New"})]}))}function mr(e){let t=e.tokens;return Array.isArray(t)?t:[]}function VO(e){return e.type==="list"&&Array.isArray(e.items)}function KO(e){let t=e;return e.type==="table"&&Array.isArray(t.header)&&Array.isArray(t.rows)}function YO(e){return e.type==="code"&&typeof e.text=="string"}function zO(e){switch(e){case 1:return _n.HEADING_1;case 2:return _n.HEADING_2;case 3:return _n.HEADING_3;case 4:return _n.HEADING_4;case 5:return _n.HEADING_5;default:return _n.HEADING_6}}var $g,Mg=T(()=>{"use strict";Be();$g={description:{displayName:"Render DOCX",name:"render-docx",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"done"},{name:"error"}],properties:[{name:"markdown_source",displayName:"Markdown Source",type:"string",required:!0,description:"Markdown string or project-relative .md path. Expressions are evaluated before rendering."},{name:"output_path",displayName:"Output Path",type:"string",required:!0,description:"Absolute or project-relative .docx path to write."},{name:"title",displayName:"Title",type:"string",required:!1,description:"Optional document metadata title."}],mutates_external_state:!0,builtin:!0},execute:async e=>jO(e,e.state)}});import{createHash as ZO}from"node:crypto";import{existsSync as QO,mkdirSync as e$,readFileSync as jg,statSync as t$}from"node:fs";import{dirname as r$,isAbsolute as Dg,normalize as n$,resolve as Es}from"node:path";import{marked as s$}from"marked";import i$ from"write-excel-file/node";async function o$(e,t){let r=e.stateId,n=e.displayName,s=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;try{let i=await a$(e,t),o=l$(t.input_format),a=await c$(e,t),l=await d$(e,t.title),c=o==="markdown"?w$(i):p$(i);await E$({sheets:c.length===0?[{name:"Sheet1",headers:[],rows:[]}]:c,outputPath:a,title:l??e.workflow.name});let d=t$(a).size;if(d===0)throw new Error("rendered XLSX file was empty");let u=ZO("sha256").update(jg(a)).digest("hex");return e.dal.insertStepArtifact({step_id:s.id,kind:"render_xlsx",path:a,sha:u,provider_call_mode:"library"}),e.dal.finishStep(s.id,"done",`wrote:${a}`),X(e,r,n,{output_path:a,path:a,bytes:d}),J(e.workflow,t.outcomes?.done??"@terminal:done")}catch(i){let o=i instanceof Error?i.message:String(i);return e.dal.finishStep(s.id,"error",o),X(e,r,n,{error:o}),J(e.workflow,t.outcomes?.error??"@terminal:error")}}async function a$(e,t){if(typeof t.source!="string"||t.source.trim().length===0)return"";let r=(await Ke(t.source,e,e.stateId)).trim(),n=f$(e.project.local_path,r);if(n!==null){if(!QO(n))throw new Error(`source file not found: ${n}`);return jg(n,"utf8")}return r}function l$(e){if(e==null||e==="")return"json";if(e==="json"||e==="markdown")return e;throw new Error(`unsupported input_format: ${String(e)}`)}async function c$(e,t){if(typeof t.output_path!="string"||t.output_path.trim().length===0)throw new Error("output_path is required");let r=(await Ke(t.output_path,e,e.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=u$(e.project.local_path,r);if(!n.endsWith(".xlsx"))throw new Error(`output_path must end with .xlsx: ${n}`);return n}async function d$(e,t){if(typeof t!="string"||t.trim().length===0)return null;let r=(await Ke(t,e,e.stateId)).trim();return r.length===0?null:r}function u$(e,t){let r=Es(e);return n$(Dg(t)?Es(t):Es(r,t))}function f$(e,t){return m$(t)?Dg(t)?Es(t):Es(e,t):null}function m$(e){return e.endsWith(".json")||e.endsWith(".md")||e.endsWith(".markdown")||e.startsWith("./")||e.startsWith("../")||e.startsWith("/")}function p$(e){if(e.trim().length===0)return[];let t;try{t=JSON.parse(e)}catch(r){let n=r instanceof Error?r.message:String(r);throw new Error(`invalid JSON source: ${n}`)}if(!vo(t)||!Array.isArray(t.sheets))throw new Error("JSON source must be an object with sheets[]");return t.sheets.map((r,n)=>_$(r,n))}function _$(e,t){if(!vo(e))throw new Error(`sheets[${t}] must be an object`);let r=h$(e.headers,`sheets[${t}].headers`),n=g$(e.rows,`sheets[${t}].rows`);return{name:typeof e.name=="string"&&e.name.trim().length>0?e.name:`Sheet${t+1}`,headers:r,rows:n,headerStyle:y$(e.styles)}}function h$(e,t){if(e===void 0)return[];if(!Array.isArray(e)||!e.every(r=>typeof r=="string"))throw new Error(`${t} must be an array of strings`);return e}function g$(e,t){if(e===void 0)return[];if(!Array.isArray(e))throw new Error(`${t} must be an array`);return e.map((r,n)=>{if(!Array.isArray(r))throw new Error(`${t}[${n}] must be an array`);return r.map((s,i)=>{if(s===null||typeof s=="string"||typeof s=="number"||typeof s=="boolean")return s;throw new Error(`${t}[${n}][${i}] must be string, number, boolean, or null`)})})}function y$(e){if(!vo(e)||!vo(e.headers))return;let t={};return e.headers.bold===!0&&(t.bold=!0),typeof e.headers.fill=="string"&&(t.fill=e.headers.fill),Object.keys(t).length===0?void 0:t}function w$(e){let t=s$.lexer(e,{gfm:!0}),r=[],n=null;for(let s of t){if(N$(s)){n=s.text;continue}x$(s)&&(r.push({name:n??`Sheet${r.length+1}`,headers:s.header.map(i=>i.text),rows:s.rows.map(i=>i.map(o=>o.text)),headerStyle:{bold:!0}}),n=null)}return r}async function E$(e){e$(r$(e.outputPath),{recursive:!0});let t=new Set,r=e.sheets.map(n=>({sheet:v$(n.name,t),data:T$(n),columns:S$(n)}));await i$(r).toFile(e.outputPath)}function T$(e){let t=[];if(e.headers.length>0){let r=I$(e.headerStyle?.fill);t.push(e.headers.map(n=>({value:n,type:String,fontWeight:e.headerStyle?.bold===!1?void 0:"bold",backgroundColor:r??void 0})))}for(let r of e.rows)t.push(r.map(b$));return t.length===0?[[{}]]:t}function b$(e){return e===null?{}:typeof e=="string"?{value:e,type:String}:typeof e=="number"?{value:e,type:Number}:typeof e=="boolean"?{value:e,type:Boolean}:{}}function S$(e){let t=Math.max(e.headers.length,...e.rows.map(n=>n.length),1),r=[];for(let n=1;n<=t;n+=1){let s=[e.headers[n-1],...e.rows.map(o=>o[n-1])],i=Math.min(60,Math.max(10,...s.map(o=>String(o??"").length+2)));r.push({width:i})}return r}function v$(e,t){let r=k$(e),n=r,s=2;for(;t.has(n.toLowerCase());){let i=` ${s}`;n=`${r.slice(0,31-i.length)}${i}`,s+=1}return t.add(n.toLowerCase()),n}function k$(e){let t=e.replace(/[\[\]:*?/\\]/g," ").trim();return(t.length===0?"Sheet":t).slice(0,31)}function I$(e){if(e===void 0)return null;let t=e.startsWith("#")?e.slice(1):e;return/^[0-9a-fA-F]{6}$/.test(t)?`#${t.toUpperCase()}`:null}function N$(e){return e.type==="heading"&&typeof e.text=="string"}function x$(e){let t=e;return e.type==="table"&&Array.isArray(t.header)&&Array.isArray(t.rows)}function vo(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var Pg,Fg=T(()=>{"use strict";Be();Pg={description:{displayName:"Render XLSX",name:"render-xlsx",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"done"},{name:"error"}],properties:[{name:"source",displayName:"Source",type:"string",required:!0,description:"JSON string, markdown table text, or path to a .json/.md/.markdown file."},{name:"input_format",displayName:"Input Format",type:"options",default:"json",options:[{name:"JSON",value:"json"},{name:"Markdown",value:"markdown"}]},{name:"output_path",displayName:"Output Path",type:"string",required:!0,description:"Absolute or project-relative .xlsx path to write."},{name:"title",displayName:"Title",type:"string",required:!1,description:"Optional workbook title."}],mutates_external_state:!0,builtin:!0},execute:async e=>o$(e,e.state)}});import{spawnSync as A$}from"node:child_process";async function L$(e,t){let r=e.stateId,n=e.displayName,s=e.workflow.default_task_timeout_ms;for(let f of t.pre_checks??[])if(A$("sh",["-c",f.command],{cwd:e.project.local_path}).status!==0){let p=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1,e.dal.finishStep(p.id,"fail_pre_check",`pre_check_failed:${f.description??f.command}`),X(e,r,n,"fail_pre_check");let _=t.outcomes.fail_pre_check;return _!==void 0?J(e.workflow,_):{kind:"terminal",terminal:Y(e.workflow)}}let i=pn(e,t.durable_memory_tags),o=t.reviewers??[],a=null,l=o.length===0&&t.outcomes_from_stance!==void 0,c=l?Object.keys(t.outcomes_from_stance):[];for(let f=0;f<t.max_loops;f+=1){let m=`${n}:coder[${f}]`,p=await mn(e,m,t.coder,a!==null?`PRIOR REVIEW FEEDBACK:
1863
1863
  ${a}`:null,c,l,s,t.writes_to_project_path===!0,i);if(l){let g=ng(p.text);if(g!==null){let h=q(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.finishStep(h.id,null,`escalation_vocab:${g.token}`),{kind:"escalate",token:g.token,reason:g.reason.length>0?`${g.token}: ${g.reason}`:g.token}}}if(p.outcome===null){let g=q(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.finishStep(g.id,null,p.status_detail),{kind:"escalate",token:"",reason:`coder_no_outcome:${p.status_detail}`}}if(o.length===0){if(t.outcomes_from_stance!==void 0){let S=Object.keys(t.outcomes_from_stance),y=_s(p.text,S);if(y.outcome===null){let I=q(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.finishStep(I.id,null,`unhandled_stance:${y.reason}`),{kind:"escalate",token:"",reason:`no_stance:${y.reason}`}}let w=q(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.finishStep(w.id,y.outcome,"outcomes_from_stance"),X(e,r,n,y.outcome),J(e.workflow,t.outcomes_from_stance[y.outcome])}let g=_s(p.text,R$);if(g.outcome!==null){let S=q(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.finishStep(S.id,g.outcome,"default_failure_stance"),X(e,r,n,g.outcome),{kind:"escalate",token:g.outcome,reason:`failure_stance:${g.outcome}`}}let h=q(e,{run_id:e.run_id,state_name:n});if(e.steps_executed+=1,e.dal.finishStep(h.id,"approve","no_reviewers"),X(e,r,n,"approve"),t.write_back_durable_memory){let S=e.membersByAlias.get(t.coder.alias);S!==void 0&&await Vt(e,n,S,t.write_back_durable_memory)}return J(e.workflow,t.outcomes.approve)}let _=await Promise.all(o.map(g=>mn(e,`${n}:reviewer_${g.alias}[${f}]`,g,`CODER OUTPUT:
1864
1864
  ${p.text}`,["approve","request_changes"],!0,s,t.writes_to_project_path===!0)));if(_.every(g=>g.outcome==="approve")){let g=q(e,{run_id:e.run_id,state_name:n});if(e.steps_executed+=1,e.dal.finishStep(g.id,"approve",`loop=${f}`),X(e,r,n,"approve"),t.write_back_durable_memory){let h=e.membersByAlias.get(t.coder.alias);h!==void 0&&await Vt(e,n,h,t.write_back_durable_memory)}return J(e.workflow,t.outcomes.approve)}if(a=_.filter(g=>g.outcome==="request_changes").map(g=>g.text).join(`
1865
1865
 
1866
- `),t.loop_feedback_artifact!==void 0){let g=q(e,{run_id:e.run_id,state_name:`${n}:feedback[${f}]`});e.steps_executed+=1,e.dal.finishStep(g.id,"feedback_captured",`loop=${f}`),e.dal.insertStepArtifact({step_id:g.id,kind:t.loop_feedback_artifact,content:a})}}let d=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1,e.dal.finishStep(d.id,"max_loops_exceeded",`loops=${t.max_loops}`),X(e,r,n,"max_loops_exceeded");let u=t.outcomes.max_loops_exceeded;return u!==void 0?J(e.workflow,u):{kind:"terminal",terminal:Y(e.workflow)}}var R$,Ug,Wg=T(()=>{"use strict";cd();Be();R$=["blocked","failed","aborted"],Ug={description:{displayName:"Review",name:"review",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],emits_progress:!0,builtin:!0},execute:async e=>L$(e,e.state)}});import{spawnSync as O$}from"node:child_process";async function $$(e,t){let r=e.stateId,n=e.displayName,s=await Ke(t.command,e,n),i=md(e,n),o=_g(s);if(o.matched&&!i){let _=q(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.insertSessionEvent({run_id:e.run_id,step_id:_.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"side_effect_without_pause",state_id:n,kind:o.kind,command:s,message:`ShellStep ${n} runs a classified side-effect command (${o.kind}) without a preceding approved gate`})}),e.dal.finishStep(_.id,null,`policy_violation:side_effect_without_pause:${o.kind}`),{kind:"terminal",terminal:Y(e.workflow)}}let a=new Date(Date.now()-1),l=typeof t.timeout_ms=="number"&&t.timeout_ms>0,c=O$("sh",["-c",s],{cwd:e.project.local_path,...l?{timeout:t.timeout_ms}:{},encoding:"utf8",env:{...process.env}}),d=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;let u=typeof c.stderr=="string"?c.stderr:"",f=c.error;if((u.length>0||f!==void 0)&&e.dal.insertSessionEvent({run_id:e.run_id,step_id:d.id,kind:"shellstep_stderr",timestamp_ms:Date.now(),payload:JSON.stringify({state_id:n,exit_status:c.status,stderr:u,spawn_error:f===void 0?null:f instanceof Error?f.message:String(f),command:s})}),c.status===null)return l?(e.dal.finishStep(d.id,null,`timeout:${t.timeout_ms}ms`),{kind:"terminal",terminal:"shell_step_timeout"}):(e.dal.finishStep(d.id,null,"shell_step_signal_terminated"),{kind:"terminal",terminal:Y(e.workflow)});if(t.writes_to_project_path!==!0&&e.project.local_path.trim().length>0&&pd(e.project.local_path,a))return e.dal.insertSessionEvent({run_id:e.run_id,step_id:d.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"writes_to_project_path",state_id:n,message:`ShellStep ${n} wrote to project.local_path without writes_to_project_path: true`})}),e.dal.finishStep(d.id,null,"policy_violation:writes_to_project_path"),{kind:"terminal",terminal:Y(e.workflow)};if(t.capture_output_to!==void 0){let _=c.stdout??"";e.dal.insertStepArtifact({step_id:d.id,kind:t.capture_output_to,content:_})}let m=String(c.status),p=t.outcomes_from_exit[m]??t.outcomes_from_exit.default;return p===void 0?(e.dal.insertStepArtifact({step_id:d.id,kind:"unhandled_exit",content:m}),e.dal.finishStep(d.id,null,`shell_step_unhandled_exit:${m}`),{kind:"terminal",terminal:"shell_step_unhandled_exit"}):(e.dal.finishStep(d.id,m,`exit=${c.status}`),X(e,r,n,m),J(e.workflow,p))}var Bg,qg=T(()=>{"use strict";Be();Bg={description:{displayName:"Shell Step",name:"shell-step",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],mutates_external_state:!0,builtin:!0},execute:async e=>$$(e,e.state)}});async function C$(e,t){let r=e.stateId,n=e.displayName,s=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;let i=e.dal.getWorkflowByName(t.workflow_name);if(i===null)return e.dal.finishStep(s.id,null,`subflow_missing_workflow:${t.workflow_name}`),{kind:"terminal",terminal:Y(e.workflow)};let o=ct(i.definition),a=await M$(e,t),l=await e.runChildWorkflow(i,o,a);if(l.paused===!0)return e.dal.finishStep(s.id,null,`subflow_paused:${l.run_id}`),{kind:"paused"};let c=l.terminal_state;if(c===null)return e.dal.finishStep(s.id,null,`subflow_no_terminal:${l.run_id}`),{kind:"terminal",terminal:Y(e.workflow)};X(e,r,n,j$(e,l.run_id,o.outputs??[])),e.dal.finishStep(s.id,c,`child_run=${l.run_id}`);let d=t.outcomes[c]??t.outcomes.default;return d===void 0?{kind:"terminal",terminal:Y(e.workflow)}:J(e.workflow,d)}async function M$(e,t){let r={};for(let[n,s]of Object.entries(t.inputs??{})){let i=await lg(s,e);r[n]=i===s?await Eo(s,e):i}return r}function j$(e,t,r){let n={};for(let s of r)n[s.name]=D$(e,t,s);return n}function D$(e,t,r){let s=e.dal.query("SELECT * FROM step WHERE run_id = ? AND state_name = ? ORDER BY id DESC LIMIT 1",t,r.source_step_id)[0];if(s===void 0)return null;let i=P$(s,r.source_field);if(i.found)return i.value;let a=e.dal.query("SELECT * FROM step_artifact WHERE step_id = ? AND kind = ? ORDER BY id DESC LIMIT 1",s.id,r.source_field)[0];return a===void 0?null:a.content??a.path??a.sha??null}function P$(e,t){switch(t){case"id":return{found:!0,value:e.id};case"run_id":return{found:!0,value:e.run_id};case"parent_step_id":return{found:!0,value:e.parent_step_id};case"state_name":return{found:!0,value:e.state_name};case"outcome":return{found:!0,value:e.outcome};case"status_detail":return{found:!0,value:e.status_detail};case"started_at":return{found:!0,value:e.started_at};case"ended_at":return{found:!0,value:e.ended_at};default:return{found:!1}}}var Hg,Jg=T(()=>{"use strict";cs();Be();hs();Hg={description:{displayName:"Subflow",name:"subflow",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[{name:"workflow_name",displayName:"Workflow Name",type:"string",description:"Latest saved workflow name to execute as a child run."}],builtin:!0},execute:async e=>C$(e,e.state)}});function F$(e,t){let r=e.stateId,n=e.displayName,s=t.name??n,i=q(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.finishStep(i.id,s,t.kind??"neutral"),X(e,r,n,s),{kind:"terminal",terminal:s}}var Xg,Gg=T(()=>{"use strict";Be();Xg={description:{displayName:"Terminal",name:"terminal",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[],outputs:[],properties:[{name:"kind",displayName:"Kind",type:"options",required:!0,options:[{name:"success",value:"success"},{name:"failure",value:"failure"},{name:"neutral",value:"neutral"}]},{name:"name",displayName:"Name",type:"string",required:!0}],builtin:!0},execute:e=>F$(e,e.state)}});async function U$(e){let t=typeof e.parameters.org=="string"?e.parameters.org:"",r=typeof e.parameters.repo=="string"?e.parameters.repo:"";if(t.length===0||r.length===0)return null;let n=new URL(`https://api.github.com/repos/${t}/${r}/issues`);n.searchParams.set("state","open"),typeof e.parameters.label=="string"&&e.parameters.label.length>0&&n.searchParams.set("labels",e.parameters.label),typeof e.parameters.since=="string"&&e.parameters.since.length>0&&n.searchParams.set("since",e.parameters.since);let s=await fetch(n);if(!s.ok)throw new Error(`github issue trigger failed: HTTP ${s.status}`);let i=await s.json();if(!Array.isArray(i))throw new Error("github issue trigger returned unexpected JSON");let o=W$(e.cursor),a=i.filter(B$).filter(c=>c.id>o);if(a.length===0)return null;let l=Math.max(...a.map(c=>c.id));return{main:a.map(c=>({trigger_id:e.trigger_id,issue_id:c.id,issue_number:c.number,issue_url:c.html_url,title:c.title,cursor:String(l)}))}}function W$(e){if(e===void 0)return 0;let t=Number(e);return Number.isFinite(t)?t:0}function B$(e){if(e===null||typeof e!="object"||Array.isArray(e))return!1;let t=e;return typeof t.id=="number"&&typeof t.number=="number"&&typeof t.html_url=="string"&&typeof t.title=="string"}var Vg,Kg=T(()=>{"use strict";Vg={description:{displayName:"GitHub Issue Trigger",name:"trigger-gh-issue",namespace:"lmctl",group:["trigger"],version:[1],inputs:[],outputs:[{name:"main"}],properties:[{name:"org",displayName:"Org",type:"string",required:!0},{name:"repo",displayName:"Repo",type:"string",required:!0},{name:"label",displayName:"Label",type:"string"}],requires_credentials:["github"],builtin:!0},poll:async e=>U$(e)}});async function q$(e){let t=typeof e.parameters.cron=="string"?e.parameters.cron.trim():"";if(t.length===0)return null;let r=new Date(Date.now()).toISOString().slice(0,16);return e.cursor===r?null:{main:[{trigger_id:e.trigger_id,fired_at:new Date(Date.now()).toISOString(),cursor:r,cron:t}]}}var Yg,zg=T(()=>{"use strict";Yg={description:{displayName:"Schedule Trigger",name:"trigger-schedule",namespace:"lmctl",group:["trigger"],version:[1],inputs:[],outputs:[{name:"main"}],properties:[{name:"cron",displayName:"Cron",type:"string",required:!0}],builtin:!0},poll:async e=>q$(e)}});function Zg(e){e.register(gg),e.register(Ug),e.register(Tg),e.register(Ng),e.register(Ag),e.register($g),e.register(Pg),e.register(Bg),e.register(wg),e.register(Sg),e.register(Hg),e.register(Xg),e.register(Yg),e.register(Vg)}var Qg=T(()=>{"use strict";yg();Eg();bg();kg();xg();Rg();Mg();Fg();Wg();qg();Jg();Gg();Kg();zg()});function ey(){return ko===null&&(ko=new hd,Zg(ko)),ko}var H$,hd,ko,ty=T(()=>{"use strict";Qg();H$={Review:"lmctl/review",Consolidate:"lmctl/consolidate",Interactive:"lmctl/interactive",Loop:"lmctl/loop",ShellStep:"lmctl/shell-step",AssertRepoClean:"lmctl/assert-repo-clean",Choice:"lmctl/choice",ForEach:"lmctl/foreach",Subflow:"lmctl/subflow",Terminal:"lmctl/terminal"},hd=class{types=new Map;register(t){let r=`${t.description.namespace}/${t.description.name}`;if(this.types.has(r))throw new Error(`archetype already registered: ${r}`);this.types.set(r,t)}get(t){let r=t.includes("/")?t:H$[t];return r?this.types.get(r):void 0}list(){return Array.from(this.types.values())}},ko=null});async function sy(e){cy(e.workflow);let t=e.workflowRow??e.dal.getWorkflowByName(e.workflow.name,e.workflow.version);if(t===null)throw new Error(`workflow ${e.workflow.name}@${e.workflow.version} is not registered`);let r=e.dal.getProjectByJob(e.job.id);if(r===null)throw new Error(`job ${e.job.id} has no project`);let n=X$(t.definition,e.workflow),s=e.job.run_id===null?null:e.dal.getRun(e.job.run_id),i=Ts(n)?n.entry_step_id:n.start_at,o=s?.terminal_state===null?s:e.dal.insertRun({job_id:e.job.id,workflow_id:t.id,team_id:e.team.id,current_state:i}),a=n.requires,l=Yh(a);if(l!==null)return e.dal.setRunTerminalState(o.id,"aborted"),e.dal.raiseAttention({kind:"missing_workflow_dependency",severity:"error",project_id:r.id,run_id:o.id,payload:JSON.stringify({run_id:o.id,workflow_name:n.name,kind:l.kind,tool:l.tool,install_hint:l.install_hint,last_error:l.message,detail:l.detail??null})}),{run_id:o.id,terminal_state:"aborted",steps_executed:0};let c=new Map(e.members.map(m=>[m.alias,m]));if(Ts(n)){let m=gd({dal:e.dal,workflow:No(n),job:e.job,project:r,run:o,membersByAlias:c,outcomes:s!==null&&o===s?e.dal.listLatestStepOutcomesByState(o.id):{},inputs:fr(e.job.payload)??{},team_id:e.team.id}),p=await oy(n,m,o.current_state??n.entry_step_id);return ny(e.dal,r.id,o.id,n.name,p),p}let d=s!==null&&o===s?e.dal.listLatestStepOutcomesByState(o.id):{},u=gd({dal:e.dal,workflow:n,job:e.job,project:r,run:o,membersByAlias:c,outcomes:d,inputs:fr(e.job.payload)??{},team_id:e.team.id}),f=await iy(u,o.current_state??n.start_at);return ny(e.dal,r.id,o.id,n.name,f),f}function ny(e,t,r,n,s){if(s.paused===!0)return;let i=s.terminal_state;if(i===null)return;let o="unknown",a=!1;try{let d=e.getRun(r);if(d!==null){let u=e.getWorkflow(d.workflow_id);if(u!==null){let f=JSON.parse(u.definition),p=(f.terminals??{})[i];if(p!==void 0&&typeof p.kind=="string"&&(p.kind==="success"||p.kind==="failure"||p.kind==="neutral")&&(o=p.kind),o==="unknown"&&Array.isArray(f.steps)){for(let g of f.steps)if(g.type==="lmctl/terminal"&&g.parameters!==null&&typeof g.parameters=="object"){let h=g.parameters;if(h.name===i&&(h.kind==="success"||h.kind==="failure"||h.kind==="neutral")){o=h.kind;break}}}let _=f.errors;if(_!==null&&typeof _=="object"){let g=_;(g.on_unhandled_failure!==void 0||g.on_unhandled_failure_state!==void 0)&&(a=!0)}}}}catch{}if(o==="success"||o==="failure"&&a)return;let l=null;try{l=e.query("SELECT status_detail FROM step WHERE run_id = ? ORDER BY id DESC LIMIT 1",r)[0]?.status_detail??null}catch{l=null}let c=o==="failure"?"workflow_failed":"workflow_has_issues";e.raiseAttention({kind:c,severity:o==="failure"?"error":"warn",project_id:t,run_id:r,payload:JSON.stringify({run_id:r,workflow_name:n,terminal_state:i,terminal_kind:o,last_error:l})})}function gd(e){let t={dal:e.dal,workflow:e.workflow,job:e.job,project:e.project,run_id:e.run.id,membersByAlias:e.membersByAlias,inputs:e.inputs,outcomes:e.outcomes,transcripts:{},progress_step_id:null,steps_executed:0,last_state_id:null,errors_block_fired:!1,iteration:null,parent_step_id:null,dispatchState:async(r,n,s)=>{let i=t.parent_step_id,o=t.iteration;t.parent_step_id=s?.parent_step_id??i,t.iteration=s?.iteration??o;try{return await yd(t,r,n,s?.display_name??r)}finally{t.parent_step_id=i,t.iteration=o}},runChildWorkflow:async(r,n,s)=>{cy(n);let i=Ts(n)?n.entry_step_id:n.start_at,o=e.dal.insertRun({job_id:e.job.id,workflow_id:r.id,team_id:e.team_id,current_state:i,parent_run_id:t.run_id}),a=gd({dal:e.dal,workflow:Ts(n)?No(n):n,job:e.job,project:e.project,run:o,membersByAlias:e.membersByAlias,outcomes:{},inputs:s,team_id:e.team_id});return Ts(n)?oy(n,a,o.current_state??n.entry_step_id):iy(a,o.current_state??n.start_at)}};return t}async function iy(e,t){let r=t;if(r.startsWith(gs))return{run_id:e.run_id,terminal_state:null,steps_executed:0,paused:!0};for(let s=0;s<1e3;s+=1){if(r.startsWith("@terminal:"))return Kt(e,r.slice(10));e.dal.setRunCurrentState(e.run_id,r),e.last_state_id=r;let i=e.workflow.states[r];if(i===void 0){let l=Io(e,Y(e.workflow));if(l.kind==="paused")return Ce(e);if(l.kind==="escalate")return tt(e,{id:r,name:r,type:"unknown"},l.token,l.reason),Ce(e);if(l.kind==="terminal")return Kt(e,l.terminal);r=l.state;continue}let o,a=ly(e,r);if(a!==null){let l=q(e,{run_id:e.run_id,state_name:r});if(e.steps_executed+=1,e.dal.finishStep(l.id,a,"escalation_resume"),X(e,r,r,a),a===Jn)return Kt(e,ol);let c=i.outcomes?.[a];o=c!==void 0?J(e.workflow,c):tt(e,{id:r,name:r,type:i.type},a,`no declared edge for resumed outcome '${a}' from state '${r}'`)}else o=await yd(e,r,i);if(o.kind==="paused")return Ce(e);if(o.kind==="escalate")return tt(e,{id:r,name:r,type:i.type},o.token,o.reason),Ce(e);if(o.kind==="terminal"){let l=Io(e,o.terminal);if(l.kind==="paused")return Ce(e);if(l.kind==="escalate")return tt(e,{id:r,name:r,type:i.type},l.token,l.reason),Ce(e);if(l.kind==="terminal")return Kt(e,l.terminal);r=l.state;continue}r=o.state}e.dal.raiseAttention({kind:"engine_step_limit_exceeded",severity:"error",project_id:e.project.id,run_id:e.run_id,payload:JSON.stringify({run_id:e.run_id})});let n=Io(e,Y(e.workflow));return n.kind==="terminal"?Kt(e,n.terminal):Kt(e,Y(e.workflow))}async function oy(e,t,r){let n=new Map(e.steps.map(o=>[o.id,o])),s=new Map(e.steps.map(o=>[o.name,o])),i=r;for(let o=0;o<1e3;o+=1){t.dal.setRunCurrentState(t.run_id,i);let a=n.get(i);if(a===void 0)return tt(t,{id:i,name:i,type:"unknown"},"",`internal:unknown v3 step '${i}'`),Ce(t);let l=ly(t,a.id);if(l!==null){let m=q(t,{run_id:t.run_id,state_name:a.name});if(t.steps_executed+=1,t.dal.finishStep(m.id,l,"escalation_resume"),X(t,a.id,a.name,l),l===Jn)return Kt(t,ol);let p=Object.keys(e.connections[a.id]??{}),_=e.connections[a.id]?.[l]?.[0]?.[0]?.step_id??e.connections[a.id]?.main?.[0]?.[0]?.step_id;if(_===void 0)return tt(t,{id:a.id,name:a.name,type:a.type},l,`no declared edge for resumed outcome '${l}' from step '${a.id}'`,{declared_outcomes:p}),Ce(t);i=_;continue}let c=await J$(t,e,a);if(c.kind==="paused")return Ce(t);let d=Object.keys(e.connections[a.id]??{});if(c.kind==="escalate")return tt(t,{id:a.id,name:a.name,type:a.type},c.token,c.reason,{declared_outcomes:d}),Ce(t);let u=c.kind==="terminal"?c.terminal:c.state;if(a.type==="lmctl/terminal"){let m=t.workflow;t.workflow=No(e,a);try{let p=Io(t,u);if(p.kind==="paused")return Ce(t);if(p.kind==="escalate")return tt(t,{id:a.id,name:a.name,type:a.type},p.token,p.reason),Ce(t);if(p.kind==="terminal")return Kt(t,p.terminal);let _=s.get(p.state);if(_===void 0)return tt(t,{id:a.id,name:a.name,type:a.type},"",`internal:unknown v3 error handler step '${p.state}'`),Ce(t);i=_.id;continue}finally{t.workflow=m}}if(Vr(u))return tt(t,{id:a.id,name:a.name,type:a.type},u,`generic escalation '${u}' from step '${a.id}'`,{declared_outcomes:d}),Ce(t);let f=e.connections[a.id]?.[u]?.[0]?.[0]?.step_id??e.connections[a.id]?.main?.[0]?.[0]?.step_id;if(f===void 0)return tt(t,{id:a.id,name:a.name,type:a.type},u,`no declared edge for outcome '${u}' from step '${a.id}'`,{declared_outcomes:d}),Ce(t);i=f}return t.dal.raiseAttention({kind:"engine_step_limit_exceeded",severity:"error",project_id:t.project.id,run_id:t.run_id,payload:JSON.stringify({run_id:t.run_id})}),Kt(t,"aborted")}async function J$(e,t,r){let n=ay(t,r),s=e.workflow;e.workflow=No(t,r);try{return await yd(e,r.id,n,r.name)}finally{e.workflow=s}}function ay(e,t){let r=t.parameters,n=t.members??{},s=Object.keys(e.connections[t.id]??{}),i=Object.fromEntries(s.map(a=>[a,`@terminal:${a}`])),o={state_name:t.name};switch(t.type){case"lmctl/review":{let a=s.filter(l=>!["approve","request_changes","fail_pre_check","max_loops_exceeded"].includes(l));return{...o,type:"Review",...r,coder:n.coder,reviewers:n.reviewers,outcomes:{approve:i.approve??"@terminal:approve",...i.request_changes!==void 0?{request_changes:i.request_changes}:{},...i.fail_pre_check!==void 0?{fail_pre_check:i.fail_pre_check}:{},...i.max_loops_exceeded!==void 0?{max_loops_exceeded:i.max_loops_exceeded}:{}},...a.length>0?{outcomes_from_stance:Object.fromEntries(a.map(l=>[l,`@terminal:${l}`]))}:{}}}case"lmctl/consolidate":return{...o,type:"Consolidate",...r,researchers:n.researchers,consolidator:n.consolidator,outcomes:{ok:i.ok??"@terminal:ok",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/interactive":return{...o,type:"Interactive",...r,agent:n.agent,outcomes:{done:i.done??"@terminal:done",...i.timeout!==void 0?{timeout:i.timeout}:{}}};case"lmctl/loop":return{...o,type:"Loop",...r,outcomes:{ok:i.ok??"@terminal:ok",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/render-docx":return{...o,type:"lmctl/render-docx",...r,outcomes:{done:i.done??"@terminal:done",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/render-xlsx":return{...o,type:"lmctl/render-xlsx",...r,outcomes:{done:i.done??"@terminal:done",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/shell-step":return{...o,type:"ShellStep",...r,outcomes_from_exit:r.outcomes_from_exit??Object.fromEntries(s.map(a=>[a.slice(5),`@terminal:${a}`]))};case"lmctl/assert-repo-clean":return{...o,type:"AssertRepoClean",...r,next:i.main??"@terminal:main"};case"lmctl/choice":return{...o,type:"Choice",...r};case"lmctl/foreach":return{...o,type:"ForEach",...r,outcomes:{all_ok:i.all_ok??"@terminal:all_ok",...i.any_failed!==void 0?{any_failed:i.any_failed}:{}}};case"lmctl/subflow":return{...o,type:"Subflow",...r,outcomes:i};case"lmctl/terminal":return{...o,type:"Terminal",name:r.name,kind:r.kind};default:return{...o,type:t.type,...r}}}async function yd(e,t,r,n){let s=ey().get(r.type);if(s===void 0)throw new Error(`unknown archetype: ${r.type}`);if(s.execute===void 0)throw new Error(`archetype ${r.type} has no execute() - is it a trigger-only archetype used as a step?`);let i=e.emit_progress,o=e.progress_step_id;e.emit_progress=s.description.emits_progress===!0?K$(e,s):void 0,e.progress_step_id=null;try{return await s.execute(mg(e,t,r,n??t))}finally{e.emit_progress=i,e.progress_step_id=o}}function X$(e,t){try{let r=JSON.parse(e);if(V$(r)&&r.definition_schema_version===3)return It.parse(r)}catch{return t}return t}function Ts(e){return e.definition_schema_version===3}function No(e,t){let r=t===void 0?[]:Object.keys(e.connections[t.id]??{}),n=Object.fromEntries(r.map(i=>[i,{kind:i==="aborted"?"failure":"neutral"}])),s={};if(t?.type==="lmctl/loop"&&typeof t.parameters.body=="string"){let i=e.steps.find(o=>o.name===t.parameters.body);i!==void 0&&(s[t.parameters.body]=ay(e,i))}return t?.type==="lmctl/terminal"&&typeof t.parameters.name=="string"&&(n[t.parameters.name]={kind:G$(t.parameters.kind)}),n.aborted??={kind:"failure"},{name:e.name,version:e.version,definition_schema_version:2,primitive_version:2,start_at:t?.name??e.entry_step_id,states:s,terminals:n,...e.default_task_timeout_ms!==void 0?{default_task_timeout_ms:e.default_task_timeout_ms}:{},...e.concurrency_key!==void 0?{concurrency_key:e.concurrency_key}:{},...e.concurrent_limit!==void 0?{concurrent_limit:e.concurrent_limit}:{},...e.errors!==void 0?{errors:e.errors}:{}}}function G$(e){return e==="success"||e==="failure"||e==="neutral"?e:"neutral"}function V$(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function K$(e,t){let r=`progress.${t.description.namespace}/${t.description.name}`;return n=>{try{if(typeof n.kind!="string"||n.kind.length===0)return;e.dal.insertSessionEvent({run_id:e.run_id,step_id:e.progress_step_id,kind:`${r}.${n.kind}`,timestamp_ms:Date.now(),payload:JSON.stringify({message:n.message,data:n.data})})}catch(s){let i=s instanceof Error?s.message:String(s);console.warn(`[progress] dropped ${r} event: ${i}`)}}}function Kt(e,t){e.dal.setRunTerminalState(e.run_id,t);try{Xh(e.run_id,e.dal)}catch{}return{run_id:e.run_id,terminal_state:t,steps_executed:e.steps_executed}}function Ce(e){return{run_id:e.run_id,terminal_state:null,steps_executed:e.steps_executed,paused:!0}}function ly(e,t){let n=e.dal.getRun(e.run_id)?.pending_escalation_decision??null;if(n===null)return null;let s;try{let a=JSON.parse(n);if(a===null||typeof a!="object"||Array.isArray(a))return null;s=a}catch{return null}let i=s[t];if(typeof i!="string")return null;delete s[t];let o=Object.keys(s).length>0?JSON.stringify(s):null;return e.dal.setRunPendingEscalationDecision(e.run_id,o),i}function Io(e,t){if(!Y$(e.workflow,t)||e.errors_block_fired)return{kind:"terminal",terminal:t};let r=e.workflow.errors;return r===void 0?{kind:"terminal",terminal:t}:(e.errors_block_fired=!0,r.on_unhandled_failure_state!==void 0?{kind:"state",state:r.on_unhandled_failure_state}:(r.on_unhandled_failure!==void 0&&z$(e,t,r.on_unhandled_failure),{kind:"terminal",terminal:t}))}function Y$(e,t){return e.definition_schema_version===2&&e.terminals[t]?.kind==="failure"}function z$(e,t,r){let n=Z$(e),s=r.capture_evidence&&n!==null?Q$(e,n.id):[];e.dal.raiseAttention({kind:r.attention_kind,severity:r.severity,project_id:e.project.id,run_id:e.run_id,payload:JSON.stringify({run_id:e.run_id,terminal_state:t,current_state:e.last_state_id,last_step_id:n?.id??null,last_error:n?.status_detail??null,evidence_paths:s,recommend_recovery:r.recommend_recovery??null})})}function Z$(e){return e.dal.query("SELECT id, state_name, outcome, status_detail FROM step WHERE run_id = ? ORDER BY id DESC LIMIT 1",e.run_id)[0]??null}function Q$(e,t){return e.dal.query("SELECT path FROM step_artifact WHERE step_id = ? AND path IS NOT NULL ORDER BY id DESC",t).map(n=>n.path)}function cy(e){if(!ry.includes(e.definition_schema_version))throw new Error(`unsupported definition_schema_version ${e.definition_schema_version}; supported versions: ${ry.join(", ")}`)}var ry,dy=T(()=>{"use strict";cn();Gh();zh();Be();ty();Xn();ry=[1,2,3]});import{readFileSync as eC,readdirSync as tC}from"node:fs";import{basename as rC,join as nC,resolve as sC}from"node:path";function my(e={}){let t=sC(e.workflowsDir??"workflows"),r=tC(t).filter(n=>n.endsWith(".compound.json")).sort((n,s)=>n.localeCompare(s));return{generated_at:new Date().toISOString(),workflows_dir:t,rows:r.map(n=>iC(nC(t,n)))}}function iC(e){let t=rC(e);try{let r=eC(e,"utf8"),n=ct(r);return hy(t,n)}catch(r){return{file:t,workflow_name:null,status:"FAIL",first_step_id:null,first_step_type:null,first_step_disposition:null,note:gy(r)}}}function py(e,t){try{let r=ct(t);return hy(e,r)}catch(r){return{file:e,workflow_name:e,status:"FAIL",first_step_id:null,first_step_type:null,first_step_disposition:null,note:gy(r)}}}function _y(e){let t=[];t.push(`workflow verification - ${e.generated_at}`),t.push(`dir: ${e.workflows_dir}`),t.push(""),t.push(`${"status".padEnd(17)} ${"workflow".padEnd(36)} ${"first step".padEnd(52)} note`),t.push(`${"-".repeat(17)} ${"-".repeat(36)} ${"-".repeat(52)} ${"-".repeat(30)}`);for(let i of e.rows){let o=(i.workflow_name??i.file).slice(0,36).padEnd(36),a=`${i.first_step_id??"-"}${i.first_step_type===null?"":` (${i.first_step_type})`}`;t.push(`${i.status.padEnd(17)} ${o} ${a.slice(0,52).padEnd(52)} ${i.note}`)}let r=e.rows.filter(i=>i.status==="PASS").length,n=e.rows.filter(i=>i.status==="PASS_NEEDS_INPUTS").length,s=e.rows.filter(i=>i.status==="FAIL").length;return t.push(""),t.push(`summary: ${r} pass, ${n} pass_needs_inputs, ${s} fail`),`${t.join(`
1866
+ `),t.loop_feedback_artifact!==void 0){let g=q(e,{run_id:e.run_id,state_name:`${n}:feedback[${f}]`});e.steps_executed+=1,e.dal.finishStep(g.id,"feedback_captured",`loop=${f}`),e.dal.insertStepArtifact({step_id:g.id,kind:t.loop_feedback_artifact,content:a})}}let d=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1,e.dal.finishStep(d.id,"max_loops_exceeded",`loops=${t.max_loops}`),X(e,r,n,"max_loops_exceeded");let u=t.outcomes.max_loops_exceeded;return u!==void 0?J(e.workflow,u):{kind:"terminal",terminal:Y(e.workflow)}}var R$,Ug,Wg=T(()=>{"use strict";ld();Be();R$=["blocked","failed","aborted"],Ug={description:{displayName:"Review",name:"review",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],emits_progress:!0,builtin:!0},execute:async e=>L$(e,e.state)}});import{spawnSync as O$}from"node:child_process";async function $$(e,t){let r=e.stateId,n=e.displayName,s=await Ke(t.command,e,n),i=fd(e,n),o=_g(s);if(o.matched&&!i){let _=q(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.insertSessionEvent({run_id:e.run_id,step_id:_.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"side_effect_without_pause",state_id:n,kind:o.kind,command:s,message:`ShellStep ${n} runs a classified side-effect command (${o.kind}) without a preceding approved gate`})}),e.dal.finishStep(_.id,null,`policy_violation:side_effect_without_pause:${o.kind}`),{kind:"terminal",terminal:Y(e.workflow)}}let a=new Date(Date.now()-1),l=typeof t.timeout_ms=="number"&&t.timeout_ms>0,c=O$("sh",["-c",s],{cwd:e.project.local_path,...l?{timeout:t.timeout_ms}:{},encoding:"utf8",env:{...process.env}}),d=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;let u=typeof c.stderr=="string"?c.stderr:"",f=c.error;if((u.length>0||f!==void 0)&&e.dal.insertSessionEvent({run_id:e.run_id,step_id:d.id,kind:"shellstep_stderr",timestamp_ms:Date.now(),payload:JSON.stringify({state_id:n,exit_status:c.status,stderr:u,spawn_error:f===void 0?null:f instanceof Error?f.message:String(f),command:s})}),c.status===null)return l?(e.dal.finishStep(d.id,null,`timeout:${t.timeout_ms}ms`),{kind:"terminal",terminal:"shell_step_timeout"}):(e.dal.finishStep(d.id,null,"shell_step_signal_terminated"),{kind:"terminal",terminal:Y(e.workflow)});if(t.writes_to_project_path!==!0&&e.project.local_path.trim().length>0&&md(e.project.local_path,a))return e.dal.insertSessionEvent({run_id:e.run_id,step_id:d.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"writes_to_project_path",state_id:n,message:`ShellStep ${n} wrote to project.local_path without writes_to_project_path: true`})}),e.dal.finishStep(d.id,null,"policy_violation:writes_to_project_path"),{kind:"terminal",terminal:Y(e.workflow)};if(t.capture_output_to!==void 0){let _=c.stdout??"";e.dal.insertStepArtifact({step_id:d.id,kind:t.capture_output_to,content:_})}let m=String(c.status),p=t.outcomes_from_exit[m]??t.outcomes_from_exit.default;return p===void 0?(e.dal.insertStepArtifact({step_id:d.id,kind:"unhandled_exit",content:m}),e.dal.finishStep(d.id,null,`shell_step_unhandled_exit:${m}`),{kind:"terminal",terminal:"shell_step_unhandled_exit"}):(e.dal.finishStep(d.id,m,`exit=${c.status}`),X(e,r,n,m),J(e.workflow,p))}var Bg,qg=T(()=>{"use strict";Be();Bg={description:{displayName:"Shell Step",name:"shell-step",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],mutates_external_state:!0,builtin:!0},execute:async e=>$$(e,e.state)}});async function C$(e,t){let r=e.stateId,n=e.displayName,s=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;let i=e.dal.getWorkflowByName(t.workflow_name);if(i===null)return e.dal.finishStep(s.id,null,`subflow_missing_workflow:${t.workflow_name}`),{kind:"terminal",terminal:Y(e.workflow)};let o=ct(i.definition),a=await M$(e,t),l=await e.runChildWorkflow(i,o,a);if(l.paused===!0)return e.dal.finishStep(s.id,null,`subflow_paused:${l.run_id}`),{kind:"paused"};let c=l.terminal_state;if(c===null)return e.dal.finishStep(s.id,null,`subflow_no_terminal:${l.run_id}`),{kind:"terminal",terminal:Y(e.workflow)};X(e,r,n,j$(e,l.run_id,o.outputs??[])),e.dal.finishStep(s.id,c,`child_run=${l.run_id}`);let d=t.outcomes[c]??t.outcomes.default;return d===void 0?{kind:"terminal",terminal:Y(e.workflow)}:J(e.workflow,d)}async function M$(e,t){let r={};for(let[n,s]of Object.entries(t.inputs??{})){let i=await lg(s,e);r[n]=i===s?await Eo(s,e):i}return r}function j$(e,t,r){let n={};for(let s of r)n[s.name]=D$(e,t,s);return n}function D$(e,t,r){let s=e.dal.query("SELECT * FROM step WHERE run_id = ? AND state_name = ? ORDER BY id DESC LIMIT 1",t,r.source_step_id)[0];if(s===void 0)return null;let i=P$(s,r.source_field);if(i.found)return i.value;let a=e.dal.query("SELECT * FROM step_artifact WHERE step_id = ? AND kind = ? ORDER BY id DESC LIMIT 1",s.id,r.source_field)[0];return a===void 0?null:a.content??a.path??a.sha??null}function P$(e,t){switch(t){case"id":return{found:!0,value:e.id};case"run_id":return{found:!0,value:e.run_id};case"parent_step_id":return{found:!0,value:e.parent_step_id};case"state_name":return{found:!0,value:e.state_name};case"outcome":return{found:!0,value:e.outcome};case"status_detail":return{found:!0,value:e.status_detail};case"started_at":return{found:!0,value:e.started_at};case"ended_at":return{found:!0,value:e.ended_at};default:return{found:!1}}}var Hg,Jg=T(()=>{"use strict";cs();Be();hs();Hg={description:{displayName:"Subflow",name:"subflow",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[{name:"workflow_name",displayName:"Workflow Name",type:"string",description:"Latest saved workflow name to execute as a child run."}],builtin:!0},execute:async e=>C$(e,e.state)}});function F$(e,t){let r=e.stateId,n=e.displayName,s=t.name??n,i=q(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.finishStep(i.id,s,t.kind??"neutral"),X(e,r,n,s),{kind:"terminal",terminal:s}}var Xg,Gg=T(()=>{"use strict";Be();Xg={description:{displayName:"Terminal",name:"terminal",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[],outputs:[],properties:[{name:"kind",displayName:"Kind",type:"options",required:!0,options:[{name:"success",value:"success"},{name:"failure",value:"failure"},{name:"neutral",value:"neutral"}]},{name:"name",displayName:"Name",type:"string",required:!0}],builtin:!0},execute:e=>F$(e,e.state)}});async function U$(e){let t=typeof e.parameters.org=="string"?e.parameters.org:"",r=typeof e.parameters.repo=="string"?e.parameters.repo:"";if(t.length===0||r.length===0)return null;let n=new URL(`https://api.github.com/repos/${t}/${r}/issues`);n.searchParams.set("state","open"),typeof e.parameters.label=="string"&&e.parameters.label.length>0&&n.searchParams.set("labels",e.parameters.label),typeof e.parameters.since=="string"&&e.parameters.since.length>0&&n.searchParams.set("since",e.parameters.since);let s=await fetch(n);if(!s.ok)throw new Error(`github issue trigger failed: HTTP ${s.status}`);let i=await s.json();if(!Array.isArray(i))throw new Error("github issue trigger returned unexpected JSON");let o=W$(e.cursor),a=i.filter(B$).filter(c=>c.id>o);if(a.length===0)return null;let l=Math.max(...a.map(c=>c.id));return{main:a.map(c=>({trigger_id:e.trigger_id,issue_id:c.id,issue_number:c.number,issue_url:c.html_url,title:c.title,cursor:String(l)}))}}function W$(e){if(e===void 0)return 0;let t=Number(e);return Number.isFinite(t)?t:0}function B$(e){if(e===null||typeof e!="object"||Array.isArray(e))return!1;let t=e;return typeof t.id=="number"&&typeof t.number=="number"&&typeof t.html_url=="string"&&typeof t.title=="string"}var Vg,Kg=T(()=>{"use strict";Vg={description:{displayName:"GitHub Issue Trigger",name:"trigger-gh-issue",namespace:"lmctl",group:["trigger"],version:[1],inputs:[],outputs:[{name:"main"}],properties:[{name:"org",displayName:"Org",type:"string",required:!0},{name:"repo",displayName:"Repo",type:"string",required:!0},{name:"label",displayName:"Label",type:"string"}],requires_credentials:["github"],builtin:!0},poll:async e=>U$(e)}});async function q$(e){let t=typeof e.parameters.cron=="string"?e.parameters.cron.trim():"";if(t.length===0)return null;let r=new Date(Date.now()).toISOString().slice(0,16);return e.cursor===r?null:{main:[{trigger_id:e.trigger_id,fired_at:new Date(Date.now()).toISOString(),cursor:r,cron:t}]}}var Yg,zg=T(()=>{"use strict";Yg={description:{displayName:"Schedule Trigger",name:"trigger-schedule",namespace:"lmctl",group:["trigger"],version:[1],inputs:[],outputs:[{name:"main"}],properties:[{name:"cron",displayName:"Cron",type:"string",required:!0}],builtin:!0},poll:async e=>q$(e)}});function Zg(e){e.register(gg),e.register(Ug),e.register(Tg),e.register(Ng),e.register(Ag),e.register($g),e.register(Pg),e.register(Bg),e.register(wg),e.register(Sg),e.register(Hg),e.register(Xg),e.register(Yg),e.register(Vg)}var Qg=T(()=>{"use strict";yg();Eg();bg();kg();xg();Rg();Mg();Fg();Wg();qg();Jg();Gg();Kg();zg()});function ey(){return ko===null&&(ko=new _d,Zg(ko)),ko}var H$,_d,ko,ty=T(()=>{"use strict";Qg();H$={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"},_d=class{types=new Map;register(t){let r=`${t.description.namespace}/${t.description.name}`;if(this.types.has(r))throw new Error(`archetype already registered: ${r}`);this.types.set(r,t)}get(t){let r=t.includes("/")?t:H$[t];return r?this.types.get(r):void 0}list(){return Array.from(this.types.values())}},ko=null});async function sy(e){cy(e.workflow);let t=e.workflowRow??e.dal.getWorkflowByName(e.workflow.name,e.workflow.version);if(t===null)throw new Error(`workflow ${e.workflow.name}@${e.workflow.version} is not registered`);let r=e.dal.getProjectByJob(e.job.id);if(r===null)throw new Error(`job ${e.job.id} has no project`);let n=X$(t.definition,e.workflow),s=e.job.run_id===null?null:e.dal.getRun(e.job.run_id),i=Ts(n)?n.entry_step_id:n.start_at,o=s?.terminal_state===null?s:e.dal.insertRun({job_id:e.job.id,workflow_id:t.id,team_id:e.team.id,current_state:i}),a=n.requires,l=Yh(a);if(l!==null)return e.dal.setRunTerminalState(o.id,"aborted"),e.dal.raiseAttention({kind:"missing_workflow_dependency",severity:"error",project_id:r.id,run_id:o.id,payload:JSON.stringify({run_id:o.id,workflow_name:n.name,kind:l.kind,tool:l.tool,install_hint:l.install_hint,last_error:l.message,detail:l.detail??null})}),{run_id:o.id,terminal_state:"aborted",steps_executed:0};let c=new Map(e.members.map(m=>[m.alias,m]));if(Ts(n)){let m=hd({dal:e.dal,workflow:No(n),job:e.job,project:r,run:o,membersByAlias:c,outcomes:s!==null&&o===s?e.dal.listLatestStepOutcomesByState(o.id):{},inputs:fr(e.job.payload)??{},team_id:e.team.id}),p=await oy(n,m,o.current_state??n.entry_step_id);return ny(e.dal,r.id,o.id,n.name,p),p}let d=s!==null&&o===s?e.dal.listLatestStepOutcomesByState(o.id):{},u=hd({dal:e.dal,workflow:n,job:e.job,project:r,run:o,membersByAlias:c,outcomes:d,inputs:fr(e.job.payload)??{},team_id:e.team.id}),f=await iy(u,o.current_state??n.start_at);return ny(e.dal,r.id,o.id,n.name,f),f}function ny(e,t,r,n,s){if(s.paused===!0)return;let i=s.terminal_state;if(i===null)return;let o="unknown",a=!1;try{let d=e.getRun(r);if(d!==null){let u=e.getWorkflow(d.workflow_id);if(u!==null){let f=JSON.parse(u.definition),p=(f.terminals??{})[i];if(p!==void 0&&typeof p.kind=="string"&&(p.kind==="success"||p.kind==="failure"||p.kind==="neutral")&&(o=p.kind),o==="unknown"&&Array.isArray(f.steps)){for(let g of f.steps)if(g.type==="lmctl/terminal"&&g.parameters!==null&&typeof g.parameters=="object"){let h=g.parameters;if(h.name===i&&(h.kind==="success"||h.kind==="failure"||h.kind==="neutral")){o=h.kind;break}}}let _=f.errors;if(_!==null&&typeof _=="object"){let g=_;(g.on_unhandled_failure!==void 0||g.on_unhandled_failure_state!==void 0)&&(a=!0)}}}}catch{}if(o==="success"||o==="failure"&&a)return;let l=null;try{l=e.query("SELECT status_detail FROM step WHERE run_id = ? ORDER BY id DESC LIMIT 1",r)[0]?.status_detail??null}catch{l=null}let c=o==="failure"?"workflow_failed":"workflow_has_issues";e.raiseAttention({kind:c,severity:o==="failure"?"error":"warn",project_id:t,run_id:r,payload:JSON.stringify({run_id:r,workflow_name:n,terminal_state:i,terminal_kind:o,last_error:l})})}function hd(e){let t={dal:e.dal,workflow:e.workflow,job:e.job,project:e.project,run_id:e.run.id,membersByAlias:e.membersByAlias,inputs:e.inputs,outcomes:e.outcomes,transcripts:{},progress_step_id:null,steps_executed:0,last_state_id:null,errors_block_fired:!1,iteration:null,parent_step_id:null,dispatchState:async(r,n,s)=>{let i=t.parent_step_id,o=t.iteration;t.parent_step_id=s?.parent_step_id??i,t.iteration=s?.iteration??o;try{return await gd(t,r,n,s?.display_name??r)}finally{t.parent_step_id=i,t.iteration=o}},runChildWorkflow:async(r,n,s)=>{cy(n);let i=Ts(n)?n.entry_step_id:n.start_at,o=e.dal.insertRun({job_id:e.job.id,workflow_id:r.id,team_id:e.team_id,current_state:i,parent_run_id:t.run_id}),a=hd({dal:e.dal,workflow:Ts(n)?No(n):n,job:e.job,project:e.project,run:o,membersByAlias:e.membersByAlias,outcomes:{},inputs:s,team_id:e.team_id});return Ts(n)?oy(n,a,o.current_state??n.entry_step_id):iy(a,o.current_state??n.start_at)}};return t}async function iy(e,t){let r=t;if(r.startsWith(gs))return{run_id:e.run_id,terminal_state:null,steps_executed:0,paused:!0};for(let s=0;s<1e3;s+=1){if(r.startsWith("@terminal:"))return Kt(e,r.slice(10));e.dal.setRunCurrentState(e.run_id,r),e.last_state_id=r;let i=e.workflow.states[r];if(i===void 0){let l=Io(e,Y(e.workflow));if(l.kind==="paused")return Ce(e);if(l.kind==="escalate")return tt(e,{id:r,name:r,type:"unknown"},l.token,l.reason),Ce(e);if(l.kind==="terminal")return Kt(e,l.terminal);r=l.state;continue}let o,a=ly(e,r);if(a!==null){let l=q(e,{run_id:e.run_id,state_name:r});if(e.steps_executed+=1,e.dal.finishStep(l.id,a,"escalation_resume"),X(e,r,r,a),a===Jn)return Kt(e,il);let c=i.outcomes?.[a];o=c!==void 0?J(e.workflow,c):tt(e,{id:r,name:r,type:i.type},a,`no declared edge for resumed outcome '${a}' from state '${r}'`)}else o=await gd(e,r,i);if(o.kind==="paused")return Ce(e);if(o.kind==="escalate")return tt(e,{id:r,name:r,type:i.type},o.token,o.reason),Ce(e);if(o.kind==="terminal"){let l=Io(e,o.terminal);if(l.kind==="paused")return Ce(e);if(l.kind==="escalate")return tt(e,{id:r,name:r,type:i.type},l.token,l.reason),Ce(e);if(l.kind==="terminal")return Kt(e,l.terminal);r=l.state;continue}r=o.state}e.dal.raiseAttention({kind:"engine_step_limit_exceeded",severity:"error",project_id:e.project.id,run_id:e.run_id,payload:JSON.stringify({run_id:e.run_id})});let n=Io(e,Y(e.workflow));return n.kind==="terminal"?Kt(e,n.terminal):Kt(e,Y(e.workflow))}async function oy(e,t,r){let n=new Map(e.steps.map(o=>[o.id,o])),s=new Map(e.steps.map(o=>[o.name,o])),i=r;for(let o=0;o<1e3;o+=1){t.dal.setRunCurrentState(t.run_id,i);let a=n.get(i);if(a===void 0)return tt(t,{id:i,name:i,type:"unknown"},"",`internal:unknown v3 step '${i}'`),Ce(t);let l=ly(t,a.id);if(l!==null){let m=q(t,{run_id:t.run_id,state_name:a.name});if(t.steps_executed+=1,t.dal.finishStep(m.id,l,"escalation_resume"),X(t,a.id,a.name,l),l===Jn)return Kt(t,il);let p=Object.keys(e.connections[a.id]??{}),_=e.connections[a.id]?.[l]?.[0]?.[0]?.step_id??e.connections[a.id]?.main?.[0]?.[0]?.step_id;if(_===void 0)return tt(t,{id:a.id,name:a.name,type:a.type},l,`no declared edge for resumed outcome '${l}' from step '${a.id}'`,{declared_outcomes:p}),Ce(t);i=_;continue}let c=await J$(t,e,a);if(c.kind==="paused")return Ce(t);let d=Object.keys(e.connections[a.id]??{});if(c.kind==="escalate")return tt(t,{id:a.id,name:a.name,type:a.type},c.token,c.reason,{declared_outcomes:d}),Ce(t);let u=c.kind==="terminal"?c.terminal:c.state;if(a.type==="lmctl/terminal"){let m=t.workflow;t.workflow=No(e,a);try{let p=Io(t,u);if(p.kind==="paused")return Ce(t);if(p.kind==="escalate")return tt(t,{id:a.id,name:a.name,type:a.type},p.token,p.reason),Ce(t);if(p.kind==="terminal")return Kt(t,p.terminal);let _=s.get(p.state);if(_===void 0)return tt(t,{id:a.id,name:a.name,type:a.type},"",`internal:unknown v3 error handler step '${p.state}'`),Ce(t);i=_.id;continue}finally{t.workflow=m}}if(Vr(u))return tt(t,{id:a.id,name:a.name,type:a.type},u,`generic escalation '${u}' from step '${a.id}'`,{declared_outcomes:d}),Ce(t);let f=e.connections[a.id]?.[u]?.[0]?.[0]?.step_id??e.connections[a.id]?.main?.[0]?.[0]?.step_id;if(f===void 0)return tt(t,{id:a.id,name:a.name,type:a.type},u,`no declared edge for outcome '${u}' from step '${a.id}'`,{declared_outcomes:d}),Ce(t);i=f}return t.dal.raiseAttention({kind:"engine_step_limit_exceeded",severity:"error",project_id:t.project.id,run_id:t.run_id,payload:JSON.stringify({run_id:t.run_id})}),Kt(t,"aborted")}async function J$(e,t,r){let n=ay(t,r),s=e.workflow;e.workflow=No(t,r);try{return await gd(e,r.id,n,r.name)}finally{e.workflow=s}}function ay(e,t){let r=t.parameters,n=t.members??{},s=Object.keys(e.connections[t.id]??{}),i=Object.fromEntries(s.map(a=>[a,`@terminal:${a}`])),o={state_name:t.name};switch(t.type){case"lmctl/review":{let a=s.filter(l=>!["approve","request_changes","fail_pre_check","max_loops_exceeded"].includes(l));return{...o,type:"Review",...r,coder:n.coder,reviewers:n.reviewers,outcomes:{approve:i.approve??"@terminal:approve",...i.request_changes!==void 0?{request_changes:i.request_changes}:{},...i.fail_pre_check!==void 0?{fail_pre_check:i.fail_pre_check}:{},...i.max_loops_exceeded!==void 0?{max_loops_exceeded:i.max_loops_exceeded}:{}},...a.length>0?{outcomes_from_stance:Object.fromEntries(a.map(l=>[l,`@terminal:${l}`]))}:{}}}case"lmctl/consolidate":return{...o,type:"Consolidate",...r,researchers:n.researchers,consolidator:n.consolidator,outcomes:{ok:i.ok??"@terminal:ok",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/interactive":return{...o,type:"Interactive",...r,agent:n.agent,outcomes:{done:i.done??"@terminal:done",...i.timeout!==void 0?{timeout:i.timeout}:{}}};case"lmctl/loop":return{...o,type:"Loop",...r,outcomes:{ok:i.ok??"@terminal:ok",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/render-docx":return{...o,type:"lmctl/render-docx",...r,outcomes:{done:i.done??"@terminal:done",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/render-xlsx":return{...o,type:"lmctl/render-xlsx",...r,outcomes:{done:i.done??"@terminal:done",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/shell-step":return{...o,type:"ShellStep",...r,outcomes_from_exit:r.outcomes_from_exit??Object.fromEntries(s.map(a=>[a.slice(5),`@terminal:${a}`]))};case"lmctl/assert-repo-clean":return{...o,type:"AssertRepoClean",...r,next:i.main??"@terminal:main"};case"lmctl/choice":return{...o,type:"Choice",...r};case"lmctl/foreach":return{...o,type:"ForEach",...r,outcomes:{all_ok:i.all_ok??"@terminal:all_ok",...i.any_failed!==void 0?{any_failed:i.any_failed}:{}}};case"lmctl/subflow":return{...o,type:"Subflow",...r,outcomes:i};case"lmctl/terminal":return{...o,type:"Terminal",name:r.name,kind:r.kind};default:return{...o,type:t.type,...r}}}async function gd(e,t,r,n){let s=ey().get(r.type);if(s===void 0)throw new Error(`unknown archetype: ${r.type}`);if(s.execute===void 0)throw new Error(`archetype ${r.type} has no execute() - is it a trigger-only archetype used as a step?`);let i=e.emit_progress,o=e.progress_step_id;e.emit_progress=s.description.emits_progress===!0?K$(e,s):void 0,e.progress_step_id=null;try{return await s.execute(mg(e,t,r,n??t))}finally{e.emit_progress=i,e.progress_step_id=o}}function X$(e,t){try{let r=JSON.parse(e);if(V$(r)&&r.definition_schema_version===3)return It.parse(r)}catch{return t}return t}function Ts(e){return e.definition_schema_version===3}function No(e,t){let r=t===void 0?[]:Object.keys(e.connections[t.id]??{}),n=Object.fromEntries(r.map(i=>[i,{kind:i==="aborted"?"failure":"neutral"}])),s={};if(t?.type==="lmctl/loop"&&typeof t.parameters.body=="string"){let i=e.steps.find(o=>o.name===t.parameters.body);i!==void 0&&(s[t.parameters.body]=ay(e,i))}return t?.type==="lmctl/terminal"&&typeof t.parameters.name=="string"&&(n[t.parameters.name]={kind:G$(t.parameters.kind)}),n.aborted??={kind:"failure"},{name:e.name,version:e.version,definition_schema_version:2,primitive_version:2,start_at:t?.name??e.entry_step_id,states:s,terminals:n,...e.default_task_timeout_ms!==void 0?{default_task_timeout_ms:e.default_task_timeout_ms}:{},...e.concurrency_key!==void 0?{concurrency_key:e.concurrency_key}:{},...e.concurrent_limit!==void 0?{concurrent_limit:e.concurrent_limit}:{},...e.errors!==void 0?{errors:e.errors}:{}}}function G$(e){return e==="success"||e==="failure"||e==="neutral"?e:"neutral"}function V$(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function K$(e,t){let r=`progress.${t.description.namespace}/${t.description.name}`;return n=>{try{if(typeof n.kind!="string"||n.kind.length===0)return;e.dal.insertSessionEvent({run_id:e.run_id,step_id:e.progress_step_id,kind:`${r}.${n.kind}`,timestamp_ms:Date.now(),payload:JSON.stringify({message:n.message,data:n.data})})}catch(s){let i=s instanceof Error?s.message:String(s);console.warn(`[progress] dropped ${r} event: ${i}`)}}}function Kt(e,t){e.dal.setRunTerminalState(e.run_id,t);try{Xh(e.run_id,e.dal)}catch{}return{run_id:e.run_id,terminal_state:t,steps_executed:e.steps_executed}}function Ce(e){return{run_id:e.run_id,terminal_state:null,steps_executed:e.steps_executed,paused:!0}}function ly(e,t){let n=e.dal.getRun(e.run_id)?.pending_escalation_decision??null;if(n===null)return null;let s;try{let a=JSON.parse(n);if(a===null||typeof a!="object"||Array.isArray(a))return null;s=a}catch{return null}let i=s[t];if(typeof i!="string")return null;delete s[t];let o=Object.keys(s).length>0?JSON.stringify(s):null;return e.dal.setRunPendingEscalationDecision(e.run_id,o),i}function Io(e,t){if(!Y$(e.workflow,t)||e.errors_block_fired)return{kind:"terminal",terminal:t};let r=e.workflow.errors;return r===void 0?{kind:"terminal",terminal:t}:(e.errors_block_fired=!0,r.on_unhandled_failure_state!==void 0?{kind:"state",state:r.on_unhandled_failure_state}:(r.on_unhandled_failure!==void 0&&z$(e,t,r.on_unhandled_failure),{kind:"terminal",terminal:t}))}function Y$(e,t){return e.definition_schema_version===2&&e.terminals[t]?.kind==="failure"}function z$(e,t,r){let n=Z$(e),s=r.capture_evidence&&n!==null?Q$(e,n.id):[];e.dal.raiseAttention({kind:r.attention_kind,severity:r.severity,project_id:e.project.id,run_id:e.run_id,payload:JSON.stringify({run_id:e.run_id,terminal_state:t,current_state:e.last_state_id,last_step_id:n?.id??null,last_error:n?.status_detail??null,evidence_paths:s,recommend_recovery:r.recommend_recovery??null})})}function Z$(e){return e.dal.query("SELECT id, state_name, outcome, status_detail FROM step WHERE run_id = ? ORDER BY id DESC LIMIT 1",e.run_id)[0]??null}function Q$(e,t){return e.dal.query("SELECT path FROM step_artifact WHERE step_id = ? AND path IS NOT NULL ORDER BY id DESC",t).map(n=>n.path)}function cy(e){if(!ry.includes(e.definition_schema_version))throw new Error(`unsupported definition_schema_version ${e.definition_schema_version}; supported versions: ${ry.join(", ")}`)}var ry,dy=T(()=>{"use strict";cn();Gh();zh();Be();ty();Xn();ry=[1,2,3]});import{readFileSync as eC,readdirSync as tC}from"node:fs";import{basename as rC,join as nC,resolve as sC}from"node:path";function my(e={}){let t=sC(e.workflowsDir??"workflows"),r=tC(t).filter(n=>n.endsWith(".compound.json")).sort((n,s)=>n.localeCompare(s));return{generated_at:new Date().toISOString(),workflows_dir:t,rows:r.map(n=>iC(nC(t,n)))}}function iC(e){let t=rC(e);try{let r=eC(e,"utf8"),n=ct(r);return hy(t,n)}catch(r){return{file:t,workflow_name:null,status:"FAIL",first_step_id:null,first_step_type:null,first_step_disposition:null,note:gy(r)}}}function py(e,t){try{let r=ct(t);return hy(e,r)}catch(r){return{file:e,workflow_name:e,status:"FAIL",first_step_id:null,first_step_type:null,first_step_disposition:null,note:gy(r)}}}function _y(e){let t=[];t.push(`workflow verification - ${e.generated_at}`),t.push(`dir: ${e.workflows_dir}`),t.push(""),t.push(`${"status".padEnd(17)} ${"workflow".padEnd(36)} ${"first step".padEnd(52)} note`),t.push(`${"-".repeat(17)} ${"-".repeat(36)} ${"-".repeat(52)} ${"-".repeat(30)}`);for(let i of e.rows){let o=(i.workflow_name??i.file).slice(0,36).padEnd(36),a=`${i.first_step_id??"-"}${i.first_step_type===null?"":` (${i.first_step_type})`}`;t.push(`${i.status.padEnd(17)} ${o} ${a.slice(0,52).padEnd(52)} ${i.note}`)}let r=e.rows.filter(i=>i.status==="PASS").length,n=e.rows.filter(i=>i.status==="PASS_NEEDS_INPUTS").length,s=e.rows.filter(i=>i.status==="FAIL").length;return t.push(""),t.push(`summary: ${r} pass, ${n} pass_needs_inputs, ${s} fail`),`${t.join(`
1867
1867
  `)}
1868
- `}function hy(e,t){let r=aC(t),n=lC(t);if(r===null||n===null)return{file:e,workflow_name:t.name,status:"FAIL",first_step_id:r,first_step_type:n,first_step_disposition:null,note:"entry step missing after validation"};let s=oC(t.inputs);return s.length>0?{file:e,workflow_name:t.name,status:"PASS_NEEDS_INPUTS",first_step_id:r,first_step_type:n,first_step_disposition:`needs_inputs:${n}`,note:`load ok; graph ok; entry step is ${r}; requires inputs: ${s.join(", ")}`}:{file:e,workflow_name:t.name,status:"PASS",first_step_id:r,first_step_type:n,first_step_disposition:`ready:${n}`,note:"load ok; graph ok; first step entered without inputs"}}function oC(e){return(e??[]).filter(t=>t.required===!0&&t.default===void 0).map(t=>t.name)}function aC(e){return wd(e)?e.entry_step_id:e.start_at}function lC(e){return wd(e)?e.steps.find(t=>t.id===e.entry_step_id)?.type??null:e.states[e.start_at]?.type??null}function wd(e){return e.definition_schema_version===3}function gy(e){return e instanceof Gt?e.issues.map(t=>`${t.path}: ${t.message}`).join("; "):e instanceof SyntaxError?`JSON parse failed: ${e.message}`:e instanceof Error?e.message:String(e)}function yy(e){let t=new Set;if(wd(e))for(let r of e.steps){let n=r.members??{};uy(n,t)}else for(let r of Object.values(e.states))uy(r,t);return[...t].sort()}function uy(e,t){let r=["coder","agent","consolidator"],n=["reviewers","researchers"];for(let s of r){let i=e[s],o=fy(i);o!==null&&t.add(o)}for(let s of n){let i=e[s];if(Array.isArray(i))for(let o of i){let a=fy(o);a!==null&&t.add(a)}}}function fy(e){if(e===null||typeof e!="object")return null;let t=e.alias;return typeof t=="string"&&t.length>0?t:null}var xo=T(()=>{"use strict";cs()});function cC({dal:e}){let t=e.listProjects();for(let r of t){let s=e.query("SELECT * FROM job WHERE project_id = ? AND source = ? ORDER BY id DESC LIMIT 1",r.id,Ao)[0]??null;if(s!==null&&(s.status==="queued"||s.status==="running"))continue;let o=(s?.payload?JSON.parse(s.payload):null)?.max_run_id??null,{count:a,maxRunId:l}=dC(e,r,o);if(a<20)continue;let c=o??"initial",d=`${bs}:${r.id}:${c}`;e.enqueueJob({project_id:r.id,source:Ao,source_ref:bs,payload:JSON.stringify({kind:bs,project_id:r.id,completed_sessions:a,max_run_id:l,since_run_id:o}),dedupe_key:d})}}function dC(e,t,r){let n=e.query(`SELECT COUNT(*) AS cnt, MAX(r.id) AS max_id
1868
+ `}function hy(e,t){let r=aC(t),n=lC(t);if(r===null||n===null)return{file:e,workflow_name:t.name,status:"FAIL",first_step_id:r,first_step_type:n,first_step_disposition:null,note:"entry step missing after validation"};let s=oC(t.inputs);return s.length>0?{file:e,workflow_name:t.name,status:"PASS_NEEDS_INPUTS",first_step_id:r,first_step_type:n,first_step_disposition:`needs_inputs:${n}`,note:`load ok; graph ok; entry step is ${r}; requires inputs: ${s.join(", ")}`}:{file:e,workflow_name:t.name,status:"PASS",first_step_id:r,first_step_type:n,first_step_disposition:`ready:${n}`,note:"load ok; graph ok; first step entered without inputs"}}function oC(e){return(e??[]).filter(t=>t.required===!0&&t.default===void 0).map(t=>t.name)}function aC(e){return yd(e)?e.entry_step_id:e.start_at}function lC(e){return yd(e)?e.steps.find(t=>t.id===e.entry_step_id)?.type??null:e.states[e.start_at]?.type??null}function yd(e){return e.definition_schema_version===3}function gy(e){return e instanceof Gt?e.issues.map(t=>`${t.path}: ${t.message}`).join("; "):e instanceof SyntaxError?`JSON parse failed: ${e.message}`:e instanceof Error?e.message:String(e)}function yy(e){let t=new Set;if(yd(e))for(let r of e.steps){let n=r.members??{};uy(n,t)}else for(let r of Object.values(e.states))uy(r,t);return[...t].sort()}function uy(e,t){let r=["coder","agent","consolidator"],n=["reviewers","researchers"];for(let s of r){let i=e[s],o=fy(i);o!==null&&t.add(o)}for(let s of n){let i=e[s];if(Array.isArray(i))for(let o of i){let a=fy(o);a!==null&&t.add(a)}}}function fy(e){if(e===null||typeof e!="object")return null;let t=e.alias;return typeof t=="string"&&t.length>0?t:null}var xo=T(()=>{"use strict";cs()});function cC({dal:e}){let t=e.listProjects();for(let r of t){let s=e.query("SELECT * FROM job WHERE project_id = ? AND source = ? ORDER BY id DESC LIMIT 1",r.id,Ao)[0]??null;if(s!==null&&(s.status==="queued"||s.status==="running"))continue;let o=(s?.payload?JSON.parse(s.payload):null)?.max_run_id??null,{count:a,maxRunId:l}=dC(e,r,o);if(a<20)continue;let c=o??"initial",d=`${bs}:${r.id}:${c}`;e.enqueueJob({project_id:r.id,source:Ao,source_ref:bs,payload:JSON.stringify({kind:bs,project_id:r.id,completed_sessions:a,max_run_id:l,since_run_id:o}),dedupe_key:d})}}function dC(e,t,r){let n=e.query(`SELECT COUNT(*) AS cnt, MAX(r.id) AS max_id
1869
1869
  FROM run r
1870
1870
  JOIN job j ON j.id = r.job_id
1871
1871
  WHERE j.project_id = ?
1872
1872
  AND r.terminal_state IS NOT NULL
1873
- ${r!==null?"AND r.id > ?":""}`,...r!==null?[t.id,r]:[t.id]);return{count:n[0]?.cnt??0,maxRunId:n[0]?.max_id??0}}function wy(e){for(let t of uC)try{t(e)}catch{}}var Ao,bs,uC,Ed=T(()=>{"use strict";Ao="memory_policy",bs="memory_consolidation_request";uC=[cC]});var ky={};ye(ky,{getOrInsertConsolidationWorkflow:()=>Ty,runJobById:()=>hC,runOnce:()=>jr,startWorker:()=>gC});import{createHash as fC}from"node:crypto";import{readFileSync as mC}from"node:fs";import{pathToFileURL as pC}from"node:url";function Ty(e,t="durable-memory-consolidation-v2"){let r=e.getWorkflowByName(t);if(r!==null)return r;try{Jh({swallow:!0});let n=yo(t);if(n===null)return null;let s=mC(n,"utf8"),i=ct(s);return e.insertWorkflow({name:t,version:i.version,definition_schema_version:i.definition_schema_version,definition:s,source_uri:pC(n).href,source_sha256:fC("sha256").update(s).digest("hex")})}catch{return null}}async function jr(e){let t=Date.now(),r=null;try{return r=e.dal.claimNextJobWithConcurrency({worker_id:e.worker_id,lease_ms:e.lease_ms??Ey,evaluator:n=>Sy(e.dal,n)}),r===null?null:await by(e.dal,r,t)}catch(n){if(r!==null)return _r(e.dal,r,"worker_run_failed",Mr(n),t);try{e.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:Ro(Mr(n))})})}catch{}return null}finally{e.max_concurrent}}async function hC(e){let t=Date.now(),r=null;try{let n=e.dal.claimJobByIdWithConcurrency({job_id:e.job_id,worker_id:e.worker_id,lease_ms:e.lease_ms??Ey,evaluator:s=>Sy(e.dal,s)});return n.claimed?(r=n.job,{claimed:!0,...await by(e.dal,r,t)}):n}catch(n){if(r!==null)return{claimed:!0,..._r(e.dal,r,"worker_run_failed",Mr(n),t)};try{e.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:Ro(Mr(n)),job_id:e.job_id})})}catch{}return{claimed:!1,reason:"not_claimable",job_id:e.job_id}}finally{e.max_concurrent}}async function by(e,t,r){let n=e.getProjectByJob(t.id);if(n===null)return _r(e,t,"worker_project_missing","project_not_found",r);let s=t.source===Ao&&t.source_ref===bs,i=t.run_id===null?null:e.getRun(t.run_id),o;if(i!==null?o=e.getWorkflow(i.workflow_id):s?o=Ty(e):o=vy(e,t,n),o===null)return _r(e,t,"worker_workflow_missing","workflow_not_found",r,n);let a=e.getTeam(i?.team_id??n.team_id),l=a===null?[]:e.listTeamMembers(a.id);if(a===null||l.length===0)return _r(e,t,"worker_team_missing","team_not_found",r,n);let c;try{c=ct(o.definition)}catch(u){return _r(e,t,"worker_workflow_invalid",Mr(u),r,n)}let d=yC(c,l);if(d.length>0)return _r(e,t,"worker_team_missing_aliases",`missing_aliases:${d.join(",")}`,r,n,a);try{let u=await sy({dal:e,job:t,workflow:c,team:a,members:l,workflowRow:o});return e.setJobRun(t.id,u.run_id),u.paused===!0?{job_id:t.id,run_id:u.run_id,status:"paused",terminal_state:null,ms:Date.now()-r}:(e.releaseJob(t.id,"done",null),{job_id:t.id,run_id:u.run_id,status:"done",terminal_state:u.terminal_state,ms:Date.now()-r})}catch(u){return _r(e,t,"worker_run_failed",Mr(u),r,n,a)}}function Sy(e,t){let r=e.getProjectByJob(t.id);if(r===null)return{concurrency_key:t.concurrency_key_resolved,concurrent_limit:1};let n=vy(e,t,r);if(n===null)return{concurrency_key:t.concurrency_key_resolved,concurrent_limit:1};let s=null;try{s=ct(n.definition)}catch{s=null}return io({workflow:s,job:t,project:r})}function vy(e,t,r){return t.workflow_id_override!==null?e.getWorkflow(t.workflow_id_override):e.getWorkflowByName(r.workflow_name)}async function gC(e){let t=!1,r=null,n=Promise.resolve(),s=async()=>{if(!t){try{let i;do i=await jr(e);while(!t&&i!==null)}catch(i){try{e.dal.raiseAttention({kind:"worker_loop_error",severity:"error",payload:JSON.stringify({error:Ro(Mr(i))})})}catch{}}t||(r=setTimeout(()=>{n=s()},e.poll_interval_ms??_C))}};return n=s(),{stop:async()=>{t=!0,r!==null&&clearTimeout(r),await n.catch(()=>{})}}}function _r(e,t,r,n,s,i,o){let a=Ro(n);return e.releaseJob(t.id,"failed",a),e.raiseAttention({kind:r,severity:"error",project_id:i?.id??t.project_id,payload:JSON.stringify({job_id:t.id,team_id:o?.id??null,error:a})}),{job_id:t.id,run_id:null,status:"failed",terminal_state:null,ms:Date.now()-s}}function Mr(e){return e instanceof Error?e.message:String(e)}function Ro(e){return e.length>4096?e.slice(0,4096):e}function yC(e,t){let r=yy(e);if(r.length===0)return[];let n=new Set(t.map(s=>s.alias));return r.filter(s=>!n.has(s))}var Ey,_C,Lo=T(()=>{"use strict";sd();dy();cs();xo();Fc();Ed();Ey=6e5,_C=5e3});import{existsSync as wC,readFileSync as EC}from"node:fs";import{marked as TC}from"marked";function Ay(e,t){e.get("/layman",r=>r.html(Ae("Layman Home",bC(t.dal)))),e.get("/api/layman",r=>r.json($y(t.dal))),e.get("/layman/start/:workflow",r=>{let n=xy(r);return n===null?r.notFound():r.html(Ae(`Start ${hn(n)}`,kC(t.dal,n)))}),e.post("/layman/start/:workflow",async r=>{let n=xy(r);return n===null?r.notFound():n==="newspaper"?Iy(r,t.dal):IC(r,t.dal,n)}),e.get("/layman/run/:id",r=>{let n=Rr(t.dal,Oo(r,"id"));return n===null?r.notFound():r.html(Ae(`Run ${n.id}`,AC(t.dal,n)))}),e.get("/api/layman/run/:id",r=>{let n=Rr(t.dal,Oo(r,"id"));return n===null?r.notFound():r.json(UC(t.dal,n))}),e.post("/layman/run/:id/respond",async r=>LC(r,t.dal)),e.get("/layman/newspaper",r=>r.html(Ae("Newspaper Subscriptions",PC(t.dal)))),e.post("/layman/newspaper",r=>Iy(r,t.dal)),e.delete("/layman/newspaper/:id",r=>Ny(r,t.dal)),e.post("/layman/newspaper/:id/delete",r=>Ny(r,t.dal))}function bC(e){let t=$y(e);return`<section class="layman-home">
1873
+ ${r!==null?"AND r.id > ?":""}`,...r!==null?[t.id,r]:[t.id]);return{count:n[0]?.cnt??0,maxRunId:n[0]?.max_id??0}}function wy(e){for(let t of uC)try{t(e)}catch{}}var Ao,bs,uC,wd=T(()=>{"use strict";Ao="memory_policy",bs="memory_consolidation_request";uC=[cC]});var ky={};ye(ky,{getOrInsertConsolidationWorkflow:()=>Ty,runJobById:()=>hC,runOnce:()=>jr,startWorker:()=>gC});import{createHash as fC}from"node:crypto";import{readFileSync as mC}from"node:fs";import{pathToFileURL as pC}from"node:url";function Ty(e,t="durable-memory-consolidation-v2"){let r=e.getWorkflowByName(t);if(r!==null)return r;try{Jh({swallow:!0});let n=yo(t);if(n===null)return null;let s=mC(n,"utf8"),i=ct(s);return e.insertWorkflow({name:t,version:i.version,definition_schema_version:i.definition_schema_version,definition:s,source_uri:pC(n).href,source_sha256:fC("sha256").update(s).digest("hex")})}catch{return null}}async function jr(e){let t=Date.now(),r=null;try{return r=e.dal.claimNextJobWithConcurrency({worker_id:e.worker_id,lease_ms:e.lease_ms??Ey,evaluator:n=>Sy(e.dal,n)}),r===null?null:await by(e.dal,r,t)}catch(n){if(r!==null)return _r(e.dal,r,"worker_run_failed",Mr(n),t);try{e.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:Ro(Mr(n))})})}catch{}return null}finally{e.max_concurrent}}async function hC(e){let t=Date.now(),r=null;try{let n=e.dal.claimJobByIdWithConcurrency({job_id:e.job_id,worker_id:e.worker_id,lease_ms:e.lease_ms??Ey,evaluator:s=>Sy(e.dal,s)});return n.claimed?(r=n.job,{claimed:!0,...await by(e.dal,r,t)}):n}catch(n){if(r!==null)return{claimed:!0,..._r(e.dal,r,"worker_run_failed",Mr(n),t)};try{e.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:Ro(Mr(n)),job_id:e.job_id})})}catch{}return{claimed:!1,reason:"not_claimable",job_id:e.job_id}}finally{e.max_concurrent}}async function by(e,t,r){let n=e.getProjectByJob(t.id);if(n===null)return _r(e,t,"worker_project_missing","project_not_found",r);let s=t.source===Ao&&t.source_ref===bs,i=t.run_id===null?null:e.getRun(t.run_id),o;if(i!==null?o=e.getWorkflow(i.workflow_id):s?o=Ty(e):o=vy(e,t,n),o===null)return _r(e,t,"worker_workflow_missing","workflow_not_found",r,n);let a=e.getTeam(i?.team_id??n.team_id),l=a===null?[]:e.listTeamMembers(a.id);if(a===null||l.length===0)return _r(e,t,"worker_team_missing","team_not_found",r,n);let c;try{c=ct(o.definition)}catch(u){return _r(e,t,"worker_workflow_invalid",Mr(u),r,n)}let d=yC(c,l);if(d.length>0)return _r(e,t,"worker_team_missing_aliases",`missing_aliases:${d.join(",")}`,r,n,a);try{let u=await sy({dal:e,job:t,workflow:c,team:a,members:l,workflowRow:o});return e.setJobRun(t.id,u.run_id),u.paused===!0?{job_id:t.id,run_id:u.run_id,status:"paused",terminal_state:null,ms:Date.now()-r}:(e.releaseJob(t.id,"done",null),{job_id:t.id,run_id:u.run_id,status:"done",terminal_state:u.terminal_state,ms:Date.now()-r})}catch(u){return _r(e,t,"worker_run_failed",Mr(u),r,n,a)}}function Sy(e,t){let r=e.getProjectByJob(t.id);if(r===null)return{concurrency_key:t.concurrency_key_resolved,concurrent_limit:1};let n=vy(e,t,r);if(n===null)return{concurrency_key:t.concurrency_key_resolved,concurrent_limit:1};let s=null;try{s=ct(n.definition)}catch{s=null}return io({workflow:s,job:t,project:r})}function vy(e,t,r){return t.workflow_id_override!==null?e.getWorkflow(t.workflow_id_override):e.getWorkflowByName(r.workflow_name)}async function gC(e){let t=!1,r=null,n=Promise.resolve(),s=async()=>{if(!t){try{let i;do i=await jr(e);while(!t&&i!==null)}catch(i){try{e.dal.raiseAttention({kind:"worker_loop_error",severity:"error",payload:JSON.stringify({error:Ro(Mr(i))})})}catch{}}t||(r=setTimeout(()=>{n=s()},e.poll_interval_ms??_C))}};return n=s(),{stop:async()=>{t=!0,r!==null&&clearTimeout(r),await n.catch(()=>{})}}}function _r(e,t,r,n,s,i,o){let a=Ro(n);return e.releaseJob(t.id,"failed",a),e.raiseAttention({kind:r,severity:"error",project_id:i?.id??t.project_id,payload:JSON.stringify({job_id:t.id,team_id:o?.id??null,error:a})}),{job_id:t.id,run_id:null,status:"failed",terminal_state:null,ms:Date.now()-s}}function Mr(e){return e instanceof Error?e.message:String(e)}function Ro(e){return e.length>4096?e.slice(0,4096):e}function yC(e,t){let r=yy(e);if(r.length===0)return[];let n=new Set(t.map(s=>s.alias));return r.filter(s=>!n.has(s))}var Ey,_C,Lo=T(()=>{"use strict";nd();dy();cs();xo();Pc();wd();Ey=6e5,_C=5e3});import{existsSync as wC,readFileSync as EC}from"node:fs";import{marked as TC}from"marked";function Ay(e,t){e.get("/layman",r=>r.html(Ae("Layman Home",bC(t.dal)))),e.get("/api/layman",r=>r.json($y(t.dal))),e.get("/layman/start/:workflow",r=>{let n=xy(r);return n===null?r.notFound():r.html(Ae(`Start ${hn(n)}`,kC(t.dal,n)))}),e.post("/layman/start/:workflow",async r=>{let n=xy(r);return n===null?r.notFound():n==="newspaper"?Iy(r,t.dal):IC(r,t.dal,n)}),e.get("/layman/run/:id",r=>{let n=Rr(t.dal,Oo(r,"id"));return n===null?r.notFound():r.html(Ae(`Run ${n.id}`,AC(t.dal,n)))}),e.get("/api/layman/run/:id",r=>{let n=Rr(t.dal,Oo(r,"id"));return n===null?r.notFound():r.json(UC(t.dal,n))}),e.post("/layman/run/:id/respond",async r=>LC(r,t.dal)),e.get("/layman/newspaper",r=>r.html(Ae("Newspaper Subscriptions",PC(t.dal)))),e.post("/layman/newspaper",r=>Iy(r,t.dal)),e.delete("/layman/newspaper/:id",r=>Ny(r,t.dal)),e.post("/layman/newspaper/:id/delete",r=>Ny(r,t.dal))}function bC(e){let t=$y(e);return`<section class="layman-home">
1874
1874
  <h1>Welcome</h1>
1875
1875
  <p class="muted">Choose a workflow and answer a few plain-language prompts.</p>
1876
1876
  <div class="grid">${$o.map(SC).join("")}</div>
@@ -1907,23 +1907,23 @@ ${p.text}`,["approve","request_changes"],!0,s,t.writes_to_project_path===!0)));i
1907
1907
  <h2>${b(qC(t.state_name))}</h2>
1908
1908
  <p class="muted">The agent is waiting for your response.</p>
1909
1909
  <h3>Agent output</h3>
1910
- <div class="metric">${kd(t.last_agent_output??"")}</div>
1910
+ <div class="metric">${vd(t.last_agent_output??"")}</div>
1911
1911
  <form method="post" action="/layman/run/${b(e.id)}/respond">
1912
1912
  <input type="hidden" name="step_id" value="${b(t.step_id)}">
1913
1913
  <label>Your response<textarea name="input" rows="7"></textarea></label>
1914
1914
  <button type="submit" name="done" value="false">Send response</button>
1915
1915
  <button type="submit" name="done" value="true">Done with this stage</button>
1916
1916
  </form>
1917
- </section>`}async function LC(e,t){let r=Oo(e,"id"),n=await e.req.parseBody(),s=Number(Ye(n.step_id)),i=Ye(n.input),o=Ye(n.done)==="true";if(!Number.isInteger(s))return e.html(Ae("Interactive response",'<p class="error">Missing interactive step.</p>'),400);let a=t.resumeInteractive(s,i,o);return a.resumed?(OC(t,a.run.id),await jr({dal:t,worker_id:`layman-respond-${Date.now()}`}),e.redirect(`/layman/run/${r}`,302)):e.html(Ae("Interactive response",`<p class="error">Could not submit response: ${b(a.reason)}</p>`),400)}function OC(e,t){let r=e.getRun(t);if(r===null||r.current_state===null)return;let n=e.getWorkflow(r.workflow_id);if(n!==null)try{let s=JSON.parse(n.definition);if(!bd(s)||s.definition_schema_version!==3||!Array.isArray(s.steps))return;let i=s.steps.find(o=>bd(o)&&o.name===r.current_state&&typeof o.id=="string");bd(i)&&typeof i.id=="string"&&e.setRunCurrentState(r.id,i.id)}catch{return}}function $C(e,t,r){let n=HC(t.terminal_state);return`<section class="metric terminal-run">
1917
+ </section>`}async function LC(e,t){let r=Oo(e,"id"),n=await e.req.parseBody(),s=Number(Ye(n.step_id)),i=Ye(n.input),o=Ye(n.done)==="true";if(!Number.isInteger(s))return e.html(Ae("Interactive response",'<p class="error">Missing interactive step.</p>'),400);let a=t.resumeInteractive(s,i,o);return a.resumed?(OC(t,a.run.id),await jr({dal:t,worker_id:`layman-respond-${Date.now()}`}),e.redirect(`/layman/run/${r}`,302)):e.html(Ae("Interactive response",`<p class="error">Could not submit response: ${b(a.reason)}</p>`),400)}function OC(e,t){let r=e.getRun(t);if(r===null||r.current_state===null)return;let n=e.getWorkflow(r.workflow_id);if(n!==null)try{let s=JSON.parse(n.definition);if(!Td(s)||s.definition_schema_version!==3||!Array.isArray(s.steps))return;let i=s.steps.find(o=>Td(o)&&o.name===r.current_state&&typeof o.id=="string");Td(i)&&typeof i.id=="string"&&e.setRunCurrentState(r.id,i.id)}catch{return}}function $C(e,t,r){let n=HC(t.terminal_state);return`<section class="metric terminal-run">
1918
1918
  <h2>${n?"Complete":"Stopped"}</h2>
1919
1919
  <p>Status: <strong>${b(t.terminal_state)}</strong></p>
1920
1920
  ${n?CC(e,t,r):jC(t)}
1921
1921
  <h2>Stage Log</h2>
1922
1922
  ${Ly(t)}
1923
- </section>`}function CC(e,t,r){if(r==="info-qa"){let n=vd(t,["info_qa_consolidated"]);return`<h3>Answer</h3><div class="metric">${kd(n??"No answer artifact was recorded yet.")}</div>`}if(r==="document-creation")return MC(e,t);if(r==="newspaper"){let n=vd(t,["newspaper_consolidated"]);return`<h3>Digest</h3><div class="metric">${kd(n??"No digest artifact was recorded yet.")}</div>`}return'<p class="muted">No layman output renderer for this workflow.</p>'}function MC(e,t){let r=Lr(e,t.id),n=Td(r,["render_docx"]),s=Td(r,["render_xlsx"]),i=vd(t,["review:coder[0]_transcript","chat_output_md"])??DC(Td(r,["document_md","markdown"])),o=[n,s].filter(a=>a!==null).map(a=>`<li><a href="file://${b(a)}">${b(a)}</a></li>`).join("");return`<h3>Document Preview</h3>
1923
+ </section>`}function CC(e,t,r){if(r==="info-qa"){let n=Sd(t,["info_qa_consolidated"]);return`<h3>Answer</h3><div class="metric">${vd(n??"No answer artifact was recorded yet.")}</div>`}if(r==="document-creation")return MC(e,t);if(r==="newspaper"){let n=Sd(t,["newspaper_consolidated"]);return`<h3>Digest</h3><div class="metric">${vd(n??"No digest artifact was recorded yet.")}</div>`}return'<p class="muted">No layman output renderer for this workflow.</p>'}function MC(e,t){let r=Lr(e,t.id),n=Ed(r,["render_docx"]),s=Ed(r,["render_xlsx"]),i=Sd(t,["review:coder[0]_transcript","chat_output_md"])??DC(Ed(r,["document_md","markdown"])),o=[n,s].filter(a=>a!==null).map(a=>`<li><a href="file://${b(a)}">${b(a)}</a></li>`).join("");return`<h3>Document Preview</h3>
1924
1924
  <pre>${b(XC(JC(i??"No preview available."),30))}</pre>
1925
1925
  <h3>Downloads</h3>
1926
- ${o.length>0?`<ul>${o}</ul>`:'<p class="muted">No rendered files found yet.</p>'}`}function jC(e){let t=[...e.steps].reverse().find(r=>r.status_detail!==null);return`<p class="error">${b(t?.status_detail??"The workflow did not complete successfully.")}</p>`}function vd(e,t){for(let r of[...e.steps].reverse())for(let n of t){let s=[...r.artifacts].reverse().find(i=>i.kind===n&&i.content!==null);if(s?.content!==null&&s?.content!==void 0)return s.content}return null}function Td(e,t){for(let r of[...e].reverse())if(t.includes(r.kind)&&r.path!==null)return r.path;return null}function DC(e){if(e===null||!wC(e)||!e.endsWith(".md"))return null;try{return EC(e,"utf8")}catch{return null}}function PC(e){let t=e.listProjects();return`<h1>Newspaper Subscriptions</h1>
1926
+ ${o.length>0?`<ul>${o}</ul>`:'<p class="muted">No rendered files found yet.</p>'}`}function jC(e){let t=[...e.steps].reverse().find(r=>r.status_detail!==null);return`<p class="error">${b(t?.status_detail??"The workflow did not complete successfully.")}</p>`}function Sd(e,t){for(let r of[...e.steps].reverse())for(let n of t){let s=[...r.artifacts].reverse().find(i=>i.kind===n&&i.content!==null);if(s?.content!==null&&s?.content!==void 0)return s.content}return null}function Ed(e,t){for(let r of[...e].reverse())if(t.includes(r.kind)&&r.path!==null)return r.path;return null}function DC(e){if(e===null||!wC(e)||!e.endsWith(".md"))return null;try{return EC(e,"utf8")}catch{return null}}function PC(e){let t=e.listProjects();return`<h1>Newspaper Subscriptions</h1>
1927
1927
  ${FC(Cy(e))}
1928
1928
  <h2>Add Subscription</h2>
1929
1929
  ${t.length===0?'<p class="error">Create a project before subscribing.</p>':Oy(t,"/layman/newspaper")}`}function Oy(e,t){return`<form method="post" action="${b(t)}">
@@ -1940,28 +1940,28 @@ ${p.text}`,["approve","request_changes"],!0,s,t.writes_to_project_path===!0)));i
1940
1940
  </form>`}async function Iy(e,t){let r=await e.req.parseBody(),n=jy(t,r);if(n===null)return e.html(Ae("Newspaper",'<p class="error">Choose a valid project.</p>'),400);let s=t.getWorkflowByName("newspaper");if(s===null)return e.html(Ae("Newspaper",'<p class="error">The newspaper workflow is not loaded.</p>'),400);let i=Ye(r.topics).split(/[\n,]/).map(a=>a.trim()).filter(a=>a.length>0);if(i.length===0)return e.html(Ae("Newspaper",'<p class="error">Enter at least one topic.</p>'),400);let o={topics:i,output_dir:Ye(r.output_dir).trim()||"digests",schedule:BC(r)};return t.insertProjectWorkflow({project_id:n.id,workflow_id:s.id,condition:null,parameters_override:JSON.stringify(o),priority:100,enabled:!0}),e.redirect("/layman/newspaper?created=1",302)}function Ny(e,t){let r=Oo(e,"id");return t.removeProjectWorkflow(r)?e.redirect("/layman/newspaper?removed=1",302):e.notFound()}function FC(e){return me(["id","project","topics","status","action"],e.map(t=>{let r=VC(t.parameters_override),n=Array.isArray(r.topics)?r.topics.join(", "):"";return[b(t.id),b(t.project_name),b(n),t.enabled===1?"enabled":"disabled",`<form method="post" action="/layman/newspaper/${t.id}/delete"><button type="submit">Remove</button></form>`]}))}function $y(e){let t=Cy(e);return{workflows:$o,recent_runs:WC(e),newspaper_subscriptions:t.length}}function UC(e,t){let r=My(e,t);return{id:t.id,workflow:t.workflow?.name??null,current_state:t.current_state,terminal_state:t.terminal_state,paused_interactive:r?.status==="waiting_operator"?{step_id:r.step_id,state_name:r.state_name,last_agent_output:r.last_agent_output}:null,steps:t.steps.map(n=>({id:n.id,state_name:n.state_name,outcome:n.outcome,status_detail:n.status_detail}))}}function WC(e){return e.query(`SELECT r.*, w.name AS workflow_name
1941
1941
  FROM run r
1942
1942
  JOIN workflow w ON w.id = r.workflow_id
1943
- WHERE w.name IN (${Sd.map(()=>"?").join(",")})
1943
+ WHERE w.name IN (${bd.map(()=>"?").join(",")})
1944
1944
  ORDER BY r.id DESC
1945
- LIMIT 10`,...Sd)}function Cy(e){return e.query(`SELECT pw.*, p.name AS project_name
1945
+ LIMIT 10`,...bd)}function Cy(e){return e.query(`SELECT pw.*, p.name AS project_name
1946
1946
  FROM project_workflow pw
1947
1947
  JOIN workflow w ON w.id = pw.workflow_id
1948
1948
  JOIN project p ON p.id = pw.project_id
1949
1949
  WHERE w.name = ?
1950
- ORDER BY pw.id DESC`,"newspaper")}function My(e,t){for(let r of[...t.steps].reverse()){let n=e.getInteractiveSessionByStepId(r.id);if(n!==null)return n}return null}function jy(e,t){let r=Number(Ye(t.project_id));return Number.isInteger(r)?e.getProject(r):null}function BC(e){let t=Ye(e.schedule)||"daily";return t==="weekly"?{preset:t,cron:"0 6 * * 1"}:t==="custom"?{preset:t,cron:Ye(e.cron).trim()||"0 6 * * *"}:{preset:"daily",cron:"0 6 * * *"}}function xy(e){let t=e.req.param("workflow");return Sd.includes(t)?t:null}function hn(e){return $o.find(t=>t.name===e)?.title??e}function qC(e){return e.split(/[_:-]/).filter(Boolean).map(t=>`${t[0]?.toUpperCase()??""}${t.slice(1)}`).join(" ")}function kd(e){return TC.parse(e,{async:!1})}function HC(e){return e==="done"||e==="pr_ready"||e==="merged"}function JC(e){return e.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}function XC(e,t){return e.split(`
1950
+ ORDER BY pw.id DESC`,"newspaper")}function My(e,t){for(let r of[...t.steps].reverse()){let n=e.getInteractiveSessionByStepId(r.id);if(n!==null)return n}return null}function jy(e,t){let r=Number(Ye(t.project_id));return Number.isInteger(r)?e.getProject(r):null}function BC(e){let t=Ye(e.schedule)||"daily";return t==="weekly"?{preset:t,cron:"0 6 * * 1"}:t==="custom"?{preset:t,cron:Ye(e.cron).trim()||"0 6 * * *"}:{preset:"daily",cron:"0 6 * * *"}}function xy(e){let t=e.req.param("workflow");return bd.includes(t)?t:null}function hn(e){return $o.find(t=>t.name===e)?.title??e}function qC(e){return e.split(/[_:-]/).filter(Boolean).map(t=>`${t[0]?.toUpperCase()??""}${t.slice(1)}`).join(" ")}function vd(e){return TC.parse(e,{async:!1})}function HC(e){return e==="done"||e==="pr_ready"||e==="merged"}function JC(e){return e.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}function XC(e,t){return e.split(`
1951
1951
  `).slice(0,t).join(`
1952
- `)}function GC(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function Ye(e){return typeof e=="string"?e:""}function VC(e){if(e===null)return{};try{let t=JSON.parse(e);if(t!==null&&typeof t=="object"&&!Array.isArray(t))return t}catch{return{}}return{}}function bd(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Oo(e,t){return Number(e.req.param(t))}var $o,Sd,Dy=T(()=>{"use strict";Lo();Jt();Qc();$o=[{name:"info-qa",title:"Ask a Question",description:"Get a grounded answer from multiple researchers and one consolidator."},{name:"document-creation",title:"Create a Document",description:"Draft, review, and render a polished document with an interactive wizard."},{name:"newspaper",title:"Daily Newspaper",description:"Subscribe to recurring digests for topics you care about."}],Sd=$o.map(e=>e.name)});function YC(e){return e.replace(/^\/+/,"")}function Py(e){return typeof e=="string"&&e!==""&&!e.includes("/")&&!e.includes("\\")}function gn(e){if(e.mailboxKey!==void 0&&e.mailboxKey!==null&&e.mailboxKey!==""){let t=YC(e.mailboxKey),r=t.lastIndexOf("/");return(r>=0?t.slice(r+1):t).includes(".")&&(t=r>=0?t.slice(0,r+1):""),t!==""&&!t.endsWith("/")&&(t+="/"),t}return Py(e.userId)&&Py(e.deviceId)?`${e.userId}/${e.deviceId}/`:`${KC}/${e.identityId}/`}function ZC(e){return String(Math.max(0,Math.floor(e))).padStart(zC,"0")}function Id(e,t,r){return`${e}${t}${ZC(r)}.json`}function Co(e,t){return`${e}${t}`}function Mo(e,t,r){let n=`${t}${r}`;if(!e.startsWith(n))return;let s=e.slice(n.length).match(/^(\d+)\.json$/);if(s===null)return;let i=Number(s[1]);return Number.isSafeInteger(i)?i:void 0}var KC,zC,jo=T(()=>{"use strict";KC="mailbox";zC=12});function Yt(e,t){let r=Math.floor(e),n="",s=r;for(let d=0;d<12;d++)n=Do[s&15]+n,s=Math.floor(s/16);let i=Math.floor(t()*4096)&4095,o="",a=i;for(let d=0;d<3;d++)o=Do[a&15]+o,a=a>>4;let l=Do[8|Math.floor(t()*4)&3],c="";for(let d=0;d<15;d++)c+=Do[Math.floor(t()*16)&15];return n.slice(0,8)+"-"+n.slice(8,12)+"-7"+o+"-"+l+c.slice(0,3)+"-"+c.slice(3,15)}var Do,Po=T(()=>{"use strict";Do="0123456789abcdef"});function xd(e,t){return!Number.isFinite(e)||e<=0?t:e}function Ad(e){if(e===null||typeof e!="object")return!1;let t=e;return t.name==="NoSuchKey"||t.name==="NotFound"||t.Code==="NoSuchKey"||t.code==="NoSuchKey"||t.$metadata!==void 0&&t.$metadata.httpStatusCode===404}function qy(e){return e.conversation_id===By&&tM(e.payload)}function tM(e){return typeof e=="object"&&e!==null&&e.kind==="heartbeat"}function rM(e){let t=typeof e.hb=="string"&&e.hb!==""?e.hb:qy(e)?e.timestamp:void 0;if(t===void 0)return;let r=Date.parse(t);return Number.isFinite(r)?r:void 0}var Fy,Uy,Wy,QC,By,eM,Nd,Dr,Fo=T(()=>{"use strict";jo();Po();Fy=3e3,Uy=1e4,Wy=12e3,QC=1e3,By="__lmctl_heartbeat__",eM={kind:"heartbeat"},Nd={setTimeout:(e,t)=>setTimeout(e,t),clearTimeout:e=>clearTimeout(e)},Dr=class{opts;basePrefix;ownStream;peerStream;cursor;ownSeq;bootstrapped=!1;bootstrapInFlight=null;bootstrapPromise=null;writeChain=Promise.resolve();readIntervalMs;heartbeatIdleMs;backoffReadIntervalMs;running=!1;stopped=!1;stopRequested=!1;timerHandle=null;heartbeatTimerHandle=null;lastWriteMs;lastPeerHeartbeatMs;tickInFlight=null;constructor(t){this.opts=t,this.basePrefix=gn({identityId:t.identityId,userId:t.userId,deviceId:t.deviceId,mailboxKey:t.mailboxKey}),this.ownStream=t.selfRole==="agent"?"local":"web",this.peerStream=t.selfRole==="agent"?"web":"local",this.cursor=t.cursor,this.readIntervalMs=xd(t.readIntervalMs??t.pollIntervalMs??Fy,Fy),this.heartbeatIdleMs=xd(t.heartbeatIdleMs??Uy,Uy),this.backoffReadIntervalMs=xd(t.backoffReadIntervalMs??t.pollIntervalMs??Wy,Wy)}start(){if(this.stopped)throw new Error("SequentialMailboxClient: cannot start after stop()");this.running||(this.running=!0,this.bootstrapInFlight=this.bootstrapThenRun())}async stop(){this.stopped=!0,this.stopRequested=!0;let t=this.opts.timers??Nd;if(this.timerHandle!==null&&(t.clearTimeout(this.timerHandle),this.timerHandle=null),this.heartbeatTimerHandle!==null&&(t.clearTimeout(this.heartbeatTimerHandle),this.heartbeatTimerHandle=null),this.bootstrapInFlight!==null)try{await this.bootstrapInFlight}catch{}if(this.tickInFlight!==null)try{await this.tickInFlight}catch{}this.running=!1}async putMessage(t){return this.putEnvelope(t.conversation_id,t.payload)}getCursor(){return this.cursor}getMailboxBasePrefix(){return this.basePrefix}setPollIntervalMs(t){if(!Number.isFinite(t)||t<=0)throw new Error(`SequentialMailboxClient.setPollIntervalMs: invalid ms=${t}`);this.readIntervalMs=t}isPeerOn(){return this.peerIsOn((this.opts.now??Date.now)())}async bootstrapThenRun(){if(await this.ensureBootstrapped(),this.stopRequested){this.running=!1;return}this.runTick(),this.writeHeartbeat()}ensureBootstrapped(){return this.bootstrapped?Promise.resolve():(this.bootstrapPromise===null&&(this.bootstrapPromise=this.runColdStart()),this.bootstrapPromise)}async runColdStart(){try{let t=await this.maxSeq(this.ownStream);this.ownSeq=t,this.cursor===void 0&&(this.cursor=await this.maxSeq(this.peerStream)),this.bootstrapped=!0}catch(t){throw this.bootstrapPromise=null,this.emitError(t,"list"),t}}async maxSeq(t){let r=Co(this.basePrefix,t),n=0,s;do{let i=await this.opts.s3.send(new this.opts.commands.ListObjectsV2Command({Bucket:this.opts.bucket,Prefix:r,MaxKeys:QC,...s!==void 0&&{ContinuationToken:s}}));this.opts.onS3Op?.("list");for(let o of i.Contents??[]){let a=Mo(o.Key??"",this.basePrefix,t);a!==void 0&&a>n&&(n=a)}s=i.IsTruncated===!0?i.NextContinuationToken:void 0}while(s!==void 0);return n}async putEnvelope(t,r){let n=this.writeChain.then(()=>this.doPut(t,r));return this.writeChain=n.catch(()=>{}),n}async doPut(t,r){await this.ensureBootstrapped();let n=(this.opts.now??Date.now)(),s=new Date(n).toISOString(),i={message_id:Yt(n,this.opts.random??Math.random),from:this.opts.selfRole,timestamp:s,hb:s,conversation_id:t,payload:r},o=(this.ownSeq??0)+1,a=Id(this.basePrefix,this.ownStream,o);return await this.opts.s3.send(new this.opts.commands.PutObjectCommand({Bucket:this.opts.bucket,Key:a,Body:JSON.stringify(i),ContentType:"application/json"})),this.opts.onS3Op?.("put"),this.ownSeq=o,this.recordWrite(n),a}scheduleNextTick(t){if(this.stopRequested)return;let r=this.opts.timers??Nd;this.timerHandle=r.setTimeout(()=>{this.timerHandle=null,this.runTick()},t)}runTick(){this.stopRequested||(this.tickInFlight=(async()=>{try{await this.pollOnce()}finally{this.tickInFlight=null,this.stopRequested||this.scheduleNextTick(this.nextReadDelayMs())}})())}async pollOnce(){for(;!this.stopRequested;){let t=(this.cursor??0)+1,r=Id(this.basePrefix,this.peerStream,t),n;try{let i=await this.opts.s3.send(new this.opts.commands.GetObjectCommand({Bucket:this.opts.bucket,Key:r}));if(this.opts.onS3Op?.("get"),i.Body===void 0){this.emitError(new Error(`GetObject ${r}: empty body`),"get"),this.advanceCursor(t);continue}n=await i.Body.transformToString("utf-8")}catch(i){if(Ad(i)){this.opts.onS3Op?.("get");return}this.emitError(i,"get");return}let s;try{s=JSON.parse(n)}catch(i){this.emitError(i,"get"),this.advanceCursor(t);continue}if(this.recordPeerHeartbeat(s),qy(s)){this.advanceCursor(t);continue}try{await this.opts.onMessage(s)}catch(i){this.emitError(i,"handle");return}this.advanceCursor(t)}}advanceCursor(t){this.cursor=t,this.notifyCursorAdvance(t)}nextReadDelayMs(){return this.peerIsOn((this.opts.now??Date.now)())?this.readIntervalMs:this.backoffReadIntervalMs}peerIsOn(t){return this.lastPeerHeartbeatMs!==void 0&&t-this.lastPeerHeartbeatMs<=this.heartbeatIdleMs}recordPeerHeartbeat(t){let r=rM(t);r!==void 0&&(this.lastPeerHeartbeatMs=r)}recordWrite(t){this.lastWriteMs=t,this.scheduleHeartbeatCheck(this.heartbeatIdleMs)}scheduleHeartbeatCheck(t){if(this.stopRequested)return;let r=this.opts.timers??Nd;this.heartbeatTimerHandle!==null&&r.clearTimeout(this.heartbeatTimerHandle),this.heartbeatTimerHandle=r.setTimeout(()=>{this.heartbeatTimerHandle=null,this.maybeWriteHeartbeat()},t)}async maybeWriteHeartbeat(){if(this.stopRequested)return;let t=(this.opts.now??Date.now)();if(this.lastWriteMs!==void 0){let r=t-this.lastWriteMs;if(r<this.heartbeatIdleMs){this.scheduleHeartbeatCheck(this.heartbeatIdleMs-r);return}}await this.writeHeartbeat()}async writeHeartbeat(){try{await this.putEnvelope(By,eM)}catch(t){this.emitError(t,"put"),this.scheduleHeartbeatCheck(this.heartbeatIdleMs)}}notifyCursorAdvance(t){if(this.opts.onCursorAdvance!==void 0)try{this.opts.onCursorAdvance(t)}catch(r){this.emitError(r,"handle")}}emitError(t,r){if(this.opts.onError!==void 0)try{this.opts.onError(t,r)}catch{}else console.error(`SequentialMailboxClient[${r}]`,t)}}});import{getConnInfo as nM}from"@hono/node-server/conninfo";function Hy(e,t){let r=t.bucket??sM,n=t.remoteAddressOf??(i=>oM(i)),s=i=>{let o=n(i);return aM(o)?null:i.json({error:"forbidden",message:"local-mailbox is loopback-only"},403)};e.get("/local-mailbox/object",async i=>{let o=s(i);if(o!==null)return o;let a=Rd(i.req.query("key"));if(typeof a!="string")return i.json({error:"bad_request",message:a.error},400);try{let l=await t.s3.send(new t.commands.GetObjectCommand({Bucket:r,Key:a}));if(l.Body===void 0)return i.json({error:"empty_body"},404);let c=await l.Body.transformToString("utf-8");return i.body(c,200,{"Content-Type":"application/octet-stream"})}catch(l){return Ad(l)?i.json({error:"not_found"},404):i.json({error:"internal",message:Ld(l)},500)}}),e.put("/local-mailbox/object",async i=>{let o=s(i);if(o!==null)return o;let a=Rd(i.req.query("key"));if(typeof a!="string")return i.json({error:"bad_request",message:a.error},400);let l=new Uint8Array(await i.req.arrayBuffer());try{return await t.s3.send(new t.commands.PutObjectCommand({Bucket:r,Key:a,Body:l})),i.json({ok:!0})}catch(c){return i.json({error:"internal",message:Ld(c)},500)}}),e.get("/local-mailbox/list",async i=>{let o=s(i);if(o!==null)return o;let a=i.req.query("prefix")??"",l=Rd(a,{allowEmpty:!0});if(typeof l!="string")return i.json({error:"bad_request",message:l.error},400);let c=iM(i.req.query("maxKeys")),d=i.req.query("token");try{let u=await t.s3.send(new t.commands.ListObjectsV2Command({Bucket:r,Prefix:l,...c!==void 0?{MaxKeys:c}:{},...d!==void 0&&d!==""?{ContinuationToken:d}:{}}));return i.json({Contents:(u.Contents??[]).map(f=>({Key:f.Key,LastModified:f.LastModified instanceof Date?f.LastModified.toISOString():f.LastModified})),IsTruncated:u.IsTruncated??!1,...u.NextContinuationToken!==void 0?{NextContinuationToken:u.NextContinuationToken}:{}})}catch(u){return i.json({error:"internal",message:Ld(u)},500)}})}function Rd(e,t={}){if(e===void 0||e==="")return t.allowEmpty===!0?"":{error:"key required"};let r=e.replace(/^\/+/,"");return r.split("/").includes("..")?{error:"key must not contain '..'"}:r}function iM(e){if(e===void 0||e==="")return;let t=Number(e);return Number.isInteger(t)&&t>0?t:void 0}function oM(e){try{return nM(e).remote.address}catch{return}}function aM(e){return e===void 0||e===""?!1:!!(e==="127.0.0.1"||e==="::1"||e.startsWith("::ffff:127.")||e.startsWith("127."))}function Ld(e){return e instanceof Error?e.message:String(e)}var sM,Jy=T(()=>{"use strict";Fo();sM="local"});function Xy(e,t){e.get("/mailbox/workspace",r=>dM(r,t)),e.get("/mailbox/projects",r=>uM(r,t)),e.get("/mailbox/projects/:id",r=>fM(r,t)),e.post("/mailbox/projects",r=>mM(r,t)),e.patch("/mailbox/projects/:id",r=>pM(r,t)),e.delete("/mailbox/projects/:id",r=>_M(r,t)),e.post("/mailbox/projects/:project_id/prompts",r=>hM(r,t)),e.get("/mailbox/prompts/:id",r=>gM(r,t))}function dM(e,t){t.dal.ensureWorkspace({id:wn,name:Od});let r=Gy(t.dal),n={id:wn,name:Od,created_at:cM,projects:r};return e.json({workspace:n})}function uM(e,t){return e.json({projects:Gy(t.dal)})}function fM(e,t){let r=e.req.param("id");if(r===void 0||r==="")return e.json({error:"bad_request",message:"project id required"},400);if(r.startsWith(yn)){let s=$d(t.dal,r);return s===null||s.deleted_at!==null?e.json({project:null},404):e.json({project:Bo(s)})}let n=Ky(t.dal,r);return n===null?e.json({project:null},404):e.json({project:Vy(n)})}async function mM(e,t){let r;try{r=await e.req.json()}catch{return e.json({error:"bad_request",message:"invalid JSON body"},400)}let n=r.input;if(n===void 0||typeof n!="object")return e.json({error:"bad_request",message:"input is required"},400);if(typeof n.name!="string"||n.name==="")return e.json({error:"bad_request",message:"input.name is required"},400);if(typeof n.repo_path!="string"||n.repo_path==="")return e.json({error:"bad_request",message:"input.repo_path is required"},400);t.dal.ensureWorkspace({id:wn,name:Od});let s=t.dal.insertWebProject({workspace_id:wn,name:n.name,repo_path:n.repo_path,config_json:n.config_json===void 0?null:JSON.stringify(n.config_json)});return e.json({project:Bo(s)},201)}async function pM(e,t){let r=e.req.param("id");if(r===void 0||r==="")return e.json({error:"bad_request",message:"project id required"},400);let n;try{n=await e.req.json()}catch{return e.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.input??{};if(r.startsWith(yn)){let i=$d(t.dal,r);if(i===null||i.deleted_at!==null)return e.json({error:"project_not_found",message:`project not found: ${r}`},404);let o=t.dal.updateWebProject({id:i.id,name:s.name===void 0?void 0:s.name,config_json:s.config_json===void 0?void 0:JSON.stringify(s.config_json)});return o===null?e.json({error:"project_not_found",message:`project not found: ${r}`},404):e.json({project:Bo(o)})}return e.json({error:"project_not_found",message:`project not found: ${r}`},404)}function _M(e,t){let r=e.req.param("id");if(r===void 0||r==="")return e.json({error:"bad_request",message:"project id required"},400);if(r.startsWith(yn)){let n=$d(t.dal,r);if(n===null)return e.json({deleted:!1});let s=t.dal.softDeleteWebProject(n.id);return e.json({deleted:s})}return e.json({deleted:!1})}async function hM(e,t){let r=e.req.param("project_id");if(r===void 0||r==="")return e.json({error:"bad_request",message:"project_id required in path"},400);let n;try{n=await e.req.json()}catch{return e.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.input;if(s===void 0||typeof s!="object")return e.json({error:"bad_request",message:"input is required"},400);let i=s.project_id??r;if(typeof s.text!="string"||s.text==="")return e.json({error:"bad_request",message:"input.text is required"},400);let o=Ky(t.dal,i);if(o===null)return e.json({error:"project_not_found",message:`project not found: ${i}`},404);if(t.dal.getWorkflowByName(o.workflow_name)===null)return e.json({error:"workflow_not_registered",message:`project ${o.name} has no registered workflow "${o.workflow_name}"`},400);let l=`${lM}${crypto.randomUUID()}`,c={text:s.text,context_json:s.context_json??null},d;t.enqueueProjectJob!==void 0?d=t.enqueueProjectJob({dal:t.dal,project_id:o.id,source_ref:l,payload:c}):d=await yM({dal:t.dal,project_id:o.id,source_ref:l,payload:c}),t.dal.insertPromptDispatch({prompt_id:l,project_id:o.id,job_id:d.id,text:s.text,context_json:s.context_json===void 0?null:JSON.stringify(s.context_json)});let u={id:l,project_id:`${Wo}${o.id}`,text:s.text,status:"pending",created_at:new Date().toISOString(),completed_at:null};return e.json({prompt:u},201)}function gM(e,t){let r=e.req.param("id");if(r===void 0||r==="")return e.json({error:"bad_request",message:"prompt id required"},400);let n=wM(t.dal,r);return e.json({result:n})}function Gy(e){let t=e.listProjects().map(Vy),r=e.listWebProjectsActive(wn).map(Bo);return[...t,...r].sort(AM)}function Vy(e){return{id:`${Wo}${e.id}`,workspace_id:wn,name:e.name,repo_path:e.local_path,config_json:{workflow_name:e.workflow_name,team_id:e.team_id,durable_memory_mode:e.durable_memory_mode},last_active_at:null,created_at:e.created_at}}function Bo(e){let t={};if(e.config_json!==null)try{let r=JSON.parse(e.config_json);r!==null&&typeof r=="object"&&(t=r)}catch{}return e.linked_v4_project_id!==null&&(t={...t,linked_v4_project_id:e.linked_v4_project_id}),{id:`${yn}${e.id}`,workspace_id:e.workspace_id,name:e.name,repo_path:e.repo_path,config_json:t,last_active_at:e.last_active_at,created_at:e.created_at}}function $d(e,t){if(!t.startsWith(yn))return null;let r=t.slice(yn.length),n=Number.parseInt(r,10);return!Number.isFinite(n)||String(n)!==r?null:e.getWebProject(n)}function Ky(e,t){if(t.startsWith(Wo)){let n=t.slice(Wo.length),s=Number.parseInt(n,10);if(Number.isFinite(s)&&String(s)===n)return e.getProject(s)}let r=Number.parseInt(t,10);return Number.isFinite(r)&&String(r)===t?e.getProject(r):null}async function yM(e){let{enqueueManual:t}=await Promise.resolve().then(()=>(Wc(),mh));return{id:t(e.dal,{project_id:e.project_id,source_ref:e.source_ref,payload:e.payload}).id}}function wM(e,t){let r=e.getPromptDispatch(t);if(r===null)return{prompt_id:t,data:{status:"unknown"},errors_json:{error:"prompt_not_found"},duration_ms:null};let n=e.getJob(r.job_id);if(n===null)return{prompt_id:t,data:null,errors_json:{error:"job_missing",job_id:r.job_id},duration_ms:null};let s=n.run_id===null?null:e.getRun(n.run_id),i=e.getProject(r.project_id),o=IM(e,i?.team_id??null),a=kM(s),l=NM(n,a,o.length>0),c=xM(r.created_at,s),d=i===null?{totalEstimatedMs:void 0,perStep:new Map}:EM(e,i.workflow_name),u=d.totalEstimatedMs,f=Yy(r.created_at),m=i?.workflow_name,p=d.perStep.size>0?d.perStep.size:void 0,_=s===null?[]:TM(e,s.id),g=bM(s,a,_,d.perStep,o),h=SM(_,d.perStep),S=vM(g,h,u,f,m,p);return l==="error"?{prompt_id:t,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,...Uo(u,f),...S},errors_json:{error:n.last_error??"job_failed",job_id:n.id,run_id:s?.id??null},duration_ms:c}:l==="done"?(r.completed_at===null&&e.setPromptDispatchCompleted(t),{prompt_id:t,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,terminal_state:s?.terminal_state??null,text:r.text,...Uo(u,f),...S},errors_json:null,duration_ms:c}):l==="paused"?{prompt_id:t,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,attempt_count:n.attempt_count,paused_step:a,attention_needed:o,...Uo(u,f),...S},errors_json:null,duration_ms:c}:{prompt_id:t,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,attempt_count:n.attempt_count,...Uo(u,f),...S},errors_json:null,duration_ms:c}}function EM(e,t){let r={totalEstimatedMs:void 0,perStep:new Map},n=e.getWorkflowByName(t);if(n===null)return r;let s;try{s=JSON.parse(n.definition)}catch{return r}if(s===null||typeof s!="object")return r;let i=s,o=typeof i.estimated_duration_ms=="number"&&Number.isFinite(i.estimated_duration_ms)&&i.estimated_duration_ms>=0?i.estimated_duration_ms:void 0,a=new Map;if(Array.isArray(i.steps))for(let l of i.steps){if(l===null||typeof l!="object")continue;let c=l;if(typeof c.id!="string"||c.id.length===0)continue;let d=typeof c.name=="string"&&c.name.length>0?c.name:c.id,u=typeof c.estimated_duration_ms=="number"&&Number.isFinite(c.estimated_duration_ms)&&c.estimated_duration_ms>=0?c.estimated_duration_ms:void 0;a.set(c.id,u===void 0?{name:d}:{name:d,estimated_duration_ms:u})}if(i.steps===void 0&&i.states!==null&&typeof i.states=="object")for(let[l,c]of Object.entries(i.states)){if(c===null||typeof c!="object")continue;let d=c,u=typeof d.estimated_duration_ms=="number"&&Number.isFinite(d.estimated_duration_ms)&&d.estimated_duration_ms>=0?d.estimated_duration_ms:void 0;a.set(l,u===void 0?{name:l}:{name:l,estimated_duration_ms:u})}return{totalEstimatedMs:o,perStep:a}}function TM(e,t){try{return e.listStepsForRun(t)}catch{return[]}}function bM(e,t,r,n,s){if(e===null||e.terminal_state!==null)return;let i=t!==null?t:e.current_state;if(i===null||i.length===0)return;let a=[...r].reverse().find(f=>f.state_name===i&&f.ended_at===null)?.started_at??e.paused_at??e.started_at,l=n.get(i),c=l?.name??i,d=Yy(a),u={id:i,name:c,started_at:a,elapsed_ms:d};return l?.estimated_duration_ms!==void 0&&(u.estimated_duration_ms=l.estimated_duration_ms),s.length>0&&(u.attention_needed=s),u}function SM(e,t){let r=[];for(let n of e){if(n.ended_at===null)continue;let s=Date.parse(n.started_at),i=Date.parse(n.ended_at),o=Number.isFinite(s)&&Number.isFinite(i)?Math.max(0,i-s):0,a=t.get(n.state_name)?.name??n.state_name,l=n.outcome==="failed"?"failed":"done";r.push({id:n.state_name,name:a,duration_ms:o,status:l})}return r}function vM(e,t,r,n,s,i){let o={completed_steps:t,total_elapsed_ms:n};return e!==void 0&&(o.current_step=e),r!==void 0&&(o.total_estimated_ms=r),s!==void 0&&s.length>0&&(o.workflow_name=s),i!==void 0&&(o.total_steps=i),o}function Yy(e){let t=Date.parse(e);return Number.isNaN(t)?0:Math.max(0,Date.now()-t)}function Uo(e,t){return e===void 0?{elapsed_ms:t}:{elapsed_ms:t,estimated_duration_ms:e}}function kM(e){if(e===null)return null;let t=e.current_state;if(t===null)return null;let r="__paused__:";return t.startsWith(r)?t.slice(r.length):null}function IM(e,t){if(t===null)return[];let r;try{r=e.listTeamMembers(t)}catch{return[]}return r.filter(n=>n.state==="attention_needed").map(n=>({alias:n.alias,reason:n.state_reason}))}function NM(e,t,r){return e.status==="queued"?"pending":e.status==="done"?"done":e.status==="failed"?"error":t!==null||r||e.status==="paused"?"paused":e.status==="running"?"running":"error"}function xM(e,t){let r=Date.parse(e);if(Number.isNaN(r))return null;let n=t?.ended_at??null,s=n===null?Date.now():Date.parse(n);return Number.isNaN(s)?null:Math.max(0,s-r)}function AM(e,t){let r=Date.parse(e.last_active_at??""),n=Date.parse(t.last_active_at??""),s=(Number.isNaN(n)?0:n)-(Number.isNaN(r)?0:r);return s===0?e.name.localeCompare(t.name):s}var Wo,yn,lM,wn,Od,cM,zy=T(()=>{"use strict";Wo="project:",yn="web_project:",lM="prompt:",wn="default",Od="Default workspace",cM=new Date(0).toISOString()});import{Buffer as Zy}from"node:buffer";function Qy(e,t,r){if(typeof e=="number"&&Number.isFinite(e)&&e>0)return e;if(t!==void 0&&t!==""){let n=Number(t);if(Number.isFinite(n)&&n>0)return n}return r}function ew(e){return OM[e]}function tw(e){let t=e.trim();if(t==="")return;let r=t.split(/\s+/),n=r.shift();if(!(n===void 0||n===""))return{cmd:n,args:r}}var RM,LM,qo,OM,Cd=T(()=>{"use strict";RM=1e4,LM=256*1024,qo=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(t){this.opts=t,this.pushWindowMs=Qy(t.pushWindowMs,process.env.LMCTL_TERMINAL_PUSH_WINDOW_MS,RM),this.pushByteCap=Qy(t.pushByteCap,process.env.LMCTL_TERMINAL_PUSH_BYTE_CAP,LM),this.timers=t.timers??{setTimeout:(r,n)=>globalThis.setTimeout(r,n),clearTimeout:r=>globalThis.clearTimeout(r)}}startSession(t){if(this.sessions.has(t.session_id))throw new Error(`terminal_session_already_exists: ${t.session_id}`);let r=this.opts.pty.spawn(t.command,t.args,{name:"xterm-256color",cols:t.cols??120,rows:t.rows??30,cwd:t.cwd??process.cwd(),env:t.env??process.env}),n={session_id:t.session_id,pty:r,pendingOutput:[],pendingBytes:0,pushTimer:void 0,closed:!1};return this.sessions.set(t.session_id,n),r.onData(s=>{this.onPtyData(n,s)}),r.onExit(s=>{this.onPtyExit(n,s)}),this.opts.log?.(`[dt-2] terminal session ${t.session_id} started pid=${r.pid} cmd=${t.command}`),{pid:r.pid}}endSession(t){let r=this.sessions.get(t);if(r!==void 0)try{r.pty.kill()}catch{}}onInbound(t){if(t.direction!=="user_to_agent")return;let r=this.sessions.get(t.session_id);if(r===void 0){this.opts.log?.(`[dt-2] inbound terminal data for unknown session ${t.session_id}; dropping`);return}if(r.closed){this.opts.log?.(`[dt-2] inbound terminal data for closed session ${t.session_id}; dropping`);return}try{r.pty.write(t.data)}catch(n){this.opts.log?.(`[dt-2] pty.write failed for session ${t.session_id}: ${n instanceof Error?n.message:String(n)}`)}}setPublish(t){this.opts={...this.opts,publish:t}}listSessions(){return Array.from(this.sessions.values()).map(t=>({session_id:t.session_id,pid:t.pty.pid}))}pendingBytesFor(t){return this.sessions.get(t)?.pendingBytes}async stop(){for(let t of Array.from(this.sessions.values()))try{t.pty.kill()}catch{}for(let t of Array.from(this.sessions.values()))t.pushTimer!==void 0&&(this.timers.clearTimeout(t.pushTimer),t.pushTimer=void 0)}onPtyData(t,r){if(!t.closed){if(t.pendingOutput.push(r),t.pendingBytes+=Zy.byteLength(r,"utf8"),t.pendingBytes>=this.pushByteCap){this.flush(t,"byte_cap");return}t.pushTimer===void 0&&(t.pushTimer=this.timers.setTimeout(()=>{this.flush(t,"window_idle")},this.pushWindowMs))}}async flush(t,r){if(t.pushTimer!==void 0&&(this.timers.clearTimeout(t.pushTimer),t.pushTimer=void 0),t.pendingOutput.length===0)return;let n=t.pendingOutput.join("");t.pendingOutput=[],t.pendingBytes=0;let s={kind:"terminal",session_id:t.session_id,direction:"agent_to_user",data:n,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s),this.opts.log?.(`[dt-2] flushed session=${t.session_id} reason=${r} bytes=${Zy.byteLength(n,"utf8")}`)}catch(i){this.opts.log?.(`[dt-2] publish failed session=${t.session_id} reason=${r}: ${i instanceof Error?i.message:String(i)}`)}}async onPtyExit(t,r){if(t.closed)return;await this.flush(t,"pty_exit");let n=`\r
1952
+ `)}function GC(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function Ye(e){return typeof e=="string"?e:""}function VC(e){if(e===null)return{};try{let t=JSON.parse(e);if(t!==null&&typeof t=="object"&&!Array.isArray(t))return t}catch{return{}}return{}}function Td(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Oo(e,t){return Number(e.req.param(t))}var $o,bd,Dy=T(()=>{"use strict";Lo();Jt();Zc();$o=[{name:"info-qa",title:"Ask a Question",description:"Get a grounded answer from multiple researchers and one consolidator."},{name:"document-creation",title:"Create a Document",description:"Draft, review, and render a polished document with an interactive wizard."},{name:"newspaper",title:"Daily Newspaper",description:"Subscribe to recurring digests for topics you care about."}],bd=$o.map(e=>e.name)});function YC(e){return e.replace(/^\/+/,"")}function Py(e){return typeof e=="string"&&e!==""&&!e.includes("/")&&!e.includes("\\")}function gn(e){if(e.mailboxKey!==void 0&&e.mailboxKey!==null&&e.mailboxKey!==""){let t=YC(e.mailboxKey),r=t.lastIndexOf("/");return(r>=0?t.slice(r+1):t).includes(".")&&(t=r>=0?t.slice(0,r+1):""),t!==""&&!t.endsWith("/")&&(t+="/"),t}return Py(e.userId)&&Py(e.deviceId)?`${e.userId}/${e.deviceId}/`:`${KC}/${e.identityId}/`}function ZC(e){return String(Math.max(0,Math.floor(e))).padStart(zC,"0")}function kd(e,t,r){return`${e}${t}${ZC(r)}.json`}function Co(e,t){return`${e}${t}`}function Mo(e,t,r){let n=`${t}${r}`;if(!e.startsWith(n))return;let s=e.slice(n.length).match(/^(\d+)\.json$/);if(s===null)return;let i=Number(s[1]);return Number.isSafeInteger(i)?i:void 0}var KC,zC,jo=T(()=>{"use strict";KC="mailbox";zC=12});function Yt(e,t){let r=Math.floor(e),n="",s=r;for(let d=0;d<12;d++)n=Do[s&15]+n,s=Math.floor(s/16);let i=Math.floor(t()*4096)&4095,o="",a=i;for(let d=0;d<3;d++)o=Do[a&15]+o,a=a>>4;let l=Do[8|Math.floor(t()*4)&3],c="";for(let d=0;d<15;d++)c+=Do[Math.floor(t()*16)&15];return n.slice(0,8)+"-"+n.slice(8,12)+"-7"+o+"-"+l+c.slice(0,3)+"-"+c.slice(3,15)}var Do,Po=T(()=>{"use strict";Do="0123456789abcdef"});function Nd(e,t){return!Number.isFinite(e)||e<=0?t:e}function xd(e){if(e===null||typeof e!="object")return!1;let t=e;return t.name==="NoSuchKey"||t.name==="NotFound"||t.Code==="NoSuchKey"||t.code==="NoSuchKey"||t.$metadata!==void 0&&t.$metadata.httpStatusCode===404}function qy(e){return e.conversation_id===By&&tM(e.payload)}function tM(e){return typeof e=="object"&&e!==null&&e.kind==="heartbeat"}function rM(e){let t=typeof e.hb=="string"&&e.hb!==""?e.hb:qy(e)?e.timestamp:void 0;if(t===void 0)return;let r=Date.parse(t);return Number.isFinite(r)?r:void 0}var Fy,Uy,Wy,QC,By,eM,Id,Dr,Fo=T(()=>{"use strict";jo();Po();Fy=3e3,Uy=1e4,Wy=12e3,QC=1e3,By="__lmctl_heartbeat__",eM={kind:"heartbeat"},Id={setTimeout:(e,t)=>setTimeout(e,t),clearTimeout:e=>clearTimeout(e)},Dr=class{opts;basePrefix;ownStream;peerStream;cursor;ownSeq;bootstrapped=!1;bootstrapInFlight=null;bootstrapPromise=null;writeChain=Promise.resolve();readIntervalMs;heartbeatIdleMs;backoffReadIntervalMs;running=!1;stopped=!1;stopRequested=!1;timerHandle=null;heartbeatTimerHandle=null;lastWriteMs;lastPeerHeartbeatMs;tickInFlight=null;constructor(t){this.opts=t,this.basePrefix=gn({identityId:t.identityId,userId:t.userId,deviceId:t.deviceId,mailboxKey:t.mailboxKey}),this.ownStream=t.selfRole==="agent"?"local":"web",this.peerStream=t.selfRole==="agent"?"web":"local",this.cursor=t.cursor,this.readIntervalMs=Nd(t.readIntervalMs??t.pollIntervalMs??Fy,Fy),this.heartbeatIdleMs=Nd(t.heartbeatIdleMs??Uy,Uy),this.backoffReadIntervalMs=Nd(t.backoffReadIntervalMs??t.pollIntervalMs??Wy,Wy)}start(){if(this.stopped)throw new Error("SequentialMailboxClient: cannot start after stop()");this.running||(this.running=!0,this.bootstrapInFlight=this.bootstrapThenRun())}async stop(){this.stopped=!0,this.stopRequested=!0;let t=this.opts.timers??Id;if(this.timerHandle!==null&&(t.clearTimeout(this.timerHandle),this.timerHandle=null),this.heartbeatTimerHandle!==null&&(t.clearTimeout(this.heartbeatTimerHandle),this.heartbeatTimerHandle=null),this.bootstrapInFlight!==null)try{await this.bootstrapInFlight}catch{}if(this.tickInFlight!==null)try{await this.tickInFlight}catch{}this.running=!1}async putMessage(t){return this.putEnvelope(t.conversation_id,t.payload)}getCursor(){return this.cursor}getMailboxBasePrefix(){return this.basePrefix}setPollIntervalMs(t){if(!Number.isFinite(t)||t<=0)throw new Error(`SequentialMailboxClient.setPollIntervalMs: invalid ms=${t}`);this.readIntervalMs=t}isPeerOn(){return this.peerIsOn((this.opts.now??Date.now)())}async bootstrapThenRun(){if(await this.ensureBootstrapped(),this.stopRequested){this.running=!1;return}this.runTick(),this.writeHeartbeat()}ensureBootstrapped(){return this.bootstrapped?Promise.resolve():(this.bootstrapPromise===null&&(this.bootstrapPromise=this.runColdStart()),this.bootstrapPromise)}async runColdStart(){try{let t=await this.maxSeq(this.ownStream);this.ownSeq=t,this.cursor===void 0&&(this.cursor=await this.maxSeq(this.peerStream)),this.bootstrapped=!0}catch(t){throw this.bootstrapPromise=null,this.emitError(t,"list"),t}}async maxSeq(t){let r=Co(this.basePrefix,t),n=0,s;do{let i=await this.opts.s3.send(new this.opts.commands.ListObjectsV2Command({Bucket:this.opts.bucket,Prefix:r,MaxKeys:QC,...s!==void 0&&{ContinuationToken:s}}));this.opts.onS3Op?.("list");for(let o of i.Contents??[]){let a=Mo(o.Key??"",this.basePrefix,t);a!==void 0&&a>n&&(n=a)}s=i.IsTruncated===!0?i.NextContinuationToken:void 0}while(s!==void 0);return n}async putEnvelope(t,r){let n=this.writeChain.then(()=>this.doPut(t,r));return this.writeChain=n.catch(()=>{}),n}async doPut(t,r){await this.ensureBootstrapped();let n=(this.opts.now??Date.now)(),s=new Date(n).toISOString(),i={message_id:Yt(n,this.opts.random??Math.random),from:this.opts.selfRole,timestamp:s,hb:s,conversation_id:t,payload:r},o=(this.ownSeq??0)+1,a=kd(this.basePrefix,this.ownStream,o);return await this.opts.s3.send(new this.opts.commands.PutObjectCommand({Bucket:this.opts.bucket,Key:a,Body:JSON.stringify(i),ContentType:"application/json"})),this.opts.onS3Op?.("put"),this.ownSeq=o,this.recordWrite(n),a}scheduleNextTick(t){if(this.stopRequested)return;let r=this.opts.timers??Id;this.timerHandle=r.setTimeout(()=>{this.timerHandle=null,this.runTick()},t)}runTick(){this.stopRequested||(this.tickInFlight=(async()=>{try{await this.pollOnce()}finally{this.tickInFlight=null,this.stopRequested||this.scheduleNextTick(this.nextReadDelayMs())}})())}async pollOnce(){for(;!this.stopRequested;){let t=(this.cursor??0)+1,r=kd(this.basePrefix,this.peerStream,t),n;try{let i=await this.opts.s3.send(new this.opts.commands.GetObjectCommand({Bucket:this.opts.bucket,Key:r}));if(this.opts.onS3Op?.("get"),i.Body===void 0){this.emitError(new Error(`GetObject ${r}: empty body`),"get"),this.advanceCursor(t);continue}n=await i.Body.transformToString("utf-8")}catch(i){if(xd(i)){this.opts.onS3Op?.("get");return}this.emitError(i,"get");return}let s;try{s=JSON.parse(n)}catch(i){this.emitError(i,"get"),this.advanceCursor(t);continue}if(this.recordPeerHeartbeat(s),qy(s)){this.advanceCursor(t);continue}try{await this.opts.onMessage(s)}catch(i){this.emitError(i,"handle");return}this.advanceCursor(t)}}advanceCursor(t){this.cursor=t,this.notifyCursorAdvance(t)}nextReadDelayMs(){return this.peerIsOn((this.opts.now??Date.now)())?this.readIntervalMs:this.backoffReadIntervalMs}peerIsOn(t){return this.lastPeerHeartbeatMs!==void 0&&t-this.lastPeerHeartbeatMs<=this.heartbeatIdleMs}recordPeerHeartbeat(t){let r=rM(t);r!==void 0&&(this.lastPeerHeartbeatMs=r)}recordWrite(t){this.lastWriteMs=t,this.scheduleHeartbeatCheck(this.heartbeatIdleMs)}scheduleHeartbeatCheck(t){if(this.stopRequested)return;let r=this.opts.timers??Id;this.heartbeatTimerHandle!==null&&r.clearTimeout(this.heartbeatTimerHandle),this.heartbeatTimerHandle=r.setTimeout(()=>{this.heartbeatTimerHandle=null,this.maybeWriteHeartbeat()},t)}async maybeWriteHeartbeat(){if(this.stopRequested)return;let t=(this.opts.now??Date.now)();if(this.lastWriteMs!==void 0){let r=t-this.lastWriteMs;if(r<this.heartbeatIdleMs){this.scheduleHeartbeatCheck(this.heartbeatIdleMs-r);return}}await this.writeHeartbeat()}async writeHeartbeat(){try{await this.putEnvelope(By,eM)}catch(t){this.emitError(t,"put"),this.scheduleHeartbeatCheck(this.heartbeatIdleMs)}}notifyCursorAdvance(t){if(this.opts.onCursorAdvance!==void 0)try{this.opts.onCursorAdvance(t)}catch(r){this.emitError(r,"handle")}}emitError(t,r){if(this.opts.onError!==void 0)try{this.opts.onError(t,r)}catch{}else console.error(`SequentialMailboxClient[${r}]`,t)}}});import{getConnInfo as nM}from"@hono/node-server/conninfo";function Hy(e,t){let r=t.bucket??sM,n=t.remoteAddressOf??(i=>oM(i)),s=i=>{let o=n(i);return aM(o)?null:i.json({error:"forbidden",message:"local-mailbox is loopback-only"},403)};e.get("/local-mailbox/object",async i=>{let o=s(i);if(o!==null)return o;let a=Ad(i.req.query("key"));if(typeof a!="string")return i.json({error:"bad_request",message:a.error},400);try{let l=await t.s3.send(new t.commands.GetObjectCommand({Bucket:r,Key:a}));if(l.Body===void 0)return i.json({error:"empty_body"},404);let c=await l.Body.transformToString("utf-8");return i.body(c,200,{"Content-Type":"application/octet-stream"})}catch(l){return xd(l)?i.json({error:"not_found"},404):i.json({error:"internal",message:Rd(l)},500)}}),e.put("/local-mailbox/object",async i=>{let o=s(i);if(o!==null)return o;let a=Ad(i.req.query("key"));if(typeof a!="string")return i.json({error:"bad_request",message:a.error},400);let l=new Uint8Array(await i.req.arrayBuffer());try{return await t.s3.send(new t.commands.PutObjectCommand({Bucket:r,Key:a,Body:l})),i.json({ok:!0})}catch(c){return i.json({error:"internal",message:Rd(c)},500)}}),e.get("/local-mailbox/list",async i=>{let o=s(i);if(o!==null)return o;let a=i.req.query("prefix")??"",l=Ad(a,{allowEmpty:!0});if(typeof l!="string")return i.json({error:"bad_request",message:l.error},400);let c=iM(i.req.query("maxKeys")),d=i.req.query("token");try{let u=await t.s3.send(new t.commands.ListObjectsV2Command({Bucket:r,Prefix:l,...c!==void 0?{MaxKeys:c}:{},...d!==void 0&&d!==""?{ContinuationToken:d}:{}}));return i.json({Contents:(u.Contents??[]).map(f=>({Key:f.Key,LastModified:f.LastModified instanceof Date?f.LastModified.toISOString():f.LastModified})),IsTruncated:u.IsTruncated??!1,...u.NextContinuationToken!==void 0?{NextContinuationToken:u.NextContinuationToken}:{}})}catch(u){return i.json({error:"internal",message:Rd(u)},500)}})}function Ad(e,t={}){if(e===void 0||e==="")return t.allowEmpty===!0?"":{error:"key required"};let r=e.replace(/^\/+/,"");return r.split("/").includes("..")?{error:"key must not contain '..'"}:r}function iM(e){if(e===void 0||e==="")return;let t=Number(e);return Number.isInteger(t)&&t>0?t:void 0}function oM(e){try{return nM(e).remote.address}catch{return}}function aM(e){return e===void 0||e===""?!1:!!(e==="127.0.0.1"||e==="::1"||e.startsWith("::ffff:127.")||e.startsWith("127."))}function Rd(e){return e instanceof Error?e.message:String(e)}var sM,Jy=T(()=>{"use strict";Fo();sM="local"});function Xy(e,t){e.get("/mailbox/workspace",r=>dM(r,t)),e.get("/mailbox/projects",r=>uM(r,t)),e.get("/mailbox/projects/:id",r=>fM(r,t)),e.post("/mailbox/projects",r=>mM(r,t)),e.patch("/mailbox/projects/:id",r=>pM(r,t)),e.delete("/mailbox/projects/:id",r=>_M(r,t)),e.post("/mailbox/projects/:project_id/prompts",r=>hM(r,t)),e.get("/mailbox/prompts/:id",r=>gM(r,t))}function dM(e,t){t.dal.ensureWorkspace({id:wn,name:Ld});let r=Gy(t.dal),n={id:wn,name:Ld,created_at:cM,projects:r};return e.json({workspace:n})}function uM(e,t){return e.json({projects:Gy(t.dal)})}function fM(e,t){let r=e.req.param("id");if(r===void 0||r==="")return e.json({error:"bad_request",message:"project id required"},400);if(r.startsWith(yn)){let s=Od(t.dal,r);return s===null||s.deleted_at!==null?e.json({project:null},404):e.json({project:Bo(s)})}let n=Ky(t.dal,r);return n===null?e.json({project:null},404):e.json({project:Vy(n)})}async function mM(e,t){let r;try{r=await e.req.json()}catch{return e.json({error:"bad_request",message:"invalid JSON body"},400)}let n=r.input;if(n===void 0||typeof n!="object")return e.json({error:"bad_request",message:"input is required"},400);if(typeof n.name!="string"||n.name==="")return e.json({error:"bad_request",message:"input.name is required"},400);if(typeof n.repo_path!="string"||n.repo_path==="")return e.json({error:"bad_request",message:"input.repo_path is required"},400);t.dal.ensureWorkspace({id:wn,name:Ld});let s=t.dal.insertWebProject({workspace_id:wn,name:n.name,repo_path:n.repo_path,config_json:n.config_json===void 0?null:JSON.stringify(n.config_json)});return e.json({project:Bo(s)},201)}async function pM(e,t){let r=e.req.param("id");if(r===void 0||r==="")return e.json({error:"bad_request",message:"project id required"},400);let n;try{n=await e.req.json()}catch{return e.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.input??{};if(r.startsWith(yn)){let i=Od(t.dal,r);if(i===null||i.deleted_at!==null)return e.json({error:"project_not_found",message:`project not found: ${r}`},404);let o=t.dal.updateWebProject({id:i.id,name:s.name===void 0?void 0:s.name,config_json:s.config_json===void 0?void 0:JSON.stringify(s.config_json)});return o===null?e.json({error:"project_not_found",message:`project not found: ${r}`},404):e.json({project:Bo(o)})}return e.json({error:"project_not_found",message:`project not found: ${r}`},404)}function _M(e,t){let r=e.req.param("id");if(r===void 0||r==="")return e.json({error:"bad_request",message:"project id required"},400);if(r.startsWith(yn)){let n=Od(t.dal,r);if(n===null)return e.json({deleted:!1});let s=t.dal.softDeleteWebProject(n.id);return e.json({deleted:s})}return e.json({deleted:!1})}async function hM(e,t){let r=e.req.param("project_id");if(r===void 0||r==="")return e.json({error:"bad_request",message:"project_id required in path"},400);let n;try{n=await e.req.json()}catch{return e.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.input;if(s===void 0||typeof s!="object")return e.json({error:"bad_request",message:"input is required"},400);let i=s.project_id??r;if(typeof s.text!="string"||s.text==="")return e.json({error:"bad_request",message:"input.text is required"},400);let o=Ky(t.dal,i);if(o===null)return e.json({error:"project_not_found",message:`project not found: ${i}`},404);if(t.dal.getWorkflowByName(o.workflow_name)===null)return e.json({error:"workflow_not_registered",message:`project ${o.name} has no registered workflow "${o.workflow_name}"`},400);let l=`${lM}${crypto.randomUUID()}`,c={text:s.text,context_json:s.context_json??null},d;t.enqueueProjectJob!==void 0?d=t.enqueueProjectJob({dal:t.dal,project_id:o.id,source_ref:l,payload:c}):d=await yM({dal:t.dal,project_id:o.id,source_ref:l,payload:c}),t.dal.insertPromptDispatch({prompt_id:l,project_id:o.id,job_id:d.id,text:s.text,context_json:s.context_json===void 0?null:JSON.stringify(s.context_json)});let u={id:l,project_id:`${Wo}${o.id}`,text:s.text,status:"pending",created_at:new Date().toISOString(),completed_at:null};return e.json({prompt:u},201)}function gM(e,t){let r=e.req.param("id");if(r===void 0||r==="")return e.json({error:"bad_request",message:"prompt id required"},400);let n=wM(t.dal,r);return e.json({result:n})}function Gy(e){let t=e.listProjects().map(Vy),r=e.listWebProjectsActive(wn).map(Bo);return[...t,...r].sort(AM)}function Vy(e){return{id:`${Wo}${e.id}`,workspace_id:wn,name:e.name,repo_path:e.local_path,config_json:{workflow_name:e.workflow_name,team_id:e.team_id,durable_memory_mode:e.durable_memory_mode},last_active_at:null,created_at:e.created_at}}function Bo(e){let t={};if(e.config_json!==null)try{let r=JSON.parse(e.config_json);r!==null&&typeof r=="object"&&(t=r)}catch{}return e.linked_v4_project_id!==null&&(t={...t,linked_v4_project_id:e.linked_v4_project_id}),{id:`${yn}${e.id}`,workspace_id:e.workspace_id,name:e.name,repo_path:e.repo_path,config_json:t,last_active_at:e.last_active_at,created_at:e.created_at}}function Od(e,t){if(!t.startsWith(yn))return null;let r=t.slice(yn.length),n=Number.parseInt(r,10);return!Number.isFinite(n)||String(n)!==r?null:e.getWebProject(n)}function Ky(e,t){if(t.startsWith(Wo)){let n=t.slice(Wo.length),s=Number.parseInt(n,10);if(Number.isFinite(s)&&String(s)===n)return e.getProject(s)}let r=Number.parseInt(t,10);return Number.isFinite(r)&&String(r)===t?e.getProject(r):null}async function yM(e){let{enqueueManual:t}=await Promise.resolve().then(()=>(Uc(),mh));return{id:t(e.dal,{project_id:e.project_id,source_ref:e.source_ref,payload:e.payload}).id}}function wM(e,t){let r=e.getPromptDispatch(t);if(r===null)return{prompt_id:t,data:{status:"unknown"},errors_json:{error:"prompt_not_found"},duration_ms:null};let n=e.getJob(r.job_id);if(n===null)return{prompt_id:t,data:null,errors_json:{error:"job_missing",job_id:r.job_id},duration_ms:null};let s=n.run_id===null?null:e.getRun(n.run_id),i=e.getProject(r.project_id),o=IM(e,i?.team_id??null),a=kM(s),l=NM(n,a,o.length>0),c=xM(r.created_at,s),d=i===null?{totalEstimatedMs:void 0,perStep:new Map}:EM(e,i.workflow_name),u=d.totalEstimatedMs,f=Yy(r.created_at),m=i?.workflow_name,p=d.perStep.size>0?d.perStep.size:void 0,_=s===null?[]:TM(e,s.id),g=bM(s,a,_,d.perStep,o),h=SM(_,d.perStep),S=vM(g,h,u,f,m,p);return l==="error"?{prompt_id:t,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,...Uo(u,f),...S},errors_json:{error:n.last_error??"job_failed",job_id:n.id,run_id:s?.id??null},duration_ms:c}:l==="done"?(r.completed_at===null&&e.setPromptDispatchCompleted(t),{prompt_id:t,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,terminal_state:s?.terminal_state??null,text:r.text,...Uo(u,f),...S},errors_json:null,duration_ms:c}):l==="paused"?{prompt_id:t,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,attempt_count:n.attempt_count,paused_step:a,attention_needed:o,...Uo(u,f),...S},errors_json:null,duration_ms:c}:{prompt_id:t,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,attempt_count:n.attempt_count,...Uo(u,f),...S},errors_json:null,duration_ms:c}}function EM(e,t){let r={totalEstimatedMs:void 0,perStep:new Map},n=e.getWorkflowByName(t);if(n===null)return r;let s;try{s=JSON.parse(n.definition)}catch{return r}if(s===null||typeof s!="object")return r;let i=s,o=typeof i.estimated_duration_ms=="number"&&Number.isFinite(i.estimated_duration_ms)&&i.estimated_duration_ms>=0?i.estimated_duration_ms:void 0,a=new Map;if(Array.isArray(i.steps))for(let l of i.steps){if(l===null||typeof l!="object")continue;let c=l;if(typeof c.id!="string"||c.id.length===0)continue;let d=typeof c.name=="string"&&c.name.length>0?c.name:c.id,u=typeof c.estimated_duration_ms=="number"&&Number.isFinite(c.estimated_duration_ms)&&c.estimated_duration_ms>=0?c.estimated_duration_ms:void 0;a.set(c.id,u===void 0?{name:d}:{name:d,estimated_duration_ms:u})}if(i.steps===void 0&&i.states!==null&&typeof i.states=="object")for(let[l,c]of Object.entries(i.states)){if(c===null||typeof c!="object")continue;let d=c,u=typeof d.estimated_duration_ms=="number"&&Number.isFinite(d.estimated_duration_ms)&&d.estimated_duration_ms>=0?d.estimated_duration_ms:void 0;a.set(l,u===void 0?{name:l}:{name:l,estimated_duration_ms:u})}return{totalEstimatedMs:o,perStep:a}}function TM(e,t){try{return e.listStepsForRun(t)}catch{return[]}}function bM(e,t,r,n,s){if(e===null||e.terminal_state!==null)return;let i=t!==null?t:e.current_state;if(i===null||i.length===0)return;let a=[...r].reverse().find(f=>f.state_name===i&&f.ended_at===null)?.started_at??e.paused_at??e.started_at,l=n.get(i),c=l?.name??i,d=Yy(a),u={id:i,name:c,started_at:a,elapsed_ms:d};return l?.estimated_duration_ms!==void 0&&(u.estimated_duration_ms=l.estimated_duration_ms),s.length>0&&(u.attention_needed=s),u}function SM(e,t){let r=[];for(let n of e){if(n.ended_at===null)continue;let s=Date.parse(n.started_at),i=Date.parse(n.ended_at),o=Number.isFinite(s)&&Number.isFinite(i)?Math.max(0,i-s):0,a=t.get(n.state_name)?.name??n.state_name,l=n.outcome==="failed"?"failed":"done";r.push({id:n.state_name,name:a,duration_ms:o,status:l})}return r}function vM(e,t,r,n,s,i){let o={completed_steps:t,total_elapsed_ms:n};return e!==void 0&&(o.current_step=e),r!==void 0&&(o.total_estimated_ms=r),s!==void 0&&s.length>0&&(o.workflow_name=s),i!==void 0&&(o.total_steps=i),o}function Yy(e){let t=Date.parse(e);return Number.isNaN(t)?0:Math.max(0,Date.now()-t)}function Uo(e,t){return e===void 0?{elapsed_ms:t}:{elapsed_ms:t,estimated_duration_ms:e}}function kM(e){if(e===null)return null;let t=e.current_state;if(t===null)return null;let r="__paused__:";return t.startsWith(r)?t.slice(r.length):null}function IM(e,t){if(t===null)return[];let r;try{r=e.listTeamMembers(t)}catch{return[]}return r.filter(n=>n.state==="attention_needed").map(n=>({alias:n.alias,reason:n.state_reason}))}function NM(e,t,r){return e.status==="queued"?"pending":e.status==="done"?"done":e.status==="failed"?"error":t!==null||r||e.status==="paused"?"paused":e.status==="running"?"running":"error"}function xM(e,t){let r=Date.parse(e);if(Number.isNaN(r))return null;let n=t?.ended_at??null,s=n===null?Date.now():Date.parse(n);return Number.isNaN(s)?null:Math.max(0,s-r)}function AM(e,t){let r=Date.parse(e.last_active_at??""),n=Date.parse(t.last_active_at??""),s=(Number.isNaN(n)?0:n)-(Number.isNaN(r)?0:r);return s===0?e.name.localeCompare(t.name):s}var Wo,yn,lM,wn,Ld,cM,zy=T(()=>{"use strict";Wo="project:",yn="web_project:",lM="prompt:",wn="default",Ld="Default workspace",cM=new Date(0).toISOString()});import{Buffer as Zy}from"node:buffer";function Qy(e,t,r){if(typeof e=="number"&&Number.isFinite(e)&&e>0)return e;if(t!==void 0&&t!==""){let n=Number(t);if(Number.isFinite(n)&&n>0)return n}return r}function ew(e){return OM[e]}function tw(e){let t=e.trim();if(t==="")return;let r=t.split(/\s+/),n=r.shift();if(!(n===void 0||n===""))return{cmd:n,args:r}}var RM,LM,qo,OM,$d=T(()=>{"use strict";RM=1e4,LM=256*1024,qo=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(t){this.opts=t,this.pushWindowMs=Qy(t.pushWindowMs,process.env.LMCTL_TERMINAL_PUSH_WINDOW_MS,RM),this.pushByteCap=Qy(t.pushByteCap,process.env.LMCTL_TERMINAL_PUSH_BYTE_CAP,LM),this.timers=t.timers??{setTimeout:(r,n)=>globalThis.setTimeout(r,n),clearTimeout:r=>globalThis.clearTimeout(r)}}startSession(t){if(this.sessions.has(t.session_id))throw new Error(`terminal_session_already_exists: ${t.session_id}`);let r=this.opts.pty.spawn(t.command,t.args,{name:"xterm-256color",cols:t.cols??120,rows:t.rows??30,cwd:t.cwd??process.cwd(),env:t.env??process.env}),n={session_id:t.session_id,pty:r,pendingOutput:[],pendingBytes:0,pushTimer:void 0,closed:!1};return this.sessions.set(t.session_id,n),r.onData(s=>{this.onPtyData(n,s)}),r.onExit(s=>{this.onPtyExit(n,s)}),this.opts.log?.(`[dt-2] terminal session ${t.session_id} started pid=${r.pid} cmd=${t.command}`),{pid:r.pid}}endSession(t){let r=this.sessions.get(t);if(r!==void 0)try{r.pty.kill()}catch{}}onInbound(t){if(t.direction!=="user_to_agent")return;let r=this.sessions.get(t.session_id);if(r===void 0){this.opts.log?.(`[dt-2] inbound terminal data for unknown session ${t.session_id}; dropping`);return}if(r.closed){this.opts.log?.(`[dt-2] inbound terminal data for closed session ${t.session_id}; dropping`);return}try{r.pty.write(t.data)}catch(n){this.opts.log?.(`[dt-2] pty.write failed for session ${t.session_id}: ${n instanceof Error?n.message:String(n)}`)}}setPublish(t){this.opts={...this.opts,publish:t}}listSessions(){return Array.from(this.sessions.values()).map(t=>({session_id:t.session_id,pid:t.pty.pid}))}pendingBytesFor(t){return this.sessions.get(t)?.pendingBytes}async stop(){for(let t of Array.from(this.sessions.values()))try{t.pty.kill()}catch{}for(let t of Array.from(this.sessions.values()))t.pushTimer!==void 0&&(this.timers.clearTimeout(t.pushTimer),t.pushTimer=void 0)}onPtyData(t,r){if(!t.closed){if(t.pendingOutput.push(r),t.pendingBytes+=Zy.byteLength(r,"utf8"),t.pendingBytes>=this.pushByteCap){this.flush(t,"byte_cap");return}t.pushTimer===void 0&&(t.pushTimer=this.timers.setTimeout(()=>{this.flush(t,"window_idle")},this.pushWindowMs))}}async flush(t,r){if(t.pushTimer!==void 0&&(this.timers.clearTimeout(t.pushTimer),t.pushTimer=void 0),t.pendingOutput.length===0)return;let n=t.pendingOutput.join("");t.pendingOutput=[],t.pendingBytes=0;let s={kind:"terminal",session_id:t.session_id,direction:"agent_to_user",data:n,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s),this.opts.log?.(`[dt-2] flushed session=${t.session_id} reason=${r} bytes=${Zy.byteLength(n,"utf8")}`)}catch(i){this.opts.log?.(`[dt-2] publish failed session=${t.session_id} reason=${r}: ${i instanceof Error?i.message:String(i)}`)}}async onPtyExit(t,r){if(t.closed)return;await this.flush(t,"pty_exit");let n=`\r
1953
1953
  [process exited with code ${r.exitCode}${r.signal!==void 0?` signal ${r.signal}`:""}]\r
1954
- `,s={kind:"terminal",session_id:t.session_id,direction:"agent_to_user",data:n,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s)}catch(i){this.opts.log?.(`[dt-2] publish (exit) failed session=${t.session_id}: ${i instanceof Error?i.message:String(i)}`)}t.closed=!0,this.sessions.delete(t.session_id)}};OM={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 nw(e,t){e.post("/mailbox/terminal/launch",r=>$M(r,t)),e.post("/mailbox/terminal/end/:session_id",r=>CM(r,t)),e.get("/mailbox/terminal/sessions",r=>MM(r,t))}async function $M(e,t){let r=t.terminalSessionManager;if(r===void 0)return e.json({error:"terminal_unavailable",message:"terminal session manager not configured (mailbox runtime missing)"},503);let n;try{n=await e.req.json()}catch{return e.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.session_id;if(typeof s!="string"||!rw.test(s))return e.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400);let i=n.provider;if(typeof i!="string"||i==="")return e.json({error:"bad_request",message:"provider is required"},400);let o;if(typeof n.command_line=="string"&&n.command_line.trim()!==""){if(o=tw(n.command_line),o===void 0)return e.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=ew(i);if(a===void 0)return e.json({error:"no_default_for_provider",message:`no TERMINAL_LAUNCH_DEFAULTS entry for provider "${i}"`},400);o={cmd:a.cmd,args:[...a.args]}}try{let{pid:a}=r.startSession({session_id:s,command:o.cmd,args:o.args,...typeof n.cwd=="string"&&n.cwd!==""?{cwd:n.cwd}:{}});return e.json({session_id:s,pid:a,command:o.cmd,args:o.args},201)}catch(a){let l=a instanceof Error?a.message:String(a);return l.startsWith("terminal_session_already_exists")?e.json({error:"session_exists",message:l},409):e.json({error:"spawn_failed",message:l},500)}}function CM(e,t){let r=t.terminalSessionManager;if(r===void 0)return e.json({error:"terminal_unavailable",message:"terminal session manager not configured"},503);let n=e.req.param("session_id");return n===void 0||!rw.test(n)?e.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400):(r.endSession(n),e.json({session_id:n,ended:!0}))}function MM(e,t){let r=t.terminalSessionManager;return r===void 0?e.json({sessions:[],note:"terminal session manager not configured"}):e.json({sessions:r.listSessions()})}var rw,sw=T(()=>{"use strict";Cd();rw=/^[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 jM}from"node:buffer";function FM(e){try{return jM.byteLength(JSON.stringify(e),"utf8")}catch{return 256}}function iw(e,t,r){if(typeof e=="number"&&Number.isFinite(e)&&e>0)return e;if(t!==void 0&&t!==""){let n=Number(t);if(Number.isFinite(n)&&n>0)return n}return r}function ow(e){return UM[e]}function aw(e){let t=e.trim();if(t==="")return;let r=[],n=0;for(;n<t.length;){let i=t[n];if(i===" "||i===" "){n+=1;continue}if(i==='"'){let a=n+1,l="";for(;a<t.length&&t[a]!=='"';)l+=t[a],a+=1;r.push(l),n=a+1;continue}let o=n;for(;o<t.length&&t[o]!==" "&&t[o]!==" ";)o+=1;r.push(t.slice(n,o)),n=o}if(r.length===0)return;let s=r.shift();if(!(s===void 0||s===""))return{cmd:s,args:r}}var DM,PM,Ho,UM,Md=T(()=>{"use strict";DM=2e3,PM=64*1024,Ho=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(t){this.opts=t,this.pushWindowMs=iw(t.pushWindowMs,process.env.LMCTL_PROVIDER_PUSH_WINDOW_MS,DM),this.pushByteCap=iw(t.pushByteCap,process.env.LMCTL_PROVIDER_PUSH_BYTE_CAP,PM),this.timers=t.timers??{setTimeout:(r,n)=>globalThis.setTimeout(r,n),clearTimeout:r=>globalThis.clearTimeout(r)}}async startSession(t){if(this.sessions.has(t.session_id))throw new Error(`persistent_session_already_exists: ${t.session_id}`);let r=this.opts.adapterFactory(t.provider),n={session_id:t.session_id,provider:t.provider,adapter:r,child:void 0,pendingEvents:[],pendingBytes:0,pushTimer:void 0,generation:1,turnMap:new Map,closed:!1};this.sessions.set(t.session_id,n);let s=this.makeAdapterContext(n);try{let i=await r.start(t,s);return n.child=i,this.wireChildExit(n,i),this.opts.log?.(`[dt-3] persistent session ${t.session_id} started provider=${t.provider} pid=${i.pid??"?"}`),{pid:i.pid}}catch(i){throw this.sessions.delete(t.session_id),i}}async endSession(t){let r=this.sessions.get(t);if(r!==void 0){r.generation+=1;try{await r.adapter.stop()}catch{}if(r.child!==void 0)try{r.child.kill("SIGTERM")}catch{}await this.flush(r,"session_end"),r.closed=!0,this.sessions.delete(t)}}async onInbound(t){if(t.direction!=="user_to_agent")return;let r=this.sessions.get(t.session_id);if(r===void 0){this.opts.log?.(`[dt-3] inbound provider data for unknown session ${t.session_id}; dropping`);return}if(r.closed){this.opts.log?.(`[dt-3] inbound provider data for closed session ${t.session_id}; dropping`);return}let n=t.user_input??"";if(n!=="")try{await r.adapter.sendTurn(n)}catch(s){let i=s instanceof Error?s.message:String(s);this.opts.log?.(`[dt-3] adapter.sendTurn failed session=${t.session_id}: ${i}`),this.appendEvent(r,{event_type:"error",payload:{message:`sendTurn failed: ${i}`}})}}setPublish(t){this.opts={...this.opts,publish:t}}listSessions(){return Array.from(this.sessions.values()).map(t=>({session_id:t.session_id,provider:t.provider,pid:t.child?.pid}))}pendingEventCountFor(t){return this.sessions.get(t)?.pendingEvents.length}generationFor(t){return this.sessions.get(t)?.generation}_testBumpGeneration(t){let r=this.sessions.get(t);r!==void 0&&(r.generation+=1)}async stop(){for(let t of Array.from(this.sessions.values())){t.generation+=1;try{await t.adapter.stop()}catch{}if(t.child!==void 0)try{t.child.kill("SIGTERM")}catch{}}for(let t of Array.from(this.sessions.values()))t.pushTimer!==void 0&&(this.timers.clearTimeout(t.pushTimer),t.pushTimer=void 0)}makeAdapterContext(t){let r=t.generation,n=this;return{generation:r,currentGeneration(){return t.generation},emit(s){r===t.generation&&(t.closed||n.appendEvent(t,s))},...n.opts.log!==void 0?{log:n.opts.log}:{},turnMap:t.turnMap}}appendEvent(t,r){t.pendingEvents.push(r);let n=FM(r);if(t.pendingBytes+=n,t.pendingBytes>=this.pushByteCap){this.flush(t,"byte_cap");return}t.pushTimer===void 0&&(t.pushTimer=this.timers.setTimeout(()=>{this.flush(t,"window_idle")},this.pushWindowMs))}async flush(t,r){if(t.pushTimer!==void 0&&(this.timers.clearTimeout(t.pushTimer),t.pushTimer=void 0),t.pendingEvents.length===0)return;let n=t.pendingEvents;t.pendingEvents=[],t.pendingBytes=0;let s={kind:"provider",session_id:t.session_id,direction:"agent_to_user",events:n,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s),this.opts.log?.(`[dt-3] flushed session=${t.session_id} reason=${r} events=${n.length}`)}catch(i){this.opts.log?.(`[dt-3] publish failed session=${t.session_id} reason=${r}: ${i instanceof Error?i.message:String(i)}`)}}wireChildExit(t,r){let n=t.generation;r.on("exit",(s,i)=>{n===t.generation&&(t.closed||(this.appendEvent(t,{event_type:"error",payload:{message:`provider child exited code=${s??"?"} signal=${i??""}; session ended. Click Reset to start a new chat.`}}),this.flush(t,"child_exit"),t.closed=!0))}),r.on("error",s=>{n===t.generation&&(t.closed||(this.appendEvent(t,{event_type:"error",payload:{message:`provider child error: ${s.message}`}}),this.flush(t,"child_exit")))})}};UM={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 cw(e,t){e.post("/mailbox/chat/launch",r=>WM(r,t)),e.post("/mailbox/chat/end/:session_id",r=>BM(r,t)),e.get("/mailbox/chat/sessions",r=>qM(r,t))}async function WM(e,t){let r=t.persistentSessionManager;if(r===void 0)return e.json({error:"chat_unavailable",message:"persistent session manager not configured (mailbox runtime missing)"},503);let n;try{n=await e.req.json()}catch{return e.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.session_id;if(typeof s!="string"||!lw.test(s))return e.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400);let i=n.provider;if(typeof i!="string"||i==="")return e.json({error:"bad_request",message:"provider is required"},400);let o;if(typeof n.command_line=="string"&&n.command_line.trim()!==""){if(o=aw(n.command_line),o===void 0)return e.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=ow(i);if(a===void 0)return e.json({error:"no_default_for_provider",message:`no PERSISTENT_LAUNCH_DEFAULTS entry for provider "${i}"`},400);o={cmd:a.cmd,args:[...a.args]}}try{let{pid:a}=await r.startSession({session_id:s,provider:i,command:o.cmd,args:o.args,...typeof n.cwd=="string"&&n.cwd!==""?{cwd:n.cwd}:{}});return e.json({session_id:s,provider:i,pid:a,command:o.cmd,args:o.args},201)}catch(a){let l=a instanceof Error?a.message:String(a);return l.startsWith("persistent_session_already_exists")?e.json({error:"session_exists",message:l},409):l.startsWith("no_persistent_adapter_for_provider")?e.json({error:"no_adapter",message:l},400):e.json({error:"spawn_failed",message:l},500)}}async function BM(e,t){let r=t.persistentSessionManager;if(r===void 0)return e.json({error:"chat_unavailable",message:"persistent session manager not configured"},503);let n=e.req.param("session_id");return n===void 0||!lw.test(n)?e.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400):(await r.endSession(n),e.json({session_id:n,ended:!0}))}function qM(e,t){let r=t.persistentSessionManager;return r===void 0?e.json({sessions:[],note:"persistent session manager not configured"}):e.json({sessions:r.listSessions()})}var lw,dw=T(()=>{"use strict";Md();lw=/^[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 HM}from"node:fs";function fw(e){let t=e.artifacts.find(r=>r.kind===`${e.state_name}_transcript`);if(t?.content!==void 0&&t.content!==null)return uw(t.content);if(t?.path===void 0||t.path===null)return[];try{let r=HM(t.path,{encoding:"utf8"});return uw(r)}catch{return[]}}function uw(e){let t=e.split(/\r?\n/).filter(r=>r.trim().length>0);return t.length===0?[]:t.map(r=>{let n=/^(user|assistant|system|tool)\s*:\s*(.*)$/i.exec(r);return n===null?{role:"transcript",text:r}:{role:n[1].toLowerCase(),text:n[2]}})}var mw=T(()=>{"use strict"});function pw(e,t,r){let n=e.getRun(t);if(n===null)return{err:`run ${t}: not found`};if(r!==void 0){let l=e.findTeamMemberByAlias(n.team_id,r);return l===null?{err:`run ${t}: team has no member alias "${r}"`}:l.sessionid===null||l.sessionid.length===0?{err:`run ${t}: member "${l.alias}" has no sessionid yet (seed first)`}:{ok:{provider:l.provider,sessionid:l.sessionid,sessiondir:l.sessiondir,alias:l.alias,...l.model!==null&&l.model!==void 0?{model:l.model}:{}}}}let s=e.latestAgentCall(t);if(s!==null){let l=e.findTeamMemberByAlias(n.team_id,s.alias);return l===null?{err:`run ${t}: team has no member alias "${s.alias}" (latest agent_call references a member that has been removed)`}:l.sessionid===null||l.sessionid.length===0?{err:`run ${t}: member "${l.alias}" has no sessionid yet (seed first)`}:{ok:{provider:l.provider,sessionid:l.sessionid,sessiondir:l.sessiondir,alias:l.alias,...l.model!==null&&l.model!==void 0?{model:l.model}:{}}}}let o=e.listTeamMembers(n.team_id).filter(l=>l.state!=="retired"&&l.sessionid!==null&&l.sessionid.length>0);if(o.length===0)return{err:`run ${t}: cannot resolve an agent session (no agent_call yet, no seeded member)`};if(o.length>1){let l=o.map(c=>c.alias).join(", ");return{err:`run ${t}: cannot resolve an agent session (no agent_call yet; team has multiple members [${l}] \u2014 pass --alias)`}}let a=o[0];return{ok:{provider:a.provider,sessionid:a.sessionid,sessiondir:a.sessiondir,alias:a.alias,...a.model!==null&&a.model!==void 0?{model:a.model}:{}}}}function Jo(e,t){let r=e.query(`SELECT id, kind FROM attention
1954
+ `,s={kind:"terminal",session_id:t.session_id,direction:"agent_to_user",data:n,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s)}catch(i){this.opts.log?.(`[dt-2] publish (exit) failed session=${t.session_id}: ${i instanceof Error?i.message:String(i)}`)}t.closed=!0,this.sessions.delete(t.session_id)}};OM={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 nw(e,t){e.post("/mailbox/terminal/launch",r=>$M(r,t)),e.post("/mailbox/terminal/end/:session_id",r=>CM(r,t)),e.get("/mailbox/terminal/sessions",r=>MM(r,t))}async function $M(e,t){let r=t.terminalSessionManager;if(r===void 0)return e.json({error:"terminal_unavailable",message:"terminal session manager not configured (mailbox runtime missing)"},503);let n;try{n=await e.req.json()}catch{return e.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.session_id;if(typeof s!="string"||!rw.test(s))return e.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400);let i=n.provider;if(typeof i!="string"||i==="")return e.json({error:"bad_request",message:"provider is required"},400);let o;if(typeof n.command_line=="string"&&n.command_line.trim()!==""){if(o=tw(n.command_line),o===void 0)return e.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=ew(i);if(a===void 0)return e.json({error:"no_default_for_provider",message:`no TERMINAL_LAUNCH_DEFAULTS entry for provider "${i}"`},400);o={cmd:a.cmd,args:[...a.args]}}try{let{pid:a}=r.startSession({session_id:s,command:o.cmd,args:o.args,...typeof n.cwd=="string"&&n.cwd!==""?{cwd:n.cwd}:{}});return e.json({session_id:s,pid:a,command:o.cmd,args:o.args},201)}catch(a){let l=a instanceof Error?a.message:String(a);return l.startsWith("terminal_session_already_exists")?e.json({error:"session_exists",message:l},409):e.json({error:"spawn_failed",message:l},500)}}function CM(e,t){let r=t.terminalSessionManager;if(r===void 0)return e.json({error:"terminal_unavailable",message:"terminal session manager not configured"},503);let n=e.req.param("session_id");return n===void 0||!rw.test(n)?e.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400):(r.endSession(n),e.json({session_id:n,ended:!0}))}function MM(e,t){let r=t.terminalSessionManager;return r===void 0?e.json({sessions:[],note:"terminal session manager not configured"}):e.json({sessions:r.listSessions()})}var rw,sw=T(()=>{"use strict";$d();rw=/^[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 jM}from"node:buffer";function FM(e){try{return jM.byteLength(JSON.stringify(e),"utf8")}catch{return 256}}function iw(e,t,r){if(typeof e=="number"&&Number.isFinite(e)&&e>0)return e;if(t!==void 0&&t!==""){let n=Number(t);if(Number.isFinite(n)&&n>0)return n}return r}function ow(e){return UM[e]}function aw(e){let t=e.trim();if(t==="")return;let r=[],n=0;for(;n<t.length;){let i=t[n];if(i===" "||i===" "){n+=1;continue}if(i==='"'){let a=n+1,l="";for(;a<t.length&&t[a]!=='"';)l+=t[a],a+=1;r.push(l),n=a+1;continue}let o=n;for(;o<t.length&&t[o]!==" "&&t[o]!==" ";)o+=1;r.push(t.slice(n,o)),n=o}if(r.length===0)return;let s=r.shift();if(!(s===void 0||s===""))return{cmd:s,args:r}}var DM,PM,Ho,UM,Cd=T(()=>{"use strict";DM=2e3,PM=64*1024,Ho=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(t){this.opts=t,this.pushWindowMs=iw(t.pushWindowMs,process.env.LMCTL_PROVIDER_PUSH_WINDOW_MS,DM),this.pushByteCap=iw(t.pushByteCap,process.env.LMCTL_PROVIDER_PUSH_BYTE_CAP,PM),this.timers=t.timers??{setTimeout:(r,n)=>globalThis.setTimeout(r,n),clearTimeout:r=>globalThis.clearTimeout(r)}}async startSession(t){if(this.sessions.has(t.session_id))throw new Error(`persistent_session_already_exists: ${t.session_id}`);let r=this.opts.adapterFactory(t.provider),n={session_id:t.session_id,provider:t.provider,adapter:r,child:void 0,pendingEvents:[],pendingBytes:0,pushTimer:void 0,generation:1,turnMap:new Map,closed:!1};this.sessions.set(t.session_id,n);let s=this.makeAdapterContext(n);try{let i=await r.start(t,s);return n.child=i,this.wireChildExit(n,i),this.opts.log?.(`[dt-3] persistent session ${t.session_id} started provider=${t.provider} pid=${i.pid??"?"}`),{pid:i.pid}}catch(i){throw this.sessions.delete(t.session_id),i}}async endSession(t){let r=this.sessions.get(t);if(r!==void 0){r.generation+=1;try{await r.adapter.stop()}catch{}if(r.child!==void 0)try{r.child.kill("SIGTERM")}catch{}await this.flush(r,"session_end"),r.closed=!0,this.sessions.delete(t)}}async onInbound(t){if(t.direction!=="user_to_agent")return;let r=this.sessions.get(t.session_id);if(r===void 0){this.opts.log?.(`[dt-3] inbound provider data for unknown session ${t.session_id}; dropping`);return}if(r.closed){this.opts.log?.(`[dt-3] inbound provider data for closed session ${t.session_id}; dropping`);return}let n=t.user_input??"";if(n!=="")try{await r.adapter.sendTurn(n)}catch(s){let i=s instanceof Error?s.message:String(s);this.opts.log?.(`[dt-3] adapter.sendTurn failed session=${t.session_id}: ${i}`),this.appendEvent(r,{event_type:"error",payload:{message:`sendTurn failed: ${i}`}})}}setPublish(t){this.opts={...this.opts,publish:t}}listSessions(){return Array.from(this.sessions.values()).map(t=>({session_id:t.session_id,provider:t.provider,pid:t.child?.pid}))}pendingEventCountFor(t){return this.sessions.get(t)?.pendingEvents.length}generationFor(t){return this.sessions.get(t)?.generation}_testBumpGeneration(t){let r=this.sessions.get(t);r!==void 0&&(r.generation+=1)}async stop(){for(let t of Array.from(this.sessions.values())){t.generation+=1;try{await t.adapter.stop()}catch{}if(t.child!==void 0)try{t.child.kill("SIGTERM")}catch{}}for(let t of Array.from(this.sessions.values()))t.pushTimer!==void 0&&(this.timers.clearTimeout(t.pushTimer),t.pushTimer=void 0)}makeAdapterContext(t){let r=t.generation,n=this;return{generation:r,currentGeneration(){return t.generation},emit(s){r===t.generation&&(t.closed||n.appendEvent(t,s))},...n.opts.log!==void 0?{log:n.opts.log}:{},turnMap:t.turnMap}}appendEvent(t,r){t.pendingEvents.push(r);let n=FM(r);if(t.pendingBytes+=n,t.pendingBytes>=this.pushByteCap){this.flush(t,"byte_cap");return}t.pushTimer===void 0&&(t.pushTimer=this.timers.setTimeout(()=>{this.flush(t,"window_idle")},this.pushWindowMs))}async flush(t,r){if(t.pushTimer!==void 0&&(this.timers.clearTimeout(t.pushTimer),t.pushTimer=void 0),t.pendingEvents.length===0)return;let n=t.pendingEvents;t.pendingEvents=[],t.pendingBytes=0;let s={kind:"provider",session_id:t.session_id,direction:"agent_to_user",events:n,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s),this.opts.log?.(`[dt-3] flushed session=${t.session_id} reason=${r} events=${n.length}`)}catch(i){this.opts.log?.(`[dt-3] publish failed session=${t.session_id} reason=${r}: ${i instanceof Error?i.message:String(i)}`)}}wireChildExit(t,r){let n=t.generation;r.on("exit",(s,i)=>{n===t.generation&&(t.closed||(this.appendEvent(t,{event_type:"error",payload:{message:`provider child exited code=${s??"?"} signal=${i??""}; session ended. Click Reset to start a new chat.`}}),this.flush(t,"child_exit"),t.closed=!0))}),r.on("error",s=>{n===t.generation&&(t.closed||(this.appendEvent(t,{event_type:"error",payload:{message:`provider child error: ${s.message}`}}),this.flush(t,"child_exit")))})}};UM={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 cw(e,t){e.post("/mailbox/chat/launch",r=>WM(r,t)),e.post("/mailbox/chat/end/:session_id",r=>BM(r,t)),e.get("/mailbox/chat/sessions",r=>qM(r,t))}async function WM(e,t){let r=t.persistentSessionManager;if(r===void 0)return e.json({error:"chat_unavailable",message:"persistent session manager not configured (mailbox runtime missing)"},503);let n;try{n=await e.req.json()}catch{return e.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.session_id;if(typeof s!="string"||!lw.test(s))return e.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400);let i=n.provider;if(typeof i!="string"||i==="")return e.json({error:"bad_request",message:"provider is required"},400);let o;if(typeof n.command_line=="string"&&n.command_line.trim()!==""){if(o=aw(n.command_line),o===void 0)return e.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=ow(i);if(a===void 0)return e.json({error:"no_default_for_provider",message:`no PERSISTENT_LAUNCH_DEFAULTS entry for provider "${i}"`},400);o={cmd:a.cmd,args:[...a.args]}}try{let{pid:a}=await r.startSession({session_id:s,provider:i,command:o.cmd,args:o.args,...typeof n.cwd=="string"&&n.cwd!==""?{cwd:n.cwd}:{}});return e.json({session_id:s,provider:i,pid:a,command:o.cmd,args:o.args},201)}catch(a){let l=a instanceof Error?a.message:String(a);return l.startsWith("persistent_session_already_exists")?e.json({error:"session_exists",message:l},409):l.startsWith("no_persistent_adapter_for_provider")?e.json({error:"no_adapter",message:l},400):e.json({error:"spawn_failed",message:l},500)}}async function BM(e,t){let r=t.persistentSessionManager;if(r===void 0)return e.json({error:"chat_unavailable",message:"persistent session manager not configured"},503);let n=e.req.param("session_id");return n===void 0||!lw.test(n)?e.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400):(await r.endSession(n),e.json({session_id:n,ended:!0}))}function qM(e,t){let r=t.persistentSessionManager;return r===void 0?e.json({sessions:[],note:"persistent session manager not configured"}):e.json({sessions:r.listSessions()})}var lw,dw=T(()=>{"use strict";Cd();lw=/^[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 HM}from"node:fs";function fw(e){let t=e.artifacts.find(r=>r.kind===`${e.state_name}_transcript`);if(t?.content!==void 0&&t.content!==null)return uw(t.content);if(t?.path===void 0||t.path===null)return[];try{let r=HM(t.path,{encoding:"utf8"});return uw(r)}catch{return[]}}function uw(e){let t=e.split(/\r?\n/).filter(r=>r.trim().length>0);return t.length===0?[]:t.map(r=>{let n=/^(user|assistant|system|tool)\s*:\s*(.*)$/i.exec(r);return n===null?{role:"transcript",text:r}:{role:n[1].toLowerCase(),text:n[2]}})}var mw=T(()=>{"use strict"});function pw(e,t,r){let n=e.getRun(t);if(n===null)return{err:`run ${t}: not found`};if(r!==void 0){let l=e.findTeamMemberByAlias(n.team_id,r);return l===null?{err:`run ${t}: team has no member alias "${r}"`}:l.sessionid===null||l.sessionid.length===0?{err:`run ${t}: member "${l.alias}" has no sessionid yet (seed first)`}:{ok:{provider:l.provider,sessionid:l.sessionid,sessiondir:l.sessiondir,alias:l.alias,...l.model!==null&&l.model!==void 0?{model:l.model}:{}}}}let s=e.latestAgentCall(t);if(s!==null){let l=e.findTeamMemberByAlias(n.team_id,s.alias);return l===null?{err:`run ${t}: team has no member alias "${s.alias}" (latest agent_call references a member that has been removed)`}:l.sessionid===null||l.sessionid.length===0?{err:`run ${t}: member "${l.alias}" has no sessionid yet (seed first)`}:{ok:{provider:l.provider,sessionid:l.sessionid,sessiondir:l.sessiondir,alias:l.alias,...l.model!==null&&l.model!==void 0?{model:l.model}:{}}}}let o=e.listTeamMembers(n.team_id).filter(l=>l.state!=="retired"&&l.sessionid!==null&&l.sessionid.length>0);if(o.length===0)return{err:`run ${t}: cannot resolve an agent session (no agent_call yet, no seeded member)`};if(o.length>1){let l=o.map(c=>c.alias).join(", ");return{err:`run ${t}: cannot resolve an agent session (no agent_call yet; team has multiple members [${l}] \u2014 pass --alias)`}}let a=o[0];return{ok:{provider:a.provider,sessionid:a.sessionid,sessiondir:a.sessiondir,alias:a.alias,...a.model!==null&&a.model!==void 0?{model:a.model}:{}}}}function Jo(e,t){let r=e.query(`SELECT id, kind FROM attention
1955
1955
  WHERE run_id = ?
1956
1956
  AND acknowledged_at IS NULL
1957
1957
  AND requires_user = 1
1958
- ORDER BY id DESC LIMIT 1`,t);return r.length===0?null:{kind:r[0].kind,attention_id:r[0].id}}var Xo=T(()=>{"use strict"});function vw(e,t){e.all("/runtime/*",r=>JM(r.req.raw,t))}async function JM(e,t){try{return Response.json(await XM(e,t))}catch(r){if(r instanceof se)return Response.json({error:r.message},{status:r.status});let n=r instanceof Error?r.message:String(r);return Response.json({error:n},{status:500})}}async function XM(e,t){let r=new URL(e.url),n=QM(t),s=r.pathname.split("/").filter(Boolean).map(decodeURIComponent);if(e.method==="GET"&&r.pathname==="/runtime/workspaces")return jd(e),[{id:n.id,name:n.name}];if(e.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="workspaces")return Go(e,n.id,s[2]),GM(t.dal,n);if(e.method==="GET"&&s.length===5&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"){Go(e,n.id,s[2]);let i=hw(t.dal,s[4]);return _w(t.dal,n,i)}if(e.method==="GET"&&r.pathname==="/runtime/lead-teams")return jd(e),t.dal.listTeams().map(i=>ZM(i));if(e.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="chat"){let i=gw(t.dal,yw(s[2])),o=await e.json();if(o.teamId!==`team:${i.name}`)throw new se(400,"runtime lead chat body does not match route team");return Ew(e,n.id,o.context),ww(i,o.context)}if(e.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="messages"){let i=gw(t.dal,yw(s[2])),o=await e.json();if(o.teamId!==`team:${i.name}`)throw new se(400,"runtime lead message body does not match route team");Ew(e,n.id,o.context);let a=o.draft?.body;if(typeof a!="string"||a.length===0)throw new se(400,"runtime lead message requires draft.body");return ww(i,o.context,a)}if(e.method==="POST"&&s.length===6&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"&&s[5]==="workflow-message"){Go(e,n.id,s[2]);let i=hw(t.dal,s[4]),o=await e.json();if(o.workspaceId!==n.id||o.projectId!==i.name)throw new se(400,"runtime request body does not match route workspace/project");let a=o.draft?.body;if(typeof a!="string"||a.length===0)throw new se(400,"runtime workflow message requires draft.body");return YM(t.dal,i,a),_w(t.dal,n,i)}if(e.method==="GET"&&r.pathname==="/runtime/templates")return Ss(e,n.id),t.dal.listWorkflows().map(i=>ej(i));if(e.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="templates"){Ss(e,n.id);let i=rj(t.dal,s[2]);return tj(i)}if(e.method==="GET"&&r.pathname==="/runtime/runs"){Ss(e,n.id);let i=r.searchParams.get("project"),o=r.searchParams.get("template");if(i!==null&&o!==null)throw new se(400,"conflicting_filters: ?project= and ?template= are mutually exclusive");return nj(t.dal,i,o).map(l=>bw(t.dal,l))}if(e.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="runs"){Ss(e,n.id);let i=Tw(t.dal,s[2]);return bw(t.dal,i)}if(e.method==="GET"&&s.length===4&&s[0]==="runtime"&&s[1]==="runs"&&s[3]==="events"){Ss(e,n.id);let i=Tw(t.dal,s[2]),o=ij(t.dal,i);return{runId:Wd(i),events:o,...o.length>0?{cursor:o[o.length-1].id}:{}}}throw new se(404,`unknown runtime request: ${e.method} ${r.pathname}`)}function GM(e,t){return{id:t.id,name:t.name,projects:e.listProjects().map(r=>kw(e,t,r))}}function _w(e,t,r){let n=kw(e,t,r);return{...n,managedWorkflow:{...n.managedWorkflow,instance:VM(e,r),composerTarget:{kind:"workflow-initial",label:`Project Workflow: ${r.workflow_name}`,templateId:`template:${r.workflow_name}`,runId:n.managedWorkflow.runId}},workflowMessages:KM(e,r)}}function kw(e,t,r){let n=Iw(e,r.id),s=Pd(n);return{id:r.name,workspaceId:t.id,name:r.name,...r.description===null?{}:{description:r.description},status:s,managedWorkflow:{templateId:`template:${r.workflow_name}`,templateName:r.workflow_name,runId:n===null?`project:${r.id}:no-run`:`run:${n.id}`,status:s}}}function VM(e,t){let r=Iw(e,t.id),n=r?.current_state??null;return{id:r===null?`project:${t.id}:no-run`:`run:${r.id}`,templateId:`template:${t.workflow_name}`,label:t.workflow_name,status:Pd(r),currentStepIds:n===null?[]:[n],...r?.started_at===void 0?{}:{createdAt:r.started_at},...r?.ended_at===null||r?.ended_at===void 0?{}:{updatedAt:r.ended_at}}}function KM(e,t){return e.query("SELECT * FROM attention WHERE project_id = ? ORDER BY id ASC LIMIT 50",t.id).map(n=>({id:`attention:${n.id}`,role:"event",author:"lmctl",timestamp:n.created_at,body:n.kind}))}function YM(e,t,r){let n=zM(e,t.id);if(n!==null){let s=Jo(e,n.id);if(s?.kind==="workflow_escalation"){let i=e.resumeEscalation(s.attention_id,r);if(!i.resumed)throw new se(409,`workflow escalation resume failed: ${i.reason}`);return}if(s?.kind==="interactive_waiting_operator"){let i=kt(e,s.attention_id);if(i?.step_id===null||i?.step_id===void 0)throw new se(409,"interactive resume failed: missing step");let o=e.resumeInteractive(i.step_id,r,!0);if(!o.resumed)throw new se(409,`interactive resume failed: ${o.reason}`);return}}e.enqueueJob({project_id:t.id,source:"runtime-workflow-message",payload:JSON.stringify({prompt:r}),priority:0})}function Iw(e,t){return e.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? ORDER BY r.id DESC LIMIT 1",t)[0]??null}function zM(e,t){return e.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? AND r.terminal_state IS NULL ORDER BY r.id DESC LIMIT 1",t)[0]??null}function Pd(e){return e===null?"queued":e.terminal_state===null?"running":e.terminal_state==="done"||e.terminal_state==="success"?"succeeded":e.terminal_state==="cancelled"||e.terminal_state==="aborted"?"cancelled":"failed"}function hw(e,t){let r=e.findProjectByName(t);if(r===null)throw new se(404,`project not found: ${t}`);return r}function gw(e,t){let r=e.listTeams().find(n=>n.name===t);if(r===void 0)throw new se(404,`team not found: ${t}`);return r}function yw(e){return e.startsWith("team:")?e.slice(5):e}function ZM(e){return{id:`team:${e.name}`,name:e.name,teamfile:"",hasLead:!0,kind:e.name.toLowerCase().includes("manager")?"global-manager":"custom-ai-led"}}function ww(e,t,r){let n=new Date().toISOString(),s=r===void 0?[]:[{id:`lead:${e.id}:user:${Date.now()}`,role:"user",author:"operator",timestamp:n,body:r},{id:`lead:${e.id}:event:${Date.now()}`,role:"event",author:"lmctl",timestamp:n,body:"Lead-team mailbox request accepted by the runtime dispatcher."}];return{id:`lead-chat:${e.name}:${t?.scope??"global-admin"}:${t?.workspaceId??Sw}`,teamId:`team:${e.name}`,title:`${e.name} Lead`,messages:s,...t===void 0?{}:{context:t}}}function QM(e){let t=e.workspaceName??Dt()??Sr.default;return{id:t,name:t}}function jd(e){if(e.headers.get("x-lmctl-workspace-id")!==Sw)throw new se(400,"runtime request requires global-admin workspace identity")}function Go(e,t,r){let n=e.headers.get("x-lmctl-workspace-id");if(n===null)throw new se(400,"runtime request requires workspace identity");if(r!==t||n!==t)throw new se(400,"runtime workspace identity does not match route")}function Ss(e,t){let r=e.headers.get("x-lmctl-workspace-id");if(r===null)throw new se(400,"runtime request requires workspace identity");if(r!==t)throw new se(400,"runtime workspace identity does not match server workspace")}function Ew(e,t,r){if(r?.scope==="workspace"){if(r.workspaceId===void 0)throw new se(400,"workspace manager context requires workspace identity");Go(e,t,r.workspaceId);return}jd(e)}function Fd(e){return`${En}${Ud(e.name)}`}function Ud(e){return e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"item"}function Wd(e){return`${Dd}${e.id}`}function ej(e){let t=Vo(e.definition);return{id:Fd(e),name:e.name,...t.description===null?{}:{description:t.description}}}function tj(e){let t=Vo(e.definition);return{id:Fd(e),name:e.name,...t.description===null?{}:{description:t.description},graph:t.graph}}function Vo(e){let t;try{t=JSON.parse(e)}catch{return{description:null,graph:null,stepIds:[],nameToId:new Map}}if(t===null||typeof t!="object")return{description:null,graph:t,stepIds:[],nameToId:new Map};let r=t,n=typeof r.description=="string"?r.description:null,s=[],i=new Map;if(r.schema_version==="lmctl/v3"&&Array.isArray(r.steps)){let o=typeof r.entry_step_id=="string"?r.entry_step_id:null;for(let a of r.steps){let l=typeof a.id=="string"?a.id:null;l!==null&&(s.push(l),typeof a.name=="string"&&a.name.length>0&&i.set(a.name,l))}o!==null&&s.includes(o)&&s.sort((a,l)=>a===o?-1:l===o?1:0)}return{description:n,graph:t,stepIds:s,nameToId:i}}function rj(e,t){if(!t.startsWith(En))throw new se(404,`template not found: ${t}`);let r=t.slice(En.length),n=e.listWorkflows().filter(s=>Ud(s.name)===r);if(n.length===0)throw new se(404,`template not found: ${t}`);if(n.length>1){let s=n.map(i=>i.name).join(", ");throw new se(409,`template_id_ambiguous: ${t} matches multiple workflow names [${s}]; rename to ensure unique slugs`)}return n[0]}function Tw(e,t){if(!t.startsWith(Dd))throw new se(404,`run not found: ${t}`);let r=t.slice(Dd.length);if(!/^[1-9]\d*$/.test(r))throw new se(404,`run not found: ${t}`);let n=Number.parseInt(r,10);if(!Number.isFinite(n)||n<=0||String(n)!==r)throw new se(404,`run not found: ${t}`);let s=e.getRun(n);if(s===null)throw new se(404,`run not found: ${t}`);return s}function nj(e,t,r){if(r!==null){if(!r.startsWith(En))return[];let s=r.slice(En.length),i=e.listWorkflows().filter(a=>Ud(a.name)===s).map(a=>a.id);if(i.length===0)return[];let o=i.map(()=>"?").join(", ");return e.query(`SELECT * FROM run WHERE workflow_id IN (${o}) ORDER BY id DESC LIMIT 200`,...i)}if(t===null)return e.query("SELECT * FROM run ORDER BY id DESC LIMIT 200");let n=e.findProjectByName(t);return n===null?[]:e.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? ORDER BY r.id DESC LIMIT 200",n.id)}function bw(e,t){let r=e.getWorkflow(t.workflow_id),n=Pd(t),s=sj(r,t);return{id:Wd(t),templateId:r===null?`${En}unknown`:Fd(r),label:r===null?`run ${t.id}`:`${r.name} #${t.id}`,status:n,createdAt:t.started_at,...t.ended_at===null?{}:{updatedAt:t.ended_at},currentStepIds:s}}function sj(e,t){if(t.current_state===null)return[];let r=t.current_state.startsWith("__paused__:")?t.current_state.slice(11):t.current_state;return e===null?[r]:[Vo(e.definition).nameToId.get(r)??r]}function ij(e,t){let r=e.getWorkflow(t.workflow_id),n=r===null?{stepIds:[],nameToId:new Map}:Vo(r.definition),s=c=>n.nameToId.get(c)??c,i=Wd(t),o=[];o.push({timestamp:t.started_at,type:"run.started",message:"Run started"});let a=e.listStepsForRun(t.id);for(let c of a){let d=s(c.state_name);if(o.push({timestamp:c.started_at,type:"step.started",stepId:d,message:`step ${c.state_name} started`}),c.ended_at!==null){let u=oj(c);o.push({timestamp:c.ended_at,type:u,stepId:d,...c.outcome===null?{}:{message:c.outcome},...c.status_detail===null?{}:{payload:{status_detail:c.status_detail}}})}else t.paused_at!==null&&c.id===a[a.length-1]?.id&&o.push({timestamp:t.paused_at,type:"step.paused",stepId:d})}let l=e.listSessionEvents(t.id);for(let c of l){let d=c.step_id===null?void 0:(()=>{let m=a.find(p=>p.id===c.step_id);return m===void 0?void 0:s(m.state_name)})(),u=new Date(c.timestamp_ms).toISOString(),f={kind:c.kind,session_event_id:c.id};if(c.payload.length>0)try{let m=JSON.parse(c.payload);m!==null&&typeof m=="object"&&!Array.isArray(m)&&(f={...f,...m})}catch{}o.push({timestamp:u,type:"message",...d===void 0?{}:{stepId:d},payload:f})}if(t.terminal_state!==null){let c=t.terminal_state==="done"||t.terminal_state==="success"?"run.completed":t.terminal_state==="cancelled"||t.terminal_state==="aborted"?"run.cancelled":"run.failed";o.push({timestamp:t.ended_at??t.started_at,type:c,message:t.terminal_state})}return o.sort((c,d)=>c.timestamp.localeCompare(d.timestamp)),o.map((c,d)=>({id:`${i}:evt:${d+1}`,runId:i,sequence:d+1,timestamp:c.timestamp,type:c.type,...c.stepId===void 0?{}:{stepId:c.stepId},...c.message===void 0?{}:{message:c.message},...c.payload===void 0?{}:{payload:c.payload}}))}function oj(e){if(e.outcome===null)return"step.failed";let t=e.status_detail;return t==="failed"||t==="error"||t==="aborted"?"step.failed":"step.completed"}var Sw,En,Dd,se,Nw=T(()=>{"use strict";Je();Xo();Jt();Sw="global-admin";En="template:",Dd="run:";se=class extends Error{status;constructor(t,r){super(r),this.status=t}}});import{mkdirSync as aj,writeFileSync as lj}from"node:fs";import{randomUUID as xw}from"node:crypto";import{dirname as cj,resolve as Ko,sep as Aw}from"node:path";async function Lw(e,t){let r;try{r=await e.req.parseBody({all:!1})}catch{return e.text("invalid multipart body",400)}let n=r.image;if(!pj(n))return e.text("missing image file",400);if(n.size>dj)return e.text("upload too large",413);let s=Buffer.from(await n.arrayBuffer()),i=_j(s);if(i===null||!(i in Rw))return e.text("unsupported upload MIME type",415);if(n.type.length>0&&n.type!==i)return e.text("upload MIME type does not match file content",415);let o=uj(t,r.project);if(typeof o=="string")return e.text(o,404);let a=o===null?Ko(mj()):Ko(o.local_path),l=Ko(a,"uploads",xw()),c=Ko(l,`${xw()}${Rw[i]}`);if(!fj(c,a))return e.text("invalid upload path",400);aj(l,{recursive:!0});let d=new Uint8Array(s.buffer,s.byteOffset,s.byteLength);lj(c,d);let u={path:c,size:s.byteLength,mime:i,project:o?.name??null};return e.json(u)}function uj(e,t){return t==null||t===""?null:typeof t!="string"?"invalid project":e.findProjectByName(t)??`project not found: ${t}`}function fj(e,t){let r=t.endsWith(Aw)?t:`${t}${Aw}`;return e.startsWith(r)}function mj(){return cj(le())}function pj(e){return typeof File<"u"&&e instanceof File}function _j(e){return e.length>=8&&e[0]===137&&e[1]===80&&e[2]===78&&e[3]===71&&e[4]===13&&e[5]===10&&e[6]===26&&e[7]===10?"image/png":e.length>=3&&e[0]===255&&e[1]===216&&e[2]===255?"image/jpeg":e.length>=12&&e.subarray(0,4).toString("ascii")==="RIFF"&&e.subarray(8,12).toString("ascii")==="WEBP"?"image/webp":e.length>=12&&e.subarray(4,8).toString("ascii")==="ftyp"&&["heic","heix","hevc","hevx","mif1","msf1"].includes(e.subarray(8,12).toString("ascii"))?"image/heic":e.length>=5&&e.subarray(0,5).toString("ascii")==="%PDF-"?"application/pdf":null}var dj,Rw,Ow=T(()=>{"use strict";Je();dj=10*1024*1024,Rw={"image/png":".png","image/jpeg":".jpg","image/webp":".webp","image/heic":".heic","application/pdf":".pdf"}});import{existsSync as Yo}from"node:fs";import{basename as hj,dirname as gj,extname as yj,isAbsolute as wj,join as Ej,relative as Tj}from"node:path";import{fileURLToPath as bj}from"node:url";import{Hono as Sj}from"hono";import{serveStatic as Nt}from"@hono/node-server/serve-static";function Fw(e){let t=new Sj,r=[],n=e.localWebui!==void 0?qd(e.localWebui.webuiDir):vj();if(e.localWebui!==void 0&&Hy(t,{s3:e.localWebui.localMailbox.s3,commands:e.localWebui.localMailbox.commands}),n!==null){let s=kj();e.localWebui!==void 0?t.get("/config.json",s,i=>i.json({workspaceFetchMode:"local-mailbox",localMailbox:{base:"/local-mailbox",userId:"local",deviceId:"local"},mailboxPolling:{readIntervalSeconds:1,heartbeatIdleSeconds:1,backoffReadIntervalSeconds:1}})):e.webuiRuntimeConfig!==void 0&&t.get("/config.json",s,i=>i.json(e.webuiRuntimeConfig)),t.use("/dist/*",s,Nt({root:n})),t.use("/vendor/*",s,Nt({root:n})),t.use("/src/*",s,Nt({root:n})),t.get("/",s,Nt({root:n,path:"index.html"})),t.get("/admin",s,Nt({root:n,path:"index.html"})),t.get("/admin/*",s,Nt({root:n,path:"index.html"})),t.get("/terminal",s,Nt({root:n,path:"index.html"})),t.get("/terminal/*",s,Nt({root:n,path:"index.html"})),t.get("/chat",s,Nt({root:n,path:"index.html"})),t.get("/chat/*",s,Nt({root:n,path:"index.html"}))}else t.get("/",s=>s.html('<!doctype html><meta charset="utf-8"><title>lmctl</title><body style="font-family:system-ui;max-width:40rem;margin:4rem auto;padding:0 1rem;line-height:1.5"><h1>lmctl daemon</h1><p>This build does not bundle the local web console; the HTTP API is running on this port.</p><p>Open the hosted console at <a href="https://lmctl.ai/">https://lmctl.ai/</a> \u2014 it connects to this daemon via the cloud mailbox.</p></body>'));return t.use("*",Eh()),t.get("/login",s=>s.html(Ae("Login",`
1958
+ ORDER BY id DESC LIMIT 1`,t);return r.length===0?null:{kind:r[0].kind,attention_id:r[0].id}}var Xo=T(()=>{"use strict"});function vw(e,t){e.all("/runtime/*",r=>JM(r.req.raw,t))}async function JM(e,t){try{return Response.json(await XM(e,t))}catch(r){if(r instanceof se)return Response.json({error:r.message},{status:r.status});let n=r instanceof Error?r.message:String(r);return Response.json({error:n},{status:500})}}async function XM(e,t){let r=new URL(e.url),n=QM(t),s=r.pathname.split("/").filter(Boolean).map(decodeURIComponent);if(e.method==="GET"&&r.pathname==="/runtime/workspaces")return Md(e),[{id:n.id,name:n.name}];if(e.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="workspaces")return Go(e,n.id,s[2]),GM(t.dal,n);if(e.method==="GET"&&s.length===5&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"){Go(e,n.id,s[2]);let i=hw(t.dal,s[4]);return _w(t.dal,n,i)}if(e.method==="GET"&&r.pathname==="/runtime/lead-teams")return Md(e),t.dal.listTeams().map(i=>ZM(i));if(e.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="chat"){let i=gw(t.dal,yw(s[2])),o=await e.json();if(o.teamId!==`team:${i.name}`)throw new se(400,"runtime lead chat body does not match route team");return Ew(e,n.id,o.context),ww(i,o.context)}if(e.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="messages"){let i=gw(t.dal,yw(s[2])),o=await e.json();if(o.teamId!==`team:${i.name}`)throw new se(400,"runtime lead message body does not match route team");Ew(e,n.id,o.context);let a=o.draft?.body;if(typeof a!="string"||a.length===0)throw new se(400,"runtime lead message requires draft.body");return ww(i,o.context,a)}if(e.method==="POST"&&s.length===6&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"&&s[5]==="workflow-message"){Go(e,n.id,s[2]);let i=hw(t.dal,s[4]),o=await e.json();if(o.workspaceId!==n.id||o.projectId!==i.name)throw new se(400,"runtime request body does not match route workspace/project");let a=o.draft?.body;if(typeof a!="string"||a.length===0)throw new se(400,"runtime workflow message requires draft.body");return YM(t.dal,i,a),_w(t.dal,n,i)}if(e.method==="GET"&&r.pathname==="/runtime/templates")return Ss(e,n.id),t.dal.listWorkflows().map(i=>ej(i));if(e.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="templates"){Ss(e,n.id);let i=rj(t.dal,s[2]);return tj(i)}if(e.method==="GET"&&r.pathname==="/runtime/runs"){Ss(e,n.id);let i=r.searchParams.get("project"),o=r.searchParams.get("template");if(i!==null&&o!==null)throw new se(400,"conflicting_filters: ?project= and ?template= are mutually exclusive");return nj(t.dal,i,o).map(l=>bw(t.dal,l))}if(e.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="runs"){Ss(e,n.id);let i=Tw(t.dal,s[2]);return bw(t.dal,i)}if(e.method==="GET"&&s.length===4&&s[0]==="runtime"&&s[1]==="runs"&&s[3]==="events"){Ss(e,n.id);let i=Tw(t.dal,s[2]),o=ij(t.dal,i);return{runId:Ud(i),events:o,...o.length>0?{cursor:o[o.length-1].id}:{}}}throw new se(404,`unknown runtime request: ${e.method} ${r.pathname}`)}function GM(e,t){return{id:t.id,name:t.name,projects:e.listProjects().map(r=>kw(e,t,r))}}function _w(e,t,r){let n=kw(e,t,r);return{...n,managedWorkflow:{...n.managedWorkflow,instance:VM(e,r),composerTarget:{kind:"workflow-initial",label:`Project Workflow: ${r.workflow_name}`,templateId:`template:${r.workflow_name}`,runId:n.managedWorkflow.runId}},workflowMessages:KM(e,r)}}function kw(e,t,r){let n=Iw(e,r.id),s=Dd(n);return{id:r.name,workspaceId:t.id,name:r.name,...r.description===null?{}:{description:r.description},status:s,managedWorkflow:{templateId:`template:${r.workflow_name}`,templateName:r.workflow_name,runId:n===null?`project:${r.id}:no-run`:`run:${n.id}`,status:s}}}function VM(e,t){let r=Iw(e,t.id),n=r?.current_state??null;return{id:r===null?`project:${t.id}:no-run`:`run:${r.id}`,templateId:`template:${t.workflow_name}`,label:t.workflow_name,status:Dd(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 KM(e,t){return e.query("SELECT * FROM attention WHERE project_id = ? ORDER BY id ASC LIMIT 50",t.id).map(n=>({id:`attention:${n.id}`,role:"event",author:"lmctl",timestamp:n.created_at,body:n.kind}))}function YM(e,t,r){let n=zM(e,t.id);if(n!==null){let s=Jo(e,n.id);if(s?.kind==="workflow_escalation"){let i=e.resumeEscalation(s.attention_id,r);if(!i.resumed)throw new se(409,`workflow escalation resume failed: ${i.reason}`);return}if(s?.kind==="interactive_waiting_operator"){let i=kt(e,s.attention_id);if(i?.step_id===null||i?.step_id===void 0)throw new se(409,"interactive resume failed: missing step");let o=e.resumeInteractive(i.step_id,r,!0);if(!o.resumed)throw new se(409,`interactive resume failed: ${o.reason}`);return}}e.enqueueJob({project_id:t.id,source:"runtime-workflow-message",payload:JSON.stringify({prompt:r}),priority:0})}function Iw(e,t){return e.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? ORDER BY r.id DESC LIMIT 1",t)[0]??null}function zM(e,t){return e.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? AND r.terminal_state IS NULL ORDER BY r.id DESC LIMIT 1",t)[0]??null}function Dd(e){return e===null?"queued":e.terminal_state===null?"running":e.terminal_state==="done"||e.terminal_state==="success"?"succeeded":e.terminal_state==="cancelled"||e.terminal_state==="aborted"?"cancelled":"failed"}function hw(e,t){let r=e.findProjectByName(t);if(r===null)throw new se(404,`project not found: ${t}`);return r}function gw(e,t){let r=e.listTeams().find(n=>n.name===t);if(r===void 0)throw new se(404,`team not found: ${t}`);return r}function yw(e){return e.startsWith("team:")?e.slice(5):e}function ZM(e){return{id:`team:${e.name}`,name:e.name,teamfile:"",hasLead:!0,kind:e.name.toLowerCase().includes("manager")?"global-manager":"custom-ai-led"}}function ww(e,t,r){let n=new Date().toISOString(),s=r===void 0?[]:[{id:`lead:${e.id}:user:${Date.now()}`,role:"user",author:"operator",timestamp:n,body:r},{id:`lead:${e.id}:event:${Date.now()}`,role:"event",author:"lmctl",timestamp:n,body:"Lead-team mailbox request accepted by the runtime dispatcher."}];return{id:`lead-chat:${e.name}:${t?.scope??"global-admin"}:${t?.workspaceId??Sw}`,teamId:`team:${e.name}`,title:`${e.name} Lead`,messages:s,...t===void 0?{}:{context:t}}}function QM(e){let t=e.workspaceName??Dt()??Sr.default;return{id:t,name:t}}function Md(e){if(e.headers.get("x-lmctl-workspace-id")!==Sw)throw new se(400,"runtime request requires global-admin workspace identity")}function Go(e,t,r){let n=e.headers.get("x-lmctl-workspace-id");if(n===null)throw new se(400,"runtime request requires workspace identity");if(r!==t||n!==t)throw new se(400,"runtime workspace identity does not match route")}function Ss(e,t){let r=e.headers.get("x-lmctl-workspace-id");if(r===null)throw new se(400,"runtime request requires workspace identity");if(r!==t)throw new se(400,"runtime workspace identity does not match server workspace")}function Ew(e,t,r){if(r?.scope==="workspace"){if(r.workspaceId===void 0)throw new se(400,"workspace manager context requires workspace identity");Go(e,t,r.workspaceId);return}Md(e)}function Pd(e){return`${En}${Fd(e.name)}`}function Fd(e){return e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"item"}function Ud(e){return`${jd}${e.id}`}function ej(e){let t=Vo(e.definition);return{id:Pd(e),name:e.name,...t.description===null?{}:{description:t.description}}}function tj(e){let t=Vo(e.definition);return{id:Pd(e),name:e.name,...t.description===null?{}:{description:t.description},graph:t.graph}}function Vo(e){let t;try{t=JSON.parse(e)}catch{return{description:null,graph:null,stepIds:[],nameToId:new Map}}if(t===null||typeof t!="object")return{description:null,graph:t,stepIds:[],nameToId:new Map};let r=t,n=typeof r.description=="string"?r.description:null,s=[],i=new Map;if(r.schema_version==="lmctl/v3"&&Array.isArray(r.steps)){let o=typeof r.entry_step_id=="string"?r.entry_step_id:null;for(let a of r.steps){let l=typeof a.id=="string"?a.id:null;l!==null&&(s.push(l),typeof a.name=="string"&&a.name.length>0&&i.set(a.name,l))}o!==null&&s.includes(o)&&s.sort((a,l)=>a===o?-1:l===o?1:0)}return{description:n,graph:t,stepIds:s,nameToId:i}}function rj(e,t){if(!t.startsWith(En))throw new se(404,`template not found: ${t}`);let r=t.slice(En.length),n=e.listWorkflows().filter(s=>Fd(s.name)===r);if(n.length===0)throw new se(404,`template not found: ${t}`);if(n.length>1){let s=n.map(i=>i.name).join(", ");throw new se(409,`template_id_ambiguous: ${t} matches multiple workflow names [${s}]; rename to ensure unique slugs`)}return n[0]}function Tw(e,t){if(!t.startsWith(jd))throw new se(404,`run not found: ${t}`);let r=t.slice(jd.length);if(!/^[1-9]\d*$/.test(r))throw new se(404,`run not found: ${t}`);let n=Number.parseInt(r,10);if(!Number.isFinite(n)||n<=0||String(n)!==r)throw new se(404,`run not found: ${t}`);let s=e.getRun(n);if(s===null)throw new se(404,`run not found: ${t}`);return s}function nj(e,t,r){if(r!==null){if(!r.startsWith(En))return[];let s=r.slice(En.length),i=e.listWorkflows().filter(a=>Fd(a.name)===s).map(a=>a.id);if(i.length===0)return[];let o=i.map(()=>"?").join(", ");return e.query(`SELECT * FROM run WHERE workflow_id IN (${o}) ORDER BY id DESC LIMIT 200`,...i)}if(t===null)return e.query("SELECT * FROM run ORDER BY id DESC LIMIT 200");let n=e.findProjectByName(t);return n===null?[]:e.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? ORDER BY r.id DESC LIMIT 200",n.id)}function bw(e,t){let r=e.getWorkflow(t.workflow_id),n=Dd(t),s=sj(r,t);return{id:Ud(t),templateId:r===null?`${En}unknown`:Pd(r),label:r===null?`run ${t.id}`:`${r.name} #${t.id}`,status:n,createdAt:t.started_at,...t.ended_at===null?{}:{updatedAt:t.ended_at},currentStepIds:s}}function sj(e,t){if(t.current_state===null)return[];let r=t.current_state.startsWith("__paused__:")?t.current_state.slice(11):t.current_state;return e===null?[r]:[Vo(e.definition).nameToId.get(r)??r]}function ij(e,t){let r=e.getWorkflow(t.workflow_id),n=r===null?{stepIds:[],nameToId:new Map}:Vo(r.definition),s=c=>n.nameToId.get(c)??c,i=Ud(t),o=[];o.push({timestamp:t.started_at,type:"run.started",message:"Run started"});let a=e.listStepsForRun(t.id);for(let c of a){let d=s(c.state_name);if(o.push({timestamp:c.started_at,type:"step.started",stepId:d,message:`step ${c.state_name} started`}),c.ended_at!==null){let u=oj(c);o.push({timestamp:c.ended_at,type:u,stepId:d,...c.outcome===null?{}:{message:c.outcome},...c.status_detail===null?{}:{payload:{status_detail:c.status_detail}}})}else t.paused_at!==null&&c.id===a[a.length-1]?.id&&o.push({timestamp:t.paused_at,type:"step.paused",stepId:d})}let l=e.listSessionEvents(t.id);for(let c of l){let d=c.step_id===null?void 0:(()=>{let m=a.find(p=>p.id===c.step_id);return m===void 0?void 0:s(m.state_name)})(),u=new Date(c.timestamp_ms).toISOString(),f={kind:c.kind,session_event_id:c.id};if(c.payload.length>0)try{let m=JSON.parse(c.payload);m!==null&&typeof m=="object"&&!Array.isArray(m)&&(f={...f,...m})}catch{}o.push({timestamp:u,type:"message",...d===void 0?{}:{stepId:d},payload:f})}if(t.terminal_state!==null){let c=t.terminal_state==="done"||t.terminal_state==="success"?"run.completed":t.terminal_state==="cancelled"||t.terminal_state==="aborted"?"run.cancelled":"run.failed";o.push({timestamp:t.ended_at??t.started_at,type:c,message:t.terminal_state})}return o.sort((c,d)=>c.timestamp.localeCompare(d.timestamp)),o.map((c,d)=>({id:`${i}:evt:${d+1}`,runId:i,sequence:d+1,timestamp:c.timestamp,type:c.type,...c.stepId===void 0?{}:{stepId:c.stepId},...c.message===void 0?{}:{message:c.message},...c.payload===void 0?{}:{payload:c.payload}}))}function oj(e){if(e.outcome===null)return"step.failed";let t=e.status_detail;return t==="failed"||t==="error"||t==="aborted"?"step.failed":"step.completed"}var Sw,En,jd,se,Nw=T(()=>{"use strict";Je();Xo();Jt();Sw="global-admin";En="template:",jd="run:";se=class extends Error{status;constructor(t,r){super(r),this.status=t}}});import{mkdirSync as aj,writeFileSync as lj}from"node:fs";import{randomUUID as xw}from"node:crypto";import{dirname as cj,resolve as Ko,sep as Aw}from"node:path";async function Lw(e,t){let r;try{r=await e.req.parseBody({all:!1})}catch{return e.text("invalid multipart body",400)}let n=r.image;if(!pj(n))return e.text("missing image file",400);if(n.size>dj)return e.text("upload too large",413);let s=Buffer.from(await n.arrayBuffer()),i=_j(s);if(i===null||!(i in Rw))return e.text("unsupported upload MIME type",415);if(n.type.length>0&&n.type!==i)return e.text("upload MIME type does not match file content",415);let o=uj(t,r.project);if(typeof o=="string")return e.text(o,404);let a=o===null?Ko(mj()):Ko(o.local_path),l=Ko(a,"uploads",xw()),c=Ko(l,`${xw()}${Rw[i]}`);if(!fj(c,a))return e.text("invalid upload path",400);aj(l,{recursive:!0});let d=new Uint8Array(s.buffer,s.byteOffset,s.byteLength);lj(c,d);let u={path:c,size:s.byteLength,mime:i,project:o?.name??null};return e.json(u)}function uj(e,t){return t==null||t===""?null:typeof t!="string"?"invalid project":e.findProjectByName(t)??`project not found: ${t}`}function fj(e,t){let r=t.endsWith(Aw)?t:`${t}${Aw}`;return e.startsWith(r)}function mj(){return cj(le())}function pj(e){return typeof File<"u"&&e instanceof File}function _j(e){return e.length>=8&&e[0]===137&&e[1]===80&&e[2]===78&&e[3]===71&&e[4]===13&&e[5]===10&&e[6]===26&&e[7]===10?"image/png":e.length>=3&&e[0]===255&&e[1]===216&&e[2]===255?"image/jpeg":e.length>=12&&e.subarray(0,4).toString("ascii")==="RIFF"&&e.subarray(8,12).toString("ascii")==="WEBP"?"image/webp":e.length>=12&&e.subarray(4,8).toString("ascii")==="ftyp"&&["heic","heix","hevc","hevx","mif1","msf1"].includes(e.subarray(8,12).toString("ascii"))?"image/heic":e.length>=5&&e.subarray(0,5).toString("ascii")==="%PDF-"?"application/pdf":null}var dj,Rw,Ow=T(()=>{"use strict";Je();dj=10*1024*1024,Rw={"image/png":".png","image/jpeg":".jpg","image/webp":".webp","image/heic":".heic","application/pdf":".pdf"}});import{existsSync as Yo}from"node:fs";import{basename as hj,dirname as gj,extname as yj,isAbsolute as wj,join as Ej,relative as Tj}from"node:path";import{fileURLToPath as bj}from"node:url";import{Hono as Sj}from"hono";import{serveStatic as Nt}from"@hono/node-server/serve-static";function Fw(e){let t=new Sj,r=[],n=e.localWebui!==void 0?Bd(e.localWebui.webuiDir):vj();if(e.localWebui!==void 0&&Hy(t,{s3:e.localWebui.localMailbox.s3,commands:e.localWebui.localMailbox.commands}),n!==null){let s=kj();e.localWebui!==void 0?t.get("/config.json",s,i=>i.json({workspaceFetchMode:"local-mailbox",localMailbox:{base:"/local-mailbox",userId:"local",deviceId:"local"},mailboxPolling:{readIntervalSeconds:1,heartbeatIdleSeconds:1,backoffReadIntervalSeconds:1}})):e.webuiRuntimeConfig!==void 0&&t.get("/config.json",s,i=>i.json(e.webuiRuntimeConfig)),t.use("/dist/*",s,Nt({root:n})),t.use("/vendor/*",s,Nt({root:n})),t.use("/src/*",s,Nt({root:n})),t.get("/",s,Nt({root:n,path:"index.html"})),t.get("/admin",s,Nt({root:n,path:"index.html"})),t.get("/admin/*",s,Nt({root:n,path:"index.html"})),t.get("/terminal",s,Nt({root:n,path:"index.html"})),t.get("/terminal/*",s,Nt({root:n,path:"index.html"})),t.get("/chat",s,Nt({root:n,path:"index.html"})),t.get("/chat/*",s,Nt({root:n,path:"index.html"}))}else t.get("/",s=>s.html('<!doctype html><meta charset="utf-8"><title>lmctl</title><body style="font-family:system-ui;max-width:40rem;margin:4rem auto;padding:0 1rem;line-height:1.5"><h1>lmctl daemon</h1><p>This build does not bundle the local web console; the HTTP API is running on this port.</p><p>Open the hosted console at <a href="https://lmctl.ai/">https://lmctl.ai/</a> \u2014 it connects to this daemon via the cloud mailbox.</p></body>'));return t.use("*",Eh()),t.get("/login",s=>s.html(Ae("Login",`
1959
1959
  <h1>Login</h1>
1960
1960
  <form method="post" action="/login">
1961
1961
  <label>Token <input name="token" type="password"></label>
1962
1962
  <button type="submit">Login</button>
1963
1963
  </form>
1964
- `))),t.post("/login",async s=>{let i=await s.req.parseBody(),o=typeof i.token=="string"?i.token:"";return bh(o)?(Gc(s,o),s.redirect("/",302)):s.html(Ae("Login","<p>Invalid token</p>"),401)}),t.post("/logout",s=>(Sh(s),s.redirect("/login",302))),Ay(t,{dal:e.dal}),vw(t,{dal:e.dal}),Xy(t,{dal:e.dal}),nw(t,{terminalSessionManager:e.terminalSessionManager}),cw(t,{persistentSessionManager:e.persistentSessionManager}),t.post("/api/teams/:team_name/refresh",async s=>{let i=is(s.req.param("team_name")),o=e.dal.findTeamByName(i);if(o===null)return s.notFound();let a=[],c=e.dal.db.transaction(()=>{let f=e.dal.listTeamMembers(o.id),m=f.filter(p=>p.state!=="idle");if(m.length>0)return{ok:!1,nonIdle:m.map(p=>({alias:p.alias,state:p.state}))};for(let p of f)e.dal.setMemberState(p.id,"in_chat","refreshing");return a=f.map(p=>({id:p.id,alias:p.alias})),{ok:!0}})();if(!c.ok){let f=c.nonIdle.map(m=>`${m.alias}:${m.state}`).join(", ");return s.text(`refresh refused: non-idle members: ${f}`,409)}let d=[],u=[];for(let f of a)try{await gc(e.dal,i,f.alias),e.dal.setMemberState(f.id,"idle",null),d.push(f.alias)}catch(m){let p=m instanceof Error?m.message:String(m);e.dal.setMemberState(f.id,"attention_needed",`refresh failed: ${p}`),u.push({alias:f.alias,error:p})}return D(s,{team:i,seeded:d,failed:u},f=>`<p>refreshed team ${b(f.team)}: seeded [${f.seeded.map(m=>b(m)).join(", ")}]${f.failed.length>0?` failed [${f.failed.map(m=>`${b(m.alias)}: ${b(m.error)}`).join(", ")}]`:""}</p>`)}),Rh(t,{dal:e.dal}),Dh(t,{dal:e.dal}),t.get("/api/status",s=>D(s,Fi(e.dal),Oj)),t.get("/api/projects",s=>D(s,Ui(e.dal),$j)),t.get("/api/teams",s=>D(s,w_(e.dal),jj)),t.get("/api/workflows",s=>D(s,Wi(e.dal),Dj)),t.get("/api/workflows/verify",s=>{let i=my();return s.req.header("accept")?.includes("text/plain")?s.text(_y(i)):s.json(i)}),t.get("/api/jobs",s=>D(s,E_(e.dal,{status:s.req.query("status")}),Pj)),t.post("/api/uploads",s=>Lw(s,e.dal)),t.get("/api/jobs/:id",s=>{let i=Bi(e.dal,ee(s,"id"));return i===null?s.notFound():D(s,i,de)}),t.post("/api/jobs",async s=>{let i;try{i=await s.req.json()}catch{return s.text("invalid JSON body",400)}let o=null;if(typeof i.project_id=="number")o=i.project_id;else if(typeof i.project=="string"){let f=e.dal.findProjectByName(i.project);if(f===null)return s.text(`project not found: ${i.project}`,404);o=f.id}else{let f=e.dal.listProjects();f.length===1&&(o=f[0].id)}if(o===null)return s.text("missing project or project_id",400);let a=typeof i.workflow_id_override=="number"?i.workflow_id_override:null;if(a===null&&typeof i.workflow=="string"){let f=e.dal.getWorkflowByName(i.workflow);if(f===null)return s.text(`workflow not found: ${i.workflow}`,404);a=f.id}let l=typeof i.source=="string"?i.source:"manual",c=i.payload,d=c==null?null:typeof c=="string"?c:JSON.stringify(c),u=e.dal.enqueueJob({project_id:o,workflow_id_override:a,source:l,source_ref:typeof i.source_ref=="string"?i.source_ref:null,payload:d,priority:typeof i.priority=="number"?i.priority:0,dedupe_key:typeof i.dedupe_key=="string"?i.dedupe_key:null});return D(s,u,de)}),t.post("/api/jobs/:id/run",async s=>{let{runJobById:i}=await Promise.resolve().then(()=>(Lo(),ky)),o=Bi(e.dal,ee(s,"id"));if(o===null)return s.notFound();let a=await i({dal:e.dal,worker_id:`api-job-run-${process.pid}-${Date.now()}`,job_id:o.id});return a.claimed?s.json({job_id:a.job_id,run_id:a.run_id,status:a.status,terminal_state:a.terminal_state,ms:a.ms}):s.json(a,409)}),t.get("/api/workflows/:name",s=>{let i=e.dal.getWorkflowByName(s.req.param("name"));return i===null?s.notFound():D(s,i,de)}),t.get("/api/projects/:name/workflows",s=>{let i=e.dal.findProjectByName(s.req.param("name"));return i===null?s.notFound():D(s,e.dal.listProjectWorkflows(i.id),Cj)}),t.post("/api/projects/:name/workflows",async s=>{let i=e.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=await Tn(s);if(typeof o=="string")return s.text(o,400);let a=typeof o.workflow=="string"?o.workflow:null,l=typeof o.workflow_id=="number"?o.workflow_id:null,c=l!==null?e.dal.getWorkflow(l):a!==null?e.dal.getWorkflowByName(a):null;if(c===null)return s.text("workflow not found",404);let d=typeof o.condition=="string"&&o.condition.length>0?o.condition:null;if(d!==null)try{an(d)}catch{return s.text("invalid condition",400)}let u=xj(o.parameters_override??o.params);if(typeof u=="string"&&u.startsWith("error:"))return s.text(u.slice(6),400);let f=typeof o.priority=="number"&&Number.isInteger(o.priority)?o.priority:100,m=e.dal.insertProjectWorkflow({project_id:i.id,workflow_id:c.id,condition:d,parameters_override:u,priority:f});return D(s,m,de)}),t.get("/api/projects/workflows/:id",s=>{let i=e.dal.getProjectWorkflow(ee(s,"id"));return i===null?s.notFound():D(s,i,de)}),t.delete("/api/projects/workflows/:id",s=>e.dal.removeProjectWorkflow(ee(s,"id"))?D(s,{removed:!0},de):s.notFound()),t.post("/api/projects/workflows/:id/enable",s=>{let i=e.dal.setProjectWorkflowEnabled(ee(s,"id"),!0);return i===null?s.notFound():D(s,i,de)}),t.post("/api/projects/workflows/:id/disable",s=>{let i=e.dal.setProjectWorkflowEnabled(ee(s,"id"),!1);return i===null?s.notFound():D(s,i,de)}),t.get("/api/projects/:name/issues",s=>{let i=e.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=Cw(s.req.query("status"),Aj);if(typeof o=="string")return s.text(o,400);let a=Cw(s.req.query("severity"),Ww);return typeof a=="string"?s.text(a,400):D(s,e.dal.listIssues(i.id,{...o!==void 0?{status:o}:{},...a!==void 0?{severity:a}:{},...s.req.query("ai_test_path")!==void 0?{ai_test_path:s.req.query("ai_test_path")}:{}}),Mj)}),t.post("/api/projects/:name/issues",async s=>{let i=e.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=await Tn(s);if(typeof o=="string")return s.text(o,400);let a=typeof o.title=="string"&&o.title.trim().length>0?o.title:null,l=typeof o.body=="string"?o.body:null;if(a===null||l===null)return s.text("missing title or body",400);let c=Rj(o.severity);if(typeof c=="object")return s.text(c.error,400);let d=Lj(o.labels);if(typeof d=="string"&&d.startsWith("error:"))return s.text(d.slice(6),400);let u=e.dal.createIssue({project_id:i.id,title:a,body:l,...c!==void 0?{severity:c}:{},labels:d,ai_test_path:typeof o.ai_test_path=="string"?o.ai_test_path:null,source_run_id:typeof o.source_run_id=="number"?o.source_run_id:null});return D(s,u,de)}),t.get("/api/issues/:id",s=>{let i=e.dal.getIssue(ee(s,"id"));return i===null?s.notFound():D(s,i,de)}),t.post("/api/issues/:id/claim",async s=>{let i=ee(s,"id"),o=e.dal.getIssue(i);if(o===null)return s.notFound();let a=await Tn(s);if(typeof a=="string")return s.json({error:a},400);let l=typeof a.assigned_run_id=="number"?a.assigned_run_id:null;if(l===null)return s.json({error:"missing assigned_run_id"},400);let c=e.dal.claimIssue(i,l);return c===null?s.json({error:`issue ${i} is not in a claimable state (status=${o.status})`},400):D(s,c,de)}),t.post("/api/projects/:name/issues/claim-next",async s=>{let i=e.dal.findProjectByName(s.req.param("name"));if(i===null)return s.json({error:"project_not_found"},404);let o=await Tn(s);if(typeof o=="string")return s.json({error:o},400);let a=typeof o.assigned_run_id=="number"?o.assigned_run_id:null;if(a===null)return s.json({error:"missing assigned_run_id"},400);let l=e.dal.claimNextIssue(i.id,a);return l===null?s.json({status:"queue_empty"},404):D(s,l,de)}),t.post("/api/issues/:id/close",async s=>{let i=e.dal.getIssue(ee(s,"id"));if(i===null)return s.notFound();let o=await Tn(s);if(typeof o=="string")return s.json({error:o},400);let a=typeof o.closed_run_id=="number"?o.closed_run_id:i.assigned_run_id;if(a===null)return s.json({error:"missing closed_run_id"},400);try{return D(s,e.dal.closeIssue(ee(s,"id"),a,typeof o.commit_hash=="string"?o.commit_hash:null),de)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),t.post("/api/issues/:id/reopen",async s=>{let i=e.dal.getIssue(ee(s,"id"));if(i===null)return s.notFound();let o=await Tn(s);if(typeof o=="string")return s.json({error:o},400);let a=typeof o.source_run_id=="number"?o.source_run_id:i.closed_run_id??i.source_run_id;if(a===null)return s.json({error:"missing source_run_id"},400);try{return D(s,e.dal.reopenIssue(ee(s,"id"),a),de)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),t.get("/api/projects/:name",s=>{let i=e.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=i.name.indexOf("/"),a=o>0?i.name.slice(0,o):null,l=o>0?i.name.slice(o+1):i.name;return D(s,{...i,owner:a,repo:l},de)}),t.get("/api/runs/:run_id/artifacts",s=>{let i=ee(s,"run_id"),o=s.req.query("kind"),a=Lr(e.dal,i,o);return D(s,a,de)}),t.get("/api/runs/:run_id/artifacts/:kind",async s=>{let i=ee(s,"run_id"),o=s.req.param("kind"),a=Lr(e.dal,i,o);if(a.length===0)return s.notFound();let l=a[a.length-1],c=s.req.query("raw")==="true";if(l.content!==null&&l.content!==void 0)return c?s.text(l.content):D(s,l,de);if(l.path!==null&&l.path!==void 0){if(c)try{let{readFileSync:d}=await import("node:fs"),u=Ij(l.path);if(Nj(u)){let _=d(l.path,"utf8");return s.body(_,200,{"Content-Type":u})}let f=d(l.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength),p=hj(l.path);return s.body(m,200,{"Content-Type":u,"Content-Disposition":`attachment; filename="${p}"`})}catch(d){return s.text(`failed to read artifact path: ${d.message}`,500)}return D(s,l,de)}return D(s,l,de)}),t.get("/api/runs",s=>D(s,sn(e.dal,{limit:Bd(s,"limit")??100}),Fj)),t.get("/api/runs/:id",s=>{let i=Rr(e.dal,ee(s,"id"));return i===null?s.notFound():D(s,i,Uj)}),t.get("/api/runs/:id/where",s=>{let i=on(e.dal,ee(s,"id"));return i===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(Hi(i)):s.json(i)}),t.get("/api/runs/:id/timeline",s=>{let i=Ji(e.dal,ee(s,"id"));return i===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(Xi(i)):s.json(i)}),t.post("/api/runs/:id/resume",async s=>{let i=s.req.query("outcome");if(i===void 0||i.length===0){let a=s.req.header("content-type")??"";if(a.includes("application/x-www-form-urlencoded")||a.includes("multipart/form-data")){let c=(await s.req.parseBody().catch(()=>({}))).outcome;typeof c=="string"&&c.length>0&&(i=c)}}if(i===void 0||i.length===0)return s.text("missing outcome",400);let o=e.dal.resumeRun(ee(s,"id"),i);return!o.resumed&&o.reason==="run_not_found"?s.notFound():o.resumed?(zo(e.daemon),D(s,o,Mw)):D(s,o,Mw,400)}),t.post("/api/interactive/:step_id/respond",async s=>{let i=ee(s,"step_id"),o,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let d=await s.req.json();typeof d.input=="string"&&(o=d.input),d.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let d=await s.req.parseBody().catch(()=>({}));typeof d.input=="string"&&(o=d.input),(d.done==="true"||d.done===!0)&&(a=!0)}if(o===void 0)return s.text("missing input",400);let c=e.dal.resumeInteractive(i,o,a);return!c.resumed&&c.reason==="not_found"?s.notFound():c.resumed?(zo(e.daemon),s.json({resumed:!0,session_status:c.session.status})):s.json({resumed:!1,reason:c.reason},400)}),t.get("/api/runs/:id/steps/:step_id",s=>$w(s,e.dal,i=>D(s,i,Bj))),t.get("/api/runs/:id/steps/:step_id/transcript",s=>{let i=v_(e.dal,ee(s,"id"),ee(s,"step_id"));return i===null?s.notFound():Uw(s)?s.html(`<pre>${b(i)}</pre>`):s.req.header("accept")?.includes("text/plain")?s.text(i):s.json({transcript:i})}),t.get("/api/runs/:id/steps/:step_id/messages",s=>$w(s,e.dal,i=>{let o=fw(i);return D(s,o,a=>me(["role","text"],a.map(l=>[b(l.role),b(l.text)])))})),t.get("/api/external-objects",s=>D(s,k_(e.dal,{type:s.req.query("type")}),qj)),t.get("/api/external-signals",s=>D(s,I_(e.dal,{unhandled:s.req.query("unhandled")==="true"}),Hj)),t.get("/api/attentions",s=>D(s,cr(e.dal,{unacked:s.req.query("unacked")==="true"}),Jj)),t.post("/api/attentions/:id/ack",s=>{let i=e.dal.acknowledgeAttention(ee(s,"id"));return i===null?s.notFound():D(s,i,o=>`<p>acknowledged attention ${b(o.id)}</p>`)}),t.get("/api/escalations",s=>{let i=s.req.query("project"),o=s.req.query("all")==="true",a=s.req.query("since"),l={all:o};i!==void 0&&(l.project=i),a!==void 0&&(l.since=a);let c=qi(e.dal,l);return D(s,c,d=>`<h1>Escalations</h1>${me(["attention_id","project","run","workflow","state","prompt"],d.map(u=>[b(u.attention_id),b(u.project),b(u.run_id),b(u.workflow_name),b(u.state_name),b((u.prompt??"").slice(0,120))]))}`)}),t.get("/api/escalations/:id",s=>{let i=kt(e.dal,ee(s,"id"));return i===null?s.notFound():D(s,i,de)}),t.post("/api/escalations/:id/respond",async s=>{let i=ee(s,"id"),o,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let m=await s.req.json();typeof m.input=="string"&&(o=m.input),m.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let m=await s.req.parseBody().catch(()=>({}));typeof m.input=="string"&&(o=m.input),(m.done==="true"||m.done===!0)&&(a=!0)}if(o===void 0)return s.text("missing input",400);let c=kt(e.dal,i);if(c===null)return s.notFound();let d=cr(e.dal).find(m=>m.id===i);if(d===void 0)return s.notFound();if(d.kind==="workflow_escalation"){let m=e.dal.resumeEscalation(i,o);if(!m.resumed)return s.json({ok:!1,reason:m.reason},400);zo(e.daemon);let p=cr(e.dal).find(_=>_.id===i);return s.json({ok:!0,attention_id:i,run_id:m.run.id,decision:o,session_status:"escalation_resumed",acknowledged_at:p?.acknowledged_at??null})}if(d.kind!=="interactive_waiting_operator")return s.json({ok:!1,reason:"wrong_kind",kind:d.kind},400);if(d.acknowledged_at!==null)return s.json({ok:!1,reason:"already_acked"},400);if(c.step_id===null)return s.json({ok:!1,reason:"no_step"},400);let u=e.dal.resumeInteractive(c.step_id,o,a);if(!u.resumed)return s.json({ok:!1,reason:u.reason,step_id:c.step_id},400);let f=e.dal.acknowledgeAttention(i);return zo(e.daemon),s.json({ok:!0,attention_id:i,step_id:c.step_id,session_status:u.session.status,acknowledged_at:f?.acknowledged_at??null})}),t.get("/api/submitted-prs",s=>{let i=s.req.query("pr_url"),o=s.req.query("status"),a=T_(e.dal,{status:o,pr_url:i});return D(s,a,Xj)}),t.get("/api/submitted-prs/:id",s=>{let i=ee(s,"id"),o=b_(e.dal,i);return o===null?s.notFound():D(s,o,Gj)}),t.get("/api/sessions",s=>D(s,e.dal.latestSessionSizes(),jw)),t.get("/api/sessions/:team_name/:alias/history",s=>{let i=is(s.req.param("team_name"));return D(s,e.dal.sessionSizeHistory(i,s.req.param("alias")),jw)}),t.post("/api/sessions/:team_name/:alias/compact",async s=>{let i=is(s.req.param("team_name"));try{let o=await f_(e.dal,i,s.req.param("alias"));return D(s,o,a=>Dw("compacted",a.row))}catch(o){if(o instanceof ss)return s.text(o.message,409);throw o}}),t.post("/api/sessions/:team_name/:alias/refresh",async s=>{let i=is(s.req.param("team_name")),o=await gc(e.dal,i,s.req.param("alias"));return D(s,o,a=>Dw(`refreshed ${a.sessionid}`,a.row))}),t.get("/api/intake/state",s=>D(s,r,Pw)),t.post("/api/intake/scan",async s=>(r=await lo(e.dal),D(s,r,Pw))),t.get("/api/stats/run-throughput",s=>D(s,A_(e.dal),Vj)),t.get("/api/daemon/state",s=>D(s,e.daemon?.state??null,Kj)),t.post("/api/daemon/cycle",async s=>{if(e.daemon===void 0)return D(s,{disabled:!0},de);let i=await e.daemon.runCycle();return D(s,{state:e.daemon.state,result:i},de)}),t.get("/metrics/:project_id",s=>{let i=ee(s,"project_id"),o=e.dal.getProject(i);if(o===null)return s.notFound();let a=vc(e.dal,i),l=kc(e.dal,{project_id:i});return s.html(Ae(`Metrics \u2014 ${o.name}`,Yj(o.name,a,l)))}),t.get("/api/metrics/reviewer/:project_id",s=>{let i=ee(s,"project_id");if(e.dal.getProject(i)===null)return s.notFound();let o=Bd(s,"since_days");return s.json(vc(e.dal,i,o))}),t.get("/api/metrics/tools/:project_id",s=>{let i=ee(s,"project_id");if(e.dal.getProject(i)===null)return s.notFound();let o=Bd(s,"since_days");return s.json(kc(e.dal,{project_id:i,since_days:o}))}),t.post("/api/drift/:id/ack",s=>{let i=e.dal.acknowledgeDriftSignal(ee(s,"id"));return i===null?s.notFound():s.json({id:i.id,acknowledged_at:i.acknowledged_at})}),t}function $w(e,t,r){let n=Sc(t,ee(e,"id"),ee(e,"step_id"));return n===null?e.notFound():r(n)}function zo(e){e!==void 0&&e.runCycle().catch(()=>{})}function D(e,t,r,n=200){return Uw(e)?n===200?e.html(r(t)):e.html(r(t),400):new Response(JSON.stringify(t),{status:n,headers:{"Content-Type":"application/json; charset=UTF-8"}})}function Uw(e){let t=e.req.header("accept")??"";return t.includes("text/html")&&!t.includes("application/json")}function vj(){let e=process.env.LMCTL_WEBUI_DIST;if(e!==void 0)return Yo(`${e}/index.html`)?qd(e):null;let t="src/serve/webui-dist";if(Yo(`${t}/index.html`))return t;let r="dist/serve/webui-dist";if(Yo(`${r}/index.html`))return r;let n=Ej(gj(bj(import.meta.url)),"webui-dist");return Yo(`${n}/index.html`)?qd(n):null}function qd(e){if(!wj(e))return e;let t=Tj(process.cwd(),e);return t.length===0?".":t}function kj(){return async(e,t)=>{await t(),e.header("Cache-Control","no-store")}}function ee(e,t){return Number(e.req.param(t))}function Bd(e,t){let r=e.req.query(t);if(r===void 0)return;let n=Number(r);return Number.isInteger(n)&&n>0?n:void 0}function Ij(e){switch(yj(e).toLowerCase()){case".txt":return"text/plain; charset=utf-8";case".md":return"text/markdown; charset=utf-8";case".html":case".htm":return"text/html; charset=utf-8";case".css":return"text/css; charset=utf-8";case".csv":return"text/csv; charset=utf-8";case".json":return"application/json; charset=utf-8";case".xml":return"application/xml; charset=utf-8";case".yaml":case".yml":return"text/yaml; charset=utf-8";case".js":case".mjs":case".cjs":return"text/javascript; charset=utf-8";case".ts":return"text/x-typescript; charset=utf-8";case".log":return"text/plain; charset=utf-8";case".docx":return"application/vnd.openxmlformats-officedocument.wordprocessingml.document";case".xlsx":return"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";case".pptx":return"application/vnd.openxmlformats-officedocument.presentationml.presentation";case".pdf":return"application/pdf";case".png":return"image/png";case".jpg":case".jpeg":return"image/jpeg";case".gif":return"image/gif";case".webp":return"image/webp";case".zip":return"application/zip";case".gz":return"application/gzip";default:return"application/octet-stream"}}function Nj(e){return!!(e.startsWith("text/")||e.startsWith("application/json")||e.startsWith("application/xml"))}async function Tn(e){try{let t=await e.req.json();return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:"invalid JSON body"}catch{return"invalid JSON body"}}function xj(e){if(e==null)return null;if(typeof e=="string"){try{let t=JSON.parse(e);if(t!==null&&typeof t=="object"&&!Array.isArray(t))return JSON.stringify(t)}catch{return"error:invalid parameters_override JSON"}return"error:parameters_override must be a JSON object"}return typeof e=="object"&&!Array.isArray(e)?JSON.stringify(e):"error:parameters_override must be a JSON object"}function Cw(e,t){if(e===void 0||e.length===0)return;let r=e.split(",").map(n=>n.trim()).filter(n=>n.length>0);if(r.length!==0){for(let n of r)if(!t.includes(n))return`invalid value: ${n}`;return r}}function Rj(e){if(e!=null)return typeof e=="string"&&Ww.includes(e)?e:{error:`invalid severity: ${String(e)}`}}function Lj(e){if(e==null)return null;if(typeof e=="string")try{let t=JSON.parse(e);return Array.isArray(t)&&t.every(r=>typeof r=="string")?JSON.stringify(t):"error:labels must be a JSON string array"}catch{return"error:invalid labels JSON"}return Array.isArray(e)&&e.every(t=>typeof t=="string")?JSON.stringify(e):"error:labels must be a JSON string array"}function Oj(e){return`<h1>Status</h1><div class="grid">
1964
+ `))),t.post("/login",async s=>{let i=await s.req.parseBody(),o=typeof i.token=="string"?i.token:"";return bh(o)?(Xc(s,o),s.redirect("/",302)):s.html(Ae("Login","<p>Invalid token</p>"),401)}),t.post("/logout",s=>(Sh(s),s.redirect("/login",302))),Ay(t,{dal:e.dal}),vw(t,{dal:e.dal}),Xy(t,{dal:e.dal}),nw(t,{terminalSessionManager:e.terminalSessionManager}),cw(t,{persistentSessionManager:e.persistentSessionManager}),t.post("/api/teams/:team_name/refresh",async s=>{let i=is(s.req.param("team_name")),o=e.dal.findTeamByName(i);if(o===null)return s.notFound();let a=[],c=e.dal.db.transaction(()=>{let f=e.dal.listTeamMembers(o.id),m=f.filter(p=>p.state!=="idle");if(m.length>0)return{ok:!1,nonIdle:m.map(p=>({alias:p.alias,state:p.state}))};for(let p of f)e.dal.setMemberState(p.id,"in_chat","refreshing");return a=f.map(p=>({id:p.id,alias:p.alias})),{ok:!0}})();if(!c.ok){let f=c.nonIdle.map(m=>`${m.alias}:${m.state}`).join(", ");return s.text(`refresh refused: non-idle members: ${f}`,409)}let d=[],u=[];for(let f of a)try{await hc(e.dal,i,f.alias),e.dal.setMemberState(f.id,"idle",null),d.push(f.alias)}catch(m){let p=m instanceof Error?m.message:String(m);e.dal.setMemberState(f.id,"attention_needed",`refresh failed: ${p}`),u.push({alias:f.alias,error:p})}return D(s,{team:i,seeded:d,failed:u},f=>`<p>refreshed team ${b(f.team)}: seeded [${f.seeded.map(m=>b(m)).join(", ")}]${f.failed.length>0?` failed [${f.failed.map(m=>`${b(m.alias)}: ${b(m.error)}`).join(", ")}]`:""}</p>`)}),Rh(t,{dal:e.dal}),Dh(t,{dal:e.dal}),t.get("/api/status",s=>D(s,Fi(e.dal),Oj)),t.get("/api/projects",s=>D(s,Ui(e.dal),$j)),t.get("/api/teams",s=>D(s,w_(e.dal),jj)),t.get("/api/workflows",s=>D(s,Wi(e.dal),Dj)),t.get("/api/workflows/verify",s=>{let i=my();return s.req.header("accept")?.includes("text/plain")?s.text(_y(i)):s.json(i)}),t.get("/api/jobs",s=>D(s,E_(e.dal,{status:s.req.query("status")}),Pj)),t.post("/api/uploads",s=>Lw(s,e.dal)),t.get("/api/jobs/:id",s=>{let i=Bi(e.dal,ee(s,"id"));return i===null?s.notFound():D(s,i,de)}),t.post("/api/jobs",async s=>{let i;try{i=await s.req.json()}catch{return s.text("invalid JSON body",400)}let o=null;if(typeof i.project_id=="number")o=i.project_id;else if(typeof i.project=="string"){let f=e.dal.findProjectByName(i.project);if(f===null)return s.text(`project not found: ${i.project}`,404);o=f.id}else{let f=e.dal.listProjects();f.length===1&&(o=f[0].id)}if(o===null)return s.text("missing project or project_id",400);let a=typeof i.workflow_id_override=="number"?i.workflow_id_override:null;if(a===null&&typeof i.workflow=="string"){let f=e.dal.getWorkflowByName(i.workflow);if(f===null)return s.text(`workflow not found: ${i.workflow}`,404);a=f.id}let l=typeof i.source=="string"?i.source:"manual",c=i.payload,d=c==null?null:typeof c=="string"?c:JSON.stringify(c),u=e.dal.enqueueJob({project_id:o,workflow_id_override:a,source:l,source_ref:typeof i.source_ref=="string"?i.source_ref:null,payload:d,priority:typeof i.priority=="number"?i.priority:0,dedupe_key:typeof i.dedupe_key=="string"?i.dedupe_key:null});return D(s,u,de)}),t.post("/api/jobs/:id/run",async s=>{let{runJobById:i}=await Promise.resolve().then(()=>(Lo(),ky)),o=Bi(e.dal,ee(s,"id"));if(o===null)return s.notFound();let a=await i({dal:e.dal,worker_id:`api-job-run-${process.pid}-${Date.now()}`,job_id:o.id});return a.claimed?s.json({job_id:a.job_id,run_id:a.run_id,status:a.status,terminal_state:a.terminal_state,ms:a.ms}):s.json(a,409)}),t.get("/api/workflows/:name",s=>{let i=e.dal.getWorkflowByName(s.req.param("name"));return i===null?s.notFound():D(s,i,de)}),t.get("/api/projects/:name/workflows",s=>{let i=e.dal.findProjectByName(s.req.param("name"));return i===null?s.notFound():D(s,e.dal.listProjectWorkflows(i.id),Cj)}),t.post("/api/projects/:name/workflows",async s=>{let i=e.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=await Tn(s);if(typeof o=="string")return s.text(o,400);let a=typeof o.workflow=="string"?o.workflow:null,l=typeof o.workflow_id=="number"?o.workflow_id:null,c=l!==null?e.dal.getWorkflow(l):a!==null?e.dal.getWorkflowByName(a):null;if(c===null)return s.text("workflow not found",404);let d=typeof o.condition=="string"&&o.condition.length>0?o.condition:null;if(d!==null)try{an(d)}catch{return s.text("invalid condition",400)}let u=xj(o.parameters_override??o.params);if(typeof u=="string"&&u.startsWith("error:"))return s.text(u.slice(6),400);let f=typeof o.priority=="number"&&Number.isInteger(o.priority)?o.priority:100,m=e.dal.insertProjectWorkflow({project_id:i.id,workflow_id:c.id,condition:d,parameters_override:u,priority:f});return D(s,m,de)}),t.get("/api/projects/workflows/:id",s=>{let i=e.dal.getProjectWorkflow(ee(s,"id"));return i===null?s.notFound():D(s,i,de)}),t.delete("/api/projects/workflows/:id",s=>e.dal.removeProjectWorkflow(ee(s,"id"))?D(s,{removed:!0},de):s.notFound()),t.post("/api/projects/workflows/:id/enable",s=>{let i=e.dal.setProjectWorkflowEnabled(ee(s,"id"),!0);return i===null?s.notFound():D(s,i,de)}),t.post("/api/projects/workflows/:id/disable",s=>{let i=e.dal.setProjectWorkflowEnabled(ee(s,"id"),!1);return i===null?s.notFound():D(s,i,de)}),t.get("/api/projects/:name/issues",s=>{let i=e.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=Cw(s.req.query("status"),Aj);if(typeof o=="string")return s.text(o,400);let a=Cw(s.req.query("severity"),Ww);return typeof a=="string"?s.text(a,400):D(s,e.dal.listIssues(i.id,{...o!==void 0?{status:o}:{},...a!==void 0?{severity:a}:{},...s.req.query("ai_test_path")!==void 0?{ai_test_path:s.req.query("ai_test_path")}:{}}),Mj)}),t.post("/api/projects/:name/issues",async s=>{let i=e.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=await Tn(s);if(typeof o=="string")return s.text(o,400);let a=typeof o.title=="string"&&o.title.trim().length>0?o.title:null,l=typeof o.body=="string"?o.body:null;if(a===null||l===null)return s.text("missing title or body",400);let c=Rj(o.severity);if(typeof c=="object")return s.text(c.error,400);let d=Lj(o.labels);if(typeof d=="string"&&d.startsWith("error:"))return s.text(d.slice(6),400);let u=e.dal.createIssue({project_id:i.id,title:a,body:l,...c!==void 0?{severity:c}:{},labels:d,ai_test_path:typeof o.ai_test_path=="string"?o.ai_test_path:null,source_run_id:typeof o.source_run_id=="number"?o.source_run_id:null});return D(s,u,de)}),t.get("/api/issues/:id",s=>{let i=e.dal.getIssue(ee(s,"id"));return i===null?s.notFound():D(s,i,de)}),t.post("/api/issues/:id/claim",async s=>{let i=ee(s,"id"),o=e.dal.getIssue(i);if(o===null)return s.notFound();let a=await Tn(s);if(typeof a=="string")return s.json({error:a},400);let l=typeof a.assigned_run_id=="number"?a.assigned_run_id:null;if(l===null)return s.json({error:"missing assigned_run_id"},400);let c=e.dal.claimIssue(i,l);return c===null?s.json({error:`issue ${i} is not in a claimable state (status=${o.status})`},400):D(s,c,de)}),t.post("/api/projects/:name/issues/claim-next",async s=>{let i=e.dal.findProjectByName(s.req.param("name"));if(i===null)return s.json({error:"project_not_found"},404);let o=await Tn(s);if(typeof o=="string")return s.json({error:o},400);let a=typeof o.assigned_run_id=="number"?o.assigned_run_id:null;if(a===null)return s.json({error:"missing assigned_run_id"},400);let l=e.dal.claimNextIssue(i.id,a);return l===null?s.json({status:"queue_empty"},404):D(s,l,de)}),t.post("/api/issues/:id/close",async s=>{let i=e.dal.getIssue(ee(s,"id"));if(i===null)return s.notFound();let o=await Tn(s);if(typeof o=="string")return s.json({error:o},400);let a=typeof o.closed_run_id=="number"?o.closed_run_id:i.assigned_run_id;if(a===null)return s.json({error:"missing closed_run_id"},400);try{return D(s,e.dal.closeIssue(ee(s,"id"),a,typeof o.commit_hash=="string"?o.commit_hash:null),de)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),t.post("/api/issues/:id/reopen",async s=>{let i=e.dal.getIssue(ee(s,"id"));if(i===null)return s.notFound();let o=await Tn(s);if(typeof o=="string")return s.json({error:o},400);let a=typeof o.source_run_id=="number"?o.source_run_id:i.closed_run_id??i.source_run_id;if(a===null)return s.json({error:"missing source_run_id"},400);try{return D(s,e.dal.reopenIssue(ee(s,"id"),a),de)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),t.get("/api/projects/:name",s=>{let i=e.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=i.name.indexOf("/"),a=o>0?i.name.slice(0,o):null,l=o>0?i.name.slice(o+1):i.name;return D(s,{...i,owner:a,repo:l},de)}),t.get("/api/runs/:run_id/artifacts",s=>{let i=ee(s,"run_id"),o=s.req.query("kind"),a=Lr(e.dal,i,o);return D(s,a,de)}),t.get("/api/runs/:run_id/artifacts/:kind",async s=>{let i=ee(s,"run_id"),o=s.req.param("kind"),a=Lr(e.dal,i,o);if(a.length===0)return s.notFound();let l=a[a.length-1],c=s.req.query("raw")==="true";if(l.content!==null&&l.content!==void 0)return c?s.text(l.content):D(s,l,de);if(l.path!==null&&l.path!==void 0){if(c)try{let{readFileSync:d}=await import("node:fs"),u=Ij(l.path);if(Nj(u)){let _=d(l.path,"utf8");return s.body(_,200,{"Content-Type":u})}let f=d(l.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength),p=hj(l.path);return s.body(m,200,{"Content-Type":u,"Content-Disposition":`attachment; filename="${p}"`})}catch(d){return s.text(`failed to read artifact path: ${d.message}`,500)}return D(s,l,de)}return D(s,l,de)}),t.get("/api/runs",s=>D(s,sn(e.dal,{limit:Wd(s,"limit")??100}),Fj)),t.get("/api/runs/:id",s=>{let i=Rr(e.dal,ee(s,"id"));return i===null?s.notFound():D(s,i,Uj)}),t.get("/api/runs/:id/where",s=>{let i=on(e.dal,ee(s,"id"));return i===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(Hi(i)):s.json(i)}),t.get("/api/runs/:id/timeline",s=>{let i=Ji(e.dal,ee(s,"id"));return i===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(Xi(i)):s.json(i)}),t.post("/api/runs/:id/resume",async s=>{let i=s.req.query("outcome");if(i===void 0||i.length===0){let a=s.req.header("content-type")??"";if(a.includes("application/x-www-form-urlencoded")||a.includes("multipart/form-data")){let c=(await s.req.parseBody().catch(()=>({}))).outcome;typeof c=="string"&&c.length>0&&(i=c)}}if(i===void 0||i.length===0)return s.text("missing outcome",400);let o=e.dal.resumeRun(ee(s,"id"),i);return!o.resumed&&o.reason==="run_not_found"?s.notFound():o.resumed?(zo(e.daemon),D(s,o,Mw)):D(s,o,Mw,400)}),t.post("/api/interactive/:step_id/respond",async s=>{let i=ee(s,"step_id"),o,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let d=await s.req.json();typeof d.input=="string"&&(o=d.input),d.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let d=await s.req.parseBody().catch(()=>({}));typeof d.input=="string"&&(o=d.input),(d.done==="true"||d.done===!0)&&(a=!0)}if(o===void 0)return s.text("missing input",400);let c=e.dal.resumeInteractive(i,o,a);return!c.resumed&&c.reason==="not_found"?s.notFound():c.resumed?(zo(e.daemon),s.json({resumed:!0,session_status:c.session.status})):s.json({resumed:!1,reason:c.reason},400)}),t.get("/api/runs/:id/steps/:step_id",s=>$w(s,e.dal,i=>D(s,i,Bj))),t.get("/api/runs/:id/steps/:step_id/transcript",s=>{let i=v_(e.dal,ee(s,"id"),ee(s,"step_id"));return i===null?s.notFound():Uw(s)?s.html(`<pre>${b(i)}</pre>`):s.req.header("accept")?.includes("text/plain")?s.text(i):s.json({transcript:i})}),t.get("/api/runs/:id/steps/:step_id/messages",s=>$w(s,e.dal,i=>{let o=fw(i);return D(s,o,a=>me(["role","text"],a.map(l=>[b(l.role),b(l.text)])))})),t.get("/api/external-objects",s=>D(s,k_(e.dal,{type:s.req.query("type")}),qj)),t.get("/api/external-signals",s=>D(s,I_(e.dal,{unhandled:s.req.query("unhandled")==="true"}),Hj)),t.get("/api/attentions",s=>D(s,cr(e.dal,{unacked:s.req.query("unacked")==="true"}),Jj)),t.post("/api/attentions/:id/ack",s=>{let i=e.dal.acknowledgeAttention(ee(s,"id"));return i===null?s.notFound():D(s,i,o=>`<p>acknowledged attention ${b(o.id)}</p>`)}),t.get("/api/escalations",s=>{let i=s.req.query("project"),o=s.req.query("all")==="true",a=s.req.query("since"),l={all:o};i!==void 0&&(l.project=i),a!==void 0&&(l.since=a);let c=qi(e.dal,l);return D(s,c,d=>`<h1>Escalations</h1>${me(["attention_id","project","run","workflow","state","prompt"],d.map(u=>[b(u.attention_id),b(u.project),b(u.run_id),b(u.workflow_name),b(u.state_name),b((u.prompt??"").slice(0,120))]))}`)}),t.get("/api/escalations/:id",s=>{let i=kt(e.dal,ee(s,"id"));return i===null?s.notFound():D(s,i,de)}),t.post("/api/escalations/:id/respond",async s=>{let i=ee(s,"id"),o,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let m=await s.req.json();typeof m.input=="string"&&(o=m.input),m.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let m=await s.req.parseBody().catch(()=>({}));typeof m.input=="string"&&(o=m.input),(m.done==="true"||m.done===!0)&&(a=!0)}if(o===void 0)return s.text("missing input",400);let c=kt(e.dal,i);if(c===null)return s.notFound();let d=cr(e.dal).find(m=>m.id===i);if(d===void 0)return s.notFound();if(d.kind==="workflow_escalation"){let m=e.dal.resumeEscalation(i,o);if(!m.resumed)return s.json({ok:!1,reason:m.reason},400);zo(e.daemon);let p=cr(e.dal).find(_=>_.id===i);return s.json({ok:!0,attention_id:i,run_id:m.run.id,decision:o,session_status:"escalation_resumed",acknowledged_at:p?.acknowledged_at??null})}if(d.kind!=="interactive_waiting_operator")return s.json({ok:!1,reason:"wrong_kind",kind:d.kind},400);if(d.acknowledged_at!==null)return s.json({ok:!1,reason:"already_acked"},400);if(c.step_id===null)return s.json({ok:!1,reason:"no_step"},400);let u=e.dal.resumeInteractive(c.step_id,o,a);if(!u.resumed)return s.json({ok:!1,reason:u.reason,step_id:c.step_id},400);let f=e.dal.acknowledgeAttention(i);return zo(e.daemon),s.json({ok:!0,attention_id:i,step_id:c.step_id,session_status:u.session.status,acknowledged_at:f?.acknowledged_at??null})}),t.get("/api/submitted-prs",s=>{let i=s.req.query("pr_url"),o=s.req.query("status"),a=T_(e.dal,{status:o,pr_url:i});return D(s,a,Xj)}),t.get("/api/submitted-prs/:id",s=>{let i=ee(s,"id"),o=b_(e.dal,i);return o===null?s.notFound():D(s,o,Gj)}),t.get("/api/sessions",s=>D(s,e.dal.latestSessionSizes(),jw)),t.get("/api/sessions/:team_name/:alias/history",s=>{let i=is(s.req.param("team_name"));return D(s,e.dal.sessionSizeHistory(i,s.req.param("alias")),jw)}),t.post("/api/sessions/:team_name/:alias/compact",async s=>{let i=is(s.req.param("team_name"));try{let o=await f_(e.dal,i,s.req.param("alias"));return D(s,o,a=>Dw("compacted",a.row))}catch(o){if(o instanceof ss)return s.text(o.message,409);throw o}}),t.post("/api/sessions/:team_name/:alias/refresh",async s=>{let i=is(s.req.param("team_name")),o=await hc(e.dal,i,s.req.param("alias"));return D(s,o,a=>Dw(`refreshed ${a.sessionid}`,a.row))}),t.get("/api/intake/state",s=>D(s,r,Pw)),t.post("/api/intake/scan",async s=>(r=await lo(e.dal),D(s,r,Pw))),t.get("/api/stats/run-throughput",s=>D(s,A_(e.dal),Vj)),t.get("/api/daemon/state",s=>D(s,e.daemon?.state??null,Kj)),t.post("/api/daemon/cycle",async s=>{if(e.daemon===void 0)return D(s,{disabled:!0},de);let i=await e.daemon.runCycle();return D(s,{state:e.daemon.state,result:i},de)}),t.get("/metrics/:project_id",s=>{let i=ee(s,"project_id"),o=e.dal.getProject(i);if(o===null)return s.notFound();let a=Sc(e.dal,i),l=vc(e.dal,{project_id:i});return s.html(Ae(`Metrics \u2014 ${o.name}`,Yj(o.name,a,l)))}),t.get("/api/metrics/reviewer/:project_id",s=>{let i=ee(s,"project_id");if(e.dal.getProject(i)===null)return s.notFound();let o=Wd(s,"since_days");return s.json(Sc(e.dal,i,o))}),t.get("/api/metrics/tools/:project_id",s=>{let i=ee(s,"project_id");if(e.dal.getProject(i)===null)return s.notFound();let o=Wd(s,"since_days");return s.json(vc(e.dal,{project_id:i,since_days:o}))}),t.post("/api/drift/:id/ack",s=>{let i=e.dal.acknowledgeDriftSignal(ee(s,"id"));return i===null?s.notFound():s.json({id:i.id,acknowledged_at:i.acknowledged_at})}),t}function $w(e,t,r){let n=bc(t,ee(e,"id"),ee(e,"step_id"));return n===null?e.notFound():r(n)}function zo(e){e!==void 0&&e.runCycle().catch(()=>{})}function D(e,t,r,n=200){return Uw(e)?n===200?e.html(r(t)):e.html(r(t),400):new Response(JSON.stringify(t),{status:n,headers:{"Content-Type":"application/json; charset=UTF-8"}})}function Uw(e){let t=e.req.header("accept")??"";return t.includes("text/html")&&!t.includes("application/json")}function vj(){let e=process.env.LMCTL_WEBUI_DIST;if(e!==void 0)return Yo(`${e}/index.html`)?Bd(e):null;let t="src/serve/webui-dist";if(Yo(`${t}/index.html`))return t;let r="dist/serve/webui-dist";if(Yo(`${r}/index.html`))return r;let n=Ej(gj(bj(import.meta.url)),"webui-dist");return Yo(`${n}/index.html`)?Bd(n):null}function Bd(e){if(!wj(e))return e;let t=Tj(process.cwd(),e);return t.length===0?".":t}function kj(){return async(e,t)=>{await t(),e.header("Cache-Control","no-store")}}function ee(e,t){return Number(e.req.param(t))}function Wd(e,t){let r=e.req.query(t);if(r===void 0)return;let n=Number(r);return Number.isInteger(n)&&n>0?n:void 0}function Ij(e){switch(yj(e).toLowerCase()){case".txt":return"text/plain; charset=utf-8";case".md":return"text/markdown; charset=utf-8";case".html":case".htm":return"text/html; charset=utf-8";case".css":return"text/css; charset=utf-8";case".csv":return"text/csv; charset=utf-8";case".json":return"application/json; charset=utf-8";case".xml":return"application/xml; charset=utf-8";case".yaml":case".yml":return"text/yaml; charset=utf-8";case".js":case".mjs":case".cjs":return"text/javascript; charset=utf-8";case".ts":return"text/x-typescript; charset=utf-8";case".log":return"text/plain; charset=utf-8";case".docx":return"application/vnd.openxmlformats-officedocument.wordprocessingml.document";case".xlsx":return"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";case".pptx":return"application/vnd.openxmlformats-officedocument.presentationml.presentation";case".pdf":return"application/pdf";case".png":return"image/png";case".jpg":case".jpeg":return"image/jpeg";case".gif":return"image/gif";case".webp":return"image/webp";case".zip":return"application/zip";case".gz":return"application/gzip";default:return"application/octet-stream"}}function Nj(e){return!!(e.startsWith("text/")||e.startsWith("application/json")||e.startsWith("application/xml"))}async function Tn(e){try{let t=await e.req.json();return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:"invalid JSON body"}catch{return"invalid JSON body"}}function xj(e){if(e==null)return null;if(typeof e=="string"){try{let t=JSON.parse(e);if(t!==null&&typeof t=="object"&&!Array.isArray(t))return JSON.stringify(t)}catch{return"error:invalid parameters_override JSON"}return"error:parameters_override must be a JSON object"}return typeof e=="object"&&!Array.isArray(e)?JSON.stringify(e):"error:parameters_override must be a JSON object"}function Cw(e,t){if(e===void 0||e.length===0)return;let r=e.split(",").map(n=>n.trim()).filter(n=>n.length>0);if(r.length!==0){for(let n of r)if(!t.includes(n))return`invalid value: ${n}`;return r}}function Rj(e){if(e!=null)return typeof e=="string"&&Ww.includes(e)?e:{error:`invalid severity: ${String(e)}`}}function Lj(e){if(e==null)return null;if(typeof e=="string")try{let t=JSON.parse(e);return Array.isArray(t)&&t.every(r=>typeof r=="string")?JSON.stringify(t):"error:labels must be a JSON string array"}catch{return"error:invalid labels JSON"}return Array.isArray(e)&&e.every(t=>typeof t=="string")?JSON.stringify(e):"error:labels must be a JSON string array"}function Oj(e){return`<h1>Status</h1><div class="grid">
1965
1965
  <div class="metric"><strong>${e.jobs.queued}</strong><br>queued jobs</div>
1966
1966
  <div class="metric"><strong>${e.jobs.done}</strong><br>done jobs</div>
1967
1967
  <div class="metric"><strong>${e.runs.active}</strong><br>active runs</div>
@@ -2004,7 +2004,7 @@ ${p.text}`,["approve","request_changes"],!0,s,t.writes_to_project_path===!0)));i
2004
2004
  <h2>Retry counts (runs with &gt;1 attempt per state)</h2>
2005
2005
  ${me(["state","retried runs","avg attempts"],o)}
2006
2006
  <h2>Tool efficacy</h2>
2007
- ${me(["tool","invocations","successes (status=ok)","hit rate","avg latency ms","p50 ms","p95 ms"],a)}`}var Aj,Ww,Bw=T(()=>{"use strict";qc();as();kh();Lh();Ph();Jt();Qc();Dy();Jy();zy();sw();dw();mw();Nw();Mi();Ow();xo();Aj=["open","assigned","closed","reopened"],Ww=["low","medium","high","critical"]});function zj(e){return Math.floor(e/6e4)*6e4}function Zj(e){e.db.transaction(()=>{let t=e.getRollupCursor(),r=e.listSessionEventsSince(t);if(r.length!==0){for(let n of r)Qj(e,n);e.setRollupCursor(r[r.length-1].id)}})()}function Qj(e,t){let r=Date.now(),n=zj(t.timestamp_ms),s=n+6e4;if(t.kind==="tool_use"){e.addRollupValue({run_id:t.run_id,step_id:t.step_id,metric_kind:"tool_calls_count",value:1,bucket_start_ms:n,bucket_end_ms:s,updated_at:r});return}if(t.kind==="tool_result"){let i={};try{i=JSON.parse(t.payload)}catch{}let o=typeof i.elapsedMs=="number"&&i.elapsedMs>0?i.elapsedMs:0;o>0&&e.addRollupValue({run_id:t.run_id,step_id:t.step_id,metric_kind:"time_in_tool_use_ms",value:o,bucket_start_ms:n,bucket_end_ms:s,updated_at:r});return}if(t.kind==="text"){let i=Buffer.byteLength(t.payload,"utf8");e.addRollupValue({run_id:t.run_id,step_id:t.step_id,metric_kind:"message_delta_bytes",value:i,bucket_start_ms:n,bucket_end_ms:s,updated_at:r})}}function qw(e,t=250){let r=setInterval(()=>{try{Zj(e)}catch{}},t);return{stop(){clearInterval(r)}}}var Hw=T(()=>{"use strict"});function tD({dal:e}){let t=e.listProjects();for(let r of t){let n=e.query(`SELECT r.id, r.team_id
2007
+ ${me(["tool","invocations","successes (status=ok)","hit rate","avg latency ms","p50 ms","p95 ms"],a)}`}var Aj,Ww,Bw=T(()=>{"use strict";Bc();as();kh();Lh();Ph();Jt();Zc();Dy();Jy();zy();sw();dw();mw();Nw();Mi();Ow();xo();Aj=["open","assigned","closed","reopened"],Ww=["low","medium","high","critical"]});function zj(e){return Math.floor(e/6e4)*6e4}function Zj(e){e.db.transaction(()=>{let t=e.getRollupCursor(),r=e.listSessionEventsSince(t);if(r.length!==0){for(let n of r)Qj(e,n);e.setRollupCursor(r[r.length-1].id)}})()}function Qj(e,t){let r=Date.now(),n=zj(t.timestamp_ms),s=n+6e4;if(t.kind==="tool_use"){e.addRollupValue({run_id:t.run_id,step_id:t.step_id,metric_kind:"tool_calls_count",value:1,bucket_start_ms:n,bucket_end_ms:s,updated_at:r});return}if(t.kind==="tool_result"){let i={};try{i=JSON.parse(t.payload)}catch{}let o=typeof i.elapsedMs=="number"&&i.elapsedMs>0?i.elapsedMs:0;o>0&&e.addRollupValue({run_id:t.run_id,step_id:t.step_id,metric_kind:"time_in_tool_use_ms",value:o,bucket_start_ms:n,bucket_end_ms:s,updated_at:r});return}if(t.kind==="text"){let i=Buffer.byteLength(t.payload,"utf8");e.addRollupValue({run_id:t.run_id,step_id:t.step_id,metric_kind:"message_delta_bytes",value:i,bucket_start_ms:n,bucket_end_ms:s,updated_at:r})}}function qw(e,t=250){let r=setInterval(()=>{try{Zj(e)}catch{}},t);return{stop(){clearInterval(r)}}}var Hw=T(()=>{"use strict"});function tD({dal:e}){let t=e.listProjects();for(let r of t){let n=e.query(`SELECT r.id, r.team_id
2008
2008
  FROM run r
2009
2009
  JOIN job j ON j.id = r.job_id
2010
2010
  WHERE j.project_id = ?
@@ -2030,26 +2030,26 @@ ${i.text}`;return await Zo(e.io,r.map(l=>l.id),a),{status:"stalled",receipt:a,pr
2030
2030
 
2031
2031
  `)}function iE(e){return e.sender_teamfile===null||e.sender_alias===null?"operator":oE({teamfile:e.sender_teamfile,alias:e.sender_alias})}function oE(e){return`${e.teamfile}:${e.alias}`}async function Zo(e,t,r){if(t.length!==0)try{await $(e,n=>{n.markMailDelivered(t,r,new Date().toISOString())})}catch(n){e.stderr.write(`warning: failed to mark queued mailbox mail delivered: ${n instanceof Error?n.message:String(n)}
2032
2032
  `)}}async function rE(e,t){if(t.length!==0)try{await $(e,r=>{r.clearMailDelivery(t)})}catch(r){e.stderr.write(`warning: failed to clear queued mailbox delivery marker: ${r instanceof Error?r.message:String(r)}
2033
- `)}}async function aE(e,t){try{await $(e,r=>{r.reclaimStaleMailboxDeliveries(new Date(Date.now()-lD(t)).toISOString())})}catch{}}function lD(e){let t=e.LMCTL_MAILBOX_DELIVERY_STALE_MS;if(t===void 0||t.trim()==="")return tE;let r=Number(t);return!Number.isFinite(r)||r<=0?tE:r}var tE,Hd=T(()=>{"use strict";vt();ve();Re();tE=8*60*60*1e3});import{basename as cD}from"node:path";function dE(e,t){let r=new Date(t.now.getTime()-gr()).toISOString(),n=mE(e,r).filter(f=>!f.sender.teamfile.startsWith("prompt:")),s=fD(t.sender,n),i=mD(t.sender,n);i!==null&&i.teamfile===t.root&&!cE(s[0],i)&&s.unshift({...i,at:null});let o={teamfile:t.receiverTeamfile,alias:t.receiverAlias,at:t.now.getTime()},a=[...s,o],l=s.filter(f=>cE(f,o)),c=l.map(f=>f.at).filter(f=>f!==null).sort((f,m)=>m-f)[0]??null,d=c!==null&&t.now.getTime()-c<dD;return{stop:l.length>=1&&d,chain:pD(a)}}function uE(e,t){let r=new Date(t.now.getTime()-gr()).toISOString(),n=mE(e,r),s=pE(t.sender,n);if(s.length===0)return null;let i=s[0];return i.sender.teamfile.startsWith("prompt:")?i.receiver.teamfile:i.sender.teamfile}function gr(e=process.env){let t=e.LMCTL_INFLIGHT_TTL_MS;if(t===void 0||t.trim()==="")return lE;let r=Number(t);return!Number.isFinite(r)||r<=0?lE:r}function fE(e){return`cross-team cycle detected (${e}); stopping to prevent a runaway loop.`}function uD(e){return{sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},at:Date.parse(e.started_at)}}function mE(e,t){return e.clearAgentInflightOlderThan(t),e.listAgentInflight().map(uD).filter(r=>Number.isFinite(r.at)&&new Date(r.at).toISOString()>=t).sort((r,n)=>r.at-n.at)}function fD(e,t,r={}){let n=new Map;for(let a of t)n.set(Ur(a.receiver),a);let s=[{...e,at:null}],i=e,o=new Set([Ur(e)]);for(let a=0;a<64;a+=1){let l=n.get(Ur(i));if(l===void 0)break;s[0]={...s[0],at:s[0].at??l.at};let c={...l.sender,at:l.at};if(l.sender.teamfile.startsWith("prompt:")&&r.includePromptSender!==!0)break;let d=Ur(l.sender);if(o.has(d))break;s.unshift(c),o.add(d),i=l.sender}return s}function pE(e,t){let r=Ur(e),n=new Set([r]),s=[r],i=[];for(let o=0;s.length>0&&o<128;o+=1){let a=s.shift();for(let l of t){let c=Ur(l.sender),d=Ur(l.receiver);c!==a&&d!==a||(i.includes(l)||i.push(l),n.has(c)||(n.add(c),s.push(c)),n.has(d)||(n.add(d),s.push(d)))}}return i.sort((o,a)=>o.at-a.at)}function mD(e,t){let r=pE(e,t);if(r.length===0)return null;let n=r[0];return n.sender.teamfile.startsWith("prompt:")?n.receiver:n.sender}function cE(e,t){return e.teamfile===t.teamfile&&e.alias===t.alias}function Ur(e){return`${e.teamfile}\0${e.alias}`}function pD(e){return e.map(t=>`${cD(t.teamfile)}:${t.alias}`).join(" \u2192 ")}var dD,lE,ea=T(()=>{"use strict";dD=6e4,lE=8*60*60*1e3});function _E(e){if(e.length===0||!e.startsWith("---"))throw new xt("frontmatter must start at line 1 with `---` on its own line");let t=e.split(`
2034
- `);if(t[0]!=="---")throw new xt("frontmatter must start at line 1 with `---` on its own line");let r={},n=-1;for(let o=1;o<t.length;o++){let a=t[o];if(a==="---"){n=o;break}if(a.trim()==="")continue;let l=a.match(/^([a-zA-Z][a-zA-Z0-9_-]*)\s*:\s*(.*)$/);if(!l)throw new xt(`malformed frontmatter line ${o+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let c=l[1],d=l[2].trim();if(!_D.has(c))throw new xt(`unknown frontmatter key "${c}" \u2014 allowed keys: ${ta.join(", ")}`);r[c]=d}if(n===-1)throw new xt("frontmatter not closed (missing trailing `---` on its own line)");for(let o of ta)if(r[o]===void 0)throw new xt(`missing required frontmatter key "${o}" \u2014 required: ${ta.join(", ")}`);let s=0;for(let o=0;o<=n;o++)s+=t[o].length+1;s>e.length&&(s=e.length);let i=r.members.split(",").map(o=>o.trim()).filter(Boolean);return{title:r.title,description:r.description,members:i,bodyOffset:s}}var ta,_D,xt,hE=T(()=>{"use strict";ta=["title","description","members"],_D=new Set(ta),xt=class extends Error{constructor(t){super(t),this.name="FrontmatterError"}}});import{readFileSync as hD,writeFileSync as q8,renameSync as H8,existsSync as yE}from"node:fs";import{basename as gD,resolve as bn,dirname as Jd}from"node:path";function wD(e){let t={},r=/(\w+)=(?:"([^"]*)"|([\S]*))/g,n;for(;(n=r.exec(e))!==null;){let s=n[1],i=n[2]!==void 0?n[2]:n[3];t[s]=i}return t}function ED(e){return/^\s*_MEMBER_\s+\S/.test(e)}function TD(e){return/^\s*_SESSION_\s+\S/.test(e)}function bD(e){return/^\s*_SKILL_(?:\s|$)/.test(e)}function ra(e){let t=gD(e);return t.endsWith(".lmctl")?t.slice(0,-6):t}function je(e){let t=hD(e,"utf-8"),r=Jd(bn(e)),n=Gd(t,ra(e),{baseDir:r,sourcePath:bn(e)});for(let s of n.members)s.sessiondir&&!s.sessiondir.startsWith("/")&&(s.sessiondir=bn(r,s.sessiondir));return n}function Gd(e,t,r={}){let n=[],s=[];r.sourcePath,r.baseDir;let i=e;if(i.startsWith("#teamfile:")){let l=i.indexOf(`
2033
+ `)}}async function aE(e,t){try{await $(e,r=>{r.reclaimStaleMailboxDeliveries(new Date(Date.now()-lD(t)).toISOString())})}catch{}}function lD(e){let t=e.LMCTL_MAILBOX_DELIVERY_STALE_MS;if(t===void 0||t.trim()==="")return tE;let r=Number(t);return!Number.isFinite(r)||r<=0?tE:r}var tE,qd=T(()=>{"use strict";vt();ve();Re();tE=8*60*60*1e3});import{basename as cD}from"node:path";function dE(e,t){let r=new Date(t.now.getTime()-gr()).toISOString(),n=mE(e,r).filter(f=>!f.sender.teamfile.startsWith("prompt:")),s=fD(t.sender,n),i=mD(t.sender,n);i!==null&&i.teamfile===t.root&&!cE(s[0],i)&&s.unshift({...i,at:null});let o={teamfile:t.receiverTeamfile,alias:t.receiverAlias,at:t.now.getTime()},a=[...s,o],l=s.filter(f=>cE(f,o)),c=l.map(f=>f.at).filter(f=>f!==null).sort((f,m)=>m-f)[0]??null,d=c!==null&&t.now.getTime()-c<dD;return{stop:l.length>=1&&d,chain:pD(a)}}function uE(e,t){let r=new Date(t.now.getTime()-gr()).toISOString(),n=mE(e,r),s=pE(t.sender,n);if(s.length===0)return null;let i=s[0];return i.sender.teamfile.startsWith("prompt:")?i.receiver.teamfile:i.sender.teamfile}function gr(e=process.env){let t=e.LMCTL_INFLIGHT_TTL_MS;if(t===void 0||t.trim()==="")return lE;let r=Number(t);return!Number.isFinite(r)||r<=0?lE:r}function fE(e){return`cross-team cycle detected (${e}); stopping to prevent a runaway loop.`}function uD(e){return{sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},at:Date.parse(e.started_at)}}function mE(e,t){return e.clearAgentInflightOlderThan(t),e.listAgentInflight().map(uD).filter(r=>Number.isFinite(r.at)&&new Date(r.at).toISOString()>=t).sort((r,n)=>r.at-n.at)}function fD(e,t,r={}){let n=new Map;for(let a of t)n.set(Ur(a.receiver),a);let s=[{...e,at:null}],i=e,o=new Set([Ur(e)]);for(let a=0;a<64;a+=1){let l=n.get(Ur(i));if(l===void 0)break;s[0]={...s[0],at:s[0].at??l.at};let c={...l.sender,at:l.at};if(l.sender.teamfile.startsWith("prompt:")&&r.includePromptSender!==!0)break;let d=Ur(l.sender);if(o.has(d))break;s.unshift(c),o.add(d),i=l.sender}return s}function pE(e,t){let r=Ur(e),n=new Set([r]),s=[r],i=[];for(let o=0;s.length>0&&o<128;o+=1){let a=s.shift();for(let l of t){let c=Ur(l.sender),d=Ur(l.receiver);c!==a&&d!==a||(i.includes(l)||i.push(l),n.has(c)||(n.add(c),s.push(c)),n.has(d)||(n.add(d),s.push(d)))}}return i.sort((o,a)=>o.at-a.at)}function mD(e,t){let r=pE(e,t);if(r.length===0)return null;let n=r[0];return n.sender.teamfile.startsWith("prompt:")?n.receiver:n.sender}function cE(e,t){return e.teamfile===t.teamfile&&e.alias===t.alias}function Ur(e){return`${e.teamfile}\0${e.alias}`}function pD(e){return e.map(t=>`${cD(t.teamfile)}:${t.alias}`).join(" \u2192 ")}var dD,lE,ea=T(()=>{"use strict";dD=6e4,lE=8*60*60*1e3});function _E(e){if(e.length===0||!e.startsWith("---"))throw new xt("frontmatter must start at line 1 with `---` on its own line");let t=e.split(`
2034
+ `);if(t[0]!=="---")throw new xt("frontmatter must start at line 1 with `---` on its own line");let r={},n=-1;for(let o=1;o<t.length;o++){let a=t[o];if(a==="---"){n=o;break}if(a.trim()==="")continue;let l=a.match(/^([a-zA-Z][a-zA-Z0-9_-]*)\s*:\s*(.*)$/);if(!l)throw new xt(`malformed frontmatter line ${o+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let c=l[1],d=l[2].trim();if(!_D.has(c))throw new xt(`unknown frontmatter key "${c}" \u2014 allowed keys: ${ta.join(", ")}`);r[c]=d}if(n===-1)throw new xt("frontmatter not closed (missing trailing `---` on its own line)");for(let o of ta)if(r[o]===void 0)throw new xt(`missing required frontmatter key "${o}" \u2014 required: ${ta.join(", ")}`);let s=0;for(let o=0;o<=n;o++)s+=t[o].length+1;s>e.length&&(s=e.length);let i=r.members.split(",").map(o=>o.trim()).filter(Boolean);return{title:r.title,description:r.description,members:i,bodyOffset:s}}var ta,_D,xt,hE=T(()=>{"use strict";ta=["title","description","members"],_D=new Set(ta),xt=class extends Error{constructor(t){super(t),this.name="FrontmatterError"}}});import{readFileSync as hD,writeFileSync as G8,renameSync as V8,existsSync as yE}from"node:fs";import{basename as gD,resolve as bn,dirname as Hd}from"node:path";function wD(e){let t={},r=/(\w+)=(?:"([^"]*)"|([\S]*))/g,n;for(;(n=r.exec(e))!==null;){let s=n[1],i=n[2]!==void 0?n[2]:n[3];t[s]=i}return t}function ED(e){return/^\s*_MEMBER_\s+\S/.test(e)}function TD(e){return/^\s*_SESSION_\s+\S/.test(e)}function bD(e){return/^\s*_SKILL_(?:\s|$)/.test(e)}function ra(e){let t=gD(e);return t.endsWith(".lmctl")?t.slice(0,-6):t}function je(e){let t=hD(e,"utf-8"),r=Hd(bn(e)),n=Xd(t,ra(e),{baseDir:r,sourcePath:bn(e)});for(let s of n.members)s.sessiondir&&!s.sessiondir.startsWith("/")&&(s.sessiondir=bn(r,s.sessiondir));return n}function Xd(e,t,r={}){let n=[],s=[];r.sourcePath,r.baseDir;let i=e;if(i.startsWith("#teamfile:")){let l=i.indexOf(`
2035
2035
  `);i=l>=0?i.slice(l+1):""}let o=null;if(i.startsWith("---"))try{o=_E(i)}catch(l){if(l instanceof xt)s.push(`frontmatter: ${l.message}`);else throw l}let a=e.split(`
2036
2036
  `);for(let l=0;l<a.length;l++){let c=a[l],d=l+1;if(TD(c))throw new Error(`line ${d}: _SESSION_ is the legacy prefix. Rename to _MEMBER_. (line: ${c.trim()})`);if(bD(c)||!ED(c))continue;let u=wD(c);for(let p of Object.keys(u))if(!gE.includes(p))throw new Error(`line ${d}: unknown key "${p}" on _MEMBER_ line: ${c.trim()}
2037
- allowed keys: ${gE.join(", ")}`);if(!u.provider&&!u.teamfile){s.push(`line ${d}: member line missing provider (or teamfile): ${c.trim()}`);continue}let m={alias:u.alias||`member${n.length+1}`,provider:u.provider||"",extra:{}};u.sessionid&&(m.session=u.sessionid),Object.prototype.hasOwnProperty.call(u,"sessiondir")&&(m.sessiondir=u.sessiondir),u.teamfile&&(m.teamfile=u.teamfile),u.model&&(m.model=u.model),u.effort&&(m.effort=u.effort),n.push(m)}return{name:t,members:n,rawText:e,parseErrors:s,frontmatter:o}}function Vd(e,t){let r=[];for(let i of e.parseErrors)r.push({field:"session",message:i});let n=e.members.filter(i=>i.alias.toLowerCase()===Xd.toLowerCase());n.length>1&&r.push({field:Xd,message:`${n.length} alias=Lead found (max 1)`});let s=new Set;for(let i of e.members){let o=i.alias.toLowerCase();if(s.has(o)&&r.push({field:i.alias,message:`Duplicate alias "${i.alias}" (case-insensitive)`}),s.add(o),i.teamfile){let a=t?bn(t,i.teamfile):bn(i.teamfile);if(!yE(a))r.push({field:i.alias,message:`Teamfile not found: ${a}`});else{let l=je(a),c=At(l);c?c.session||r.push({field:i.alias,message:`Team at ${i.teamfile} lead has no session ID. Run: lmctl seed`}):r.push({field:i.alias,message:`Team at ${i.teamfile} has no lead session`})}}else yD.has(i.provider)||r.push({field:i.alias,message:`Invalid provider "${i.provider}"`});i.sessiondir!==void 0&&i.sessiondir===""&&r.push({field:i.alias,message:"sessiondir is empty"})}return r}function At(e){return e.members.find(t=>t.alias.toLowerCase()===Xd.toLowerCase())}function Kd(e,t,r,n={}){let s=n.requireSession??!0;if(!e.teamfile)throw new Error(`Member "${e.alias}" is not a team reference`);let i=bn(t,e.teamfile),o=r??new Set;if(o.has(i))throw new Error(`Circular team reference: ${e.alias} \u2192 ${i} (already visited: ${[...o].join(" \u2192 ")})`);if(o.add(i),!yE(i))throw new Error(`Teamfile not found: ${i} (referenced by alias "${e.alias}")`);let a=je(i),l=At(a);if(!l)throw new Error(`Team at ${i} has no lead session`);if(l.teamfile)return Kd(l,Jd(i),o,n);if(s&&!l.session)throw new Error(`Team at ${i} lead has no session ID. Run: lmctl seed`);return{provider:l.provider,session:l.session??"",sessiondir:l.sessiondir||Jd(i),alias:e.alias,resolvedFrom:i,model:l.model,effort:l.effort}}function na(e,t){return e.members.find(r=>r.alias===t)??e.members.find(r=>r.alias.toLowerCase()===t.toLowerCase())}var Xd,yD,gE,zt=T(()=>{"use strict";hE();Xd="Lead",yD=new Set(["claude","codex","opencode","lmplayer","gemini","copilot","qwen","agy","ClaudeMock"]);gE=["alias","provider","sessionid","sessiondir","teamfile","model","effort"]});import{createHash as SD}from"node:crypto";import{existsSync as vs,mkdirSync as vD,readFileSync as TE,realpathSync as kD,writeFileSync as ID}from"node:fs";import{basename as wE,dirname as bE,resolve as SE}from"node:path";function we(e,t){let r=SE(e);if(vs(r))return kD(r);if(t!==void 0){let n=AD(e,r,t);if(n!==null)return n}return r}function EE(e,t){let r=bE(t),n=Gd(e,ra(t),{baseDir:r});for(let s of n.members)s.sessiondir!==void 0&&!s.sessiondir.startsWith("/")&&(s.sessiondir=SE(r,s.sessiondir));return n}function De(e,t){let r=we(e,xD(t)?t:void 0);if(t!==void 0){let n=t.getRootTeam(r);if(n!==null)return!vs(r)&&"upsertRootTeam"in t&&(vD(bE(r),{recursive:!0}),ID(r,n.raw_text,"utf8")),EE(n.raw_text,r);if(vs(r)){let s=TE(r,"utf8"),i=EE(s,r);return"upsertRootTeam"in t&&RD(i)&&LD(t,r,i,s),i}throw new Error(`teamfile not found: ${e}`)}if(!vs(r))throw new Error(`teamfile not found: ${e}`);return je(r)}function vE(e,t,r){let n=we(e,t),s=t.getRootTeam(n);s===null||!vs(n)||TE(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 xD(e){return typeof e=="object"&&e!==null&&"getRootTeam"in e&&"listRootTeams"in e}function AD(e,t,r){let n=r.getRootTeam(e)??r.getRootTeam(t);if(n!==null)return n.teamfile_path;let s=wE(e),i=ra(e),o=r.listRootTeams().filter(l=>wE(l.teamfile_path)===s||l.name===i);if(o.length===0)return null;if(o.length===1)return o[0].teamfile_path;let a=o.map(l=>l.teamfile_path).join(", ");throw new Error(`ambiguous teamfile "${e}" in root-team registry: ${a}; pass an absolute path`)}function RD(e){return e.parseErrors.length>0?!1:e.members.every(t=>t.teamfile!==void 0?!0:t.session!==void 0&&t.session.length>=ND)}function LD(e,t,r,n){let s=new Date().toISOString(),i={teamfile_path:t,name:r.name,raw_text:n,raw_sha256:SD("sha256").update(n).digest("hex"),registered_at:s,last_seeded_at:s};e.upsertRootTeam(i)}var ND,Rt=T(()=>{"use strict";zt();ND=5});import{existsSync as OD}from"node:fs";import{dirname as kE}from"node:path";function MD(e){return $D.test(e)||CD.test(e)}function IE(e){return sa.test(e)}function Wr(e){if(!e.includes(":"))return null;let t=e.lastIndexOf(":"),r=e.slice(0,t),n=e.slice(t+1);return!r.endsWith(".lmctl")||!sa.test(n)?null:{teamfile:r,alias:n}}function qe(e,t,r){if(!e.endsWith(".lmctl"))throw new ge(`lmctl: "${e}" doesn't look like a teamfile (expected .lmctl extension).`);if(!IE(t))throw new ge(`lmctl: "${t}" is not a valid alias (must match ${sa.source}).`);let n=we(e,r);if(r===void 0&&!OD(n))throw new ge(`lmctl: teamfile not found: ${e}`);let s;try{s=De(n,r)}catch(o){throw new ge(`lmctl: ${e}: ${o instanceof Error?o.message:String(o)}`)}if(s.parseErrors.length>0)throw new ge(`lmctl: ${e}: ${s.parseErrors.join("; ")}`);let i=na(s,t);if(i===void 0){let o=s.members.map(a=>a.alias).join(", ")||"(none)";throw new ge(`lmctl: alias "${t}" not found in ${e}.
2038
- Known aliases: ${o}`)}if(i.teamfile!==void 0){let o=Kd(i,kE(n));return{teamfile:n,alias:i.alias,provider:o.provider,sessionid:o.session,sessiondir:o.sessiondir,isLead:!0,...o.model??i.model?{model:o.model??i.model}:{},...o.effort??i.effort?{effort:o.effort??i.effort}:{}}}if(i.session===void 0)throw new ge(`lmctl: alias "${i.alias}" in ${e} has no session ID yet.
2037
+ allowed keys: ${gE.join(", ")}`);if(!u.provider&&!u.teamfile){s.push(`line ${d}: member line missing provider (or teamfile): ${c.trim()}`);continue}let m={alias:u.alias||`member${n.length+1}`,provider:u.provider||"",extra:{}};u.sessionid&&(m.session=u.sessionid),Object.prototype.hasOwnProperty.call(u,"sessiondir")&&(m.sessiondir=u.sessiondir),u.teamfile&&(m.teamfile=u.teamfile),u.model&&(m.model=u.model),u.effort&&(m.effort=u.effort),n.push(m)}return{name:t,members:n,rawText:e,parseErrors:s,frontmatter:o}}function Gd(e,t){let r=[];for(let i of e.parseErrors)r.push({field:"session",message:i});let n=e.members.filter(i=>i.alias.toLowerCase()===Jd.toLowerCase());n.length>1&&r.push({field:Jd,message:`${n.length} alias=Lead found (max 1)`});let s=new Set;for(let i of e.members){let o=i.alias.toLowerCase();if(s.has(o)&&r.push({field:i.alias,message:`Duplicate alias "${i.alias}" (case-insensitive)`}),s.add(o),i.teamfile){let a=t?bn(t,i.teamfile):bn(i.teamfile);if(!yE(a))r.push({field:i.alias,message:`Teamfile not found: ${a}`});else{let l=je(a),c=At(l);c?c.session||r.push({field:i.alias,message:`Team at ${i.teamfile} lead has no session ID. Run: lmctl seed`}):r.push({field:i.alias,message:`Team at ${i.teamfile} has no lead session`})}}else yD.has(i.provider)||r.push({field:i.alias,message:`Invalid provider "${i.provider}"`});i.sessiondir!==void 0&&i.sessiondir===""&&r.push({field:i.alias,message:"sessiondir is empty"})}return r}function At(e){return e.members.find(t=>t.alias.toLowerCase()===Jd.toLowerCase())}function Vd(e,t,r,n={}){let s=n.requireSession??!0;if(!e.teamfile)throw new Error(`Member "${e.alias}" is not a team reference`);let i=bn(t,e.teamfile),o=r??new Set;if(o.has(i))throw new Error(`Circular team reference: ${e.alias} \u2192 ${i} (already visited: ${[...o].join(" \u2192 ")})`);if(o.add(i),!yE(i))throw new Error(`Teamfile not found: ${i} (referenced by alias "${e.alias}")`);let a=je(i),l=At(a);if(!l)throw new Error(`Team at ${i} has no lead session`);if(l.teamfile)return Vd(l,Hd(i),o,n);if(s&&!l.session)throw new Error(`Team at ${i} lead has no session ID. Run: lmctl seed`);return{provider:l.provider,session:l.session??"",sessiondir:l.sessiondir||Hd(i),alias:e.alias,resolvedFrom:i,model:l.model,effort:l.effort}}function na(e,t){return e.members.find(r=>r.alias===t)??e.members.find(r=>r.alias.toLowerCase()===t.toLowerCase())}var Jd,yD,gE,zt=T(()=>{"use strict";hE();Jd="Lead",yD=new Set(["claude","codex","opencode","lmplayer","gemini","copilot","qwen","agy","ClaudeMock"]);gE=["alias","provider","sessionid","sessiondir","teamfile","model","effort"]});import{createHash as SD}from"node:crypto";import{existsSync as vs,mkdirSync as vD,readFileSync as TE,realpathSync as kD,writeFileSync as ID}from"node:fs";import{basename as wE,dirname as bE,resolve as SE}from"node:path";function we(e,t){let r=SE(e);if(vs(r))return kD(r);if(t!==void 0){let n=AD(e,r,t);if(n!==null)return n}return r}function EE(e,t){let r=bE(t),n=Xd(e,ra(t),{baseDir:r});for(let s of n.members)s.sessiondir!==void 0&&!s.sessiondir.startsWith("/")&&(s.sessiondir=SE(r,s.sessiondir));return n}function De(e,t){let r=we(e,xD(t)?t:void 0);if(t!==void 0){let n=t.getRootTeam(r);if(n!==null)return!vs(r)&&"upsertRootTeam"in t&&(vD(bE(r),{recursive:!0}),ID(r,n.raw_text,"utf8")),EE(n.raw_text,r);if(vs(r)){let s=TE(r,"utf8"),i=EE(s,r);return"upsertRootTeam"in t&&RD(i)&&LD(t,r,i,s),i}throw new Error(`teamfile not found: ${e}`)}if(!vs(r))throw new Error(`teamfile not found: ${e}`);return je(r)}function vE(e,t,r){let n=we(e,t),s=t.getRootTeam(n);s===null||!vs(n)||TE(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 xD(e){return typeof e=="object"&&e!==null&&"getRootTeam"in e&&"listRootTeams"in e}function AD(e,t,r){let n=r.getRootTeam(e)??r.getRootTeam(t);if(n!==null)return n.teamfile_path;let s=wE(e),i=ra(e),o=r.listRootTeams().filter(l=>wE(l.teamfile_path)===s||l.name===i);if(o.length===0)return null;if(o.length===1)return o[0].teamfile_path;let a=o.map(l=>l.teamfile_path).join(", ");throw new Error(`ambiguous teamfile "${e}" in root-team registry: ${a}; pass an absolute path`)}function RD(e){return e.parseErrors.length>0?!1:e.members.every(t=>t.teamfile!==void 0?!0:t.session!==void 0&&t.session.length>=ND)}function LD(e,t,r,n){let s=new Date().toISOString(),i={teamfile_path:t,name:r.name,raw_text:n,raw_sha256:SD("sha256").update(n).digest("hex"),registered_at:s,last_seeded_at:s};e.upsertRootTeam(i)}var ND,Rt=T(()=>{"use strict";zt();ND=5});import{existsSync as OD}from"node:fs";import{dirname as kE}from"node:path";function MD(e){return $D.test(e)||CD.test(e)}function IE(e){return sa.test(e)}function Wr(e){if(!e.includes(":"))return null;let t=e.lastIndexOf(":"),r=e.slice(0,t),n=e.slice(t+1);return!r.endsWith(".lmctl")||!sa.test(n)?null:{teamfile:r,alias:n}}function qe(e,t,r){if(!e.endsWith(".lmctl"))throw new ge(`lmctl: "${e}" doesn't look like a teamfile (expected .lmctl extension).`);if(!IE(t))throw new ge(`lmctl: "${t}" is not a valid alias (must match ${sa.source}).`);let n=we(e,r);if(r===void 0&&!OD(n))throw new ge(`lmctl: teamfile not found: ${e}`);let s;try{s=De(n,r)}catch(o){throw new ge(`lmctl: ${e}: ${o instanceof Error?o.message:String(o)}`)}if(s.parseErrors.length>0)throw new ge(`lmctl: ${e}: ${s.parseErrors.join("; ")}`);let i=na(s,t);if(i===void 0){let o=s.members.map(a=>a.alias).join(", ")||"(none)";throw new ge(`lmctl: alias "${t}" not found in ${e}.
2038
+ Known aliases: ${o}`)}if(i.teamfile!==void 0){let o=Vd(i,kE(n));return{teamfile:n,alias:i.alias,provider:o.provider,sessionid:o.session,sessiondir:o.sessiondir,isLead:!0,...o.model??i.model?{model:o.model??i.model}:{},...o.effort??i.effort?{effort:o.effort??i.effort}:{}}}if(i.session===void 0)throw new ge(`lmctl: alias "${i.alias}" in ${e} has no session ID yet.
2039
2039
  Run: lmctl seed ${e}`);return{teamfile:n,alias:i.alias,provider:i.provider,sessionid:i.session,sessiondir:i.sessiondir??kE(n),isLead:At(s)?.alias===i.alias,...i.model!==void 0?{model:i.model}:{},...i.effort!==void 0?{effort:i.effort}:{}}}function yr(e,t){let{target:r,alias:n,flags:s}=t;if(s.run!==void 0||s.project!==void 0||s.workflow!==void 0){if(r!==void 0)return{mode:"error",message:`lmctl ${e.name}: --run/--project/--workflow (managed mode) are mutually exclusive with a positional target "${r}" \u2014 pick one form.`};let o={mode:"managed"};return s.run!==void 0&&(o.run=s.run),s.project!==void 0&&(o.project=s.project),s.workflow!==void 0&&(o.workflow=s.workflow),o}if(r!==void 0){let o=Wr(r);if(o!==null)return n!==void 0&&n!==o.alias?{mode:"error",message:`lmctl ${e.name}: got "${r}" AND second positional "${n}" \u2014 pick one form.`}:{mode:"ai-team",teamfile:o.teamfile,alias:o.alias};if(r.endsWith(".lmctl"))return n!==void 0?IE(n)?{mode:"ai-team",teamfile:r,alias:n}:{mode:"error",message:`lmctl ${e.name}: "${n}" is not a valid alias (must match ${sa.source}).`}:e.allowsBareTeamfile?{mode:"ai-team",teamfile:r}:{mode:"error",message:`lmctl ${e.name}: alias required.
2040
2040
  Use: lmctl ${e.name} ${r}:<alias> or lmctl ${e.name} ${r} <alias>`};if(MD(r)){if(n!==void 0)return{mode:"error",message:`lmctl ${e.name}: got a second positional "${n}" but "${r}" is not a teamfile path.`};if(!e.supportsRaw)return{mode:"error",message:`lmctl ${e.name}: "${r}" is a bare sessionid, but ${e.name} is teamfile-only (a sessionid carries no provider resume incantation).`};let a={mode:"ai-team-raw",sessionid:r};return s.provider!==void 0&&(a.provider=s.provider),a}return n!==void 0?{mode:"error",message:`lmctl ${e.name}: got a second positional "${n}" but "${r}" is not a teamfile path.
2041
2041
  Either drop the second arg, or pass <teamfile>.lmctl as the first arg.`}:{mode:"error",message:`lmctl ${e.name}: can't infer target type from "${r}".
2042
2042
  Expected one of: <path>.lmctl, <path>.lmctl:<alias>, <sessionid>.`}}if(s.session!==void 0){if(!e.supportsRaw)return{mode:"error",message:`lmctl ${e.name}: --session (raw mode) is not supported by ${e.name}.`};let o={mode:"ai-team-raw",sessionid:s.session};return s.provider!==void 0&&(o.provider=s.provider),o}return{mode:"error",message:`lmctl ${e.name}: a target is required.
2043
2043
  Use: <path>.lmctl[:<alias>] | <path>.lmctl <alias> | <sessionid> | --run <id>`}}var ge,$D,CD,sa,Lt=T(()=>{"use strict";zt();Rt();ge=class extends Error{constructor(t){super(t),this.name="ChatTargetError"}},$D=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,CD=/^ses_[A-Za-z0-9_-]+$/,sa=/^[A-Za-z][A-Za-z0-9_-]*$/});function jD(e=process.env){let t=e.LMCTL_DAEMON_MAILBOX_RELAY_MAX_BATCHES;if(t===void 0||t.trim()==="")return NE;let r=Number(t);return!Number.isFinite(r)||r<=0?NE:Math.max(1,Math.trunc(r))}async function AE(e){let t=e.env??process.env,r=e.maxBatches??jD(t),n=qD(e.dal),s={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0};BD(e.dal,t);let i=new Set;for(;s.scanned<r;){let o=e.dal.listRelayMailboxLanes(r).find(l=>!i.has(xE(l)));if(o===void 0)break;i.add(xE(o)),s.scanned+=1;let a=await DD(e.dal,n,t,o);s.delivered+=a.delivered,s.skipped_busy+=a.skipped_busy,s.skipped_terminal+=a.skipped_terminal,s.errors+=a.errors}return s}function xE(e){return JSON.stringify([e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias])}async function DD(e,t,r,n){let s={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0},i=Pr(e,n.receiver_teamfile,n.receiver_alias);if(i.busy)return i.reason==="terminal-held"?{...s,skipped_terminal:1}:{...s,skipped_busy:1};let o=null;try{let a=qe(n.receiver_teamfile,n.receiver_alias,e),l=hr(e,{receiver_teamfile:n.receiver_teamfile,receiver_alias:n.receiver_alias,sender_teamfile:n.sender_teamfile,sender_alias:n.sender_alias,ttlMs:gr()});if(!l.acquired)return{...s,skipped_busy:1};if(o=l.lease,n.message_type==="response"){let d=await sE({sender:{teamfile:n.sender_teamfile,alias:n.sender_alias},receiver:{teamfile:n.receiver_teamfile,alias:n.receiver_alias,provider:a.provider,sessionId:a.sessionid,cwd:a.sessiondir,...a.model!==void 0?{model:a.model}:{},...a.effort!==void 0?{effort:a.effort}:{},...a.isLead!==void 0?{isLead:a.isLead}:{}},io:t,permissionMode:"yolo",env:r});return UD(d)}let c=await Qo({sender:{teamfile:n.sender_teamfile,alias:n.sender_alias},receiver:{teamfile:n.receiver_teamfile,alias:n.receiver_alias,provider:a.provider,sessionId:a.sessionid,cwd:a.sessiondir,...a.model!==void 0?{model:a.model}:{},...a.effort!==void 0?{effort:a.effort}:{},...a.isLead!==void 0?{isLead:a.isLead}:{}},io:t,permissionMode:"yolo",env:r,finalize:"caller"});return FD(e,c)}catch(a){return PD(e,n,`relay delivery error: ${a instanceof Error?a.message:String(a)}`)}finally{if(o!==null)try{e.releaseAgentInflight(o)}catch{}}}function PD(e,t,r){let n={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0};try{let s=t.message_type==="response"?e.listEnqueuedResponseMailFromSender(t.sender_teamfile,t.sender_alias,t.receiver_teamfile,t.receiver_alias):e.listEnqueuedRequestMailFromSender(t.sender_teamfile,t.sender_alias,t.receiver_teamfile,t.receiver_alias),i=t.message_type==="response"?e.markMailDelivered(s.map(o=>o.id),r,new Date().toISOString()):e.markRelayRequestDeliveredAndEnqueueResponses(s,r,new Date().toISOString()).marked;return{...n,delivered:i,errors:1}}catch{return{...n,errors:1}}}function FD(e,t){let r={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0},n=WD(t),s=new Date().toISOString(),{marked:i}=e.markRelayRequestDeliveredAndEnqueueResponses(t.queued,n,s);return{...r,delivered:i,errors:t.status==="ok"?0:1}}function UD(e){return{...{scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0},delivered:e.deliveredIds.length,errors:e.status==="ok"?0:1}}function WD(e){return e.status==="ok"?e.receipt:e.status==="stalled"?`relay delivery error: provider stalled${e.stalledAfterMs!==void 0?` after ${e.stalledAfterMs}ms`:""}
2044
- ${e.receipt}`:`relay delivery error: ${e.error}`}function BD(e,t){let r=t.LMCTL_MAILBOX_DELIVERY_STALE_MS,n=r===void 0||r.trim()===""?NaN:Number(r),s=Number.isFinite(n)&&n>0?n:8*60*60*1e3;e.reclaimStaleMailboxDeliveries(new Date(Date.now()-s).toISOString())}function qD(e){return{stdout:{write:()=>{}},stderr:{write:()=>{}},dal:e}}var NE,RE=T(()=>{"use strict";Fr();Hd();ea();Lt();NE=10});function ks(){let e=process.env.LMCTL_DAEMON_INTERVAL_MS;if(e===void 0||e.trim().length===0)return 5e3;let t=Number(e);return Number.isFinite(t)&&t>0?t:5e3}function LE(e){let t=e.intervalMs??ks(),r=e.runOnceFn??jr,n={running:e.autoStart!==!1,in_flight:!1,interval_ms:t,cycles:0,jobs_processed:0,last_jobs_processed:0,last_started_at:null,last_finished_at:null,last_error:null,last_session_sizes_recorded:0,last_session_size_failures:0,last_intake_scanned:0,last_intake_new_jobs:0,last_intake_failures:0,last_session_hung_detected:0,last_session_monitor_checked_at:null,last_session_monitor_error:null,last_mailbox_relay_scanned:0,last_mailbox_relay_delivered:0,last_mailbox_relay_errors:0},s=null,i=null,o=null,a=null,l=null;e.startRollupUpdaterFn!==!1&&(l=(e.startRollupUpdaterFn??qw)(e.dal));let c=f=>{n.running&&(s=setTimeout(()=>{u.runCycle().finally(()=>c(t))},f))},d=f=>{n.running&&(i=setTimeout(()=>{a===null&&(a=OE(e.dal,e.monitorSessionActivityFn??yc,t,n).finally(()=>{a=null})),a.finally(()=>d(wc(e.dal,t)))},f))},u={state:n,runCycle:async()=>(o!==null||(o=HD(e.dal,r,e.collectSessionSizesFn??u_,e.scanIntakeFn??lo,e.monitorSessionActivityFn??yc,e.mailboxRelayFn??AE,e.worker_id??"daemon",t,n).finally(()=>{o=null})),o),stop:async()=>{n.running=!1,s!==null&&clearTimeout(s),i!==null&&clearTimeout(i),l?.stop(),o!==null&&await o.catch(()=>{}),a!==null&&await a.catch(()=>{})}};if(n.running){let f=e.firstDelayMs??5e3;c(f),d(f)}return u}async function HD(e,t,r,n,s,i,o,a,l){l.in_flight=!0,l.last_started_at=new Date().toISOString(),l.last_error=null;let c=[],d=0,u=0,f=[],m=null,p=JD();try{for(wy({dal:e}),Xw({dal:e}),f=await n(e);;){let g=await t({dal:e,worker_id:o,lease_ms:6e5});if(g===null)break;c.push(g)}p=await i({dal:e});let _=await r(e);d=_.recorded,u=_.failed,m=await OE(e,s,a,l)}catch(_){l.last_error=_ instanceof Error?_.message:String(_);try{e.raiseAttention({kind:"daemon_worker_failed",severity:"error",payload:JSON.stringify({error:l.last_error})})}catch{}}finally{l.in_flight=!1,l.cycles+=1,l.last_jobs_processed=c.length,l.last_session_sizes_recorded=d,l.last_session_size_failures=u,l.last_intake_scanned=f.reduce((_,g)=>_+g.scanned,0),l.last_intake_new_jobs=f.reduce((_,g)=>_+g.new_jobs,0),l.last_intake_failures=f.filter(_=>_.error!==void 0).length,l.last_session_hung_detected=m?.hung_detected??0,l.last_mailbox_relay_scanned=p.scanned,l.last_mailbox_relay_delivered=p.delivered,l.last_mailbox_relay_errors=p.errors,l.jobs_processed+=c.length,l.last_finished_at=new Date().toISOString()}return{jobs_processed:c.length,outcomes:c,session_sizes_recorded:d,session_size_failures:u,intake:f,session_monitor:m,mailbox_relay:p}}function JD(){return{scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0}}async function OE(e,t,r,n){let s=wc(e,r),i=Date.now();if(n.last_session_monitor_checked_at!==null){let o=Date.parse(n.last_session_monitor_checked_at);if(Number.isFinite(o)&&i-o<s)return null}n.last_session_monitor_checked_at=new Date(i).toISOString(),n.last_session_monitor_error=null;try{return await t({dal:e,nowMs:i})}catch(o){n.last_session_monitor_error=o instanceof Error?o.message:String(o);try{e.raiseAttention({kind:"daemon_session_monitor_failed",severity:"error",payload:JSON.stringify({error:n.last_session_monitor_error})})}catch{}return null}}var Yd=T(()=>{"use strict";qc();Lo();Ed();Mi();Hw();Gw();Ec();RE()});function $E(e){let t=e.listMembersInState("in_chat");for(let r of t)e.setMemberState(r.id,"attention_needed","daemon_restarted_mid_chat");return t.length}var CE=T(()=>{"use strict"});import{mkdirSync as XD,readFileSync as GD,readdirSync as VD,statSync as KD,writeFileSync as YD}from"node:fs";import{dirname as zD,join as jE,sep as ME}from"node:path";function ia(e){return{s3:{async send(n){let s=n;switch(s._localfsTag){case DE:return ZD(e,s.input);case PE:return QD(e,s.input);case FE:return eP(e,s.input);default:throw new Error("createLocalFsS3Client: unknown command")}}},commands:{ListObjectsV2Command:Qd,GetObjectCommand:Zd,PutObjectCommand:zd}}}function ZD(e,t){let r=UE(e,t.Key);return XD(zD(r),{recursive:!0}),YD(r,t.Body),{}}function QD(e,t){let r=UE(e,t.Key),n;try{n=GD(r)}catch(i){throw i.code==="ENOENT"?Object.assign(new Error("NoSuchKey"),{name:"NoSuchKey"}):i}let s=n.toString("utf-8");return{Body:{transformToString:async()=>s}}}function eP(e,t){let r=t.Prefix??"";WE(r);let s=tP(e).sort((d,u)=>d.key<u.key?-1:d.key>u.key?1:0).filter(d=>d.key.startsWith(r)),i=t.ContinuationToken;i!==void 0&&i!==""&&(s=s.filter(d=>d.key>i));let o=typeof t.MaxKeys=="number"&&Number.isFinite(t.MaxKeys)&&t.MaxKeys>0?Math.floor(t.MaxKeys):void 0,a=s,l=!1;o!==void 0&&s.length>o&&(a=s.slice(0,o),l=!0);let c={Contents:a.map(d=>({Key:d.key,LastModified:d.lastModified})),IsTruncated:l};return l&&(c.NextContinuationToken=a[a.length-1].key),c}function UE(e,t){return WE(t),jE(e,t)}function WE(e){if(e.split("/").includes(".."))throw new Error(`localfs-s3-client: refusing key/prefix with '..': ${e}`)}function tP(e){let t=[],r=(n,s)=>{let i;try{i=VD(n,{withFileTypes:!0})}catch(o){if(o.code==="ENOENT")return;throw o}for(let o of i){let a=s===""?o.name:`${s}/${o.name}`,l=jE(n,o.name);if(o.isDirectory())r(l,a);else if(o.isFile()){let c=ME==="/"?a:a.split(ME).join("/");t.push({key:c,lastModified:KD(l).mtime})}}};return r(e,""),t}var DE,PE,FE,zd,Zd,Qd,eu=T(()=>{"use strict";DE="localfs-put",PE="localfs-get",FE="localfs-list",zd=class{input;_localfsTag=DE;constructor(t){this.input=t}},Zd=class{input;_localfsTag=PE;constructor(t){this.input=t}},Qd=class{input;_localfsTag=FE;constructor(t){this.input=t}}});function BE(){return{put:0,get:0,list:0}}function tu(e,t=rP){return e.put*t.putUsd+e.get*t.getUsd+e.list*t.listUsd}function ru(e){let t=new Date(e),r=t.getUTCFullYear(),n=String(t.getUTCMonth()+1).padStart(2,"0");return`${r}-${n}`}var rP,oa,nu=T(()=>{"use strict";rP={putUsd:5e-6,getUsd:40000000000000003e-23,listUsd:5e-6};oa=class{counts=BE();record(t,r=1){this.counts[t]+=r}peek(){return{...this.counts}}drain(){let t={...this.counts};return this.counts=BE(),t}estimateCostUsd(t){return tu(this.counts,t)}}});function qE(e){let t=e.now??Date.now,r=e.timers??nP,n=null,s=null;async function i(){let l=t(),c=ru(l),d=e.meter.drain();(d.put>0||d.get>0||d.list>0)&&e.store.addUsage({user_id:e.userId,device_id:e.deviceId,period:c,put:d.put,get:d.get,list:d.list,updated_at:new Date(l).toISOString()});let u=e.store.loadUsage(e.userId,e.deviceId,c),f=u?{put:u.put_count,get:u.get_count,list:u.list_count}:{put:0,get:0,list:0};if(e.publishOwnRollup!==void 0)try{await e.publishOwnRollup(c,f)}catch(_){e.log?.(`[usage] publish rollup failed: ${_ instanceof Error?_.message:String(_)}`)}let m=f;if(e.readUserTotal!==void 0)try{m=await e.readUserTotal(c)}catch(_){e.log?.(`[usage] read user total failed: ${_ instanceof Error?_.message:String(_)}`),m=f}let p=tu(m);if(n!==c&&p>=e.ceilingUsd){n=c,e.log?.(`[usage] quota exceeded period=${c} cost=$${p.toFixed(4)} >= ceiling $${e.ceilingUsd}`);try{e.onQuotaExceeded({period:c,costUsd:p,ceilingUsd:e.ceilingUsd})}catch(_){e.log?.(`[usage] onQuotaExceeded threw: ${_ instanceof Error?_.message:String(_)}`)}}}function o(){return s=(s??Promise.resolve()).then(()=>i()).catch(()=>{}),s}let a=r.setInterval(()=>{o()},e.intervalMs);return{stop(){r.clearInterval(a)},flushNow(){return o()},isOverQuota(){return n!==null&&n===ru(t())}}}var nP,HE=T(()=>{"use strict";nu();nP={setInterval:(e,t)=>setInterval(e,t),clearInterval:e=>clearInterval(e)}});var su=T(()=>{"use strict";jo();Po();Po()});function sP(e){if(typeof e!="object"||e===null||Array.isArray(e))return null;let t=e;if(typeof t.message_id!="string"||t.message_id==="")return null;if(typeof t.reply_to=="string"&&t.reply_to!==""){let s=t.response;if(typeof s!="object"||s===null)return null;let i=s;return typeof i.status!="number"?null:{message_id:t.message_id,reply_to:t.reply_to,response:i}}let r=t.request;if(typeof r!="object"||r===null)return null;let n=r;return typeof n.method!="string"||n.method===""||typeof n.path!="string"||n.path===""?null:{message_id:t.message_id,request:n}}function iP(e){return e.reply_to!==void 0&&e.response!==void 0}function oP(e){if(typeof e!="object"||e===null)return;let t=e.conversation_id;return typeof t=="string"?t:void 0}function JE(e){let t=e.reason;if(t!==void 0)return t;try{return new DOMException("Aborted","AbortError")}catch{let r=new Error("Aborted");return r.name="AbortError",r}}var aa,Is,XE=T(()=>{"use strict";su();aa=class extends Error{name="MailboxFetchStoppedError";code="mailbox_fetch_stopped";constructor(t="MailboxFetchClient stopped before a response arrived"){super(t)}},Is=class{client;log;now;random;pending=new Map;requestHandler=null;stopped=!1;constructor(t){this.client=t.client,this.log=t.log??(()=>{}),this.now=t.now??Date.now,this.random=t.random??Math.random}onRequest(t){if(this.requestHandler!==null)throw new Error("MailboxFetchClient: onRequest handler already registered");this.requestHandler=t}async fetch(t,r){if(this.stopped)throw new aa("MailboxFetchClient.fetch after stop()");if(typeof t.path!="string"||t.path==="")throw new Error("MailboxFetchClient.fetch: request.path is required");let n=t.method;if(typeof n!="string"||n==="")throw new Error("MailboxFetchClient.fetch: request.method is required");let s=Yt(this.now(),this.random);if(this.pending.has(s))throw new Error(`MailboxFetchClient.fetch: duplicate message_id=${s}`);let i=r?.conversationId??s,o={message_id:s,request:t};return new Promise((a,l)=>{let c=r?.abortSignal,d;if(c!==void 0){if(c.aborted){l(JE(c));return}d=()=>{this.pending.has(s)&&(this.pending.delete(s),l(JE(c)))},c.addEventListener("abort",d,{once:!0})}this.pending.set(s,{resolve:a,reject:l,...d!==void 0?{abortListener:d}:{},...c!==void 0?{abortSignal:c}:{}}),this.client.putMessage({conversation_id:i,payload:o}).catch(u=>{let f=this.pending.get(s);f!==void 0&&(this.pending.delete(s),f.abortListener!==void 0&&f.abortSignal!==void 0&&f.abortSignal.removeEventListener("abort",f.abortListener),f.reject(u))})})}async stop(){if(this.stopped)return;this.stopped=!0;let t=Array.from(this.pending.values());this.pending.clear();let r=new aa;for(let n of t){n.abortListener!==void 0&&n.abortSignal!==void 0&&n.abortSignal.removeEventListener("abort",n.abortListener);try{n.reject(r)}catch{}}}async handleIncoming(t,r){let n=sP(t);if(n===null){this.log("MailboxFetchClient: dropping non-envelope inbound payload");return}if(iP(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??oP(t)??n.message_id,i;try{i=await this.requestHandler(n.request)}catch(l){let c=l instanceof Error?l.message:String(l),d=typeof l.code=="string"?l.code:"INTERNAL_ERROR";i={status:500,headers:{"content-type":"application/json"},body:{error:d,message:c}}}let a={message_id:Yt(this.now(),this.random),reply_to:n.message_id,response:i};try{await this.client.putMessage({conversation_id:s,payload:a})}catch(l){this.log(`MailboxFetchClient: response PUT failed for reply_to=${n.message_id}: ${l instanceof Error?l.message:String(l)}`)}}}});function iu(e){if(typeof e!="object"||e===null||Array.isArray(e))return!1;let t=e;return!(t.kind!=="terminal"||typeof t.session_id!="string"||t.session_id===""||t.direction!=="agent_to_user"&&t.direction!=="user_to_agent"||typeof t.data!="string"||typeof t.ts!="number")}var GE=T(()=>{"use strict"});function ou(e){if(typeof e!="object"||e===null||Array.isArray(e))return!1;let t=e;if(t.kind!=="provider"||typeof t.session_id!="string"||t.session_id===""||t.direction!=="agent_to_user"&&t.direction!=="user_to_agent"||typeof t.ts!="number")return!1;if(t.direction==="agent_to_user"){if(!Array.isArray(t.events))return!1;for(let r of t.events)if(typeof r!="object"||r===null||Array.isArray(r)||typeof r.event_type!="string")return!1}else if(typeof t.user_input!="string")return!1;return!0}var VE=T(()=>{"use strict"});function lu(e){if(typeof e!="object"||e===null||Array.isArray(e))return!1;let t=e;if(t.kind!=="daemon_event"||typeof t.event!="string"||t.event===""||typeof t.ts!="number")return!1;if(t.event==="workflows"){if(!Array.isArray(t.workflows))return!1;for(let r of t.workflows){if(typeof r!="object"||r===null||Array.isArray(r))return!1;let n=r;if(typeof n.teamfile_path!="string"||n.teamfile_path===""||n.name!==null&&typeof n.name!="string"||typeof n.registered_at!="string"||n.registered_at===""||n.last_seeded_at!==null&&typeof n.last_seeded_at!="string")return!1}}else if(t.event==="chat_log"){if(typeof t.entry!="object"||t.entry===null||Array.isArray(t.entry))return!1;let r=t.entry;if(typeof r.id!="number"||typeof r.root_teamfile!="string"||r.root_teamfile===""||r.sender_teamfile!==null&&(typeof r.sender_teamfile!="string"||r.sender_teamfile==="")||r.sender_alias!==null&&(typeof r.sender_alias!="string"||r.sender_alias==="")||typeof r.receiver_teamfile!="string"||r.receiver_teamfile===""||typeof r.receiver_alias!="string"||r.receiver_alias===""||typeof r.message!="string"||r.response!==null&&typeof r.response!="string"||typeof r.status!="string"||r.status===""||typeof r.created_at!="string"||r.created_at==="")return!1}return!0}var au,KE=T(()=>{"use strict";au="daemon:events"});function zE(e){return{kind:"prompt",prompt_id:e.prompt_id??Yt(e.now?.()??Date.now(),e.random??Math.random),root_teamfile:e.root_teamfile,text:e.text}}function cu(e){if(e===null||typeof e!="object")return!1;let t=e;return t.kind==="prompt"&&typeof t.prompt_id=="string"&&t.prompt_id.length>0&&typeof t.root_teamfile=="string"&&t.root_teamfile.length>0&&typeof t.text=="string"}var YE,du=T(()=>{"use strict";su();YE="prompt:root"});function Ns(e){let t=e.split(".");if(t.length<2||t[1]===void 0||t[1]==="")return null;try{let r=JSON.parse(QE(t[1]));return typeof r.sub=="string"&&r.sub!==""?r.sub:null}catch{return null}}function aP(e){let t=e.split(".");if(t.length<2||t[1]===void 0||t[1]==="")return null;try{let r=JSON.parse(QE(t[1]));return typeof r.exp=="number"&&Number.isFinite(r.exp)?r.exp:null}catch{return null}}function ZE(e,t=60){if(typeof e!="string"||e==="")return!0;let r=aP(e);return r===null?!0:Date.now()/1e3>=r-t}function QE(e){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t.padEnd(Math.ceil(t.length/4)*4,"="),n=globalThis.Buffer;return n!==void 0?n.from(r,"base64").toString("utf8"):atob(r)}var uu=T(()=>{"use strict"});async function la(e){let t=e.fetchImpl??fetch,r=`https://cognito-idp.${e.region}.amazonaws.com/`,n=await t(r,{method:"POST",headers:{"content-type":"application/x-amz-json-1.1","x-amz-target":lP},body:JSON.stringify({AuthFlow:"REFRESH_TOKEN_AUTH",ClientId:e.clientId,AuthParameters:{REFRESH_TOKEN:e.refreshToken}})}),s=await n.text();if(!n.ok){let l=s;try{let c=JSON.parse(s);l=c.message??c.__type??s}catch{}throw new Error(`cognito_refresh_failed: ${n.status} ${l}`)}let o=JSON.parse(s).AuthenticationResult,a=o?.IdToken;if(typeof a!="string"||a==="")throw new Error("cognito_refresh_no_id_token: InitiateAuth returned no IdToken");return{idToken:a,...typeof o?.AccessToken=="string"&&o.AccessToken!==""?{accessToken:o.AccessToken}:{},...typeof o?.ExpiresIn=="number"&&Number.isFinite(o.ExpiresIn)?{expiresAt:Date.now()+o.ExpiresIn*1e3}:{}}}var lP,fu=T(()=>{"use strict";lP="AWSCognitoIdentityProviderService.InitiateAuth"});import{chmodSync as eT,mkdirSync as tT,readFileSync as rT,writeFileSync as nT}from"node:fs";import{homedir as sT}from"node:os";import{dirname as iT,join as oT}from"node:path";function xs(){return process.env.LMCTL_DEVICE_AUTH_PATH??oT(sT(),".lmctl","device-auth.json")}function aT(){return process.env.LMCTL_TOKEN_PATH??oT(sT(),".lmctl","cli-tokens.json")}function mu(e=xs()){try{let t=JSON.parse(rT(e,"utf8"));return typeof t.userId!="string"||t.userId===""||typeof t.refreshToken!="string"||t.refreshToken===""?null:{userId:t.userId,refreshToken:t.refreshToken}}catch{return null}}function lT(e,t=xs()){tT(iT(t),{recursive:!0,mode:448}),nT(t,JSON.stringify(e,null,2));try{eT(t,384)}catch{}}function pu(e,t=aT()){let r={};try{r=JSON.parse(rT(t,"utf8"))}catch{}let n={...r.cognito??{}};n.idToken=e.idToken,e.accessToken!==void 0&&(n.accessToken=e.accessToken),e.refreshToken!==void 0&&(n.refreshToken=e.refreshToken),e.expiresAt!==void 0&&(n.expiresAt=e.expiresAt);let s={...r,cognito:n};tT(iT(t),{recursive:!0,mode:448}),nT(t,JSON.stringify(s,null,2));try{eT(t,384)}catch{}}async function cT(e){let t=e.deviceAuthPath??xs(),r=mu(t);if(r===null)throw new Error("device_auth_not_found: no ~/.lmctl/device-auth.json; run `lmctl device login` first");let n=await la({region:e.region,clientId:e.clientId,refreshToken:r.refreshToken,...e.fetchImpl!==void 0?{fetchImpl:e.fetchImpl}:{}});return pu({idToken:n.idToken,...n.accessToken!==void 0?{accessToken:n.accessToken}:{},refreshToken:r.refreshToken,...n.expiresAt!==void 0?{expiresAt:n.expiresAt}:{}},e.cliTokensPath??aT()),{idToken:n.idToken,userId:r.userId}}var _u=T(()=>{"use strict";fu()});import{existsSync as cP,realpathSync as dP}from"node:fs";import{dirname as uP}from"node:path";function hu(e){fP(e).catch(t=>{e.log?.(`[mailbox] prompt trigger failed: ${t instanceof Error?t.message:String(t)}`)})}async function fP(e){let t=e.payload.root_teamfile;try{t=dP(e.payload.root_teamfile)}catch(s){let i=`prompt root missing/unreadable: ${e.payload.root_teamfile}: ${s instanceof Error?s.message:String(s)}`;return await Sn(e.store,{rootTeamfile:e.payload.root_teamfile,receiverTeamfile:e.payload.root_teamfile,receiverAlias:"Lead",message:e.payload.text,response:null,status:"error",error_detail:i,log:e.log}),e.log?.(`[mailbox] ${i}`),{status:"error",response:null,error_detail:i}}if(e.store.getRootTeam(t)===null){let s=`prompt root is not registered: ${t}`;return await Sn(e.store,{rootTeamfile:t,receiverTeamfile:t,receiverAlias:"Lead",message:e.payload.text,response:null,status:"error",error_detail:s,log:e.log}),e.log?.(`[mailbox] ${s}`),{status:"error",response:null,error_detail:s}}let r=mP(t);if("error"in r)return await Sn(e.store,{rootTeamfile:t,receiverTeamfile:t,receiverAlias:"Lead",message:e.payload.text,response:null,status:"error",error_detail:r.error,log:e.log}),e.log?.(`[mailbox] ${r.error}`),{status:"error",response:null,error_detail:r.error};let n=hr(e.store,{receiver_teamfile:t,receiver_alias:r.alias,sender_teamfile:`prompt:${e.payload.prompt_id}`,sender_alias:"operator",ttlMs:hP(e.env??process.env)});if(!n.acquired){let s=_P(r.alias,n.current);return await Sn(e.store,{rootTeamfile:t,receiverTeamfile:t,receiverAlias:r.alias,message:e.payload.text,response:null,status:"error",error_detail:s,log:e.log}),e.log?.(`[mailbox] prompt rejected: ${s}`),{status:"error",response:null,error_detail:s}}try{let i=await(e.chat??St)({provider:r.provider,sessionId:r.sessionid,cwd:r.sessiondir,prompt:e.payload.text,env:e.env??process.env,alias:r.alias,permissionMode:"yolo",...e.timeoutMs!==void 0?{timeoutMs:e.timeoutMs}:{}}),o=i.status==="stalled",a=!o&&i.text.trim()==="",l=o?`provider stalled${i.stalledAfterMs!==void 0?` after ${i.stalledAfterMs}ms`:""}`:a?"provider returned empty response":null,c=o||a?"error":"ok";return await Sn(e.store,{rootTeamfile:t,receiverTeamfile:t,receiverAlias:r.alias,message:e.payload.text,response:c==="error"?null:i.text,status:c,error_detail:l,log:e.log}),{status:c,response:c==="error"?null:i.text,error_detail:l}}catch(s){let i=s instanceof Error?s.message:String(s);return await Sn(e.store,{rootTeamfile:t,receiverTeamfile:t,receiverAlias:r.alias,message:e.payload.text,response:null,status:"error",error_detail:i,log:e.log}),e.log?.(`[mailbox] prompt provider error: ${i}`),{status:"error",response:null,error_detail:i}}finally{try{e.store.releaseAgentInflight(n.lease)}catch(s){e.log?.(`[mailbox] failed to release prompt in-flight slot: ${s instanceof Error?s.message:String(s)}`)}}}function mP(e){if(!cP(e))return{error:`prompt root missing/unreadable: ${e}`};let t=je(e);if(t.parseErrors.length>0)return{error:`prompt root parse error: ${t.parseErrors.join("; ")}`};let r=At(t);return r===void 0?{error:`prompt root has no Lead: ${e}`}:r.session===void 0||r.session.trim()===""?{error:`prompt root Lead is unseeded: ${e}`}:{alias:r.alias,provider:r.provider,sessionid:r.session,sessiondir:r.sessiondir??uP(e)}}async function Sn(e,t){let r=fT(t.message),n=t.response===null?null:fT(t.response);try{e.insertTeamChatLog({root_teamfile:t.rootTeamfile,sender_teamfile:t.rootTeamfile,sender_alias:"operator",receiver_teamfile:t.receiverTeamfile,receiver_alias:t.receiverAlias,message:r.text,response:n?.text??null,origin:"unknown",status:t.status,error_detail:t.error_detail,truncated:r.truncated||n?.truncated?1:0,created_at:new Date().toISOString()})}catch(s){t.log?.(`[mailbox] warning: failed to record prompt chat log: ${s instanceof Error?s.message:String(s)}`)}}function fT(e){return e.length<=dT?{text:e,truncated:!1}:{text:e.slice(0,dT),truncated:!0}}function pP(e,t){return`${e} is servicing ${t.sender_alias} (${t.sender_teamfile}) since ${t.started_at}`}function _P(e,t){return t.sender_teamfile.startsWith("prompt:")?`${e} is busy servicing another prompt since ${t.started_at}`:pP(e,t)}function hP(e=process.env){let t=e.LMCTL_INFLIGHT_TTL_MS;if(t===void 0||t.trim()==="")return uT;let r=Number(t);return!Number.isFinite(r)||r<=0?uT:r}var dT,uT,mT=T(()=>{"use strict";vt();zt();Fr();dT=256*1024,uT=30*60*1e3});import{chmodSync as wT,existsSync as gP,mkdirSync as ET,readFileSync as fa,writeFileSync as TT}from"node:fs";import{dirname as gu,resolve as ca,join as bT}from"node:path";import{fileURLToPath as yP}from"node:url";import{homedir as ST}from"node:os";import{CognitoIdentityClient as wP,GetIdCommand as EP}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as pT}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as TP,ListObjectsV2Command as bP,PutObjectCommand as SP,S3Client as _T}from"@aws-sdk/client-s3";function Rs(e={}){let t=e.env??process.env,r=e.tfstatePath!==void 0?[e.tfstatePath]:xP(e.selfUrl),n={},s;for(let I of r)if(gP(I)){n=NP(I),s=I;break}let i=(...I)=>{for(let x of I)if(typeof x=="string"&&x!=="")return x},o=i(t.LMCTL_NEXT_IDENTITY_POOL_ID,n.LMCTL_NEXT_IDENTITY_POOL_ID)??vP,a=i(t.LMCTL_NEXT_COGNITO_USER_POOL_ID,n.LMCTL_NEXT_COGNITO_USER_POOL_ID)??kP,l=i(t.LMCTL_NEXT_MAILBOX_BUCKET,t.LMCTL_NEXT_POLICY_BUCKET,n.LMCTL_NEXT_MAILBOX_BUCKET,n.LMCTL_NEXT_POLICY_BUCKET)??IP,c=i(t.AWS_REGION,t.AWS_DEFAULT_REGION)??"us-east-1",d=i(t.LMCTL_NEXT_COGNITO_CLIENT_ID,n.LMCTL_NEXT_COGNITO_CLIENT_ID)??ma,u=[];o===void 0&&u.push("LMCTL_NEXT_IDENTITY_POOL_ID"),a===void 0&&u.push("LMCTL_NEXT_COGNITO_USER_POOL_ID"),l===void 0&&u.push("LMCTL_NEXT_MAILBOX_BUCKET");let f={missing:u,tfstateCandidatesChecked:r,...s!==void 0?{tfstatePathUsed:s}:{}};if(u.length>0)return f;let m=t.LMCTL_MAILBOX_POLL_MS,p=m!==void 0&&m.length>0?Number(m):void 0,_=ua(t.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),g=ua(t.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),h=ua(t.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),S=ua(t.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),y=i(t.LMCTL_MAILBOX_KEY),w=i(t.LMCTL_TOKEN_PATH);return f.config={identityPoolId:o,cognitoUserPoolId:a,cognitoClientId:d,region:c,mailboxBucket:l,...typeof p=="number"&&Number.isFinite(p)&&p>=100?{pollIntervalMs:p}:{},..._!==void 0?{readIntervalMs:_}:{},...g!==void 0?{heartbeatIdleMs:g}:{},...h!==void 0?{backoffReadIntervalMs:h}:{},...S!==void 0?{chatLogPollIntervalMs:S}:{},...y!==void 0?{mailboxKey:y}:{},...w!==void 0?{tokenPath:w}:{}},f}function NP(e){try{let t=fa(e,"utf8"),n=JSON.parse(t).outputs??{},s={};for(let[i,o]of Object.entries(n))o!==null&&typeof o=="object"&&typeof o.value=="string"&&(s[i]=o.value);return s}catch{return{}}}function xP(e){let t=gu(yP(e??import.meta.url));return[ca(t,"..","..","..","..","infra","terraform","terraform.tfstate"),ca(t,"..","..","..","..","..","infra","terraform","terraform.tfstate"),ca(t,"..","..","..","infra","terraform","terraform.tfstate"),ca(t,"..","..","infra","terraform","terraform.tfstate")]}function ua(e){if(e===void 0||e==="")return;let t=Number(e);if(!(!Number.isFinite(t)||t<=0))return t*1e3}function AP(e){let t=RP(e.intervalMs)??vT,r=Math.max(1,Math.trunc(e.limit??500)),n=e.now??Date.now,s=e.cursorKey!==void 0&&e.store.loadTeamChatLogCursor!==void 0&&e.store.saveTeamChatLogCursor!==void 0?{key:e.cursorKey,load:e.store.loadTeamChatLogCursor.bind(e.store),save:e.store.saveTeamChatLogCursor.bind(e.store)}:null,i,o=!1,a=!1,l=()=>{try{if(s!==null){let u=s.load(s.key);if(u!==null)return i=u.last_pushed_id,!0}return i=e.store.getMaxTeamChatLogId(),s!==null&&s.save({cursor_key:s.key,last_pushed_id:i,updated_at:new Date(n()).toISOString()}),!0}catch(u){return e.log?.(`[mailbox] daemon_event chat_log seed failed: ${u instanceof Error?u.message:String(u)}`),!1}};l();let c=async()=>{if(!(a||o)){o=!0;try{if(i===void 0&&!l())return;let u=e.store.listTeamChatLogSinceId(i,r);for(let f of u){let m={kind:"daemon_event",event:"chat_log",ts:n(),entry:{id:f.id,root_teamfile:f.root_teamfile,sender_teamfile:f.sender_teamfile,sender_alias:f.sender_alias,receiver_teamfile:f.receiver_teamfile,receiver_alias:f.receiver_alias,message:f.message,response:f.response,status:f.status,created_at:f.created_at}};await e.publishDaemonEvent(m),s!==null&&s.save({cursor_key:s.key,last_pushed_id:f.id,updated_at:new Date(n()).toISOString()}),i=Math.max(i,f.id)}}catch(u){e.log?.(`[mailbox] daemon_event chat_log tail failed: ${u instanceof Error?u.message:String(u)}`)}finally{o=!1}}},d=setInterval(()=>{c()},t);return typeof d.unref=="function"&&d.unref(),{pollNow:c,stop(){a=!0,clearInterval(d)}}}function RP(e){return typeof e=="number"&&Number.isFinite(e)&&e>0?e:void 0}async function kT(e){let t=e.tokenPath??bT(ST(),".lmctl","cli-tokens.json"),r=gT(e.tokenPath);if(ZE(r.cognito?.idToken)&&mu()!==null)try{await cT({region:e.region,clientId:e.cognitoClientId??ma,cliTokensPath:t}),r=gT(e.tokenPath),e.log?.("[mx-mailbox] refreshed IdToken from device-auth refresh token")}catch(A){let Q=A instanceof Error?A.message:String(A);e.log?.(`[mx-mailbox] device-auth refresh failed: ${Q}`)}if(r.cognito===void 0)throw new Error("agent_mailbox_not_logged_in: ~/.lmctl/cli-tokens.json has no cognito tokens; run `webcli login` or `lmctl device login` first");let n=r.cognito.idToken;if(typeof n!="string"||n==="")throw new Error("agent_mailbox_no_id_token: cli-tokens.json's cognito.idToken is empty; run `webcli login` or `lmctl device login` first");let s=`cognito-idp.${e.region}.amazonaws.com/${e.cognitoUserPoolId}`,i=r.cognito.identityId,o=!1;i===void 0||i===""?i=await yT({tokenPath:t,region:e.region,identityPoolId:e.identityPoolId,idpProvider:s,idToken:n,log:e.log}):(o=!0,e.log?.(`[mx-mailbox] using cached identityId from cli-tokens (skipping GetId) for ${i}`));let a=pT({identityId:i,logins:{[s]:n},clientConfig:{region:e.region}}),l=new _T({region:e.region,credentials:a}),c={ListObjectsV2Command:bP,GetObjectCommand:TP,PutObjectCommand:SP},d=Ns(n),u=d??i,f=e.deviceId,m=gn({identityId:i,userId:d,deviceId:f,mailboxKey:e.mailboxKey}),p=e.cursorStore,_;if(p!==void 0){let A=p.loadMailboxCursor(u,m);if(A!==null)_=A.last_processed_seq??void 0,e.log?.(`[mx-mailbox] resumed seq cursor=${_??"(sentinel)"} for user_id=${u}`);else{let Q=!1,B=0;for(;!Q&&B<2;){B+=1;try{let k=Co(m,"web"),N=0,L;do{let F=await l.send(new c.ListObjectsV2Command({Bucket:e.mailboxBucket,Prefix:k,MaxKeys:1e3,...L!==void 0?{ContinuationToken:L}:{}}));for(let j of F.Contents??[]){let C=Mo(j.Key??"",m,"web");C!==void 0&&C>N&&(N=C)}L=F.IsTruncated===!0?F.NextContinuationToken:void 0}while(L!==void 0);_=N,e.log?.(`[mx-mailbox] cold start: seeded seq cursor=${N} for user_id=${u}`),Q=!0}catch(k){let N=k instanceof Error?k.message:String(k);if(o&&B===1&&$P(k)){e.log?.(`[mx-mailbox] cached identityId rejected by cognito (${N}); clearing + refreshing`),OP(t),o=!1,i=await yT({tokenPath:t,region:e.region,identityPoolId:e.identityPoolId,idpProvider:s,idToken:n,log:e.log}),a=pT({identityId:i,logins:{[s]:n},clientConfig:{region:e.region}}),l=new _T({region:e.region,credentials:a}),m=gn({identityId:i,userId:d,deviceId:f,mailboxKey:e.mailboxKey});continue}e.log?.(`[mx-mailbox] cold start seq probe failed: ${N}`);break}}p.saveMailboxCursor({user_id:u,mailbox_key:m,last_processed_version_id:null,last_processed_seq:_??null,last_processed_at:new Date().toISOString()})}}let g=null,h=e.terminalSessionManager,S=e.persistentSessionManager,y=e.promptTriggerStore,w=new oa,I=new Dr({bucket:e.mailboxBucket,identityId:i,...d!==null?{userId:d}:{},...f!==void 0?{deviceId:f}:{},...e.mailboxKey!==void 0?{mailboxKey:e.mailboxKey}:{},s3:l,commands:c,selfRole:"agent",onS3Op:A=>w.record(A),onMessage:async A=>{if(h!==void 0&&iu(A.payload)){h.onInbound(A.payload);return}if(S!==void 0&&ou(A.payload)){await S.onInbound(A.payload);return}if(!lu(A.payload)){if(y!==void 0&&cu(A.payload)){hu({store:y,payload:A.payload,log:e.log});return}g!==null&&await g.handleIncoming(A.payload,A)}},...p!==void 0?{onCursorAdvance:A=>{p.saveMailboxCursor({user_id:u,mailbox_key:m,last_processed_version_id:null,last_processed_seq:A,last_processed_at:new Date().toISOString()})}}:{},..._!==void 0?{cursor:_}:{},...e.pollIntervalMs!==void 0?{pollIntervalMs:e.pollIntervalMs}:{},...e.readIntervalMs!==void 0?{readIntervalMs:e.readIntervalMs}:{},...e.heartbeatIdleMs!==void 0?{heartbeatIdleMs:e.heartbeatIdleMs}:{},...e.backoffReadIntervalMs!==void 0?{backoffReadIntervalMs:e.backoffReadIntervalMs}:{}});g=new Is({client:I,...e.log!==void 0?{log:e.log}:{}}),h!==void 0&&h.setPublish(async A=>I.putMessage({conversation_id:`terminal:${A.session_id}`,payload:A})),S!==void 0&&S.setPublish(async A=>I.putMessage({conversation_id:`provider:${A.session_id}`,payload:A}));let x=A=>I.putMessage({conversation_id:au,payload:A});I.start();let U=e.chatLogTailStore===void 0?void 0:AP({store:e.chatLogTailStore,publishDaemonEvent:x,cursorKey:m,intervalMs:e.chatLogPollIntervalMs??e.readIntervalMs??e.pollIntervalMs??vT,log:e.log});e.log?.(`[mx-mailbox] agent polling ${m} (bucket=${e.mailboxBucket})`);let ue=e.deviceId??i,W=`${u}/usage/`,M;return M=e.usageStore===void 0?void 0:qE({meter:w,store:e.usageStore,userId:u,deviceId:ue,ceilingUsd:e.usageQuotaUsd??1/0,onQuotaExceeded:({period:A,costUsd:Q,ceilingUsd:B})=>{e.log?.(`[usage] month ${A} cost $${Q.toFixed(4)} >= ceiling $${B} \u2014 blocking mailbox`),I.stop().catch(()=>{}),M?.stop()},publishOwnRollup:async(A,Q)=>{await l.send(new c.PutObjectCommand({Bucket:e.mailboxBucket,Key:`${W}${ue}-${A}.json`,Body:JSON.stringify({...Q,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async A=>{let Q={put:0,get:0,list:0},B;do{let k=await l.send(new c.ListObjectsV2Command({Bucket:e.mailboxBucket,Prefix:W,MaxKeys:1e3,...B!==void 0?{ContinuationToken:B}:{}}));for(let N of k.Contents??[]){let L=N.Key??"";if(L.endsWith(`-${A}.json`))try{let F=await l.send(new c.GetObjectCommand({Bucket:e.mailboxBucket,Key:L}));if(F.Body===void 0)continue;let j=JSON.parse(await F.Body.transformToString("utf-8"));Q.put+=j.put??0,Q.get+=j.get??0,Q.list+=j.list??0}catch{}}B=k.IsTruncated===!0?k.NextContinuationToken:void 0}while(B!==void 0);return Q},intervalMs:e.usageFlushIntervalMs??36e5,...e.log!==void 0?{log:e.log}:{}}),{identityId:i,mailbox:I,fetchClient:g,publishDaemonEvent:x,async stop(){U?.stop(),M!==void 0&&(await M.flushNow().catch(()=>{}),M.stop()),await g.stop().catch(()=>{}),await I.stop().catch(()=>{})}}}async function IT(e){let t=e.s3!==void 0&&e.commands!==void 0?{s3:e.s3,commands:e.commands}:ia(e.rootDir),r=gn({identityId:As,userId:As,deviceId:hT}),n=null,s=e.terminalSessionManager,i=e.persistentSessionManager,o=e.promptTriggerStore,a=new Dr({bucket:"local",identityId:As,userId:As,deviceId:hT,s3:t.s3,commands:t.commands,selfRole:"agent",onMessage:async c=>{if(s!==void 0&&iu(c.payload)){s.onInbound(c.payload);return}if(i!==void 0&&ou(c.payload)){await i.onInbound(c.payload);return}if(!lu(c.payload)){if(o!==void 0&&cu(c.payload)){hu({store:o,payload:c.payload,log:e.log});return}n!==null&&await n.handleIncoming(c.payload,c)}},pollIntervalMs:e.pollIntervalMs??da,readIntervalMs:e.readIntervalMs??da,heartbeatIdleMs:e.heartbeatIdleMs??da,backoffReadIntervalMs:e.backoffReadIntervalMs??da});n=new Is({client:a,...e.log!==void 0?{log:e.log}:{}}),s!==void 0&&s.setPublish(async c=>a.putMessage({conversation_id:`terminal:${c.session_id}`,payload:c})),i!==void 0&&i.setPublish(async c=>a.putMessage({conversation_id:`provider:${c.session_id}`,payload:c}));let l=c=>a.putMessage({conversation_id:au,payload:c});return a.start(),e.log?.(`[local-webui] agent polling ${r} (local-fs ${e.rootDir})`),{identityId:As,mailbox:a,fetchClient:n,publishDaemonEvent:l,async stop(){await n.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function gT(e){let t=e??bT(ST(),".lmctl","cli-tokens.json");try{let r=fa(t,"utf8");return JSON.parse(r)}catch{return{}}}function LP(e,t){if(t===void 0||t==="")return;let r={};try{let s=fa(e,"utf8");r=JSON.parse(s)}catch{}if(r.cognito===void 0)return;let n={...r,cognito:{...r.cognito,identityId:t}};ET(gu(e),{recursive:!0,mode:448}),TT(e,JSON.stringify(n,null,2));try{wT(e,384)}catch{}}function OP(e){let t={};try{let n=fa(e,"utf8");t=JSON.parse(n)}catch{return}if(t.cognito===void 0)return;let r={...t,cognito:{...t.cognito}};delete r.cognito.identityId,ET(gu(e),{recursive:!0,mode:448}),TT(e,JSON.stringify(r,null,2));try{wT(e,384)}catch{}}async function yT(e){e.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let r=await new wP({region:e.region}).send(new EP({IdentityPoolId:e.identityPoolId,Logins:{[e.idpProvider]:e.idToken}}));if(r.IdentityId===void 0||r.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{LP(e.tokenPath,r.IdentityId),e.log?.(`[mx-mailbox] persisted identityId=${r.IdentityId} to ${e.tokenPath}`)}catch(n){let s=n instanceof Error?n.message:String(n);e.log?.(`[mx-mailbox] WARNING: identityId persist failed (${s}); will redo GetId on next restart`)}return r.IdentityId}function $P(e){if(e===null||typeof e!="object")return!1;let t=e,r=[typeof t.name=="string"?t.name:void 0,typeof t.Code=="string"?t.Code:void 0,typeof t.__type=="string"?t.__type:void 0];for(let s of r)if(s!==void 0&&(s==="NotAuthorizedException"||s==="ResourceNotFoundException"||s==="InvalidIdentityPoolConfigurationException"||s==="ExpiredTokenException"))return!0;let n=typeof t.message=="string"?t.message:"";return!!(n.includes("NotAuthorizedException")||n.includes("Invalid identity pool configuration")||n.includes("Identity")&&n.includes("not found"))}var vT,da,ma,vP,kP,IP,As,hT,yu=T(()=>{"use strict";Fo();eu();nu();HE();XE();GE();VE();KE();du();jo();uu();_u();mT();vT=3e3,da=1e3,ma="79u5jhkk46qofog661c9i0bdcs",vP="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",kP="us-east-1_4iUdFggDn",IP="lmctl-next-preview-mailbox-254332045686";As="local",hT="local"});import{spawn as bu}from"node:child_process";import{createInterface as NT}from"node:readline";var wu,Eu,Tu,xT,AT=T(()=>{"use strict";mi();ve();wu=class{child;ctx;rl;nextRpcId=1;pending=new Map;threadId;nextLocalTurnId=1;closed=!1;setResumeThreadId(t){this.threadId=t}async start(t,r){this.ctx=r;let n=bu(t.command,t.args,{cwd:t.cwd??process.cwd(),env:t.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=n,this.rl=NT({input:n.stdout}),this.rl.on("line",s=>{r.generation===r.currentGeneration()&&this.handleLine(s)}),n.stderr?.on("data",s=>{if(r.generation!==r.currentGeneration())return;let i=s instanceof Buffer?s.toString("utf8"):String(s);r.emit({event_type:"notification",payload:{source:"stderr",text:i}})}),await this.rpc("initialize",{clientInfo:{name:"lmctl-dt3",title:"lmctl DT-3",version:"0.1.0"},capabilities:{experimentalApi:!1}}),this.notify("initialized",{}),this.threadId!==void 0&&this.threadId!=="")try{await this.rpc("thread/resume",{threadId:this.threadId,approvalPolicy:"never",sandbox:"danger-full-access"}),r.emit({event_type:"thread_started",payload:{thread_id:this.threadId,resumed:!0}})}catch{let i=(await this.rpc("thread/start",{cwd:t.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,o=typeof i?.id=="string"?i.id:void 0;this.threadId=o,r.emit({event_type:"thread_started",payload:{thread_id:o,resumed:!1}})}else{let i=(await this.rpc("thread/start",{cwd:t.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,o=typeof i?.id=="string"?i.id:void 0;this.threadId=o,r.emit({event_type:"thread_started",payload:{thread_id:o,resumed:!1}})}return n}async sendTurn(t){if(this.closed)throw new Error("codex_session_closed");if(this.threadId===void 0||this.threadId==="")throw new Error("codex_no_thread_id");let r=`local-${this.nextLocalTurnId++}`;this.ctx?.turnMap.set(r,{startedAt:Date.now()});try{let s=(await this.rpc("turn/start",{threadId:this.threadId,input:[{type:"text",text:t}]})).result?.turn,i=typeof s?.id=="string"?s.id:void 0;if(i!==void 0){let o=this.ctx?.turnMap.get(r);this.ctx?.turnMap.delete(r),o!==void 0&&this.ctx?.turnMap.set(i,o)}}catch(n){throw this.ctx?.turnMap.delete(r),n}}async stop(){if(this.closed=!0,this.rl!==void 0&&(this.rl.close(),this.rl=void 0),this.child?.stdin!==null&&this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}for(let t of this.pending.values())t.reject(new Error("codex_session_stopping"));this.pending.clear()}async rpc(t,r){if(this.child?.stdin===null||this.child===void 0)throw new Error("codex_child_unavailable");return new Promise((n,s)=>{let i=this.nextRpcId++;this.pending.set(i,{resolve:n,reject:s});let o=JSON.stringify({jsonrpc:"2.0",id:i,method:t,params:r});try{this.child.stdin.write(o+`
2044
+ ${e.receipt}`:`relay delivery error: ${e.error}`}function BD(e,t){let r=t.LMCTL_MAILBOX_DELIVERY_STALE_MS,n=r===void 0||r.trim()===""?NaN:Number(r),s=Number.isFinite(n)&&n>0?n:8*60*60*1e3;e.reclaimStaleMailboxDeliveries(new Date(Date.now()-s).toISOString())}function qD(e){return{stdout:{write:()=>{}},stderr:{write:()=>{}},dal:e}}var NE,RE=T(()=>{"use strict";Fr();qd();ea();Lt();NE=10});function ks(){let e=process.env.LMCTL_DAEMON_INTERVAL_MS;if(e===void 0||e.trim().length===0)return 5e3;let t=Number(e);return Number.isFinite(t)&&t>0?t:5e3}function LE(e){let t=e.intervalMs??ks(),r=e.runOnceFn??jr,n={running:e.autoStart!==!1,in_flight:!1,interval_ms:t,cycles:0,jobs_processed:0,last_jobs_processed:0,last_started_at:null,last_finished_at:null,last_error:null,last_session_sizes_recorded:0,last_session_size_failures:0,last_intake_scanned:0,last_intake_new_jobs:0,last_intake_failures:0,last_session_hung_detected:0,last_session_monitor_checked_at:null,last_session_monitor_error:null,last_mailbox_relay_scanned:0,last_mailbox_relay_delivered:0,last_mailbox_relay_errors:0},s=null,i=null,o=null,a=null,l=null;e.startRollupUpdaterFn!==!1&&(l=(e.startRollupUpdaterFn??qw)(e.dal));let c=f=>{n.running&&(s=setTimeout(()=>{u.runCycle().finally(()=>c(t))},f))},d=f=>{n.running&&(i=setTimeout(()=>{a===null&&(a=OE(e.dal,e.monitorSessionActivityFn??gc,t,n).finally(()=>{a=null})),a.finally(()=>d(yc(e.dal,t)))},f))},u={state:n,runCycle:async()=>(o!==null||(o=HD(e.dal,r,e.collectSessionSizesFn??u_,e.scanIntakeFn??lo,e.monitorSessionActivityFn??gc,e.mailboxRelayFn??AE,e.worker_id??"daemon",t,n).finally(()=>{o=null})),o),stop:async()=>{n.running=!1,s!==null&&clearTimeout(s),i!==null&&clearTimeout(i),l?.stop(),o!==null&&await o.catch(()=>{}),a!==null&&await a.catch(()=>{})}};if(n.running){let f=e.firstDelayMs??5e3;c(f),d(f)}return u}async function HD(e,t,r,n,s,i,o,a,l){l.in_flight=!0,l.last_started_at=new Date().toISOString(),l.last_error=null;let c=[],d=0,u=0,f=[],m=null,p=JD();try{for(wy({dal:e}),Xw({dal:e}),f=await n(e);;){let g=await t({dal:e,worker_id:o,lease_ms:6e5});if(g===null)break;c.push(g)}p=await i({dal:e});let _=await r(e);d=_.recorded,u=_.failed,m=await OE(e,s,a,l)}catch(_){l.last_error=_ instanceof Error?_.message:String(_);try{e.raiseAttention({kind:"daemon_worker_failed",severity:"error",payload:JSON.stringify({error:l.last_error})})}catch{}}finally{l.in_flight=!1,l.cycles+=1,l.last_jobs_processed=c.length,l.last_session_sizes_recorded=d,l.last_session_size_failures=u,l.last_intake_scanned=f.reduce((_,g)=>_+g.scanned,0),l.last_intake_new_jobs=f.reduce((_,g)=>_+g.new_jobs,0),l.last_intake_failures=f.filter(_=>_.error!==void 0).length,l.last_session_hung_detected=m?.hung_detected??0,l.last_mailbox_relay_scanned=p.scanned,l.last_mailbox_relay_delivered=p.delivered,l.last_mailbox_relay_errors=p.errors,l.jobs_processed+=c.length,l.last_finished_at=new Date().toISOString()}return{jobs_processed:c.length,outcomes:c,session_sizes_recorded:d,session_size_failures:u,intake:f,session_monitor:m,mailbox_relay:p}}function JD(){return{scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0}}async function OE(e,t,r,n){let s=yc(e,r),i=Date.now();if(n.last_session_monitor_checked_at!==null){let o=Date.parse(n.last_session_monitor_checked_at);if(Number.isFinite(o)&&i-o<s)return null}n.last_session_monitor_checked_at=new Date(i).toISOString(),n.last_session_monitor_error=null;try{return await t({dal:e,nowMs:i})}catch(o){n.last_session_monitor_error=o instanceof Error?o.message:String(o);try{e.raiseAttention({kind:"daemon_session_monitor_failed",severity:"error",payload:JSON.stringify({error:n.last_session_monitor_error})})}catch{}return null}}var Kd=T(()=>{"use strict";Bc();Lo();wd();Mi();Hw();Gw();wc();RE()});function $E(e){let t=e.listMembersInState("in_chat");for(let r of t)e.setMemberState(r.id,"attention_needed","daemon_restarted_mid_chat");return t.length}var CE=T(()=>{"use strict"});import{mkdirSync as XD,readFileSync as GD,readdirSync as VD,statSync as KD,writeFileSync as YD}from"node:fs";import{dirname as zD,join as jE,sep as ME}from"node:path";function ia(e){return{s3:{async send(n){let s=n;switch(s._localfsTag){case DE:return ZD(e,s.input);case PE:return QD(e,s.input);case FE:return eP(e,s.input);default:throw new Error("createLocalFsS3Client: unknown command")}}},commands:{ListObjectsV2Command:Zd,GetObjectCommand:zd,PutObjectCommand:Yd}}}function ZD(e,t){let r=UE(e,t.Key);return XD(zD(r),{recursive:!0}),YD(r,t.Body),{}}function QD(e,t){let r=UE(e,t.Key),n;try{n=GD(r)}catch(i){throw i.code==="ENOENT"?Object.assign(new Error("NoSuchKey"),{name:"NoSuchKey"}):i}let s=n.toString("utf-8");return{Body:{transformToString:async()=>s}}}function eP(e,t){let r=t.Prefix??"";WE(r);let s=tP(e).sort((d,u)=>d.key<u.key?-1:d.key>u.key?1:0).filter(d=>d.key.startsWith(r)),i=t.ContinuationToken;i!==void 0&&i!==""&&(s=s.filter(d=>d.key>i));let o=typeof t.MaxKeys=="number"&&Number.isFinite(t.MaxKeys)&&t.MaxKeys>0?Math.floor(t.MaxKeys):void 0,a=s,l=!1;o!==void 0&&s.length>o&&(a=s.slice(0,o),l=!0);let c={Contents:a.map(d=>({Key:d.key,LastModified:d.lastModified})),IsTruncated:l};return l&&(c.NextContinuationToken=a[a.length-1].key),c}function UE(e,t){return WE(t),jE(e,t)}function WE(e){if(e.split("/").includes(".."))throw new Error(`localfs-s3-client: refusing key/prefix with '..': ${e}`)}function tP(e){let t=[],r=(n,s)=>{let i;try{i=VD(n,{withFileTypes:!0})}catch(o){if(o.code==="ENOENT")return;throw o}for(let o of i){let a=s===""?o.name:`${s}/${o.name}`,l=jE(n,o.name);if(o.isDirectory())r(l,a);else if(o.isFile()){let c=ME==="/"?a:a.split(ME).join("/");t.push({key:c,lastModified:KD(l).mtime})}}};return r(e,""),t}var DE,PE,FE,Yd,zd,Zd,Qd=T(()=>{"use strict";DE="localfs-put",PE="localfs-get",FE="localfs-list",Yd=class{input;_localfsTag=DE;constructor(t){this.input=t}},zd=class{input;_localfsTag=PE;constructor(t){this.input=t}},Zd=class{input;_localfsTag=FE;constructor(t){this.input=t}}});function BE(){return{put:0,get:0,list:0}}function eu(e,t=rP){return e.put*t.putUsd+e.get*t.getUsd+e.list*t.listUsd}function tu(e){let t=new Date(e),r=t.getUTCFullYear(),n=String(t.getUTCMonth()+1).padStart(2,"0");return`${r}-${n}`}var rP,oa,ru=T(()=>{"use strict";rP={putUsd:5e-6,getUsd:40000000000000003e-23,listUsd:5e-6};oa=class{counts=BE();record(t,r=1){this.counts[t]+=r}peek(){return{...this.counts}}drain(){let t={...this.counts};return this.counts=BE(),t}estimateCostUsd(t){return eu(this.counts,t)}}});function qE(e){let t=e.now??Date.now,r=e.timers??nP,n=null,s=null;async function i(){let l=t(),c=tu(l),d=e.meter.drain();(d.put>0||d.get>0||d.list>0)&&e.store.addUsage({user_id:e.userId,device_id:e.deviceId,period:c,put:d.put,get:d.get,list:d.list,updated_at:new Date(l).toISOString()});let u=e.store.loadUsage(e.userId,e.deviceId,c),f=u?{put:u.put_count,get:u.get_count,list:u.list_count}:{put:0,get:0,list:0};if(e.publishOwnRollup!==void 0)try{await e.publishOwnRollup(c,f)}catch(_){e.log?.(`[usage] publish rollup failed: ${_ instanceof Error?_.message:String(_)}`)}let m=f;if(e.readUserTotal!==void 0)try{m=await e.readUserTotal(c)}catch(_){e.log?.(`[usage] read user total failed: ${_ instanceof Error?_.message:String(_)}`),m=f}let p=eu(m);if(n!==c&&p>=e.ceilingUsd){n=c,e.log?.(`[usage] quota exceeded period=${c} cost=$${p.toFixed(4)} >= ceiling $${e.ceilingUsd}`);try{e.onQuotaExceeded({period:c,costUsd:p,ceilingUsd:e.ceilingUsd})}catch(_){e.log?.(`[usage] onQuotaExceeded threw: ${_ instanceof Error?_.message:String(_)}`)}}}function o(){return s=(s??Promise.resolve()).then(()=>i()).catch(()=>{}),s}let a=r.setInterval(()=>{o()},e.intervalMs);return{stop(){r.clearInterval(a)},flushNow(){return o()},isOverQuota(){return n!==null&&n===tu(t())}}}var nP,HE=T(()=>{"use strict";ru();nP={setInterval:(e,t)=>setInterval(e,t),clearInterval:e=>clearInterval(e)}});var nu=T(()=>{"use strict";jo();Po();Po()});function sP(e){if(typeof e!="object"||e===null||Array.isArray(e))return null;let t=e;if(typeof t.message_id!="string"||t.message_id==="")return null;if(typeof t.reply_to=="string"&&t.reply_to!==""){let s=t.response;if(typeof s!="object"||s===null)return null;let i=s;return typeof i.status!="number"?null:{message_id:t.message_id,reply_to:t.reply_to,response:i}}let r=t.request;if(typeof r!="object"||r===null)return null;let n=r;return typeof n.method!="string"||n.method===""||typeof n.path!="string"||n.path===""?null:{message_id:t.message_id,request:n}}function iP(e){return e.reply_to!==void 0&&e.response!==void 0}function oP(e){if(typeof e!="object"||e===null)return;let t=e.conversation_id;return typeof t=="string"?t:void 0}function JE(e){let t=e.reason;if(t!==void 0)return t;try{return new DOMException("Aborted","AbortError")}catch{let r=new Error("Aborted");return r.name="AbortError",r}}var aa,Is,XE=T(()=>{"use strict";nu();aa=class extends Error{name="MailboxFetchStoppedError";code="mailbox_fetch_stopped";constructor(t="MailboxFetchClient stopped before a response arrived"){super(t)}},Is=class{client;log;now;random;pending=new Map;requestHandler=null;stopped=!1;constructor(t){this.client=t.client,this.log=t.log??(()=>{}),this.now=t.now??Date.now,this.random=t.random??Math.random}onRequest(t){if(this.requestHandler!==null)throw new Error("MailboxFetchClient: onRequest handler already registered");this.requestHandler=t}async fetch(t,r){if(this.stopped)throw new aa("MailboxFetchClient.fetch after stop()");if(typeof t.path!="string"||t.path==="")throw new Error("MailboxFetchClient.fetch: request.path is required");let n=t.method;if(typeof n!="string"||n==="")throw new Error("MailboxFetchClient.fetch: request.method is required");let s=Yt(this.now(),this.random);if(this.pending.has(s))throw new Error(`MailboxFetchClient.fetch: duplicate message_id=${s}`);let i=r?.conversationId??s,o={message_id:s,request:t};return new Promise((a,l)=>{let c=r?.abortSignal,d;if(c!==void 0){if(c.aborted){l(JE(c));return}d=()=>{this.pending.has(s)&&(this.pending.delete(s),l(JE(c)))},c.addEventListener("abort",d,{once:!0})}this.pending.set(s,{resolve:a,reject:l,...d!==void 0?{abortListener:d}:{},...c!==void 0?{abortSignal:c}:{}}),this.client.putMessage({conversation_id:i,payload:o}).catch(u=>{let f=this.pending.get(s);f!==void 0&&(this.pending.delete(s),f.abortListener!==void 0&&f.abortSignal!==void 0&&f.abortSignal.removeEventListener("abort",f.abortListener),f.reject(u))})})}async stop(){if(this.stopped)return;this.stopped=!0;let t=Array.from(this.pending.values());this.pending.clear();let r=new aa;for(let n of t){n.abortListener!==void 0&&n.abortSignal!==void 0&&n.abortSignal.removeEventListener("abort",n.abortListener);try{n.reject(r)}catch{}}}async handleIncoming(t,r){let n=sP(t);if(n===null){this.log("MailboxFetchClient: dropping non-envelope inbound payload");return}if(iP(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??oP(t)??n.message_id,i;try{i=await this.requestHandler(n.request)}catch(l){let c=l instanceof Error?l.message:String(l),d=typeof l.code=="string"?l.code:"INTERNAL_ERROR";i={status:500,headers:{"content-type":"application/json"},body:{error:d,message:c}}}let a={message_id:Yt(this.now(),this.random),reply_to:n.message_id,response:i};try{await this.client.putMessage({conversation_id:s,payload:a})}catch(l){this.log(`MailboxFetchClient: response PUT failed for reply_to=${n.message_id}: ${l instanceof Error?l.message:String(l)}`)}}}});function su(e){if(typeof e!="object"||e===null||Array.isArray(e))return!1;let t=e;return!(t.kind!=="terminal"||typeof t.session_id!="string"||t.session_id===""||t.direction!=="agent_to_user"&&t.direction!=="user_to_agent"||typeof t.data!="string"||typeof t.ts!="number")}var GE=T(()=>{"use strict"});function iu(e){if(typeof e!="object"||e===null||Array.isArray(e))return!1;let t=e;if(t.kind!=="provider"||typeof t.session_id!="string"||t.session_id===""||t.direction!=="agent_to_user"&&t.direction!=="user_to_agent"||typeof t.ts!="number")return!1;if(t.direction==="agent_to_user"){if(!Array.isArray(t.events))return!1;for(let r of t.events)if(typeof r!="object"||r===null||Array.isArray(r)||typeof r.event_type!="string")return!1}else if(typeof t.user_input!="string")return!1;return!0}var VE=T(()=>{"use strict"});function au(e){if(typeof e!="object"||e===null||Array.isArray(e))return!1;let t=e;if(t.kind!=="daemon_event"||typeof t.event!="string"||t.event===""||typeof t.ts!="number")return!1;if(t.event==="workflows"){if(!Array.isArray(t.workflows))return!1;for(let r of t.workflows){if(typeof r!="object"||r===null||Array.isArray(r))return!1;let n=r;if(typeof n.teamfile_path!="string"||n.teamfile_path===""||n.name!==null&&typeof n.name!="string"||typeof n.registered_at!="string"||n.registered_at===""||n.last_seeded_at!==null&&typeof n.last_seeded_at!="string")return!1}}else if(t.event==="chat_log"){if(typeof t.entry!="object"||t.entry===null||Array.isArray(t.entry))return!1;let r=t.entry;if(typeof r.id!="number"||typeof r.root_teamfile!="string"||r.root_teamfile===""||r.sender_teamfile!==null&&(typeof r.sender_teamfile!="string"||r.sender_teamfile==="")||r.sender_alias!==null&&(typeof r.sender_alias!="string"||r.sender_alias==="")||typeof r.receiver_teamfile!="string"||r.receiver_teamfile===""||typeof r.receiver_alias!="string"||r.receiver_alias===""||typeof r.message!="string"||r.response!==null&&typeof r.response!="string"||typeof r.status!="string"||r.status===""||typeof r.created_at!="string"||r.created_at==="")return!1}return!0}var ou,KE=T(()=>{"use strict";ou="daemon:events"});function zE(e){return{kind:"prompt",prompt_id:e.prompt_id??Yt(e.now?.()??Date.now(),e.random??Math.random),root_teamfile:e.root_teamfile,text:e.text}}function lu(e){if(e===null||typeof e!="object")return!1;let t=e;return t.kind==="prompt"&&typeof t.prompt_id=="string"&&t.prompt_id.length>0&&typeof t.root_teamfile=="string"&&t.root_teamfile.length>0&&typeof t.text=="string"}var YE,cu=T(()=>{"use strict";nu();YE="prompt:root"});function Ns(e){let t=e.split(".");if(t.length<2||t[1]===void 0||t[1]==="")return null;try{let r=JSON.parse(QE(t[1]));return typeof r.sub=="string"&&r.sub!==""?r.sub:null}catch{return null}}function aP(e){let t=e.split(".");if(t.length<2||t[1]===void 0||t[1]==="")return null;try{let r=JSON.parse(QE(t[1]));return typeof r.exp=="number"&&Number.isFinite(r.exp)?r.exp:null}catch{return null}}function ZE(e,t=60){if(typeof e!="string"||e==="")return!0;let r=aP(e);return r===null?!0:Date.now()/1e3>=r-t}function QE(e){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t.padEnd(Math.ceil(t.length/4)*4,"="),n=globalThis.Buffer;return n!==void 0?n.from(r,"base64").toString("utf8"):atob(r)}var du=T(()=>{"use strict"});async function la(e){let t=e.fetchImpl??fetch,r=`https://cognito-idp.${e.region}.amazonaws.com/`,n=await t(r,{method:"POST",headers:{"content-type":"application/x-amz-json-1.1","x-amz-target":lP},body:JSON.stringify({AuthFlow:"REFRESH_TOKEN_AUTH",ClientId:e.clientId,AuthParameters:{REFRESH_TOKEN:e.refreshToken}})}),s=await n.text();if(!n.ok){let l=s;try{let c=JSON.parse(s);l=c.message??c.__type??s}catch{}throw new Error(`cognito_refresh_failed: ${n.status} ${l}`)}let o=JSON.parse(s).AuthenticationResult,a=o?.IdToken;if(typeof a!="string"||a==="")throw new Error("cognito_refresh_no_id_token: InitiateAuth returned no IdToken");return{idToken:a,...typeof o?.AccessToken=="string"&&o.AccessToken!==""?{accessToken:o.AccessToken}:{},...typeof o?.ExpiresIn=="number"&&Number.isFinite(o.ExpiresIn)?{expiresAt:Date.now()+o.ExpiresIn*1e3}:{}}}var lP,uu=T(()=>{"use strict";lP="AWSCognitoIdentityProviderService.InitiateAuth"});import{chmodSync as eT,mkdirSync as tT,readFileSync as rT,writeFileSync as nT}from"node:fs";import{homedir as sT}from"node:os";import{dirname as iT,join as oT}from"node:path";function xs(){return process.env.LMCTL_DEVICE_AUTH_PATH??oT(sT(),".lmctl","device-auth.json")}function aT(){return process.env.LMCTL_TOKEN_PATH??oT(sT(),".lmctl","cli-tokens.json")}function fu(e=xs()){try{let t=JSON.parse(rT(e,"utf8"));return typeof t.userId!="string"||t.userId===""||typeof t.refreshToken!="string"||t.refreshToken===""?null:{userId:t.userId,refreshToken:t.refreshToken}}catch{return null}}function lT(e,t=xs()){tT(iT(t),{recursive:!0,mode:448}),nT(t,JSON.stringify(e,null,2));try{eT(t,384)}catch{}}function mu(e,t=aT()){let r={};try{r=JSON.parse(rT(t,"utf8"))}catch{}let n={...r.cognito??{}};n.idToken=e.idToken,e.accessToken!==void 0&&(n.accessToken=e.accessToken),e.refreshToken!==void 0&&(n.refreshToken=e.refreshToken),e.expiresAt!==void 0&&(n.expiresAt=e.expiresAt);let s={...r,cognito:n};tT(iT(t),{recursive:!0,mode:448}),nT(t,JSON.stringify(s,null,2));try{eT(t,384)}catch{}}async function cT(e){let t=e.deviceAuthPath??xs(),r=fu(t);if(r===null)throw new Error("device_auth_not_found: no ~/.lmctl/device-auth.json; run `lmctl device login` first");let n=await la({region:e.region,clientId:e.clientId,refreshToken:r.refreshToken,...e.fetchImpl!==void 0?{fetchImpl:e.fetchImpl}:{}});return mu({idToken:n.idToken,...n.accessToken!==void 0?{accessToken:n.accessToken}:{},refreshToken:r.refreshToken,...n.expiresAt!==void 0?{expiresAt:n.expiresAt}:{}},e.cliTokensPath??aT()),{idToken:n.idToken,userId:r.userId}}var pu=T(()=>{"use strict";uu()});import{existsSync as cP,realpathSync as dP}from"node:fs";import{dirname as uP}from"node:path";function _u(e){fP(e).catch(t=>{e.log?.(`[mailbox] prompt trigger failed: ${t instanceof Error?t.message:String(t)}`)})}async function fP(e){let t=e.payload.root_teamfile;try{t=dP(e.payload.root_teamfile)}catch(s){let i=`prompt root missing/unreadable: ${e.payload.root_teamfile}: ${s instanceof Error?s.message:String(s)}`;return await Sn(e.store,{rootTeamfile:e.payload.root_teamfile,receiverTeamfile:e.payload.root_teamfile,receiverAlias:"Lead",message:e.payload.text,response:null,status:"error",error_detail:i,log:e.log}),e.log?.(`[mailbox] ${i}`),{status:"error",response:null,error_detail:i}}if(e.store.getRootTeam(t)===null){let s=`prompt root is not registered: ${t}`;return await Sn(e.store,{rootTeamfile:t,receiverTeamfile:t,receiverAlias:"Lead",message:e.payload.text,response:null,status:"error",error_detail:s,log:e.log}),e.log?.(`[mailbox] ${s}`),{status:"error",response:null,error_detail:s}}let r=mP(t);if("error"in r)return await Sn(e.store,{rootTeamfile:t,receiverTeamfile:t,receiverAlias:"Lead",message:e.payload.text,response:null,status:"error",error_detail:r.error,log:e.log}),e.log?.(`[mailbox] ${r.error}`),{status:"error",response:null,error_detail:r.error};let n=hr(e.store,{receiver_teamfile:t,receiver_alias:r.alias,sender_teamfile:`prompt:${e.payload.prompt_id}`,sender_alias:"operator",ttlMs:hP(e.env??process.env)});if(!n.acquired){let s=_P(r.alias,n.current);return await Sn(e.store,{rootTeamfile:t,receiverTeamfile:t,receiverAlias:r.alias,message:e.payload.text,response:null,status:"error",error_detail:s,log:e.log}),e.log?.(`[mailbox] prompt rejected: ${s}`),{status:"error",response:null,error_detail:s}}try{let i=await(e.chat??St)({provider:r.provider,sessionId:r.sessionid,cwd:r.sessiondir,prompt:e.payload.text,env:e.env??process.env,alias:r.alias,permissionMode:"yolo",...e.timeoutMs!==void 0?{timeoutMs:e.timeoutMs}:{}}),o=i.status==="stalled",a=!o&&i.text.trim()==="",l=o?`provider stalled${i.stalledAfterMs!==void 0?` after ${i.stalledAfterMs}ms`:""}`:a?"provider returned empty response":null,c=o||a?"error":"ok";return await Sn(e.store,{rootTeamfile:t,receiverTeamfile:t,receiverAlias:r.alias,message:e.payload.text,response:c==="error"?null:i.text,status:c,error_detail:l,log:e.log}),{status:c,response:c==="error"?null:i.text,error_detail:l}}catch(s){let i=s instanceof Error?s.message:String(s);return await Sn(e.store,{rootTeamfile:t,receiverTeamfile:t,receiverAlias:r.alias,message:e.payload.text,response:null,status:"error",error_detail:i,log:e.log}),e.log?.(`[mailbox] prompt provider error: ${i}`),{status:"error",response:null,error_detail:i}}finally{try{e.store.releaseAgentInflight(n.lease)}catch(s){e.log?.(`[mailbox] failed to release prompt in-flight slot: ${s instanceof Error?s.message:String(s)}`)}}}function mP(e){if(!cP(e))return{error:`prompt root missing/unreadable: ${e}`};let t=je(e);if(t.parseErrors.length>0)return{error:`prompt root parse error: ${t.parseErrors.join("; ")}`};let r=At(t);return r===void 0?{error:`prompt root has no Lead: ${e}`}:r.session===void 0||r.session.trim()===""?{error:`prompt root Lead is unseeded: ${e}`}:{alias:r.alias,provider:r.provider,sessionid:r.session,sessiondir:r.sessiondir??uP(e)}}async function Sn(e,t){let r=fT(t.message),n=t.response===null?null:fT(t.response);try{e.insertTeamChatLog({root_teamfile:t.rootTeamfile,sender_teamfile:t.rootTeamfile,sender_alias:"operator",receiver_teamfile:t.receiverTeamfile,receiver_alias:t.receiverAlias,message:r.text,response:n?.text??null,origin:"unknown",status:t.status,error_detail:t.error_detail,truncated:r.truncated||n?.truncated?1:0,created_at:new Date().toISOString()})}catch(s){t.log?.(`[mailbox] warning: failed to record prompt chat log: ${s instanceof Error?s.message:String(s)}`)}}function fT(e){return e.length<=dT?{text:e,truncated:!1}:{text:e.slice(0,dT),truncated:!0}}function pP(e,t){return`${e} is servicing ${t.sender_alias} (${t.sender_teamfile}) since ${t.started_at}`}function _P(e,t){return t.sender_teamfile.startsWith("prompt:")?`${e} is busy servicing another prompt since ${t.started_at}`:pP(e,t)}function hP(e=process.env){let t=e.LMCTL_INFLIGHT_TTL_MS;if(t===void 0||t.trim()==="")return uT;let r=Number(t);return!Number.isFinite(r)||r<=0?uT:r}var dT,uT,mT=T(()=>{"use strict";vt();zt();Fr();dT=256*1024,uT=30*60*1e3});import{chmodSync as wT,existsSync as gP,mkdirSync as ET,readFileSync as fa,writeFileSync as TT}from"node:fs";import{dirname as hu,resolve as ca,join as bT}from"node:path";import{fileURLToPath as yP}from"node:url";import{homedir as ST}from"node:os";import{CognitoIdentityClient as wP,GetIdCommand as EP}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as pT}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as TP,ListObjectsV2Command as bP,PutObjectCommand as SP,S3Client as _T}from"@aws-sdk/client-s3";function Rs(e={}){let t=e.env??process.env,r=e.tfstatePath!==void 0?[e.tfstatePath]:xP(e.selfUrl),n={},s;for(let I of r)if(gP(I)){n=NP(I),s=I;break}let i=(...I)=>{for(let x of I)if(typeof x=="string"&&x!=="")return x},o=i(t.LMCTL_NEXT_IDENTITY_POOL_ID,n.LMCTL_NEXT_IDENTITY_POOL_ID)??vP,a=i(t.LMCTL_NEXT_COGNITO_USER_POOL_ID,n.LMCTL_NEXT_COGNITO_USER_POOL_ID)??kP,l=i(t.LMCTL_NEXT_MAILBOX_BUCKET,t.LMCTL_NEXT_POLICY_BUCKET,n.LMCTL_NEXT_MAILBOX_BUCKET,n.LMCTL_NEXT_POLICY_BUCKET)??IP,c=i(t.AWS_REGION,t.AWS_DEFAULT_REGION)??"us-east-1",d=i(t.LMCTL_NEXT_COGNITO_CLIENT_ID,n.LMCTL_NEXT_COGNITO_CLIENT_ID)??ma,u=[];o===void 0&&u.push("LMCTL_NEXT_IDENTITY_POOL_ID"),a===void 0&&u.push("LMCTL_NEXT_COGNITO_USER_POOL_ID"),l===void 0&&u.push("LMCTL_NEXT_MAILBOX_BUCKET");let f={missing:u,tfstateCandidatesChecked:r,...s!==void 0?{tfstatePathUsed:s}:{}};if(u.length>0)return f;let m=t.LMCTL_MAILBOX_POLL_MS,p=m!==void 0&&m.length>0?Number(m):void 0,_=ua(t.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),g=ua(t.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),h=ua(t.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),S=ua(t.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),y=i(t.LMCTL_MAILBOX_KEY),w=i(t.LMCTL_TOKEN_PATH);return f.config={identityPoolId:o,cognitoUserPoolId:a,cognitoClientId:d,region:c,mailboxBucket:l,...typeof p=="number"&&Number.isFinite(p)&&p>=100?{pollIntervalMs:p}:{},..._!==void 0?{readIntervalMs:_}:{},...g!==void 0?{heartbeatIdleMs:g}:{},...h!==void 0?{backoffReadIntervalMs:h}:{},...S!==void 0?{chatLogPollIntervalMs:S}:{},...y!==void 0?{mailboxKey:y}:{},...w!==void 0?{tokenPath:w}:{}},f}function NP(e){try{let t=fa(e,"utf8"),n=JSON.parse(t).outputs??{},s={};for(let[i,o]of Object.entries(n))o!==null&&typeof o=="object"&&typeof o.value=="string"&&(s[i]=o.value);return s}catch{return{}}}function xP(e){let t=hu(yP(e??import.meta.url));return[ca(t,"..","..","..","..","infra","terraform","terraform.tfstate"),ca(t,"..","..","..","..","..","infra","terraform","terraform.tfstate"),ca(t,"..","..","..","infra","terraform","terraform.tfstate"),ca(t,"..","..","infra","terraform","terraform.tfstate")]}function ua(e){if(e===void 0||e==="")return;let t=Number(e);if(!(!Number.isFinite(t)||t<=0))return t*1e3}function AP(e){let t=RP(e.intervalMs)??vT,r=Math.max(1,Math.trunc(e.limit??500)),n=e.now??Date.now,s=e.cursorKey!==void 0&&e.store.loadTeamChatLogCursor!==void 0&&e.store.saveTeamChatLogCursor!==void 0?{key:e.cursorKey,load:e.store.loadTeamChatLogCursor.bind(e.store),save:e.store.saveTeamChatLogCursor.bind(e.store)}:null,i,o=!1,a=!1,l=()=>{try{if(s!==null){let u=s.load(s.key);if(u!==null)return i=u.last_pushed_id,!0}return i=e.store.getMaxTeamChatLogId(),s!==null&&s.save({cursor_key:s.key,last_pushed_id:i,updated_at:new Date(n()).toISOString()}),!0}catch(u){return e.log?.(`[mailbox] daemon_event chat_log seed failed: ${u instanceof Error?u.message:String(u)}`),!1}};l();let c=async()=>{if(!(a||o)){o=!0;try{if(i===void 0&&!l())return;let u=e.store.listTeamChatLogSinceId(i,r);for(let f of u){let m={kind:"daemon_event",event:"chat_log",ts:n(),entry:{id:f.id,root_teamfile:f.root_teamfile,sender_teamfile:f.sender_teamfile,sender_alias:f.sender_alias,receiver_teamfile:f.receiver_teamfile,receiver_alias:f.receiver_alias,message:f.message,response:f.response,status:f.status,created_at:f.created_at}};await e.publishDaemonEvent(m),s!==null&&s.save({cursor_key:s.key,last_pushed_id:f.id,updated_at:new Date(n()).toISOString()}),i=Math.max(i,f.id)}}catch(u){e.log?.(`[mailbox] daemon_event chat_log tail failed: ${u instanceof Error?u.message:String(u)}`)}finally{o=!1}}},d=setInterval(()=>{c()},t);return typeof d.unref=="function"&&d.unref(),{pollNow:c,stop(){a=!0,clearInterval(d)}}}function RP(e){return typeof e=="number"&&Number.isFinite(e)&&e>0?e:void 0}async function kT(e){let t=e.tokenPath??bT(ST(),".lmctl","cli-tokens.json"),r=gT(e.tokenPath);if(ZE(r.cognito?.idToken)&&fu()!==null)try{await cT({region:e.region,clientId:e.cognitoClientId??ma,cliTokensPath:t}),r=gT(e.tokenPath),e.log?.("[mx-mailbox] refreshed IdToken from device-auth refresh token")}catch(A){let Q=A instanceof Error?A.message:String(A);e.log?.(`[mx-mailbox] device-auth refresh failed: ${Q}`)}if(r.cognito===void 0)throw new Error("agent_mailbox_not_logged_in: ~/.lmctl/cli-tokens.json has no cognito tokens; run `webcli login` or `lmctl device login` first");let n=r.cognito.idToken;if(typeof n!="string"||n==="")throw new Error("agent_mailbox_no_id_token: cli-tokens.json's cognito.idToken is empty; run `webcli login` or `lmctl device login` first");let s=`cognito-idp.${e.region}.amazonaws.com/${e.cognitoUserPoolId}`,i=r.cognito.identityId,o=!1;i===void 0||i===""?i=await yT({tokenPath:t,region:e.region,identityPoolId:e.identityPoolId,idpProvider:s,idToken:n,log:e.log}):(o=!0,e.log?.(`[mx-mailbox] using cached identityId from cli-tokens (skipping GetId) for ${i}`));let a=pT({identityId:i,logins:{[s]:n},clientConfig:{region:e.region}}),l=new _T({region:e.region,credentials:a}),c={ListObjectsV2Command:bP,GetObjectCommand:TP,PutObjectCommand:SP},d=Ns(n),u=d??i,f=e.deviceId,m=gn({identityId:i,userId:d,deviceId:f,mailboxKey:e.mailboxKey}),p=e.cursorStore,_;if(p!==void 0){let A=p.loadMailboxCursor(u,m);if(A!==null)_=A.last_processed_seq??void 0,e.log?.(`[mx-mailbox] resumed seq cursor=${_??"(sentinel)"} for user_id=${u}`);else{let Q=!1,B=0;for(;!Q&&B<2;){B+=1;try{let k=Co(m,"web"),N=0,L;do{let F=await l.send(new c.ListObjectsV2Command({Bucket:e.mailboxBucket,Prefix:k,MaxKeys:1e3,...L!==void 0?{ContinuationToken:L}:{}}));for(let j of F.Contents??[]){let C=Mo(j.Key??"",m,"web");C!==void 0&&C>N&&(N=C)}L=F.IsTruncated===!0?F.NextContinuationToken:void 0}while(L!==void 0);_=N,e.log?.(`[mx-mailbox] cold start: seeded seq cursor=${N} for user_id=${u}`),Q=!0}catch(k){let N=k instanceof Error?k.message:String(k);if(o&&B===1&&$P(k)){e.log?.(`[mx-mailbox] cached identityId rejected by cognito (${N}); clearing + refreshing`),OP(t),o=!1,i=await yT({tokenPath:t,region:e.region,identityPoolId:e.identityPoolId,idpProvider:s,idToken:n,log:e.log}),a=pT({identityId:i,logins:{[s]:n},clientConfig:{region:e.region}}),l=new _T({region:e.region,credentials:a}),m=gn({identityId:i,userId:d,deviceId:f,mailboxKey:e.mailboxKey});continue}e.log?.(`[mx-mailbox] cold start seq probe failed: ${N}`);break}}p.saveMailboxCursor({user_id:u,mailbox_key:m,last_processed_version_id:null,last_processed_seq:_??null,last_processed_at:new Date().toISOString()})}}let g=null,h=e.terminalSessionManager,S=e.persistentSessionManager,y=e.promptTriggerStore,w=new oa,I=new Dr({bucket:e.mailboxBucket,identityId:i,...d!==null?{userId:d}:{},...f!==void 0?{deviceId:f}:{},...e.mailboxKey!==void 0?{mailboxKey:e.mailboxKey}:{},s3:l,commands:c,selfRole:"agent",onS3Op:A=>w.record(A),onMessage:async A=>{if(h!==void 0&&su(A.payload)){h.onInbound(A.payload);return}if(S!==void 0&&iu(A.payload)){await S.onInbound(A.payload);return}if(!au(A.payload)){if(y!==void 0&&lu(A.payload)){_u({store:y,payload:A.payload,log:e.log});return}g!==null&&await g.handleIncoming(A.payload,A)}},...p!==void 0?{onCursorAdvance:A=>{p.saveMailboxCursor({user_id:u,mailbox_key:m,last_processed_version_id:null,last_processed_seq:A,last_processed_at:new Date().toISOString()})}}:{},..._!==void 0?{cursor:_}:{},...e.pollIntervalMs!==void 0?{pollIntervalMs:e.pollIntervalMs}:{},...e.readIntervalMs!==void 0?{readIntervalMs:e.readIntervalMs}:{},...e.heartbeatIdleMs!==void 0?{heartbeatIdleMs:e.heartbeatIdleMs}:{},...e.backoffReadIntervalMs!==void 0?{backoffReadIntervalMs:e.backoffReadIntervalMs}:{}});g=new Is({client:I,...e.log!==void 0?{log:e.log}:{}}),h!==void 0&&h.setPublish(async A=>I.putMessage({conversation_id:`terminal:${A.session_id}`,payload:A})),S!==void 0&&S.setPublish(async A=>I.putMessage({conversation_id:`provider:${A.session_id}`,payload:A}));let x=A=>I.putMessage({conversation_id:ou,payload:A});I.start();let U=e.chatLogTailStore===void 0?void 0:AP({store:e.chatLogTailStore,publishDaemonEvent:x,cursorKey:m,intervalMs:e.chatLogPollIntervalMs??e.readIntervalMs??e.pollIntervalMs??vT,log:e.log});e.log?.(`[mx-mailbox] agent polling ${m} (bucket=${e.mailboxBucket})`);let ue=e.deviceId??i,W=`${u}/usage/`,M;return M=e.usageStore===void 0?void 0:qE({meter:w,store:e.usageStore,userId:u,deviceId:ue,ceilingUsd:e.usageQuotaUsd??1/0,onQuotaExceeded:({period:A,costUsd:Q,ceilingUsd:B})=>{e.log?.(`[usage] month ${A} cost $${Q.toFixed(4)} >= ceiling $${B} \u2014 blocking mailbox`),I.stop().catch(()=>{}),M?.stop()},publishOwnRollup:async(A,Q)=>{await l.send(new c.PutObjectCommand({Bucket:e.mailboxBucket,Key:`${W}${ue}-${A}.json`,Body:JSON.stringify({...Q,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async A=>{let Q={put:0,get:0,list:0},B;do{let k=await l.send(new c.ListObjectsV2Command({Bucket:e.mailboxBucket,Prefix:W,MaxKeys:1e3,...B!==void 0?{ContinuationToken:B}:{}}));for(let N of k.Contents??[]){let L=N.Key??"";if(L.endsWith(`-${A}.json`))try{let F=await l.send(new c.GetObjectCommand({Bucket:e.mailboxBucket,Key:L}));if(F.Body===void 0)continue;let j=JSON.parse(await F.Body.transformToString("utf-8"));Q.put+=j.put??0,Q.get+=j.get??0,Q.list+=j.list??0}catch{}}B=k.IsTruncated===!0?k.NextContinuationToken:void 0}while(B!==void 0);return Q},intervalMs:e.usageFlushIntervalMs??36e5,...e.log!==void 0?{log:e.log}:{}}),{identityId:i,mailbox:I,fetchClient:g,publishDaemonEvent:x,async stop(){U?.stop(),M!==void 0&&(await M.flushNow().catch(()=>{}),M.stop()),await g.stop().catch(()=>{}),await I.stop().catch(()=>{})}}}async function IT(e){let t=e.s3!==void 0&&e.commands!==void 0?{s3:e.s3,commands:e.commands}:ia(e.rootDir),r=gn({identityId:As,userId:As,deviceId:hT}),n=null,s=e.terminalSessionManager,i=e.persistentSessionManager,o=e.promptTriggerStore,a=new Dr({bucket:"local",identityId:As,userId:As,deviceId:hT,s3:t.s3,commands:t.commands,selfRole:"agent",onMessage:async c=>{if(s!==void 0&&su(c.payload)){s.onInbound(c.payload);return}if(i!==void 0&&iu(c.payload)){await i.onInbound(c.payload);return}if(!au(c.payload)){if(o!==void 0&&lu(c.payload)){_u({store:o,payload:c.payload,log:e.log});return}n!==null&&await n.handleIncoming(c.payload,c)}},pollIntervalMs:e.pollIntervalMs??da,readIntervalMs:e.readIntervalMs??da,heartbeatIdleMs:e.heartbeatIdleMs??da,backoffReadIntervalMs:e.backoffReadIntervalMs??da});n=new Is({client:a,...e.log!==void 0?{log:e.log}:{}}),s!==void 0&&s.setPublish(async c=>a.putMessage({conversation_id:`terminal:${c.session_id}`,payload:c})),i!==void 0&&i.setPublish(async c=>a.putMessage({conversation_id:`provider:${c.session_id}`,payload:c}));let l=c=>a.putMessage({conversation_id:ou,payload:c});return a.start(),e.log?.(`[local-webui] agent polling ${r} (local-fs ${e.rootDir})`),{identityId:As,mailbox:a,fetchClient:n,publishDaemonEvent:l,async stop(){await n.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function gT(e){let t=e??bT(ST(),".lmctl","cli-tokens.json");try{let r=fa(t,"utf8");return JSON.parse(r)}catch{return{}}}function LP(e,t){if(t===void 0||t==="")return;let r={};try{let s=fa(e,"utf8");r=JSON.parse(s)}catch{}if(r.cognito===void 0)return;let n={...r,cognito:{...r.cognito,identityId:t}};ET(hu(e),{recursive:!0,mode:448}),TT(e,JSON.stringify(n,null,2));try{wT(e,384)}catch{}}function OP(e){let t={};try{let n=fa(e,"utf8");t=JSON.parse(n)}catch{return}if(t.cognito===void 0)return;let r={...t,cognito:{...t.cognito}};delete r.cognito.identityId,ET(hu(e),{recursive:!0,mode:448}),TT(e,JSON.stringify(r,null,2));try{wT(e,384)}catch{}}async function yT(e){e.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let r=await new wP({region:e.region}).send(new EP({IdentityPoolId:e.identityPoolId,Logins:{[e.idpProvider]:e.idToken}}));if(r.IdentityId===void 0||r.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{LP(e.tokenPath,r.IdentityId),e.log?.(`[mx-mailbox] persisted identityId=${r.IdentityId} to ${e.tokenPath}`)}catch(n){let s=n instanceof Error?n.message:String(n);e.log?.(`[mx-mailbox] WARNING: identityId persist failed (${s}); will redo GetId on next restart`)}return r.IdentityId}function $P(e){if(e===null||typeof e!="object")return!1;let t=e,r=[typeof t.name=="string"?t.name:void 0,typeof t.Code=="string"?t.Code:void 0,typeof t.__type=="string"?t.__type:void 0];for(let s of r)if(s!==void 0&&(s==="NotAuthorizedException"||s==="ResourceNotFoundException"||s==="InvalidIdentityPoolConfigurationException"||s==="ExpiredTokenException"))return!0;let n=typeof t.message=="string"?t.message:"";return!!(n.includes("NotAuthorizedException")||n.includes("Invalid identity pool configuration")||n.includes("Identity")&&n.includes("not found"))}var vT,da,ma,vP,kP,IP,As,hT,gu=T(()=>{"use strict";Fo();Qd();ru();HE();XE();GE();VE();KE();cu();jo();du();pu();mT();vT=3e3,da=1e3,ma="79u5jhkk46qofog661c9i0bdcs",vP="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",kP="us-east-1_4iUdFggDn",IP="lmctl-next-preview-mailbox-254332045686";As="local",hT="local"});import{spawn as Tu}from"node:child_process";import{createInterface as NT}from"node:readline";var yu,wu,Eu,xT,AT=T(()=>{"use strict";mi();ve();yu=class{child;ctx;rl;nextRpcId=1;pending=new Map;threadId;nextLocalTurnId=1;closed=!1;setResumeThreadId(t){this.threadId=t}async start(t,r){this.ctx=r;let n=Tu(t.command,t.args,{cwd:t.cwd??process.cwd(),env:t.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=n,this.rl=NT({input:n.stdout}),this.rl.on("line",s=>{r.generation===r.currentGeneration()&&this.handleLine(s)}),n.stderr?.on("data",s=>{if(r.generation!==r.currentGeneration())return;let i=s instanceof Buffer?s.toString("utf8"):String(s);r.emit({event_type:"notification",payload:{source:"stderr",text:i}})}),await this.rpc("initialize",{clientInfo:{name:"lmctl-dt3",title:"lmctl DT-3",version:"0.1.0"},capabilities:{experimentalApi:!1}}),this.notify("initialized",{}),this.threadId!==void 0&&this.threadId!=="")try{await this.rpc("thread/resume",{threadId:this.threadId,approvalPolicy:"never",sandbox:"danger-full-access"}),r.emit({event_type:"thread_started",payload:{thread_id:this.threadId,resumed:!0}})}catch{let i=(await this.rpc("thread/start",{cwd:t.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,o=typeof i?.id=="string"?i.id:void 0;this.threadId=o,r.emit({event_type:"thread_started",payload:{thread_id:o,resumed:!1}})}else{let i=(await this.rpc("thread/start",{cwd:t.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,o=typeof i?.id=="string"?i.id:void 0;this.threadId=o,r.emit({event_type:"thread_started",payload:{thread_id:o,resumed:!1}})}return n}async sendTurn(t){if(this.closed)throw new Error("codex_session_closed");if(this.threadId===void 0||this.threadId==="")throw new Error("codex_no_thread_id");let r=`local-${this.nextLocalTurnId++}`;this.ctx?.turnMap.set(r,{startedAt:Date.now()});try{let s=(await this.rpc("turn/start",{threadId:this.threadId,input:[{type:"text",text:t}]})).result?.turn,i=typeof s?.id=="string"?s.id:void 0;if(i!==void 0){let o=this.ctx?.turnMap.get(r);this.ctx?.turnMap.delete(r),o!==void 0&&this.ctx?.turnMap.set(i,o)}}catch(n){throw this.ctx?.turnMap.delete(r),n}}async stop(){if(this.closed=!0,this.rl!==void 0&&(this.rl.close(),this.rl=void 0),this.child?.stdin!==null&&this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}for(let t of this.pending.values())t.reject(new Error("codex_session_stopping"));this.pending.clear()}async rpc(t,r){if(this.child?.stdin===null||this.child===void 0)throw new Error("codex_child_unavailable");return new Promise((n,s)=>{let i=this.nextRpcId++;this.pending.set(i,{resolve:n,reject:s});let o=JSON.stringify({jsonrpc:"2.0",id:i,method:t,params:r});try{this.child.stdin.write(o+`
2045
2045
  `)}catch(a){this.pending.delete(i),s(a instanceof Error?a:new Error(String(a)))}})}notify(t,r){if(this.child?.stdin===null||this.child===void 0)return;let n=JSON.stringify({jsonrpc:"2.0",method:t,params:r});try{this.child.stdin.write(n+`
2046
- `)}catch{}}handleLine(t){if(t.trim()==="")return;let r;try{r=JSON.parse(t)}catch{return}if(typeof r.id=="number"&&this.pending.has(r.id)){let o=this.pending.get(r.id);if(this.pending.delete(r.id),r.error!==void 0){let a=r.error,l=typeof a?.message=="string"&&a.message!==""?a.message:JSON.stringify(r.error);o.reject(new Error(`codex_rpc_error: ${l}`))}else o.resolve(r);return}let n=typeof r.method=="string"?r.method:void 0;if(n===void 0)return;let s=r.params??{},i=this.normalizeNotification(n,s);i!==void 0&&this.ctx?.emit(i)}normalizeNotification(t,r){if(t==="thread/started"){let n=r.thread;return typeof n?.id=="string"&&(this.threadId=n.id),{event_type:"thread_started",payload:{thread_id:this.threadId,raw:r}}}if(t==="turn/started")return{event_type:"turn_started",payload:{turn_id:r.turn?.id,thread_id:this.threadId}};if(t==="item/agentMessage/delta")return{event_type:"assistant_message_delta",payload:{text:typeof r.delta=="string"?r.delta:""}};if(t==="item/started"||t==="item/completed"){let n=r.item;return n?.type!==void 0&&n.type!=="agentMessage"&&n.type!=="userMessage"?{event_type:"tool_call",payload:{name:n.name??n.type,status:t==="item/started"?"started":"completed",item:n}}:{event_type:"notification",payload:{method:t,params:r}}}if(t==="turn/completed"){let n=r.turn;return typeof n?.id=="string"&&this.ctx?.turnMap.delete(n.id),{event_type:"turn_complete",payload:r}}if(t==="error"){let n=r.error;return{event_type:"error",payload:{message:typeof n?.message=="string"?n.message:JSON.stringify(r),raw:r}}}return{event_type:"notification",payload:{method:t,params:r}}}},Eu=class{child;ctx;buffer="";sessionIdSeen;closed=!1;async start(t,r){this.ctx=r;let n=bu(t.command,t.args,{cwd:t.cwd??process.cwd(),env:t.env??process.env,stdio:["pipe","pipe","pipe"]});return this.child=n,n.stdout.on("data",s=>{if(r.generation!==r.currentGeneration())return;let i=s instanceof Buffer?s.toString("utf8"):String(s);this.buffer+=i;let o=this.buffer.split(`
2046
+ `)}catch{}}handleLine(t){if(t.trim()==="")return;let r;try{r=JSON.parse(t)}catch{return}if(typeof r.id=="number"&&this.pending.has(r.id)){let o=this.pending.get(r.id);if(this.pending.delete(r.id),r.error!==void 0){let a=r.error,l=typeof a?.message=="string"&&a.message!==""?a.message:JSON.stringify(r.error);o.reject(new Error(`codex_rpc_error: ${l}`))}else o.resolve(r);return}let n=typeof r.method=="string"?r.method:void 0;if(n===void 0)return;let s=r.params??{},i=this.normalizeNotification(n,s);i!==void 0&&this.ctx?.emit(i)}normalizeNotification(t,r){if(t==="thread/started"){let n=r.thread;return typeof n?.id=="string"&&(this.threadId=n.id),{event_type:"thread_started",payload:{thread_id:this.threadId,raw:r}}}if(t==="turn/started")return{event_type:"turn_started",payload:{turn_id:r.turn?.id,thread_id:this.threadId}};if(t==="item/agentMessage/delta")return{event_type:"assistant_message_delta",payload:{text:typeof r.delta=="string"?r.delta:""}};if(t==="item/started"||t==="item/completed"){let n=r.item;return n?.type!==void 0&&n.type!=="agentMessage"&&n.type!=="userMessage"?{event_type:"tool_call",payload:{name:n.name??n.type,status:t==="item/started"?"started":"completed",item:n}}:{event_type:"notification",payload:{method:t,params:r}}}if(t==="turn/completed"){let n=r.turn;return typeof n?.id=="string"&&this.ctx?.turnMap.delete(n.id),{event_type:"turn_complete",payload:r}}if(t==="error"){let n=r.error;return{event_type:"error",payload:{message:typeof n?.message=="string"?n.message:JSON.stringify(r),raw:r}}}return{event_type:"notification",payload:{method:t,params:r}}}},wu=class{child;ctx;buffer="";sessionIdSeen;closed=!1;async start(t,r){this.ctx=r;let n=Tu(t.command,t.args,{cwd:t.cwd??process.cwd(),env:t.env??process.env,stdio:["pipe","pipe","pipe"]});return this.child=n,n.stdout.on("data",s=>{if(r.generation!==r.currentGeneration())return;let i=s instanceof Buffer?s.toString("utf8"):String(s);this.buffer+=i;let o=this.buffer.split(`
2047
2047
  `);this.buffer=o.pop()??"";for(let a of o)this.handleLine(a)}),n.stderr?.on("data",s=>{if(r.generation!==r.currentGeneration())return;let i=s instanceof Buffer?s.toString("utf8"):String(s);r.emit({event_type:"notification",payload:{source:"stderr",text:i}})}),n}async sendTurn(t){if(this.closed)throw new Error("claude_session_closed");if(this.child===void 0||this.child.stdin===null)throw new Error("claude_child_unavailable");let r=`claude-${Date.now()}`;this.ctx?.turnMap.set(r,{startedAt:Date.now()});let n=JSON.stringify({type:"user",message:{role:"user",content:t}});try{this.child.stdin.write(n+`
2048
- `)}catch(s){throw this.ctx?.turnMap.delete(r),s instanceof Error?s:new Error(String(s))}}async stop(){if(this.closed=!0,this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}}handleLine(t){if(t.trim()==="")return;let r;try{r=JSON.parse(t)}catch{return}let n=typeof r.type=="string"?r.type:"";if(n==="system"&&r.subtype==="init"){let s=typeof r.session_id=="string"?r.session_id:void 0;s!==void 0&&s!==this.sessionIdSeen&&(this.sessionIdSeen=s,this.ctx?.emit({event_type:"thread_started",payload:{thread_id:s,raw:r}}));return}if(n==="assistant"){let i=r.message?.content;if(Array.isArray(i))for(let o of i)o.type==="text"&&typeof o.text=="string"&&o.text!==""&&this.ctx?.emit({event_type:"assistant_message_delta",payload:{text:o.text}});return}if(n==="result"){let s=typeof r.session_id=="string"?r.session_id:void 0;for(let i of Array.from(this.ctx?.turnMap.keys()??[]))this.ctx?.turnMap.delete(i);this.ctx?.emit({event_type:"turn_complete",payload:{result:r.result,session_id:s,raw:r}});return}this.ctx?.emit({event_type:"notification",payload:{method:n,params:r}})}},Tu=class{child;ctx;rl;nextRpcId=1;pending=new Map;sessionId;closed=!1;async start(t,r){this.ctx=r;let n=t.cwd??process.cwd();if(t.provider==="opencode")try{fi(n)}catch(a){V({event:"opencode_config_install_failed",cwd:n,error_message:a instanceof Error?a.message:String(a)})}let s=bu(t.command,t.args,{cwd:n,env:t.env??process.env,stdio:["pipe","pipe","pipe"]});this.child=s,this.rl=NT({input:s.stdout}),this.rl.on("line",a=>{r.generation===r.currentGeneration()&&this.handleLine(a)}),s.stderr?.on("data",a=>{if(r.generation!==r.currentGeneration())return;let l=a instanceof Buffer?a.toString("utf8"):String(a);r.emit({event_type:"notification",payload:{source:"stderr",text:l}})}),await this.rpc("initialize",{protocolVersion:1,clientInfo:{name:"lmctl-dt3",version:"0.1.0"},clientCapabilities:{}}),this.notify("notifications/initialized",{});let o=(await this.rpc("session/new",{cwd:t.cwd??process.cwd(),mcpServers:[]})).result;return this.sessionId=typeof o?.sessionId=="string"?o.sessionId:void 0,r.emit({event_type:"thread_started",payload:{thread_id:this.sessionId,raw:o}}),s}async sendTurn(t){if(this.closed)throw new Error("acp_session_closed");if(this.sessionId===void 0)throw new Error("acp_no_session_id");let r=`acp-${Date.now()}`;this.ctx?.turnMap.set(r,{startedAt:Date.now()});try{let s=(await this.rpc("session/prompt",{sessionId:this.sessionId,prompt:[{type:"text",text:t}]})).result;this.ctx?.emit({event_type:"turn_complete",payload:{stopReason:s?.stopReason,raw:s}})}finally{this.ctx?.turnMap.delete(r)}}async stop(){if(this.closed=!0,this.rl!==void 0&&(this.rl.close(),this.rl=void 0),this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}for(let t of this.pending.values())t.reject(new Error("acp_session_stopping"));this.pending.clear()}async rpc(t,r){if(this.child?.stdin===null||this.child===void 0)throw new Error("acp_child_unavailable");return new Promise((n,s)=>{let i=this.nextRpcId++;this.pending.set(i,{resolve:n,reject:s});let o=JSON.stringify({jsonrpc:"2.0",id:i,method:t,params:r});try{this.child.stdin.write(o+`
2048
+ `)}catch(s){throw this.ctx?.turnMap.delete(r),s instanceof Error?s:new Error(String(s))}}async stop(){if(this.closed=!0,this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}}handleLine(t){if(t.trim()==="")return;let r;try{r=JSON.parse(t)}catch{return}let n=typeof r.type=="string"?r.type:"";if(n==="system"&&r.subtype==="init"){let s=typeof r.session_id=="string"?r.session_id:void 0;s!==void 0&&s!==this.sessionIdSeen&&(this.sessionIdSeen=s,this.ctx?.emit({event_type:"thread_started",payload:{thread_id:s,raw:r}}));return}if(n==="assistant"){let i=r.message?.content;if(Array.isArray(i))for(let o of i)o.type==="text"&&typeof o.text=="string"&&o.text!==""&&this.ctx?.emit({event_type:"assistant_message_delta",payload:{text:o.text}});return}if(n==="result"){let s=typeof r.session_id=="string"?r.session_id:void 0;for(let i of Array.from(this.ctx?.turnMap.keys()??[]))this.ctx?.turnMap.delete(i);this.ctx?.emit({event_type:"turn_complete",payload:{result:r.result,session_id:s,raw:r}});return}this.ctx?.emit({event_type:"notification",payload:{method:n,params:r}})}},Eu=class{child;ctx;rl;nextRpcId=1;pending=new Map;sessionId;closed=!1;async start(t,r){this.ctx=r;let n=t.cwd??process.cwd();if(t.provider==="opencode")try{fi(n)}catch(a){V({event:"opencode_config_install_failed",cwd:n,error_message:a instanceof Error?a.message:String(a)})}let s=Tu(t.command,t.args,{cwd:n,env:t.env??process.env,stdio:["pipe","pipe","pipe"]});this.child=s,this.rl=NT({input:s.stdout}),this.rl.on("line",a=>{r.generation===r.currentGeneration()&&this.handleLine(a)}),s.stderr?.on("data",a=>{if(r.generation!==r.currentGeneration())return;let l=a instanceof Buffer?a.toString("utf8"):String(a);r.emit({event_type:"notification",payload:{source:"stderr",text:l}})}),await this.rpc("initialize",{protocolVersion:1,clientInfo:{name:"lmctl-dt3",version:"0.1.0"},clientCapabilities:{}}),this.notify("notifications/initialized",{});let o=(await this.rpc("session/new",{cwd:t.cwd??process.cwd(),mcpServers:[]})).result;return this.sessionId=typeof o?.sessionId=="string"?o.sessionId:void 0,r.emit({event_type:"thread_started",payload:{thread_id:this.sessionId,raw:o}}),s}async sendTurn(t){if(this.closed)throw new Error("acp_session_closed");if(this.sessionId===void 0)throw new Error("acp_no_session_id");let r=`acp-${Date.now()}`;this.ctx?.turnMap.set(r,{startedAt:Date.now()});try{let s=(await this.rpc("session/prompt",{sessionId:this.sessionId,prompt:[{type:"text",text:t}]})).result;this.ctx?.emit({event_type:"turn_complete",payload:{stopReason:s?.stopReason,raw:s}})}finally{this.ctx?.turnMap.delete(r)}}async stop(){if(this.closed=!0,this.rl!==void 0&&(this.rl.close(),this.rl=void 0),this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}for(let t of this.pending.values())t.reject(new Error("acp_session_stopping"));this.pending.clear()}async rpc(t,r){if(this.child?.stdin===null||this.child===void 0)throw new Error("acp_child_unavailable");return new Promise((n,s)=>{let i=this.nextRpcId++;this.pending.set(i,{resolve:n,reject:s});let o=JSON.stringify({jsonrpc:"2.0",id:i,method:t,params:r});try{this.child.stdin.write(o+`
2049
2049
  `)}catch(a){this.pending.delete(i),s(a instanceof Error?a:new Error(String(a)))}})}notify(t,r){if(this.child?.stdin===null||this.child===void 0)return;let n=JSON.stringify({jsonrpc:"2.0",method:t,params:r});try{this.child.stdin.write(n+`
2050
2050
  `)}catch{}}handleLine(t){if(t.trim()==="")return;let r;try{r=JSON.parse(t)}catch{return}if(typeof r.id=="number"&&this.pending.has(r.id)){let s=this.pending.get(r.id);if(this.pending.delete(r.id),r.error!==void 0){let i=r.error,o=typeof i?.message=="string"&&i.message!==""?i.message:JSON.stringify(r.error);s.reject(new Error(`acp_rpc_error: ${o}`))}else s.resolve(r);return}let n=typeof r.method=="string"?r.method:void 0;if(n!==void 0){if(typeof r.id=="number"){let s=JSON.stringify({jsonrpc:"2.0",id:r.id,error:{code:-32601,message:`Method not found: ${n} (lmctl dt-3 does not implement server-side ACP methods)`}});try{this.child?.stdin?.write(s+`
2051
- `)}catch{}this.ctx?.emit({event_type:"notification",payload:{kind:"unhandled_request",method:n,id:r.id,params:r.params}});return}if(n==="session/update"){let s=r.params,i=s?.update;if((typeof i?.sessionUpdate=="string"?i.sessionUpdate:"")==="agent_message_chunk"){let a=i?.content,l=typeof a?.text=="string"?a.text:"";if(l!==""){this.ctx?.emit({event_type:"assistant_message_delta",payload:{text:l}});return}}this.ctx?.emit({event_type:"notification",payload:{method:n,params:s}});return}this.ctx?.emit({event_type:"notification",payload:{method:n,params:r.params}})}}},xT=e=>{switch(e){case"codex":return new wu;case"claude":case"qwen":return new Eu;case"gemini":case"copilot":case"opencode":return new Tu;default:throw new Error(`no_persistent_adapter_for_provider: ${e}`)}}});import{randomUUID as CP}from"node:crypto";import{existsSync as vz,mkdirSync as MP,readFileSync as jP,writeFileSync as DP}from"node:fs";import{homedir as PP}from"node:os";import{dirname as FP,join as UP}from"node:path";function pa(){return process.env.LMCTL_DEVICE_FILE??UP(PP(),".lmctl","device.json")}function Br(e=pa()){let t=process.env.LMCTL_DEVICE_ID;if(t!==void 0&&t!=="")return{device_id:t,created_at:"env"};try{let r=JSON.parse(jP(e,"utf8"));return typeof r.device_id!="string"||r.device_id===""?null:{device_id:r.device_id,created_at:typeof r.created_at=="string"?r.created_at:""}}catch{return null}}function Su(e=pa()){let t=Br(e);if(t!==null&&t.created_at!=="env")return t;let r={device_id:CP(),created_at:new Date().toISOString()};return MP(FP(e),{recursive:!0}),DP(e,`${JSON.stringify(r,null,2)}
2052
- `,{encoding:"utf8",mode:384}),r}var vu=T(()=>{"use strict"});import*as RT from"node:child_process";function BP(e,t){try{let r=t(e,["--version"],{encoding:"utf-8",timeout:5e3});return r.status===0?{found:!0,version:(r.stdout??"").toString().trim().split(/\r?\n/,1)[0]?.trim()||void 0}:r.status===null?{found:!1,failureMode:"not installed"}:{found:!1,failureMode:"runs but failed"}}catch{return{found:!1,failureMode:"not installed"}}}function ku(e,t={}){let r=t.spawnSync===void 0&&process.env[qP]==="1",n=t.spawnSync??RT.spawnSync,s=new Set,i=[];for(let o of e){if(s.has(o))continue;s.add(o);let a=_a[o];if(!a){i.push({provider:o,binary:"<unknown>",found:!1,failureMode:"not installed"});continue}if(r){i.push({provider:o,binary:a,found:!0,version:"(skipped)"});continue}let l=BP(a,n);l.found?i.push({provider:o,binary:a,found:!0,version:l.version}):i.push({provider:o,binary:a,found:!1,failureMode:l.failureMode})}return i}function LT(e){if(e.binary==="<unknown>")return`unknown provider "${e.provider}" \u2014 no binary mapping (allowed: ${Object.keys(_a).join(", ")})`;let t=WP[e.provider],r=t?` (install via ${t})`:"";return e.failureMode==="runs but failed"?`provider "${e.provider}" binary '${e.binary}' found but \`${e.binary} --version\` failed to run cleanly \u2014 check install integrity${r}`:`provider "${e.provider}" binary '${e.binary}' not installed${r}`}var _a,WP,qP,OT=T(()=>{"use strict";_a={claude:"claude",codex:"codex",copilot:"copilot",gemini:"gemini",opencode:"opencode",lmplayer:"lmplayer",qwen:"qwen",agy:"agy"},WP={claude:"https://docs.claude.com/code",codex:"https://github.com/openai/codex",copilot:"https://docs.github.com/copilot/cli",gemini:"https://github.com/google-gemini/gemini-cli",opencode:"https://opencode.ai",lmplayer:"Install lmplayer and ensure the lmplayer binary is on PATH.",qwen:"https://github.com/QwenLM/qwen-code",agy:"https://antigravity.google"};qP="LMCTL_SKIP_BINARY_CHECK"});var BT={};ye(BT,{ProviderBinaryPreflightError:()=>ha,__setProviderBinaryCheckForTest:()=>ZP,bootstrapAgentRestMailbox:()=>MT,publishRegisteredWorkflowsOnStart:()=>CT,resolveLocalMailboxDir:()=>UT,resolveLocalWebuiDir:()=>FT,resolveServeConfig:()=>jT,runProviderBinaryPreflight:()=>PT,runServe:()=>VP,validateServeArgs:()=>WT});import{randomBytes as HP}from"node:crypto";import{existsSync as JP}from"node:fs";import{homedir as XP}from"node:os";import{isAbsolute as $T,resolve as Iu}from"node:path";async function VP(e,t={stdout:process.stdout,stderr:process.stderr}){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(GP),0;let r=WT(e,process.env);if(typeof r=="string")return t.stderr.write(`error: ${r}
2051
+ `)}catch{}this.ctx?.emit({event_type:"notification",payload:{kind:"unhandled_request",method:n,id:r.id,params:r.params}});return}if(n==="session/update"){let s=r.params,i=s?.update;if((typeof i?.sessionUpdate=="string"?i.sessionUpdate:"")==="agent_message_chunk"){let a=i?.content,l=typeof a?.text=="string"?a.text:"";if(l!==""){this.ctx?.emit({event_type:"assistant_message_delta",payload:{text:l}});return}}this.ctx?.emit({event_type:"notification",payload:{method:n,params:s}});return}this.ctx?.emit({event_type:"notification",payload:{method:n,params:r.params}})}}},xT=e=>{switch(e){case"codex":return new yu;case"claude":case"qwen":return new wu;case"gemini":case"copilot":case"opencode":return new Eu;default:throw new Error(`no_persistent_adapter_for_provider: ${e}`)}}});import{randomUUID as CP}from"node:crypto";import{existsSync as xz,mkdirSync as MP,readFileSync as jP,writeFileSync as DP}from"node:fs";import{homedir as PP}from"node:os";import{dirname as FP,join as UP}from"node:path";function pa(){return process.env.LMCTL_DEVICE_FILE??UP(PP(),".lmctl","device.json")}function Br(e=pa()){let t=process.env.LMCTL_DEVICE_ID;if(t!==void 0&&t!=="")return{device_id:t,created_at:"env"};try{let r=JSON.parse(jP(e,"utf8"));return typeof r.device_id!="string"||r.device_id===""?null:{device_id:r.device_id,created_at:typeof r.created_at=="string"?r.created_at:""}}catch{return null}}function bu(e=pa()){let t=Br(e);if(t!==null&&t.created_at!=="env")return t;let r={device_id:CP(),created_at:new Date().toISOString()};return MP(FP(e),{recursive:!0}),DP(e,`${JSON.stringify(r,null,2)}
2052
+ `,{encoding:"utf8",mode:384}),r}var Su=T(()=>{"use strict"});import*as RT from"node:child_process";function BP(e,t){try{let r=t(e,["--version"],{encoding:"utf-8",timeout:5e3});return r.status===0?{found:!0,version:(r.stdout??"").toString().trim().split(/\r?\n/,1)[0]?.trim()||void 0}:r.status===null?{found:!1,failureMode:"not installed"}:{found:!1,failureMode:"runs but failed"}}catch{return{found:!1,failureMode:"not installed"}}}function vu(e,t={}){let r=t.spawnSync===void 0&&process.env[qP]==="1",n=t.spawnSync??RT.spawnSync,s=new Set,i=[];for(let o of e){if(s.has(o))continue;s.add(o);let a=_a[o];if(!a){i.push({provider:o,binary:"<unknown>",found:!1,failureMode:"not installed"});continue}if(r){i.push({provider:o,binary:a,found:!0,version:"(skipped)"});continue}let l=BP(a,n);l.found?i.push({provider:o,binary:a,found:!0,version:l.version}):i.push({provider:o,binary:a,found:!1,failureMode:l.failureMode})}return i}function LT(e){if(e.binary==="<unknown>")return`unknown provider "${e.provider}" \u2014 no binary mapping (allowed: ${Object.keys(_a).join(", ")})`;let t=WP[e.provider],r=t?` (install via ${t})`:"";return e.failureMode==="runs but failed"?`provider "${e.provider}" binary '${e.binary}' found but \`${e.binary} --version\` failed to run cleanly \u2014 check install integrity${r}`:`provider "${e.provider}" binary '${e.binary}' not installed${r}`}var _a,WP,qP,OT=T(()=>{"use strict";_a={claude:"claude",codex:"codex",copilot:"copilot",gemini:"gemini",opencode:"opencode",lmplayer:"lmplayer",qwen:"qwen",agy:"agy"},WP={claude:"https://docs.claude.com/code",codex:"https://github.com/openai/codex",copilot:"https://docs.github.com/copilot/cli",gemini:"https://github.com/google-gemini/gemini-cli",opencode:"https://opencode.ai",lmplayer:"Install lmplayer and ensure the lmplayer binary is on PATH.",qwen:"https://github.com/QwenLM/qwen-code",agy:"https://antigravity.google"};qP="LMCTL_SKIP_BINARY_CHECK"});var BT={};ye(BT,{ProviderBinaryPreflightError:()=>ha,__setProviderBinaryCheckForTest:()=>ZP,bootstrapAgentRestMailbox:()=>MT,publishRegisteredWorkflowsOnStart:()=>CT,resolveLocalMailboxDir:()=>UT,resolveLocalWebuiDir:()=>FT,resolveServeConfig:()=>jT,runProviderBinaryPreflight:()=>PT,runServe:()=>VP,validateServeArgs:()=>WT});import{randomBytes as HP}from"node:crypto";import{existsSync as JP}from"node:fs";import{homedir as XP}from"node:os";import{isAbsolute as $T,resolve as ku}from"node:path";async function VP(e,t={stdout:process.stdout,stderr:process.stderr}){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(GP),0;let r=WT(e,process.env);if(typeof r=="string")return t.stderr.write(`error: ${r}
2053
2053
  `),2;try{PT(t)}catch(y){return 1}let n=Ie({path:le()}),s={portCli:QP(e)},i;try{i=jT({dal:n,cli:s,env:process.env,parsed:r,io:t})}catch(y){return n.close(),t.stderr.write(`error: ${y instanceof Error?y.message:String(y)}
2054
2054
  `),2}process.env.LMCTL_API_URL=i.apiUrl,process.env.LMCTL_API_TOKEN=i.apiToken,process.env.LMCTL_API_PORT=String(i.port),$E(n);let o;if(r.localWebui!==void 0){let y=FT(r.localWebui.dir,process.env);if(y===null)return t.stderr.write("error: --webui requires a local SPA build directory: pass `lmctl serve --webui <dir>` or set LMCTL_LOCAL_WEBUI_DIR to a directory containing index.html\n"),n.close(),2;let w=UT(process.env),{s3:I,commands:x}=ia(w);o={webuiDir:y,rootDir:w,s3:I,commands:x},t.stdout.write(`local webui: serving SPA from ${y}; mailbox store ${w}
2055
2055
  `)}let a=r.noDaemon?void 0:LE({dal:n,intervalMs:ks()}),l=o!==void 0?{missing:[],tfstateCandidatesChecked:[]}:Rs({env:process.env});l.missing.length>0&&t.stderr.write(`[lmctl-next-agent] mailbox transport not configured: missing ${l.missing.join(", ")}; running without cloud sync`+(l.tfstatePathUsed===void 0?` (no terraform.tfstate found; checked ${l.tfstateCandidatesChecked.length} candidate path${l.tfstateCandidatesChecked.length===1?"":"s"})`:` (terraform.tfstate at ${l.tfstatePathUsed} did not supply the missing fields)`)+`
@@ -2063,10 +2063,10 @@ ${e.receipt}`:`relay delivery error: ${e.error}`}function BD(e,t){let r=t.LMCTL_
2063
2063
  `)})),e.io?.stderr.write(`[mailbox] dg-2 agent runtime started (identity=${t.identityId})
2064
2064
  `)}catch(r){let n=r instanceof Error?r.message:String(r);e.io?.stderr.write(`[mailbox] dg-2 agent runtime NOT started: ${n}
2065
2065
  `)}return{...t!==void 0?{mailbox:t}:{},async stop(){t!==void 0&&await t.stop()}}}function jT(e){let{dal:t,cli:r,env:n,parsed:s,io:i}=e,o=[],a,l=t.getConfig("api.port");if(r.portCli!==void 0)a=r.portCli;else if(l!==null){let m=Number(l);if(!Number.isInteger(m)||m<=0||m>65535)throw new Error(`invalid api.port in lmctl_config: ${l}`);a=m}else if(n.LMCTL_API_PORT!==void 0&&n.LMCTL_API_PORT.length>0){let m=Number(n.LMCTL_API_PORT);if(!Number.isInteger(m)||m<=0||m>65535)throw new Error(`invalid LMCTL_API_PORT: ${n.LMCTL_API_PORT}`);a=m,o.push("api.port")}else a=s.port;let c,d=t.getConfig("api.token");d!==null?c=d:n.LMCTL_API_TOKEN!==void 0&&n.LMCTL_API_TOKEN.length>0?(c=n.LMCTL_API_TOKEN,o.push("api.token")):(c=HP(32).toString("hex"),t.setConfig("api.token",c),i.stdout.write("Generated initial api.token; view via `lmctl api config get api.token`\n"));let u,f=t.getConfig("api.url");f!==null?u=f:n.LMCTL_API_URL!==void 0&&n.LMCTL_API_URL.length>0?(u=n.LMCTL_API_URL,o.push("api.url")):(u=`http://127.0.0.1:${a}`,t.setConfig("api.url",u));for(let m of o)i.stderr.write(`note: ${YP(m)} env var used as fallback for ${m}; consider \`lmctl api config set ${m} ...\` to make this DB-canonical.
2066
- `);return{port:a,apiUrl:u,apiToken:c}}function YP(e){switch(e){case"api.port":return"LMCTL_API_PORT";case"api.token":return"LMCTL_API_TOKEN";case"api.url":return"LMCTL_API_URL";default:return`LMCTL_${e.replaceAll(".","_").toUpperCase()}`}}async function zP(e){let t;try{t=await import("node-pty")}catch(r){let n=r instanceof Error?r.message:String(r);e.log(`[dt-2] node-pty not available; terminal routes will return 503 (${n})`);return}return new qo({pty:{spawn:t.spawn.bind(t)},publish:async()=>{throw new Error("terminal_publish_not_wired: mailbox runtime has not bound the publish hook yet")},log:e.log})}function ZP(e){DT=e??ku}function PT(e){let t=Object.keys(_a),r=DT(t),n=r.filter(i=>!i.found);if(n.length>0){for(let i of n)e.stderr.write(`error: ${LT(i)}
2066
+ `);return{port:a,apiUrl:u,apiToken:c}}function YP(e){switch(e){case"api.port":return"LMCTL_API_PORT";case"api.token":return"LMCTL_API_TOKEN";case"api.url":return"LMCTL_API_URL";default:return`LMCTL_${e.replaceAll(".","_").toUpperCase()}`}}async function zP(e){let t;try{t=await import("node-pty")}catch(r){let n=r instanceof Error?r.message:String(r);e.log(`[dt-2] node-pty not available; terminal routes will return 503 (${n})`);return}return new qo({pty:{spawn:t.spawn.bind(t)},publish:async()=>{throw new Error("terminal_publish_not_wired: mailbox runtime has not bound the publish hook yet")},log:e.log})}function ZP(e){DT=e??vu}function PT(e){let t=Object.keys(_a),r=DT(t),n=r.filter(i=>!i.found);if(n.length>0){for(let i of n)e.stderr.write(`error: ${LT(i)}
2067
2067
  `);throw e.stderr.write(`error: agent refusing to start; ensure missing provider CLIs are on PATH
2068
2068
  `),new ha(n)}let s=r.map(i=>i.provider).join(", ");e.stdout.write(`providers ready: ${s}
2069
- `)}function FT(e,t){let r=e!==void 0&&e!==""?e:t.LMCTL_LOCAL_WEBUI_DIR!==void 0&&t.LMCTL_LOCAL_WEBUI_DIR!==""?t.LMCTL_LOCAL_WEBUI_DIR:void 0;if(r===void 0)return null;let n=$T(r)?r:Iu(process.cwd(),r);return JP(`${n}/index.html`)?n:null}function UT(e){let t=e.LMCTL_LOCAL_MAILBOX_DIR;return t!==void 0&&t!==""?$T(t)?t:Iu(process.cwd(),t):Iu(XP(),".lmctl","local-mailbox")}function QP(e){for(let t=0;t<e.length;t+=1)if(e[t]==="--port"){let r=e[t+1];if(r!==void 0&&!r.startsWith("--")){let n=Number(r);if(Number.isInteger(n)&&n>0&&n<=65535)return n}}}function WT(e,t=process.env){let r=eF(e);return typeof r=="string"?r:r.bind==="0.0.0.0"&&!r.insecureNoAuth&&!t.LMCTL_API_TOKEN?"auth required for --bind 0.0.0.0; set LMCTL_API_TOKEN, persist a token via `lmctl api config set api.token ...`, or pass --insecure-no-auth":r}function eF(e){let t={port:8787,bind:"127.0.0.1",noDaemon:!1,insecureNoAuth:!1};for(let r=0;r<e.length;r+=1){let n=e[r];if(n==="--port"){let s=e[++r];if(s===void 0||s.startsWith("--"))return"missing value for --port";let i=Number(s);if(!Number.isInteger(i)||i<=0||i>65535)return`invalid --port: ${s}`;t.port=i;continue}if(n==="--bind"){let s=e[++r];if(s===void 0||s.startsWith("--"))return"missing value for --bind";t.bind=s;continue}if(n==="--no-daemon"){t.noDaemon=!0;continue}if(n==="--insecure-no-auth"){t.insecureNoAuth=!0;continue}if(n==="--webui"){let s=e[r+1];s!==void 0&&!s.startsWith("--")?(t.localWebui={dir:s},r+=1):t.localWebui={dir:void 0};continue}return`unknown argument: ${n}`}return t}var GP,ha,DT,qT=T(()=>{"use strict";Ze();Bw();Yd();CE();Jc();yu();eu();Cd();Md();AT();vu();OT();Je();GP=`usage: lmctl serve [--port N] [--bind HOST] [--no-daemon] [--insecure-no-auth] [--webui [DIR]]
2069
+ `)}function FT(e,t){let r=e!==void 0&&e!==""?e:t.LMCTL_LOCAL_WEBUI_DIR!==void 0&&t.LMCTL_LOCAL_WEBUI_DIR!==""?t.LMCTL_LOCAL_WEBUI_DIR:void 0;if(r===void 0)return null;let n=$T(r)?r:ku(process.cwd(),r);return JP(`${n}/index.html`)?n:null}function UT(e){let t=e.LMCTL_LOCAL_MAILBOX_DIR;return t!==void 0&&t!==""?$T(t)?t:ku(process.cwd(),t):ku(XP(),".lmctl","local-mailbox")}function QP(e){for(let t=0;t<e.length;t+=1)if(e[t]==="--port"){let r=e[t+1];if(r!==void 0&&!r.startsWith("--")){let n=Number(r);if(Number.isInteger(n)&&n>0&&n<=65535)return n}}}function WT(e,t=process.env){let r=eF(e);return typeof r=="string"?r:r.bind==="0.0.0.0"&&!r.insecureNoAuth&&!t.LMCTL_API_TOKEN?"auth required for --bind 0.0.0.0; set LMCTL_API_TOKEN, persist a token via `lmctl api config set api.token ...`, or pass --insecure-no-auth":r}function eF(e){let t={port:8787,bind:"127.0.0.1",noDaemon:!1,insecureNoAuth:!1};for(let r=0;r<e.length;r+=1){let n=e[r];if(n==="--port"){let s=e[++r];if(s===void 0||s.startsWith("--"))return"missing value for --port";let i=Number(s);if(!Number.isInteger(i)||i<=0||i>65535)return`invalid --port: ${s}`;t.port=i;continue}if(n==="--bind"){let s=e[++r];if(s===void 0||s.startsWith("--"))return"missing value for --bind";t.bind=s;continue}if(n==="--no-daemon"){t.noDaemon=!0;continue}if(n==="--insecure-no-auth"){t.insecureNoAuth=!0;continue}if(n==="--webui"){let s=e[r+1];s!==void 0&&!s.startsWith("--")?(t.localWebui={dir:s},r+=1):t.localWebui={dir:void 0};continue}return`unknown argument: ${n}`}return t}var GP,ha,DT,qT=T(()=>{"use strict";Ze();Bw();Kd();CE();Hc();gu();Qd();$d();Cd();AT();Su();OT();Je();GP=`usage: lmctl serve [--port N] [--bind HOST] [--no-daemon] [--insecure-no-auth] [--webui [DIR]]
2070
2070
 
2071
2071
  Start the local HTTP API, web UI, queue daemon, terminal manager, and agent
2072
2072
  services. Help exits before any port binding or daemon startup.
@@ -2076,19 +2076,19 @@ services. Help exits before any port binding or daemon startup.
2076
2076
  against the local filesystem (no S3, no Cognito) with a fixed
2077
2077
  local identity. Mailbox store defaults to
2078
2078
  ~/.lmctl/local-mailbox/ ($LMCTL_LOCAL_MAILBOX_DIR overrides).
2079
- `;ha=class extends Error{missing;constructor(t){let r=t.map(n=>n.provider).join(", ");super(`provider binary pre-flight failed: ${r}`),this.name="ProviderBinaryPreflightError",this.missing=t}},DT=ku});import{existsSync as tF,mkdirSync as rF,readFileSync as nF,renameSync as sF,unlinkSync as iF,writeFileSync as oF}from"node:fs";import{homedir as JT}from"node:os";import{dirname as Ls,join as _t,resolve as aF}from"node:path";function In(e,t,r){let n=Ls(aF(r)),s=new Set,i=new Map;for(let o of t.members){if(s.add(o.provider),o.teamfile!==void 0)continue;let a=o.sessiondir??n,l=i.get(a)??new Set;l.add(o.provider),i.set(a,l)}for(let[o,a]of i.entries())wr(_t(o,".mcp.json"),"mcpServers",[vn(),kn()]),a.has("opencode")&&wr(_t(o,".opencode","opencode.json"),"mcp",[KT(),YT()]);for(let o of s)dF(o)}function Nu(e=XT??JT()){return _t(e,".copilot","mcp-config.json")}function GT(e,t){let r={};if(He.existsSync(e)){let i=JSON.parse(He.readFileSync(e,"utf8"));if(!Ot(i))throw new Error(`${e} is not a JSON object`);r=i}let n=Ot(r.mcpServers)?{...r.mcpServers}:{},s=!1;for(let[i,o]of Object.entries(t)){let a=Ot(n[i])?n[i]:void 0;bF(a,o)||(n[i]=o,s=!0)}return s?(r.mcpServers=n,VT(e,r),{changed:!0}):{changed:!1}}function VT(e,t){He.mkdirSync(Ls(e),{recursive:!0});let r=_t(Ls(e),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{He.writeFileSync(r,`${JSON.stringify(t,null,2)}
2080
- `,"utf8"),He.renameSync(r,e)}catch(n){try{He.unlinkSync(r)}catch{}throw n}}function cF(e,t){He.mkdirSync(Ls(e),{recursive:!0});let r=_t(Ls(e),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{He.writeFileSync(r,t,"utf8"),He.renameSync(r,e)}catch(n){try{He.unlinkSync(r)}catch{}throw n}}function wr(e,t,r){try{if(!He.existsSync(e))return;let n=JSON.parse(He.readFileSync(e,"utf8"));if(!Ot(n)||!Ot(n[t]))return;let s={...n[t]},i=[];for(let{name:o,shouldRemove:a}of r)Object.prototype.hasOwnProperty.call(s,o)&&a(s[o])&&(delete s[o],i.push(o));if(i.length===0)return;n[t]=s,VT(e,n),V({event:"mcp_cleanup",path:e,removed:i})}catch{}}function vn(){return{name:ya,shouldRemove:yF}}function KT(){return{name:ya,shouldRemove:wF}}function kn(){return{name:ga,shouldRemove:hF}}function YT(){return{name:ga,shouldRemove:gF}}function dF(e){let t=XT??JT();switch(e){case"copilot":wr(Nu(t),"mcpServers",[vn(),kn()]);return;case"claude":wr(_t(t,".claude.json"),"mcpServers",[vn(),kn()]);return;case"gemini":wr(_t(t,".gemini","settings.json"),"mcpServers",[vn(),kn()]);return;case"qwen":wr(_t(t,".qwen","settings.json"),"mcpServers",[vn(),kn()]);return;case"agy":wr(_t(t,".gemini","antigravity-cli","settings.json"),"mcpServers",[vn(),kn()]);return;case"opencode":wr(_t(t,".config","opencode","opencode.json"),"mcp",[KT(),YT()]);return;case"codex":uF(_t(t,".codex","config.toml"));return;default:return}}function uF(e){try{if(!He.existsSync(e))return;let t=He.readFileSync(e,"utf8"),r=fF(t);if(r===null)return;let n=t.split(/\n/),s=[],i=new Set,o=!1,a;for(let l of n){let c=zT(l);if(c===null)return;if(c!==void 0){if(HT(c,r)){o=!0,a=c[1],i.add(a);continue}o=!1,a=void 0,s.push(l);continue}if(o){if(/^\s*(?:#.*)?$/.test(l)){s.push(l);continue}a!==void 0&&i.add(a);continue}let d=pF(l);if(d===null)return;if(d!==void 0&&HT(d,r)){i.add(d[1]);continue}s.push(l)}if(i.size===0)return;cF(e,s.join(`
2081
- `)),V({event:"mcp_cleanup",path:e,removed:[...i]})}catch{}}function HT(e,t){return e.length<2||e[0]!=="mcp_servers"?!1:t.has(e[1])}function fF(e){let t=new Map,r;for(let s of e.split(/\n/)){let i=zT(s);if(i===null)return null;if(i!==void 0){r=i;continue}let o=s.indexOf("=");if(o<0)continue;let a=s.slice(0,o).trim(),l=s.slice(o+1).trim(),c=mF(a,r);if(c===null)return null;if(c===void 0||c.length!==3||c[0]!=="mcp_servers"||c[1]!==ga&&c[1]!==ya)continue;let d=t.get(c[1])??{};if(c[2]==="command"){let u=ZT(l);if(u===null)return null;d.command=u}else if(c[2]==="args"){let u=_F(l);if(u===null)return null;d.args=u}t.set(c[1],d)}let n=new Set;for(let[s,i]of t.entries())s===ga&&eb(i.command,i.args)&&n.add(s),s===ya&&tb(i.command,i.args)&&n.add(s);return n}function mF(e,t){if(e.startsWith("mcp_servers"))return wa(e);if(t===void 0||t.length<2||t[0]!=="mcp_servers")return;let r=wa(e);return r===null?null:[...t,...r]}function zT(e){if(!/^\s*\[/.test(e))return;let t=/^\s*\[([^\]\r\n]+)\]\s*(?:#.*)?$/.exec(e);return t===null?null:wa(t[1])}function pF(e){let t=e.indexOf("=");if(t<0)return;let r=e.slice(0,t).trim();if(!(r.length===0||!r.startsWith("mcp_servers")))return wa(r)}function wa(e){let t=[],r=0,n=()=>{for(;r<e.length&&/\s/.test(e[r]);)r+=1};for(;r<e.length;){if(n(),r>=e.length)return null;if(e[r]==='"'){r+=1;let s="",i=!1;for(;r<e.length;){let o=e[r];if(o==="\\"){if(r+1>=e.length)return null;s+=e[r+1],r+=2;continue}if(o==='"'){r+=1,i=!0;break}s+=o,r+=1}if(!i)return null;t.push(s)}else{let s=r;for(;r<e.length&&/[A-Za-z0-9_-]/.test(e[r]);)r+=1;if(r===s)return null;t.push(e.slice(s,r))}if(n(),r>=e.length)break;if(e[r]!==".")return null;r+=1}return t.length>0?t:null}function ZT(e){let t=QT(e).trim();if(t.startsWith('"'))try{let r=JSON.parse(t);return typeof r=="string"?r:null}catch{return null}return t.startsWith("'")&&t.endsWith("'")&&t.length>=2?t.slice(1,-1):null}function _F(e){let t=QT(e).trim();if(!t.startsWith("[")||!t.endsWith("]"))return null;let r=t.slice(1,-1).trim();if(r.length===0)return[];let n=r.split(",").map(s=>ZT(s.trim()));return n.some(s=>s===null)?null:n}function QT(e){let t;for(let r=0;r<e.length;r+=1){let n=e[r];if(t!==void 0){if(t==='"'&&n==="\\"){r+=1;continue}n===t&&(t=void 0);continue}if(n==='"'||n==="'"){t=n;continue}if(n==="#")return e.slice(0,r)}return e}function hF(e){return Ot(e)?e.type==="stdio"&&typeof e.command=="string"&&eb(e.command,e.args):!1}function gF(e){return!Ot(e)||!Array.isArray(e.command)?!1:e.command.length===2&&typeof e.command[0]=="string"&&typeof e.command[1]=="string"&&nb(e.command[0])&&e.command[1]==="mcp"||e.command.length===3&&typeof e.command[0]=="string"&&typeof e.command[1]=="string"&&typeof e.command[2]=="string"&&rb(e.command[0],[e.command[1],e.command[2]])}function yF(e){return Ot(e)?e.type==="stdio"&&tb(e.command,e.args):!1}function wF(e){return!Ot(e)||!Array.isArray(e.command)?!1:e.command.length===2&&typeof e.command[0]=="string"&&typeof e.command[1]=="string"&&sb(e.command[0])&&e.command[1]==="mcp"}function eb(e,t){return nb(e)&&ib(t)||rb(e,t)}function tb(e,t){return sb(e)&&ib(t)}function rb(e,t){return EF(e)&&Array.isArray(t)&&t.length===2&&TF(t[0])&&t[1]==="mcp"}function nb(e){return typeof e=="string"&&xu(e)==="lmctl"}function sb(e){return typeof e=="string"&&xu(e)==="lmctl0"}function EF(e){if(typeof e!="string")return!1;let t=xu(e).toLowerCase();return t==="node"||t==="node.exe"}function TF(e){if(typeof e!="string")return!1;let t=e.replace(/\\/g,"/");return t==="lmctl-cli/dist/index.js"||t.endsWith("/lmctl-cli/dist/index.js")}function xu(e){let t=e.replace(/\\/g,"/");return t.split("/").filter(n=>n.length>0).at(-1)??t}function ib(e){return Array.isArray(e)&&e.length===1&&e[0]==="mcp"}function bF(e,t){return e!==void 0&&Ea(e)===Ea(t)}function Ea(e){return Array.isArray(e)?`[${e.map(t=>Ea(t)).join(",")}]`:Ot(e)?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Ea(e[t])}`).join(",")}}`:JSON.stringify(e)}function Ot(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var ga,ya,lF,He,XT,Os=T(()=>{"use strict";ve();ga="lmctl",ya="lmctl0",lF={existsSync:tF,mkdirSync:rF,readFileSync:nF,writeFileSync:oF,renameSync:sF,unlinkSync:iF},He=lF});function lb(e){let t=ob(e.registry,e.fromTeamfile);if(t===void 0)return Nn(`sender team is not registered in policy graph: ${e.fromTeamfile}`);if(!ab(t,e.fromAlias))return Nn(`sender alias "${e.fromAlias}" not found in ${e.fromTeamfile}`);let r=ob(e.registry,e.toTeamfile);return r===void 0?Nn(`target team is not registered in policy graph: ${e.toTeamfile}`):ab(r,e.toAlias)?e.toTeamfile===e.fromTeamfile?{allowed:!0,outOfPolicy:!1,reason:"same team"}:t.leadAlias===null?Nn(`sender team has no Lead: ${e.fromTeamfile}`):e.fromAlias!==t.leadAlias?Nn(`cross-team sends may only originate from Lead; got "${e.fromAlias}" in ${e.fromTeamfile}`):{allowed:!0,outOfPolicy:!1,reason:"cross-team send from Lead"}:Nn(`target alias "${e.toAlias}" not found in ${e.toTeamfile}`)}function ob(e,t){return e.teams.find(r=>r.teamfile===t)}function ab(e,t){return e.aliases.some(r=>r===t)}function Nn(e){return{allowed:!1,outOfPolicy:!0,reason:e}}var cb=T(()=>{"use strict"});import{randomUUID as SF}from"node:crypto";import{hostname as db,networkInterfaces as vF}from"node:os";function ub(e){let t=(e.now??new Date).toISOString();return{lock_id:SF(),teamfile:e.teamfile,alias:e.alias,holder_pid:e.pid??process.pid,holder_host:e.host??db(),holder_ips:e.ips??AF(),started_at:t,last_heartbeat:t}}function fb(e=process.env){return mb(e.LMCTL_TERMINAL_LOCK_HEARTBEAT_MS,kF)}function NF(e=process.env){return mb(e.LMCTL_TERMINAL_LOCK_STALE_MS,IF)}function Au(e,t={}){let r=t.now??new Date,n=t.localHost??db(),s=t.staleMs??NF();if(e.holder_host===n)return(t.isProcessAlive??xF)(e.holder_pid)?{live:!0,reason:"local-pid-alive"}:{live:!1,reason:"dead-pid"};let i=Date.parse(e.last_heartbeat);return Number.isFinite(i)?r.getTime()-i<=s?{live:!0,reason:"remote-heartbeat-fresh"}:{live:!1,reason:"stale-heartbeat"}:{live:!1,reason:"stale-heartbeat"}}function Ru(e){return`${e.alias} is held by a terminal on ${e.holder_host} since ${e.started_at}; retry later`}function mb(e,t){if(e===void 0||e.trim()==="")return t;let r=e.trim(),n=Number.parseInt(r,10);return!Number.isFinite(n)||n<=0||String(n)!==r?t:n}function xF(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(e,0),!0}catch(t){return(t!==null&&typeof t=="object"&&"code"in t?t.code:void 0)!=="ESRCH"}}function AF(){let e=new Set;for(let t of Object.values(vF()))for(let r of t??[])r.internal||e.add(r.address);return[...e].sort()}var kF,IF,Lu=T(()=>{"use strict";kF=15e3,IF=12e4});function RF(e){return`lmctl ${e}: LMCTL_SELF_SESSIONID is not set \u2014 it looks like you are running lmctl
2079
+ `;ha=class extends Error{missing;constructor(t){let r=t.map(n=>n.provider).join(", ");super(`provider binary pre-flight failed: ${r}`),this.name="ProviderBinaryPreflightError",this.missing=t}},DT=vu});import{existsSync as tF,mkdirSync as rF,readFileSync as nF,renameSync as sF,unlinkSync as iF,writeFileSync as oF}from"node:fs";import{homedir as JT}from"node:os";import{dirname as Ls,join as _t,resolve as aF}from"node:path";function In(e,t,r){let n=Ls(aF(r)),s=new Set,i=new Map;for(let o of t.members){if(s.add(o.provider),o.teamfile!==void 0)continue;let a=o.sessiondir??n,l=i.get(a)??new Set;l.add(o.provider),i.set(a,l)}for(let[o,a]of i.entries())wr(_t(o,".mcp.json"),"mcpServers",[vn(),kn()]),a.has("opencode")&&wr(_t(o,".opencode","opencode.json"),"mcp",[KT(),YT()]);for(let o of s)dF(o)}function Iu(e=XT??JT()){return _t(e,".copilot","mcp-config.json")}function GT(e,t){let r={};if(He.existsSync(e)){let i=JSON.parse(He.readFileSync(e,"utf8"));if(!Ot(i))throw new Error(`${e} is not a JSON object`);r=i}let n=Ot(r.mcpServers)?{...r.mcpServers}:{},s=!1;for(let[i,o]of Object.entries(t)){let a=Ot(n[i])?n[i]:void 0;bF(a,o)||(n[i]=o,s=!0)}return s?(r.mcpServers=n,VT(e,r),{changed:!0}):{changed:!1}}function VT(e,t){He.mkdirSync(Ls(e),{recursive:!0});let r=_t(Ls(e),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{He.writeFileSync(r,`${JSON.stringify(t,null,2)}
2080
+ `,"utf8"),He.renameSync(r,e)}catch(n){try{He.unlinkSync(r)}catch{}throw n}}function cF(e,t){He.mkdirSync(Ls(e),{recursive:!0});let r=_t(Ls(e),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{He.writeFileSync(r,t,"utf8"),He.renameSync(r,e)}catch(n){try{He.unlinkSync(r)}catch{}throw n}}function wr(e,t,r){try{if(!He.existsSync(e))return;let n=JSON.parse(He.readFileSync(e,"utf8"));if(!Ot(n)||!Ot(n[t]))return;let s={...n[t]},i=[];for(let{name:o,shouldRemove:a}of r)Object.prototype.hasOwnProperty.call(s,o)&&a(s[o])&&(delete s[o],i.push(o));if(i.length===0)return;n[t]=s,VT(e,n),V({event:"mcp_cleanup",path:e,removed:i})}catch{}}function vn(){return{name:ya,shouldRemove:yF}}function KT(){return{name:ya,shouldRemove:wF}}function kn(){return{name:ga,shouldRemove:hF}}function YT(){return{name:ga,shouldRemove:gF}}function dF(e){let t=XT??JT();switch(e){case"copilot":wr(Iu(t),"mcpServers",[vn(),kn()]);return;case"claude":wr(_t(t,".claude.json"),"mcpServers",[vn(),kn()]);return;case"gemini":wr(_t(t,".gemini","settings.json"),"mcpServers",[vn(),kn()]);return;case"qwen":wr(_t(t,".qwen","settings.json"),"mcpServers",[vn(),kn()]);return;case"agy":wr(_t(t,".gemini","antigravity-cli","settings.json"),"mcpServers",[vn(),kn()]);return;case"opencode":wr(_t(t,".config","opencode","opencode.json"),"mcp",[KT(),YT()]);return;case"codex":uF(_t(t,".codex","config.toml"));return;default:return}}function uF(e){try{if(!He.existsSync(e))return;let t=He.readFileSync(e,"utf8"),r=fF(t);if(r===null)return;let n=t.split(/\n/),s=[],i=new Set,o=!1,a;for(let l of n){let c=zT(l);if(c===null)return;if(c!==void 0){if(HT(c,r)){o=!0,a=c[1],i.add(a);continue}o=!1,a=void 0,s.push(l);continue}if(o){if(/^\s*(?:#.*)?$/.test(l)){s.push(l);continue}a!==void 0&&i.add(a);continue}let d=pF(l);if(d===null)return;if(d!==void 0&&HT(d,r)){i.add(d[1]);continue}s.push(l)}if(i.size===0)return;cF(e,s.join(`
2081
+ `)),V({event:"mcp_cleanup",path:e,removed:[...i]})}catch{}}function HT(e,t){return e.length<2||e[0]!=="mcp_servers"?!1:t.has(e[1])}function fF(e){let t=new Map,r;for(let s of e.split(/\n/)){let i=zT(s);if(i===null)return null;if(i!==void 0){r=i;continue}let o=s.indexOf("=");if(o<0)continue;let a=s.slice(0,o).trim(),l=s.slice(o+1).trim(),c=mF(a,r);if(c===null)return null;if(c===void 0||c.length!==3||c[0]!=="mcp_servers"||c[1]!==ga&&c[1]!==ya)continue;let d=t.get(c[1])??{};if(c[2]==="command"){let u=ZT(l);if(u===null)return null;d.command=u}else if(c[2]==="args"){let u=_F(l);if(u===null)return null;d.args=u}t.set(c[1],d)}let n=new Set;for(let[s,i]of t.entries())s===ga&&eb(i.command,i.args)&&n.add(s),s===ya&&tb(i.command,i.args)&&n.add(s);return n}function mF(e,t){if(e.startsWith("mcp_servers"))return wa(e);if(t===void 0||t.length<2||t[0]!=="mcp_servers")return;let r=wa(e);return r===null?null:[...t,...r]}function zT(e){if(!/^\s*\[/.test(e))return;let t=/^\s*\[([^\]\r\n]+)\]\s*(?:#.*)?$/.exec(e);return t===null?null:wa(t[1])}function pF(e){let t=e.indexOf("=");if(t<0)return;let r=e.slice(0,t).trim();if(!(r.length===0||!r.startsWith("mcp_servers")))return wa(r)}function wa(e){let t=[],r=0,n=()=>{for(;r<e.length&&/\s/.test(e[r]);)r+=1};for(;r<e.length;){if(n(),r>=e.length)return null;if(e[r]==='"'){r+=1;let s="",i=!1;for(;r<e.length;){let o=e[r];if(o==="\\"){if(r+1>=e.length)return null;s+=e[r+1],r+=2;continue}if(o==='"'){r+=1,i=!0;break}s+=o,r+=1}if(!i)return null;t.push(s)}else{let s=r;for(;r<e.length&&/[A-Za-z0-9_-]/.test(e[r]);)r+=1;if(r===s)return null;t.push(e.slice(s,r))}if(n(),r>=e.length)break;if(e[r]!==".")return null;r+=1}return t.length>0?t:null}function ZT(e){let t=QT(e).trim();if(t.startsWith('"'))try{let r=JSON.parse(t);return typeof r=="string"?r:null}catch{return null}return t.startsWith("'")&&t.endsWith("'")&&t.length>=2?t.slice(1,-1):null}function _F(e){let t=QT(e).trim();if(!t.startsWith("[")||!t.endsWith("]"))return null;let r=t.slice(1,-1).trim();if(r.length===0)return[];let n=r.split(",").map(s=>ZT(s.trim()));return n.some(s=>s===null)?null:n}function QT(e){let t;for(let r=0;r<e.length;r+=1){let n=e[r];if(t!==void 0){if(t==='"'&&n==="\\"){r+=1;continue}n===t&&(t=void 0);continue}if(n==='"'||n==="'"){t=n;continue}if(n==="#")return e.slice(0,r)}return e}function hF(e){return Ot(e)?e.type==="stdio"&&typeof e.command=="string"&&eb(e.command,e.args):!1}function gF(e){return!Ot(e)||!Array.isArray(e.command)?!1:e.command.length===2&&typeof e.command[0]=="string"&&typeof e.command[1]=="string"&&nb(e.command[0])&&e.command[1]==="mcp"||e.command.length===3&&typeof e.command[0]=="string"&&typeof e.command[1]=="string"&&typeof e.command[2]=="string"&&rb(e.command[0],[e.command[1],e.command[2]])}function yF(e){return Ot(e)?e.type==="stdio"&&tb(e.command,e.args):!1}function wF(e){return!Ot(e)||!Array.isArray(e.command)?!1:e.command.length===2&&typeof e.command[0]=="string"&&typeof e.command[1]=="string"&&sb(e.command[0])&&e.command[1]==="mcp"}function eb(e,t){return nb(e)&&ib(t)||rb(e,t)}function tb(e,t){return sb(e)&&ib(t)}function rb(e,t){return EF(e)&&Array.isArray(t)&&t.length===2&&TF(t[0])&&t[1]==="mcp"}function nb(e){return typeof e=="string"&&Nu(e)==="lmctl"}function sb(e){return typeof e=="string"&&Nu(e)==="lmctl0"}function EF(e){if(typeof e!="string")return!1;let t=Nu(e).toLowerCase();return t==="node"||t==="node.exe"}function TF(e){if(typeof e!="string")return!1;let t=e.replace(/\\/g,"/");return t==="lmctl-cli/dist/index.js"||t.endsWith("/lmctl-cli/dist/index.js")}function Nu(e){let t=e.replace(/\\/g,"/");return t.split("/").filter(n=>n.length>0).at(-1)??t}function ib(e){return Array.isArray(e)&&e.length===1&&e[0]==="mcp"}function bF(e,t){return e!==void 0&&Ea(e)===Ea(t)}function Ea(e){return Array.isArray(e)?`[${e.map(t=>Ea(t)).join(",")}]`:Ot(e)?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Ea(e[t])}`).join(",")}}`:JSON.stringify(e)}function Ot(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var ga,ya,lF,He,XT,Os=T(()=>{"use strict";ve();ga="lmctl",ya="lmctl0",lF={existsSync:tF,mkdirSync:rF,readFileSync:nF,writeFileSync:oF,renameSync:sF,unlinkSync:iF},He=lF});function lb(e){let t=ob(e.registry,e.fromTeamfile);if(t===void 0)return Nn(`sender team is not registered in policy graph: ${e.fromTeamfile}`);if(!ab(t,e.fromAlias))return Nn(`sender alias "${e.fromAlias}" not found in ${e.fromTeamfile}`);let r=ob(e.registry,e.toTeamfile);return r===void 0?Nn(`target team is not registered in policy graph: ${e.toTeamfile}`):ab(r,e.toAlias)?e.toTeamfile===e.fromTeamfile?{allowed:!0,outOfPolicy:!1,reason:"same team"}:t.leadAlias===null?Nn(`sender team has no Lead: ${e.fromTeamfile}`):e.fromAlias!==t.leadAlias?Nn(`cross-team sends may only originate from Lead; got "${e.fromAlias}" in ${e.fromTeamfile}`):{allowed:!0,outOfPolicy:!1,reason:"cross-team send from Lead"}:Nn(`target alias "${e.toAlias}" not found in ${e.toTeamfile}`)}function ob(e,t){return e.teams.find(r=>r.teamfile===t)}function ab(e,t){return e.aliases.some(r=>r===t)}function Nn(e){return{allowed:!1,outOfPolicy:!0,reason:e}}var cb=T(()=>{"use strict"});import{randomUUID as SF}from"node:crypto";import{hostname as db,networkInterfaces as vF}from"node:os";function ub(e){let t=(e.now??new Date).toISOString();return{lock_id:SF(),teamfile:e.teamfile,alias:e.alias,holder_pid:e.pid??process.pid,holder_host:e.host??db(),holder_ips:e.ips??AF(),started_at:t,last_heartbeat:t}}function fb(e=process.env){return mb(e.LMCTL_TERMINAL_LOCK_HEARTBEAT_MS,kF)}function NF(e=process.env){return mb(e.LMCTL_TERMINAL_LOCK_STALE_MS,IF)}function xu(e,t={}){let r=t.now??new Date,n=t.localHost??db(),s=t.staleMs??NF();if(e.holder_host===n)return(t.isProcessAlive??xF)(e.holder_pid)?{live:!0,reason:"local-pid-alive"}:{live:!1,reason:"dead-pid"};let i=Date.parse(e.last_heartbeat);return Number.isFinite(i)?r.getTime()-i<=s?{live:!0,reason:"remote-heartbeat-fresh"}:{live:!1,reason:"stale-heartbeat"}:{live:!1,reason:"stale-heartbeat"}}function Au(e){return`${e.alias} is held by a terminal on ${e.holder_host} since ${e.started_at}; retry later`}function mb(e,t){if(e===void 0||e.trim()==="")return t;let r=e.trim(),n=Number.parseInt(r,10);return!Number.isFinite(n)||n<=0||String(n)!==r?t:n}function xF(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(e,0),!0}catch(t){return(t!==null&&typeof t=="object"&&"code"in t?t.code:void 0)!=="ESRCH"}}function AF(){let e=new Set;for(let t of Object.values(vF()))for(let r of t??[])r.internal||e.add(r.address);return[...e].sort()}var kF,IF,Ru=T(()=>{"use strict";kF=15e3,IF=12e4});function RF(e){return`lmctl ${e}: LMCTL_SELF_SESSIONID is not set \u2014 it looks like you are running lmctl
2082
2082
  manually, outside a member session that lmctl started. Running lmctl this way is
2083
2083
  not officially supported.
2084
2084
  To experiment with it manually: https://lmctl.com/lmctl/docs/manual-invocation`}function $s(e){return`lmctl ${e}: LMCTL_SELF_SESSIONID is set but does not match any member of a registered team.
2085
2085
  The session marker may be stale or the team may not be registered in this lmctl database.
2086
2086
  Consulted ${Vs(Dt(),le())}
2087
2087
  To experiment with it manually: https://lmctl.com/lmctl/docs/manual-invocation`}function pb(e){return`unknown option --from
2088
- ${RF(e)}`}function _b(e,t){let r=Ou(e,t);return r.ok?{ok:!0,identity:r.identity,source:"session"}:r}function Ou(e,t){let r=e[Kn];if(r===void 0||r.length===0)return{ok:!1,reason:"unset"};let n=[];for(let i of t.listRootTeams()){let o=De(i.teamfile_path,t);for(let a of o.members)a.teamfile===void 0&&a.session===r&&n.push(`${i.teamfile_path}:${a.alias}`)}let s=[...new Set(n)];if(s.length===0)return{ok:!1,reason:"not-found"};if(s.length>1)throw new Error("LMCTL_SELF_SESSIONID matches multiple team members; the team registry is ambiguous");return{ok:!0,identity:s[0]}}var Ta=T(()=>{"use strict";it();Je();Rt()});function qr(e){let t=Wr(e);if(t===null)throw new Error(`invalid agent identity: ${e}`);return{teamfile:t.teamfile,alias:t.alias,value:e}}var $u=T(()=>{"use strict";Lt()});async function ka(e){let t=e.onEvent??(()=>{}),r=OF(e.io,t),n=null,s=null,i=null,o,a=null,l=e.prompt;try{let c=await $(r,w=>qe(e.teamfile,e.alias,w)),d=c.teamfile,u=await $(r,w=>UF(w,e.env??process.env)),f=u.sender,m=await WF(r,{explicitRoot:e.rootFlag,sender:f,receiverTeamfile:d,operatorOrigin:u.origin==="operator"}),p=f===null?null:await BF(r,{rootTeamfile:m,sender:f,receiverTeamfile:d,receiverAlias:c.alias});p!==null&&!p.allowed&&t({kind:"warning",message:`warning: out-of-policy chat send: ${p.reason}
2089
- `}),i=await MF(r,{receiverTeamfile:d,receiverAlias:c.alias,sender:f,rootTeamfile:m,provider:c.provider,model:c.model,sessionId:c.sessionid,cwd:c.sessiondir,prompt:e.prompt,origin:u.origin}),o=PF(r,i);try{In(r,je(d),d)}catch{}n={root_teamfile:m,sender_teamfile:f?.teamfile??null,sender_alias:f?.alias??null,receiver_teamfile:d,receiver_alias:c.alias,origin:u.origin,policy:p};let _=await wb(r,d,c.alias);if(_!==null){let w=Ru(_);if(f!==null){let x=await Cu(r,{sender:f,receiverTeamfile:d,receiverAlias:c.alias,rootTeamfile:m,payload:e.prompt});return a=ba(`enqueued mailbox message ${x.id}`,null),Mu(x.id,f,d,c.alias)}let I=await xn(r,{...n,message:e.prompt,response:null,status:"error",error_detail:w});return a=ju(w,I),{status:"busy",message:w,teamChatLogId:I}}if(await $F(r,d,c.alias)){if(f!==null){let x=await Cu(r,{sender:f,receiverTeamfile:d,receiverAlias:c.alias,rootTeamfile:m,payload:e.prompt});return a=ba(`enqueued mailbox message ${x.id}`,null),Mu(x.id,f,d,c.alias)}let w=await CF(r,d,c.alias),I=await xn(r,{...n,message:e.prompt,response:null,status:"error",error_detail:w});return a=ju(w,I),{status:"busy",message:w,teamChatLogId:I}}if(f!==null&&f.teamfile!==d){let w=await $(r,I=>dE(I,{root:m,sender:f,receiverTeamfile:d,receiverAlias:c.alias,now:new Date}));if(w.stop){let I=fE(w.chain),x=await xn(r,{...n,message:e.prompt,response:null,status:"error",error_detail:I});return a=Sa(I,x),{status:"error",errorKind:"cycle",message:I,teamChatLogId:x}}}let g=await JF(r,{receiver_teamfile:d,receiver_alias:c.alias,sender_teamfile:f?.teamfile??d,sender_alias:f?.alias??"operator"});if(!g.acquired){let w=Eb(d,c.alias,g.current);if(f!==null){let x=await Cu(r,{sender:f,receiverTeamfile:d,receiverAlias:c.alias,rootTeamfile:m,payload:e.prompt});return a=ba(`enqueued mailbox message ${x.id}`,null),Mu(x.id,f,d,c.alias)}let I=await xn(r,{...n,message:e.prompt,response:null,status:"error",error_detail:w});return a=ju(w,I),{status:"busy",message:w,teamChatLogId:I}}s=g.lease;let h=await Qo({sender:f??{teamfile:d,alias:"operator"},receiver:{teamfile:d,alias:c.alias,provider:c.provider,sessionId:c.sessionid,cwd:c.sessiondir,...c.model!==void 0?{model:c.model}:{},...c.effort!==void 0?{effort:c.effort}:{},...c.isLead!==void 0?{isLead:c.isLead}:{}},newMessage:e.prompt,newMessageFrom:f===null?"operator":`${f.teamfile}:${f.alias}`,io:r,permissionMode:e.permissionMode,env:e.env??process.env,...e.idleTimeoutMs!==void 0?{idleTimeoutMs:e.idleTimeoutMs}:{},onDelta:w=>t({kind:"delta",chunk:w}),onProgress:w=>t({kind:"progress",alias:c.alias,event:w}),onPromptBuilt:w=>{if(l=w,i!==null)return DF(r,i,w)}});l=h.prompt;let S=h.status==="stalled",y=await xn(r,{...n,message:l,response:S?null:h.receipt,status:n.policy?.outOfPolicy===!0?"out_of_policy":S?"error":"ok",error_detail:n.policy?.outOfPolicy===!0?n.policy.reason:S?`provider stalled${h.stalledAfterMs!==void 0?` after ${h.stalledAfterMs}ms`:""}`:null});return a=S?Sa(`provider stalled${h.stalledAfterMs!==void 0?` after ${h.stalledAfterMs}ms`:""}`,y,h.receipt):ba(h.receipt,y),{status:S?"stalled":"ok",replyText:h.receipt,wroteDelta:h.wroteDelta,teamChatLogId:y,durationMs:h.durationMs}}catch(c){let d=c instanceof Error?c.message:String(c),u=n===null?null:await xn(r,{...n,message:l,response:null,status:n.policy?.outOfPolicy===!0?"out_of_policy":"error",error_detail:n.policy?.outOfPolicy===!0?`${n.policy.reason}; provider error: ${d}`:d});return a=Sa(d,u),{status:"error",errorKind:c instanceof ge?"target":"provider",message:d,teamChatLogId:u}}finally{o!==void 0&&clearInterval(o),s!==null&&await XF(r,s),i!==null&&await jF(r,i,a??Sa("chat turn exited without a terminal outcome",null))}}function OF(e,t){return{...e,stdout:{write:()=>{}},stderr:{write:r=>{t({kind:"warning",message:r})}}}}async function $F(e,t,r){return await $(e,n=>Zw(n,t,r))}async function CF(e,t,r){let n=await wb(e,t,r);if(n!==null)return Ru(n);let s=await $(e,i=>i.getAgentInflight(t,r));return s!==null?Eb(t,r,s):`${r} is busy; wait and retry`}async function Cu(e,t){return await $(e,r=>r.enqueueMail({sender_teamfile:t.sender.teamfile,sender_alias:t.sender.alias,receiver_teamfile:t.receiverTeamfile,receiver_alias:t.receiverAlias,root_teamfile:t.rootTeamfile,payload:t.payload}))}function Mu(e,t,r,n){let s=`${r}:${n}`;return{status:"enqueued",id:e,message:`mailbox message ${e} enqueued to ${s}`,teamChatLogId:null,sender:`${t.teamfile}:${t.alias}`,receiver:s}}async function MF(e,t){try{return(await $(e,n=>n.startTrackedInvocation({kind:"chat",origin:t.origin,scope_teamfile:t.receiverTeamfile,from_identity:t.sender===null?"operator":`${t.sender.teamfile}:${t.sender.alias}`,target_teamfile:t.receiverTeamfile,target_alias:t.receiverAlias,root_teamfile:t.rootTeamfile,cwd:t.cwd??null,command:FF(t.receiverTeamfile,t.receiverAlias,t.prompt),holder_pid:process.pid,request_payload:t.prompt,meta:JSON.stringify({provider:t.provider,model:t.model??null,sessionid:t.sessionId??null})}))).id}catch(r){return ce()&&Le(JSON.stringify({event:"tracked_invocation_start_error",error:r instanceof Error?r.message:String(r)})),null}}async function jF(e,t,r){try{await $(e,n=>{n.finishTrackedInvocation(t,r)})}catch(n){ce()&&Le(JSON.stringify({event:"tracked_invocation_finish_error",id:t,error:n instanceof Error?n.message:String(n)}))}}async function DF(e,t,r){try{await $(e,n=>{n.updateTrackedInvocationRequestPayload(t,r)})}catch(n){ce()&&Le(JSON.stringify({event:"tracked_invocation_request_payload_error",id:t,error:n instanceof Error?n.message:String(n)}))}}function PF(e,t){if(t===null)return;let r=setInterval(()=>{$(e,n=>n.heartbeatTrackedInvocation(t)).catch(n=>{ce()&&Le(JSON.stringify({event:"tracked_invocation_heartbeat_error",id:t,error:n instanceof Error?n.message:String(n)}))})},LF);return r.unref?.(),r}function ba(e,t){return{status:"done",result_summary:va(e),error:null,team_chat_log_id:t}}function ju(e,t){return{status:"busy",result_summary:va(e),error:e,team_chat_log_id:t}}function Sa(e,t,r){return{status:"error",result_summary:va(r===void 0?e:r),error:e,team_chat_log_id:t}}function va(e){let t=e.replace(/\s+/gu," ").trim();return t.length<=500?t:`${t.slice(0,497)}...`}function FF(e,t,r){return`lmctl chat ${JSON.stringify(e)} ${t} ${JSON.stringify(r)}`}function UF(e,t){let r=_b(t,e);if(r.ok)return{sender:qr(r.identity),origin:"agent"};if(r.reason==="unset")return{sender:null,origin:"operator"};throw new Error($s("chat"))}async function WF(e,t){if(t.explicitRoot!==void 0)return await $(e,n=>we(t.explicitRoot,n));if(t.operatorOrigin||t.sender===null)return t.receiverTeamfile;let r=t.sender;return await $(e,n=>uE(n,{sender:r,now:new Date})??t.receiverTeamfile)}async function BF(e,t){return await $(e,r=>lb({rootTeamfile:t.rootTeamfile,fromTeamfile:t.sender.teamfile,fromAlias:t.sender.alias,toTeamfile:t.receiverTeamfile,toAlias:t.receiverAlias,registry:qF(r,t.sender.teamfile,t.receiverTeamfile)}))}function qF(e,t,r){return{teams:[t,r].map(s=>HF(s,e))}}function HF(e,t){let r=De(e,t),n=At(r);return{teamfile:e,aliases:r.members.map(s=>s.alias),leadAlias:n?.alias??null}}async function JF(e,t){return await $(e,r=>{let n=ce(),s=hr(r,{receiver_teamfile:t.receiver_teamfile,receiver_alias:t.receiver_alias,sender_teamfile:t.sender_teamfile,sender_alias:t.sender_alias,ttlMs:gr()});return s.acquired?(n&&Le(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:t.receiver_teamfile,alias:t.receiver_alias},sender:{teamfile:t.sender_teamfile,alias:t.sender_alias},result:s.reclaimReason===null?"acquired":"reclaimed",...s.reclaimReason===null?{}:{reclaim_reason:s.reclaimReason,holder:gb(s.previous)}})),{acquired:!0,lease:s.lease}):(n&&Le(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:t.receiver_teamfile,alias:t.receiver_alias},sender:{teamfile:t.sender_teamfile,alias:t.sender_alias},result:"rejected",holder:gb(s.current)})),{acquired:!1,current:s.current})})}async function wb(e,t,r){return await $(e,n=>{for(let i=0;i<2;i+=1){let o=n.getTerminalLock(t,r);if(o===null)return null;if(Au(o).live)return o;let l=n.getAgentInflight(t,r);if(n.clearTerminalLock(t,r,o.lock_id))return l!==null&&l.sender_teamfile===t&&l.sender_alias==="terminal"&&n.clearObservedTerminalAgentInflight(t,r,{sender_teamfile:l.sender_teamfile,sender_alias:l.sender_alias,started_at:l.started_at,holder_pid:l.holder_pid}),null}let s=n.getTerminalLock(t,r);return s===null?null:Au(s).live?s:null})}function gb(e){return e===null?null:{sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,holder_pid:e.holder_pid,started_at:e.started_at}}async function XF(e,t){try{await $(e,r=>{r.releaseAgentInflight(t)})}catch(r){e.stderr.write(`warning: failed to release chat in-flight slot: ${r instanceof Error?r.message:String(r)}
2088
+ ${RF(e)}`}function _b(e,t){let r=Lu(e,t);return r.ok?{ok:!0,identity:r.identity,source:"session"}:r}function Lu(e,t){let r=e[Kn];if(r===void 0||r.length===0)return{ok:!1,reason:"unset"};let n=[];for(let i of t.listRootTeams()){let o=De(i.teamfile_path,t);for(let a of o.members)a.teamfile===void 0&&a.session===r&&n.push(`${i.teamfile_path}:${a.alias}`)}let s=[...new Set(n)];if(s.length===0)return{ok:!1,reason:"not-found"};if(s.length>1)throw new Error("LMCTL_SELF_SESSIONID matches multiple team members; the team registry is ambiguous");return{ok:!0,identity:s[0]}}var Ta=T(()=>{"use strict";it();Je();Rt()});function qr(e){let t=Wr(e);if(t===null)throw new Error(`invalid agent identity: ${e}`);return{teamfile:t.teamfile,alias:t.alias,value:e}}var Ou=T(()=>{"use strict";Lt()});async function ka(e){let t=e.onEvent??(()=>{}),r=OF(e.io,t),n=null,s=null,i=null,o,a=null,l=e.prompt;try{let c=await $(r,w=>qe(e.teamfile,e.alias,w)),d=c.teamfile,u=await $(r,w=>UF(w,e.env??process.env)),f=u.sender,m=await WF(r,{explicitRoot:e.rootFlag,sender:f,receiverTeamfile:d,operatorOrigin:u.origin==="operator"}),p=f===null?null:await BF(r,{rootTeamfile:m,sender:f,receiverTeamfile:d,receiverAlias:c.alias});p!==null&&!p.allowed&&t({kind:"warning",message:`warning: out-of-policy chat send: ${p.reason}
2089
+ `}),i=await MF(r,{receiverTeamfile:d,receiverAlias:c.alias,sender:f,rootTeamfile:m,provider:c.provider,model:c.model,sessionId:c.sessionid,cwd:c.sessiondir,prompt:e.prompt,origin:u.origin}),o=PF(r,i);try{In(r,je(d),d)}catch{}n={root_teamfile:m,sender_teamfile:f?.teamfile??null,sender_alias:f?.alias??null,receiver_teamfile:d,receiver_alias:c.alias,origin:u.origin,policy:p};let _=await wb(r,d,c.alias);if(_!==null){let w=Au(_);if(f!==null){let x=await $u(r,{sender:f,receiverTeamfile:d,receiverAlias:c.alias,rootTeamfile:m,payload:e.prompt});return a=ba(`enqueued mailbox message ${x.id}`,null),Cu(x.id,f,d,c.alias)}let I=await xn(r,{...n,message:e.prompt,response:null,status:"error",error_detail:w});return a=Mu(w,I),{status:"busy",message:w,teamChatLogId:I}}if(await $F(r,d,c.alias)){if(f!==null){let x=await $u(r,{sender:f,receiverTeamfile:d,receiverAlias:c.alias,rootTeamfile:m,payload:e.prompt});return a=ba(`enqueued mailbox message ${x.id}`,null),Cu(x.id,f,d,c.alias)}let w=await CF(r,d,c.alias),I=await xn(r,{...n,message:e.prompt,response:null,status:"error",error_detail:w});return a=Mu(w,I),{status:"busy",message:w,teamChatLogId:I}}if(f!==null&&f.teamfile!==d){let w=await $(r,I=>dE(I,{root:m,sender:f,receiverTeamfile:d,receiverAlias:c.alias,now:new Date}));if(w.stop){let I=fE(w.chain),x=await xn(r,{...n,message:e.prompt,response:null,status:"error",error_detail:I});return a=Sa(I,x),{status:"error",errorKind:"cycle",message:I,teamChatLogId:x}}}let g=await JF(r,{receiver_teamfile:d,receiver_alias:c.alias,sender_teamfile:f?.teamfile??d,sender_alias:f?.alias??"operator"});if(!g.acquired){let w=Eb(d,c.alias,g.current);if(f!==null){let x=await $u(r,{sender:f,receiverTeamfile:d,receiverAlias:c.alias,rootTeamfile:m,payload:e.prompt});return a=ba(`enqueued mailbox message ${x.id}`,null),Cu(x.id,f,d,c.alias)}let I=await xn(r,{...n,message:e.prompt,response:null,status:"error",error_detail:w});return a=Mu(w,I),{status:"busy",message:w,teamChatLogId:I}}s=g.lease;let h=await Qo({sender:f??{teamfile:d,alias:"operator"},receiver:{teamfile:d,alias:c.alias,provider:c.provider,sessionId:c.sessionid,cwd:c.sessiondir,...c.model!==void 0?{model:c.model}:{},...c.effort!==void 0?{effort:c.effort}:{},...c.isLead!==void 0?{isLead:c.isLead}:{}},newMessage:e.prompt,newMessageFrom:f===null?"operator":`${f.teamfile}:${f.alias}`,io:r,permissionMode:e.permissionMode,env:e.env??process.env,...e.idleTimeoutMs!==void 0?{idleTimeoutMs:e.idleTimeoutMs}:{},onDelta:w=>t({kind:"delta",chunk:w}),onProgress:w=>t({kind:"progress",alias:c.alias,event:w}),onPromptBuilt:w=>{if(l=w,i!==null)return DF(r,i,w)}});l=h.prompt;let S=h.status==="stalled",y=await xn(r,{...n,message:l,response:S?null:h.receipt,status:n.policy?.outOfPolicy===!0?"out_of_policy":S?"error":"ok",error_detail:n.policy?.outOfPolicy===!0?n.policy.reason:S?`provider stalled${h.stalledAfterMs!==void 0?` after ${h.stalledAfterMs}ms`:""}`:null});return a=S?Sa(`provider stalled${h.stalledAfterMs!==void 0?` after ${h.stalledAfterMs}ms`:""}`,y,h.receipt):ba(h.receipt,y),{status:S?"stalled":"ok",replyText:h.receipt,wroteDelta:h.wroteDelta,teamChatLogId:y,durationMs:h.durationMs}}catch(c){let d=c instanceof Error?c.message:String(c),u=n===null?null:await xn(r,{...n,message:l,response:null,status:n.policy?.outOfPolicy===!0?"out_of_policy":"error",error_detail:n.policy?.outOfPolicy===!0?`${n.policy.reason}; provider error: ${d}`:d});return a=Sa(d,u),{status:"error",errorKind:c instanceof ge?"target":"provider",message:d,teamChatLogId:u}}finally{o!==void 0&&clearInterval(o),s!==null&&await XF(r,s),i!==null&&await jF(r,i,a??Sa("chat turn exited without a terminal outcome",null))}}function OF(e,t){return{...e,stdout:{write:()=>{}},stderr:{write:r=>{t({kind:"warning",message:r})}}}}async function $F(e,t,r){return await $(e,n=>Zw(n,t,r))}async function CF(e,t,r){let n=await wb(e,t,r);if(n!==null)return Au(n);let s=await $(e,i=>i.getAgentInflight(t,r));return s!==null?Eb(t,r,s):`${r} is busy; wait and retry`}async function $u(e,t){return await $(e,r=>r.enqueueMail({sender_teamfile:t.sender.teamfile,sender_alias:t.sender.alias,receiver_teamfile:t.receiverTeamfile,receiver_alias:t.receiverAlias,root_teamfile:t.rootTeamfile,payload:t.payload}))}function Cu(e,t,r,n){let s=`${r}:${n}`;return{status:"enqueued",id:e,message:`mailbox message ${e} enqueued to ${s}`,teamChatLogId:null,sender:`${t.teamfile}:${t.alias}`,receiver:s}}async function MF(e,t){try{return(await $(e,n=>n.startTrackedInvocation({kind:"chat",origin:t.origin,scope_teamfile:t.receiverTeamfile,from_identity:t.sender===null?"operator":`${t.sender.teamfile}:${t.sender.alias}`,target_teamfile:t.receiverTeamfile,target_alias:t.receiverAlias,root_teamfile:t.rootTeamfile,cwd:t.cwd??null,command:FF(t.receiverTeamfile,t.receiverAlias,t.prompt),holder_pid:process.pid,request_payload:t.prompt,meta:JSON.stringify({provider:t.provider,model:t.model??null,sessionid:t.sessionId??null})}))).id}catch(r){return ce()&&Le(JSON.stringify({event:"tracked_invocation_start_error",error:r instanceof Error?r.message:String(r)})),null}}async function jF(e,t,r){try{await $(e,n=>{n.finishTrackedInvocation(t,r)})}catch(n){ce()&&Le(JSON.stringify({event:"tracked_invocation_finish_error",id:t,error:n instanceof Error?n.message:String(n)}))}}async function DF(e,t,r){try{await $(e,n=>{n.updateTrackedInvocationRequestPayload(t,r)})}catch(n){ce()&&Le(JSON.stringify({event:"tracked_invocation_request_payload_error",id:t,error:n instanceof Error?n.message:String(n)}))}}function PF(e,t){if(t===null)return;let r=setInterval(()=>{$(e,n=>n.heartbeatTrackedInvocation(t)).catch(n=>{ce()&&Le(JSON.stringify({event:"tracked_invocation_heartbeat_error",id:t,error:n instanceof Error?n.message:String(n)}))})},LF);return r.unref?.(),r}function ba(e,t){return{status:"done",result_summary:va(e),error:null,team_chat_log_id:t}}function Mu(e,t){return{status:"busy",result_summary:va(e),error:e,team_chat_log_id:t}}function Sa(e,t,r){return{status:"error",result_summary:va(r===void 0?e:r),error:e,team_chat_log_id:t}}function va(e){let t=e.replace(/\s+/gu," ").trim();return t.length<=500?t:`${t.slice(0,497)}...`}function FF(e,t,r){return`lmctl chat ${JSON.stringify(e)} ${t} ${JSON.stringify(r)}`}function UF(e,t){let r=_b(t,e);if(r.ok)return{sender:qr(r.identity),origin:"agent"};if(r.reason==="unset")return{sender:null,origin:"operator"};throw new Error($s("chat"))}async function WF(e,t){if(t.explicitRoot!==void 0)return await $(e,n=>we(t.explicitRoot,n));if(t.operatorOrigin||t.sender===null)return t.receiverTeamfile;let r=t.sender;return await $(e,n=>uE(n,{sender:r,now:new Date})??t.receiverTeamfile)}async function BF(e,t){return await $(e,r=>lb({rootTeamfile:t.rootTeamfile,fromTeamfile:t.sender.teamfile,fromAlias:t.sender.alias,toTeamfile:t.receiverTeamfile,toAlias:t.receiverAlias,registry:qF(r,t.sender.teamfile,t.receiverTeamfile)}))}function qF(e,t,r){return{teams:[t,r].map(s=>HF(s,e))}}function HF(e,t){let r=De(e,t),n=At(r);return{teamfile:e,aliases:r.members.map(s=>s.alias),leadAlias:n?.alias??null}}async function JF(e,t){return await $(e,r=>{let n=ce(),s=hr(r,{receiver_teamfile:t.receiver_teamfile,receiver_alias:t.receiver_alias,sender_teamfile:t.sender_teamfile,sender_alias:t.sender_alias,ttlMs:gr()});return s.acquired?(n&&Le(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:t.receiver_teamfile,alias:t.receiver_alias},sender:{teamfile:t.sender_teamfile,alias:t.sender_alias},result:s.reclaimReason===null?"acquired":"reclaimed",...s.reclaimReason===null?{}:{reclaim_reason:s.reclaimReason,holder:gb(s.previous)}})),{acquired:!0,lease:s.lease}):(n&&Le(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:t.receiver_teamfile,alias:t.receiver_alias},sender:{teamfile:t.sender_teamfile,alias:t.sender_alias},result:"rejected",holder:gb(s.current)})),{acquired:!1,current:s.current})})}async function wb(e,t,r){return await $(e,n=>{for(let i=0;i<2;i+=1){let o=n.getTerminalLock(t,r);if(o===null)return null;if(xu(o).live)return o;let l=n.getAgentInflight(t,r);if(n.clearTerminalLock(t,r,o.lock_id))return l!==null&&l.sender_teamfile===t&&l.sender_alias==="terminal"&&n.clearObservedTerminalAgentInflight(t,r,{sender_teamfile:l.sender_teamfile,sender_alias:l.sender_alias,started_at:l.started_at,holder_pid:l.holder_pid}),null}let s=n.getTerminalLock(t,r);return s===null?null:xu(s).live?s:null})}function gb(e){return e===null?null:{sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,holder_pid:e.holder_pid,started_at:e.started_at}}async function XF(e,t){try{await $(e,r=>{r.releaseAgentInflight(t)})}catch(r){e.stderr.write(`warning: failed to release chat in-flight slot: ${r instanceof Error?r.message:String(r)}
2090
2090
  `)}}function Eb(e,t,r){return`${t} is servicing ${r.sender_alias} (${r.sender_teamfile}) since ${r.started_at} \u2014 wait and retry, or inspect without waking it: lmctl tail "${e}" ${t}`}async function xn(e,t){let r=yb(t.message),n=t.response===null?null:yb(t.response);try{return await $(e,s=>s.insertTeamChatLog({root_teamfile:t.root_teamfile,sender_teamfile:t.sender_teamfile,sender_alias:t.sender_alias,receiver_teamfile:t.receiver_teamfile,receiver_alias:t.receiver_alias,message:r.text,response:n?.text??null,origin:t.origin,status:t.status,error_detail:t.error_detail,truncated:r.truncated||n?.truncated?1:0,created_at:new Date().toISOString()}))}catch(s){return e.stderr.write(`warning: failed to record chat log: ${s instanceof Error?s.message:String(s)}
2091
- `),null}}function yb(e){return e.length<=hb?{text:e,truncated:!1}:{text:e.slice(0,hb),truncated:!0}}var hb,LF,Du=T(()=>{"use strict";Lt();zt();Os();cb();Rt();ea();ve();Re();Fr();Lu();Ta();$u();Hd();hb=256*1024,LF=3e4});var vb={};ye(vb,{parseIdleTimeoutMs:()=>bb,runChat:()=>VF});async function VF(e,t={stdout:process.stdout,stderr:process.stderr}){let r=t.env??process.env;if(e.length===0||e[0]==="--help"||e[0]==="-h")return t.stdout.write(`${Tb}
2091
+ `),null}}function yb(e){return e.length<=hb?{text:e,truncated:!1}:{text:e.slice(0,hb),truncated:!0}}var hb,LF,ju=T(()=>{"use strict";Lt();zt();Os();cb();Rt();ea();ve();Re();Fr();Ru();Ta();Ou();qd();hb=256*1024,LF=3e4});var vb={};ye(vb,{parseIdleTimeoutMs:()=>bb,runChat:()=>VF});async function VF(e,t={stdout:process.stdout,stderr:process.stderr}){let r=t.env??process.env;if(e.length===0||e[0]==="--help"||e[0]==="-h")return t.stdout.write(`${Tb}
2092
2092
  `),e.length===0?2:0;let n=KF(e);if(typeof n=="string")return t.stderr.write(`error: ${n}
2093
2093
  ${Tb}
2094
2094
  `),2;if(n.runFlag!==void 0){let u=Number.parseInt(n.runFlag,10);return!Number.isFinite(u)||u<=0||String(u)!==n.runFlag?(t.stderr.write(`error: invalid --run "${n.runFlag}" (expected a positive integer run id)
@@ -2125,7 +2125,7 @@ ${Tb}
2125
2125
  `),1}}function KF(e){let t=[],r="yolo",n,s,i,o,a,l=!1,c=!1;for(let p=0;p<e.length;p+=1){let _=e[p];if(_==="--permission-mode"){let g=e[++p];if(g===void 0||g.startsWith("--"))return"missing value for --permission-mode";if(g!=="plan"&&g!=="yolo")return`--permission-mode must be one of plan|yolo (got "${g}")`;r=g;continue}if(_==="--idle-timeout"){let g=e[++p];if(g===void 0||g.startsWith("--"))return"missing value for --idle-timeout";let h=bb(g);if(typeof h=="string")return h;n=h;continue}if(_==="--session"){let g=e[++p];if(g===void 0||g.startsWith("--"))return"missing value for --session";s=g;continue}if(_==="--provider"){let g=e[++p];if(g===void 0||g.startsWith("--"))return"missing value for --provider";i=g;continue}if(_==="--from"||_.startsWith("--from="))return pb("chat");if(_.startsWith("I_am="))return`unknown argument: ${_}`;if(_==="--root"){let g=e[++p];if(g===void 0||g.startsWith("--"))return"missing value for --root";o=g;continue}if(_==="--force"||_.startsWith("--force="))return"unknown option --force (a dead holder auto-reclaims; for a live holder use lmctl chat)";if(_==="--json"){c=!0;continue}if(_==="--run"){let g=e[++p];if(g===void 0||g.startsWith("--"))return"missing value for --run";a=g;continue}if(_==="--done"){l=!0;continue}if(_.startsWith("--"))return`unknown flag: ${_}`;t.push(_)}if(a!==void 0)return s!==void 0?"--run is mutually exclusive with --session":i!==void 0?"--run is mutually exclusive with --provider":o!==void 0?"--run is mutually exclusive with --root":t.length===0?"a prompt (answer) is required with --run":t.length>1?`--run takes exactly one positional (the answer); got ${t.length}`:{prompt:t[0],permissionMode:r,runFlag:a,done:l,json:c};let d,u,f;if(t.length===0)return"a prompt is required";if(t.length===1){if(s===void 0)return'expected <teamfile>:<alias> "<prompt>" | <teamfile> <alias> "<prompt>" | <sessionid> "<prompt>" | --session <id> "<prompt>"';f=t[0]}else if(t.length===2)d=t[0],f=t[1];else if(t.length===3)d=t[0],u=t[1],f=t[2];else return`too many positionals (${t.length}); expected at most <teamfile> <alias> <prompt>`;if(l)return"--done requires --run";let m={prompt:f,permissionMode:r};return d!==void 0&&(m.target=d),u!==void 0&&(m.alias=u),n!==void 0&&(m.idleTimeoutMs=n),s!==void 0&&(m.sessionFlag=s),i!==void 0&&(m.providerFlag=i),o!==void 0&&(m.rootFlag=o),c&&(m.json=c),m}function bb(e){if(e==="0")return 0;if(/^\d+$/.test(e))return Number(e);let t=/^(\d+)([smhd])$/.exec(e);if(t===null)return`invalid --idle-timeout "${e}" (expected <n>(s|m|h|d), integer ms, or 0)`;let r=Number(t[1]),n=t[2];return r*(n==="s"?1e3:n==="m"?6e4:n==="h"?36e5:864e5)}function Sb(e,t,r){r.kind==="tool_use"?e.stderr.write(`[${t}] tool_use ${r.tool??"tool"}${r.summary?`: ${r.summary}`:""}
2126
2126
  `):r.kind==="tool_result"?e.stderr.write(`[${t}] tool_result${r.status?` ${r.status}`:""}${r.summary?`: ${r.summary}`:""}
2127
2127
  `):r.kind==="api_retry"&&e.stderr.write(`[${t}] api_retry${r.summary?`: ${r.summary}`:""}
2128
- `)}function YF(e,t){return e.slice(-t)}function zF(e,t){t.kind==="delta"?e.stdout.write(t.chunk):t.kind==="progress"?Sb(e,t.alias,t.event):e.stderr.write(t.message)}var GF,Tb,kb=T(()=>{"use strict";vt();Re();Lt();Du();Ta();ve();Xo();Jt();GF={name:"chat",allowsBareTeamfile:!1,supportsRaw:!0},Tb=`usage: lmctl chat <teamfile>:<alias> "<prompt>"
2128
+ `)}function YF(e,t){return e.slice(-t)}function zF(e,t){t.kind==="delta"?e.stdout.write(t.chunk):t.kind==="progress"?Sb(e,t.alias,t.event):e.stderr.write(t.message)}var GF,Tb,kb=T(()=>{"use strict";vt();Re();Lt();ju();Ta();ve();Xo();Jt();GF={name:"chat",allowsBareTeamfile:!1,supportsRaw:!0},Tb=`usage: lmctl chat <teamfile>:<alias> "<prompt>"
2129
2129
  lmctl chat <teamfile> <alias> "<prompt>"
2130
2130
  lmctl chat <sessionid> "<prompt>" --provider <name>
2131
2131
  lmctl chat --provider <name> --session <id> "<prompt>"
@@ -2133,40 +2133,40 @@ ${Tb}
2133
2133
  [--permission-mode plan|yolo] [--idle-timeout <duration>]
2134
2134
  [--root <teamfile>] [--json]
2135
2135
 
2136
- Send a prompt to a team member or raw provider session, or answer a paused run.`});function Cs(e){for(let t=e.length-1;t>=0;t-=1){let r=e[t],n=ZF.exec(r.content);if(n===null){if(r.role==="assistant"&&r.content.trim().length>0)return null;continue}let s=Number.parseInt(n[1],10),i=n[2]===void 0?0:Number.parseInt(n[2],10),o=n[3].toLowerCase(),a=n[4]?.trim()??null,l=`${n[1]}${n[2]!==void 0?`:${n[2]}`:""}${o}`;return{state:"LIMITED",resets_at:a===null?null:QF(r.timestamp,s,i,o,a),reset_time:l,timezone:a,detected_at:r.timestamp.toISOString()}}return null}function QF(e,t,r,n,s){if(!Number.isFinite(e.getTime())||t<1||t>12||r<0||r>59)return null;let i=e1(t,n);try{let o=t1(e,s),a=Ib(o.year,o.month,o.day,i,r,s);if(a.getTime()<=e.getTime()){let l=i1(o,1);a=Ib(l.year,l.month,l.day,i,r,s)}return a.toISOString()}catch{return null}}function e1(e,t){return t==="am"?e===12?0:e:e===12?12:e+12}function t1(e,t){let r=Nb(t,!1).formatToParts(e);return{year:Zt(r,"year"),month:Zt(r,"month"),day:Zt(r,"day")}}function Ib(e,t,r,n,s,i){let o=Date.UTC(e,t-1,r,n,s,0,0);for(let a=0;a<3;a+=1){let l=r1(new Date(o),i);o=Date.UTC(e,t-1,r,n,s,0,0)-l}return new Date(o)}function r1(e,t){let r=Nb(t,!0).formatToParts(e);return Date.UTC(Zt(r,"year"),Zt(r,"month")-1,Zt(r,"day"),Zt(r,"hour"),Zt(r,"minute"),Zt(r,"second"),0)-e.getTime()}function Nb(e,t){let r=t?s1:n1,n=r.get(e);if(n!==void 0)return n;let s=new Intl.DateTimeFormat("en-US",{timeZone:e,hourCycle:"h23",year:"numeric",month:"2-digit",day:"2-digit",...t?{hour:"2-digit",minute:"2-digit",second:"2-digit"}:{}});return r.set(e,s),s}function Zt(e,t){let r=e.find(n=>n.type===t)?.value;if(r===void 0)throw new Error(`missing ${t}`);return Number.parseInt(r,10)}function i1(e,t){let r=new Date(Date.UTC(e.year,e.month-1,e.day+t));return{year:r.getUTCFullYear(),month:r.getUTCMonth()+1,day:r.getUTCDate()}}var ZF,n1,s1,Pu=T(()=>{"use strict";ZF=/you['\u2019]ve hit your session limit\s*(?:\u00b7|-|:)?\s*resets\s+([0-9]{1,2})(?::([0-9]{2}))?\s*(am|pm)\s*(?:\(([^)]+)\))?/i;n1=new Map,s1=new Map});function Ia(e){return o1.has(e)}function Uu(){return Fu===null&&(Fu=Et(bt())),Fu}function Wu(e,t,r={}){if(!Ia(e))return null;try{let n=Uu().getAdapter?.(e);if(n===void 0)return null;let s=n.resumeCommand(t).trim();if(s.length===0)return null;let i=s.split(/\s+/),o=e==="codex"&&r.isLead===!0?di({warn:()=>{}}):[];return[...i,...o,...xb[e]??[]]}catch{return null}}function Na(e,t){let r=Wu(e,t);return r===null?null:r.join(" ")}function Qt(e,t){return Uu().getSession(e,t)}async function xa(e){return(await Uu().resolveSessions(e)).map(r=>r.provider.name)}var xb,o1,Ab,Fu,An=T(()=>{"use strict";vt();hl();xb={claude:["--dangerously-skip-permissions"],codex:["--dangerously-bypass-approvals-and-sandbox"],gemini:["-y"],copilot:["--yolo"],opencode:[],qwen:["--approval-mode","yolo"],agy:[],lmplayer:[]},o1=new Set(Object.keys(xb)),Ab=/^[\w.:-]+$/;Fu=null});var Ob={};ye(Ob,{runRecover:()=>l1});import{dirname as Rb,resolve as Lb}from"node:path";async function l1(e,t,r={}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(`${Bu}
2136
+ Send a prompt to a team member or raw provider session, or answer a paused run.`});function Cs(e){for(let t=e.length-1;t>=0;t-=1){let r=e[t],n=ZF.exec(r.content);if(n===null){if(r.role==="assistant"&&r.content.trim().length>0)return null;continue}let s=Number.parseInt(n[1],10),i=n[2]===void 0?0:Number.parseInt(n[2],10),o=n[3].toLowerCase(),a=n[4]?.trim()??null,l=`${n[1]}${n[2]!==void 0?`:${n[2]}`:""}${o}`;return{state:"LIMITED",resets_at:a===null?null:QF(r.timestamp,s,i,o,a),reset_time:l,timezone:a,detected_at:r.timestamp.toISOString()}}return null}function QF(e,t,r,n,s){if(!Number.isFinite(e.getTime())||t<1||t>12||r<0||r>59)return null;let i=e1(t,n);try{let o=t1(e,s),a=Ib(o.year,o.month,o.day,i,r,s);if(a.getTime()<=e.getTime()){let l=i1(o,1);a=Ib(l.year,l.month,l.day,i,r,s)}return a.toISOString()}catch{return null}}function e1(e,t){return t==="am"?e===12?0:e:e===12?12:e+12}function t1(e,t){let r=Nb(t,!1).formatToParts(e);return{year:Zt(r,"year"),month:Zt(r,"month"),day:Zt(r,"day")}}function Ib(e,t,r,n,s,i){let o=Date.UTC(e,t-1,r,n,s,0,0);for(let a=0;a<3;a+=1){let l=r1(new Date(o),i);o=Date.UTC(e,t-1,r,n,s,0,0)-l}return new Date(o)}function r1(e,t){let r=Nb(t,!0).formatToParts(e);return Date.UTC(Zt(r,"year"),Zt(r,"month")-1,Zt(r,"day"),Zt(r,"hour"),Zt(r,"minute"),Zt(r,"second"),0)-e.getTime()}function Nb(e,t){let r=t?s1:n1,n=r.get(e);if(n!==void 0)return n;let s=new Intl.DateTimeFormat("en-US",{timeZone:e,hourCycle:"h23",year:"numeric",month:"2-digit",day:"2-digit",...t?{hour:"2-digit",minute:"2-digit",second:"2-digit"}:{}});return r.set(e,s),s}function Zt(e,t){let r=e.find(n=>n.type===t)?.value;if(r===void 0)throw new Error(`missing ${t}`);return Number.parseInt(r,10)}function i1(e,t){let r=new Date(Date.UTC(e.year,e.month-1,e.day+t));return{year:r.getUTCFullYear(),month:r.getUTCMonth()+1,day:r.getUTCDate()}}var ZF,n1,s1,Du=T(()=>{"use strict";ZF=/you['\u2019]ve hit your session limit\s*(?:\u00b7|-|:)?\s*resets\s+([0-9]{1,2})(?::([0-9]{2}))?\s*(am|pm)\s*(?:\(([^)]+)\))?/i;n1=new Map,s1=new Map});function Ia(e){return o1.has(e)}function Fu(){return Pu===null&&(Pu=Et(bt())),Pu}function Uu(e,t,r={}){if(!Ia(e))return null;try{let n=Fu().getAdapter?.(e);if(n===void 0)return null;let s=n.resumeCommand(t).trim();if(s.length===0)return null;let i=s.split(/\s+/),o=e==="codex"&&r.isLead===!0?di({warn:()=>{}}):[];return[...i,...o,...xb[e]??[]]}catch{return null}}function Na(e,t){let r=Uu(e,t);return r===null?null:r.join(" ")}function Qt(e,t){return Fu().getSession(e,t)}async function xa(e){return(await Fu().resolveSessions(e)).map(r=>r.provider.name)}var xb,o1,Ab,Pu,An=T(()=>{"use strict";vt();_l();xb={claude:["--dangerously-skip-permissions"],codex:["--dangerously-bypass-approvals-and-sandbox"],gemini:["-y"],copilot:["--yolo"],opencode:[],qwen:["--approval-mode","yolo"],agy:[],lmplayer:[]},o1=new Set(Object.keys(xb)),Ab=/^[\w.:-]+$/;Pu=null});var Ob={};ye(Ob,{runRecover:()=>l1});import{dirname as Rb,resolve as Lb}from"node:path";async function l1(e,t,r={}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(`${Wu}
2137
2137
  `),0;let n=Z(e.filter(p=>p!=="--"),[],["--all","--dry-run","--json"]);if(n.error!==void 0)return v(t,`${n.error}
2138
2138
 
2139
- ${Bu}`);if(n.positionals.length===0)return v(t,`recover requires a <teamfile>
2139
+ ${Wu}`);if(n.positionals.length===0)return v(t,`recover requires a <teamfile>
2140
2140
 
2141
- ${Bu}`);if(n.positionals.length>2)return v(t,`unexpected argument: ${n.positionals[2]}`);let s=n.positionals[0],i=Wr(s),o=i?.teamfile??s,a=n.positionals[1],l=i?.alias??a;if(i!==null&&a!==void 0)return v(t,"recover alias was provided twice; use either <teamfile>:<alias> or <teamfile> <alias>");if(G(n,"--all")&&l!==void 0)return v(t,"recover --all is mutually exclusive with <alias>");let c;try{c=await c1(t,o,l)}catch(p){if(p instanceof ge)return v(t,p.message);throw p}let d=r.now??new Date,u=G(n,"--dry-run"),f=[];for(let p of c)f.push(await d1(t,p,{now:d,dryRun:u}));let m={checked:f.length,recovered:f.filter(p=>p.action==="recovered").length,wouldRecover:f.filter(p=>p.action==="would_recover").length,skipped:f.filter(p=>p.action!=="recovered"&&p.action!=="would_recover").length,errors:f.filter(p=>p.action==="load_error"||p.action==="send_error").length};if(G(n,"--json"))ae(t,{dryRun:u,now:d.toISOString(),summary:m,members:f});else{for(let p of f)t.stdout.write(u1(p));t.stdout.write(`Recover checked ${m.checked}: ${u?`${m.wouldRecover} would recover`:`${m.recovered} recovered`}, ${m.skipped} skipped, ${m.errors} error(s).
2142
- `)}return m.errors>0?1:0}async function c1(e,t,r){return await $(e,n=>{let s=we(t,n);if(r!==void 0){let i=De(s,n);if(i.parseErrors.length>0)throw new ge(`lmctl: ${t}: ${i.parseErrors.join("; ")}`);let o=na(i,r);return o?.teamfile!==void 0?qu(Lb(Rb(s),o.teamfile),n,new Set):[qe(t,r,n)]}return qu(s,n,new Set)})}function qu(e,t,r){let n=we(e,t);if(r.has(n))return[];r.add(n);let s=De(n,t);if(s.parseErrors.length>0)throw new ge(`lmctl: ${n}: ${s.parseErrors.join("; ")}`);let i=[];for(let o of s.members){if(o.teamfile!==void 0){i.push(...qu(Lb(Rb(n),o.teamfile),t,r));continue}o.session!==void 0&&i.push(qe(n,o.alias,t))}return i}async function d1(e,t,r){let n;try{let a=await Qt(t.sessionid,t.provider);if(a===null)return $t(t,"session_not_found",null,"session detail not found");n=Cs(a.messages)}catch(a){return $t(t,"load_error",null,a instanceof Error?a.message:String(a))}if(n===null)return $t(t,"not_limited",null,"no current session-limit marker");if(n.resets_at===null)return $t(t,"unknown_reset",n,"reset time could not be parsed");let s=Date.parse(n.resets_at);if(!Number.isFinite(s))return $t(t,"unknown_reset",n,"reset time could not be parsed");if(s>r.now.getTime())return $t(t,"not_due",n,`resets_at ${n.resets_at} is in the future`);let i=await $(e,a=>a.getAgentInflight(t.teamfile,t.alias));if(i!==null)return $t(t,"busy",n,`in-flight since ${i.started_at}`);if(r.dryRun)return $t(t,"would_recover",n,null);let o=await ka({teamfile:t.teamfile,alias:t.alias,prompt:a1,permissionMode:"yolo",io:e,env:process.env});return o.status==="ok"||o.status==="stalled"?$t(t,"recovered",n,null):$t(t,o.status==="busy"?"busy":"send_error",n,o.message)}function $t(e,t,r,n){return{alias:e.alias,teamfile:e.teamfile,provider:e.provider,sessionid:e.sessionid,action:t,sessionLimit:r,reason:n}}function u1(e){let t=e.sessionLimit?.resets_at??"unknown",r=e.reason===null?"":` (${e.reason})`;return`${e.alias}: ${e.action} resets_at=${t}${r}
2143
- `}var a1,Bu,$b=T(()=>{"use strict";Pu();An();zt();Rt();Lt();Du();Re();a1="Your session limit reset time has passed. Continue your work from the last actionable point.",Bu=["usage: lmctl recover <teamfile> [--all|<alias>] [--dry-run] [--json]","","Wake team members whose latest provider output is a session-limit message","and whose resets_at time has passed. Defaults to the full teamfile report","subtree. A busy/in-flight member is skipped."].join(`
2144
- `)});var Ms,W6,Hu=T(()=>{"use strict";Ms=[{name:"lmctl_chat",description:"Synchronous/blocking backup: send one prompt to a member of an AI-managed .lmctl team \u2014 addressed by teamfile path (team) and alias \u2014 and return the reply. This is the only MCP tool lmctl exposes. Prefer the CLI for normal delegation. For async or long-running work, use the provider or host runtime background/task surface around the blocking command.",inputSchema:{type:"object",properties:{team:{type:"string",description:"Path to .lmctl teamfile"},alias:{type:"string",description:"Target alias; omitted means Lead"},prompt:{type:"string",description:"Prompt text to send"}},required:["team","prompt"]},local:!0}],W6=Ms.length});import{spawn as f1}from"node:child_process";async function Mb(e,t,r){let n=p1.get(e);if(n===void 0)return{status:"error",code:404,message:`unknown tool: ${e}`};let s=t!==null&&typeof t=="object"&&!Array.isArray(t)?t:{};for(let i of n.inputSchema.required??[])if(s[i]===void 0)return{status:"error",code:400,message:`missing required parameter: ${i}`};return _1(n.name,s)}function _1(e,t){return e==="lmctl_chat"?h1(t):{status:"error",code:404,message:`unknown local tool: ${e}`}}function h1(e){let t=typeof e.prompt=="string"?e.prompt:"";if(t.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: prompt"});let r=typeof e.team=="string"?e.team:"";if(r.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: team"});let n=typeof e.alias=="string"&&e.alias.length>0?e.alias:"Lead",s=["chat",r,n,t];return ce()&&Le(JSON.stringify({event:"mcp_chat_spawn",team:r,alias:n})),g1(s,process.cwd())}function g1(e,t){return new Promise(r=>{let n=!1,s,i=d=>{n||(n=!0,s!==void 0&&clearTimeout(s),r(d))},o=f1("lmctl",e,{cwd:t,env:process.env,stdio:["ignore","pipe","pipe"]}),a=y1(process.env);s=setTimeout(()=>{try{o.kill("SIGTERM")}catch{}i({status:"error",code:124,message:`lmctl chat timed out after ${a}ms`})},a),s.unref?.();let l="",c="";o.stdout?.on("data",d=>{l+=d.toString("utf8")}),o.stderr?.on("data",d=>{c+=d.toString("utf8")}),o.on("error",d=>{i({status:"error",code:1,message:`failed to spawn lmctl chat: ${d.message}`})}),o.on("exit",d=>{if(d===0){ce()&&Le(JSON.stringify({event:"mcp_chat_payload",bytes:Buffer.byteLength(l,"utf8"),lines:l.split(`
2145
- `).length})),i({status:"ok",data:{text:l.trim()||"(empty response)"}});return}i({status:"error",code:d??1,message:c.trim()||`lmctl chat exited with code ${d}`})})})}function y1(e){let t=e.LMCTL_MCP_CHAT_TIMEOUT_MS;if(t===void 0||t.trim().length===0)return Cb;let r=Number(t);return!Number.isFinite(r)||r<=0?Cb:r}function Ju(e,t=process.env){let n=e.getConfig("api.url")??(t.LMCTL_API_URL!==void 0&&t.LMCTL_API_URL.length>0?t.LMCTL_API_URL:m1),i=e.getConfig("api.token")??(t.LMCTL_API_TOKEN!==void 0&&t.LMCTL_API_TOKEN.length>0?t.LMCTL_API_TOKEN:null);return{baseUrl:n,token:i}}var m1,Cb,p1,Xu=T(()=>{"use strict";Hu();ve();m1="http://127.0.0.1:8787",Cb=30*60*1e3,p1=new Map(Ms.map(e=>[e.name,e]))});async function b1(e,t){let r=e.id===void 0,n=e.id??null;if(e.method==="exit")return r||t.io.write(Gu({jsonrpc:"2.0",id:n,result:null})),{kind:"exit"};if(e.method==="initialize")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{protocolVersion:w1,capabilities:{tools:{listChanged:!1}},serverInfo:{name:E1,version:T1}}}};if(e.method==="notifications/initialized")return{kind:"notification"};if(e.method==="shutdown")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:null}};if(e.method==="tools/list")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{tools:Ms.map(s=>({name:s.name,description:s.description,inputSchema:s.inputSchema}))}}};if(e.method==="tools/call"){let s=e.params!==null&&typeof e.params=="object"?e.params:{},i=typeof s.name=="string"?s.name:"",o=s.arguments,a=await Mb(i,o,t.dispatch),l=i==="lmctl_chat"&&a.status==="ok"&&a.data!==null&&typeof a.data=="object"&&typeof a.data.text=="string"?a.data.text:JSON.stringify(a);return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{isError:a.status==="error",content:[{type:"text",text:l}]}}}}return r?{kind:"notification"}:{kind:"response",message:{jsonrpc:"2.0",id:n,error:{code:-32601,message:`method not found: ${e.method}`}}}}function Gu(e){return`${JSON.stringify(e)}
2146
- `}async function jb(e,t){let r=!1,n="",s=!1,i=async o=>{let a=o.trim();if(a.length===0)return;let l;try{l=JSON.parse(a)}catch(d){e.io.write(Gu({jsonrpc:"2.0",id:null,error:{code:-32700,message:`parse error: ${d instanceof Error?d.message:String(d)}`}}));return}l.method==="shutdown"&&(r=!0);let c=await b1(l,e);c.kind==="response"?e.io.write(Gu(c.message)):c.kind==="exit"&&(s=!0)};return new Promise(o=>{let a=Promise.resolve(),l=!1,c=u=>{l||(l=!0,o(u))},d=()=>{let u=n.indexOf(`
2141
+ ${Wu}`);if(n.positionals.length>2)return v(t,`unexpected argument: ${n.positionals[2]}`);let s=n.positionals[0],i=Wr(s),o=i?.teamfile??s,a=n.positionals[1],l=i?.alias??a;if(i!==null&&a!==void 0)return v(t,"recover alias was provided twice; use either <teamfile>:<alias> or <teamfile> <alias>");if(G(n,"--all")&&l!==void 0)return v(t,"recover --all is mutually exclusive with <alias>");let c;try{c=await c1(t,o,l)}catch(p){if(p instanceof ge)return v(t,p.message);throw p}let d=r.now??new Date,u=G(n,"--dry-run"),f=[];for(let p of c)f.push(await d1(t,p,{now:d,dryRun:u}));let m={checked:f.length,recovered:f.filter(p=>p.action==="recovered").length,wouldRecover:f.filter(p=>p.action==="would_recover").length,skipped:f.filter(p=>p.action!=="recovered"&&p.action!=="would_recover").length,errors:f.filter(p=>p.action==="load_error"||p.action==="send_error").length};if(G(n,"--json"))ae(t,{dryRun:u,now:d.toISOString(),summary:m,members:f});else{for(let p of f)t.stdout.write(u1(p));t.stdout.write(`Recover checked ${m.checked}: ${u?`${m.wouldRecover} would recover`:`${m.recovered} recovered`}, ${m.skipped} skipped, ${m.errors} error(s).
2142
+ `)}return m.errors>0?1:0}async function c1(e,t,r){return await $(e,n=>{let s=we(t,n);if(r!==void 0){let i=De(s,n);if(i.parseErrors.length>0)throw new ge(`lmctl: ${t}: ${i.parseErrors.join("; ")}`);let o=na(i,r);return o?.teamfile!==void 0?Bu(Lb(Rb(s),o.teamfile),n,new Set):[qe(t,r,n)]}return Bu(s,n,new Set)})}function Bu(e,t,r){let n=we(e,t);if(r.has(n))return[];r.add(n);let s=De(n,t);if(s.parseErrors.length>0)throw new ge(`lmctl: ${n}: ${s.parseErrors.join("; ")}`);let i=[];for(let o of s.members){if(o.teamfile!==void 0){i.push(...Bu(Lb(Rb(n),o.teamfile),t,r));continue}o.session!==void 0&&i.push(qe(n,o.alias,t))}return i}async function d1(e,t,r){let n;try{let a=await Qt(t.sessionid,t.provider);if(a===null)return $t(t,"session_not_found",null,"session detail not found");n=Cs(a.messages)}catch(a){return $t(t,"load_error",null,a instanceof Error?a.message:String(a))}if(n===null)return $t(t,"not_limited",null,"no current session-limit marker");if(n.resets_at===null)return $t(t,"unknown_reset",n,"reset time could not be parsed");let s=Date.parse(n.resets_at);if(!Number.isFinite(s))return $t(t,"unknown_reset",n,"reset time could not be parsed");if(s>r.now.getTime())return $t(t,"not_due",n,`resets_at ${n.resets_at} is in the future`);let i=await $(e,a=>a.getAgentInflight(t.teamfile,t.alias));if(i!==null)return $t(t,"busy",n,`in-flight since ${i.started_at}`);if(r.dryRun)return $t(t,"would_recover",n,null);let o=await ka({teamfile:t.teamfile,alias:t.alias,prompt:a1,permissionMode:"yolo",io:e,env:process.env});return o.status==="ok"||o.status==="stalled"?$t(t,"recovered",n,null):$t(t,o.status==="busy"?"busy":"send_error",n,o.message)}function $t(e,t,r,n){return{alias:e.alias,teamfile:e.teamfile,provider:e.provider,sessionid:e.sessionid,action:t,sessionLimit:r,reason:n}}function u1(e){let t=e.sessionLimit?.resets_at??"unknown",r=e.reason===null?"":` (${e.reason})`;return`${e.alias}: ${e.action} resets_at=${t}${r}
2143
+ `}var a1,Wu,$b=T(()=>{"use strict";Du();An();zt();Rt();Lt();ju();Re();a1="Your session limit reset time has passed. Continue your work from the last actionable point.",Wu=["usage: lmctl recover <teamfile> [--all|<alias>] [--dry-run] [--json]","","Wake team members whose latest provider output is a session-limit message","and whose resets_at time has passed. Defaults to the full teamfile report","subtree. A busy/in-flight member is skipped."].join(`
2144
+ `)});var Ms,J6,qu=T(()=>{"use strict";Ms=[{name:"lmctl_chat",description:"Synchronous/blocking backup: send one prompt to a member of an AI-managed .lmctl team \u2014 addressed by teamfile path (team) and alias \u2014 and return the reply. This is the only MCP tool lmctl exposes. Prefer the CLI for normal delegation. For async or long-running work, use the provider or host runtime background/task surface around the blocking command.",inputSchema:{type:"object",properties:{team:{type:"string",description:"Path to .lmctl teamfile"},alias:{type:"string",description:"Target alias; omitted means Lead"},prompt:{type:"string",description:"Prompt text to send"}},required:["team","prompt"]},local:!0}],J6=Ms.length});import{spawn as f1}from"node:child_process";async function Mb(e,t,r){let n=p1.get(e);if(n===void 0)return{status:"error",code:404,message:`unknown tool: ${e}`};let s=t!==null&&typeof t=="object"&&!Array.isArray(t)?t:{};for(let i of n.inputSchema.required??[])if(s[i]===void 0)return{status:"error",code:400,message:`missing required parameter: ${i}`};return _1(n.name,s)}function _1(e,t){return e==="lmctl_chat"?h1(t):{status:"error",code:404,message:`unknown local tool: ${e}`}}function h1(e){let t=typeof e.prompt=="string"?e.prompt:"";if(t.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: prompt"});let r=typeof e.team=="string"?e.team:"";if(r.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: team"});let n=typeof e.alias=="string"&&e.alias.length>0?e.alias:"Lead",s=["chat",r,n,t];return ce()&&Le(JSON.stringify({event:"mcp_chat_spawn",team:r,alias:n})),g1(s,process.cwd())}function g1(e,t){return new Promise(r=>{let n=!1,s,i=d=>{n||(n=!0,s!==void 0&&clearTimeout(s),r(d))},o=f1("lmctl",e,{cwd:t,env:process.env,stdio:["ignore","pipe","pipe"]}),a=y1(process.env);s=setTimeout(()=>{try{o.kill("SIGTERM")}catch{}i({status:"error",code:124,message:`lmctl chat timed out after ${a}ms`})},a),s.unref?.();let l="",c="";o.stdout?.on("data",d=>{l+=d.toString("utf8")}),o.stderr?.on("data",d=>{c+=d.toString("utf8")}),o.on("error",d=>{i({status:"error",code:1,message:`failed to spawn lmctl chat: ${d.message}`})}),o.on("exit",d=>{if(d===0){ce()&&Le(JSON.stringify({event:"mcp_chat_payload",bytes:Buffer.byteLength(l,"utf8"),lines:l.split(`
2145
+ `).length})),i({status:"ok",data:{text:l.trim()||"(empty response)"}});return}i({status:"error",code:d??1,message:c.trim()||`lmctl chat exited with code ${d}`})})})}function y1(e){let t=e.LMCTL_MCP_CHAT_TIMEOUT_MS;if(t===void 0||t.trim().length===0)return Cb;let r=Number(t);return!Number.isFinite(r)||r<=0?Cb:r}function Hu(e,t=process.env){let n=e.getConfig("api.url")??(t.LMCTL_API_URL!==void 0&&t.LMCTL_API_URL.length>0?t.LMCTL_API_URL:m1),i=e.getConfig("api.token")??(t.LMCTL_API_TOKEN!==void 0&&t.LMCTL_API_TOKEN.length>0?t.LMCTL_API_TOKEN:null);return{baseUrl:n,token:i}}var m1,Cb,p1,Ju=T(()=>{"use strict";qu();ve();m1="http://127.0.0.1:8787",Cb=30*60*1e3,p1=new Map(Ms.map(e=>[e.name,e]))});async function b1(e,t){let r=e.id===void 0,n=e.id??null;if(e.method==="exit")return r||t.io.write(Xu({jsonrpc:"2.0",id:n,result:null})),{kind:"exit"};if(e.method==="initialize")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{protocolVersion:w1,capabilities:{tools:{listChanged:!1}},serverInfo:{name:E1,version:T1}}}};if(e.method==="notifications/initialized")return{kind:"notification"};if(e.method==="shutdown")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:null}};if(e.method==="tools/list")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{tools:Ms.map(s=>({name:s.name,description:s.description,inputSchema:s.inputSchema}))}}};if(e.method==="tools/call"){let s=e.params!==null&&typeof e.params=="object"?e.params:{},i=typeof s.name=="string"?s.name:"",o=s.arguments,a=await Mb(i,o,t.dispatch),l=i==="lmctl_chat"&&a.status==="ok"&&a.data!==null&&typeof a.data=="object"&&typeof a.data.text=="string"?a.data.text:JSON.stringify(a);return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{isError:a.status==="error",content:[{type:"text",text:l}]}}}}return r?{kind:"notification"}:{kind:"response",message:{jsonrpc:"2.0",id:n,error:{code:-32601,message:`method not found: ${e.method}`}}}}function Xu(e){return`${JSON.stringify(e)}
2146
+ `}async function jb(e,t){let r=!1,n="",s=!1,i=async o=>{let a=o.trim();if(a.length===0)return;let l;try{l=JSON.parse(a)}catch(d){e.io.write(Xu({jsonrpc:"2.0",id:null,error:{code:-32700,message:`parse error: ${d instanceof Error?d.message:String(d)}`}}));return}l.method==="shutdown"&&(r=!0);let c=await b1(l,e);c.kind==="response"?e.io.write(Xu(c.message)):c.kind==="exit"&&(s=!0)};return new Promise(o=>{let a=Promise.resolve(),l=!1,c=u=>{l||(l=!0,o(u))},d=()=>{let u=n.indexOf(`
2147
2147
  `);for(;u!==-1;){let f=n.slice(0,u);n=n.slice(u+1),a=a.then(()=>i(f)).then(()=>{s&&c(0)}),u=n.indexOf(`
2148
2148
  `)}};t.setEncoding("utf8"),t.on("data",u=>{n+=u,d()}),t.on("end",()=>{n.trim().length>0&&(a=a.then(()=>i(n))),a.finally(()=>c(0))}),t.on("error",u=>{e.io.log?.(`mcp: stdin error: ${u.message}
2149
- `),a.finally(()=>c(1))})})}var w1,E1,T1,Db=T(()=>{"use strict";Hu();Xu();w1="2025-06-18",E1="lmctl",T1="0.0.1"});var Fb={};ye(Fb,{runMcp:()=>v1});async function v1(e,t={stdout:process.stdout,stderr:process.stderr},r=process.stdin){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(S1),0;if(e.length>0)return t.stderr.write(`usage: lmctl mcp
2150
- `),2;V({event:"mcp_bridge_start",pid:process.pid});let n=t.dal===void 0,s=t.dal??k1(),i=1;try{let o=s===void 0?Ju({getConfig:()=>null},process.env):Ju(s,process.env);return i=await jb({io:{write:l=>t.stdout.write(l),log:l=>t.stderr.write(l)},dispatch:{config:o,...s!==void 0?{dal:s}:{}}},r),i}finally{V({event:"mcp_bridge_exit",pid:process.pid,exit_code:i}),n&&s!==void 0&&s.close()}}function k1(){let e=le(),t=3;for(let r=1;r<=t;r+=1)try{return Ie({path:e})}catch(n){let s=n instanceof Error?n.message:String(n);if(V({event:"mcp_bridge_db_open_failed",pid:process.pid,attempt:r,db_path:e,error_message:s}),r<t&&Pb(s))I1(50*r);else if(!Pb(s))break}}function Pb(e){return/SQLITE_BUSY|database is locked|database is busy/i.test(e)}function I1(e){let t=new Int32Array(new SharedArrayBuffer(4));Atomics.wait(t,0,0,e)}var S1,Ub=T(()=>{"use strict";Ze();Xu();Db();ve();Je();S1=`usage: lmctl mcp
2149
+ `),a.finally(()=>c(1))})})}var w1,E1,T1,Db=T(()=>{"use strict";qu();Ju();w1="2025-06-18",E1="lmctl",T1="0.0.1"});var Fb={};ye(Fb,{runMcp:()=>v1});async function v1(e,t={stdout:process.stdout,stderr:process.stderr},r=process.stdin){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(S1),0;if(e.length>0)return t.stderr.write(`usage: lmctl mcp
2150
+ `),2;V({event:"mcp_bridge_start",pid:process.pid});let n=t.dal===void 0,s=t.dal??k1(),i=1;try{let o=s===void 0?Hu({getConfig:()=>null},process.env):Hu(s,process.env);return i=await jb({io:{write:l=>t.stdout.write(l),log:l=>t.stderr.write(l)},dispatch:{config:o,...s!==void 0?{dal:s}:{}}},r),i}finally{V({event:"mcp_bridge_exit",pid:process.pid,exit_code:i}),n&&s!==void 0&&s.close()}}function k1(){let e=le(),t=3;for(let r=1;r<=t;r+=1)try{return Ie({path:e})}catch(n){let s=n instanceof Error?n.message:String(n);if(V({event:"mcp_bridge_db_open_failed",pid:process.pid,attempt:r,db_path:e,error_message:s}),r<t&&Pb(s))I1(50*r);else if(!Pb(s))break}}function Pb(e){return/SQLITE_BUSY|database is locked|database is busy/i.test(e)}function I1(e){let t=new Int32Array(new SharedArrayBuffer(4));Atomics.wait(t,0,0,e)}var S1,Ub=T(()=>{"use strict";Ze();Ju();Db();ve();Je();S1=`usage: lmctl mcp
2151
2151
 
2152
2152
  Start the stdio MCP bridge. The bridge resolves api.url and api.token from
2153
2153
  local config, then uses stdin/stdout for JSON-RPC frames.
2154
- `});var Wb={};ye(Wb,{runDevice:()=>D1});import{readFileSync as N1}from"node:fs";import{homedir as x1}from"node:os";import{join as A1}from"node:path";import{CognitoIdentityClient as R1,GetIdCommand as L1}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as O1}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as $1,ListObjectsV2Command as C1,PutObjectCommand as M1,S3Client as j1}from"@aws-sdk/client-s3";async function D1(e,t={stdout:process.stdout,stderr:process.stderr}){let[r]=e;if(r===void 0||r==="--help"||r==="-h"||r==="help")return t.stdout.write(Vu),0;if(r==="init"){let n=Su();return t.stdout.write(`${n.device_id}
2154
+ `});var Wb={};ye(Wb,{runDevice:()=>D1});import{readFileSync as N1}from"node:fs";import{homedir as x1}from"node:os";import{join as A1}from"node:path";import{CognitoIdentityClient as R1,GetIdCommand as L1}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as O1}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as $1,ListObjectsV2Command as C1,PutObjectCommand as M1,S3Client as j1}from"@aws-sdk/client-s3";async function D1(e,t={stdout:process.stdout,stderr:process.stderr}){let[r]=e;if(r===void 0||r==="--help"||r==="-h"||r==="help")return t.stdout.write(Gu),0;if(r==="init"){let n=bu();return t.stdout.write(`${n.device_id}
2155
2155
  `),0}if(r==="id"){let n=Br();return n===null?(t.stderr.write(`error: no device id initialized at ${pa()}; run 'lmctl device init'
2156
2156
  `),1):(t.stdout.write(`${n.device_id}
2157
2157
  `),0)}return r==="login"?await P1(e.slice(1),t):r==="prompt"?await U1(e.slice(1),t):(t.stderr.write(`usage: lmctl device <id|init|login|prompt>
2158
2158
  `),1)}async function P1(e,t){let r=F1(e);if(typeof r=="string")return t.stderr.write(`error: ${r}
2159
- ${Vu}`),2;let n=Rs();if(n.config===void 0)return t.stderr.write(`error: mailbox is not configured; missing ${n.missing.join(", ")}
2159
+ ${Gu}`),2;let n=Rs();if(n.config===void 0)return t.stderr.write(`error: mailbox is not configured; missing ${n.missing.join(", ")}
2160
2160
  `),1;lT({userId:r.userId,refreshToken:r.accessKey});let s,i,o;try{let c=await la({region:n.config.region,clientId:n.config.cognitoClientId??ma,refreshToken:r.accessKey});s=c.idToken,i=c.accessToken,o=c.expiresAt}catch(c){let d=c instanceof Error?c.message:String(c);return t.stderr.write(`error: could not authenticate access key: ${d}
2161
2161
  `),1}let a=Ns(s);if(a!==null&&a!==r.userId)return t.stderr.write(`error: access key belongs to user-id ${a}, not ${r.userId}
2162
- `),1;pu({idToken:s,...i!==void 0?{accessToken:i}:{},refreshToken:r.accessKey,...o!==void 0?{expiresAt:o}:{}});let l=Br()??Su();return t.stdout.write(`logged in as ${r.userId}
2162
+ `),1;mu({idToken:s,...i!==void 0?{accessToken:i}:{},refreshToken:r.accessKey,...o!==void 0?{expiresAt:o}:{}});let l=Br()??bu();return t.stdout.write(`logged in as ${r.userId}
2163
2163
  device id: ${l.device_id}
2164
2164
  mailbox prefix: ${r.userId}/${l.device_id}/
2165
2165
  access key stored at ${xs()}
2166
2166
  `),0}function F1(e){let t,r;for(let n=0;n<e.length;n+=1){let s=e[n];if(s==="--user-id"){let i=e[++n];if(i===void 0||i.startsWith("--"))return"missing value for --user-id";t=i;continue}if(s==="--access-key"){let i=e[++n];if(i===void 0||i.startsWith("--"))return"missing value for --access-key";r=i;continue}return`unknown argument: ${s}`}return t===void 0?"missing --user-id <sub>":r===void 0?"missing --access-key <refreshToken>":{userId:t,accessKey:r}}async function U1(e,t){let r=W1(e);if(typeof r=="string")return t.stderr.write(`error: ${r}
2167
- ${Vu}`),2;let n=Rs();if(n.config===void 0)return t.stderr.write(`error: mailbox is not configured; missing ${n.missing.join(", ")}
2167
+ ${Gu}`),2;let n=Rs();if(n.config===void 0)return t.stderr.write(`error: mailbox is not configured; missing ${n.missing.join(", ")}
2168
2168
  `),1;let s=q1();if(s===null)return t.stderr.write("error: no Cognito id token found; run `webcli login` or `lmctl device login` first\n"),1;let i=s.cognito?.idToken;if(typeof i!="string"||i.length===0)return t.stderr.write("error: no Cognito id token found; run `webcli login` or `lmctl device login` first\n"),1;let o=`cognito-idp.${n.config.region}.amazonaws.com/${n.config.cognitoUserPoolId}`,a=typeof s.cognito?.identityId=="string"&&s.cognito.identityId.length>0?s.cognito.identityId:await B1({region:n.config.region,identityPoolId:n.config.identityPoolId,idpProvider:o,idToken:i}),l=O1({identityId:a,logins:{[o]:i},clientConfig:{region:n.config.region}}),c=n.config.deviceId??Br()?.device_id,d=Ns(i)??void 0,u=new Dr({bucket:n.config.mailboxBucket,identityId:a,...d!==void 0?{userId:d}:{},...c!==void 0?{deviceId:c}:{},...n.config.mailboxKey!==void 0?{mailboxKey:n.config.mailboxKey}:{},s3:new j1({region:n.config.region,credentials:l}),commands:{ListObjectsV2Command:C1,GetObjectCommand:$1,PutObjectCommand:M1},selfRole:"browser",onMessage:async()=>{}}),f=zE({root_teamfile:r.root,text:r.text,...r.promptId!==void 0?{prompt_id:r.promptId}:{}}),m=await u.putMessage({conversation_id:YE,payload:f});return t.stdout.write(JSON.stringify({prompt_id:f.prompt_id,mailbox_key:u.getMailboxBasePrefix(),object_key:m},null,2)+`
2169
- `),0}function W1(e){let t,r,n;for(let s=0;s<e.length;s+=1){let i=e[s];if(i==="--root"){let o=e[++s];if(o===void 0||o.startsWith("--"))return"missing value for --root";t=o;continue}if(i==="--text"){let o=e[++s];if(o===void 0||o.startsWith("--"))return"missing value for --text";r=o;continue}if(i==="--prompt-id"){let o=e[++s];if(o===void 0||o.startsWith("--"))return"missing value for --prompt-id";n=o;continue}return`unknown argument: ${i}`}return t===void 0?"missing --root <teamfile>":r===void 0?"missing --text <prompt>":{root:t,text:r,...n!==void 0?{promptId:n}:{}}}async function B1(e){let r=await new R1({region:e.region}).send(new L1({IdentityPoolId:e.identityPoolId,Logins:{[e.idpProvider]:e.idToken}}));if(r.IdentityId===void 0||r.IdentityId.length===0)throw new Error("Cognito GetId returned no IdentityId");return r.IdentityId}function q1(e=process.env.LMCTL_TOKEN_PATH??A1(x1(),".lmctl","cli-tokens.json")){try{return JSON.parse(N1(e,"utf8"))}catch{return null}}var Vu,Bb=T(()=>{"use strict";vu();yu();Fo();du();uu();_u();fu();Vu=`usage: lmctl device <id|init|login|prompt>
2169
+ `),0}function W1(e){let t,r,n;for(let s=0;s<e.length;s+=1){let i=e[s];if(i==="--root"){let o=e[++s];if(o===void 0||o.startsWith("--"))return"missing value for --root";t=o;continue}if(i==="--text"){let o=e[++s];if(o===void 0||o.startsWith("--"))return"missing value for --text";r=o;continue}if(i==="--prompt-id"){let o=e[++s];if(o===void 0||o.startsWith("--"))return"missing value for --prompt-id";n=o;continue}return`unknown argument: ${i}`}return t===void 0?"missing --root <teamfile>":r===void 0?"missing --text <prompt>":{root:t,text:r,...n!==void 0?{promptId:n}:{}}}async function B1(e){let r=await new R1({region:e.region}).send(new L1({IdentityPoolId:e.identityPoolId,Logins:{[e.idpProvider]:e.idToken}}));if(r.IdentityId===void 0||r.IdentityId.length===0)throw new Error("Cognito GetId returned no IdentityId");return r.IdentityId}function q1(e=process.env.LMCTL_TOKEN_PATH??A1(x1(),".lmctl","cli-tokens.json")){try{return JSON.parse(N1(e,"utf8"))}catch{return null}}var Gu,Bb=T(()=>{"use strict";Su();gu();Fo();cu();du();pu();uu();Gu=`usage: lmctl device <id|init|login|prompt>
2170
2170
  lmctl device login --user-id <sub> --access-key <refreshToken>
2171
2171
  lmctl device prompt --root <teamfile> --text <prompt> [--prompt-id <id>]
2172
2172
 
@@ -2176,7 +2176,7 @@ addressing. The id is stored in ~/.lmctl/device.json by default.
2176
2176
  'lmctl device login' authenticates this machine's 'lmctl serve' daemon to the
2177
2177
  cloud mailbox using your user-id (Cognito sub) and an access key (refresh
2178
2178
  token). The access key is stored in ~/.lmctl/device-auth.json (chmod 600).
2179
- `});import{existsSync as qb,mkdirSync as H1,readdirSync as J1,readFileSync as Hb,writeFileSync as X1}from"node:fs";import{join as Rn}from"node:path";import{fileURLToPath as G1}from"node:url";function Yu(e){try{return V1.some(t=>qb(Rn(e,t)))}catch{return!1}}function K1(e){let t=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(t===null)return null;let r=t[1],n=t[2].trimStart(),s=r.match(/^name:\s*(.+)$/m),i=r.match(/^type:\s*(.+)$/m),o=r.match(/^description:\s*(.+)$/m),a=s?.[1]?.trim(),l=i?.[1]?.trim();return!a||!l?null:{name:a,type:l,description:o?.[1]?.trim()??null,body:n}}function Jb(e,t){e.durable_memory_mode!=="db"?Y1(e):z1(e,t)}function Xb(e){let t=Yu(e),r;try{r=J1(Ku).filter(n=>n.endsWith(".template")).sort()}catch{return[]}return r.filter(n=>n==="skills_lmprobe.md.template"||n==="skills_lmdebug.md.template"?t:!0)}function Y1(e){let t=e.local_path;if(!t){console.warn("[bootstrap] skipping: project has no local_path");return}let r=Rn(t,"durable-memory");try{H1(r,{recursive:!0})}catch(i){console.error("[bootstrap] failed to create durable-memory directory:",i);return}let n=Xb(t),s=[];for(let i of n){let o=i.replace(/\.template$/,""),a=Rn(r,o);if(!qb(a))try{let l=Hb(Rn(Ku,i),"utf8");X1(a,l,"utf8"),s.push(o)}catch(l){console.error(`[bootstrap] failed to copy ${i}:`,l)}}s.length>0&&console.log(`[bootstrap] filled durable-memory stubs at ${r}: ${s.join(", ")}`)}function z1(e,t){let r=e.local_path??"",n=Xb(r),s=[];for(let i of n){let o=Rn(Ku,i),a;try{a=Hb(o,"utf8")}catch(c){console.error(`[bootstrap] failed to read ${i}:`,c);continue}let l=K1(a);if(l===null){console.error(`[bootstrap] failed to parse frontmatter in ${i}`);continue}if(t.getDurableMemoryByName(e.id,l.name)===null)try{t.upsertDurableMemory({project_id:e.id,type:l.type,name:l.name,description:l.description,body:l.body}),s.push(l.name)}catch(c){console.error(`[bootstrap] failed to upsert ${l.name}:`,c)}}s.length>0&&console.log(`[bootstrap] filled durable-memory DB stubs for project ${e.name}: ${s.join(", ")}`)}var Ku,V1,zu=T(()=>{"use strict";Ku=Rn(G1(import.meta.url),"../../config/durable_memory_templates"),V1=[".git","package.json","Cargo.toml","pyproject.toml","go.mod","Gemfile","pom.xml","build.gradle","composer.json","Pipfile"]});import{existsSync as Z1,mkdirSync as Q1,readdirSync as eU,readFileSync as tU,writeFileSync as rU}from"node:fs";import{join as Aa}from"node:path";import{fileURLToPath as nU}from"node:url";function Vb(e){let t=e.local_path;if(!t){console.warn("[bootstrap] skipping ai-test: project has no local_path");return}if(!Yu(t))return;let r=Aa(t,"ai-test");try{Q1(r,{recursive:!0})}catch(s){console.error("[bootstrap] failed to create ai-test directory:",s);return}let n=[];for(let s of sU()){let i=s.replace(/\.template$/,""),o=Aa(r,i);if(!Z1(o))try{rU(o,iU(s),"utf8"),n.push(i)}catch(a){console.error(`[bootstrap] failed to copy ai-test ${s}:`,a)}}n.length>0&&console.log(`[bootstrap] filled ai-test stubs at ${r}: ${n.join(", ")}`)}function sU(){try{return eU(Gb).filter(e=>e.endsWith(".template")).sort()}catch{return["example-test.md.template","index.md.template"]}}function iU(e){try{return tU(Aa(Gb,e),"utf8")}catch{return oU(e)}}function oU(e){let t=e.replace(/\.template$/,"");return t==="index.md"?`# AI Test Suite - index
2179
+ `});import{existsSync as qb,mkdirSync as H1,readdirSync as J1,readFileSync as Hb,writeFileSync as X1}from"node:fs";import{join as Rn}from"node:path";import{fileURLToPath as G1}from"node:url";function Ku(e){try{return V1.some(t=>qb(Rn(e,t)))}catch{return!1}}function K1(e){let t=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(t===null)return null;let r=t[1],n=t[2].trimStart(),s=r.match(/^name:\s*(.+)$/m),i=r.match(/^type:\s*(.+)$/m),o=r.match(/^description:\s*(.+)$/m),a=s?.[1]?.trim(),l=i?.[1]?.trim();return!a||!l?null:{name:a,type:l,description:o?.[1]?.trim()??null,body:n}}function Jb(e,t){e.durable_memory_mode!=="db"?Y1(e):z1(e,t)}function Xb(e){let t=Ku(e),r;try{r=J1(Vu).filter(n=>n.endsWith(".template")).sort()}catch{return[]}return r.filter(n=>n==="skills_lmprobe.md.template"||n==="skills_lmdebug.md.template"?t:!0)}function Y1(e){let t=e.local_path;if(!t){console.warn("[bootstrap] skipping: project has no local_path");return}let r=Rn(t,"durable-memory");try{H1(r,{recursive:!0})}catch(i){console.error("[bootstrap] failed to create durable-memory directory:",i);return}let n=Xb(t),s=[];for(let i of n){let o=i.replace(/\.template$/,""),a=Rn(r,o);if(!qb(a))try{let l=Hb(Rn(Vu,i),"utf8");X1(a,l,"utf8"),s.push(o)}catch(l){console.error(`[bootstrap] failed to copy ${i}:`,l)}}s.length>0&&console.log(`[bootstrap] filled durable-memory stubs at ${r}: ${s.join(", ")}`)}function z1(e,t){let r=e.local_path??"",n=Xb(r),s=[];for(let i of n){let o=Rn(Vu,i),a;try{a=Hb(o,"utf8")}catch(c){console.error(`[bootstrap] failed to read ${i}:`,c);continue}let l=K1(a);if(l===null){console.error(`[bootstrap] failed to parse frontmatter in ${i}`);continue}if(t.getDurableMemoryByName(e.id,l.name)===null)try{t.upsertDurableMemory({project_id:e.id,type:l.type,name:l.name,description:l.description,body:l.body}),s.push(l.name)}catch(c){console.error(`[bootstrap] failed to upsert ${l.name}:`,c)}}s.length>0&&console.log(`[bootstrap] filled durable-memory DB stubs for project ${e.name}: ${s.join(", ")}`)}var Vu,V1,Yu=T(()=>{"use strict";Vu=Rn(G1(import.meta.url),"../../config/durable_memory_templates"),V1=[".git","package.json","Cargo.toml","pyproject.toml","go.mod","Gemfile","pom.xml","build.gradle","composer.json","Pipfile"]});import{existsSync as Z1,mkdirSync as Q1,readdirSync as eU,readFileSync as tU,writeFileSync as rU}from"node:fs";import{join as Aa}from"node:path";import{fileURLToPath as nU}from"node:url";function Vb(e){let t=e.local_path;if(!t){console.warn("[bootstrap] skipping ai-test: project has no local_path");return}if(!Ku(t))return;let r=Aa(t,"ai-test");try{Q1(r,{recursive:!0})}catch(s){console.error("[bootstrap] failed to create ai-test directory:",s);return}let n=[];for(let s of sU()){let i=s.replace(/\.template$/,""),o=Aa(r,i);if(!Z1(o))try{rU(o,iU(s),"utf8"),n.push(i)}catch(a){console.error(`[bootstrap] failed to copy ai-test ${s}:`,a)}}n.length>0&&console.log(`[bootstrap] filled ai-test stubs at ${r}: ${n.join(", ")}`)}function sU(){try{return eU(Gb).filter(e=>e.endsWith(".template")).sort()}catch{return["example-test.md.template","index.md.template"]}}function iU(e){try{return tU(Aa(Gb,e),"utf8")}catch{return oU(e)}}function oU(e){let t=e.replace(/\.template$/,"");return t==="index.md"?`# AI Test Suite - index
2180
2180
 
2181
2181
  Add test chapters in this directory.
2182
2182
  `:`---
@@ -2198,9 +2198,9 @@ last_run_id: 0
2198
2198
  ## Expected
2199
2199
 
2200
2200
  ## Cleanup
2201
- `}var Gb,Kb=T(()=>{"use strict";zu();Gb=Aa(nU(import.meta.url),"../../config/ai_test_templates")});import{createHash as aU}from"node:crypto";import{existsSync as lU,mkdirSync as cU,writeFileSync as dU}from"node:fs";import{dirname as uU,join as Ln}from"node:path";function Ra(e){return typeof e=="string"&&e.startsWith(Yb)}function gU(e){if(!Ra(e))throw new ht(`not an lmctl:// URI: ${e}`,"malformed");let t=e.slice(Yb.length),r=t.indexOf("/");if(r<=0)throw new ht(`malformed lmctl:// URI (expected lmctl://<workflow|mcp|skill>/<name>): ${e}`,"malformed");let n=t.slice(0,r);if(!_U.has(n))throw new ht(`unknown lmctl:// kind '${n}' (expected workflow|mcp|skill): ${e}`,"malformed");let s=t.slice(r+1),i,o=s.indexOf("@");o>=0&&(i=s.slice(o+1).trim(),s=s.slice(0,o));let a=s.trim();if(a.length===0)throw new ht(`empty name in lmctl:// URI: ${e}`,"malformed");if(/[\\/]|\.\./.test(a))throw new ht(`invalid name in lmctl:// URI (no path separators): ${e}`,"malformed");return{kind:n,name:a,...i!==void 0&&i.length>0?{ref:i}:{}}}function yU(e,t,r){if(e==="workflow")return yo(t,r);let n=e==="mcp"?Ln("templates","mcp",`${t}.json`):Ln("templates","skills",t,"SKILL.md");for(let s of nd(r)){let i=Ln(s,n);if(lU(i))return i}return null}function wU(e,t,r){let n=Ln(rd(r),mU,e);return e==="skill"?Ln(n,t,"SKILL.md"):Ln(n,`${t}${e==="workflow"?".compound.json":".json"}`)}function EU(e,t){if(t.trim().length===0)return!1;if(e==="skill")return!0;let r=t.trim();if(e==="mcp")try{let n=JSON.parse(r);return n!==null&&typeof n=="object"}catch{return!1}if(r.startsWith("{")||r.startsWith("["))try{return JSON.parse(r),!0}catch{return!1}return!0}async function Zu(e,t){let{kind:r,name:n,ref:s}=gU(e),i=yU(r,n,t);if(i!==null)return i;let o=`${fU}${r}/${n}`,a;try{a=await fetch(o,{signal:AbortSignal.timeout(pU)})}catch(d){throw new ht(`lmctl:// '${e}' not found locally or at the remote catalog ${o} (${d instanceof Error?d.message:String(d)}). Failing closed.`,"missing")}if(!a.ok)throw new ht(`lmctl:// '${e}' not found locally or at the remote catalog ${o} (HTTP ${a.status}). Failing closed.`,"missing");let l=await a.text();if(s!==void 0){let d=hU.exec(s);if(d!==null){let u=aU("sha256").update(l).digest("hex");if(u.toLowerCase()!==d[1].toLowerCase())throw new ht(`lmctl:// '${e}' remote artifact FAILED integrity pin (expected sha256 ${d[1]}, got ${u}) \u2014 discarded, NOT cached.`,"validation-failure")}}if(!EU(r,l))throw new ht(`lmctl:// '${e}' remote artifact failed shape validation for ${r} \u2014 discarded, NOT cached.`,"validation-failure");let c=wU(r,n,t);return cU(uU(c),{recursive:!0}),dU(c,l,"utf8"),c}var Yb,fU,mU,pU,_U,ht,hU,zb=T(()=>{"use strict";sd();Yb="lmctl://",fU="https://lmctl.com/templates/",mU=".cache",pU=8e3,_U=new Set(["workflow","mcp","skill"]),ht=class extends Error{reason;constructor(t,r="malformed"){super(t),this.reason=r,this.name="LmctlUriError"}},hU=/^(?:sha256[:-])?([0-9a-f]{64})$/i});import{spawnSync as nS}from"node:child_process";import{cpSync as Zb,existsSync as tf,mkdirSync as sS,mkdtempSync as TU,readFileSync as iS,statSync as bU,writeFileSync as Qu}from"node:fs";import{homedir as SU,tmpdir as vU}from"node:os";import{basename as Qb,join as rt}from"node:path";function er(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function ef(e,t,r){if(Array.isArray(e)){for(let n of e)ef(n,t,r);return}if(er(e)){e.alias===t&&(Array.isArray(e.mcp)&&r.mcp.push(...e.mcp),Array.isArray(e.skills)&&r.skills.push(...e.skills));for(let n of Object.values(e))ef(n,t,r)}}function xU(e,t){let r={mcp:[],skills:[]},n=new Set;for(let i of e.listProjects()){if(i.team_id!==t.team_id)continue;let o=e.getWorkflowByName(i.workflow_name);if(o===null||n.has(o.id))continue;n.add(o.id);let a;try{a=JSON.parse(o.definition)}catch{continue}if(!(!er(a)||!Array.isArray(a.steps)))for(let l of a.steps)er(l)&&l.members!==void 0&&ef(l.members,t.alias,r)}let s=i=>{let o=new Map;for(let a of i)o.set(NU(a),a);return[...o.values()]};return{mcp:s(r.mcp),skills:s(r.skills)}}function AU(e,t){return e.listProjects().find(r=>r.team_id===t.team_id)?.local_path}async function oS(e,t){let r;try{r=await fetch(e,{signal:AbortSignal.timeout(kU)})}catch(s){throw new nt(t,`fetch ${e} failed: ${s.message}`)}if(!r.ok)throw new nt(t,`fetch ${e} \u2192 HTTP ${r.status}`);let n=await r.text();if(n.length>eS)throw new nt(t,`fetched ${e} exceeds ${eS} bytes`);return n}async function RU(e,t){if(typeof e!="string")return[e];Ra(e)&&(e=await Zu(e));let r;if(rf.test(e))r=await oS(e,t);else{if(!tf(e))throw new nt(t,`mcp file not found: ${e}`);r=iS(e,"utf8")}let n;try{n=JSON.parse(r)}catch{throw new nt(t,`mcp source is not JSON: ${e}`)}if(er(n)&&er(n.mcpServers))return Object.entries(n.mcpServers).map(([s,i])=>({name:s,...er(i)?i:{}}));if(er(n)&&typeof n.name=="string")return[n];throw new nt(t,`mcp source ${e} is neither {mcpServers:{\u2026}} nor a {name,\u2026} server`)}function Oa(e){return e.type==="http"||e.type==="sse"||e.url!==void 0&&e.command===void 0}function La(e,t,r,n){let s=nS(e,t,{cwd:r,env:Ut(void 0,r),encoding:"utf8",timeout:6e4});if(s.error)throw new nt(n,`spawn ${e} failed: ${s.error.message}`);if(s.status!==0)throw new nt(n,`${e} ${t.slice(0,3).join(" ")} exited ${s.status}: ${(s.stderr??"").trim().slice(0,200)}`)}function LU(e,t,r){nS(e,t,{cwd:r,env:Ut(void 0,r),encoding:"utf8",timeout:6e4})}function OU(e,t){return e==="claude"?["mcp","remove",t,"--scope","user"]:["mcp","remove",t]}function $U(e){let t=["mcp","add"];if(Oa(e)){t.push("-t",e.type==="sse"?"sse":"http");for(let[r,n]of Object.entries(e.headers??{}))t.push("-H",`${r}: ${n}`);t.push(e.name,e.url??"")}else{for(let[r,n]of Object.entries(e.env??{}))t.push("-e",`${r}=${n}`);t.push(e.name,e.command??"",...e.args??[])}return t}function CU(e){if(Oa(e))return["mcp","add",e.name,"--url",e.url??""];let t=["mcp","add",e.name];for(let[r,n]of Object.entries(e.env??{}))t.push("--env",`${r}=${n}`);return t.push("--",e.command??"",...e.args??[]),t}function MU(e){let t=rt(process.env.XDG_CONFIG_HOME??rt(On(),".config"),"opencode"),r=rt(t,"opencode.json"),n={};if(tf(r))try{let i=JSON.parse(iS(r,"utf8"));er(i)&&(n=i)}catch{}let s=er(n.mcp)?{...n.mcp}:{};for(let i of e){let{name:o,...a}=i;s[o]=Oa(i)?{type:"remote",url:a.url,enabled:!0,...a.headers?{headers:a.headers}:{}}:{type:"local",command:[a.command??"",...a.args??[]],enabled:!0,...a.env?{environment:a.env}:{}}}n.mcp=s,n.permission===void 0&&(n.permission="allow"),sS(t,{recursive:!0}),Qu(r,`${JSON.stringify(n,null,2)}
2202
- `,"utf8")}function jU(e,t){let r={};for(let n of e)r[n.name]=Oa(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{GT(Nu(On()),r)}catch(n){throw new nt(t,`copilot MCP config install failed: ${n instanceof Error?n.message:String(n)}`)}}function DU(e){if(typeof e!="string")return e.name;let t=Qb(e.replace(/\/+$/,""));return t.toLowerCase()==="skill.md"?Qb(e.replace(/\/skill\.md$/i,"")):t}async function tS(e,t,r){let n=DU(e),s=rt(t,n);if(sS(s,{recursive:!0}),typeof e!="string")return Qu(rt(s,"SKILL.md"),e.content,"utf8"),{name:n,dir:s};if(Ra(e)&&(e=await Zu(e)),rf.test(e))return Qu(rt(s,"SKILL.md"),await oS(e,r),"utf8"),{name:n,dir:s};if(!tf(e))throw new nt(r,`skill path not found: ${e}`);return bU(e).isDirectory()?(Zb(e,s,{recursive:!0}),{name:n,dir:s}):(Zb(e,rt(s,"SKILL.md")),{name:n,dir:s})}async function aS(e){let{dal:t,member:r,stderr:n}=e,s=xU(t,r);if(s.mcp.length===0&&s.skills.length===0)return;let i=Fe(r),o=r.sessiondir||e.baseDir||AU(t,r)||process.cwd(),a=l=>{n.write(`[seed:${r.alias}] ${l}
2203
- `)};if(s.mcp.length>0){let l=[];for(let c of s.mcp)l.push(...await RU(c,r.alias));if(i==="opencode")MU(l);else if(i==="copilot")jU(l,r.alias);else if(i==="claude"||i==="gemini"||i==="qwen"||i==="agy"||i==="codex")for(let c of l)if(LU(i,OU(i,c.name),o),i==="claude"){let{name:d,...u}=c;La("claude",["mcp","add-json",d,JSON.stringify(u),"--scope","user"],o,r.alias)}else i==="codex"?La("codex",CU(c),o,r.alias):La(i,$U(c),o,r.alias);else a(`provider ${i} has no known MCP install mechanism \u2014 ${l.length} declared server(s) NOT installed.`);["opencode","claude","gemini","qwen","agy","codex","copilot"].includes(i)&&a(`installed ${l.length} MCP server(s) into ${i} (idempotent).`)}if(s.skills.length>0)if(IU.has(i))a(`skills for ${i} are honest-BLOCKED \u2014 opencode has NO SKILL.md filesystem ingestion (no \`skill\` subcommand, no skills dir, no SKILL.md in the opencode package; \`opencode agent\` is a distinct artifact); ${s.skills.length} declared skill(s) NOT installed (operator follow-up).`);else if(i==="gemini"||i==="agy"){let l=TU(rt(vU(),`lmctl-skill-${r.alias}-`));for(let c of s.skills){let d=typeof c=="string"&&!rf.test(c)?c:(await tS(c,l,r.alias)).dir;La(i,["skills","install",d,"--scope","user","--consent"],o,r.alias)}a(`installed ${s.skills.length} skill(s) via \`${i} skills install --scope user\` (idempotent).`)}else if(rS[i]!==void 0){let l=rS[i]();for(let c of s.skills)await tS(c,l,r.alias);a(`installed ${s.skills.length} skill(s) \u2192 ${l}/<name>/SKILL.md (idempotent overwrite).`)}else a(`provider ${i} has no verified skills mechanism \u2014 ${s.skills.length} declared skill(s) NOT installed.`)}var nt,rf,kU,eS,IU,NU,On,rS,lS=T(()=>{"use strict";Ze();zb();it();Os();nt=class extends Error{alias;constructor(t,r){super(`capability install failed for ${t}: ${r}`),this.alias=t,this.name="CapabilityInstallError"}},rf=/^https?:\/\//i,kU=8e3,eS=1e6,IU=new Set(["opencode"]),NU=e=>JSON.stringify(e),On=()=>process.env.HOME??SU();rS={claude:()=>rt(On(),".claude","skills"),qwen:()=>rt(On(),".qwen","skills"),codex:()=>rt(On(),".codex","skills"),copilot:()=>rt(On(),".copilot","skills")}});var nf,cS=T(()=>{"use strict";nf=`---
2201
+ `}var Gb,Kb=T(()=>{"use strict";Yu();Gb=Aa(nU(import.meta.url),"../../config/ai_test_templates")});import{createHash as aU}from"node:crypto";import{existsSync as lU,mkdirSync as cU,writeFileSync as dU}from"node:fs";import{dirname as uU,join as Ln}from"node:path";function Ra(e){return typeof e=="string"&&e.startsWith(Yb)}function gU(e){if(!Ra(e))throw new ht(`not an lmctl:// URI: ${e}`,"malformed");let t=e.slice(Yb.length),r=t.indexOf("/");if(r<=0)throw new ht(`malformed lmctl:// URI (expected lmctl://<workflow|mcp|skill>/<name>): ${e}`,"malformed");let n=t.slice(0,r);if(!_U.has(n))throw new ht(`unknown lmctl:// kind '${n}' (expected workflow|mcp|skill): ${e}`,"malformed");let s=t.slice(r+1),i,o=s.indexOf("@");o>=0&&(i=s.slice(o+1).trim(),s=s.slice(0,o));let a=s.trim();if(a.length===0)throw new ht(`empty name in lmctl:// URI: ${e}`,"malformed");if(/[\\/]|\.\./.test(a))throw new ht(`invalid name in lmctl:// URI (no path separators): ${e}`,"malformed");return{kind:n,name:a,...i!==void 0&&i.length>0?{ref:i}:{}}}function yU(e,t,r){if(e==="workflow")return yo(t,r);let n=e==="mcp"?Ln("templates","mcp",`${t}.json`):Ln("templates","skills",t,"SKILL.md");for(let s of rd(r)){let i=Ln(s,n);if(lU(i))return i}return null}function wU(e,t,r){let n=Ln(td(r),mU,e);return e==="skill"?Ln(n,t,"SKILL.md"):Ln(n,`${t}${e==="workflow"?".compound.json":".json"}`)}function EU(e,t){if(t.trim().length===0)return!1;if(e==="skill")return!0;let r=t.trim();if(e==="mcp")try{let n=JSON.parse(r);return n!==null&&typeof n=="object"}catch{return!1}if(r.startsWith("{")||r.startsWith("["))try{return JSON.parse(r),!0}catch{return!1}return!0}async function zu(e,t){let{kind:r,name:n,ref:s}=gU(e),i=yU(r,n,t);if(i!==null)return i;let o=`${fU}${r}/${n}`,a;try{a=await fetch(o,{signal:AbortSignal.timeout(pU)})}catch(d){throw new ht(`lmctl:// '${e}' not found locally or at the remote catalog ${o} (${d instanceof Error?d.message:String(d)}). Failing closed.`,"missing")}if(!a.ok)throw new ht(`lmctl:// '${e}' not found locally or at the remote catalog ${o} (HTTP ${a.status}). Failing closed.`,"missing");let l=await a.text();if(s!==void 0){let d=hU.exec(s);if(d!==null){let u=aU("sha256").update(l).digest("hex");if(u.toLowerCase()!==d[1].toLowerCase())throw new ht(`lmctl:// '${e}' remote artifact FAILED integrity pin (expected sha256 ${d[1]}, got ${u}) \u2014 discarded, NOT cached.`,"validation-failure")}}if(!EU(r,l))throw new ht(`lmctl:// '${e}' remote artifact failed shape validation for ${r} \u2014 discarded, NOT cached.`,"validation-failure");let c=wU(r,n,t);return cU(uU(c),{recursive:!0}),dU(c,l,"utf8"),c}var Yb,fU,mU,pU,_U,ht,hU,zb=T(()=>{"use strict";nd();Yb="lmctl://",fU="https://lmctl.com/templates/",mU=".cache",pU=8e3,_U=new Set(["workflow","mcp","skill"]),ht=class extends Error{reason;constructor(t,r="malformed"){super(t),this.reason=r,this.name="LmctlUriError"}},hU=/^(?:sha256[:-])?([0-9a-f]{64})$/i});import{spawnSync as nS}from"node:child_process";import{cpSync as Zb,existsSync as ef,mkdirSync as sS,mkdtempSync as TU,readFileSync as iS,statSync as bU,writeFileSync as Zu}from"node:fs";import{homedir as SU,tmpdir as vU}from"node:os";import{basename as Qb,join as rt}from"node:path";function er(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Qu(e,t,r){if(Array.isArray(e)){for(let n of e)Qu(n,t,r);return}if(er(e)){e.alias===t&&(Array.isArray(e.mcp)&&r.mcp.push(...e.mcp),Array.isArray(e.skills)&&r.skills.push(...e.skills));for(let n of Object.values(e))Qu(n,t,r)}}function xU(e,t){let r={mcp:[],skills:[]},n=new Set;for(let i of e.listProjects()){if(i.team_id!==t.team_id)continue;let o=e.getWorkflowByName(i.workflow_name);if(o===null||n.has(o.id))continue;n.add(o.id);let a;try{a=JSON.parse(o.definition)}catch{continue}if(!(!er(a)||!Array.isArray(a.steps)))for(let l of a.steps)er(l)&&l.members!==void 0&&Qu(l.members,t.alias,r)}let s=i=>{let o=new Map;for(let a of i)o.set(NU(a),a);return[...o.values()]};return{mcp:s(r.mcp),skills:s(r.skills)}}function AU(e,t){return e.listProjects().find(r=>r.team_id===t.team_id)?.local_path}async function oS(e,t){let r;try{r=await fetch(e,{signal:AbortSignal.timeout(kU)})}catch(s){throw new nt(t,`fetch ${e} failed: ${s.message}`)}if(!r.ok)throw new nt(t,`fetch ${e} \u2192 HTTP ${r.status}`);let n=await r.text();if(n.length>eS)throw new nt(t,`fetched ${e} exceeds ${eS} bytes`);return n}async function RU(e,t){if(typeof e!="string")return[e];Ra(e)&&(e=await zu(e));let r;if(tf.test(e))r=await oS(e,t);else{if(!ef(e))throw new nt(t,`mcp file not found: ${e}`);r=iS(e,"utf8")}let n;try{n=JSON.parse(r)}catch{throw new nt(t,`mcp source is not JSON: ${e}`)}if(er(n)&&er(n.mcpServers))return Object.entries(n.mcpServers).map(([s,i])=>({name:s,...er(i)?i:{}}));if(er(n)&&typeof n.name=="string")return[n];throw new nt(t,`mcp source ${e} is neither {mcpServers:{\u2026}} nor a {name,\u2026} server`)}function Oa(e){return e.type==="http"||e.type==="sse"||e.url!==void 0&&e.command===void 0}function La(e,t,r,n){let s=nS(e,t,{cwd:r,env:Ut(void 0,r),encoding:"utf8",timeout:6e4});if(s.error)throw new nt(n,`spawn ${e} failed: ${s.error.message}`);if(s.status!==0)throw new nt(n,`${e} ${t.slice(0,3).join(" ")} exited ${s.status}: ${(s.stderr??"").trim().slice(0,200)}`)}function LU(e,t,r){nS(e,t,{cwd:r,env:Ut(void 0,r),encoding:"utf8",timeout:6e4})}function OU(e,t){return e==="claude"?["mcp","remove",t,"--scope","user"]:["mcp","remove",t]}function $U(e){let t=["mcp","add"];if(Oa(e)){t.push("-t",e.type==="sse"?"sse":"http");for(let[r,n]of Object.entries(e.headers??{}))t.push("-H",`${r}: ${n}`);t.push(e.name,e.url??"")}else{for(let[r,n]of Object.entries(e.env??{}))t.push("-e",`${r}=${n}`);t.push(e.name,e.command??"",...e.args??[])}return t}function CU(e){if(Oa(e))return["mcp","add",e.name,"--url",e.url??""];let t=["mcp","add",e.name];for(let[r,n]of Object.entries(e.env??{}))t.push("--env",`${r}=${n}`);return t.push("--",e.command??"",...e.args??[]),t}function MU(e){let t=rt(process.env.XDG_CONFIG_HOME??rt(On(),".config"),"opencode"),r=rt(t,"opencode.json"),n={};if(ef(r))try{let i=JSON.parse(iS(r,"utf8"));er(i)&&(n=i)}catch{}let s=er(n.mcp)?{...n.mcp}:{};for(let i of e){let{name:o,...a}=i;s[o]=Oa(i)?{type:"remote",url:a.url,enabled:!0,...a.headers?{headers:a.headers}:{}}:{type:"local",command:[a.command??"",...a.args??[]],enabled:!0,...a.env?{environment:a.env}:{}}}n.mcp=s,n.permission===void 0&&(n.permission="allow"),sS(t,{recursive:!0}),Zu(r,`${JSON.stringify(n,null,2)}
2202
+ `,"utf8")}function jU(e,t){let r={};for(let n of e)r[n.name]=Oa(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{GT(Iu(On()),r)}catch(n){throw new nt(t,`copilot MCP config install failed: ${n instanceof Error?n.message:String(n)}`)}}function DU(e){if(typeof e!="string")return e.name;let t=Qb(e.replace(/\/+$/,""));return t.toLowerCase()==="skill.md"?Qb(e.replace(/\/skill\.md$/i,"")):t}async function tS(e,t,r){let n=DU(e),s=rt(t,n);if(sS(s,{recursive:!0}),typeof e!="string")return Zu(rt(s,"SKILL.md"),e.content,"utf8"),{name:n,dir:s};if(Ra(e)&&(e=await zu(e)),tf.test(e))return Zu(rt(s,"SKILL.md"),await oS(e,r),"utf8"),{name:n,dir:s};if(!ef(e))throw new nt(r,`skill path not found: ${e}`);return bU(e).isDirectory()?(Zb(e,s,{recursive:!0}),{name:n,dir:s}):(Zb(e,rt(s,"SKILL.md")),{name:n,dir:s})}async function aS(e){let{dal:t,member:r,stderr:n}=e,s=xU(t,r);if(s.mcp.length===0&&s.skills.length===0)return;let i=Fe(r),o=r.sessiondir||e.baseDir||AU(t,r)||process.cwd(),a=l=>{n.write(`[seed:${r.alias}] ${l}
2203
+ `)};if(s.mcp.length>0){let l=[];for(let c of s.mcp)l.push(...await RU(c,r.alias));if(i==="opencode")MU(l);else if(i==="copilot")jU(l,r.alias);else if(i==="claude"||i==="gemini"||i==="qwen"||i==="agy"||i==="codex")for(let c of l)if(LU(i,OU(i,c.name),o),i==="claude"){let{name:d,...u}=c;La("claude",["mcp","add-json",d,JSON.stringify(u),"--scope","user"],o,r.alias)}else i==="codex"?La("codex",CU(c),o,r.alias):La(i,$U(c),o,r.alias);else a(`provider ${i} has no known MCP install mechanism \u2014 ${l.length} declared server(s) NOT installed.`);["opencode","claude","gemini","qwen","agy","codex","copilot"].includes(i)&&a(`installed ${l.length} MCP server(s) into ${i} (idempotent).`)}if(s.skills.length>0)if(IU.has(i))a(`skills for ${i} are honest-BLOCKED \u2014 opencode has NO SKILL.md filesystem ingestion (no \`skill\` subcommand, no skills dir, no SKILL.md in the opencode package; \`opencode agent\` is a distinct artifact); ${s.skills.length} declared skill(s) NOT installed (operator follow-up).`);else if(i==="gemini"||i==="agy"){let l=TU(rt(vU(),`lmctl-skill-${r.alias}-`));for(let c of s.skills){let d=typeof c=="string"&&!tf.test(c)?c:(await tS(c,l,r.alias)).dir;La(i,["skills","install",d,"--scope","user","--consent"],o,r.alias)}a(`installed ${s.skills.length} skill(s) via \`${i} skills install --scope user\` (idempotent).`)}else if(rS[i]!==void 0){let l=rS[i]();for(let c of s.skills)await tS(c,l,r.alias);a(`installed ${s.skills.length} skill(s) \u2192 ${l}/<name>/SKILL.md (idempotent overwrite).`)}else a(`provider ${i} has no verified skills mechanism \u2014 ${s.skills.length} declared skill(s) NOT installed.`)}var nt,tf,kU,eS,IU,NU,On,rS,lS=T(()=>{"use strict";Ze();zb();it();Os();nt=class extends Error{alias;constructor(t,r){super(`capability install failed for ${t}: ${r}`),this.alias=t,this.name="CapabilityInstallError"}},tf=/^https?:\/\//i,kU=8e3,eS=1e6,IU=new Set(["opencode"]),NU=e=>JSON.stringify(e),On=()=>process.env.HOME??SU();rS={claude:()=>rt(On(),".claude","skills"),qwen:()=>rt(On(),".qwen","skills"),codex:()=>rt(On(),".codex","skills"),copilot:()=>rt(On(),".copilot","skills")}});var rf,cS=T(()=>{"use strict";rf=`---
2204
2204
 
2205
2205
  # Durable memory \u2014 how to use it
2206
2206
 
@@ -2221,12 +2221,12 @@ Don't dump all of durable-memory into your context. The pattern is index-first,
2221
2221
  `)}return 0}function JU(e,t,r){let n=Z(e,["--alias","--provider","--model","--role","--sessiondir"]);if(n.error!==void 0)return v(t,n.error);let[s]=n.positionals;if(s===void 0)return v(t,"usage: team add-member <team-name> --alias A --provider P [--model M] [--role R] [--sessiondir D]");let i=r.findTeamByName(s);if(i===null)return v(t,`team not found: ${s}`);let o=P(n,"--alias"),a=P(n,"--provider");if(o===void 0||a===void 0)return v(t,"team add-member requires --alias and --provider");let l=r.insertTeamMember({team_id:i.id,alias:o,provider:a,model:P(n,"--model")??null,role:P(n,"--role")??"agent",sessiondir:P(n,"--sessiondir")??PU(br(),"sessions",i.name,o)});return G(n,"--json")?ae(t,l):t.stdout.write(`added member ${l.alias} to ${i.name}
2222
2222
  `),0}async function dS(e,t,r,n){let s=Z(e,["--alias"]);if(s.error!==void 0)return v(t,s.error);let[i]=s.positionals;if(i===void 0)return v(t,n?"usage: team refresh <team-name> --alias A":"usage: team seed <team-name> [--alias A]");let o=r.findTeamByName(i);if(o===null)return v(t,`team not found: ${i}`);let a=P(s,"--alias");if(n&&a===void 0)return v(t,"team refresh requires --alias");if(n&&a!==void 0&&a.trim().toLowerCase()==="lead")return v(t,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let l=XU(r.listTeamMembers(o.id),a,n);if(a!==void 0&&l.length===0)return v(t,`member not found or already seeded: ${a}`);if(n&&l.some(f=>f.alias.toLowerCase()==="lead"||f.role==="lead"))return v(t,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let c=new Set;for(let f of r.listProjects().filter(m=>m.team_id===o.id)){if(c.has(f.workflow_name))continue;c.add(f.workflow_name);let m=r.getWorkflowByName(f.workflow_name);if(m===null)continue;let p=py(f.workflow_name,m.definition);if(p.status==="FAIL")return v(t,`cannot seed team \`${o.name}\`: workflow \`${f.workflow_name}\` failed verify-at-seed \u2014 ${p.note}. Fix the workflow and retry; NO members were seeded (no side-effects).`)}for(let f of r.listProjects().filter(m=>m.team_id===o.id))Jb(f,r),Vb(f);let d=[],u=!1;for(let f of l){let m=await $i({member:f,dal:r}),p=r.updateTeamMemberSession(f.id,m.sessionid);if(p!==null){let _=p.role_prompt??"",g=_.length>0?`${_}
2223
2223
 
2224
- ${nf}`:nf;r.setMemberPromptSnapshot(f.id,g),d.push(p);let h=Na(Fe(p),m.sessionid);h!==null&&t.stderr.write(`[seeded ${p.alias}] customize/compact in its native TUI:
2224
+ ${rf}`:rf;r.setMemberPromptSnapshot(f.id,g),d.push(p);let h=Na(Fe(p),m.sessionid);h!==null&&t.stderr.write(`[seeded ${p.alias}] customize/compact in its native TUI:
2225
2225
  ${h}
2226
2226
  `);try{await aS({dal:r,member:p,stderr:t.stderr})}catch(S){u=!0,t.stderr.write(`error: ${S instanceof Error?S.message:String(S)}
2227
2227
  `)}}}return G(s,"--json")?ae(t,d):t.stdout.write(`seeded ${d.length} member(s)
2228
2228
  `),u?1:0}function XU(e,t,r){return e.filter(n=>t!==void 0&&n.alias!==t?!1:r||n.sessionid===null)}function GU(e,t,r){let n=Z(e,["--interpreter","--of"]);if(n.error!==void 0)return v(t,n.error);let[s]=n.positionals;if(s===void 0)return v(t,"usage: team companion <team-name> --interpreter A --of B[,C]");let i=r.findTeamByName(s);if(i===null)return v(t,`team not found: ${s}`);let o=P(n,"--interpreter"),a=P(n,"--of")?.split(",").map(c=>c.trim()).filter(Boolean);if(o===void 0||a===void 0||a.length===0)return v(t,"team companion requires --interpreter and --of");let l=r.findTeamMemberByAlias(i.id,o);if(l===null)return v(t,`member not found: ${o}`);for(let c of a){let d=r.findTeamMemberByAlias(i.id,c);if(d===null)return v(t,`member not found: ${c}`);r.insertTeamMemberCompanion({interpreter_id:l.id,companion_id:d.id})}return t.stdout.write(`recorded ${a.length} companion link(s)
2229
- `),0}var FU,fS=T(()=>{"use strict";Je();hc();zu();Kb();Ze();An();lS();xo();Re();cS();FU=`usage: lmctl team create <name>
2229
+ `),0}var FU,fS=T(()=>{"use strict";Je();_c();Yu();Kb();Ze();An();lS();xo();Re();cS();FU=`usage: lmctl team create <name>
2230
2230
  lmctl team list [--json]
2231
2231
  lmctl team show <name> [--json]
2232
2232
  lmctl team add-member <team-name> --alias A --provider P [--model M] [--role R] [--sessiondir D] [--json]
@@ -2257,11 +2257,11 @@ ${o.map(a=>` ${a}`).join(`
2257
2257
 
2258
2258
  Print or watch provider session messages, or follow a managed run timeline.
2259
2259
  --lines and --max-bytes are mutually exclusive. Default: --max-bytes 4096.`;pS=`\u2026 [truncated older output \u2014 raise with --max-bytes]
2260
- `});var xS={};ye(xS,{runInfo:()=>sW});import{execFileSync as sf}from"node:child_process";import{dirname as TS,resolve as eW}from"node:path";function nW(e){return e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${Math.round(e/1e3)}K`:String(e)}async function sW(e,t={stdout:process.stdout,stderr:process.stderr}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(`${rW}
2260
+ `});var xS={};ye(xS,{runInfo:()=>sW});import{execFileSync as nf}from"node:child_process";import{dirname as TS,resolve as eW}from"node:path";function nW(e){return e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${Math.round(e/1e3)}K`:String(e)}async function sW(e,t={stdout:process.stdout,stderr:process.stderr}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(`${rW}
2261
2261
  `),0;let r=Z(e,["--provider","--run"],["--json","--help"]);if(r.error!==void 0)return v(t,r.error);if(r.positionals.length>2)return v(t,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let n=G(r,"--json"),s=P(r,"--run");if(s!==void 0){if(r.positionals.length>0)return v(t,"--run is mutually exclusive with positional [target] [alias]");if(P(r,"--provider")!==void 0)return v(t,"--run is mutually exclusive with --provider");let d=Number.parseInt(s,10);if(!Number.isFinite(d)||d<=0||String(d)!==s)return v(t,`invalid --run "${s}" (expected a positive integer run id)`);try{return await $(t,async u=>oW(t,u,d,n))}catch(u){return Me(t,u)}}let i=yr(tW,{target:r.positionals[0],alias:r.positionals[1],flags:{provider:P(r,"--provider")}});if(i.mode==="error")return v(t,i.message);if(i.mode==="managed")return v(t,"health managed mode requires --run <id>");if(i.mode==="ai-team"&&i.alias===void 0){let d;try{d=await $(t,u=>we(i.teamfile,u))}catch(u){return v(t,`health: ${u instanceof Error?u.message:String(u)}`)}return aW(t,d,n)}let o,a,l,c;if(i.mode==="ai-team")try{let d=await $(t,u=>qe(i.teamfile,i.alias,u));o=d.provider,a=d.sessionid,l=d.alias,c={teamfile:d.teamfile,alias:d.alias}}catch(d){return d instanceof ge?v(t,d.message):Me(t,d)}else if(a=i.sessionid,i.provider!==void 0)o=i.provider;else{let d=await xa(a);if(d.length===0)return v(t,`health: session "${a}" not found in any provider store`);if(d.length>1)return v(t,`health: session "${a}" matches multiple providers (${d.join(", ")}); pass --provider`);o=d[0]}return iW(t,o,a,l,n,c)}async function iW(e,t,r,n,s,i){let o;try{o=await Qt(r,t)}catch(d){return v(e,`health: failed to load session: ${d instanceof Error?d.message:String(d)}`)}if(o===null)return v(e,`health: session not found: ${r} (provider=${t})`);let a=Cs(o.messages),l=i===void 0?null:await lW(e,i,o),c={provider:o.provider,sessionId:o.sessionId,sessionid:o.sessionId,cwd:o.cwd,messageCount:o.messageCount??null,...o.model!==void 0?{model:o.model}:{},...n!==void 0?{alias:n}:{},...l??{},totalInputTokens:o.totalInputTokens??null,totalOutputTokens:o.totalOutputTokens??null,...o.totalCachedInputTokens!==void 0?{totalCachedInputTokens:o.totalCachedInputTokens}:{},sessionLimit:a,createdAt:o.createdAt.toISOString(),modifiedAt:o.modifiedAt.toISOString()};return s?(ae(e,c),0):(e.stdout.write(`Session: ${o.sessionId}
2262
2262
  `),e.stdout.write(` Provider: ${o.provider}
2263
2263
  `),n!==void 0&&e.stdout.write(` Alias: ${n}
2264
- `),l!==null&&e.stdout.write(` Liveness: ${of(l.liveness)}
2264
+ `),l!==null&&e.stdout.write(` Liveness: ${sf(l.liveness)}
2265
2265
  `),e.stdout.write(` CWD: ${o.cwd}
2266
2266
  `),e.stdout.write(` Messages: ${gt(o.messageCount)}
2267
2267
  `),e.stdout.write(` Model: ${o.model??"(unknown)"}
@@ -2281,25 +2281,25 @@ Print or watch provider session messages, or follow a managed run timeline.
2281
2281
  `),e.stdout.write(` AgentCalls: ${o.agentCallCount}
2282
2282
  `),e.stdout.write(` Tokens: ${o.totalInputTokens} in / ${o.totalOutputTokens} out
2283
2283
  `),0)}async function aW(e,t,r){let n,s;try{let y=await $(e,w=>{let I=De(t,w);if(I.parseErrors.length>0)throw new Error(I.parseErrors.join("; "));return{teamName:I.name,targets:bS(t,w,new Set,[])}});s=y.teamName,n=y.targets}catch(y){return v(e,`health: ${y instanceof Error?y.message:String(y)}`)}let i=kS(t),o=i.kind==="repo"?i:null,a=await SS(e,n),l=[],c=0,d=o===null?void 0:0,u=o===null?void 0:0;for(let y of n){let w=null;try{w=await Qt(y.sessionid,y.provider)}catch(W){e.stderr.write(`warning: failed to load session "${y.sessionid}" for ${y.reportPath} (${y.provider}): ${W instanceof Error?W.message:String(W)}
2284
- `)}let I=w?.messageCount,x=o===null?void 0:w===null?null:IS(w,o.since),U=o===null?void 0:w===null?null:NS(w)??"n/a",ue=o===null?void 0:{messageCount:x??null,tokens:null};l.push({alias:y.alias,reportPath:y.reportPath,teamfile:y.teamfile,provider:y.provider,sessionid:y.sessionid,messageCount:I??null,model:w?.model??"(unknown)",lastContext:w?.lastInputTokens,detailLoaded:w!==null,liveness:a.get(af(y.teamfile,y.alias))??lf(),sessionLimit:w===null?null:Cs(w.messages),...o!==null?{activitySinceLastCommit:ue,cumulativeTokens:U}:{}}),I===void 0?c=void 0:c!==void 0&&(c+=I),o!==null&&(x==null?d=void 0:d!==void 0&&(d+=x),U==null||U==="n/a"?u=void 0:u!==void 0&&(u+=U))}if(r)return ae(e,{team:s,git:o===null?null:{teamDir:o.teamDir,commits:o.commits.map(y=>({ref:y.ref,timestamp:y.timestamp.toISOString()})),since:o.since.toISOString(),working:o.working},members:l.map(({detailLoaded:y,cumulativeTokens:w,...I})=>({...I,lastContext:I.lastContext??null,...w!==void 0?{cumulativeTokens:w==="n/a"?null:w}:{}})),total:{messageCount:c??null}}),0;let f=Math.max(7,...l.map(y=>y.sessionid.length)),m=Math.max(5,...l.map(y=>y.reportPath.length))+1,p=Math.max(8,...l.map(y=>y.provider.length))+1,_=Math.max(5,...l.map(y=>y.model.length))+1,g=Math.max(4,...l.map(y=>of(y.liveness).length))+1;if(e.stdout.write(`TEAM: ${s}
2284
+ `)}let I=w?.messageCount,x=o===null?void 0:w===null?null:IS(w,o.since),U=o===null?void 0:w===null?null:NS(w)??"n/a",ue=o===null?void 0:{messageCount:x??null,tokens:null};l.push({alias:y.alias,reportPath:y.reportPath,teamfile:y.teamfile,provider:y.provider,sessionid:y.sessionid,messageCount:I??null,model:w?.model??"(unknown)",lastContext:w?.lastInputTokens,detailLoaded:w!==null,liveness:a.get(of(y.teamfile,y.alias))??af(),sessionLimit:w===null?null:Cs(w.messages),...o!==null?{activitySinceLastCommit:ue,cumulativeTokens:U}:{}}),I===void 0?c=void 0:c!==void 0&&(c+=I),o!==null&&(x==null?d=void 0:d!==void 0&&(d+=x),U==null||U==="n/a"?u=void 0:u!==void 0&&(u+=U))}if(r)return ae(e,{team:s,git:o===null?null:{teamDir:o.teamDir,commits:o.commits.map(y=>({ref:y.ref,timestamp:y.timestamp.toISOString()})),since:o.since.toISOString(),working:o.working},members:l.map(({detailLoaded:y,cumulativeTokens:w,...I})=>({...I,lastContext:I.lastContext??null,...w!==void 0?{cumulativeTokens:w==="n/a"?null:w}:{}})),total:{messageCount:c??null}}),0;let f=Math.max(7,...l.map(y=>y.sessionid.length)),m=Math.max(5,...l.map(y=>y.reportPath.length))+1,p=Math.max(8,...l.map(y=>y.provider.length))+1,_=Math.max(5,...l.map(y=>y.model.length))+1,g=Math.max(4,...l.map(y=>sf(y.liveness).length))+1;if(e.stdout.write(`TEAM: ${s}
2285
2285
  `),i.kind==="repo"){e.stdout.write(`Git progress:
2286
2286
  `);for(let y of i.commits)e.stdout.write(` ${y.ref}: ${y.timestamp.toISOString()}
2287
2287
  `);e.stdout.write(` Uncommitted: ${gt(i.working.uncommittedTracked)} changed (tracked), ${gt(i.working.untracked)} untracked
2288
2288
  `)}else i.reason==="no-commits"?e.stdout.write(`Git progress: git repository in ${i.teamDir} has no commits (no commit-based progress to report)
2289
2289
  `):e.stdout.write(`Git progress: no git repository in ${i.teamDir} (no commit-based progress to report)
2290
2290
  `);e.stdout.write(` ${"SESSION".padEnd(f)} ${"ALIAS".padEnd(m)}${"PROVIDER".padEnd(p)}${"MODEL".padEnd(_)}${"LIVE".padEnd(g)}${"MSGS".padStart(6)} ${"LAST CONTEXT".padStart(12)}`+(o!==null?` ${"MSGS SINCE COMMIT".padStart(17)} ${"TOKENS SINCE COMMIT".padStart(19)} ${"TOKENS (cumulative)".padStart(19)}`:"")+`
2291
- `);let h=!1,S=l.filter(y=>y.sessionLimit!==null);for(let y of l){let w=uW(y.lastContext,y.detailLoaded,nW);(w==="n/a"||y.cumulativeTokens==="n/a")&&(h=!0),e.stdout.write(` ${y.sessionid.padEnd(f)} ${y.reportPath.padEnd(m)}${y.provider.padEnd(p)}${y.model.padEnd(_)}${of(y.liveness).padEnd(g)}${gt(y.messageCount).padStart(6)} ${w.padStart(12)}`+(o!==null?` ${gt(y.activitySinceLastCommit?.messageCount).padStart(17)} ${gt(y.activitySinceLastCommit?.tokens).padStart(19)} ${dW(y.cumulativeTokens).padStart(19)}`:"")+`
2291
+ `);let h=!1,S=l.filter(y=>y.sessionLimit!==null);for(let y of l){let w=uW(y.lastContext,y.detailLoaded,nW);(w==="n/a"||y.cumulativeTokens==="n/a")&&(h=!0),e.stdout.write(` ${y.sessionid.padEnd(f)} ${y.reportPath.padEnd(m)}${y.provider.padEnd(p)}${y.model.padEnd(_)}${sf(y.liveness).padEnd(g)}${gt(y.messageCount).padStart(6)} ${w.padStart(12)}`+(o!==null?` ${gt(y.activitySinceLastCommit?.messageCount).padStart(17)} ${gt(y.activitySinceLastCommit?.tokens).padStart(19)} ${dW(y.cumulativeTokens).padStart(19)}`:"")+`
2292
2292
  `)}if(e.stdout.write(` ${"TOTAL".padEnd(f)} ${"".padEnd(m)}${"".padEnd(p)}${"".padEnd(_)}${"".padEnd(g)}${gt(c).padStart(6)}`+(o!==null?` ${"".padStart(12)} ${gt(d).padStart(17)} ${gt(null).padStart(19)} ${gt(u).padStart(19)}`:"")+`
2293
2293
  `),h&&e.stdout.write(`n/a = this provider does not expose a context/token total; absence is not a health signal.
2294
2294
  `),S.length>0){e.stdout.write(`Session limits:
2295
2295
  `);for(let y of S)e.stdout.write(` ${y.reportPath}: LIMITED resets_at=${vS(y.sessionLimit)}
2296
- `)}return 0}function bS(e,t,r,n){let s=we(e,t);if(r.has(s))return[];r.add(s);let i=De(s,t);if(i.parseErrors.length>0)throw new Error(`${s}: ${i.parseErrors.join("; ")}`);let o=[];for(let a of i.members){if(a.teamfile!==void 0){o.push(...bS(eW(TS(s),a.teamfile),t,r,[...n,a.alias]));continue}a.session===void 0||a.session.length===0||o.push({teamfile:s,alias:a.alias,reportPath:[...n,a.alias].join("/"),provider:a.provider,sessionid:a.session})}return o}async function lW(e,t,r){let n=await SS(e,[{teamfile:t.teamfile,alias:t.alias}]),s=kS(t.teamfile),i=s.kind==="repo"?s:null;return{teamfile:t.teamfile,reportPath:t.alias,lastContext:r.lastInputTokens??null,liveness:n.get(af(t.teamfile,t.alias))??lf(),...i!==null?{activitySinceLastCommit:{messageCount:IS(r,i.since),tokens:null},cumulativeTokens:NS(r)??"n/a"}:{}}}async function SS(e,t){try{let r=await $(e,n=>t.map(s=>{let i=Pr(n,s.teamfile,s.alias);return[af(s.teamfile,s.alias),cW(i)]}));return new Map(r)}catch{return new Map}}function af(e,t){return`${e}\0${t.toLowerCase()}`}function cW(e){return e.busy?e.reason==="terminal-held"?e.source==="terminal-invocation"?{state:"busy",reason:"terminal-held",inFlight:null,terminalLock:null,terminalInvocation:{id:e.terminalInvocation.id,startedAt:e.terminalInvocation.started_at,lastHeartbeat:e.terminalInvocation.last_heartbeat_at,holderPid:e.terminalInvocation.holder_pid,holderHost:e.terminalInvocation.holder_host}}:{state:"busy",reason:"terminal-held",inFlight:null,terminalLock:{startedAt:e.terminalLock.started_at,lastHeartbeat:e.terminalLock.last_heartbeat,holderPid:e.terminalLock.holder_pid,holderHost:e.terminalLock.holder_host},terminalInvocation:null}:{state:"busy",reason:"in-flight",inFlight:{senderTeamfile:e.inFlight.sender_teamfile,senderAlias:e.inFlight.sender_alias,startedAt:e.inFlight.started_at,activeCount:e.inFlight.active_count,holderPid:e.inFlight.holder_pid},terminalLock:null,terminalInvocation:null}:lf()}function lf(){return{state:"idle",reason:null,inFlight:null,terminalLock:null,terminalInvocation:null}}function of(e){return e.state==="idle"?"idle":`busy (${e.reason})`}function vS(e){return e.resets_at!==null?e.resets_at:e.timezone!==null?`${e.reset_time} (${e.timezone})`:e.reset_time}function gt(e){return e==null?"unknown":String(e)}function dW(e){return e==="n/a"?e:gt(e)}function uW(e,t,r=String){return e!==void 0?r(e):t?"n/a":"unknown"}function kS(e){let t=TS(e),r;try{sf("git",["-C",t,"rev-parse","--is-inside-work-tree"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{kind:"unavailable",reason:"no-repo",teamDir:t}}try{r=sf("git",["-C",t,"log","-2","--format=%ct"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{kind:"unavailable",reason:"no-commits",teamDir:t}}let n=r.split(/\r?\n/).map(i=>Number.parseInt(i.trim(),10)).filter(i=>Number.isFinite(i)&&i>0);if(n.length===0)return{kind:"unavailable",reason:"no-commits",teamDir:t};let s=n.slice(0,2).map((i,o)=>({ref:o===0?"HEAD":`HEAD~${o}`,timestamp:new Date(i*1e3)}));return{kind:"repo",teamDir:t,since:s[0].timestamp,commits:s,working:fW(t)}}function fW(e){let t;try{t=sf("git",["-C",e,"status","--porcelain"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{uncommittedTracked:null,untracked:null}}let r=0,n=0;for(let s of t.split(/\r?\n/))s.trim().length!==0&&(s.startsWith("??")?n+=1:r+=1);return{uncommittedTracked:r,untracked:n}}function IS(e,t){let r=t.getTime();return e.messages.filter(n=>(n.role==="user"||n.role==="assistant")&&Number.isFinite(n.timestamp.getTime())&&n.timestamp.getTime()>r).length}function NS(e){if(e===null)return null;let t=[e.totalInputTokens,e.totalCachedInputTokens,e.totalCacheWriteInputTokens,e.totalOutputTokens,e.totalReasoningOutputTokens].filter(r=>typeof r=="number"&&Number.isFinite(r));return t.length===0?null:t.reduce((r,n)=>r+n,0)}var tW,rW,AS=T(()=>{"use strict";An();Re();Lt();Rt();Fr();Jt();Pu();tW={name:"health",allowsBareTeamfile:!0,supportsRaw:!0},rW=`usage: lmctl health [target] [alias]
2296
+ `)}return 0}function bS(e,t,r,n){let s=we(e,t);if(r.has(s))return[];r.add(s);let i=De(s,t);if(i.parseErrors.length>0)throw new Error(`${s}: ${i.parseErrors.join("; ")}`);let o=[];for(let a of i.members){if(a.teamfile!==void 0){o.push(...bS(eW(TS(s),a.teamfile),t,r,[...n,a.alias]));continue}a.session===void 0||a.session.length===0||o.push({teamfile:s,alias:a.alias,reportPath:[...n,a.alias].join("/"),provider:a.provider,sessionid:a.session})}return o}async function lW(e,t,r){let n=await SS(e,[{teamfile:t.teamfile,alias:t.alias}]),s=kS(t.teamfile),i=s.kind==="repo"?s:null;return{teamfile:t.teamfile,reportPath:t.alias,lastContext:r.lastInputTokens??null,liveness:n.get(of(t.teamfile,t.alias))??af(),...i!==null?{activitySinceLastCommit:{messageCount:IS(r,i.since),tokens:null},cumulativeTokens:NS(r)??"n/a"}:{}}}async function SS(e,t){try{let r=await $(e,n=>t.map(s=>{let i=Pr(n,s.teamfile,s.alias);return[of(s.teamfile,s.alias),cW(i)]}));return new Map(r)}catch{return new Map}}function of(e,t){return`${e}\0${t.toLowerCase()}`}function cW(e){return e.busy?e.reason==="terminal-held"?e.source==="terminal-invocation"?{state:"busy",reason:"terminal-held",inFlight:null,terminalLock:null,terminalInvocation:{id:e.terminalInvocation.id,startedAt:e.terminalInvocation.started_at,lastHeartbeat:e.terminalInvocation.last_heartbeat_at,holderPid:e.terminalInvocation.holder_pid,holderHost:e.terminalInvocation.holder_host}}:{state:"busy",reason:"terminal-held",inFlight:null,terminalLock:{startedAt:e.terminalLock.started_at,lastHeartbeat:e.terminalLock.last_heartbeat,holderPid:e.terminalLock.holder_pid,holderHost:e.terminalLock.holder_host},terminalInvocation:null}:{state:"busy",reason:"in-flight",inFlight:{senderTeamfile:e.inFlight.sender_teamfile,senderAlias:e.inFlight.sender_alias,startedAt:e.inFlight.started_at,activeCount:e.inFlight.active_count,holderPid:e.inFlight.holder_pid},terminalLock:null,terminalInvocation:null}:af()}function af(){return{state:"idle",reason:null,inFlight:null,terminalLock:null,terminalInvocation:null}}function sf(e){return e.state==="idle"?"idle":`busy (${e.reason})`}function vS(e){return e.resets_at!==null?e.resets_at:e.timezone!==null?`${e.reset_time} (${e.timezone})`:e.reset_time}function gt(e){return e==null?"unknown":String(e)}function dW(e){return e==="n/a"?e:gt(e)}function uW(e,t,r=String){return e!==void 0?r(e):t?"n/a":"unknown"}function kS(e){let t=TS(e),r;try{nf("git",["-C",t,"rev-parse","--is-inside-work-tree"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{kind:"unavailable",reason:"no-repo",teamDir:t}}try{r=nf("git",["-C",t,"log","-2","--format=%ct"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{kind:"unavailable",reason:"no-commits",teamDir:t}}let n=r.split(/\r?\n/).map(i=>Number.parseInt(i.trim(),10)).filter(i=>Number.isFinite(i)&&i>0);if(n.length===0)return{kind:"unavailable",reason:"no-commits",teamDir:t};let s=n.slice(0,2).map((i,o)=>({ref:o===0?"HEAD":`HEAD~${o}`,timestamp:new Date(i*1e3)}));return{kind:"repo",teamDir:t,since:s[0].timestamp,commits:s,working:fW(t)}}function fW(e){let t;try{t=nf("git",["-C",e,"status","--porcelain"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{uncommittedTracked:null,untracked:null}}let r=0,n=0;for(let s of t.split(/\r?\n/))s.trim().length!==0&&(s.startsWith("??")?n+=1:r+=1);return{uncommittedTracked:r,untracked:n}}function IS(e,t){let r=t.getTime();return e.messages.filter(n=>(n.role==="user"||n.role==="assistant")&&Number.isFinite(n.timestamp.getTime())&&n.timestamp.getTime()>r).length}function NS(e){if(e===null)return null;let t=[e.totalInputTokens,e.totalCachedInputTokens,e.totalCacheWriteInputTokens,e.totalOutputTokens,e.totalReasoningOutputTokens].filter(r=>typeof r=="number"&&Number.isFinite(r));return t.length===0?null:t.reduce((r,n)=>r+n,0)}var tW,rW,AS=T(()=>{"use strict";An();Re();Lt();Rt();Fr();Jt();Du();tW={name:"health",allowsBareTeamfile:!0,supportsRaw:!0},rW=`usage: lmctl health [target] [alias]
2297
2297
  lmctl health <teamfile> # team rollup
2298
2298
  lmctl health <sessionid> [--provider <name>]
2299
2299
  [--json]
2300
2300
 
2301
- Show provider session details, team rollups, or managed run state/token totals.`});var LS={};ye(LS,{runLs:()=>hW});import{resolve as cf}from"node:path";function _W(e){let t=new Map;for(let r of e){let n=`${r.provider}:${r.sessionId}`,s=t.get(n);(s===void 0||r.modifiedAt.getTime()>s.modifiedAt.getTime())&&t.set(n,r)}return[...t.values()]}async function hW(e,t={stdout:process.stdout,stderr:process.stderr}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(`${mW}
2302
- `),0;let r=Z(e,["--provider","--sessiondir","--format","--limit"],["--recursive","--all","--json","--runs","--help"]);if(r.error!==void 0)return v(t,r.error);if(r.positionals.length>0)return v(t,"ls does not accept positional targets (use --provider/--sessiondir/--all to filter)");let n=P(r,"--format"),s=G(r,"--json");if(G(r,"--runs")){for(let h of["--provider","--sessiondir"])if(P(r,h)!==void 0)return v(t,`--runs is mutually exclusive with ${h}`);for(let h of["--recursive","--all"])if(G(r,h))return v(t,`--runs is mutually exclusive with ${h}`);if(n==="teamfile")return v(t,"--runs is mutually exclusive with --format teamfile (runs are not teamfile members)");let p=P(r,"--limit"),_=pW;if(p!==void 0){let h=Number.parseInt(p,10);if(!Number.isFinite(h)||h<1||String(h)!==p)return v(t,`invalid --limit "${p}" (expected a positive integer)`);if(h>RS)return v(t,`--limit ${h} exceeds maximum (${RS})`);_=h}let g=n==="json"||s===!0?"json":"table";try{return await $(t,async h=>gW(t,h,_,g))}catch(h){return Me(t,h)}}let o=yW(n,s);if("error"in o)return v(t,o.error);let a=o.format,l=P(r,"--provider"),c=P(r,"--sessiondir"),d=G(r,"--recursive"),u=G(r,"--all"),f;try{f=await lc(l?{provider:l}:{})}catch(p){return v(t,`ls: discovery failed: ${p instanceof Error?p.message:String(p)}`)}if(!u){let p=c!==void 0?cf(c):cf(process.cwd());f=f.filter(_=>{let g=cf(_.cwd);return d?g===p||g.startsWith(`${p}/`):g===p})}if(f=_W(f),a==="json")return ae(t,f.map(p=>({provider:p.provider,sessionId:p.sessionId,cwd:p.cwd,messageCount:p.messageCount,modifiedAt:p.modifiedAt.toISOString(),...p.model!==void 0?{model:p.model}:{}}))),0;if(f.length===0){if(a==="table"){let p=u?"(all)":c??process.cwd(),_=d?"under":"in";t.stdout.write(`No native sessions found ${_} ${p}.
2301
+ Show provider session details, team rollups, or managed run state/token totals.`});var LS={};ye(LS,{runLs:()=>hW});import{resolve as lf}from"node:path";function _W(e){let t=new Map;for(let r of e){let n=`${r.provider}:${r.sessionId}`,s=t.get(n);(s===void 0||r.modifiedAt.getTime()>s.modifiedAt.getTime())&&t.set(n,r)}return[...t.values()]}async function hW(e,t={stdout:process.stdout,stderr:process.stderr}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(`${mW}
2302
+ `),0;let r=Z(e,["--provider","--sessiondir","--format","--limit"],["--recursive","--all","--json","--runs","--help"]);if(r.error!==void 0)return v(t,r.error);if(r.positionals.length>0)return v(t,"ls does not accept positional targets (use --provider/--sessiondir/--all to filter)");let n=P(r,"--format"),s=G(r,"--json");if(G(r,"--runs")){for(let h of["--provider","--sessiondir"])if(P(r,h)!==void 0)return v(t,`--runs is mutually exclusive with ${h}`);for(let h of["--recursive","--all"])if(G(r,h))return v(t,`--runs is mutually exclusive with ${h}`);if(n==="teamfile")return v(t,"--runs is mutually exclusive with --format teamfile (runs are not teamfile members)");let p=P(r,"--limit"),_=pW;if(p!==void 0){let h=Number.parseInt(p,10);if(!Number.isFinite(h)||h<1||String(h)!==p)return v(t,`invalid --limit "${p}" (expected a positive integer)`);if(h>RS)return v(t,`--limit ${h} exceeds maximum (${RS})`);_=h}let g=n==="json"||s===!0?"json":"table";try{return await $(t,async h=>gW(t,h,_,g))}catch(h){return Me(t,h)}}let o=yW(n,s);if("error"in o)return v(t,o.error);let a=o.format,l=P(r,"--provider"),c=P(r,"--sessiondir"),d=G(r,"--recursive"),u=G(r,"--all"),f;try{f=await ac(l?{provider:l}:{})}catch(p){return v(t,`ls: discovery failed: ${p instanceof Error?p.message:String(p)}`)}if(!u){let p=c!==void 0?lf(c):lf(process.cwd());f=f.filter(_=>{let g=lf(_.cwd);return d?g===p||g.startsWith(`${p}/`):g===p})}if(f=_W(f),a==="json")return ae(t,f.map(p=>({provider:p.provider,sessionId:p.sessionId,cwd:p.cwd,messageCount:p.messageCount,modifiedAt:p.modifiedAt.toISOString(),...p.model!==void 0?{model:p.model}:{}}))),0;if(f.length===0){if(a==="table"){let p=u?"(all)":c??process.cwd(),_=d?"under":"in";t.stdout.write(`No native sessions found ${_} ${p}.
2303
2303
  `)}return 0}if(a==="teamfile"){for(let p of f)t.stdout.write(`_MEMBER_ alias=- provider=${p.provider} sessionid=${p.sessionId} sessiondir=${p.cwd}
2304
2304
  `);return 0}let m=Math.max(14,...f.map(p=>p.sessionId.length));t.stdout.write(`${"SESSION".padEnd(m)} ${"PROVIDER".padEnd(10)} ${"SESSIONDIR".padEnd(36)} MODIFIED
2305
2305
  `);for(let p of f){let _=p.cwd.length>36?`\u2026${p.cwd.slice(-35)}`:p.cwd;t.stdout.write(`${p.sessionId.padEnd(m)} ${p.provider.padEnd(10)} ${_.padEnd(36)} ${p.modifiedAt.toISOString()}
@@ -2310,16 +2310,16 @@ Show provider session details, team rollups, or managed run state/token totals.`
2310
2310
  [--recursive] [--all] [--format table|teamfile|json] [--json]
2311
2311
  lmctl ls --runs [--limit N] [--format table|json] [--json]
2312
2312
 
2313
- List native provider sessions in scope, or list recent managed runs with --runs.`,pW=50,RS=500});import{existsSync as Ds,readFileSync as $S}from"node:fs";import{homedir as wW}from"node:os";import{dirname as CS,resolve as $n}from"node:path";import{fileURLToPath as EW}from"node:url";function ff(e,t={}){let r=[],n=SW(t.modelSelectionDocPath);for(let s of e){let i=s.provider.trim().toLowerCase();if(s.effort&&i!=="opencode"&&i!=="lmplayer"&&i!=="qwen"&&r.push(`[${s.alias}] effort="${s.effort}" is ignored: effort selection is only supported for opencode and lmplayer.`),i==="qwen"&&s.effort&&r.push(`[${s.alias}] effort="${s.effort}" is not a qwen CLI flag: Qwen Code does not expose reasoning-effort selection. Use a thinking/effort model id in model= instead.`),i==="copilot"){if(!s.model)continue;r.push(`[${s.alias}] model="${s.model}" is ignored: copilot does not support lmctl model selection.`);continue}if(i==="lmplayer"&&!s.model){r.push(`[${s.alias}] provider=lmplayer has no model= \u2014 lmplayer will choose its own default model, which may not be visible in the teamfile. Set model= explicitly (e.g. github-copilot/gpt-5.4).`);continue}if(i==="lmplayer")continue;if(i==="opencode"){if(s.effort&&!s.model&&r.push(`[${s.alias}] effort="${s.effort}" has no effect without model= on an opencode member.`),!s.model){r.push(`[${s.alias}] provider=opencode has no model= \u2014 opencode will choose its own default model, which may not be servable and isn't visible in the teamfile. Set model= explicitly (e.g. github-copilot/gpt-5.4).`);continue}let a=AW(t.opencodeConfigPath);if(!a.available){r.push(`[${s.alias}] model="${s.model}" cannot be verified for opencode: ${a.reason}.`);continue}if(a.models.includes(s.model)||/^github-copilot\/(gpt|gemini|o[0-9])/.test(s.model))continue;if(!s.model.includes("/")){let l=a.models.filter(c=>c.endsWith(`/${s.model}`));r.push(l.length>0?`[${s.alias}] model="${s.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model>. Your opencode.json declares it as ${l.join(" / ")}; set model=${l[0]}.`:`[${s.alias}] model="${s.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model> (e.g. github-copilot/${s.model}). Declare it in ~/.config/opencode/opencode.json (see https://lmctl.com/examples/opencode.json).`);continue}r.push(`[${s.alias}] model="${s.model}" is not declared in your opencode.json. opencode resolves github-copilot GPT/Gemini config-free, but copilot Claude and custom providers must be declared \u2014 copy https://lmctl.com/examples/opencode.json to ~/.config/opencode/opencode.json and adjust for your account.`);continue}if(!s.model)continue;let o=n.get(i);if(!o){r.push(`[${s.alias}] model="${s.model}" cannot be verified for provider "${i}": `+(Ma??"no tested models found in durable-memory/model_selection.md"));continue}o.includes(s.model)||r.push(`[${s.alias}] model="${s.model}" is not in the tested model list for provider "${i}". Valid tested models: ${LW(o)}`)}return r}function SW(e){if(!e&&js)return js;let t=new Map,r,n=e??vW();if(!Ds(n))return r=`${n} not found`,e||df(t),e||(js=t),e||(Ma=r),t;let s;try{s=$S(n,"utf-8")}catch(i){return r=`${n} could not be read: ${i instanceof Error?i.message:String(i)}`,e||df(t),e||(js=t),e||(Ma=r),t}for(let[i,o]of Object.entries(TW)){let a=NW(s,o),l=xW(a);l.length>0&&t.set(i,l)}return t.size===0&&(r=`${n} has no tested model rows`),!e&&t.size===0&&df(t),e||(js=t),e||(Ma=r),t}function vW(){return kW(CS(EW(import.meta.url)))}function kW(e){let t=IW(e);if(t){let n=$n(t,"durable-memory","model_selection.md");if(Ds(n))return n}let r=[$n(e,"..","..","durable-memory","model_selection.md"),$n(e,"..","..","..","durable-memory","model_selection.md")];for(let n of r)if(Ds(n))return n;return r[r.length-1]}function IW(e){let t=$n(e);for(;;){if(Ds($n(t,"package.json")))return t;let r=CS(t);if(r===t)return null;t=r}}function df(e){for(let[t,r]of Object.entries(bW))e.set(t,r)}function NW(e,t){let n=new RegExp(`^## ${OW(t)}\\s*$`,"m").exec(e);if(!n)return"";let s=n.index+n[0].length,i=e.slice(s),o=/^##\s+/m.exec(i);return o?i.slice(0,o.index):i}function xW(e){let t=new Set;for(let r of e.split(/\r?\n/)){let n=r.trim();if(!n.startsWith("| `"))continue;let s=/^\|\s*`([^`]+)`\s*\|/.exec(n);if(!s)continue;let i=s[1].trim();i&&i!=="Configured `model="&&t.add(i)}return[...t]}function AW(e){let t=e??$n(wW(),".config","opencode","opencode.json");if(!Ds(t))return{available:!0,models:[]};let r;try{r=JSON.parse($S(t,"utf-8"))}catch(n){return{available:!1,models:[],reason:`${t} could not be parsed: ${n instanceof Error?n.message:String(n)}`}}return{available:!0,models:RW(r)}}function RW(e){if(!uf(e))return[];let t=Ca(e.provider)??Ca(e.providers);if(!t)return[];let r=new Set;for(let[n,s]of Object.entries(t)){if(!uf(s))continue;let i=Ca(s.models)??Ca(s.model);if(i)for(let o of Object.keys(i))r.add(o.startsWith(`${n}/`)?o:`${n}/${o}`)}return[...r].sort()}function Ca(e){return uf(e)?e:null}function uf(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function LW(e){return e.length>0?e.join(", "):"(none)"}function OW(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var TW,bW,js,Ma,MS=T(()=>{"use strict";TW={claude:"Claude",codex:"Codex",gemini:"Gemini",qwen:"Qwen",agy:"Antigravity"},bW={claude:["claude-opus-4-6","claude-opus-4-7","claude-opus-4-8","claude-sonnet-4-6","claude-sonnet-5","claude-haiku-4-5","claude-fable-5"],codex:["gpt-5.2","gpt-5.4","gpt-5.5","gpt-5.4-mini","gpt-5.3-codex","gpt-5.3-codex-spark"],gemini:["gemini-3.1-pro-preview","gemini-3-flash-preview","gemini-3.1-flash-lite-preview","gemini-2.5-flash","gemini-2.5-flash-lite"],qwen:["qwen3.5-plus","qwen3.6-plus"],agy:["gemini-1.5-flash","gemini-1.5-pro","gemini-3.5-flash","gemini-3.1-pro","gpt-oss-120b","gpt-4-turbo","gpt-4","gpt-3.5-turbo","claude-3-opus","claude-3-sonnet","claude-3-haiku"]},js=null});import{homedir as $W}from"node:os";import{basename as CW}from"node:path";function ja(e,t){let r=new Set;return{text:e.replace(jW,(s,i)=>{let o=i.trim(),a=MW[o];return a===void 0?(r.add(o),s):a(t)}),unknownNames:[...r].sort()}}function Da(e){return{workdir:e.workdir,teamfile:e.teamfile,date:DW(e.date)}}function DW(e){return e.toISOString().slice(0,10)}var MW,jW,mf=T(()=>{"use strict";MW={workdir:e=>e.workdir,teamfile:e=>e.teamfile,teamname:e=>{let t=CW(e.teamfile);return t.endsWith(".lmctl")?t.slice(0,-6):t},home:()=>$W(),date:e=>e.date},jW=/{{\s*([A-Za-z0-9_-]+)\s*}}/g});var Us={};ye(Us,{GEMINI_PROVIDER_NOTICE:()=>FS,_setLintSessiondirFsOpsForTests:()=>JW,_setTeamfileSeedForTests:()=>HW,buildRootTeamRegistrationRow:()=>HS,registerRootTeam:()=>JS,runHire:()=>QW,runLint:()=>ZW,runRefresh:()=>eB,runSeed:()=>BS,sha256Text:()=>qS});import{createHash as PW}from"node:crypto";import{accessSync as FW,constants as jS,existsSync as UW,readFileSync as Ua,realpathSync as hf,statSync as WW,writeFileSync as Fa}from"node:fs";import{dirname as Jr,resolve as PS}from"node:path";function HW(e){US=e??(async t=>{let{seed:r}=await Promise.resolve().then(()=>(vt(),dc)),n=await r(t);return n.success?{sessionId:n.sessionId}:{error:n.error??"provider seed failed"}})}function JW(e){Hr=e===null?gf:{...gf,...e}}function XW(e,t){let r=Jr(t),n=new Set,s=[];for(let i of e){if(i.teamfile!==void 0)continue;let o=i.sessiondir??r,a=PS(o);if(n.has(a))continue;let l=GW(a);l!==void 0&&(n.add(a),s.push(`${i.alias}: sessiondir ${a} is not writable (seed would fail: ${l}) \u2014 fix permissions or set a writable sessiondir`))}return s}function GW(e){try{if(Hr.existsSync(e)){if(!Hr.statSync(e).isDirectory())return"ENOTDIR";Hr.accessSync(e,jS.W_OK);return}let t=YW(e);if(t===void 0)return;if(!Hr.statSync(t).isDirectory())return"ENOTDIR";Hr.accessSync(t,jS.W_OK);return}catch(t){return zW(t)??"permission check failed"}}function VW(e,t){let r=[];for(let n of e)n.teamfile!==void 0||n.sessiondir===void 0||WS(n.sessiondir,t)&&r.push(`${n.alias}: sessiondir equals the teamfile directory and is redundant; lmctl seed will remove it`);return r}function KW(e,t,r,n){let s=!1;for(let i of e){if(i.teamfile!==void 0||i.sessiondir===void 0||!WS(i.sessiondir,n))continue;let o=r.get(i.alias.toLowerCase());if(o===void 0)continue;let a=XS(t[o],"sessiondir");a!==t[o]&&(t[o]=a,s=!0),i.sessiondir=void 0}return s}function WS(e,t){return DS(e)===DS(t)}function DS(e){let t=PS(e);try{return hf(t)}catch{return t}}function YW(e){let t=e;for(;;){try{if(Hr.existsSync(t))return t}catch{return}let r=Jr(t);if(r===t)return;t=r}}function zW(e){if(typeof e=="object"&&e!==null&&"code"in e){let t=e.code;if(typeof t=="string"&&t.length>0)return t}}async function ZW(e,t={stdout:process.stdout,stderr:process.stderr}){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(BW),0;if(e.length!==1)return t.stderr.write(`usage: lmctl lint <teamfile.lmctl>
2314
- `),2;let r=e[0],n;try{n=await $(t,c=>we(r,c))}catch(c){return Oe(t,`${r}: ${c instanceof Error?c.message:String(c)}`)}let s;try{s=je(n)}catch(c){return Oe(t,`${r}: ${c instanceof Error?c.message:String(c)}`)}let i=Vd(s,Jr(n)),o=ff(s.members),a=Ua(n,"utf8"),l=ja(a,Da({workdir:Jr(n),teamfile:n,date:new Date})).unknownNames;l.length>0&&o.push(`unknown template placeholder${l.length===1?"":"s"}: ${l.map(c=>`{{${c}}}`).join(", ")}`),o.push(...vl(s.members,Jr(n))),o.push(...XW(s.members,n)),o.push(...VW(s.members,Jr(n)));for(let c of i)t.stderr.write(`error: ${c.field}: ${c.message}
2315
- `);for(let c of s.members)wf([c],t),c.session!==void 0&&c.session.length<Ps&&o.push(`${c.alias}: sessionid is shorter than ${Ps} chars; run lmctl seed to refresh it`);for(let c of o)t.stderr.write(`warning: ${c}
2313
+ List native provider sessions in scope, or list recent managed runs with --runs.`,pW=50,RS=500});import{existsSync as Ds,readFileSync as $S}from"node:fs";import{homedir as wW}from"node:os";import{dirname as CS,resolve as $n}from"node:path";import{fileURLToPath as EW}from"node:url";function uf(e,t={}){let r=[],n=SW(t.modelSelectionDocPath);for(let s of e){let i=s.provider.trim().toLowerCase();if(s.effort&&i!=="opencode"&&i!=="lmplayer"&&i!=="qwen"&&r.push(`[${s.alias}] effort="${s.effort}" is ignored: effort selection is only supported for opencode and lmplayer.`),i==="qwen"&&s.effort&&r.push(`[${s.alias}] effort="${s.effort}" is not a qwen CLI flag: Qwen Code does not expose reasoning-effort selection. Use a thinking/effort model id in model= instead.`),i==="copilot"){if(!s.model)continue;r.push(`[${s.alias}] model="${s.model}" is ignored: copilot does not support lmctl model selection.`);continue}if(i==="lmplayer"&&!s.model){r.push(`[${s.alias}] provider=lmplayer has no model= \u2014 lmplayer will choose its own default model, which may not be visible in the teamfile. Set model= explicitly (e.g. github-copilot/gpt-5.4).`);continue}if(i==="lmplayer")continue;if(i==="opencode"){if(s.effort&&!s.model&&r.push(`[${s.alias}] effort="${s.effort}" has no effect without model= on an opencode member.`),!s.model){r.push(`[${s.alias}] provider=opencode has no model= \u2014 opencode will choose its own default model, which may not be servable and isn't visible in the teamfile. Set model= explicitly (e.g. github-copilot/gpt-5.4).`);continue}let a=AW(t.opencodeConfigPath);if(!a.available){r.push(`[${s.alias}] model="${s.model}" cannot be verified for opencode: ${a.reason}.`);continue}if(a.models.includes(s.model)||/^github-copilot\/(gpt|gemini|o[0-9])/.test(s.model))continue;if(!s.model.includes("/")){let l=a.models.filter(c=>c.endsWith(`/${s.model}`));r.push(l.length>0?`[${s.alias}] model="${s.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model>. Your opencode.json declares it as ${l.join(" / ")}; set model=${l[0]}.`:`[${s.alias}] model="${s.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model> (e.g. github-copilot/${s.model}). Declare it in ~/.config/opencode/opencode.json (see https://lmctl.com/examples/opencode.json).`);continue}r.push(`[${s.alias}] model="${s.model}" is not declared in your opencode.json. opencode resolves github-copilot GPT/Gemini config-free, but copilot Claude and custom providers must be declared \u2014 copy https://lmctl.com/examples/opencode.json to ~/.config/opencode/opencode.json and adjust for your account.`);continue}if(!s.model)continue;let o=n.get(i);if(!o){r.push(`[${s.alias}] model="${s.model}" cannot be verified for provider "${i}": `+(Ma??"no tested models found in durable-memory/model_selection.md"));continue}o.includes(s.model)||r.push(`[${s.alias}] model="${s.model}" is not in the tested model list for provider "${i}". Valid tested models: ${LW(o)}`)}return r}function SW(e){if(!e&&js)return js;let t=new Map,r,n=e??vW();if(!Ds(n))return r=`${n} not found`,e||cf(t),e||(js=t),e||(Ma=r),t;let s;try{s=$S(n,"utf-8")}catch(i){return r=`${n} could not be read: ${i instanceof Error?i.message:String(i)}`,e||cf(t),e||(js=t),e||(Ma=r),t}for(let[i,o]of Object.entries(TW)){let a=NW(s,o),l=xW(a);l.length>0&&t.set(i,l)}return t.size===0&&(r=`${n} has no tested model rows`),!e&&t.size===0&&cf(t),e||(js=t),e||(Ma=r),t}function vW(){return kW(CS(EW(import.meta.url)))}function kW(e){let t=IW(e);if(t){let n=$n(t,"durable-memory","model_selection.md");if(Ds(n))return n}let r=[$n(e,"..","..","durable-memory","model_selection.md"),$n(e,"..","..","..","durable-memory","model_selection.md")];for(let n of r)if(Ds(n))return n;return r[r.length-1]}function IW(e){let t=$n(e);for(;;){if(Ds($n(t,"package.json")))return t;let r=CS(t);if(r===t)return null;t=r}}function cf(e){for(let[t,r]of Object.entries(bW))e.set(t,r)}function NW(e,t){let n=new RegExp(`^## ${OW(t)}\\s*$`,"m").exec(e);if(!n)return"";let s=n.index+n[0].length,i=e.slice(s),o=/^##\s+/m.exec(i);return o?i.slice(0,o.index):i}function xW(e){let t=new Set;for(let r of e.split(/\r?\n/)){let n=r.trim();if(!n.startsWith("| `"))continue;let s=/^\|\s*`([^`]+)`\s*\|/.exec(n);if(!s)continue;let i=s[1].trim();i&&i!=="Configured `model="&&t.add(i)}return[...t]}function AW(e){let t=e??$n(wW(),".config","opencode","opencode.json");if(!Ds(t))return{available:!0,models:[]};let r;try{r=JSON.parse($S(t,"utf-8"))}catch(n){return{available:!1,models:[],reason:`${t} could not be parsed: ${n instanceof Error?n.message:String(n)}`}}return{available:!0,models:RW(r)}}function RW(e){if(!df(e))return[];let t=Ca(e.provider)??Ca(e.providers);if(!t)return[];let r=new Set;for(let[n,s]of Object.entries(t)){if(!df(s))continue;let i=Ca(s.models)??Ca(s.model);if(i)for(let o of Object.keys(i))r.add(o.startsWith(`${n}/`)?o:`${n}/${o}`)}return[...r].sort()}function Ca(e){return df(e)?e:null}function df(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function LW(e){return e.length>0?e.join(", "):"(none)"}function OW(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var TW,bW,js,Ma,MS=T(()=>{"use strict";TW={claude:"Claude",codex:"Codex",gemini:"Gemini",qwen:"Qwen",agy:"Antigravity"},bW={claude:["claude-opus-4-6","claude-opus-4-7","claude-opus-4-8","claude-sonnet-4-6","claude-sonnet-5","claude-haiku-4-5","claude-fable-5"],codex:["gpt-5.2","gpt-5.4","gpt-5.5","gpt-5.4-mini","gpt-5.3-codex","gpt-5.3-codex-spark"],gemini:["gemini-3.1-pro-preview","gemini-3-flash-preview","gemini-3.1-flash-lite-preview","gemini-2.5-flash","gemini-2.5-flash-lite"],qwen:["qwen3.5-plus","qwen3.6-plus"],agy:["gemini-1.5-flash","gemini-1.5-pro","gemini-3.5-flash","gemini-3.1-pro","gpt-oss-120b","gpt-4-turbo","gpt-4","gpt-3.5-turbo","claude-3-opus","claude-3-sonnet","claude-3-haiku"]},js=null});import{homedir as $W}from"node:os";import{basename as CW}from"node:path";function ja(e,t){let r=new Set;return{text:e.replace(jW,(s,i)=>{let o=i.trim(),a=MW[o];return a===void 0?(r.add(o),s):a(t)}),unknownNames:[...r].sort()}}function Da(e){return{workdir:e.workdir,teamfile:e.teamfile,date:DW(e.date)}}function DW(e){return e.toISOString().slice(0,10)}var MW,jW,ff=T(()=>{"use strict";MW={workdir:e=>e.workdir,teamfile:e=>e.teamfile,teamname:e=>{let t=CW(e.teamfile);return t.endsWith(".lmctl")?t.slice(0,-6):t},home:()=>$W(),date:e=>e.date},jW=/{{\s*([A-Za-z0-9_-]+)\s*}}/g});var Us={};ye(Us,{GEMINI_PROVIDER_NOTICE:()=>FS,_setLintSessiondirFsOpsForTests:()=>JW,_setTeamfileSeedForTests:()=>HW,buildRootTeamRegistrationRow:()=>HS,registerRootTeam:()=>JS,runHire:()=>QW,runLint:()=>ZW,runRefresh:()=>eB,runSeed:()=>BS,sha256Text:()=>qS});import{createHash as PW}from"node:crypto";import{accessSync as FW,constants as jS,existsSync as UW,readFileSync as Ua,realpathSync as _f,statSync as WW,writeFileSync as Fa}from"node:fs";import{dirname as Jr,resolve as PS}from"node:path";function HW(e){US=e??(async t=>{let{seed:r}=await Promise.resolve().then(()=>(vt(),cc)),n=await r(t);return n.success?{sessionId:n.sessionId}:{error:n.error??"provider seed failed"}})}function JW(e){Hr=e===null?hf:{...hf,...e}}function XW(e,t){let r=Jr(t),n=new Set,s=[];for(let i of e){if(i.teamfile!==void 0)continue;let o=i.sessiondir??r,a=PS(o);if(n.has(a))continue;let l=GW(a);l!==void 0&&(n.add(a),s.push(`${i.alias}: sessiondir ${a} is not writable (seed would fail: ${l}) \u2014 fix permissions or set a writable sessiondir`))}return s}function GW(e){try{if(Hr.existsSync(e)){if(!Hr.statSync(e).isDirectory())return"ENOTDIR";Hr.accessSync(e,jS.W_OK);return}let t=YW(e);if(t===void 0)return;if(!Hr.statSync(t).isDirectory())return"ENOTDIR";Hr.accessSync(t,jS.W_OK);return}catch(t){return zW(t)??"permission check failed"}}function VW(e,t){let r=[];for(let n of e)n.teamfile!==void 0||n.sessiondir===void 0||WS(n.sessiondir,t)&&r.push(`${n.alias}: sessiondir equals the teamfile directory and is redundant; lmctl seed will remove it`);return r}function KW(e,t,r,n){let s=!1;for(let i of e){if(i.teamfile!==void 0||i.sessiondir===void 0||!WS(i.sessiondir,n))continue;let o=r.get(i.alias.toLowerCase());if(o===void 0)continue;let a=XS(t[o],"sessiondir");a!==t[o]&&(t[o]=a,s=!0),i.sessiondir=void 0}return s}function WS(e,t){return DS(e)===DS(t)}function DS(e){let t=PS(e);try{return _f(t)}catch{return t}}function YW(e){let t=e;for(;;){try{if(Hr.existsSync(t))return t}catch{return}let r=Jr(t);if(r===t)return;t=r}}function zW(e){if(typeof e=="object"&&e!==null&&"code"in e){let t=e.code;if(typeof t=="string"&&t.length>0)return t}}async function ZW(e,t={stdout:process.stdout,stderr:process.stderr}){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(BW),0;if(e.length!==1)return t.stderr.write(`usage: lmctl lint <teamfile.lmctl>
2314
+ `),2;let r=e[0],n;try{n=await $(t,c=>we(r,c))}catch(c){return Oe(t,`${r}: ${c instanceof Error?c.message:String(c)}`)}let s;try{s=je(n)}catch(c){return Oe(t,`${r}: ${c instanceof Error?c.message:String(c)}`)}let i=Gd(s,Jr(n)),o=uf(s.members),a=Ua(n,"utf8"),l=ja(a,Da({workdir:Jr(n),teamfile:n,date:new Date})).unknownNames;l.length>0&&o.push(`unknown template placeholder${l.length===1?"":"s"}: ${l.map(c=>`{{${c}}}`).join(", ")}`),o.push(...Sl(s.members,Jr(n))),o.push(...XW(s.members,n)),o.push(...VW(s.members,Jr(n)));for(let c of i)t.stderr.write(`error: ${c.field}: ${c.message}
2315
+ `);for(let c of s.members)yf([c],t),c.session!==void 0&&c.session.length<Ps&&o.push(`${c.alias}: sessionid is shorter than ${Ps} chars; run lmctl seed to refresh it`);for(let c of o)t.stderr.write(`warning: ${c}
2316
2316
  `);return await $(t,c=>{vE(n,c,d=>t.stderr.write(`${d}
2317
2317
  `))}),i.length>0?1:(t.stdout.write(`ok
2318
2318
  `),0)}async function BS(e,t={stdout:process.stdout,stderr:process.stderr}){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(qW),0;if(e.length!==1)return t.stderr.write(`usage: lmctl seed <teamfile.lmctl>
2319
- `),2;let r=e[0],n;try{n=await $(t,h=>we(r,h))}catch(h){return Oe(t,`${r}: ${h instanceof Error?h.message:String(h)}`)}let s;try{s=hf(n)}catch(h){return Oe(t,`${r}: ${h instanceof Error?h.message:String(h)}`)}let i=Jr(n),o;try{o=je(n)}catch(h){return Oe(t,`${r}: ${h instanceof Error?h.message:String(h)}`)}let l=Ua(n,"utf8").split(`
2320
- `),c=nB(l),d=KW(o.members,l,c,i),u=Vd(o,i);if(u.length>0){wf(o.members,t);for(let h of u)t.stderr.write(`error: ${h.field}: ${h.message}
2321
- `);return 1}try{In(t,o,n)}catch{}wf(o.members,t);for(let h of ff(o.members))t.stderr.write(`warning: ${h}
2322
- `);for(let h of vl(o.members,i))t.stderr.write(`warning: ${h}
2319
+ `),2;let r=e[0],n;try{n=await $(t,h=>we(r,h))}catch(h){return Oe(t,`${r}: ${h instanceof Error?h.message:String(h)}`)}let s;try{s=_f(n)}catch(h){return Oe(t,`${r}: ${h instanceof Error?h.message:String(h)}`)}let i=Jr(n),o;try{o=je(n)}catch(h){return Oe(t,`${r}: ${h instanceof Error?h.message:String(h)}`)}let l=Ua(n,"utf8").split(`
2320
+ `),c=nB(l),d=KW(o.members,l,c,i),u=Gd(o,i);if(u.length>0){yf(o.members,t);for(let h of u)t.stderr.write(`error: ${h.field}: ${h.message}
2321
+ `);return 1}try{In(t,o,n)}catch{}yf(o.members,t);for(let h of uf(o.members))t.stderr.write(`warning: ${h}
2322
+ `);for(let h of Sl(o.members,i))t.stderr.write(`warning: ${h}
2323
2323
  `);let f=0,m=o.members.filter(h=>h.teamfile!==void 0?!1:h.session===void 0||h.session.length<Ps);for(let h of m)if(!GS(h.provider))return t.stderr.write(`error: ${h.alias}: invalid provider "${h.provider}"
2324
2324
  `),1;for(let h of o.members){if(h.teamfile!==void 0)continue;if(h.session!==void 0&&h.session.length>=Ps){t.stderr.write(`warning: ${h.alias}: existing sessionid preserved; skipping
2325
2325
  `);continue}let S=h.sessiondir??i,y=await US({provider:h.provider,cwd:S,...h.model!==void 0?{model:h.model}:{},...h.effort!==void 0?{effort:h.effort}:{},...h.alias.toLowerCase()==="lead"?{prompt:tB(n,l.join(`
@@ -2328,15 +2328,15 @@ List native provider sessions in scope, or list recent managed runs with --runs.
2328
2328
  `),1;let I=aB(l[w],"sessionid",y.sessionId);l[w]=I,f+=1,Fa(n,l.join(`
2329
2329
  `),"utf8"),t.stdout.write(`${h.alias}: seeded ${y.sessionId} provider=${h.provider} sessiondir=${S}
2330
2330
  `)}let p=l.join(`
2331
- `),_=cB(p,hf(n));(_!==p||d)&&Fa(n,_,"utf8"),f===0&&t.stdout.write(`no members needed seeding
2332
- `);let g=new Date().toISOString();return await $(t,h=>{JS(h,{teamfilePath:s,name:o.name,rawText:_,now:g})}),0}async function QW(e,t={stdout:process.stdout,stderr:process.stderr}){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(Pa),0;let r=Z(e,["--provider","--sessiondir"],[]);if(r.error!==void 0)return _f(t,r.error,Pa);if(r.positionals.length!==2)return _f(t,"expected <teamfile.lmctl> and <alias>",Pa);let[n,s]=r.positionals;if(!oB(s))return Oe(t,`invalid alias "${s}"`);if(s.toLowerCase()==="lead")return Oe(t,"hire only applies to non-Lead members");let i=P(r,"--provider");if(i===void 0)return _f(t,"missing value for --provider",Pa);if(!GS(i))return Oe(t,`invalid provider "${i}"`);let o;try{o=await $(t,u=>we(n,u))}catch(u){return Oe(t,`${n}: ${u instanceof Error?u.message:String(u)}`)}let a;try{a=Ua(o,"utf8")}catch(u){return Oe(t,`${n}: ${u instanceof Error?u.message:String(u)}`)}if(iB(a,s))return Oe(t,`${s}: alias already exists in ${o}`);let l=P(r,"--sessiondir"),c=[`_MEMBER_ alias=${yf(s)} provider=${i}`,...l===void 0?[]:[`sessiondir=${yf(l)}`]].join(" "),d=lB(a,c);return Fa(o,d,"utf8"),t.stdout.write(`Hired ${s} (${i}) -> ${o}
2331
+ `),_=cB(p,_f(n));(_!==p||d)&&Fa(n,_,"utf8"),f===0&&t.stdout.write(`no members needed seeding
2332
+ `);let g=new Date().toISOString();return await $(t,h=>{JS(h,{teamfilePath:s,name:o.name,rawText:_,now:g})}),0}async function QW(e,t={stdout:process.stdout,stderr:process.stderr}){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(Pa),0;let r=Z(e,["--provider","--sessiondir"],[]);if(r.error!==void 0)return pf(t,r.error,Pa);if(r.positionals.length!==2)return pf(t,"expected <teamfile.lmctl> and <alias>",Pa);let[n,s]=r.positionals;if(!oB(s))return Oe(t,`invalid alias "${s}"`);if(s.toLowerCase()==="lead")return Oe(t,"hire only applies to non-Lead members");let i=P(r,"--provider");if(i===void 0)return pf(t,"missing value for --provider",Pa);if(!GS(i))return Oe(t,`invalid provider "${i}"`);let o;try{o=await $(t,u=>we(n,u))}catch(u){return Oe(t,`${n}: ${u instanceof Error?u.message:String(u)}`)}let a;try{a=Ua(o,"utf8")}catch(u){return Oe(t,`${n}: ${u instanceof Error?u.message:String(u)}`)}if(iB(a,s))return Oe(t,`${s}: alias already exists in ${o}`);let l=P(r,"--sessiondir"),c=[`_MEMBER_ alias=${gf(s)} provider=${i}`,...l===void 0?[]:[`sessiondir=${gf(l)}`]].join(" "),d=lB(a,c);return Fa(o,d,"utf8"),t.stdout.write(`Hired ${s} (${i}) -> ${o}
2333
2333
  `),t.stdout.write(`Run: lmctl seed ${o}
2334
- `),0}async function eB(e,t={stdout:process.stdout,stderr:process.stderr}){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(pf),0;let r,n;if(e.length===1){let u=Wr(e[0]);if(u===null)return t.stderr.write(pf),2;r=u.teamfile,n=u.alias}else if(e.length===2)[r,n]=e;else return t.stderr.write(pf),2;let s;try{s=await $(t,u=>we(r,u))}catch(u){return Oe(t,`${r}: ${u instanceof Error?u.message:String(u)}`)}let i;try{i=Ua(s,"utf8")}catch(u){return Oe(t,`${r}: ${u instanceof Error?u.message:String(u)}`)}let o=i.split(`
2334
+ `),0}async function eB(e,t={stdout:process.stdout,stderr:process.stderr}){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(mf),0;let r,n;if(e.length===1){let u=Wr(e[0]);if(u===null)return t.stderr.write(mf),2;r=u.teamfile,n=u.alias}else if(e.length===2)[r,n]=e;else return t.stderr.write(mf),2;let s;try{s=await $(t,u=>we(r,u))}catch(u){return Oe(t,`${r}: ${u instanceof Error?u.message:String(u)}`)}let i;try{i=Ua(s,"utf8")}catch(u){return Oe(t,`${r}: ${u instanceof Error?u.message:String(u)}`)}let o=i.split(`
2335
2335
  `),a=sB(o,n);if(a===void 0)return Oe(t,`${n}: no active _MEMBER_ entry found`);let l=o[a];if(Fs(l,"teamfile")!==void 0)return Oe(t,`${n}: refresh only applies to provider-backed members, not teamfile= members`);let c=(t.env??process.env)[Kn],d=Fs(l,"sessionid");return c!==void 0&&c.length>0&&d===c?Oe(t,`${n}: cannot refresh its own running session \u2014 a meta-Lead or the operator must run this refresh.`):(o[a]=XS(l,"sessionid"),a>0&&/^\s*#CreationTime:/u.test(o[a-1])&&o.splice(a-1,1),Fa(s,o.join(`
2336
2336
  `),"utf8"),BS([s],t))}function qS(e){return PW("sha256").update(e).digest("hex")}function HS(e,t){return{teamfile_path:t.teamfilePath,name:t.name,raw_text:t.rawText,raw_sha256:qS(t.rawText),registered_at:e?.registered_at??t.now,last_seeded_at:t.now}}function JS(e,t){let r=HS(e.getRootTeam(t.teamfilePath),t);return e.upsertRootTeam(r),r}function tB(e,t,r){let n=r.filter(a=>a.alias.toLowerCase()!=="lead").map(a=>{let l=a.teamfile!==void 0?`teamfile=${a.teamfile}`:`provider=${a.provider}`;return`- ${a.alias}: ${l}`}),s=n.length>0?n.join(`
2337
2337
  `):"- (no non-Lead members)",i=r.find(a=>a.alias.toLowerCase()==="lead")?.provider??"",o=rB(i,e);return["lmctl seed initial connection only. Create or pin this provider session, then stop.","Do not inspect files, run commands, infer a task, delegate, edit, or begin work.","",`Teamfile path: ${e}`,"You are alias Lead for this AI-managed .lmctl team.","","Delegating work:",`- Blocking command shape: lmctl chat "${e}" <alias> "your task here"`,"- MCP lmctl_chat is synchronous/blocking; use it only as a quick-ping or backup path.","- lmctl is foreground/background agnostic. Use your provider or host runtime for async command handling when it supports that.","- For delegation, run the lmctl chat command above. If your runtime has a tracked background mode, it may wrap that same blocking command and notify you when it completes.","- For arbitrary shell work, use your provider/runtime shell tools directly; lmctl does not execute shell commands.",o,"","Delegation is an ACTION, not a plan: to hand a member a task, run the command or call the tool.","If you use lmctl_chat and it appears only after tool search, call it in the SAME turn and do not stop after discovering it or say you're about to call it.","","Team members:",s,"","Example MCP calls:",...r.filter(a=>a.alias.toLowerCase()!=="lead").map(a=>`lmctl_chat(team="${e}", alias="${a.alias}", prompt="your task here")`),"","If a member feels sluggish or starts drifting (degraded or off-track output):",` 1. Check ONE member's session health: lmctl health "${e}" <alias> (size/state \u2014 informational).`," 2. Make sure important state is captured in durable-memory/ \u2014 update it if not.",` 3. Replace its session: lmctl refresh "${e}" <alias> (re-seeds the member: drops chat history, re-reads durable-memory/). You cannot refresh your own Lead session \u2014 a meta-Lead or the operator does that.`,` Optional: lmctl tail "${e}" <alias> to inspect its recent messages while troubleshooting.`,"(These health/recovery commands are shell commands. For delegation, prefer lmctl chat; lmctl_chat is the synchronous backup.)","","Full teamfile document at seed time:","```lmctl",t.trimEnd(),"```","","Remember this teamfile path. Do not ask the operator for it when asked to ping or delegate to members.","Reply exactly: ACK: teamfile context recorded."].join(`
2338
2338
  `)}function rB(e,t){let r=`lmctl chat "${t}" <alias> "your task here"`;switch(e.toLowerCase()){case"claude":return`- Claude tip: run the blocking command (${r}) as background Bash (run_in_background: true); the runtime re-invokes you with the reply when it completes.`;case"copilot":return`- Copilot tip: run the blocking command (${r}) via bash async mode (mode:"async"); the runtime notifies you with output when it completes.`;case"agy":return`- Antigravity tip: run the blocking command (${r}) via run_command with WaitMsBeforeAsync: 0 (Background Tasks); agy wakes you with the output when it completes.`;case"qwen":return`- Qwen tip: run the blocking command (${r}) via the monitor tool; it notifies you on completion.`;case"codex":return"- Codex note: run lmctl chat as the blocking delegation primitive; use Codex-native tool/background behavior when available.";case"gemini":return"- Gemini note: run lmctl chat as the blocking delegation primitive; use Gemini-native tool/background behavior when available.";case"opencode":return"- OpenCode note: use the provider-native background/task surface when available; otherwise run one blocking lmctl chat turn and wait.";default:return"- If your provider has native background completion, use it around the blocking command; otherwise run one blocking lmctl chat turn at a time."}}function nB(e){let t=new Map;for(let r=0;r<e.length;r+=1){let n=e[r];if(!/^\s*_MEMBER_\s+\S/.test(n))continue;let s=Fs(n,"alias");s!==void 0&&t.set(s.toLowerCase(),r)}return t}function sB(e,t){let r=t.toLowerCase();for(let n=0;n<e.length;n+=1){let s=e[n];if(/^\s*_MEMBER_\s+\S/u.test(s)&&Fs(s,"alias")?.toLowerCase()===r)return n}}function iB(e,t){for(let r of e.split(`
2339
- `))if(/^\s*#?\s*_MEMBER_\s+\S/u.test(r)&&Fs(r,"alias")===t)return!0;return!1}function oB(e){return/^[A-Za-z][A-Za-z0-9_-]*$/u.test(e)}function Fs(e,t){let n=new RegExp(`(?:^|\\s)${t}=(?:"([^"]*)"|(\\S*))`).exec(e);return n===null?void 0:n[1]??n[2]??""}function aB(e,t,r){let n=`${t}=${yf(r)}`,s=new RegExp(`(^|\\s)${t}=(?:"[^"]*"|\\S*)`);return s.test(e)?e.replace(s,(i,o)=>`${o}${n}`):`${e.trimEnd()} ${n}`}function XS(e,t){let r=new RegExp(`(^|\\s)${t}=(?:"[^"]*"|\\S*)`);return e.replace(r,"").replace(/\s+/gu," ").trimEnd()}function yf(e){return/[\s"]/u.test(e)?`"${e.replace(/"/g,'\\"')}"`:e}function lB(e,t){let r=e.split(`
2339
+ `))if(/^\s*#?\s*_MEMBER_\s+\S/u.test(r)&&Fs(r,"alias")===t)return!0;return!1}function oB(e){return/^[A-Za-z][A-Za-z0-9_-]*$/u.test(e)}function Fs(e,t){let n=new RegExp(`(?:^|\\s)${t}=(?:"([^"]*)"|(\\S*))`).exec(e);return n===null?void 0:n[1]??n[2]??""}function aB(e,t,r){let n=`${t}=${gf(r)}`,s=new RegExp(`(^|\\s)${t}=(?:"[^"]*"|\\S*)`);return s.test(e)?e.replace(s,(i,o)=>`${o}${n}`):`${e.trimEnd()} ${n}`}function XS(e,t){let r=new RegExp(`(^|\\s)${t}=(?:"[^"]*"|\\S*)`);return e.replace(r,"").replace(/\s+/gu," ").trimEnd()}function gf(e){return/[\s"]/u.test(e)?`"${e.replace(/"/g,'\\"')}"`:e}function lB(e,t){let r=e.split(`
2340
2340
  `),n=-1;for(let a=r.length-1;a>=0;a-=1)if(/^\s*_MEMBER_(?:\s|$)/u.test(r[a])){n=a;break}if(n>=0)return r.splice(n+1,0,t),r.join(`
2341
2341
  `);let s=r.length;for(;s>0&&r[s-1]==="";)s-=1;let i=r.slice(0,s).join(`
2342
2342
  `),o=r.slice(s).join(`
@@ -2350,10 +2350,10 @@ ${i}`:`${r}
2350
2350
  `:e.length>0?`${r}
2351
2351
  ${e}`:`${r}
2352
2352
  `}function GS(e){return e==="claude"||e==="codex"||e==="gemini"||e==="copilot"||e==="opencode"||e==="lmplayer"||e==="qwen"||e==="agy"||e==="ClaudeMock"}function Oe(e,t){return e.stderr.write(`error: ${t}
2353
- `),1}function _f(e,t,r){return e.stderr.write(`error: ${t}
2354
- ${r}`),2}function wf(e,t){for(let r of e)r.teamfile!==void 0&&t.stderr.write(`warning: member "${r.alias}" uses deprecated member-level teamfile=; cross-team calls now work at runtime without _CONNECT_
2353
+ `),1}function pf(e,t,r){return e.stderr.write(`error: ${t}
2354
+ ${r}`),2}function yf(e,t){for(let r of e)r.teamfile!==void 0&&t.stderr.write(`warning: member "${r.alias}" uses deprecated member-level teamfile=; cross-team calls now work at runtime without _CONNECT_
2355
2355
  `),r.provider==="gemini"&&t.stderr.write(`${FS.replace("%s",r.alias)}
2356
- `)}var Ps,BW,qW,Pa,pf,FS,gf,US,Hr,Ws=T(()=>{"use strict";zt();MS();mi();it();Re();Rt();Lt();Rt();mf();Os();Ps=5,BW=`usage: lmctl lint <teamfile.lmctl>
2356
+ `)}var Ps,BW,qW,Pa,mf,FS,hf,US,Hr,Ws=T(()=>{"use strict";zt();MS();mi();it();Re();Rt();Lt();Rt();ff();Os();Ps=5,BW=`usage: lmctl lint <teamfile.lmctl>
2357
2357
 
2358
2358
  Validate an lmctl teamfile and warn about stale or placeholder session ids.
2359
2359
  `,qW=`usage: lmctl seed <teamfile.lmctl>
@@ -2364,7 +2364,7 @@ member's configured native provider.
2364
2364
 
2365
2365
  Append an unseeded non-Lead _MEMBER_ line to an lmctl teamfile. Run lmctl seed
2366
2366
  after editing to create the provider session.
2367
- `,pf=`usage: lmctl refresh <teamfile.lmctl> <alias>
2367
+ `,mf=`usage: lmctl refresh <teamfile.lmctl> <alias>
2368
2368
  lmctl refresh <teamfile.lmctl>:<alias>
2369
2369
 
2370
2370
  Replace a member's provider session (including the Lead) by clearing its
@@ -2373,14 +2373,14 @@ Refreshing the Lead drops its chat history; it re-reads durable-memory/ on
2373
2373
  re-seed.
2374
2374
  A member cannot refresh its own running session; run the refresh from a
2375
2375
  meta-Lead or operator shell outside that sessiondir.
2376
- `,FS='notice: member "%s" uses provider=gemini \u2014 the Gemini CLI requires an API/enterprise Google account; personal Google subscriptions should use provider=agy (Antigravity).',gf={existsSync:UW,statSync:WW,accessSync:FW},US=async e=>{let{seed:t}=await Promise.resolve().then(()=>(vt(),dc)),r=await t(e);return r.success?{sessionId:r.sessionId}:{error:r.error??"provider seed failed"}},Hr=gf});var ZS={};ye(ZS,{runClone:()=>gB});import{existsSync as Ef,mkdirSync as dB,readFileSync as uB,readdirSync as fB,statSync as YS,writeFileSync as mB}from"node:fs";import{basename as VS,dirname as pB,extname as _B,join as zS,resolve as KS}from"node:path";async function gB(e,t={stdout:process.stdout,stderr:process.stderr}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(hB),0;if(e.length!==2)return t.stderr.write(`usage: lmctl clone <source> <dest>
2377
- `),2;let[r,n]=e,s,i=r;try{if(/^https?:\/\//i.test(r)){let c=await fetch(r);if(!c.ok)throw new Error(`HTTP ${c.status}`);s=await c.text()}else{let c=KS(r);if(!Ef(c))throw new Error(`source not found: ${r}`);let u=YS(c).isDirectory()?yB(c):c;s=uB(u,"utf8"),i=u}}catch(c){return t.stderr.write(`error: ${c instanceof Error?c.message:String(c)}
2378
- `),1}let o=KS(n),a=wB(o,i,n);if(Ef(a))return t.stderr.write(`error: ${a} already exists.
2376
+ `,FS='notice: member "%s" uses provider=gemini \u2014 the Gemini CLI requires an API/enterprise Google account; personal Google subscriptions should use provider=agy (Antigravity).',hf={existsSync:UW,statSync:WW,accessSync:FW},US=async e=>{let{seed:t}=await Promise.resolve().then(()=>(vt(),cc)),r=await t(e);return r.success?{sessionId:r.sessionId}:{error:r.error??"provider seed failed"}},Hr=hf});var ZS={};ye(ZS,{runClone:()=>gB});import{existsSync as wf,mkdirSync as dB,readFileSync as uB,readdirSync as fB,statSync as YS,writeFileSync as mB}from"node:fs";import{basename as VS,dirname as pB,extname as _B,join as zS,resolve as KS}from"node:path";async function gB(e,t={stdout:process.stdout,stderr:process.stderr}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(hB),0;if(e.length!==2)return t.stderr.write(`usage: lmctl clone <source> <dest>
2377
+ `),2;let[r,n]=e,s,i=r;try{if(/^https?:\/\//i.test(r)){let c=await fetch(r);if(!c.ok)throw new Error(`HTTP ${c.status}`);s=await c.text()}else{let c=KS(r);if(!wf(c))throw new Error(`source not found: ${r}`);let u=YS(c).isDirectory()?yB(c):c;s=uB(u,"utf8"),i=u}}catch(c){return t.stderr.write(`error: ${c instanceof Error?c.message:String(c)}
2378
+ `),1}let o=KS(n),a=wB(o,i,n);if(wf(a))return t.stderr.write(`error: ${a} already exists.
2379
2379
  `),1;let l=TB(EB(s));return dB(pB(a),{recursive:!0}),mB(a,l,"utf8"),t.stdout.write(`Cloned ${r} -> ${a}
2380
2380
  `),t.stdout.write(`Edit ${a}; only _MEMBER_ lines are parsed, everything else is free-form.
2381
2381
  `),t.stdout.write(`After editing, run: lmctl lint ${a}
2382
2382
  `),t.stdout.write(`Then run: lmctl seed ${a}
2383
- `),0}function yB(e){let t=fB(e).filter(r=>r.endsWith(".lmctl"));if(t.length===0)throw new Error(`no .lmctl files in source directory: ${e}`);if(t.length>1)throw new Error(`multiple .lmctl files in source directory: ${e}; specify the source file explicitly`);return zS(e,t[0])}function wB(e,t,r){if(r.endsWith("/")||Ef(e)&&YS(e).isDirectory()){let n=VS(t).endsWith(".lmctl")?VS(t):"team.lmctl";return zS(e,n)}return _B(e)?e:`${e}.lmctl`}function EB(e){return e.split(`
2383
+ `),0}function yB(e){let t=fB(e).filter(r=>r.endsWith(".lmctl"));if(t.length===0)throw new Error(`no .lmctl files in source directory: ${e}`);if(t.length>1)throw new Error(`multiple .lmctl files in source directory: ${e}; specify the source file explicitly`);return zS(e,t[0])}function wB(e,t,r){if(r.endsWith("/")||wf(e)&&YS(e).isDirectory()){let n=VS(t).endsWith(".lmctl")?VS(t):"team.lmctl";return zS(e,n)}return _B(e)?e:`${e}.lmctl`}function EB(e){return e.split(`
2384
2384
  `).map(t=>/^\s*_MEMBER_\s+\S/.test(t)?t.replace(/\s+sessionid=(?:"[^"]*"|\S+)/g,"").replace(/^(\s*_MEMBER_)\s+sessionid=(?:"[^"]*"|\S+)\s+/g,"$1 "):t).join(`
2385
2385
  `)}function TB(e){return e.split(`
2386
2386
  `).map(t=>/^\s*_MEMBER_\s+\S/.test(t)?t.replace(/\s+sessiondir=(?:"[^"]*"|\S+)/g,"").replace(/^(\s*_MEMBER_)\s+sessiondir=(?:"[^"]*"|\S+)\s+/g,"$1 "):t).join(`
@@ -2410,7 +2410,7 @@ _MEMBER_ alias=Coder provider=codex
2410
2410
  _MEMBER_ alias=Reviewer1 provider=codex
2411
2411
  _MEMBER_ alias=Reviewer2 provider=${r}
2412
2412
  _MEMBER_ alias=Reviewer3 provider=agy
2413
- `}var NB,nv=T(()=>{"use strict";Re();mf();NB=`usage: lmctl plan [options] <directory>
2413
+ `}var NB,nv=T(()=>{"use strict";Re();ff();NB=`usage: lmctl plan [options] <directory>
2414
2414
 
2415
2415
  Generate a starter lmctl team document template for a directory.
2416
2416
 
@@ -2425,7 +2425,7 @@ Examples:
2425
2425
 
2426
2426
  # Same shape, codex for the Lead and Reviewer2
2427
2427
  lmctl plan ./backend --provider codex
2428
- `});import{execFileSync as OB}from"node:child_process";import{resolve as sv}from"node:path";function $B(e){return e.filter(t=>t.state!=="retired")}function iv(e,t,r){if(r!==void 0){let a=t.findProjectByName(r);return a===null?v(e,`project not found: ${r}`):a}let n=e.cwd??process.cwd(),s;try{s=OB("git",["rev-parse","--show-toplevel"],{cwd:n,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return v(e,"terminal cannot infer a member from cwd because this directory is not in a git repo; use `lmctl terminal <teamfile> <alias>`")}let i=sv(s),o=t.listProjects().find(a=>sv(a.local_path)===i);return o===void 0?v(e,`terminal cannot infer a member from cwd ${i}; use \`lmctl terminal <teamfile> <alias>\``):o}function ov(e,t,r,n){if(n!==void 0){let i=t.findTeamByName(n);return i===null?v(e,`team not found: ${n}`):i}let s=t.getTeam(r.team_id);return s===null?v(e,`project ${r.name} has no assigned team; use --team <name>`):s}function av(e,t,r,n){if(n!==void 0){let i=t.findTeamMemberByAlias(r.id,n);return i===null||i.state==="retired"?v(e,`member not found: ${n}`):i}let s=$B(t.listTeamMembers(r.id)).find(i=>i.role==="agent");return s===void 0?v(e,`team ${r.name} has no active agent member`):s}var lv=T(()=>{"use strict";Re()});var uv={};ye(uv,{SIZE_WARN_EST_TOKENS:()=>Bs,estimateTokens:()=>dv,runTerminal:()=>DB});import{spawn as CB}from"node:child_process";import{statSync as MB}from"node:fs";async function DB(e,t){if(e.includes("--help")||e.includes("-h"))return HB(t);let r=Z(e,["--project","--team","--alias","--run"],["--size","--json","--help"]);if(r.error!==void 0)return v(t,r.error);let n=P(r,"--run");if(n!==void 0){let s=Number.parseInt(n,10);if(!Number.isFinite(s)||s<=0||String(s)!==n)return v(t,`invalid --run "${n}" (expected a positive integer run id)`);if(r.positionals.length>0)return v(t,"--run is mutually exclusive with positional <teamfile>[:alias]");let i=["--team","--project","--size","--json"];for(let o of i)if(o==="--size"||o==="--json"?G(r,o):P(r,o)!==void 0)return v(t,`--run is mutually exclusive with ${o}`);try{return await $(t,async o=>{let a=P(r,"--alias"),l=pw(o,s,a);return"err"in l?v(t,l.err):Tf(t,{provider:l.ok.provider,sessionid:l.ok.sessionid,sessiondir:l.ok.sessiondir})})}catch(o){return Me(t,o)}}if(r.positionals.length>0){let s=["--team","--project","--size","--alias","--json"];for(let l of s)if(l==="--size"||l==="--json"?G(r,l):P(r,l)!==void 0)return v(t,`positional <teamfile>[:alias] is mutually exclusive with ${l} (alias is the SECOND POSITIONAL: \`terminal <teamfile> <alias>\`).`);if(r.positionals.length>2)return v(t,`too many positionals (${r.positionals.length}); expected <teamfile>[:alias] [alias]`);let i=r.positionals[0],o=r.positionals[1],a=yr(jB,{target:i,alias:o,flags:{}});return a.mode==="error"?v(t,a.message):a.mode!=="ai-team"?v(t,`internal: terminal positional yielded unexpected mode "${a.mode}"`):a.alias===void 0?v(t,"terminal: alias required for the teamfile target"):await $(t,l=>PB(t,a.teamfile,a.alias,l))}try{return await $(t,async s=>{let i=WB(t,s,r);if(typeof i=="number")return i;let o=P(r,"--alias");return G(r,"--size")?qB(t,s,i,o,G(r,"--json")):BB(t,s,i,o)})}catch(s){return Me(t,s)}}async function PB(e,t,r,n){let s;try{s=qe(t,r,n)}catch(d){return d instanceof ge?v(e,d.message):Me(e,d)}let i=hr(n,{receiver_teamfile:s.teamfile,receiver_alias:s.alias,sender_teamfile:s.teamfile,sender_alias:"terminal",ttlMs:gr()});if(!i.acquired)return v(e,`${s.alias} is busy/held by ${i.current.sender_alias} (${i.current.sender_teamfile}) since ${i.current.started_at}`);let o=ub({teamfile:s.teamfile,alias:s.alias}),a=null,l=null,c=null;try{n.setTerminalLock(o),l=FB(n,s),a=setInterval(()=>{try{!n.heartbeatTerminalLock(o.teamfile,o.alias,o.lock_id,new Date().toISOString())&&a!==null&&(clearInterval(a),a=null)}catch{}},fb()),a.unref?.();try{In(e,je(s.teamfile),s.teamfile)}catch{}return c=await Tf(e,{provider:s.provider,sessionid:s.sessionid,sessiondir:s.sessiondir,isLead:s.isLead}),c}finally{a!==null&&clearInterval(a),n.clearTerminalLock(o.teamfile,o.alias,o.lock_id),n.releaseAgentInflight(i.lease),UB(n,l,c)}}function FB(e,t){try{return e.startTrackedInvocation({kind:"exec",origin:"operator",scope_teamfile:t.teamfile,from_identity:`${t.teamfile}:terminal`,target_teamfile:t.teamfile,target_alias:t.alias,root_teamfile:t.teamfile,cwd:t.sessiondir,command:`lmctl terminal ${t.teamfile} ${t.alias}`,holder_pid:process.pid,launch_source:"terminal",meta:JSON.stringify({provider:t.provider,sessionid:t.sessionid})}).id}catch{return null}}function UB(e,t,r){if(t!==null)try{e.finishTrackedInvocation(t,{status:r===0?"done":"error",exit_code:r,result_summary:r===0?"terminal session ended":null,error:r===0?null:`terminal exited with code ${r??"unknown"}`})}catch{}}async function Tf(e,t){let{provider:r,sessionid:n,sessiondir:s}=t;if(!Ia(r))return v(e,`no resume incantation for provider "${r}"`);if(!Ab.test(n))return v(e,"refusing to resume: malformed sessionid");let i=Wu(r,n,{isLead:t.isLead});if(i===null||i.length===0)return v(e,`no resume incantation for provider "${r}"`);let[o,...a]=i;return await new Promise(l=>{let c=CB(o,a,{stdio:"inherit",cwd:s,env:We(process.env,s,n,"terminal")});c.on("error",d=>{l(v(e,`failed to launch ${o}: ${d.message}`))}),c.on("exit",d=>l(d??0))})}function WB(e,t,r){let n=P(r,"--team");if(n!==void 0){let o=t.findTeamByName(n);return o===null?v(e,`team not found: ${n}`):o}let s=iv(e,t,P(r,"--project"));return typeof s=="number"?s:ov(e,t,s,void 0)}async function BB(e,t,r,n){let s=av(e,t,r,n);if(typeof s=="number")return s;let i=s.sessionid;return i===null||i.trim().length===0?v(e,`member ${s.alias} has no session yet \u2014 run \`lmctl team seed ${r.name}\` first`):Tf(e,{provider:Fe(s),sessionid:i,sessiondir:s.sessiondir})}function dv(e){if(e&&Array.isArray(e.messages)&&e.messages.length>0){let r=e.messages.reduce((n,s)=>n+(s.content?.length??0),0);return{chars:r,est:Math.ceil(r/4),messages:e.messages.length,bytes:null}}let t=e?.filePath;if(t!==void 0)try{let r=MB(t).size;return{chars:r,est:Math.ceil(r/4),messages:e?.messages?.length??null,bytes:r}}catch{}return{chars:0,est:0,messages:null,bytes:null}}async function qB(e,t,r,n,s){let i;if(n!==void 0){let a=t.findTeamMemberByAlias(r.id,n);if(a===null||a.state==="retired")return v(e,`member not found: ${n}`);i=[a]}else i=t.listTeamMembers(r.id).filter(a=>a.state!=="retired"&&a.sessionid!==null);let o=[];for(let a of i){let l=a.sessionid;if(l===null)continue;let c=Fe(a),d=null;Ia(c)&&(d=await Qt(l,c));let u=dv(d),f=u.est>Bs;o.push({alias:a.alias,provider:c,sessionid:l,messages:u.messages,bytes:u.bytes,est_tokens:u.est,estimate:!0,over_guide:f,resume_incantation:f?Na(c,l):null})}if(s)return ae(e,{estimate:!0,legend:cv,guide_tokens:Bs,members:o}),0;e.stdout.write(`session size \u2014 ESTIMATE only (nothing is changed automatically)
2428
+ `});import{execFileSync as OB}from"node:child_process";import{resolve as sv}from"node:path";function $B(e){return e.filter(t=>t.state!=="retired")}function iv(e,t,r){if(r!==void 0){let a=t.findProjectByName(r);return a===null?v(e,`project not found: ${r}`):a}let n=e.cwd??process.cwd(),s;try{s=OB("git",["rev-parse","--show-toplevel"],{cwd:n,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return v(e,"terminal cannot infer a member from cwd because this directory is not in a git repo; use `lmctl terminal <teamfile> <alias>`")}let i=sv(s),o=t.listProjects().find(a=>sv(a.local_path)===i);return o===void 0?v(e,`terminal cannot infer a member from cwd ${i}; use \`lmctl terminal <teamfile> <alias>\``):o}function ov(e,t,r,n){if(n!==void 0){let i=t.findTeamByName(n);return i===null?v(e,`team not found: ${n}`):i}let s=t.getTeam(r.team_id);return s===null?v(e,`project ${r.name} has no assigned team; use --team <name>`):s}function av(e,t,r,n){if(n!==void 0){let i=t.findTeamMemberByAlias(r.id,n);return i===null||i.state==="retired"?v(e,`member not found: ${n}`):i}let s=$B(t.listTeamMembers(r.id)).find(i=>i.role==="agent");return s===void 0?v(e,`team ${r.name} has no active agent member`):s}var lv=T(()=>{"use strict";Re()});var uv={};ye(uv,{SIZE_WARN_EST_TOKENS:()=>Bs,estimateTokens:()=>dv,runTerminal:()=>DB});import{spawn as CB}from"node:child_process";import{statSync as MB}from"node:fs";async function DB(e,t){if(e.includes("--help")||e.includes("-h"))return HB(t);let r=Z(e,["--project","--team","--alias","--run"],["--size","--json","--help"]);if(r.error!==void 0)return v(t,r.error);let n=P(r,"--run");if(n!==void 0){let s=Number.parseInt(n,10);if(!Number.isFinite(s)||s<=0||String(s)!==n)return v(t,`invalid --run "${n}" (expected a positive integer run id)`);if(r.positionals.length>0)return v(t,"--run is mutually exclusive with positional <teamfile>[:alias]");let i=["--team","--project","--size","--json"];for(let o of i)if(o==="--size"||o==="--json"?G(r,o):P(r,o)!==void 0)return v(t,`--run is mutually exclusive with ${o}`);try{return await $(t,async o=>{let a=P(r,"--alias"),l=pw(o,s,a);return"err"in l?v(t,l.err):Ef(t,{provider:l.ok.provider,sessionid:l.ok.sessionid,sessiondir:l.ok.sessiondir})})}catch(o){return Me(t,o)}}if(r.positionals.length>0){let s=["--team","--project","--size","--alias","--json"];for(let l of s)if(l==="--size"||l==="--json"?G(r,l):P(r,l)!==void 0)return v(t,`positional <teamfile>[:alias] is mutually exclusive with ${l} (alias is the SECOND POSITIONAL: \`terminal <teamfile> <alias>\`).`);if(r.positionals.length>2)return v(t,`too many positionals (${r.positionals.length}); expected <teamfile>[:alias] [alias]`);let i=r.positionals[0],o=r.positionals[1],a=yr(jB,{target:i,alias:o,flags:{}});return a.mode==="error"?v(t,a.message):a.mode!=="ai-team"?v(t,`internal: terminal positional yielded unexpected mode "${a.mode}"`):a.alias===void 0?v(t,"terminal: alias required for the teamfile target"):await $(t,l=>PB(t,a.teamfile,a.alias,l))}try{return await $(t,async s=>{let i=WB(t,s,r);if(typeof i=="number")return i;let o=P(r,"--alias");return G(r,"--size")?qB(t,s,i,o,G(r,"--json")):BB(t,s,i,o)})}catch(s){return Me(t,s)}}async function PB(e,t,r,n){let s;try{s=qe(t,r,n)}catch(d){return d instanceof ge?v(e,d.message):Me(e,d)}let i=hr(n,{receiver_teamfile:s.teamfile,receiver_alias:s.alias,sender_teamfile:s.teamfile,sender_alias:"terminal",ttlMs:gr()});if(!i.acquired)return v(e,`${s.alias} is busy/held by ${i.current.sender_alias} (${i.current.sender_teamfile}) since ${i.current.started_at}`);let o=ub({teamfile:s.teamfile,alias:s.alias}),a=null,l=null,c=null;try{n.setTerminalLock(o),l=FB(n,s),a=setInterval(()=>{try{!n.heartbeatTerminalLock(o.teamfile,o.alias,o.lock_id,new Date().toISOString())&&a!==null&&(clearInterval(a),a=null)}catch{}},fb()),a.unref?.();try{In(e,je(s.teamfile),s.teamfile)}catch{}return c=await Ef(e,{provider:s.provider,sessionid:s.sessionid,sessiondir:s.sessiondir,isLead:s.isLead}),c}finally{a!==null&&clearInterval(a),n.clearTerminalLock(o.teamfile,o.alias,o.lock_id),n.releaseAgentInflight(i.lease),UB(n,l,c)}}function FB(e,t){try{return e.startTrackedInvocation({kind:"exec",origin:"operator",scope_teamfile:t.teamfile,from_identity:`${t.teamfile}:terminal`,target_teamfile:t.teamfile,target_alias:t.alias,root_teamfile:t.teamfile,cwd:t.sessiondir,command:`lmctl terminal ${t.teamfile} ${t.alias}`,holder_pid:process.pid,launch_source:"terminal",meta:JSON.stringify({provider:t.provider,sessionid:t.sessionid})}).id}catch{return null}}function UB(e,t,r){if(t!==null)try{e.finishTrackedInvocation(t,{status:r===0?"done":"error",exit_code:r,result_summary:r===0?"terminal session ended":null,error:r===0?null:`terminal exited with code ${r??"unknown"}`})}catch{}}async function Ef(e,t){let{provider:r,sessionid:n,sessiondir:s}=t;if(!Ia(r))return v(e,`no resume incantation for provider "${r}"`);if(!Ab.test(n))return v(e,"refusing to resume: malformed sessionid");let i=Uu(r,n,{isLead:t.isLead});if(i===null||i.length===0)return v(e,`no resume incantation for provider "${r}"`);let[o,...a]=i;return await new Promise(l=>{let c=CB(o,a,{stdio:"inherit",cwd:s,env:We(process.env,s,n,"terminal")});c.on("error",d=>{l(v(e,`failed to launch ${o}: ${d.message}`))}),c.on("exit",d=>l(d??0))})}function WB(e,t,r){let n=P(r,"--team");if(n!==void 0){let o=t.findTeamByName(n);return o===null?v(e,`team not found: ${n}`):o}let s=iv(e,t,P(r,"--project"));return typeof s=="number"?s:ov(e,t,s,void 0)}async function BB(e,t,r,n){let s=av(e,t,r,n);if(typeof s=="number")return s;let i=s.sessionid;return i===null||i.trim().length===0?v(e,`member ${s.alias} has no session yet \u2014 run \`lmctl team seed ${r.name}\` first`):Ef(e,{provider:Fe(s),sessionid:i,sessiondir:s.sessiondir})}function dv(e){if(e&&Array.isArray(e.messages)&&e.messages.length>0){let r=e.messages.reduce((n,s)=>n+(s.content?.length??0),0);return{chars:r,est:Math.ceil(r/4),messages:e.messages.length,bytes:null}}let t=e?.filePath;if(t!==void 0)try{let r=MB(t).size;return{chars:r,est:Math.ceil(r/4),messages:e?.messages?.length??null,bytes:r}}catch{}return{chars:0,est:0,messages:null,bytes:null}}async function qB(e,t,r,n,s){let i;if(n!==void 0){let a=t.findTeamMemberByAlias(r.id,n);if(a===null||a.state==="retired")return v(e,`member not found: ${n}`);i=[a]}else i=t.listTeamMembers(r.id).filter(a=>a.state!=="retired"&&a.sessionid!==null);let o=[];for(let a of i){let l=a.sessionid;if(l===null)continue;let c=Fe(a),d=null;Ia(c)&&(d=await Qt(l,c));let u=dv(d),f=u.est>Bs;o.push({alias:a.alias,provider:c,sessionid:l,messages:u.messages,bytes:u.bytes,est_tokens:u.est,estimate:!0,over_guide:f,resume_incantation:f?Na(c,l):null})}if(s)return ae(e,{estimate:!0,legend:cv,guide_tokens:Bs,members:o}),0;e.stdout.write(`session size \u2014 ESTIMATE only (nothing is changed automatically)
2429
2429
  `),e.stdout.write(`${cv}
2430
2430
  `);for(let a of o){let l=a.messages===null?"?":String(a.messages),c=a.bytes===null?"?":String(a.bytes);e.stdout.write(`${a.alias} ${a.provider} msgs=${l} bytes=${c} ~${a.est_tokens} tok (rough estimate)
2431
2431
  `),a.over_guide&&e.stdout.write(` \u26A0 ${a.alias}: estimated ~${a.est_tokens} tokens \u2014 ESTIMATE only, exceeds the 200K guide.
@@ -2464,33 +2464,33 @@ Examples:
2464
2464
  tokens it surfaces the resume incantation so YOU can
2465
2465
  open & self-compact. Nothing is ever changed
2466
2466
  automatically; ${Bs} is a guide, not a gate.
2467
- `),0}var jB,Bs,cv,fv=T(()=>{"use strict";Ze();An();Re();lv();Lt();zt();it();Os();Fr();ea();Lu();Xo();jB={name:"terminal",allowsBareTeamfile:!1,supportsRaw:!1},Bs=2e5,cv="est = rough local heuristic (~4 chars/token), NOT an exact provider token count \u2014 open the session to verify before acting."});function bf(e,t){let r=JB[e],n=t("which",[e]);return n.status===0&&(n.stdout??"").toString().trim()!==""?t(e,["--version"]).status===0?{provider:e,status:"ok",detail:"installed, --version OK"}:{provider:e,status:"unverified",detail:"installed, session unverified (auth may be required)"}:r.optional?{provider:e,status:"skipped",detail:"not installed"}:{provider:e,status:"missing",detail:`not installed (install: ${r.install_hint})`,remediation:r.install_remediation}}var JB,mv=T(()=>{"use strict";JB={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 Ev={};ye(Ev,{initWorkspace:()=>yv,runWorkspace:()=>ZB,setWorkspaceProvider:()=>wv});import{copyFileSync as XB,cpSync as GB,existsSync as Pe,mkdirSync as Er,readdirSync as vf,renameSync as VB,rmSync as Wa,statSync as Ba,writeFileSync as KB}from"node:fs";import{spawnSync as YB}from"node:child_process";import{homedir as pv}from"node:os";import{dirname as kf,join as qs}from"node:path";async function ZB(e,t){let[r,...n]=e;if(r==="--help"||r==="-h"||r==="help")return t.stdout.write(zB),0;switch(r){case"list":return QB(n,t);case"create":return eq(n,t);case"use":return tq(n,t);case"show":return rq(n,t);case"delete":return nq(n,t);case"migrate":return sq(n,t);case"init":return yv(n,t);case"set-provider":return wv(n,t);default:return v(t,"usage: lmctl workspace <list|create|use|show|delete|migrate|init|set-provider>")}}function hv(){let e=Gs(),t=[],r=new Set,n=Sr.default,s=Pe(Js()),i=Pe(jt(n));if((s||i||e===null||e===n)&&(t.push({name:n,db_path:i?Tr(n):Js(),active:e===null||e===n,legacy:!i&&s}),r.add(n)),Pe(Xr())){let o;try{o=vf(Xr())}catch{o=[]}for(let a of o.sort()){if(r.has(a)||!ze(a))continue;let l=!1;try{l=Ba(jt(a)).isDirectory()}catch{l=!1}l&&(t.push({name:a,db_path:Tr(a),active:e===a,legacy:!1}),r.add(a))}}return t}function QB(e,t){let r=Z(e,[]);if(r.error!==void 0)return v(t,r.error);if(r.positionals.length!==0)return v(t,"usage: lmctl workspace list");let n=hv();if(G(r,"--json"))return ae(t,n),0;for(let s of n){let i=s.active?"*":" ",o=s.legacy?" (legacy)":"";t.stdout.write(`${i} ${s.name} ${s.db_path}${o}
2468
- `)}return 0}function eq(e,t){let r=Z(e,["--docroot"]);if(r.error!==void 0)return v(t,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return v(t,"usage: lmctl workspace create <name> [--docroot PATH]");if(!ze(n))return v(t,`invalid workspace name: ${n} (allowed: letters, digits, '.', '-', '_'; must start with alnum; \u226464 chars)`);let s=jt(n);if(Pe(s))return v(t,`workspace already exists: ${n} (${s})`);let i=P(r,"--docroot")??Ga(n);Er(s,{recursive:!0}),Er(i,{recursive:!0});let o=Tr(n);Er(kf(o),{recursive:!0});let a=Ie({path:o});try{a.setConfig("project.docroot",i)}finally{a.close()}let l={name:n,dir:s,db_path:o,docroot:i};return G(r,"--json")?ae(t,l):t.stdout.write(`created workspace ${n} at ${s}
2469
- `),0}function tq(e,t){let r=Z(e,[]);if(r.error!==void 0)return v(t,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return v(t,"usage: lmctl workspace use <name>");if(!ze(n))return v(t,`invalid workspace name: ${n}`);if(n!==Sr.default&&!Pe(jt(n)))return v(t,`workspace not found: ${n} (run \`lmctl workspace create ${n}\` first)`);let s=Xs();return Er(kf(s),{recursive:!0}),KB(s,`${n}
2467
+ `),0}var jB,Bs,cv,fv=T(()=>{"use strict";Ze();An();Re();lv();Lt();zt();it();Os();Fr();ea();Ru();Xo();jB={name:"terminal",allowsBareTeamfile:!1,supportsRaw:!1},Bs=2e5,cv="est = rough local heuristic (~4 chars/token), NOT an exact provider token count \u2014 open the session to verify before acting."});function Tf(e,t){let r=JB[e],n=t("which",[e]);return n.status===0&&(n.stdout??"").toString().trim()!==""?t(e,["--version"]).status===0?{provider:e,status:"ok",detail:"installed, --version OK"}:{provider:e,status:"unverified",detail:"installed, session unverified (auth may be required)"}:r.optional?{provider:e,status:"skipped",detail:"not installed"}:{provider:e,status:"missing",detail:`not installed (install: ${r.install_hint})`,remediation:r.install_remediation}}var JB,mv=T(()=>{"use strict";JB={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 Ev={};ye(Ev,{initWorkspace:()=>yv,runWorkspace:()=>ZB,setWorkspaceProvider:()=>wv});import{copyFileSync as XB,cpSync as GB,existsSync as Pe,mkdirSync as Er,readdirSync as Sf,renameSync as VB,rmSync as Wa,statSync as Ba,writeFileSync as KB}from"node:fs";import{spawnSync as YB}from"node:child_process";import{homedir as pv}from"node:os";import{dirname as vf,join as qs}from"node:path";async function ZB(e,t){let[r,...n]=e;if(r==="--help"||r==="-h"||r==="help")return t.stdout.write(zB),0;switch(r){case"list":return QB(n,t);case"create":return eq(n,t);case"use":return tq(n,t);case"show":return rq(n,t);case"delete":return nq(n,t);case"migrate":return sq(n,t);case"init":return yv(n,t);case"set-provider":return wv(n,t);default:return v(t,"usage: lmctl workspace <list|create|use|show|delete|migrate|init|set-provider>")}}function hv(){let e=Gs(),t=[],r=new Set,n=Sr.default,s=Pe(Js()),i=Pe(jt(n));if((s||i||e===null||e===n)&&(t.push({name:n,db_path:i?Tr(n):Js(),active:e===null||e===n,legacy:!i&&s}),r.add(n)),Pe(Xr())){let o;try{o=Sf(Xr())}catch{o=[]}for(let a of o.sort()){if(r.has(a)||!ze(a))continue;let l=!1;try{l=Ba(jt(a)).isDirectory()}catch{l=!1}l&&(t.push({name:a,db_path:Tr(a),active:e===a,legacy:!1}),r.add(a))}}return t}function QB(e,t){let r=Z(e,[]);if(r.error!==void 0)return v(t,r.error);if(r.positionals.length!==0)return v(t,"usage: lmctl workspace list");let n=hv();if(G(r,"--json"))return ae(t,n),0;for(let s of n){let i=s.active?"*":" ",o=s.legacy?" (legacy)":"";t.stdout.write(`${i} ${s.name} ${s.db_path}${o}
2468
+ `)}return 0}function eq(e,t){let r=Z(e,["--docroot"]);if(r.error!==void 0)return v(t,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return v(t,"usage: lmctl workspace create <name> [--docroot PATH]");if(!ze(n))return v(t,`invalid workspace name: ${n} (allowed: letters, digits, '.', '-', '_'; must start with alnum; \u226464 chars)`);let s=jt(n);if(Pe(s))return v(t,`workspace already exists: ${n} (${s})`);let i=P(r,"--docroot")??Xa(n);Er(s,{recursive:!0}),Er(i,{recursive:!0});let o=Tr(n);Er(vf(o),{recursive:!0});let a=Ie({path:o});try{a.setConfig("project.docroot",i)}finally{a.close()}let l={name:n,dir:s,db_path:o,docroot:i};return G(r,"--json")?ae(t,l):t.stdout.write(`created workspace ${n} at ${s}
2469
+ `),0}function tq(e,t){let r=Z(e,[]);if(r.error!==void 0)return v(t,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return v(t,"usage: lmctl workspace use <name>");if(!ze(n))return v(t,`invalid workspace name: ${n}`);if(n!==Sr.default&&!Pe(jt(n)))return v(t,`workspace not found: ${n} (run \`lmctl workspace create ${n}\` first)`);let s=Xs();return Er(vf(s),{recursive:!0}),KB(s,`${n}
2470
2470
  `),G(r,"--json")?ae(t,{active:n,path:s}):t.stdout.write(`active workspace set to ${n}
2471
2471
  `),0}function rq(e,t){let r=Z(e,[]);if(r.error!==void 0)return v(t,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return v(t,"usage: lmctl workspace show <name>");if(!ze(n))return v(t,`invalid workspace name: ${n}`);let s=hv().find(d=>d.name===n);if(s===void 0)return v(t,`workspace not found: ${n}`);let i=0;try{i=Pe(s.db_path)?Ba(s.db_path).size:0}catch{i=0}let o=0,a=null,l={};if(Pe(s.db_path)){let d=Ie({path:s.db_path});try{o=d.listProjects().length,l=d.getConfigAll(),a=l["project.docroot"]??null}finally{d.close()}}let c={name:s.name,active:s.active,legacy:s.legacy,db_path:s.db_path,db_size_bytes:i,docroot:a,project_count:o,config_keys:Object.keys(l).sort()};return G(r,"--json")?ae(t,c):t.stdout.write(`${JSON.stringify(c,null,2)}
2472
2472
  `),0}function nq(e,t){let r=Z(e,[],["--json","--confirm","--force"]);if(r.error!==void 0)return v(t,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return v(t,"usage: lmctl workspace delete <name> --confirm [--force]");if(!ze(n))return v(t,`invalid workspace name: ${n}`);if(!G(r,"--confirm"))return v(t,`refusing to delete workspace ${n} without --confirm`);if(n===Sr.default&&!G(r,"--force"))return v(t,"refusing to delete the default workspace without --force");if(Gs()===n&&!G(r,"--force"))return v(t,`refusing to delete the active workspace (${n}) without --force`);let i=jt(n);return Pe(i)?(Wa(i,{recursive:!0,force:!0}),G(r,"--json")?ae(t,{deleted:n,dir:i}):t.stdout.write(`deleted workspace ${n}
2473
- `),0):v(t,`workspace not found: ${n}`)}function Sf(e,t,r){try{VB(e,t);return}catch(s){if(s.code!=="EXDEV")throw s}if(r.stderr.write(`note: cross-device move; copying ${e} -> ${t} then removing source
2474
- `),Ba(e).isDirectory()?GB(e,t,{recursive:!0}):XB(e,t),!Pe(t))throw new Error(`migration copy verification failed: ${t} not present after copy`);Wa(e,{recursive:!0,force:!0})}function sq(e,t){let r=Z(e,[],["--json"]);if(r.error!==void 0)return v(t,r.error);let n=G(r,"--json"),s=Va(),i=Xr(),o=[],a=(f,m)=>{if(n)ae(t,{migrated:f,reason:m??null,actions:o});else{for(let p of o)t.stdout.write(`${p}
2473
+ `),0):v(t,`workspace not found: ${n}`)}function bf(e,t,r){try{VB(e,t);return}catch(s){if(s.code!=="EXDEV")throw s}if(r.stderr.write(`note: cross-device move; copying ${e} -> ${t} then removing source
2474
+ `),Ba(e).isDirectory()?GB(e,t,{recursive:!0}):XB(e,t),!Pe(t))throw new Error(`migration copy verification failed: ${t} not present after copy`);Wa(e,{recursive:!0,force:!0})}function sq(e,t){let r=Z(e,[],["--json"]);if(r.error!==void 0)return v(t,r.error);let n=G(r,"--json"),s=Ga(),i=Xr(),o=[],a=(f,m)=>{if(n)ae(t,{migrated:f,reason:m??null,actions:o});else{for(let p of o)t.stdout.write(`${p}
2475
2475
  `);t.stdout.write(f?`migration complete
2476
2476
  `:`${m??"nothing to migrate"}
2477
- `)}return 0};if(!Pe(s))return a(!1,"no legacy ~/.lmctl/profiles/ found; nothing to migrate");let l;try{l=vf(s).sort()}catch{l=[]}let c=l.filter(f=>{try{return Ba(qs(s,f)).isDirectory()}catch{return!1}});if(c.length===0)Wa(s,{recursive:!0,force:!0}),o.push(`removed empty ${s}`);else if(!Pe(i))Sf(s,i,t),o.push(`renamed ${s} -> ${i}`);else{let f=c.filter(m=>Pe(qs(i,m)));if(f.length>0)return v(t,`refusing to migrate: ~/.lmctl/workspaces/ already has: ${f.join(", ")} (no files were moved; resolve the name collision, then re-run \`lmctl workspace migrate\`)`);Er(i,{recursive:!0});for(let m of c)Sf(qs(s,m),qs(i,m),t),o.push(`moved ${m} -> workspaces/${m}`);try{vf(s).length===0&&(Wa(s,{recursive:!0,force:!0}),o.push(`removed empty ${s}`))}catch{}}let d=Hf(),u=Xs();return Pe(d)&&(Pe(u)?o.push("left active-profile in place (active-workspace already exists; not clobbering)"):(Sf(d,u,t),o.push("renamed active-profile -> active-workspace"))),a(!0)}function gv(e,t){return YB(e,t,{encoding:"utf8",timeout:5e3,maxBuffer:1024*1024})}function aq(e){return process.stderr.write(e),new Promise(t=>{let r=n=>{let s=(typeof n=="string"?n:n.toString("utf8")).trim();process.stdin.removeListener("data",r);try{process.stdin.pause()}catch{}t(s)};try{process.stdin.resume()}catch{}process.stdin.once("data",r)})}function _v(e){return e==="~"?pv():e.startsWith("~/")?qs(pv(),e.slice(2)):e}async function yv(e,t,r={}){let n="usage: lmctl workspace init [--name N] [--basedir DIR] [--provider1 P] [--provider2 P] [--provider3 P]";if(e.includes("--help")||e.includes("-h"))return t.stdout.write([n,"","Creates ~/.lmctl/workspaces/<name>/ with its own state.db and the","provider1/2/3 -> concrete mapping (lmctl_config workspace.provider{1,2,3}).",`Missing options are asked one at a time. Scanned providers: ${Cn.join(", ")}.`].join(`
2477
+ `)}return 0};if(!Pe(s))return a(!1,"no legacy ~/.lmctl/profiles/ found; nothing to migrate");let l;try{l=Sf(s).sort()}catch{l=[]}let c=l.filter(f=>{try{return Ba(qs(s,f)).isDirectory()}catch{return!1}});if(c.length===0)Wa(s,{recursive:!0,force:!0}),o.push(`removed empty ${s}`);else if(!Pe(i))bf(s,i,t),o.push(`renamed ${s} -> ${i}`);else{let f=c.filter(m=>Pe(qs(i,m)));if(f.length>0)return v(t,`refusing to migrate: ~/.lmctl/workspaces/ already has: ${f.join(", ")} (no files were moved; resolve the name collision, then re-run \`lmctl workspace migrate\`)`);Er(i,{recursive:!0});for(let m of c)bf(qs(s,m),qs(i,m),t),o.push(`moved ${m} -> workspaces/${m}`);try{Sf(s).length===0&&(Wa(s,{recursive:!0,force:!0}),o.push(`removed empty ${s}`))}catch{}}let d=Hf(),u=Xs();return Pe(d)&&(Pe(u)?o.push("left active-profile in place (active-workspace already exists; not clobbering)"):(bf(d,u,t),o.push("renamed active-profile -> active-workspace"))),a(!0)}function gv(e,t){return YB(e,t,{encoding:"utf8",timeout:5e3,maxBuffer:1024*1024})}function aq(e){return process.stderr.write(e),new Promise(t=>{let r=n=>{let s=(typeof n=="string"?n:n.toString("utf8")).trim();process.stdin.removeListener("data",r);try{process.stdin.pause()}catch{}t(s)};try{process.stdin.resume()}catch{}process.stdin.once("data",r)})}function _v(e){return e==="~"?pv():e.startsWith("~/")?qs(pv(),e.slice(2)):e}async function yv(e,t,r={}){let n="usage: lmctl workspace init [--name N] [--basedir DIR] [--provider1 P] [--provider2 P] [--provider3 P]";if(e.includes("--help")||e.includes("-h"))return t.stdout.write([n,"","Creates ~/.lmctl/workspaces/<name>/ with its own state.db and the","provider1/2/3 -> concrete mapping (lmctl_config workspace.provider{1,2,3}).",`Missing options are asked one at a time. Scanned providers: ${Cn.join(", ")}.`].join(`
2478
2478
  `)+`
2479
- `),0;let s=Z(e,["--name","--basedir","--provider1","--provider2","--provider3"]);if(s.error!==void 0)return v(t,s.error);if(s.positionals.length!==0)return v(t,n);let i=r.spawn??gv,a=Cn.map(x=>bf(x,i)).filter(x=>x.status==="ok"||x.status==="unverified").map(x=>x.provider);if(a.length===0)return t.stderr.write(`error: no provider CLI found on PATH; install/auth ${Cn.join("|")} first
2479
+ `),0;let s=Z(e,["--name","--basedir","--provider1","--provider2","--provider3"]);if(s.error!==void 0)return v(t,s.error);if(s.positionals.length!==0)return v(t,n);let i=r.spawn??gv,a=Cn.map(x=>Tf(x,i)).filter(x=>x.status==="ok"||x.status==="unverified").map(x=>x.provider);if(a.length===0)return t.stderr.write(`error: no provider CLI found on PATH; install/auth ${Cn.join("|")} first
2480
2480
  `),2;let l=r.isTty??!!process.stdin.isTTY,c=r.promptLine??aq,d=r.promptLine!==void 0||l,u=x=>(t.stderr.write(`error: ${x} is required in non-interactive mode (no TTY); pass it explicitly
2481
2481
  `),2),f,m=P(s,"--name");if(m!==void 0){if(!ze(m))return t.stderr.write(`error: invalid workspace name: ${m}
2482
2482
  `),2;f=m}else{if(!d)return u("--name");for(;;){let x=(await c("Workspace name [default]: ")).trim(),U=x.length===0?"default":x;if(ze(U)){f=U;break}t.stderr.write(`invalid workspace name: ${U} (letters/digits/.-_, start alnum, \u226464)
2483
2483
  `)}}let p=jt(f);if(Pe(p))return t.stderr.write(`error: workspace already exists: ${f} (${p}) \u2014 refusing to overwrite
2484
- `),2;let _,g=P(s,"--basedir"),h=Ga(f);if(g!==void 0)_=_v(g);else{if(!d)return u("--basedir");let x=(await c(`Base directory for this workspace's projects [${h}]: `)).trim();_=x.length===0?h:_v(x)}let S={};for(let x of["provider1","provider2","provider3"]){let U=P(s,`--${x}`),ue=iq[x],W=a.includes(ue)?ue:a[0];if(U!==void 0){if(!a.includes(U))return t.stderr.write(`error: --${x} ${U} is not an available provider (available: ${a.join(", ")})
2484
+ `),2;let _,g=P(s,"--basedir"),h=Xa(f);if(g!==void 0)_=_v(g);else{if(!d)return u("--basedir");let x=(await c(`Base directory for this workspace's projects [${h}]: `)).trim();_=x.length===0?h:_v(x)}let S={};for(let x of["provider1","provider2","provider3"]){let U=P(s,`--${x}`),ue=iq[x],W=a.includes(ue)?ue:a[0];if(U!==void 0){if(!a.includes(U))return t.stderr.write(`error: --${x} ${U} is not an available provider (available: ${a.join(", ")})
2485
2485
  `),2;S[x]=U;continue}if(!d)return u(`--${x}`);for(;;){let M=(await c(`${x} (${oq[x]}) [${W}]: `)).trim(),A=M.length===0?W:M;if(a.includes(A)){S[x]=A;break}t.stderr.write(`not an available provider: ${A} (available: ${a.join(", ")})
2486
- `)}}Er(p,{recursive:!0}),Er(_,{recursive:!0});let y=Tr(f);Er(kf(y),{recursive:!0});let w=Ie({path:y});try{w.setConfig("project.docroot",_),w.setConfig("workspace.provider1",S.provider1),w.setConfig("workspace.provider2",S.provider2),w.setConfig("workspace.provider3",S.provider3)}finally{w.close()}let I={name:f,dir:p,db_path:y,basedir:_,providers:{...S}};return G(s,"--json")?ae(t,I):(t.stdout.write(`created workspace ${f} at ${p}
2486
+ `)}}Er(p,{recursive:!0}),Er(_,{recursive:!0});let y=Tr(f);Er(vf(y),{recursive:!0});let w=Ie({path:y});try{w.setConfig("project.docroot",_),w.setConfig("workspace.provider1",S.provider1),w.setConfig("workspace.provider2",S.provider2),w.setConfig("workspace.provider3",S.provider3)}finally{w.close()}let I={name:f,dir:p,db_path:y,basedir:_,providers:{...S}};return G(s,"--json")?ae(t,I):(t.stdout.write(`created workspace ${f} at ${p}
2487
2487
  `),t.stdout.write(` basedir: ${_}
2488
2488
  `),t.stdout.write(` provider1=${S.provider1} provider2=${S.provider2} provider3=${S.provider3}
2489
2489
  `),t.stdout.write(`activate it with: lmctl workspace use ${f}
2490
2490
  `)),0}async function wv(e,t,r={}){let n="usage: lmctl [--workspace W] workspace set-provider <provider1|provider2|provider3> <concrete>";if(e.includes("--help")||e.includes("-h"))return t.stdout.write([n,"","Remaps an abstract provider slot for the selected workspace. The next","`team seed` resolves that slot to the new concrete; already-seeded",`members keep their frozen provider_resolved. Scanned providers: ${Cn.join(", ")}.`].join(`
2491
2491
  `)+`
2492
2492
  `),0;let s=Z(e,[]);if(s.error!==void 0)return v(t,s.error);let[i,o,...a]=s.positionals;if(i===void 0||o===void 0||a.length!==0)return v(t,n);let l=/^provider[123]$/.test(i)?i:/^[123]$/.test(i)?`provider${i}`:null;if(l===null)return t.stderr.write(`error: invalid slot: ${i} (expected provider1, provider2, or provider3)
2493
- `),2;let c=r.spawn??gv,d=Cn.map(p=>bf(p,c)).filter(p=>p.status==="ok"||p.status==="unverified").map(p=>p.provider);if(d.length===0)return t.stderr.write(`error: no provider CLI found on PATH; install/auth ${Cn.join("|")} first
2493
+ `),2;let c=r.spawn??gv,d=Cn.map(p=>Tf(p,c)).filter(p=>p.status==="ok"||p.status==="unverified").map(p=>p.provider);if(d.length===0)return t.stderr.write(`error: no provider CLI found on PATH; install/auth ${Cn.join("|")} first
2494
2494
  `),2;if(!d.includes(o))return t.stderr.write(`error: ${o} is not an available provider (available: ${d.join(", ")})
2495
2495
  `),2;let u=t.dal===void 0,f=t.dal??Ie({path:le()});try{f.setConfig(`workspace.${l}`,o)}finally{u&&f.close()}let m=Dt()??Sr.default;return t.stdout.write(`workspace.${l} = ${o} (workspace: ${m})
2496
2496
  `),0}var zB,Cn,iq,oq,Tv=T(()=>{"use strict";Ze();mv();Re();Je();zB=`usage: lmctl workspace list [--json]
@@ -2505,7 +2505,7 @@ Examples:
2505
2505
  Manage isolated workspace state directories, active workspace selection,
2506
2506
  legacy profile migration, and configured provider slots.
2507
2507
  delete requires --confirm; deleting default or active workspaces also requires --force.
2508
- `;Cn=["claude","codex","gemini","qwen"],iq={provider1:"claude",provider2:"codex",provider3:"gemini"},oq={provider1:"primary implementer",provider2:"independent reviewer",provider3:"auxiliary / tie-break"}});import{createHash as lq,randomBytes as cq}from"node:crypto";import{readFile as dq}from"node:fs/promises";function bv(e=new Date,t=cq(4)){let r=e.getUTCFullYear().toString().padStart(4,"0"),n=(e.getUTCMonth()+1).toString().padStart(2,"0"),s=e.getUTCDate().toString().padStart(2,"0"),i=e.getUTCHours().toString().padStart(2,"0"),o=e.getUTCMinutes().toString().padStart(2,"0"),a=e.getUTCSeconds().toString().padStart(2,"0"),l=t.toString("hex").slice(0,8).padEnd(8,"0");return`dxx-${r}${n}${s}-${i}${o}${a}-${l}`}function uq(e){return lq("sha256").update(e).digest("hex")}async function Sv(e){return(await Promise.all(e.map(async({bundlePath:r,absPath:n})=>{let s=await dq(n);return{path:r,sha256:uq(s),size:s.byteLength}}))).sort((r,n)=>r.path<n.path?-1:r.path>n.path?1:0)}function vv(e){return{ticket_id:e.ticketId,lmctl_next_version:e.lmctlNextVersion,node_version:e.nodeVersion,platform:e.platform,generated_at:e.generatedAt.toISOString(),sanitized:e.sanitized,files:e.files}}var If=T(()=>{"use strict"});import{spawnSync as kv}from"node:child_process";import{mkdir as Nf,writeFile as Iv,readFile as fq,rm as Nv}from"node:fs/promises";import{tmpdir as mq}from"node:os";import{dirname as xv,join as xf}from"node:path";async function Av(e){let t=e.stagingDir??xf(mq(),`lmctl-diag-${e.ticketId}`),r=xf(t,`diagnostic-${e.ticketId}`);await Nf(r,{recursive:!0});let n=[],s=async(u,f)=>{let m=xf(r,u);if(await Nf(xv(m),{recursive:!0}),typeof f=="string")await Iv(m,f);else{let p=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);await Iv(m,new Uint8Array(p))}n.push({bundlePath:u,absPath:m})},i=u=>`${JSON.stringify(u,null,2)}
2508
+ `;Cn=["claude","codex","gemini","qwen"],iq={provider1:"claude",provider2:"codex",provider3:"gemini"},oq={provider1:"primary implementer",provider2:"independent reviewer",provider3:"auxiliary / tie-break"}});import{createHash as lq,randomBytes as cq}from"node:crypto";import{readFile as dq}from"node:fs/promises";function bv(e=new Date,t=cq(4)){let r=e.getUTCFullYear().toString().padStart(4,"0"),n=(e.getUTCMonth()+1).toString().padStart(2,"0"),s=e.getUTCDate().toString().padStart(2,"0"),i=e.getUTCHours().toString().padStart(2,"0"),o=e.getUTCMinutes().toString().padStart(2,"0"),a=e.getUTCSeconds().toString().padStart(2,"0"),l=t.toString("hex").slice(0,8).padEnd(8,"0");return`dxx-${r}${n}${s}-${i}${o}${a}-${l}`}function uq(e){return lq("sha256").update(e).digest("hex")}async function Sv(e){return(await Promise.all(e.map(async({bundlePath:r,absPath:n})=>{let s=await dq(n);return{path:r,sha256:uq(s),size:s.byteLength}}))).sort((r,n)=>r.path<n.path?-1:r.path>n.path?1:0)}function vv(e){return{ticket_id:e.ticketId,lmctl_next_version:e.lmctlNextVersion,node_version:e.nodeVersion,platform:e.platform,generated_at:e.generatedAt.toISOString(),sanitized:e.sanitized,files:e.files}}var kf=T(()=>{"use strict"});import{spawnSync as kv}from"node:child_process";import{mkdir as If,writeFile as Iv,readFile as fq,rm as Nv}from"node:fs/promises";import{tmpdir as mq}from"node:os";import{dirname as xv,join as Nf}from"node:path";async function Av(e){let t=e.stagingDir??Nf(mq(),`lmctl-diag-${e.ticketId}`),r=Nf(t,`diagnostic-${e.ticketId}`);await If(r,{recursive:!0});let n=[],s=async(u,f)=>{let m=Nf(r,u);if(await If(xv(m),{recursive:!0}),typeof f=="string")await Iv(m,f);else{let p=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);await Iv(m,new Uint8Array(p))}n.push({bundlePath:u,absPath:m})},i=u=>`${JSON.stringify(u,null,2)}
2509
2509
  `;if(e.data.serve!==void 0){let u=e.data.serve,f=u.pid===null?`no daemon (source=${u.pid_source})
2510
2510
  `:`${u.pid}
2511
2511
  # source=${u.pid_source} alive=${String(u.pid_alive)}
@@ -2523,8 +2523,8 @@ delete requires --confirm; deleting default or active workspaces also requires -
2523
2523
  `:`# source=${f}
2524
2524
  # tail_lines=${u.tail_lines}
2525
2525
  `;await s("intents/recent.log",`${m}${u.tail}${u.tail.length>0?`
2526
- `:""}`)}if(await s("README.md",pq(e)),e.sanitized)for(let u of n){let f=await fq(u.absPath);try{Kf(u.bundlePath,f.toString("utf8"))}catch(m){throw await Nv(t,{recursive:!0,force:!0}),m instanceof vr,m}}let o=await Sv(n),a=vv({ticketId:e.ticketId,lmctlNextVersion:e.lmctlNextVersion,nodeVersion:process.version,platform:process.platform,generatedAt:e.generatedAt??new Date,sanitized:e.sanitized,files:o});await s("manifest.json",i(a)),await Nf(xv(e.outputPath),{recursive:!0});let l=kv("tar",["-czf",e.outputPath,"-C",t,`diagnostic-${e.ticketId}`],{encoding:"utf8"});if(l.status!==0)throw new Error(`tar failed (status=${l.status}): ${l.stderr??""}`);let c=kv("stat",["-c","%s",e.outputPath],{encoding:"utf8"}),d=Number.parseInt((c.stdout??"0").trim(),10)||0;return await Nv(t,{recursive:!0,force:!0}),{outputPath:e.outputPath,manifest:a,bundleSizeBytes:d}}function pq(e){let t=Object.keys(e.data).sort().join(", ")||"(none)";return[`# Diagnostic Bundle ${e.ticketId}`,"",`Generated by lmctl ${e.lmctlNextVersion}.`,"",`Sections included: ${t}`,`Sanitized: ${e.sanitized?"yes":"NO (--no-sanitize)"}`,"","## Layout","","- `manifest.json` \u2014 file index + sha256 + lmctl version.","- `serve/` \u2014 daemon PID + sanitized log tail.","- `db/` \u2014 sqlite integrity-check, schema version, table row counts.","- `runs/` \u2014 last 50 run metadata, stale runs, paused runs.","- `jobs/` \u2014 queue snapshot (pending/running/done/failed counts + ids).","- `attentions/` \u2014 unacked operator attentions.","- `env/` \u2014 lmctl version, node, uname -a, du -sh, tracked env vars.","- `intents/` \u2014 last N entries of the rolling intent log (sanitized).","","## What this bundle does NOT contain","","- Prompt bodies or message contents.","- step_artifact contents (code/text artifacts produced by runs).","- durable_memory bodies.","- session_event payloads.","- API tokens or bearer tokens (redacted in sanitization).",""].join(`
2527
- `)}var Rv=T(()=>{"use strict";If();Ks()});import{spawnSync as _q}from"node:child_process";import{stat as hq}from"node:fs/promises";async function Lv(e){try{if(!(await hq(e.bundlePath)).isFile())return{mode:e.mode,ok:!1,message:`bundle not a regular file: ${e.bundlePath}`}}catch(t){return{mode:e.mode,ok:!1,message:`bundle missing: ${t instanceof Error?t.message:String(t)}`}}switch(e.mode){case"local":return{mode:"local",ok:!0,message:`bundle written: ${e.bundlePath}`,destination:e.bundlePath};case"internal-s3":return gq(e);case"hq":return yq(e)}}function gq(e){let r=_q("which",["aws"],{encoding:"utf8"}).status===0,s=`${e.s3Prefix??"s3://lmctl/diagnostics/"}${e.ticketId}.tar.gz`;return r?{mode:"internal-s3",ok:!0,message:`STUB (no actual upload performed): would run \`aws s3 cp ${e.bundlePath} ${s}\``,destination:s}:{mode:"internal-s3",ok:!1,message:`aws CLI not available; would upload ${e.bundlePath} -> ${s}`,destination:s}}function yq(e){let t=e.hqUrl??"https://lmctl.anthropic.com";return{mode:"hq",ok:!1,message:`headquarter upload not implemented in MVP; would POST to ${t}/diagnostics/init with ticket ${e.ticketId}`,destination:t}}var Ov=T(()=>{"use strict"});var Cv={};ye(Cv,{parseDiagnoseArgs:()=>$v,runDiagnose:()=>Tq});import{tmpdir as wq}from"node:os";import{join as Eq}from"node:path";async function Tq(e,t={stdout:process.stdout,stderr:process.stderr}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(`${vq()}
2526
+ `:""}`)}if(await s("README.md",pq(e)),e.sanitized)for(let u of n){let f=await fq(u.absPath);try{Kf(u.bundlePath,f.toString("utf8"))}catch(m){throw await Nv(t,{recursive:!0,force:!0}),m instanceof vr,m}}let o=await Sv(n),a=vv({ticketId:e.ticketId,lmctlNextVersion:e.lmctlNextVersion,nodeVersion:process.version,platform:process.platform,generatedAt:e.generatedAt??new Date,sanitized:e.sanitized,files:o});await s("manifest.json",i(a)),await If(xv(e.outputPath),{recursive:!0});let l=kv("tar",["-czf",e.outputPath,"-C",t,`diagnostic-${e.ticketId}`],{encoding:"utf8"});if(l.status!==0)throw new Error(`tar failed (status=${l.status}): ${l.stderr??""}`);let c=kv("stat",["-c","%s",e.outputPath],{encoding:"utf8"}),d=Number.parseInt((c.stdout??"0").trim(),10)||0;return await Nv(t,{recursive:!0,force:!0}),{outputPath:e.outputPath,manifest:a,bundleSizeBytes:d}}function pq(e){let t=Object.keys(e.data).sort().join(", ")||"(none)";return[`# Diagnostic Bundle ${e.ticketId}`,"",`Generated by lmctl ${e.lmctlNextVersion}.`,"",`Sections included: ${t}`,`Sanitized: ${e.sanitized?"yes":"NO (--no-sanitize)"}`,"","## Layout","","- `manifest.json` \u2014 file index + sha256 + lmctl version.","- `serve/` \u2014 daemon PID + sanitized log tail.","- `db/` \u2014 sqlite integrity-check, schema version, table row counts.","- `runs/` \u2014 last 50 run metadata, stale runs, paused runs.","- `jobs/` \u2014 queue snapshot (pending/running/done/failed counts + ids).","- `attentions/` \u2014 unacked operator attentions.","- `env/` \u2014 lmctl version, node, uname -a, du -sh, tracked env vars.","- `intents/` \u2014 last N entries of the rolling intent log (sanitized).","","## What this bundle does NOT contain","","- Prompt bodies or message contents.","- step_artifact contents (code/text artifacts produced by runs).","- durable_memory bodies.","- session_event payloads.","- API tokens or bearer tokens (redacted in sanitization).",""].join(`
2527
+ `)}var Rv=T(()=>{"use strict";kf();Ks()});import{spawnSync as _q}from"node:child_process";import{stat as hq}from"node:fs/promises";async function Lv(e){try{if(!(await hq(e.bundlePath)).isFile())return{mode:e.mode,ok:!1,message:`bundle not a regular file: ${e.bundlePath}`}}catch(t){return{mode:e.mode,ok:!1,message:`bundle missing: ${t instanceof Error?t.message:String(t)}`}}switch(e.mode){case"local":return{mode:"local",ok:!0,message:`bundle written: ${e.bundlePath}`,destination:e.bundlePath};case"internal-s3":return gq(e);case"hq":return yq(e)}}function gq(e){let r=_q("which",["aws"],{encoding:"utf8"}).status===0,s=`${e.s3Prefix??"s3://lmctl/diagnostics/"}${e.ticketId}.tar.gz`;return r?{mode:"internal-s3",ok:!0,message:`STUB (no actual upload performed): would run \`aws s3 cp ${e.bundlePath} ${s}\``,destination:s}:{mode:"internal-s3",ok:!1,message:`aws CLI not available; would upload ${e.bundlePath} -> ${s}`,destination:s}}function yq(e){let t=e.hqUrl??"https://lmctl.anthropic.com";return{mode:"hq",ok:!1,message:`headquarter upload not implemented in MVP; would POST to ${t}/diagnostics/init with ticket ${e.ticketId}`,destination:t}}var Ov=T(()=>{"use strict"});var Cv={};ye(Cv,{parseDiagnoseArgs:()=>$v,runDiagnose:()=>Tq});import{tmpdir as wq}from"node:os";import{join as Eq}from"node:path";async function Tq(e,t={stdout:process.stdout,stderr:process.stderr}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(`${vq()}
2528
2528
  `),0;let r=$v(e);if(typeof r=="string")return t.stderr.write(`error: ${r}
2529
2529
  `),2;if(r.noSanitize&&(r.upload||r.internalS3||r.hqUrl!==void 0))return t.stderr.write(`error: --no-sanitize is incompatible with upload modes (--upload/--internal-s3/--hq)
2530
2530
  `),2;if(r.upload&&r.internalS3)return t.stderr.write(`error: pick one of --upload (HQ) or --internal-s3, not both
@@ -2535,17 +2535,17 @@ delete requires --confirm; deleting default or active workspaces also requires -
2535
2535
  `),t.stdout.write(`upload[${c.mode}]: ${c.ok?"ok":"noop"} \u2014 ${c.message}
2536
2536
  `)),c.ok||i==="local"?0:1})}catch(o){return t.stderr.write(`diagnose failed: ${o instanceof Error?o.message:String(o)}
2537
2537
  `),1}}function $v(e){let t={upload:!1,internalS3:!1,noSanitize:!1,json:!1},r=[];for(let n=0;n<e.length;n+=1){let s=e[n];if(s==="--output"){let i=e[++n];if(i===void 0||i.startsWith("--"))return"missing value for --output";t.outputPath=i;continue}if(s==="--upload"){t.upload=!0;continue}if(s==="--internal-s3"){t.internalS3=!0;continue}if(s==="--hq"){let i=e[++n];if(i===void 0||i.startsWith("--"))return"missing value for --hq";t.hqUrl=i,t.upload=!0;continue}if(s==="--include"){let i=e[++n];if(i===void 0||i.startsWith("--"))return"missing value for --include";if(!bq(i))return`unknown section: ${i} (expected one of ${Ys.join(", ")})`;r.push(i);continue}if(s==="--no-sanitize"){t.noSanitize=!0;continue}if(s==="--json"){t.json=!0;continue}if(!(s==="--help"||s==="-h"))return`unknown argument: ${s}`}return r.length>0&&(t.include=r),t}function bq(e){return Ys.includes(e)}function Sq(e){return Eq(wq(),`lmctl-diag-${e}.tar.gz`)}function vq(){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(`
2538
- `)}var Mv=T(()=>{"use strict";Fn();Rv();If();Ks();Ov();Je();Re()});var Wv={};ye(Wv,{ATTENTION_STATES:()=>Lf,DAEMON_INTERVAL_FAST_MS:()=>Rf,REQUIRED_TEAM_ALIASES:()=>jv,chooseDiagnoses:()=>Fv,collectEvidence:()=>Pv,diagnose:()=>Dv,renderReport:()=>Uv,runDiagnosePrompt:()=>Nq});function Dv(e,t){let r=Pv(e,t),n=Fv(r);return Uv(r,n)}function Pv(e,t){let r=t.trim(),n={promptId:r,prompt:{exists:!1},dispatch:{sectionAvailable:!0,rowExists:!1},job:{sectionAvailable:!0,exists:!1},run:{sectionAvailable:!0,exists:!1},project:{sectionAvailable:!0,exists:!1},workflows:{sectionAvailable:!0,count:0,rows:[]},team:{sectionAvailable:!0,members:[],missingAliases:[]},daemon:{workerPid:null,intervalMs:ks(),lastTickAt:null}},s=null;try{s=e.getPromptDispatch(r)}catch{n.dispatch.sectionAvailable=!1}if(s!=null&&(n.dispatch.rowExists=!0,n.prompt.exists=!0,n.prompt.project_id=s.project_id,n.prompt.text_preview=Iq(s.text),n.prompt.created_at=s.created_at,n.prompt.completed_at=s.completed_at,n.prompt.job_id=s.job_id),n.prompt.job_id!==void 0)try{let i=e.getJob(n.prompt.job_id);if(i!==null&&(n.job.exists=!0,n.job.status=i.status,n.job.attempt_count=i.attempt_count,n.job.last_error=i.last_error,n.job.available_at=i.available_at,n.job.locked_by=i.locked_by,n.job.run_id=i.run_id,i.run_id!==null))try{let o=e.getRun(i.run_id);if(o!==null){n.run.exists=!0,n.run.id=o.id,n.run.current_state=o.current_state,n.run.terminal_state=o.terminal_state,n.run.started_at=o.started_at,n.run.ended_at=o.ended_at;let a="__paused__:";n.run.paused_step=o.current_state!==null&&o.current_state.startsWith(a)?o.current_state.slice(a.length):null,n.run.paused_at=o.paused_at}}catch{n.run.sectionAvailable=!1}}catch{n.job.sectionAvailable=!1}if(n.prompt.project_id!==void 0)try{let i=e.getProject(n.prompt.project_id);if(i!==null){n.project.exists=!0,n.project.id=i.id,n.project.name=i.name,n.project.local_path=i.local_path,n.project.test_command=i.test_command,n.project.workflow_name=i.workflow_name,n.project.team_id=i.team_id;try{n.project.workflow_name_resolves=e.getWorkflowByName(i.workflow_name)!==null}catch{n.project.workflow_name_resolves=!1}}}catch{n.project.sectionAvailable=!1}if(n.project.id!==void 0)try{let i=e.listProjectWorkflows(n.project.id);n.workflows.count=i.length;for(let o of i){let a=`workflow_id=${o.workflow_id}`,l=0,c=null;try{let u=e.listWorkflows().find(f=>f.id===o.workflow_id);u!==void 0&&(a=u.name,l=u.version,c=u.source_uri)}catch{}n.workflows.rows.push({workflow_name:a,version:l,enabled:o.enabled,source_uri:c})}}catch{n.workflows.sectionAvailable=!1}if(n.project.team_id!==void 0)try{n.team.teamId=n.project.team_id;let i=e.listTeamMembers(n.project.team_id);for(let a of i)n.team.members.push({alias:a.alias,provider:a.provider,sessionid:a.sessionid,sessiondir:a.sessiondir,state:a.state,state_reason:a.state_reason,state_updated_at:a.state_updated_at});let o=new Set(i.map(a=>a.alias));n.team.missingAliases=jv.filter(a=>!o.has(a))}catch{n.team.sectionAvailable=!1}return n.daemon.workerPid=null,n.daemon.lastTickAt=null,n}function Fv(e){let t=[];if(e.dispatch.sectionAvailable&&!e.dispatch.rowExists)return t.push({cause:"Prompt wasn't enqueued (no prompt_dispatch row); SPA\u2192agent submitPrompt path broken",action:"Inspect mailbox-rest-router submitPrompt logs on the agent; confirm the SPA reached /mailbox/projects/:id/prompts"}),t;e.dispatch.rowExists&&e.job.exists&&(e.job.run_id===null||e.job.run_id===void 0)&&!e.run.exists&&t.push({cause:"Daemon poll didn't pick up the job (no run row); check daemon interval + worker pid",action:"Restart the agent serve process or lower LMCTL_DAEMON_INTERVAL_MS (current default 600000ms = 10min)"}),e.daemon.intervalMs>Rf&&t.push({cause:`Daemon poll interval is ${e.daemon.intervalMs}ms (${Math.round(e.daemon.intervalMs/1e3)}s); WT/dev expected <=${Rf}ms`,action:"Set LMCTL_DAEMON_INTERVAL_MS=5000 (or lower) in the agent's env before relaunching `lmctl-next-agent`"}),e.project.exists&&e.workflows.sectionAvailable&&e.workflows.count===0&&e.project.workflow_name_resolves!==!0&&t.push({cause:`Project ${e.project.name??`id=${e.project.id??"?"}`} has 0 workflows registered AND project.workflow_name does not resolve; engine can't dispatch`,action:"The workflow/project CLI surface is retired; inspect the dormant DB rows or migrate this project to a .lmctl teamfile path."}),e.team.sectionAvailable&&e.team.missingAliases.length>0&&t.push({cause:`Default team (team_id=${e.team.teamId??"?"}) missing required aliases: ${e.team.missingAliases.join(", ")} (TC2 DEFECT-E class \u2014 engine will stall with missing_agent:<alias>)`,action:"Run `lmctl team seed` against this project's team, or add the missing members via `lmctl team add-member`"});let r=e.team.sectionAvailable?e.team.members.filter(s=>Lf.has(s.state)):[];if(e.run.exists&&(e.run.paused_step??null)!==null||r.length>0){let s=e.run.paused_step??null,i=r.map(a=>a.alias).join(", "),o=s!==null&&i.length>0?`Run paused at ${s} awaiting operator escalation decision (member ${i} attention_needed)`:s!==null?`Run paused at ${s} awaiting operator escalation decision`:`Team member(s) ${i} awaiting operator attention`;t.push({cause:o,action:"Open the run in the SPA escalations panel (paused badge) or resolve via the operator-resume verb"})}return e.dispatch.rowExists&&e.job.exists&&!e.run.exists&&e.daemon.workerPid===null&&t.push({cause:"Worker pid not observable (agent serve process may not be actively daemoning)",action:"Verify `lmctl-next-agent` is running and check stderr for `[lmctl-next-agent]` lines"}),t.slice(0,3)}function Uv(e,t){let r=[];if(r.push(`DIAGNOSE ${e.promptId}`),r.push(""),r.push("[PROMPT]"),e.prompt.exists?(r.push(` id: ${e.promptId}`),r.push(` project_id: ${e.prompt.project_id??"?"}`),r.push(` text: ${e.prompt.text_preview??"?"}`),r.push(` created_at: ${e.prompt.created_at??"?"}`),r.push(` completed_at: ${e.prompt.completed_at??"null"}`)):r.push(" not present in prompt_dispatch table"),r.push(""),r.push("[PROMPT_DISPATCH]"),e.dispatch.sectionAvailable?(r.push(` row exists in prompt_dispatch table: ${e.dispatch.rowExists?"YES":"NO"}`),e.dispatch.rowExists&&(r.push(` job_id: ${e.prompt.job_id??"?"}`),r.push(` dispatched_at: ${e.prompt.created_at??"?"}`),r.push(` last_seen_status: ${kq(e)}`))):r.push(" table not present (schema variation)"),r.push(""),r.push("[PROMPT_RUN]"),e.job.sectionAvailable?e.job.exists?e.run.exists?(r.push(" row exists in prompt_runs table: YES"),r.push(` run_id: ${e.run.id??"?"}`),r.push(` current_step: ${e.run.current_state??"null"}`),r.push(` status: ${e.run.terminal_state??"in_progress"}`),r.push(` started_at: ${e.run.started_at??"?"}`),r.push(` attempts: ${e.job.attempt_count??0}`)):(r.push(" row exists in prompt_runs table: NO"),r.push(` job_id: ${e.prompt.job_id??"?"} status=${e.job.status??"?"} attempts=${e.job.attempt_count??0}`),r.push(" -> job enqueued but no run; daemon poll did not consume it")):(r.push(" row exists in prompt_runs table: NO"),r.push(" -> worker never picked up the prompt (job row missing)")):r.push(" job table not accessible"),r.push(""),r.push("[PROJECT]"),e.project.sectionAvailable?e.project.exists?(r.push(` id: ${e.project.id??"?"}`),r.push(` name: ${e.project.name??"?"}`),r.push(` local_path: ${e.project.local_path??"?"}`),r.push(` test_command: ${e.project.test_command??"null"}`),r.push(` default_workflow: ${e.project.workflow_name??"null"}`)):e.prompt.project_id===void 0?r.push(" not resolvable (no project_id on prompt)"):r.push(` not present (id=${e.prompt.project_id})`):r.push(" project table not accessible"),r.push(""),r.push("[WORKFLOWS REGISTERED FOR PROJECT]"),!e.workflows.sectionAvailable)r.push(" project_workflow table not accessible");else if(e.workflows.count===0&&e.project.exists&&e.project.workflow_name_resolves===!0)r.push(` default_workflow_name: ${e.project.workflow_name??"?"} (resolved via project.workflow_name)`),r.push(" project_workflow rows: 0 (uses fallback resolution; expected)");else{r.push(` count: ${e.workflows.count}`);for(let i of e.workflows.rows)r.push(` - ${i.workflow_name} v${i.version} enabled=${i.enabled===1?"true":"false"} source=${i.source_uri??"null"}`)}if(r.push(""),r.push("[TEAM MEMBERS FOR PROJECT'S DEFAULT TEAM]"),!e.team.sectionAvailable)r.push(" team_member table not accessible");else if(e.team.teamId===void 0)r.push(" not resolvable (no team_id on project)");else{e.team.members.length===0&&r.push(" (no members)");for(let i of e.team.members)r.push(` - alias=${i.alias} provider=${i.provider} state=${i.state} sessionid=${i.sessionid??"null"} sessiondir=${i.sessiondir}`);e.team.missingAliases.length>0&&r.push(` ! missing aliases: ${e.team.missingAliases.join(", ")}`)}r.push("");let n=e.team.sectionAvailable?e.team.members.filter(i=>Lf.has(i.state)):[],s=e.run.exists?e.run.paused_step??null:null;if(s!==null||n.length>0){if(r.push("[ATTENTION/ESCALATION]"),s!==null){let i=e.run.paused_at??e.run.started_at??"?";r.push(` paused_step: ${s} (started: ${i})`)}if(n.length>0){let i=n.map(o=>`${o.alias} (state=${o.state}${o.state_updated_at?` since ${o.state_updated_at}`:""}${o.state_reason?`, reason="${o.state_reason}"`:""})`).join(", ");r.push(` members awaiting operator: ${i}`)}else r.push(" members awaiting operator: (none flagged on team)");r.push(" next action expected: operator response via /admin or webcli escalations verb"),r.push("")}if(r.push("[DAEMON STATE]"),r.push(` worker pid: ${e.daemon.workerPid===null?"not observable from CLI":String(e.daemon.workerPid)}`),r.push(` daemon poll interval (LMCTL_DAEMON_INTERVAL_MS env): ${e.daemon.intervalMs}`),r.push(` last daemon tick: ${e.daemon.lastTickAt??"not exposed"}`),r.push(""),r.push("[DIAGNOSIS]"),t.length===0)r.push(" no obvious root cause flagged by the v1 rules (see brief Part 4)");else for(let i of t)r.push(` - ${i.cause}`),r.push(` -> ${i.action}`);return r.join(`
2538
+ `)}var Mv=T(()=>{"use strict";Fn();Rv();kf();Ks();Ov();Je();Re()});var Wv={};ye(Wv,{ATTENTION_STATES:()=>Rf,DAEMON_INTERVAL_FAST_MS:()=>Af,REQUIRED_TEAM_ALIASES:()=>jv,chooseDiagnoses:()=>Fv,collectEvidence:()=>Pv,diagnose:()=>Dv,renderReport:()=>Uv,runDiagnosePrompt:()=>Nq});function Dv(e,t){let r=Pv(e,t),n=Fv(r);return Uv(r,n)}function Pv(e,t){let r=t.trim(),n={promptId:r,prompt:{exists:!1},dispatch:{sectionAvailable:!0,rowExists:!1},job:{sectionAvailable:!0,exists:!1},run:{sectionAvailable:!0,exists:!1},project:{sectionAvailable:!0,exists:!1},workflows:{sectionAvailable:!0,count:0,rows:[]},team:{sectionAvailable:!0,members:[],missingAliases:[]},daemon:{workerPid:null,intervalMs:ks(),lastTickAt:null}},s=null;try{s=e.getPromptDispatch(r)}catch{n.dispatch.sectionAvailable=!1}if(s!=null&&(n.dispatch.rowExists=!0,n.prompt.exists=!0,n.prompt.project_id=s.project_id,n.prompt.text_preview=Iq(s.text),n.prompt.created_at=s.created_at,n.prompt.completed_at=s.completed_at,n.prompt.job_id=s.job_id),n.prompt.job_id!==void 0)try{let i=e.getJob(n.prompt.job_id);if(i!==null&&(n.job.exists=!0,n.job.status=i.status,n.job.attempt_count=i.attempt_count,n.job.last_error=i.last_error,n.job.available_at=i.available_at,n.job.locked_by=i.locked_by,n.job.run_id=i.run_id,i.run_id!==null))try{let o=e.getRun(i.run_id);if(o!==null){n.run.exists=!0,n.run.id=o.id,n.run.current_state=o.current_state,n.run.terminal_state=o.terminal_state,n.run.started_at=o.started_at,n.run.ended_at=o.ended_at;let a="__paused__:";n.run.paused_step=o.current_state!==null&&o.current_state.startsWith(a)?o.current_state.slice(a.length):null,n.run.paused_at=o.paused_at}}catch{n.run.sectionAvailable=!1}}catch{n.job.sectionAvailable=!1}if(n.prompt.project_id!==void 0)try{let i=e.getProject(n.prompt.project_id);if(i!==null){n.project.exists=!0,n.project.id=i.id,n.project.name=i.name,n.project.local_path=i.local_path,n.project.test_command=i.test_command,n.project.workflow_name=i.workflow_name,n.project.team_id=i.team_id;try{n.project.workflow_name_resolves=e.getWorkflowByName(i.workflow_name)!==null}catch{n.project.workflow_name_resolves=!1}}}catch{n.project.sectionAvailable=!1}if(n.project.id!==void 0)try{let i=e.listProjectWorkflows(n.project.id);n.workflows.count=i.length;for(let o of i){let a=`workflow_id=${o.workflow_id}`,l=0,c=null;try{let u=e.listWorkflows().find(f=>f.id===o.workflow_id);u!==void 0&&(a=u.name,l=u.version,c=u.source_uri)}catch{}n.workflows.rows.push({workflow_name:a,version:l,enabled:o.enabled,source_uri:c})}}catch{n.workflows.sectionAvailable=!1}if(n.project.team_id!==void 0)try{n.team.teamId=n.project.team_id;let i=e.listTeamMembers(n.project.team_id);for(let a of i)n.team.members.push({alias:a.alias,provider:a.provider,sessionid:a.sessionid,sessiondir:a.sessiondir,state:a.state,state_reason:a.state_reason,state_updated_at:a.state_updated_at});let o=new Set(i.map(a=>a.alias));n.team.missingAliases=jv.filter(a=>!o.has(a))}catch{n.team.sectionAvailable=!1}return n.daemon.workerPid=null,n.daemon.lastTickAt=null,n}function Fv(e){let t=[];if(e.dispatch.sectionAvailable&&!e.dispatch.rowExists)return t.push({cause:"Prompt wasn't enqueued (no prompt_dispatch row); SPA\u2192agent submitPrompt path broken",action:"Inspect mailbox-rest-router submitPrompt logs on the agent; confirm the SPA reached /mailbox/projects/:id/prompts"}),t;e.dispatch.rowExists&&e.job.exists&&(e.job.run_id===null||e.job.run_id===void 0)&&!e.run.exists&&t.push({cause:"Daemon poll didn't pick up the job (no run row); check daemon interval + worker pid",action:"Restart the agent serve process or lower LMCTL_DAEMON_INTERVAL_MS (current default 600000ms = 10min)"}),e.daemon.intervalMs>Af&&t.push({cause:`Daemon poll interval is ${e.daemon.intervalMs}ms (${Math.round(e.daemon.intervalMs/1e3)}s); WT/dev expected <=${Af}ms`,action:"Set LMCTL_DAEMON_INTERVAL_MS=5000 (or lower) in the agent's env before relaunching `lmctl-next-agent`"}),e.project.exists&&e.workflows.sectionAvailable&&e.workflows.count===0&&e.project.workflow_name_resolves!==!0&&t.push({cause:`Project ${e.project.name??`id=${e.project.id??"?"}`} has 0 workflows registered AND project.workflow_name does not resolve; engine can't dispatch`,action:"The workflow/project CLI surface is retired; inspect the dormant DB rows or migrate this project to a .lmctl teamfile path."}),e.team.sectionAvailable&&e.team.missingAliases.length>0&&t.push({cause:`Default team (team_id=${e.team.teamId??"?"}) missing required aliases: ${e.team.missingAliases.join(", ")} (TC2 DEFECT-E class \u2014 engine will stall with missing_agent:<alias>)`,action:"Run `lmctl team seed` against this project's team, or add the missing members via `lmctl team add-member`"});let r=e.team.sectionAvailable?e.team.members.filter(s=>Rf.has(s.state)):[];if(e.run.exists&&(e.run.paused_step??null)!==null||r.length>0){let s=e.run.paused_step??null,i=r.map(a=>a.alias).join(", "),o=s!==null&&i.length>0?`Run paused at ${s} awaiting operator escalation decision (member ${i} attention_needed)`:s!==null?`Run paused at ${s} awaiting operator escalation decision`:`Team member(s) ${i} awaiting operator attention`;t.push({cause:o,action:"Open the run in the SPA escalations panel (paused badge) or resolve via the operator-resume verb"})}return e.dispatch.rowExists&&e.job.exists&&!e.run.exists&&e.daemon.workerPid===null&&t.push({cause:"Worker pid not observable (agent serve process may not be actively daemoning)",action:"Verify `lmctl-next-agent` is running and check stderr for `[lmctl-next-agent]` lines"}),t.slice(0,3)}function Uv(e,t){let r=[];if(r.push(`DIAGNOSE ${e.promptId}`),r.push(""),r.push("[PROMPT]"),e.prompt.exists?(r.push(` id: ${e.promptId}`),r.push(` project_id: ${e.prompt.project_id??"?"}`),r.push(` text: ${e.prompt.text_preview??"?"}`),r.push(` created_at: ${e.prompt.created_at??"?"}`),r.push(` completed_at: ${e.prompt.completed_at??"null"}`)):r.push(" not present in prompt_dispatch table"),r.push(""),r.push("[PROMPT_DISPATCH]"),e.dispatch.sectionAvailable?(r.push(` row exists in prompt_dispatch table: ${e.dispatch.rowExists?"YES":"NO"}`),e.dispatch.rowExists&&(r.push(` job_id: ${e.prompt.job_id??"?"}`),r.push(` dispatched_at: ${e.prompt.created_at??"?"}`),r.push(` last_seen_status: ${kq(e)}`))):r.push(" table not present (schema variation)"),r.push(""),r.push("[PROMPT_RUN]"),e.job.sectionAvailable?e.job.exists?e.run.exists?(r.push(" row exists in prompt_runs table: YES"),r.push(` run_id: ${e.run.id??"?"}`),r.push(` current_step: ${e.run.current_state??"null"}`),r.push(` status: ${e.run.terminal_state??"in_progress"}`),r.push(` started_at: ${e.run.started_at??"?"}`),r.push(` attempts: ${e.job.attempt_count??0}`)):(r.push(" row exists in prompt_runs table: NO"),r.push(` job_id: ${e.prompt.job_id??"?"} status=${e.job.status??"?"} attempts=${e.job.attempt_count??0}`),r.push(" -> job enqueued but no run; daemon poll did not consume it")):(r.push(" row exists in prompt_runs table: NO"),r.push(" -> worker never picked up the prompt (job row missing)")):r.push(" job table not accessible"),r.push(""),r.push("[PROJECT]"),e.project.sectionAvailable?e.project.exists?(r.push(` id: ${e.project.id??"?"}`),r.push(` name: ${e.project.name??"?"}`),r.push(` local_path: ${e.project.local_path??"?"}`),r.push(` test_command: ${e.project.test_command??"null"}`),r.push(` default_workflow: ${e.project.workflow_name??"null"}`)):e.prompt.project_id===void 0?r.push(" not resolvable (no project_id on prompt)"):r.push(` not present (id=${e.prompt.project_id})`):r.push(" project table not accessible"),r.push(""),r.push("[WORKFLOWS REGISTERED FOR PROJECT]"),!e.workflows.sectionAvailable)r.push(" project_workflow table not accessible");else if(e.workflows.count===0&&e.project.exists&&e.project.workflow_name_resolves===!0)r.push(` default_workflow_name: ${e.project.workflow_name??"?"} (resolved via project.workflow_name)`),r.push(" project_workflow rows: 0 (uses fallback resolution; expected)");else{r.push(` count: ${e.workflows.count}`);for(let i of e.workflows.rows)r.push(` - ${i.workflow_name} v${i.version} enabled=${i.enabled===1?"true":"false"} source=${i.source_uri??"null"}`)}if(r.push(""),r.push("[TEAM MEMBERS FOR PROJECT'S DEFAULT TEAM]"),!e.team.sectionAvailable)r.push(" team_member table not accessible");else if(e.team.teamId===void 0)r.push(" not resolvable (no team_id on project)");else{e.team.members.length===0&&r.push(" (no members)");for(let i of e.team.members)r.push(` - alias=${i.alias} provider=${i.provider} state=${i.state} sessionid=${i.sessionid??"null"} sessiondir=${i.sessiondir}`);e.team.missingAliases.length>0&&r.push(` ! missing aliases: ${e.team.missingAliases.join(", ")}`)}r.push("");let n=e.team.sectionAvailable?e.team.members.filter(i=>Rf.has(i.state)):[],s=e.run.exists?e.run.paused_step??null:null;if(s!==null||n.length>0){if(r.push("[ATTENTION/ESCALATION]"),s!==null){let i=e.run.paused_at??e.run.started_at??"?";r.push(` paused_step: ${s} (started: ${i})`)}if(n.length>0){let i=n.map(o=>`${o.alias} (state=${o.state}${o.state_updated_at?` since ${o.state_updated_at}`:""}${o.state_reason?`, reason="${o.state_reason}"`:""})`).join(", ");r.push(` members awaiting operator: ${i}`)}else r.push(" members awaiting operator: (none flagged on team)");r.push(" next action expected: operator response via /admin or webcli escalations verb"),r.push("")}if(r.push("[DAEMON STATE]"),r.push(` worker pid: ${e.daemon.workerPid===null?"not observable from CLI":String(e.daemon.workerPid)}`),r.push(` daemon poll interval (LMCTL_DAEMON_INTERVAL_MS env): ${e.daemon.intervalMs}`),r.push(` last daemon tick: ${e.daemon.lastTickAt??"not exposed"}`),r.push(""),r.push("[DIAGNOSIS]"),t.length===0)r.push(" no obvious root cause flagged by the v1 rules (see brief Part 4)");else for(let i of t)r.push(` - ${i.cause}`),r.push(` -> ${i.action}`);return r.join(`
2539
2539
  `)+`
2540
- `}function kq(e){return e.dispatch.rowExists?e.prompt.completed_at!==null&&e.prompt.completed_at!==void 0?"done":e.job.exists?e.run.exists?e.run.terminal_state!==null&&e.run.terminal_state!==void 0?`terminal:${e.run.terminal_state}`:`running:${e.run.current_state??"?"}`:"pending (no run)":"pending (no job)":"unknown"}function Iq(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:`${t.slice(0,80)}...`}async function Nq(e,t={stdout:process.stdout,stderr:process.stderr}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(`${Af()}
2540
+ `}function kq(e){return e.dispatch.rowExists?e.prompt.completed_at!==null&&e.prompt.completed_at!==void 0?"done":e.job.exists?e.run.exists?e.run.terminal_state!==null&&e.run.terminal_state!==void 0?`terminal:${e.run.terminal_state}`:`running:${e.run.current_state??"?"}`:"pending (no run)":"pending (no job)":"unknown"}function Iq(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:`${t.slice(0,80)}...`}async function Nq(e,t={stdout:process.stdout,stderr:process.stderr}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(`${xf()}
2541
2541
  `),0;let r=[];for(let s of e){if(s.startsWith("--"))return t.stderr.write(`error: unknown flag: ${s}
2542
- `),t.stderr.write(`${Af()}
2542
+ `),t.stderr.write(`${xf()}
2543
2543
  `),2;r.push(s)}if(r.length!==1)return t.stderr.write(`error: expected exactly one positional arg: <prompt_id>
2544
- `),t.stderr.write(`${Af()}
2544
+ `),t.stderr.write(`${xf()}
2545
2545
  `),2;let n=r[0];try{return await $(t,s=>(t.stdout.write(Dv(s,n)),0))}catch(s){return t.stderr.write(`diagnose-prompt failed: ${s instanceof Error?s.message:String(s)}
2546
- `),1}}function Af(){return["usage: lmctl diagnose-prompt <prompt_id>","",'Narrow read-only diagnostic for the WT-6 "prompt-pending-forever"',"symptom. Renders prompt + dispatch + run + project + workflows + team","state, then picks the top 1-3 likely root causes (daemon interval,","missing workflows, missing team aliases, etc).","","options:"," -h, --help show this help and exit"].join(`
2547
- `)}var jv,Rf,Lf,Bv=T(()=>{"use strict";Yd();Re();jv=["Coder","Reviewer1","Polisher"],Rf=3e4,Lf=new Set(["attention_needed","paused","escalation"])});var ak={};ye(ak,{appendIntent:()=>rk,resolveIntentLogPath:()=>tk,runStatus:()=>Fq});import{appendFileSync as xq,mkdirSync as Aq}from"node:fs";import{homedir as Rq,hostname as Lq}from"node:os";import{basename as Oq,dirname as ek,isAbsolute as $q,join as Cq,resolve as Mq}from"node:path";function tk(){return process.env.LMCTL_INTENT_LOG??Cq(Rq(),".lmctl","recent-intents.log")}function rk(e){try{let t=tk();Aq(ek(t),{recursive:!0});let r=JSON.stringify({ts:e.ts??new Date().toISOString(),cwd:e.cwd??process.cwd(),verb:e.verb,args:[...e.args]});xq(t,`${r}
2548
- `)}catch{}}async function Fq(e,t){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(jq),0;let r=e.find(o=>o==="--project"||o.startsWith("--project=")||o==="--web");if(r!==void 0)return v(t,`unknown option ${r}; lmctl status is team/SELF scoped now`);let n=Z(e,["--since"],["--json"]);if(n.error!==void 0)return v(t,n.error);if(n.positionals.length>0)return v(t,`unknown argument: ${n.positionals[0]}`);let s=G(n,"--json"),i=dH(P(n,"--since"));if("error"in i)return v(t,i.error);try{let o=t.env??process.env;if(s){let a=await $(t,l=>Kv(l,o));ae(t,a)}else{let a=await $(t,l=>zq(Kv(l,o),{sinceIso:i.iso}));t.stdout.write(a)}return rk({verb:"status",args:e}),0}catch(o){return v(t,o instanceof Error?o.message:String(o))}}function Kv(e,t){let r=Ou(t,e);if(!r.ok){if(r.reason==="not-found")throw new Error($s("status"));return Wq(e)}return Uq(e,r.identity)}function Uq(e,t){let r=qr(t),n=e.getRootTeam(r.teamfile);if(n===null)throw new Error($s("status"));let s=De(n.teamfile_path,e);return{scope:"self",identity:r.value,...nk(),team:{name:s.name,teamfile:n.teamfile_path},members:s.members.map(i=>qq(e,n.teamfile_path,i)),activity:{from_me:$f(Of(e,{from:r.value})).map(i=>Cf(i,e)),to_me:$f(Of(e,{target_teamfile:r.teamfile,target_alias:r.alias})).map(i=>Cf(i,e))},mailbox:{outbound:qa(Jq(e,r.teamfile,r.alias),"outbound"),inbound_pending:qa(Xq(e,r.teamfile,r.alias),"inbound")},waiting_on:Gq(e,r.teamfile,r.alias).map(sk)}}function nk(){return{workspace:Dt(),db_path:le()}}function Wq(e){let t=e.listRootTeams();return{scope:"workspace",identity:null,...nk(),teams:t.map(r=>Bq(e,r)),activity:$f(Of(e)).map(r=>Cf(r,e)),mailbox:{pending_outbound:qa(Yv(e,"sender"),"outbound"),pending_inbound:qa(Yv(e,"receiver"),"inbound")},waiting_on:Vq(e).map(sk)}}function Bq(e,t){let r=0;try{r=De(t.teamfile_path,e).members.length}catch{r=0}return{name:t.name,teamfile:t.teamfile_path,member_count:r,registered_at:t.registered_at,last_seeded_at:t.last_seeded_at}}function qq(e,t,r){let n=r.teamfile===void 0?null:we($q(r.teamfile)?r.teamfile:Mq(ek(t),r.teamfile),e),s=Pr(e,t,r.alias),i=s.busy&&s.reason==="in-flight"?Hq(e,t,r.alias,s.inFlight):null;return{alias:r.alias,provider:r.provider,model:r.model??null,teamfile:t,referenced_teamfile:n,sessionid:r.session??null,sessiondir:r.sessiondir??null,state:s.busy?"busy":"idle",reason:s.busy?s.reason:null,handling:i}}function Hq(e,t,r,n){let s=n.sender_alias==="operator"?"operator":`${n.sender_teamfile}:${n.sender_alias}`,o=e.db.prepare(`
2546
+ `),1}}function xf(){return["usage: lmctl diagnose-prompt <prompt_id>","",'Narrow read-only diagnostic for the WT-6 "prompt-pending-forever"',"symptom. Renders prompt + dispatch + run + project + workflows + team","state, then picks the top 1-3 likely root causes (daemon interval,","missing workflows, missing team aliases, etc).","","options:"," -h, --help show this help and exit"].join(`
2547
+ `)}var jv,Af,Rf,Bv=T(()=>{"use strict";Kd();Re();jv=["Coder","Reviewer1","Polisher"],Af=3e4,Rf=new Set(["attention_needed","paused","escalation"])});var ak={};ye(ak,{appendIntent:()=>rk,resolveIntentLogPath:()=>tk,runStatus:()=>Uq});import{appendFileSync as xq,mkdirSync as Aq}from"node:fs";import{homedir as Rq,hostname as Lq}from"node:os";import{basename as Oq,dirname as ek,isAbsolute as $q,join as Cq,resolve as Mq}from"node:path";function tk(){return process.env.LMCTL_INTENT_LOG??Cq(Rq(),".lmctl","recent-intents.log")}function rk(e){try{let t=tk();Aq(ek(t),{recursive:!0});let r=JSON.stringify({ts:e.ts??new Date().toISOString(),cwd:e.cwd??process.cwd(),verb:e.verb,args:[...e.args]});xq(t,`${r}
2548
+ `)}catch{}}async function Uq(e,t){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(jq),0;let r=e.find(o=>o==="--project"||o.startsWith("--project=")||o==="--web");if(r!==void 0)return v(t,`unknown option ${r}; lmctl status is team/SELF scoped now`);let n=Z(e,["--since"],["--json"]);if(n.error!==void 0)return v(t,n.error);if(n.positionals.length>0)return v(t,`unknown argument: ${n.positionals[0]}`);let s=G(n,"--json"),i=pH(P(n,"--since"));if("error"in i)return v(t,i.error);try{let o=t.env??process.env;if(s){let a=await $(t,l=>Vv(l,o));ae(t,a)}else{let a=await $(t,l=>Zq(Vv(l,o),{sinceIso:i.iso}));t.stdout.write(a)}return rk({verb:"status",args:e}),0}catch(o){return v(t,o instanceof Error?o.message:String(o))}}function Vv(e,t){let r=Lu(t,e);if(!r.ok){if(r.reason==="not-found")throw new Error($s("status"));return Bq(e)}return Wq(e,r.identity)}function Wq(e,t){let r=qr(t),n=e.getRootTeam(r.teamfile);if(n===null)throw new Error($s("status"));let s=De(n.teamfile_path,e);return{scope:"self",identity:r.value,...nk(),team:{name:s.name,teamfile:n.teamfile_path},members:s.members.map(i=>Hq(e,n.teamfile_path,i)),activity:{from_me:Of(Lf(e,{from:r.value})).map(i=>$f(i,e)),to_me:Of(Lf(e,{target_teamfile:r.teamfile,target_alias:r.alias})).map(i=>$f(i,e))},mailbox:{outbound:qa(Xq(e,r.teamfile,r.alias),"outbound"),inbound_pending:qa(Gq(e,r.teamfile,r.alias),"inbound")},waiting_on:Vq(e,r.teamfile,r.alias).map(sk)}}function nk(){return{workspace:Dt(),db_path:le()}}function Bq(e){let t=e.listRootTeams();return{scope:"workspace",identity:null,...nk(),teams:t.map(r=>qq(e,r)),activity:Of(Lf(e)).map(r=>$f(r,e)),mailbox:{pending_outbound:qa(Kv(e,"sender"),"outbound"),pending_inbound:qa(Kv(e,"receiver"),"inbound")},waiting_on:Kq(e).map(sk)}}function qq(e,t){let r=0;try{r=De(t.teamfile_path,e).members.length}catch{r=0}return{name:t.name,teamfile:t.teamfile_path,member_count:r,registered_at:t.registered_at,last_seeded_at:t.last_seeded_at}}function Hq(e,t,r){let n=r.teamfile===void 0?null:we($q(r.teamfile)?r.teamfile:Mq(ek(t),r.teamfile),e),s=Pr(e,t,r.alias),i=s.busy&&s.reason==="in-flight"?Jq(e,t,r.alias,s.inFlight):null;return{alias:r.alias,provider:r.provider,model:r.model??null,teamfile:t,referenced_teamfile:n,sessionid:r.session??null,sessiondir:r.sessiondir??null,state:s.busy?"busy":"idle",reason:s.busy?s.reason:null,handling:i}}function Jq(e,t,r,n){let s=n.sender_alias==="operator"?"operator":`${n.sender_teamfile}:${n.sender_alias}`,o=e.db.prepare(`
2549
2549
  SELECT * FROM tracked_invocation
2550
2550
  WHERE kind = 'chat'
2551
2551
  AND status = 'running'
@@ -2555,36 +2555,46 @@ delete requires --confirm; deleting default or active workspaces also requires -
2555
2555
  AND holder_pid IS ?
2556
2556
  ORDER BY started_at DESC, id DESC
2557
2557
  LIMIT 5
2558
- `).all(t,r,s,n.holder_pid).find(a=>a.request_payload!==null);return o?.request_payload===void 0||o.request_payload===null?null:{tracked_invocation_id:o.id,from_identity:o.from_identity,started_at:o.started_at,request_payload:o.request_payload,request_preview:lH(o.request_payload)}}function Of(e,t={}){let r=[],n=[];t.from!==void 0&&(r.push("from_identity = ?"),n.push(t.from)),t.target_teamfile!==void 0&&(r.push("target_teamfile = ?"),n.push(t.target_teamfile)),t.target_alias!==void 0&&(r.push("target_alias = ?"),n.push(t.target_alias));let s=r.length===0?"":` WHERE ${r.join(" AND ")}`;return e.db.prepare(`
2558
+ `).all(t,r,s,n.holder_pid).find(a=>a.request_payload!==null);return o?.request_payload===void 0||o.request_payload===null?null:{tracked_invocation_id:o.id,from_identity:o.from_identity,started_at:o.started_at,request_payload:o.request_payload,request_preview:fH(o.request_payload)}}function Lf(e,t={}){let r=[],n=[];t.from!==void 0&&(r.push("from_identity = ?"),n.push(t.from)),t.target_teamfile!==void 0&&(r.push("target_teamfile = ?"),n.push(t.target_teamfile)),t.target_alias!==void 0&&(r.push("target_alias = ?"),n.push(t.target_alias));let s=r.length===0?"":` WHERE ${r.join(" AND ")}`;return e.db.prepare(`
2559
2559
  SELECT * FROM tracked_invocation
2560
2560
  ${s}
2561
2561
  ORDER BY started_at DESC, id DESC
2562
- `).all(...n)}function Jq(e,t,r){return e.db.prepare(`
2562
+ `).all(...n)}function Xq(e,t,r){return e.db.prepare(`
2563
2563
  SELECT * FROM agent_mailbox
2564
2564
  WHERE sender_teamfile = ?
2565
2565
  AND sender_alias = ?
2566
2566
  AND delivered_at IS NULL
2567
2567
  AND delivering_at IS NULL
2568
2568
  ORDER BY receiver_teamfile ASC, receiver_alias ASC, id ASC
2569
- `).all(t,r)}function Xq(e,t,r){return e.db.prepare(`
2569
+ `).all(t,r)}function Gq(e,t,r){return e.db.prepare(`
2570
2570
  SELECT * FROM agent_mailbox
2571
2571
  WHERE receiver_teamfile = ?
2572
2572
  AND receiver_alias = ?
2573
2573
  AND delivered_at IS NULL
2574
2574
  AND delivering_at IS NULL
2575
2575
  ORDER BY sender_teamfile ASC, sender_alias ASC, id ASC
2576
- `).all(t,r)}function Yv(e,t){let r=t==="sender"?"sender_teamfile ASC, sender_alias ASC, receiver_teamfile ASC, receiver_alias ASC, id ASC":"receiver_teamfile ASC, receiver_alias ASC, sender_teamfile ASC, sender_alias ASC, id ASC";return e.db.prepare(`
2576
+ `).all(t,r)}function Kv(e,t){let r=t==="sender"?"sender_teamfile ASC, sender_alias ASC, receiver_teamfile ASC, receiver_alias ASC, id ASC":"receiver_teamfile ASC, receiver_alias ASC, sender_teamfile ASC, sender_alias ASC, id ASC";return e.db.prepare(`
2577
2577
  SELECT * FROM agent_mailbox
2578
2578
  WHERE delivered_at IS NULL
2579
2579
  AND delivering_at IS NULL
2580
2580
  ORDER BY ${r}
2581
- `).all()}function Gq(e,t,r){return e.db.prepare(`
2581
+ `).all()}function Vq(e,t,r){return e.db.prepare(`
2582
2582
  SELECT * FROM agent_mailbox
2583
2583
  WHERE sender_teamfile = ?
2584
2584
  AND sender_alias = ?
2585
2585
  AND (
2586
2586
  delivered_at IS NULL
2587
- OR (delivered_at IS NOT NULL AND (receipt IS NULL OR receipt = ''))
2587
+ OR (
2588
+ delivered_at IS NOT NULL
2589
+ AND message_type = 'request'
2590
+ AND (receipt IS NULL OR receipt = '')
2591
+ AND NOT EXISTS (
2592
+ SELECT 1
2593
+ FROM agent_mailbox AS response
2594
+ WHERE response.message_type = 'response'
2595
+ AND response.request_mailbox_id = agent_mailbox.id
2596
+ )
2597
+ )
2588
2598
  )
2589
2599
  ORDER BY
2590
2600
  CASE
@@ -2592,19 +2602,29 @@ delete requires --confirm; deleting default or active workspaces also requires -
2592
2602
  ELSE delivered_at
2593
2603
  END ASC,
2594
2604
  id ASC
2595
- `).all(t,r)}function Vq(e){return e.db.prepare(`
2605
+ `).all(t,r)}function Kq(e){return e.db.prepare(`
2596
2606
  SELECT * FROM agent_mailbox
2597
2607
  WHERE delivered_at IS NULL
2598
- OR (delivered_at IS NOT NULL AND (receipt IS NULL OR receipt = ''))
2608
+ OR (
2609
+ delivered_at IS NOT NULL
2610
+ AND message_type = 'request'
2611
+ AND (receipt IS NULL OR receipt = '')
2612
+ AND NOT EXISTS (
2613
+ SELECT 1
2614
+ FROM agent_mailbox AS response
2615
+ WHERE response.message_type = 'response'
2616
+ AND response.request_mailbox_id = agent_mailbox.id
2617
+ )
2618
+ )
2599
2619
  ORDER BY
2600
2620
  CASE
2601
2621
  WHEN delivered_at IS NULL THEN created_at
2602
2622
  ELSE delivered_at
2603
2623
  END ASC,
2604
2624
  id ASC
2605
- `).all()}function $f(e){let t=Date.now();return e.filter(r=>r.status!=="running"||!Kq(r,t,Dq))}function Kq(e,t,r){if(e.holder_host===Lq()&&Yq(e.holder_pid))return!Ft(e.holder_pid);let n=Date.parse(e.last_heartbeat_at??e.started_at);return Number.isFinite(n)&&t-n>r}function Yq(e){return Number.isInteger(e)&&(e??0)>0}function sk(e){let t=e.delivered_at!==null&&(e.receipt===null||e.receipt==="");return{id:e.id,state:t?"no reply":"queued",sender:e.sender_teamfile===null||e.sender_alias===null?null:`${e.sender_teamfile}:${e.sender_alias}`,receiver:`${e.receiver_teamfile}:${e.receiver_alias}`,message_type:e.message_type,age_basis_at:t?e.delivered_at:e.created_at,created_at:e.created_at,delivered_at:e.delivered_at}}function Cf(e,t){let r={id:e.id,kind:e.kind,origin:e.origin,status:e.status,mailbox_delivery:null,from_identity:e.from_identity,target:e.target_teamfile===null||e.target_alias===null?null:`${e.target_teamfile}:${e.target_alias}`,started_at:e.started_at,ended_at:e.ended_at,result:Qv(e.result_summary),error:Qv(e.error)};return r.mailbox_delivery=rH(r,t),r}function qa(e,t){let r=new Map;for(let n of e){let s=n.sender_teamfile===null||n.sender_alias===null?"operator":`${n.sender_teamfile}:${n.sender_alias}`,i=`${n.receiver_teamfile}:${n.receiver_alias}`,o=t==="outbound"?`${s}\0${i}`:`${i}\0${s}`,a=r.get(o);a===void 0?r.set(o,[n]):a.push(n)}return[...r.values()].map(n=>{let s=n[0],i=n.map(o=>o.created_at).sort();return{sender:s.sender_teamfile===null||s.sender_alias===null?null:`${s.sender_teamfile}:${s.sender_alias}`,receiver:`${s.receiver_teamfile}:${s.receiver_alias}`,message_types:[...new Set(n.map(o=>o.message_type))].sort(),pending_count:n.length,oldest_created_at:i[0],newest_created_at:i[i.length-1],ids:n.map(o=>o.id)}})}function zq(e,t){return e.scope==="self"?Zq(e,t):Qq(e,t)}function Zq(e,t){let r=[];r.push(`identity: ${e.identity}`),r.push(`team: ${e.team.name}`),r.push(`teamfile: ${e.team.teamfile}`),r.push(""),r.push("members:"),e.members.length===0&&r.push(" none");for(let n of e.members){let s=n.model===null?"":` model=${n.model}`,i=n.sessionid===null?"":` session=${n.sessionid}`,o=n.state==="idle"?"idle":`busy (${n.reason})`,a=n.handling===null?"":` handling="${n.handling.request_preview}"`;r.push(` ${n.alias}: ${o} provider=${n.provider}${s}${i}${a}`)}return r.push(""),r.push("Waiting on:"),ok(r,e.waiting_on,"self"),r.push(""),r.push("activity from me:"),Mf(r,jf(e.activity.from_me,t.sinceIso),"from-me"),r.push(""),r.push("activity to me:"),Mf(r,jf(e.activity.to_me,t.sinceIso),"to-me"),r.push(""),r.push("mailbox outbound:"),Ja(r,e.mailbox.outbound),r.push(""),r.push("mailbox inbound pending:"),Ja(r,e.mailbox.inbound_pending),r.push(""),r.push(ik(e)),r.join(`
2606
- `)}function Qq(e,t){let r=[];r.push("scope: workspace"),r.push("identity: none"),r.push(""),r.push("teams:"),e.teams.length===0&&r.push(" none");for(let n of e.teams){let s=n.name===null?"(unnamed)":n.name;r.push(` ${s}: ${n.teamfile} (${n.member_count} members)`)}return r.push(""),r.push("Waiting on:"),ok(r,e.waiting_on,"workspace"),r.push(""),r.push("recent activity:"),Mf(r,jf(e.activity,t.sinceIso),"workspace"),r.push(""),r.push("mailbox pending outbound:"),Ja(r,e.mailbox.pending_outbound),r.push(""),r.push("mailbox pending inbound:"),Ja(r,e.mailbox.pending_inbound),r.push(""),r.push(ik(e)),r.join(`
2607
- `)}function ik(e){return Vs(e.workspace,e.db_path)}function Mf(e,t,r){if(t.length===0){e.push(" none");return}let n=t.filter(Zv).sort(eH),s=n.length===0?t:t.filter(i=>!Zv(i));for(let i of n.slice(0,Hv))zv(e,i,r);Ha(e,n.length,Hv,"more open delegations");for(let i of s.slice(0,qv))zv(e,i,r);Ha(e,s.length,qv,"older")}function ok(e,t,r){if(t.length===0){e.push(" none");return}for(let n of t.slice(0,Xv)){let s=r==="workspace"&&n.sender!==null?`${tr(n.sender)} -> ${tr(n.receiver)}`:tr(n.receiver);e.push(` ${s} - ${n.state} ${cH(n.age_basis_at)} (#${n.id}, ${n.message_type})`)}Ha(e,t.length,Xv,"older")}function jf(e,t){let r=Date.parse(t);return Number.isFinite(r)?e.filter(n=>{let s=Date.parse(n.ended_at??n.started_at);return Number.isFinite(s)&&s>=r}):e}function zv(e,t,r){let n=oH(t,r),s=t.status==="running"?`since ${t.started_at}`:`ended ${t.ended_at??t.started_at}`,i=t.error??t.result,o=i===null?"":` "${aH(i)}"`;e.push(` #${t.id} ${tH(t)} ${t.kind}${n} ${s}${o}`)}function Zv(e){return e.mailbox_delivery?.state==="queued"||e.mailbox_delivery?.state==="delivering"}function eH(e,t){let r=Date.parse(e.started_at)-Date.parse(t.started_at);return Number.isFinite(r)&&r!==0?r:e.id-t.id}function tH(e){return e.mailbox_delivery===null?e.status.toUpperCase():e.mailbox_delivery.state.toUpperCase()}function rH(e,t){let r=nH(e,t);return r===null?null:{mailbox_id:r.id,state:r.delivered_at!==null?"delivered":r.delivering_at!==null?"delivering":"queued",delivered_at:r.delivered_at,delivering_at:r.delivering_at}}function nH(e,t){if(e.kind!=="chat"||e.status!=="done"||e.target===null||e.result===null)return null;let r,n;try{r=qr(e.from_identity),n=qr(e.target)}catch{return null}for(let s of sH(e.result)){let i=t.getMailboxMessage(s);if(i!==null&&!(i.sender_teamfile!==r.teamfile||i.sender_alias!==r.alias)&&!(i.receiver_teamfile!==n.teamfile||i.receiver_alias!==n.alias)&&iH(i,e))return i}return null}function sH(e){let t=new Set,r=[];for(let n of e.matchAll(/\d+/g)){let s=Number(n[0]);!Number.isSafeInteger(s)||s<=0||t.has(s)||(t.add(s),r.push(s))}return r}function iH(e,t){let r=Date.parse(t.started_at),n=Date.parse(t.ended_at??t.started_at),s=Date.parse(e.created_at);return!Number.isFinite(r)||!Number.isFinite(n)||!Number.isFinite(s)?!1:s>=r&&s<=n}function oH(e,t){if(t==="from-me")return e.target===null?"":` -> ${tr(e.target)}`;if(t==="to-me")return` from ${tr(e.from_identity)}`;let r=e.target===null?"":` -> ${tr(e.target)}`;return` from ${tr(e.from_identity)}${r}`}function Ha(e,t,r,n){let s=t-r;s>0&&e.push(` (+${s} ${n} -- use --json)`)}function Ja(e,t){if(t.length===0){e.push(" none");return}for(let r of t.slice(0,Jv)){let n=r.sender??"operator";e.push(` ${tr(n)} -> ${tr(r.receiver)}: ${r.pending_count} pending ${r.message_types.join("+")} (oldest ${r.oldest_created_at})`)}Ha(e,t.length,Jv,"more lanes")}function Qv(e){return e===null||e.length===0?null:e.replace(/\s+/g," ").trim()}function aH(e){let t=e.replace(/\s+/g," ").trim();return t.length<=Gv?t:`${t.slice(0,Gv-3)}...`}function lH(e){let t=e.replace(/\s+/gu," ").trim();return t.length<=Vv?t:`${t.slice(0,Vv-3)}...`}function cH(e){let t=Date.parse(e);if(!Number.isFinite(t))return"unknown age";let r=Math.max(0,Math.floor((Date.now()-t)/1e3));if(r<60)return`${r}s`;let n=Math.floor(r/60);if(n<60)return`${n}m`;let s=Math.floor(n/60);return s<48?`${s}h`:`${Math.floor(s/24)}d`}function tr(e){if(e==="operator")return e;try{let t=qr(e);return`${Oq(t.teamfile)}:${t.alias}`}catch{return e}}function dH(e){if(e===void 0)return{iso:new Date(Date.now()-Pq).toISOString()};let t=/^(\d+)([smhd])$/.exec(e);if(t!==null){let n=Number(t[1]),s=t[2],i=s==="s"?n:s==="m"?n*60:s==="h"?n*3600:n*86400;return{iso:new Date(Date.now()-i*1e3).toISOString()}}let r=Date.parse(e);return Number.isFinite(r)?{iso:new Date(r).toISOString()}:{error:`invalid --since value: ${e} (expected ISO8601 or duration like 24h)`}}var jq,qv,Hv,Jv,Xv,Dq,Pq,Gv,Vv,lk=T(()=>{"use strict";Fr();Qs();Re();$u();Je();Ta();Rt();jq=`usage: lmctl status [--json] [--since <duration|ISO8601>]
2625
+ `).all()}function Of(e){let t=Date.now();return e.filter(r=>r.status!=="running"||!Yq(r,t,Pq))}function Yq(e,t,r){if(e.holder_host===Lq()&&zq(e.holder_pid))return!Ft(e.holder_pid);let n=Date.parse(e.last_heartbeat_at??e.started_at);return Number.isFinite(n)&&t-n>r}function zq(e){return Number.isInteger(e)&&(e??0)>0}function sk(e){let t=e.delivered_at!==null&&(e.receipt===null||e.receipt==="");return{id:e.id,state:t?"no reply":"queued",sender:e.sender_teamfile===null||e.sender_alias===null?null:`${e.sender_teamfile}:${e.sender_alias}`,receiver:`${e.receiver_teamfile}:${e.receiver_alias}`,message_type:e.message_type,age_basis_at:t?e.delivered_at:e.created_at,created_at:e.created_at,delivered_at:e.delivered_at}}function $f(e,t){let r={id:e.id,kind:e.kind,origin:e.origin,status:e.status,mailbox_delivery:null,from_identity:e.from_identity,target:e.target_teamfile===null||e.target_alias===null?null:`${e.target_teamfile}:${e.target_alias}`,started_at:e.started_at,ended_at:e.ended_at,result:Qv(e.result_summary),error:Qv(e.error)};return r.mailbox_delivery=oH(r,t),r}function qa(e,t){let r=new Map;for(let n of e){let s=n.sender_teamfile===null||n.sender_alias===null?"operator":`${n.sender_teamfile}:${n.sender_alias}`,i=`${n.receiver_teamfile}:${n.receiver_alias}`,o=t==="outbound"?`${s}\0${i}`:`${i}\0${s}`,a=r.get(o);a===void 0?r.set(o,[n]):a.push(n)}return[...r.values()].map(n=>{let s=n[0],i=n.map(o=>o.created_at).sort();return{sender:s.sender_teamfile===null||s.sender_alias===null?null:`${s.sender_teamfile}:${s.sender_alias}`,receiver:`${s.receiver_teamfile}:${s.receiver_alias}`,message_types:[...new Set(n.map(o=>o.message_type))].sort(),pending_count:n.length,oldest_created_at:i[0],newest_created_at:i[i.length-1],ids:n.map(o=>o.id)}})}function Zq(e,t){return e.scope==="self"?Qq(e,t):eH(e,t)}function Qq(e,t){let r=[];r.push(`identity: ${e.identity}`),r.push(`team: ${e.team.name}`),r.push(`teamfile: ${e.team.teamfile}`),r.push(""),r.push("members:"),e.members.length===0&&r.push(" none");for(let n of e.members){let s=n.model===null?"":` model=${n.model}`,i=n.sessionid===null?"":` session=${n.sessionid}`,o=n.state==="idle"?"idle":`busy (${n.reason})`,a=n.handling===null?"":` handling="${n.handling.request_preview}"`;r.push(` ${n.alias}: ${o} provider=${n.provider}${s}${i}${a}`)}return r.push(""),r.push("Waiting on:"),ok(r,e.waiting_on,"self"),r.push(""),r.push("activity from me:"),Cf(r,Mf(e.activity.from_me,t.sinceIso),"from-me"),r.push(""),r.push("activity to me:"),Cf(r,Mf(e.activity.to_me,t.sinceIso),"to-me"),r.push(""),r.push("mailbox outbound:"),Ha(r,e.mailbox.outbound),r.push(""),r.push("mailbox inbound pending:"),Ha(r,e.mailbox.inbound_pending),r.push(""),r.push(ik(e)),r.join(`
2626
+ `)}function eH(e,t){let r=[];r.push("scope: workspace"),r.push("identity: none"),r.push(""),r.push("teams:"),e.teams.length===0&&r.push(" none");for(let n of e.teams){let s=n.name===null?"(unnamed)":n.name;r.push(` ${s}: ${n.teamfile} (${n.member_count} members)`)}return r.push(""),r.push("Waiting on:"),ok(r,e.waiting_on,"workspace"),r.push(""),r.push("recent activity:"),Cf(r,Mf(e.activity,t.sinceIso),"workspace"),r.push(""),r.push("mailbox pending outbound:"),Ha(r,e.mailbox.pending_outbound),r.push(""),r.push("mailbox pending inbound:"),Ha(r,e.mailbox.pending_inbound),r.push(""),r.push(ik(e)),r.join(`
2627
+ `)}function ik(e){return Vs(e.workspace,e.db_path)}function Cf(e,t,r){if(t.length===0){e.push(" none");return}let n=t.filter(Zv).sort(sH),s=n.length===0?t:t.filter(i=>!Zv(i));for(let i of n.slice(0,Hv))zv(e,i,r);jf(e,n.length,Hv,"more open delegations");for(let i of s.slice(0,qv))zv(e,i,r);jf(e,s.length,qv,"older")}function ok(e,t,r){if(t.length===0){e.push(" none");return}let n=tH(t,Dq);for(let s of n){let i=r==="workspace"&&s.sender!==null?`${tr(s.sender)} -> ${tr(s.receiver)}`:tr(s.receiver);e.push(` ${i} - ${s.state} ${mH(s.age_basis_at)} (#${s.id}, ${s.message_type})`)}nH(e,t,n)}function tH(e,t){let r=[...e].sort(Yv);if(r.length<=t)return r;let n=r.slice(0,t),s=new Set(r.map(i=>i.state));for(let i of s){if(n.some(l=>l.state===i))continue;let o=r.find(l=>l.state===i);if(o===void 0)continue;let a=rH(n);a>=0&&(n[a]=o)}return n.sort(Yv)}function rH(e){let t=new Map;for(let r of e)t.set(r.state,(t.get(r.state)??0)+1);for(let r=e.length-1;r>=0;r-=1)if((t.get(e[r].state)??0)>1)return r;return-1}function nH(e,t,r){let n=new Set(r.map(l=>l.id)),s=t.filter(l=>!n.has(l.id));if(s.length===0)return;let i=s.filter(l=>l.state==="queued").length,o=s.filter(l=>l.state==="no reply").length,a=[i>0?`${i} queued`:null,o>0?`${o} no reply`:null].filter(l=>l!==null);e.push(` (+${s.length} older: ${a.join(", ")} -- use --json)`)}function Yv(e,t){let r=Date.parse(e.age_basis_at),n=Date.parse(t.age_basis_at);return Number.isFinite(r)&&Number.isFinite(n)&&r!==n?r-n:Number.isFinite(r)!==Number.isFinite(n)?Number.isFinite(r)?-1:1:e.id-t.id}function Mf(e,t){let r=Date.parse(t);return Number.isFinite(r)?e.filter(n=>{let s=Date.parse(n.ended_at??n.started_at);return Number.isFinite(s)&&s>=r}):e}function zv(e,t,r){let n=dH(t,r),s=t.status==="running"?`since ${t.started_at}`:`ended ${t.ended_at??t.started_at}`,i=t.error??t.result,o=i===null?"":` "${uH(i)}"`;e.push(` #${t.id} ${iH(t)} ${t.kind}${n} ${s}${o}`)}function Zv(e){return e.mailbox_delivery?.state==="queued"||e.mailbox_delivery?.state==="delivering"}function sH(e,t){let r=Date.parse(e.started_at)-Date.parse(t.started_at);return Number.isFinite(r)&&r!==0?r:e.id-t.id}function iH(e){return e.mailbox_delivery===null?e.status.toUpperCase():e.mailbox_delivery.state.toUpperCase()}function oH(e,t){let r=aH(e,t);return r===null?null:{mailbox_id:r.id,state:r.delivered_at!==null?"delivered":r.delivering_at!==null?"delivering":"queued",delivered_at:r.delivered_at,delivering_at:r.delivering_at}}function aH(e,t){if(e.kind!=="chat"||e.status!=="done"||e.target===null||e.result===null)return null;let r,n;try{r=qr(e.from_identity),n=qr(e.target)}catch{return null}for(let s of lH(e.result)){let i=t.getMailboxMessage(s);if(i!==null&&!(i.sender_teamfile!==r.teamfile||i.sender_alias!==r.alias)&&!(i.receiver_teamfile!==n.teamfile||i.receiver_alias!==n.alias)&&cH(i,e))return i}return null}function lH(e){let t=new Set,r=[];for(let n of e.matchAll(/\d+/g)){let s=Number(n[0]);!Number.isSafeInteger(s)||s<=0||t.has(s)||(t.add(s),r.push(s))}return r}function cH(e,t){let r=Date.parse(t.started_at),n=Date.parse(t.ended_at??t.started_at),s=Date.parse(e.created_at);return!Number.isFinite(r)||!Number.isFinite(n)||!Number.isFinite(s)?!1:s>=r&&s<=n}function dH(e,t){if(t==="from-me")return e.target===null?"":` -> ${tr(e.target)}`;if(t==="to-me")return` from ${tr(e.from_identity)}`;let r=e.target===null?"":` -> ${tr(e.target)}`;return` from ${tr(e.from_identity)}${r}`}function jf(e,t,r,n){let s=t-r;s>0&&e.push(` (+${s} ${n} -- use --json)`)}function Ha(e,t){if(t.length===0){e.push(" none");return}for(let r of t.slice(0,Jv)){let n=r.sender??"operator";e.push(` ${tr(n)} -> ${tr(r.receiver)}: ${r.pending_count} pending ${r.message_types.join("+")} (oldest ${r.oldest_created_at})`)}jf(e,t.length,Jv,"more lanes")}function Qv(e){return e===null||e.length===0?null:e.replace(/\s+/g," ").trim()}function uH(e){let t=e.replace(/\s+/g," ").trim();return t.length<=Xv?t:`${t.slice(0,Xv-3)}...`}function fH(e){let t=e.replace(/\s+/gu," ").trim();return t.length<=Gv?t:`${t.slice(0,Gv-3)}...`}function mH(e){let t=Date.parse(e);if(!Number.isFinite(t))return"unknown age";let r=Math.max(0,Math.floor((Date.now()-t)/1e3));if(r<60)return`${r}s`;let n=Math.floor(r/60);if(n<60)return`${n}m`;let s=Math.floor(n/60);return s<48?`${s}h`:`${Math.floor(s/24)}d`}function tr(e){if(e==="operator")return e;try{let t=qr(e);return`${Oq(t.teamfile)}:${t.alias}`}catch{return e}}function pH(e){if(e===void 0)return{iso:new Date(Date.now()-Fq).toISOString()};let t=/^(\d+)([smhd])$/.exec(e);if(t!==null){let n=Number(t[1]),s=t[2],i=s==="s"?n:s==="m"?n*60:s==="h"?n*3600:n*86400;return{iso:new Date(Date.now()-i*1e3).toISOString()}}let r=Date.parse(e);return Number.isFinite(r)?{iso:new Date(r).toISOString()}:{error:`invalid --since value: ${e} (expected ISO8601 or duration like 24h)`}}var jq,qv,Hv,Jv,Dq,Pq,Fq,Xv,Gv,lk=T(()=>{"use strict";Fr();Qs();Re();Ou();Je();Ta();Rt();jq=`usage: lmctl status [--json] [--since <duration|ISO8601>]
2608
2628
 
2609
2629
  Show this member's team, busy/idle roster, recent tracked activity, and mailbox
2610
2630
  state. From a plain operator shell, show a workspace-level team/activity summary.
@@ -2612,8 +2632,8 @@ state. From a plain operator shell, show a workspace-level team/activity summary
2612
2632
  Text output shows recent activity from the last 24h by default. Use --since 7d
2613
2633
  or an ISO timestamp to widen the investigation window. --json returns complete,
2614
2634
  uncapped data.
2615
- `,qv=5,Hv=5,Jv=5,Xv=5,Dq=8*60*60*1e3,Pq=24*60*60*1e3,Gv=72,Vv=80});Je();Fn();ve();import{pathToFileURL as uH}from"node:url";import{mkdirSync as rI,readFileSync as nI,renameSync as sI,writeFileSync as iI}from"node:fs";import{homedir as oI}from"node:os";import{dirname as aI,join as lI}from"node:path";function om(e){try{return new URL(e).protocol==="https:"}catch{return!1}}function eI(e){return/^[A-Za-z]:[\\/]/.test(e)?!1:/^[A-Za-z][A-Za-z0-9+.-]*:/.test(e)}function tI(e,t){return!eI(e)||om(e)?null:`${t} must use https://: ${e}`}async function am(e,t){let r=tI(e,t.description);if(r!==null||!om(e))throw new Error(r??`${t.description} must use https://: ${e}`);let n=t.timeoutMs??15e3,s=new AbortController,i=setTimeout(()=>s.abort(),n);try{let o;try{o=await fetch(e,{signal:s.signal,redirect:"manual"})}catch(a){throw im(e,t.description,n,a)}if(o.type==="opaqueredirect"||o.status>=300&&o.status<400)throw new Error(`refusing to follow redirect from ${t.description} ${e} (https-only: the URL must serve the content directly, not redirect)`);if(!o.ok)throw new Error(`failed to fetch ${t.description} ${e}: HTTP ${o.status}${o.statusText?` ${o.statusText}`:""}`);try{return Buffer.from(await o.arrayBuffer())}catch(a){throw im(e,t.description,n,a)}}finally{clearTimeout(i)}}function im(e,t,r,n){let i=n instanceof Error&&n.name==="AbortError"?`timed out after ${r}ms`:n instanceof Error?n.message:String(n);return new Error(`failed to fetch ${t} ${e}: ${i}`)}Fn();var cI="https://registry.npmjs.org/@lmctl-ai/lmctl/latest",dI=60*60*1e3,uI=1500;function fI(){let e=process.env.HOME??oI();return lI(e,".lmctl",".update-check.json")}function mI(e){return e.isTTY===!0}function pI(e,t){let r=i=>{let o=/^(\d+)\.(\d+)\.(\d+)(?:$|[-+])/.exec(i.trim());if(o===null)return null;let a=o.slice(1).map(l=>Number(l));return a.some(l=>!Number.isSafeInteger(l)||l<0)?null:a},n=r(e),s=r(t);if(n===null||s===null)return 0;for(let i=0;i<3;i+=1){if(n[i]>s[i])return 1;if(n[i]<s[i])return-1}return 0}function Qa(e,t){return!!(process.env.LMCTL_NO_UPDATE_NOTIFIER==="1"||!mI(t.stderr)||e.includes("--json")||e.includes("--help")||e.includes("-h")||e[0]==="help"||e[0]==="mcp")}function _I(e,t){try{let r=JSON.parse(nI(e,"utf8"));if(typeof r.checkedAt=="number"&&Number.isFinite(r.checkedAt)&&typeof r.latest=="string"&&t-r.checkedAt<dI)return r.latest}catch{}return null}function hI(e,t){rI(aI(e),{recursive:!0});let r=`${e}.tmp-${process.pid}-${Math.random().toString(16).slice(2)}`;iI(r,`${JSON.stringify(t)}
2616
- `,"utf8"),sI(r,e)}async function gI(){let e=await am(cI,{description:"lmctl npm metadata",timeoutMs:uI}),t=JSON.parse(e.toString("utf8"));if(typeof t.version!="string"||t.version.trim()==="")throw new Error("registry response missing version");return t.version}async function lm(e,t=[],r={}){try{if(Qa(t,e))return;let n=r.now?.()??Date.now(),s=r.cachePath??fI();if(_I(s,n)!==null)return;let o=await(r.fetchLatest??gI)();try{hI(s,{checkedAt:n,latest:o})}catch{return}let a=r.currentVersion?.()??yt();pI(o,a)>0&&e.stderr.write(`update available: ${a} \u2192 ${o} run: npm i -g @lmctl-ai/lmctl@latest
2635
+ `,qv=5,Hv=5,Jv=5,Dq=5,Pq=8*60*60*1e3,Fq=24*60*60*1e3,Xv=72,Gv=80});Je();Fn();ve();import{pathToFileURL as _H}from"node:url";import{mkdirSync as rI,readFileSync as nI,renameSync as sI,writeFileSync as iI}from"node:fs";import{homedir as oI}from"node:os";import{dirname as aI,join as lI}from"node:path";function om(e){try{return new URL(e).protocol==="https:"}catch{return!1}}function eI(e){return/^[A-Za-z]:[\\/]/.test(e)?!1:/^[A-Za-z][A-Za-z0-9+.-]*:/.test(e)}function tI(e,t){return!eI(e)||om(e)?null:`${t} must use https://: ${e}`}async function am(e,t){let r=tI(e,t.description);if(r!==null||!om(e))throw new Error(r??`${t.description} must use https://: ${e}`);let n=t.timeoutMs??15e3,s=new AbortController,i=setTimeout(()=>s.abort(),n);try{let o;try{o=await fetch(e,{signal:s.signal,redirect:"manual"})}catch(a){throw im(e,t.description,n,a)}if(o.type==="opaqueredirect"||o.status>=300&&o.status<400)throw new Error(`refusing to follow redirect from ${t.description} ${e} (https-only: the URL must serve the content directly, not redirect)`);if(!o.ok)throw new Error(`failed to fetch ${t.description} ${e}: HTTP ${o.status}${o.statusText?` ${o.statusText}`:""}`);try{return Buffer.from(await o.arrayBuffer())}catch(a){throw im(e,t.description,n,a)}}finally{clearTimeout(i)}}function im(e,t,r,n){let i=n instanceof Error&&n.name==="AbortError"?`timed out after ${r}ms`:n instanceof Error?n.message:String(n);return new Error(`failed to fetch ${t} ${e}: ${i}`)}Fn();var cI="https://registry.npmjs.org/@lmctl-ai/lmctl/latest",dI=60*60*1e3,uI=1500;function fI(){let e=process.env.HOME??oI();return lI(e,".lmctl",".update-check.json")}function mI(e){return e.isTTY===!0}function pI(e,t){let r=i=>{let o=/^(\d+)\.(\d+)\.(\d+)(?:$|[-+])/.exec(i.trim());if(o===null)return null;let a=o.slice(1).map(l=>Number(l));return a.some(l=>!Number.isSafeInteger(l)||l<0)?null:a},n=r(e),s=r(t);if(n===null||s===null)return 0;for(let i=0;i<3;i+=1){if(n[i]>s[i])return 1;if(n[i]<s[i])return-1}return 0}function Za(e,t){return!!(process.env.LMCTL_NO_UPDATE_NOTIFIER==="1"||!mI(t.stderr)||e.includes("--json")||e.includes("--help")||e.includes("-h")||e[0]==="help"||e[0]==="mcp")}function _I(e,t){try{let r=JSON.parse(nI(e,"utf8"));if(typeof r.checkedAt=="number"&&Number.isFinite(r.checkedAt)&&typeof r.latest=="string"&&t-r.checkedAt<dI)return r.latest}catch{}return null}function hI(e,t){rI(aI(e),{recursive:!0});let r=`${e}.tmp-${process.pid}-${Math.random().toString(16).slice(2)}`;iI(r,`${JSON.stringify(t)}
2636
+ `,"utf8"),sI(r,e)}async function gI(){let e=await am(cI,{description:"lmctl npm metadata",timeoutMs:uI}),t=JSON.parse(e.toString("utf8"));if(typeof t.version!="string"||t.version.trim()==="")throw new Error("registry response missing version");return t.version}async function lm(e,t=[],r={}){try{if(Za(t,e))return;let n=r.now?.()??Date.now(),s=r.cachePath??fI();if(_I(s,n)!==null)return;let o=await(r.fetchLatest??gI)();try{hI(s,{checkedAt:n,latest:o})}catch{return}let a=r.currentVersion?.()??yt();pI(o,a)>0&&e.stderr.write(`update available: ${a} \u2192 ${o} run: npm i -g @lmctl-ai/lmctl@latest
2617
2637
  `)}catch{}}var Mn=`usage: lmctl [--db PATH] [--workspace NAME] [--debug] <command> [args]
2618
2638
  `,Df=`${Mn}
2619
2639
  Setup & status:
@@ -2665,14 +2685,14 @@ ${Mn}Run 'lmctl help' for usage.
2665
2685
  ${Mn}Run 'lmctl help' for usage.
2666
2686
  `),1):(e.stderr.write(`error: unknown command: ${t}
2667
2687
  ${Mn}Run 'lmctl help' for usage.
2668
- `),1)}async function fH(e,t={stdout:process.stdout,stderr:process.stderr}){let r=rm();try{return await mH(e,t)}finally{nm(r)}}async function mH(e,t={stdout:process.stdout,stderr:process.stderr}){let r=[];for(let a=0;a<e.length;a+=1){let l=e[a];if(l==="--db"){let c=e[++a];if(c===void 0||c.startsWith("--"))return Pf(t,"missing value for --db");process.env.LMCTL_DB=c;continue}if(l==="--workspace"){let c=e[++a];if(c===void 0||c.startsWith("--"))return Pf(t,"missing value for --workspace");if(!ze(c))return Pf(t,`invalid workspace name: ${c}`);process.env.LMCTL_WORKSPACE=c;continue}if(l==="--debug"){tm();continue}r.push(l)}let n=r[0];if(n==="--version"||n==="-v"||n==="-V")return t.stdout.write(`lmctl ${yt()}
2669
- `),0;if(n==="--help"||n==="-h"||n===void 0)return t.stdout.write(Df),0;if(n==="help"){let[a,...l]=r.slice(1);return a===void 0||a==="--help"||a==="-h"?(t.stdout.write(Df),0):ck.has(a)?dk(a,[...l,"--help"],t):uk(t,a)}qf(le(),t.stderr),Jf(t.stderr);let[s,...i]=r;if(s===void 0)return t.stdout.write(Df),0;let o=Date.now();Ff(s,i,{phase:"start",started_at:new Date(o).toISOString()});try{let a=await dk(s,i,t);return Ff(s,i,{phase:"finish",outcome:a===0?"ok":"error",exit_code:a,duration_ms:Date.now()-o}),ck.has(s)&&!Qa(r,t)&&await lm(t,r),a}catch(a){let l=a instanceof Error?a:new Error(String(a));return Ff(s,i,{phase:"fatal",outcome:"fatal",exit_code:1,duration_ms:Date.now()-o,error_class:l.name,error_message:l.message,error_stack:l.stack??null,causes:_H(l)}),pH(a,s,i,t)}}function Ff(e,t,r){Xe({event:e,record_kind:"cli_action",command:e,argv:t,cwd:process.cwd(),db_path:le(),workspace:process.env.LMCTL_WORKSPACE??null,lmctl_version:yt(),node_version:process.version,...r})}function pH(e,t,r,n){let s=e instanceof Error?e:new Error(String(e));return n.stderr.write(`error: ${s.message}
2688
+ `),1)}async function hH(e,t={stdout:process.stdout,stderr:process.stderr}){let r=rm();try{return await gH(e,t)}finally{nm(r)}}async function gH(e,t={stdout:process.stdout,stderr:process.stderr}){let r=[];for(let a=0;a<e.length;a+=1){let l=e[a];if(l==="--db"){let c=e[++a];if(c===void 0||c.startsWith("--"))return Pf(t,"missing value for --db");process.env.LMCTL_DB=c;continue}if(l==="--workspace"){let c=e[++a];if(c===void 0||c.startsWith("--"))return Pf(t,"missing value for --workspace");if(!ze(c))return Pf(t,`invalid workspace name: ${c}`);process.env.LMCTL_WORKSPACE=c;continue}if(l==="--debug"){tm();continue}r.push(l)}let n=r[0];if(n==="--version"||n==="-v"||n==="-V")return t.stdout.write(`lmctl ${yt()}
2689
+ `),0;if(n==="--help"||n==="-h"||n===void 0)return t.stdout.write(Df),0;if(n==="help"){let[a,...l]=r.slice(1);return a===void 0||a==="--help"||a==="-h"?(t.stdout.write(Df),0):ck.has(a)?dk(a,[...l,"--help"],t):uk(t,a)}qf(le(),t.stderr),Jf(t.stderr);let[s,...i]=r;if(s===void 0)return t.stdout.write(Df),0;let o=Date.now();Ff(s,i,{phase:"start",started_at:new Date(o).toISOString()});try{let a=await dk(s,i,t);return Ff(s,i,{phase:"finish",outcome:a===0?"ok":"error",exit_code:a,duration_ms:Date.now()-o}),ck.has(s)&&!Za(r,t)&&await lm(t,r),a}catch(a){let l=a instanceof Error?a:new Error(String(a));return Ff(s,i,{phase:"fatal",outcome:"fatal",exit_code:1,duration_ms:Date.now()-o,error_class:l.name,error_message:l.message,error_stack:l.stack??null,causes:wH(l)}),yH(a,s,i,t)}}function Ff(e,t,r){Xe({event:e,record_kind:"cli_action",command:e,argv:t,cwd:process.cwd(),db_path:le(),workspace:process.env.LMCTL_WORKSPACE??null,lmctl_version:yt(),node_version:process.version,...r})}function yH(e,t,r,n){let s=e instanceof Error?e:new Error(String(e));return n.stderr.write(`error: ${s.message}
2670
2690
  `),sm()?(n.stderr.write(`(debug details written to ~/.lmctl/debug-*.log)
2671
2691
  `),1):(n.stderr.write(`(re-run with --debug for the full stack trace and context in ~/.lmctl/debug-*.log)
2672
- `),1)}function _H(e){let t=[],r=e.cause,n=0;for(;r!=null&&n<8;){let s=r instanceof Error?r:new Error(String(r));t.push({error_class:s.name,error_message:s.message,error_stack:s.stack??null}),r=s.cause,n+=1}return t}async function dk(e,t,r){switch(e){case"api":{let{runApi:n}=await Promise.resolve().then(()=>(G_(),X_));return n(t,r)}case"serve":{let{runServe:n}=await Promise.resolve().then(()=>(qT(),BT));return n(t,r)}case"chat":{let{runChat:n}=await Promise.resolve().then(()=>(kb(),vb));return n(t,r)}case"recover":{let{runRecover:n}=await Promise.resolve().then(()=>($b(),Ob));return n(t,r)}case"mcp":{let{runMcp:n}=await Promise.resolve().then(()=>(Ub(),Fb));return n(t,r)}case"device":{let{runDevice:n}=await Promise.resolve().then(()=>(Bb(),Wb));return n(t,r)}case"team":{let{runTeam:n}=await Promise.resolve().then(()=>(fS(),uS));return n(t,r)}case"tail":{let{runTail:n}=await Promise.resolve().then(()=>(ES(),wS));return n(t,r)}case"health":{let{runInfo:n}=await Promise.resolve().then(()=>(AS(),xS));return n(t,r)}case"ls":{let{runLs:n}=await Promise.resolve().then(()=>(OS(),LS));return n(t,r)}case"lint":{let{runLint:n}=await Promise.resolve().then(()=>(Ws(),Us));return n(t,r)}case"seed":{let{runSeed:n}=await Promise.resolve().then(()=>(Ws(),Us));return n(t,r)}case"hire":{let{runHire:n}=await Promise.resolve().then(()=>(Ws(),Us));return n(t,r)}case"refresh":{let{runRefresh:n}=await Promise.resolve().then(()=>(Ws(),Us));return n(t,r)}case"clone":{let{runClone:n}=await Promise.resolve().then(()=>(QS(),ZS));return n(t,r)}case"plan":{let{runPlan:n}=await Promise.resolve().then(()=>(nv(),rv));return n(t,r)}case"terminal":{let{runTerminal:n}=await Promise.resolve().then(()=>(fv(),uv));return n(t,r)}case"workspace":{let{runWorkspace:n}=await Promise.resolve().then(()=>(Tv(),Ev));return n(t,r)}case"diagnose":{let{runDiagnose:n}=await Promise.resolve().then(()=>(Mv(),Cv));return n(t,r)}case"diagnose-prompt":{let{runDiagnosePrompt:n}=await Promise.resolve().then(()=>(Bv(),Wv));return n(t,r)}case"status":{let{runStatus:n}=await Promise.resolve().then(()=>(lk(),ak));return n(t,r)}case"db":return hH(t,r);default:return uk(r,e)}}function hH(e,t){let[r,...n]=e;return r==="--help"||r==="-h"||r==="help"?(t.stdout.write(`usage: lmctl db downgrade --to <version> --confirm
2692
+ `),1)}function wH(e){let t=[],r=e.cause,n=0;for(;r!=null&&n<8;){let s=r instanceof Error?r:new Error(String(r));t.push({error_class:s.name,error_message:s.message,error_stack:s.stack??null}),r=s.cause,n+=1}return t}async function dk(e,t,r){switch(e){case"api":{let{runApi:n}=await Promise.resolve().then(()=>(G_(),X_));return n(t,r)}case"serve":{let{runServe:n}=await Promise.resolve().then(()=>(qT(),BT));return n(t,r)}case"chat":{let{runChat:n}=await Promise.resolve().then(()=>(kb(),vb));return n(t,r)}case"recover":{let{runRecover:n}=await Promise.resolve().then(()=>($b(),Ob));return n(t,r)}case"mcp":{let{runMcp:n}=await Promise.resolve().then(()=>(Ub(),Fb));return n(t,r)}case"device":{let{runDevice:n}=await Promise.resolve().then(()=>(Bb(),Wb));return n(t,r)}case"team":{let{runTeam:n}=await Promise.resolve().then(()=>(fS(),uS));return n(t,r)}case"tail":{let{runTail:n}=await Promise.resolve().then(()=>(ES(),wS));return n(t,r)}case"health":{let{runInfo:n}=await Promise.resolve().then(()=>(AS(),xS));return n(t,r)}case"ls":{let{runLs:n}=await Promise.resolve().then(()=>(OS(),LS));return n(t,r)}case"lint":{let{runLint:n}=await Promise.resolve().then(()=>(Ws(),Us));return n(t,r)}case"seed":{let{runSeed:n}=await Promise.resolve().then(()=>(Ws(),Us));return n(t,r)}case"hire":{let{runHire:n}=await Promise.resolve().then(()=>(Ws(),Us));return n(t,r)}case"refresh":{let{runRefresh:n}=await Promise.resolve().then(()=>(Ws(),Us));return n(t,r)}case"clone":{let{runClone:n}=await Promise.resolve().then(()=>(QS(),ZS));return n(t,r)}case"plan":{let{runPlan:n}=await Promise.resolve().then(()=>(nv(),rv));return n(t,r)}case"terminal":{let{runTerminal:n}=await Promise.resolve().then(()=>(fv(),uv));return n(t,r)}case"workspace":{let{runWorkspace:n}=await Promise.resolve().then(()=>(Tv(),Ev));return n(t,r)}case"diagnose":{let{runDiagnose:n}=await Promise.resolve().then(()=>(Mv(),Cv));return n(t,r)}case"diagnose-prompt":{let{runDiagnosePrompt:n}=await Promise.resolve().then(()=>(Bv(),Wv));return n(t,r)}case"status":{let{runStatus:n}=await Promise.resolve().then(()=>(lk(),ak));return n(t,r)}case"db":return EH(t,r);default:return uk(r,e)}}function EH(e,t){let[r,...n]=e;return r==="--help"||r==="-h"||r==="help"?(t.stdout.write(`usage: lmctl db downgrade --to <version> --confirm
2673
2693
 
2674
2694
  Database utilities. The downgrade command is currently a documented stub;
2675
2695
  restore from backup for rollback and use normal migrations for forward changes.
2676
2696
  `),0):r==="downgrade"?(t.stderr.write(`not yet implemented; restore from backup, or run lmctl migrate (forward-migrates ok)
2677
2697
  `),1):(t.stderr.write(`usage: lmctl db downgrade --to <version> --confirm
2678
- `),1)}if(process.argv[1]!==void 0&&import.meta.url===uH(process.argv[1]).href){let e=await fH(process.argv.slice(2));process.exitCode=e}export{fH as runCli};
2698
+ `),1)}if(process.argv[1]!==void 0&&import.meta.url===_H(process.argv[1]).href){let e=await hH(process.argv.slice(2));process.exitCode=e}export{hH as runCli};